From fa77b82a6633fe5639cc6cb560b81c4ff1154936 Mon Sep 17 00:00:00 2001 From: docs-bot <77750099+docs-bot@users.noreply.github.com> Date: Thu, 24 Sep 2026 17:51:52 +0000 Subject: [PATCH 1/8] Markdown freshness: fix broken internal links in src/ (#63494) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/codeql-cli/README.md | 2 +- src/codeql-queries/README.md | 2 +- src/content-render/scripts/reusables-cli/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/codeql-cli/README.md b/src/codeql-cli/README.md index c4ea4e9130c4..dac5c28c25ba 100644 --- a/src/codeql-cli/README.md +++ b/src/codeql-cli/README.md @@ -30,7 +30,7 @@ To run the CodeQL CLI pipeline locally: ## Content team -The content writers can manually update parts of the autogenerated Markdown files in `content/code-security/codeql-cli/codeql-cli-manual`. When new Markdown files are added they will get all of the frontmatter properties defined in the `defaultFrontmatter` property in `src/codeql-cli/lib/config.ts`. +The content writers can manually update parts of the autogenerated Markdown files in `content/code-security/codeql-cli/codeql-cli-manual`. When new Markdown files are added they will get all of the frontmatter properties defined in the `defaultFrontmatter` property in `src/codeql-cli/lib/config.json`. When a new Markdown file is created, a writer can manually change any of the frontmatter. The pipeline will not overwrite the frontmatter on subsequent runs. diff --git a/src/codeql-queries/README.md b/src/codeql-queries/README.md index 07373666ac96..c7297459ecce 100644 --- a/src/codeql-queries/README.md +++ b/src/codeql-queries/README.md @@ -54,7 +54,7 @@ accDescr: A flow chart describing how the automation generates documentation for class security-markdown,quality-markdown,security-suites,quality-suites,codeql-cli file; ``` -A [workflow](../../.github/workflows/generate-codeql-query-lists.yml) is used to trigger the automation of the CodeQL query tables documentation. The workflow is manually triggered by a member of the GitHub Docs team approximately every two weeks to align to releases of the CodeQL CLI. The workflow takes an input parameter that specifies the branch to pull the source files from in the codeql repo. If the branch input is omitted, the workflow will default to the `main` branch. +A [workflow](../../.github/workflows/generate-code-scanning-query-lists.yml) is used to trigger the automation of the CodeQL query tables documentation. The workflow is manually triggered by a member of the GitHub Docs team approximately every two weeks to align to releases of the CodeQL CLI. The workflow takes an input parameter that specifies the branch to pull the source files from in the codeql repo. If the branch input is omitted, the workflow will default to the `main` branch. The workflow runs two scripts in parallel: - `npm run generate-code-scanning-query-list` - generates security query tables under `data/reusables/code-scanning/codeql-query-tables/` diff --git a/src/content-render/scripts/reusables-cli/README.md b/src/content-render/scripts/reusables-cli/README.md index 9e492e1ab8b3..eae841f38b02 100644 --- a/src/content-render/scripts/reusables-cli/README.md +++ b/src/content-render/scripts/reusables-cli/README.md @@ -119,7 +119,7 @@ In content/actions/using-workflows/reusing-workflows.md on: Some reusables might not make sense to "reuse" everywhere they could be reused. For instance, at the time of writing there is a reusable that is just the number "30" which shows up in certain files, but doesn't make sense to be replaced with a reusable. -In these cases you can skip these reusables from being checked by the `find potential-uses` command by adding their paths to the array in [src/content-render/scripts/reusables-cli/ignore-reusables.ts](./ignore-unused-reusables.ts) +In these cases you can skip these reusables from being checked by the `find potential-uses` command by adding their paths to the array in [src/content-render/scripts/reusables-cli/ignore-reusables.ts](./ignore-reusables.ts) #### Similarity search From 2523f1747f77fc9eb80d952cadbe0c4a63d173df Mon Sep 17 00:00:00 2001 From: docs-bot <77750099+docs-bot@users.noreply.github.com> Date: Thu, 24 Sep 2026 17:59:53 +0000 Subject: [PATCH 2/8] =?UTF-8?q?Fix=20Russian=20=D0=BAo=D0=BDe=D1=86=20disa?= =?UTF-8?q?mbiguation=20bug=20that=20swallows=20unrelated=20endif=20tags?= =?UTF-8?q?=20(#63495)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Kevin Heis --- src/languages/lib/correct-translation-content.ts | 7 ++++++- src/languages/tests/correct-translation-content.ts | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/languages/lib/correct-translation-content.ts b/src/languages/lib/correct-translation-content.ts index c251ab83ac98..d7966b6a3598 100644 --- a/src/languages/lib/correct-translation-content.ts +++ b/src/languages/lib/correct-translation-content.ts @@ -892,10 +892,15 @@ export function correctTranslatedContentStrings( '{%$1 ifversion command-palette $2%}', ) // Run before the конец fallback. Split, not regex, to avoid catastrophic backtracking. + // Only rewrite конец to endraw inside a raw block that isn't already closed by a + // real {% endraw %}; otherwise an unrelated конец later in the document (closing an + // ifversion, say) would be wrongly consumed as this block's closer. if (content.includes('{% конец %}') && content.includes('{% raw %}')) { const parts = content.split('{% raw %}') for (let i = 1; i < parts.length; i++) { - parts[i] = parts[i].replace('{% конец %}', '{% endraw %}') + if (!parts[i].includes('{% endraw %}')) { + parts[i] = parts[i].replace('{% конец %}', '{% endraw %}') + } } content = parts.join('{% raw %}') } diff --git a/src/languages/tests/correct-translation-content.ts b/src/languages/tests/correct-translation-content.ts index 14f0899abc9a..5a49ba4c2cdb 100644 --- a/src/languages/tests/correct-translation-content.ts +++ b/src/languages/tests/correct-translation-content.ts @@ -869,6 +869,18 @@ describe('correctTranslatedContentStrings', () => { expect(fix('{%- конец для %}', 'ru')).toBe('{%- endfor %}') }) + test('does not consume an unrelated конец when an earlier raw block is already closed', () => { + expect( + fix('{% raw %}some content{% endraw %} text {% ifversion x %}more{% конец %}', 'ru'), + ).toBe('{% raw %}some content{% endraw %} text {% ifversion x %}more{% endif %}') + expect( + fix( + '{% raw %}a{% endraw %} mid {% raw %}b{% конец %} tail {% ifversion y %}z{% конец %}', + 'ru', + ), + ).toBe('{% raw %}a{% endraw %} mid {% raw %}b{% endraw %} tail {% ifversion y %}z{% endif %}') + }) + test('fixes заголовки строк → rowheaders', () => { expect(fix('{% заголовки строк %}', 'ru')).toBe('{% rowheaders %}') expect(fix('{%- заголовки строк %}', 'ru')).toBe('{%- rowheaders %}') From db58c0abbd466a401258c61dddb75b17abc65576 Mon Sep 17 00:00:00 2001 From: Scott Tesler Date: Thu, 24 Sep 2026 18:38:19 +0000 Subject: [PATCH 3/8] Document user-level Copilot code review settings (#62486) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Co-authored-by: Ria Gopu Co-authored-by: Vanessa Co-authored-by: Sarita Iyer <66540150+saritai@users.noreply.github.com> --- .../copilot/concepts/agents/code-review.md | 21 +++++++++++-- .../set-up-copilot/configure-code-review.md | 30 +++++++++++++++---- .../request-a-code-review/use-code-review.md | 2 +- .../code-review/user-settings-sidebar.md | 1 + 4 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 data/reusables/copilot/code-review/user-settings-sidebar.md diff --git a/content/copilot/concepts/agents/code-review.md b/content/copilot/concepts/agents/code-review.md index 564aff871051..259d3dbf187a 100644 --- a/content/copilot/concepts/agents/code-review.md +++ b/content/copilot/concepts/agents/code-review.md @@ -132,10 +132,12 @@ When {% data variables.copilot.copilot_code-review_short %} is enabled for these By default, {% data variables.product.prodname_copilot_short %} only reviews a pull request if you assign it to the pull request. However, you can configure automatic reviews. -* **Individual users** on the {% data variables.copilot.copilot_pro_short %} or {% data variables.copilot.copilot_pro_plus_short %} plan can configure {% data variables.product.prodname_copilot_short %} to automatically review all pull requests they create. +* **Users** can configure {% data variables.product.prodname_copilot_short %} to automatically review the pull requests they create. This is available on the {% data variables.copilot.copilot_pro_short %}, {% data variables.copilot.copilot_pro_plus_short %}, and {% data variables.copilot.copilot_max_short %} plans, and with a {% data variables.copilot.copilot_business_short %} or {% data variables.copilot.copilot_enterprise_short %} license. It is not available for {% data variables.enterprise.prodname_managed_users %}. * **Repository owners** can configure {% data variables.product.prodname_copilot_short %} to automatically review all pull requests in the repository that are created by people with access to {% data variables.product.prodname_copilot_short %}. * **Organization owners** can configure {% data variables.product.prodname_copilot_short %} to automatically review all pull requests in some or all of the repositories in the organization where the pull request is created by a {% data variables.product.prodname_copilot_short %} user. +{% data variables.product.prodname_copilot_short %} evaluates pull requests against two separate configurations: a user's settings and any applicable ruleset. These configurations are not hierarchical; neither inherits from or overrides the other. A pull request is reviewed automatically when at least one configuration is enabled. If both configurations are enabled on a pull request, {% data variables.product.prodname_copilot_short %} still posts only one review. + If your organization has enabled {% data variables.copilot.copilot_code-review_short %} without a {% data variables.product.prodname_copilot_short %} license, automatic reviews also apply to pull requests created by organization members without a license. This applies to repositories covered by a policy where automatic reviews are enabled. For more information, see [{% data variables.copilot.copilot_code-review_short %} without a {% data variables.product.prodname_copilot_short %} license](#copilot-code-review-without-a-copilot-license). @@ -151,6 +153,8 @@ The triggers for automatic code review depend on the configuration settings. * Review draft pull requests: * Pull requests are automatically reviewed while they are still drafts, before you switch them to "Open". +When a pull request qualifies for automatic review, **Review new pushes** and **Review draft pull requests** apply if either the author's settings or an applicable ruleset turns them on. You cannot use your own settings to turn off push or draft reviews that a ruleset has turned on. + For full instructions, see [AUTOTITLE](/copilot/how-tos/copilot-on-github/set-up-copilot/configure-code-review). > [!NOTE] @@ -158,17 +162,28 @@ For full instructions, see [AUTOTITLE](/copilot/how-tos/copilot-on-github/set-up ## Review effort level -{% data variables.copilot.copilot_code-review_short %} supports multiple review effort levels, so you can choose the level of thoroughness that matches the criticality of your code. +{% data variables.copilot.copilot_code-review_short %} supports multiple {% data variables.product.prodname_copilot_short %} review effort levels, so you can choose the level of thoroughness that matches the criticality of your code. * **Lite**: Standard review. Provides fast, targeted feedback on common issues such as bugs, security vulnerabilities, and style inconsistencies (default). * **Balanced**: Routes pull requests to a higher-reasoning model for longer analysis of complex logic, security-sensitive code, and cross-service changes. Balanced reviews use more {% data variables.product.prodname_ai_credits_short %}, and may consume marginally more {% data variables.product.prodname_actions %} minutes, than Lite reviews. Use Balanced for security-sensitive code, multi-service pull requests, or repositories with strict quality standards. Use Lite for routine changes where fast feedback is more important than exhaustive analysis. -You can select the review effort level when requesting a review in the pull request, under the **Reviewers** section where {% data variables.product.prodname_copilot_short %} appears as a reviewer. Organization owners can set a default review effort level for automatic code reviews in their organization. Repository administrators can override the organization default for a specific repository. +You can select {% data variables.product.prodname_copilot_short %} review effort when requesting a review in the pull request, under the **Reviewers** section where {% data variables.product.prodname_copilot_short %} appears as a reviewer. You can also set a default {% data variables.product.prodname_copilot_short %} review effort in your {% data variables.copilot.copilot_code-review_short %} settings. Organization owners can set a default {% data variables.product.prodname_copilot_short %} review effort for automatic code reviews in their organization. Repository administrators can override the organization default for a specific repository. + +When {% data variables.product.prodname_copilot_short %} determines which review effort to use, it checks the following options in order and uses the first one that applies: + +1. A {% data variables.product.prodname_copilot_short %} review effort chosen when the review is requested +1. A {% data variables.product.prodname_copilot_short %} review effort previously used on this pull request +1. The requestor's {% data variables.product.prodname_copilot_short %} review effort. For a new pull request, the requestor is the author. When someone marks a draft ready for review, that person is the requestor. +1. A {% data variables.product.prodname_copilot_short %} review effort set for the repository +1. A {% data variables.product.prodname_copilot_short %} review effort set for the organization, or the repository owner's {% data variables.product.prodname_copilot_short %} review effort on a user-owned repository +1. {% data variables.product.github %}'s built-in default, which is Lite. Some owners have Balanced as the built-in default. After {% data variables.copilot.copilot_code-review_short %} reviews a pull request, the pull request overview comment shows the effort level used for each review run. +For configuration steps, see [AUTOTITLE](/copilot/how-tos/copilot-on-github/set-up-copilot/configure-code-review). + ## {% data variables.product.prodname_copilot_short %} approvals > [!NOTE] diff --git a/content/copilot/how-tos/copilot-on-github/set-up-copilot/configure-code-review.md b/content/copilot/how-tos/copilot-on-github/set-up-copilot/configure-code-review.md index 80e262f0aa45..092dd294c563 100644 --- a/content/copilot/how-tos/copilot-on-github/set-up-copilot/configure-code-review.md +++ b/content/copilot/how-tos/copilot-on-github/set-up-copilot/configure-code-review.md @@ -20,19 +20,37 @@ category: ## Introduction -You can configure {% data variables.copilot.copilot_code-review_short %} to review pull requests automatically. For an overview of automatic pull request reviews, see [AUTOTITLE](/copilot/concepts/agents/code-review#automatic-pull-request-reviews). +You can configure {% data variables.copilot.copilot_code-review_short %} to review pull requests automatically, and you can set your {% data variables.product.prodname_copilot_short %} review effort. For an overview, see [AUTOTITLE](/copilot/concepts/agents/code-review#automatic-pull-request-reviews). ## Configuring automatic code review for your own pull requests +You can set {% data variables.copilot.copilot_code-review_short %} to review the pull requests you create, in any repository where {% data variables.copilot.copilot_code-review_short %} is available to you. + > [!NOTE] -> This is only available if you are on the {% data variables.copilot.copilot_pro_short %}, {% data variables.copilot.copilot_pro_plus_short %}, or {% data variables.copilot.copilot_max_short %} plans. +> Configuring automatic code review is available on the {% data variables.copilot.copilot_pro_short %}, {% data variables.copilot.copilot_pro_plus_short %}, and {% data variables.copilot.copilot_max_short %} plans, and with a {% data variables.copilot.copilot_business_short %} or {% data variables.copilot.copilot_enterprise_short %} license. It is not available for {% data variables.enterprise.prodname_managed_users %}. + +{% data reusables.user-settings.copilot-settings %} +{% data reusables.copilot.code-review.user-settings-sidebar %} +1. Enable **Automatic {% data variables.copilot.copilot_code-review_short %}**. +1. Optionally, to review each new push to a pull request that {% data variables.product.prodname_copilot_short %} is already reviewing, enable **Review new pushes**. +1. Optionally, to review pull requests while they are still marked as drafts, enable **Review draft pull requests**. + +A pull request can qualify for automatic review from several independent sources: your user settings, repository rulesets, or organization rulesets. These sources are evaluated separately. If more than one source applies, {% data variables.product.prodname_copilot_short %} still posts a single review. Your user settings cannot disable push or draft reviews that a ruleset has enabled. For more information, see [AUTOTITLE](/copilot/concepts/agents/code-review#automatic-pull-request-reviews). + +## Configuring your {% data variables.product.prodname_copilot_short %} review effort -{% data reusables.copilot.your-copilot %} -1. Locate the **Automatic {% data variables.copilot.copilot_code-review_short %}** option and click the dropdown button. +You can choose the {% data variables.product.prodname_copilot_short %} review effort that {% data variables.copilot.copilot_code-review_short %} uses for the reviews you request. Your choice applies to automatic reviews and to reviews you request manually. For an overview of the levels and how {% data variables.product.prodname_copilot_short %} decides which to use, see [AUTOTITLE](/copilot/concepts/agents/code-review#review-effort-level). + +{% data reusables.user-settings.copilot-settings %} +{% data reusables.copilot.code-review.user-settings-sidebar %} +1. Next to "Review effort level," select the {% data variables.product.prodname_copilot_short %} review effort for reviews you request. + * **Lite**: Standard review. + * **Balanced**: Deeper analysis of complex logic, security-sensitive code, and cross-service changes. + * **Max**: Most thorough review. This option appears with a **Coming soon** label and is not available yet. - ![Screenshot of the "Automatic {% data variables.copilot.copilot_code-review_short %}" setting with the dropdown menu displayed.](/assets/images/help/copilot/code-review/automatic-code-review-personal.png) +To return to the built-in default, select the **Default** option at the top of the menu. Until you choose a specific level, the control shows the built-in default that applies to you, either **Default (Lite)** or **Default (Balanced)**. -1. In the dropdown menu, select **Enabled**. +Your {% data variables.product.prodname_copilot_short %} review effort is independent of **Automatic {% data variables.copilot.copilot_code-review_short %}**. Turning automatic review off does not clear your {% data variables.product.prodname_copilot_short %} review effort or stop it from applying to reviews you request manually. ## Configuring automatic code review for a repository diff --git a/content/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review.md b/content/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review.md index 4c2d03f0dd06..70178632a802 100644 --- a/content/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review.md +++ b/content/copilot/how-tos/use-copilot-agents/request-a-code-review/use-code-review.md @@ -85,7 +85,7 @@ With review effort levels, you can choose the level of thoroughness of {% data v * **Lite**: Cost-efficient review that provides targeted feedback on glaring issues such as bugs, security vulnerabilities, and style inconsistencies. * **Balanced**: Deeper analysis of complex logic, security-sensitive code, and cross-service changes, using a higher-reasoning model. -You can select the review effort level in the pull request before you request a review from {% data variables.product.prodname_copilot_short %}, under the **Reviewers** section where {% data variables.product.prodname_copilot_short %} appears as a reviewer. Organization owners and repository administrators can also set a default effort level for automatic reviews. +You can select {% data variables.product.prodname_copilot_short %} review effort in the pull request before you request a review from {% data variables.product.prodname_copilot_short %}, under the **Reviewers** section where {% data variables.product.prodname_copilot_short %} appears as a reviewer. You can also set a default {% data variables.product.prodname_copilot_short %} review effort in your settings. Organization owners and repository administrators can set a default {% data variables.product.prodname_copilot_short %} review effort for automatic reviews. For more information, see [AUTOTITLE](/copilot/concepts/agents/code-review#review-effort-level). diff --git a/data/reusables/copilot/code-review/user-settings-sidebar.md b/data/reusables/copilot/code-review/user-settings-sidebar.md new file mode 100644 index 000000000000..a271f961d218 --- /dev/null +++ b/data/reusables/copilot/code-review/user-settings-sidebar.md @@ -0,0 +1 @@ +1. In the sidebar, under **{% octicon "copilot" aria-hidden="true" aria-label="copilot" %} {% data variables.product.prodname_copilot_short %}**, click **Code review**. From 224b885226a63edb36476dcdc05d9f190c319aea Mon Sep 17 00:00:00 2001 From: Felix Guntrip Date: Thu, 24 Sep 2026 19:12:18 +0000 Subject: [PATCH 4/8] =?UTF-8?q?Proof=20of=20Presence=20(PoP)=20=E2=80=93?= =?UTF-8?q?=20Interactive=20re-authentication=20for=20high-impact=20action?= =?UTF-8?q?s=20(Entra=20IdP)=20[public=20preview]=20(#63335)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Laura Coursen --- .../configuring-proof-of-presence.md | 52 +++++++++++++++++++ .../index.md | 1 + ...uring-oidc-for-enterprise-managed-users.md | 4 ++ ...le-sign-on-for-enterprise-managed-users.md | 4 ++ ...saml-single-sign-on-for-your-enterprise.md | 8 +++ .../sudo-mode.md | 26 +++++++--- data/features/proof-of-presence.yml | 4 ++ .../proof-of-presence-supported-idps.md | 1 + 8 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence.md create mode 100644 data/features/proof-of-presence.yml create mode 100644 data/reusables/enterprise-accounts/proof-of-presence-supported-idps.md diff --git a/content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence.md b/content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence.md new file mode 100644 index 000000000000..973f50640792 --- /dev/null +++ b/content/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence.md @@ -0,0 +1,52 @@ +--- +title: Configuring Proof of Presence +shortTitle: Proof of Presence +intro: 'Reduce the risk from compromised sessions by requiring people to reauthenticate with your identity provider before they perform high-impact actions in your enterprise.' +product: 'Enterprise accounts on {% data variables.product.prodname_ghe_cloud %}' +versions: + feature: proof-of-presence +contentType: concepts +--- + +{% data reusables.public-preview.public-preview %} + +## About Proof of Presence + +Proof of Presence (PoP) adds an identity-provider challenge to sudo mode for enterprises. When a member attempts a protected high-impact action, {% data variables.product.github %} requires the member to reauthenticate through the enterprise's configured identity provider (IdP) before the action can proceed. + +PoP uses the same session and timeout model as sudo mode, and the same protected actions that trigger sudo mode will trigger a PoP challenge. After a member successfully reauthenticates, the member can perform protected actions until the sudo-mode session expires. See [AUTOTITLE](/authentication/keeping-your-account-and-data-secure/sudo-mode). + +PoP can help you reduce the impact of a compromised session and meet compliance requirements for fresh authentication before sensitive operations. Before enabling PoP, make sure your IdP authentication policies provide the level of assurance that you require. + +## Supported identity providers + +{% data reusables.enterprise-accounts.proof-of-presence-supported-idps %} + +## What members experience + +When a member of your enterprise attempts a protected action and needs to reauthenticate, {% data variables.product.github %} redirects the member to the enterprise's IdP. The member follows the IdP prompts, including any required multi-factor authentication, then returns to {% data variables.product.github %} to complete the action. + +If a member cannot complete the challenge, they should contact the enterprise administrator or IdP administrator who manages authentication for the enterprise. + +## Prerequisites + +Before you use PoP, configure SSO between your enterprise and a supported IdP. The configuration depends on your account and deployment type: + +* For an enterprise that uses personal accounts, see [AUTOTITLE](/admin/managing-iam/using-saml-for-enterprise-iam/configuring-saml-single-sign-on-for-your-enterprise). +{% ifversion ghec %} +* For an enterprise that uses {% data variables.product.prodname_emus %}, see [AUTOTITLE](/admin/managing-iam/understanding-iam-for-enterprises/getting-started-with-enterprise-managed-users#configure-authentication). +{% endif %} + +## Enabling Proof of Presence + +When you enable Proof of Presence, this policy will apply across your enterprise. + +{% data reusables.enterprise-accounts.access-enterprise %} +{% data reusables.enterprise-accounts.settings-tab %} +1. Under {% octicon "gear" aria-hidden="true" aria-label="gear" %} **Settings**, click **Authentication security**. +1. From the **Proof of presence** dropdown menu, select an authentication requirement. + + Both options require the member to complete an authentication challenge through your IdP. + + * **Re-authentication**: Requires the member to authenticate again. Depending on your enterprise's authentication policy, the member may be able to satisfy the challenge with password-based authentication. + * **MFA**: Requires the member to authenticate again and satisfy an additional multi-factor authentication challenge, such as using an authenticator app or biometric scan, as configured by your enterprise. diff --git a/content/admin/configuring-settings/hardening-security-for-your-enterprise/index.md b/content/admin/configuring-settings/hardening-security-for-your-enterprise/index.md index 1e237872da2b..2fb021cbaf63 100644 --- a/content/admin/configuring-settings/hardening-security-for-your-enterprise/index.md +++ b/content/admin/configuring-settings/hardening-security-for-your-enterprise/index.md @@ -6,6 +6,7 @@ versions: ghec: '*' ghes: '*' children: + - /configuring-proof-of-presence - /configuring-tls - /configuring-tls-and-ssh-ciphers - /troubleshooting-tls-errors diff --git a/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-oidc-for-enterprise-managed-users.md b/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-oidc-for-enterprise-managed-users.md index 5788ac682b8b..42f97765af14 100644 --- a/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-oidc-for-enterprise-managed-users.md +++ b/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-oidc-for-enterprise-managed-users.md @@ -65,3 +65,7 @@ After you enable OIDC SSO, enable provisioning. See [AUTOTITLE](/admin/managing- You can use the role of guest collaborator to grant limited access to vendors and contractors in your enterprise. Unlike enterprise members, guest collaborators only have access to internal repositories within organizations where they are a member. To use guest collaborators with OIDC authentication, you may need to update your settings in Entra ID. See [AUTOTITLE](/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/enabling-guest-collaborators). + +## Enabling Proof of Presence + +After you configure OIDC SSO, your enterprise can use Proof of Presence to require reauthentication through your IdP before high-impact actions. {% data reusables.enterprise-accounts.proof-of-presence-supported-idps %} For more information, see [AUTOTITLE](/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence). diff --git a/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-saml-single-sign-on-for-enterprise-managed-users.md b/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-saml-single-sign-on-for-enterprise-managed-users.md index 72548185597b..9ce536b66f59 100644 --- a/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-saml-single-sign-on-for-enterprise-managed-users.md +++ b/content/admin/managing-iam/configuring-authentication-for-enterprise-managed-users/configuring-saml-single-sign-on-for-enterprise-managed-users.md @@ -133,3 +133,7 @@ After you enable SAML SSO, enable provisioning. For more information, see [AUTOT You can use the role of guest collaborator to grant limited access to vendors and contractors in your enterprise. Unlike enterprise members, guest collaborators only have access to internal repositories within organizations where they are a member. If you use Entra ID or Okta for SAML authentication, you may need to update your IdP application to use guest collaborators. For more information, see [AUTOTITLE](/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/enabling-guest-collaborators). + +### Enable Proof of Presence + +After you configure SAML SSO, your enterprise can use Proof of Presence to require reauthentication through your IdP before high-impact actions. {% data reusables.enterprise-accounts.proof-of-presence-supported-idps %} For more information, see [AUTOTITLE](/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence). diff --git a/content/admin/managing-iam/using-saml-for-enterprise-iam/configuring-saml-single-sign-on-for-your-enterprise.md b/content/admin/managing-iam/using-saml-for-enterprise-iam/configuring-saml-single-sign-on-for-your-enterprise.md index c81e4e87653a..340d6d1c9101 100644 --- a/content/admin/managing-iam/using-saml-for-enterprise-iam/configuring-saml-single-sign-on-for-your-enterprise.md +++ b/content/admin/managing-iam/using-saml-for-enterprise-iam/configuring-saml-single-sign-on-for-your-enterprise.md @@ -148,6 +148,14 @@ You can enable or disable SAML authentication for {% data variables.location.pro {% endif %} +{% ifversion proof-of-presence %} + +## Enabling Proof of Presence + +After you configure SAML SSO, your enterprise can use Proof of Presence to require reauthentication through your IdP before high-impact actions. {% data reusables.enterprise-accounts.proof-of-presence-supported-idps %} For more information, see [AUTOTITLE](/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence). + +{% endif %} + ## Further reading {%- ifversion ghec %} diff --git a/content/authentication/keeping-your-account-and-data-secure/sudo-mode.md b/content/authentication/keeping-your-account-and-data-secure/sudo-mode.md index ae9e35c46628..85c4fde4af48 100644 --- a/content/authentication/keeping-your-account-and-data-secure/sudo-mode.md +++ b/content/authentication/keeping-your-account-and-data-secure/sudo-mode.md @@ -1,6 +1,6 @@ --- title: Sudo mode -intro: 'To confirm access to your account before you perform a potentially sensitive action, {% data variables.location.product_location %} prompts for authentication.' +intro: 'To confirm access to your account before you perform a protected high-impact action, {% data variables.location.product_location %} prompts for authentication.' redirect_from: - /articles/sudo-mode - /github/authenticating-to-github/sudo-mode @@ -15,12 +15,16 @@ category: ## About sudo mode -To maintain the security of your account when you perform a potentially sensitive action on {% data variables.location.product_location %}, you must authenticate even though you're already signed in. For example, {% data variables.product.company_short %} considers the following actions sensitive because each action could allow a new person or system to access your account. +To maintain the security of your account when you perform a protected high-impact action on {% data variables.location.product_location %}, you must authenticate even though you're already signed in. {% data variables.product.company_short %} requires authentication for actions that can affect access to accounts and resources, including but not limited to: -* Modification of an associated email address -* Authorization of a third-party application -* Addition of a new SSH key -* Creation of a PAT or application +* **Account**: Deleting your user account, modifying an associated email address, adding a new SSH key, or authorizing third-party applications +* **Developer settings**: Generating or removing a client secret, creating {% data variables.product.pat_generic_plural %}, revoking all tokens, or transferring a {% data variables.product.prodname_oauth_app %} +* **Webhooks**: Creating, viewing, editing, or deleting repository, organization, or enterprise webhooks; viewing or redelivering webhook deliveries +* **Organization membership**: Sending or editing organization invitations, adding members directly, adding team members, or changing team roles +* **Organization security**: Changing two-factor authentication enforcement or other organization security settings +* **Enterprise settings**: Creating organizations in an enterprise or changing app access settings for an identity provider (IdP) IP allow list +* **Rulesets**: Creating and modifying rulesets at organization and repository level. +* **Recovery codes**: Viewing, downloading, printing, or regenerating authentication or SSO recovery codes After you authenticate to perform a sensitive action, your session is temporarily in "sudo mode." In sudo mode, you can perform sensitive actions without authentication. {% data variables.product.github %} has a two-hour session timeout period before prompting you for authentication again. During this time, any sensitive action that you perform will reset the timer. @@ -37,6 +41,16 @@ After you authenticate to perform a sensitive action, your session is temporaril {% endif %} +{% ifversion proof-of-presence %} + +## Proof of Presence for enterprise actions + +Enterprises can extend sudo mode with Proof of Presence (PoP). For protected high-impact actions, PoP requires you to reauthenticate through your enterprise's identity provider before the action can proceed. Follow the identity provider's prompts, including any required multi-factor authentication, then return to {% data variables.product.github %} to complete the action. + +{% data reusables.enterprise-accounts.proof-of-presence-supported-idps %} For more information, see [AUTOTITLE](/admin/configuring-settings/hardening-security-for-your-enterprise/configuring-proof-of-presence). + +{% endif %} + ## Confirming access for sudo mode To confirm access for sudo mode, you can authenticate with your password. Optionally, you can use a different authentication method, like a passkey, {% ifversion fpt or ghec %}a security key, {% data variables.product.prodname_mobile %}, or a 2FA code{% elsif ghes %}a security key or a 2FA code{% endif %}. diff --git a/data/features/proof-of-presence.yml b/data/features/proof-of-presence.yml new file mode 100644 index 000000000000..41ccdeff24f5 --- /dev/null +++ b/data/features/proof-of-presence.yml @@ -0,0 +1,4 @@ +# Proof of Presence for enterprise sudo actions. +versions: + ghec: '*' + ghes: '>=3.23' diff --git a/data/reusables/enterprise-accounts/proof-of-presence-supported-idps.md b/data/reusables/enterprise-accounts/proof-of-presence-supported-idps.md new file mode 100644 index 000000000000..b5070cdc9d30 --- /dev/null +++ b/data/reusables/enterprise-accounts/proof-of-presence-supported-idps.md @@ -0,0 +1 @@ +During public preview, Proof of Presence supports **Microsoft Entra ID**. \ No newline at end of file From 7b1b8bcd02e9d2a60373959264f5007680520f4e Mon Sep 17 00:00:00 2001 From: Luke Tomlinson Date: Thu, 24 Sep 2026 19:17:06 +0000 Subject: [PATCH 5/8] Clarify runner group workflow pinning (#63416) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: aee885a1-2e61-400b-ae4c-5ea1dc06c647 --- .../actions/changing-workflow-access-for-a-runner-group.md | 2 +- data/reusables/actions/runner-group-assign-policy-workflow.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/reusables/actions/changing-workflow-access-for-a-runner-group.md b/data/reusables/actions/changing-workflow-access-for-a-runner-group.md index 3c6e36d74a20..1c68770e91af 100644 --- a/data/reusables/actions/changing-workflow-access-for-a-runner-group.md +++ b/data/reusables/actions/changing-workflow-access-for-a-runner-group.md @@ -9,7 +9,7 @@ Always include a security admonition above this procedure. This is either one of {% data reusables.actions.settings-sidebar-actions-runner-groups-selection %} 1. Under **Workflow access**, select the dropdown menu and click **Selected workflows**. 1. Click {% octicon "gear" aria-label="the gear icon" %}. -1. Enter a comma separated list of the workflows that can access the runner group. Use the full path, including the repository name and owner. Pin the workflow to a branch, tag, or full SHA. For example: `octo-org/octo-repo/.github/workflows/build.yml@v2, octo-org/octo-repo/.github/workflows/deploy.yml@d6dc6c96df4f32fa27b039f2084f576ed2c5c2a5, monalisa/octo-test/.github/workflows/test.yml@main`. +1. Enter a comma separated list of the workflows that can access the runner group. Use the full path, including the repository name and owner. Pin non-reusable workflows to a branch. Pin reusable workflows to a branch, tag, or full SHA. For example: `octo-org/octo-repo/.github/workflows/build.yml@v2, octo-org/octo-repo/.github/workflows/deploy.yml@d6dc6c96df4f32fa27b039f2084f576ed2c5c2a5, monalisa/octo-test/.github/workflows/test.yml@main`. Only jobs directly defined within the selected workflows will have access to the runner group. diff --git a/data/reusables/actions/runner-group-assign-policy-workflow.md b/data/reusables/actions/runner-group-assign-policy-workflow.md index ba943d114bd7..b0b43bbf55a9 100644 --- a/data/reusables/actions/runner-group-assign-policy-workflow.md +++ b/data/reusables/actions/runner-group-assign-policy-workflow.md @@ -1,7 +1,7 @@ {%- ifversion ghec or ghes %} 1. Assign a policy for workflow access. - You can configure a runner group to be accessible to a specific list of workflows, or to all workflows. This setting can't be overridden if you are configuring an organization's runner group that was shared by an enterprise. If you specify what workflow can access the runner group, you must use the full path to the workflow, including the repository name and owner, and you must pin the workflow to a branch, tag, or full SHA. For example: `octo-org/octo-repo/.github/workflows/build.yml@refs/tags/v2, octo-org/octo-repo/.github/workflows/deploy.yml@d6dc6c96df4f32fa27b039f2084f576ed2c5c2a5, monalisa/octo-test/.github/workflows/test.yml@refs/heads/main`. + You can configure a runner group to be accessible to a specific list of workflows, or to all workflows. This setting can't be overridden if you are configuring an organization's runner group that was shared by an enterprise. If you specify what workflows can access the runner group, use the full path to the workflow, including the repository name and owner. Pin non-reusable workflows to a branch. Pin reusable workflows to a branch, tag, or full SHA. For example: `octo-org/octo-repo/.github/workflows/build.yml@refs/tags/v2, octo-org/octo-repo/.github/workflows/deploy.yml@d6dc6c96df4f32fa27b039f2084f576ed2c5c2a5, monalisa/octo-test/.github/workflows/test.yml@refs/heads/main`. It is best practice to fully qualify ambiguous refs. For example, instead of providing `main` as a ref, provide `refs/heads/main`. From 31140e845206c6894c50149bd9821d552ed8c1e0 Mon Sep 17 00:00:00 2001 From: docs-bot <77750099+docs-bot@users.noreply.github.com> Date: Thu, 24 Sep 2026 19:20:13 +0000 Subject: [PATCH 6/8] Fix allOf `type` merge conflict for equivalent type sets in different orders (#63515) Co-authored-by: Kevin Heis Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 38d28cc1-1877-4d86-9dd3-888adb11de0d --- src/rest/scripts/utils/merge-all-of.ts | 24 ++++++++++++++++++++---- src/rest/tests/merge-all-of.ts | 9 +++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/rest/scripts/utils/merge-all-of.ts b/src/rest/scripts/utils/merge-all-of.ts index c027285e46a5..0c3133fddf2e 100644 --- a/src/rest/scripts/utils/merge-all-of.ts +++ b/src/rest/scripts/utils/merge-all-of.ts @@ -79,10 +79,10 @@ function isDeepEqual(a: unknown, b: unknown): boolean { * precedence over later ones. * * Only the cases the GitHub OpenAPI descriptions actually use are merged: - * identical values, `properties`, `required`, and annotations. Anything else - * throws rather than guessing, so a future description that needs real - * conflict resolution fails the build loudly instead of quietly publishing the - * wrong request body parameters. + * identical values, `properties`, `required`, `type`, and annotations. + * Anything else throws rather than guessing, so a future description that + * needs real conflict resolution fails the build loudly instead of quietly + * publishing the wrong request body parameters. */ function mergeInto(target: Schema, source: Schema, path: string): void { for (const [key, value] of Object.entries(source)) { @@ -117,6 +117,22 @@ function mergeInto(target: Schema, source: Schema, path: string): void { continue } + // `type` may be a single type name or an array of allowed type names, and + // different `allOf` members can spell the same constraint differently + // (e.g. `"object"` vs `["object", "null"]`, or the same array in a + // different order). Per JSON Schema, `allOf` members combine as an + // intersection, so the merged type is whichever names both sides allow. + if (key === 'type') { + const existingTypes = Array.isArray(existing) ? existing : [existing] + const valueTypes = Array.isArray(value) ? value : [value] + const intersection = existingTypes.filter((type) => valueTypes.includes(type)) + if (intersection.length === 0) { + throw new Error(`Cannot merge allOf: conflicting "type" keyword at ${path}.`) + } + target[key] = intersection.length === 1 ? intersection[0] : intersection + continue + } + if (ANNOTATION_KEYWORDS.has(key)) continue throw new Error( diff --git a/src/rest/tests/merge-all-of.ts b/src/rest/tests/merge-all-of.ts index 14dd31e8708e..9adc92165564 100644 --- a/src/rest/tests/merge-all-of.ts +++ b/src/rest/tests/merge-all-of.ts @@ -165,6 +165,15 @@ describe('mergeAllOf', () => { ).toEqual({ type: 'object', enum: ['a'] }) }) + test('intersects "type" when allOf members allow different but overlapping types', () => { + expect(mergeAllOf({ allOf: [{ type: 'object' }, { type: ['object', 'null'] }] })).toEqual({ + type: 'object', + }) + expect( + mergeAllOf({ allOf: [{ type: ['object', 'null'] }, { type: ['null', 'object'] }] }), + ).toEqual({ type: ['object', 'null'] }) + }) + test('throws on a conflicting keyword rather than guessing', () => { expect(() => mergeAllOf({ allOf: [{ type: 'string' }, { type: 'number' }] })).toThrow( /conflicting "type" keyword/, From d00eabd5ae6575005437fbc848705f0d0415d8d4 Mon Sep 17 00:00:00 2001 From: docs-bot <77750099+docs-bot@users.noreply.github.com> Date: Thu, 24 Sep 2026 19:34:47 +0000 Subject: [PATCH 7/8] Sync Copilot SDK docs (auto-generated) (#63408) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: sunbrye Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 860ffa15-aef4-4655-a9cb-f4e04cc36886 --- .../features-agent-loop-diagram-1.png | Bin 76675 -> 76680 bytes .../features-agent-loop-diagram-2.png | Bin 69657 -> 69660 bytes .../setup-in-process-runtime-diagram-0.png | Bin 0 -> 23371 bytes .../how-tos/copilot-sdk/auth/authenticate.md | 127 ++++++++++ .../copilot/how-tos/copilot-sdk/auth/byok.md | 6 +- .../copilot-sdk/features/client-info.md | 157 ++++++++++++ .../how-tos/copilot-sdk/features/hooks.md | 4 +- .../how-tos/copilot-sdk/features/index.md | 1 + .../features/plugin-directories.md | 28 +++ .../features/session-persistence.md | 75 ++++++ .../how-tos/copilot-sdk/features/skills.md | 16 ++ .../features/steering-and-queueing.md | 22 ++ .../copilot-sdk/features/streaming-events.md | 42 ++++ .../copilot-sdk/hooks/hooks-overview.md | 8 +- .../copilot-sdk/hooks/session-lifecycle.md | 6 - .../copilot-sdk/setup/backend-services.md | 2 +- .../how-tos/copilot-sdk/setup/bundled-cli.md | 3 + .../setup/choosing-a-setup-path.md | 1 + .../copilot-sdk/setup/in-process-runtime.md | 223 ++++++++++++++++++ .../how-tos/copilot-sdk/setup/index.md | 1 + .../copilot-sdk/setup/multi-tenancy.md | 7 +- .../how-tos/copilot-sdk/setup/scaling.md | 2 +- 22 files changed, 713 insertions(+), 18 deletions(-) create mode 100644 assets/images/help/copilot/copilot-sdk/setup-in-process-runtime-diagram-0.png create mode 100644 content/copilot/how-tos/copilot-sdk/features/client-info.md create mode 100644 content/copilot/how-tos/copilot-sdk/setup/in-process-runtime.md diff --git a/assets/images/help/copilot/copilot-sdk/features-agent-loop-diagram-1.png b/assets/images/help/copilot/copilot-sdk/features-agent-loop-diagram-1.png index 753baed74ec1b32c0236229edb066d73e0bf746c..c4c332d8a203ac18a2f6c9c2a78d0adfa421383e 100644 GIT binary patch delta 36139 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 aR09BjDH5FR>JNqh0000Tw9 delta 36135 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 Ef+)wayZ`_I diff --git a/assets/images/help/copilot/copilot-sdk/features-agent-loop-diagram-2.png b/assets/images/help/copilot/copilot-sdk/features-agent-loop-diagram-2.png index 3060cb1c255fcc8b79f44f7190c708dcb6d7489d..870e767a59a3c288ee2bd549e0a3d37bc50b4938 100644 GIT binary patch delta 33049 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 ?;u#RD9o?n18DHAvq9kcICkMpi=Dg!tdX2 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 l72v&1gamhY_qKX72)%1CK= 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 literal 0 HcmV?d00001 diff --git a/content/copilot/how-tos/copilot-sdk/auth/authenticate.md b/content/copilot/how-tos/copilot-sdk/auth/authenticate.md index efd6654f5bb8..602fabaea6b1 100644 --- a/content/copilot/how-tos/copilot-sdk/auth/authenticate.md +++ b/content/copilot/how-tos/copilot-sdk/auth/authenticate.md @@ -215,6 +215,133 @@ const client = new CopilotClient({ For more information, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/github-oauth). +## Rotating session-scoped GitHub tokens + +For multi-user services and integrations, set a token provider on each session instead of storing one long-lived token. The runtime calls the provider for the effective GitHub host and identifies the request as `initial` or `refresh`. The session ID is absent only when a cloud session has not received its ID yet. + +Return a tagged token result or an explicit cancellation. Every token result must include `expiresIn`: the positive number of seconds remaining when the callback completes. Production GitHub tokens typically last eight hours, so `8 * 60 * 60` is a common value. Do not set both the static per-session token and the provider. + +{% codetabs %} +{% codetab typescript %} + + + +```typescript +const session = await client.createSession({ + gitHubTokenProvider: async ({ host, sessionId, reason }) => { + const token = await acquireGitHubToken({ host, sessionId, reason }); + return { + kind: "token", + accessToken: token.value, + expiresIn: token.secondsRemaining, + }; + }, +}); +``` + +{% endcodetab %} +{% codetab python %} + + + +```python +async def provide_github_token(args): + token = await acquire_github_token( + host=args["host"], + session_id=args["session_id"], + reason=args["reason"], + ) + return { + "kind": "token", + "accessToken": token.value, + "expiresIn": token.seconds_remaining, + } + + +session = await client.create_session(github_token_provider=provide_github_token) +``` + +{% endcodetab %} +{% codetab go %} + + + +```golang +session, err := client.CreateSession(ctx, &copilot.SessionConfig{ + GitHubTokenProvider: func(args copilot.GitHubTokenProviderArgs) (*copilot.GitHubTokenProviderResult, error) { + token, secondsRemaining, err := acquireGitHubToken(args.Host, args.SessionID, args.Reason) + if err != nil { + return nil, err + } + return copilot.GitHubTokenResult(&copilot.GitHubToken{ + AccessToken: token, + ExpiresIn: secondsRemaining, + }), nil + }, +}) +``` + +{% endcodetab %} +{% codetab dotnet %} + + + +```csharp +await using var session = await client.CreateSessionAsync(new SessionConfig +{ + GitHubTokenProvider = async args => + { + var token = await AcquireGitHubTokenAsync(args.Host, args.SessionId, args.Reason); + return GitHubTokenProviderResult.FromToken(new GitHubToken + { + AccessToken = token.Value, + ExpiresIn = token.SecondsRemaining, + }); + }, +}); +``` + +{% endcodetab %} +{% codetab java %} + + + +```java +var session = client.createSession(new SessionConfig() + .setGitHubTokenProvider(args -> + acquireGitHubToken(args.host(), args.sessionId(), args.reason()) + .thenApply(token -> GitHubTokenProviderResult.token( + token.value(), token.secondsRemaining()))) + .setOnPermissionRequest(PermissionHandler.APPROVE_ALL) +).get(); +``` + +{% endcodetab %} +{% codetab rust %} + + + +```rust +let provider = Arc::new(|args: GitHubTokenProviderArgs| async move { + let token = acquire_github_token(&args.host, args.session_id.as_ref(), args.reason).await?; + Ok(GitHubTokenProviderResult::Token(GitHubToken::new( + token.value, + token.seconds_remaining, + ))) +}); + +let session = client + .create_session(SessionConfig::default().with_github_token_provider(provider)) + .await?; +``` + +{% endcodetab %} +{% endcodetabs %} + +The runtime performs the `initial` acquisition as part of session creation or resume. A cancelled acquisition, provider error, invalid response, or token without a stable account identity rejects the create or resume operation. The runtime does not fall back to ambient authentication. + +After the session is established, the runtime performs async preflight before each credential-consuming operation. It requests a `refresh` when the current token has one hour or less remaining. Idle sessions are not refreshed until their next credential-consuming operation. The runtime does not use background timers, rejection-driven replay, 401/403 challenge propagation, or upscope for this callback. + ## Environment variables For automation, CI/CD pipelines, and server-to-server scenarios, you can authenticate using environment variables. diff --git a/content/copilot/how-tos/copilot-sdk/auth/byok.md b/content/copilot/how-tos/copilot-sdk/auth/byok.md index 6624808ec975..9c61843c1052 100644 --- a/content/copilot/how-tos/copilot-sdk/auth/byok.md +++ b/content/copilot/how-tos/copilot-sdk/auth/byok.md @@ -234,8 +234,8 @@ Anthropic models always use the Anthropic Messages API regardless of this settin **Azure (`type: "azure"`)** * Use for native Azure OpenAI endpoints -* `baseUrl` should be just the host (e.g., `https://my-resource.openai.azure.com`) -* Do NOT include `/openai/v1` in the URL—the SDK handles path construction +* `baseUrl` / `base_url` accepts a resource host or a full project URL, such as `https:///api/projects/hosted-agents-ncus`, with or without a trailing slash. +* The runtime preserves the project prefix when constructing Azure API paths. For `wireApi: "responses"` with `azure.apiVersion` omitted, the project URL above produces `https:///api/projects/hosted-agents-ncus/openai/v1/responses`. Project URLs require an updated Copilot CLI runtime. **Anthropic (`type: "anthropic"`)** * For direct Anthropic API access @@ -260,7 +260,7 @@ Use `type: "azure"` for endpoints at `*.openai.azure.com`: ```typescript provider: { type: "azure", - baseUrl: "https://my-resource.openai.azure.com", // Just the host + baseUrl: "https://my-resource.openai.azure.com", // Resource host or full project URL apiKey: process.env.AZURE_OPENAI_KEY, azure: { apiVersion: "2024-10-21", diff --git a/content/copilot/how-tos/copilot-sdk/features/client-info.md b/content/copilot/how-tos/copilot-sdk/features/client-info.md new file mode 100644 index 000000000000..9f4e932dc328 --- /dev/null +++ b/content/copilot/how-tos/copilot-sdk/features/client-info.md @@ -0,0 +1,157 @@ +--- +title: Client info +shortTitle: Client info +intro: >- + Client info identifies the application using the Copilot SDK and, when + applicable, a specific integration within it. An integration is an + identifiable sub-part of the application through which the SDK is used, such + as an extension or plugin. Set the optional `clientInfo` client option to + attribute runtime telemetry for that connection to your application instead of + the runtime's own build. +versions: + fpt: '*' + ghec: '*' +contentType: how-tos +--- + + + + +## When to set client info + +Set client info when your SDK application represents a distinct product, service, or integration whose runtime activity should be attributed consistently. + +Leave client info unset for scripts, one-off tools, and jobs that do not represent a distinct application. The runtime then keeps its default attribution. + +Client info has four optional string fields. Set the fields you know and omit the rest. The SDK includes client info in the `server.connect` handshake only when at least one field has a non-empty value. + +| Field | Example | Meaning | +|---|---|---| +| `applicationName` | `"vscode"` | Name of the application using the SDK | +| `applicationVersion` | `"1.124.2"` | Version of the application using the SDK | +| `integrationName` | `"copilot-chat"` | Name of the extension, plugin, or other application sub-part using the SDK | +| `integrationVersion` | `"0.54.0"` | Version of that extension, plugin, or application sub-part | + +For a standalone application without a distinct integration, set only the application fields. For example, a developer portal could set `applicationName` to `"acme-developer-portal"` and `applicationVersion` to `"2.4.0"`, leaving both integration fields unset. + +The SDK sends client info once when it establishes the connection. The identity applies for the lifetime of that connection. + +## Configure client info + +Pass client info when you create the client: + +{% codetabs %} +{% codetab typescript %} + +```typescript +import { CopilotClient } from "@github/copilot-sdk"; + +const client = new CopilotClient({ + clientInfo: { + applicationName: "vscode", + applicationVersion: "1.124.2", + integrationName: "copilot-chat", + integrationVersion: "0.54.0", + }, +}); + +await client.start(); +``` + +{% endcodetab %} +{% codetab python %} + + + +```python +from copilot import CopilotClient + +client = CopilotClient( + client_info={ + "application_name": "vscode", + "application_version": "1.124.2", + "integration_name": "copilot-chat", + "integration_version": "0.54.0", + }, +) +await client.start() +``` + +{% endcodetab %} +{% codetab go %} + +```golang +client := copilot.NewClient(&copilot.ClientOptions{ + ClientInfo: &copilot.ClientInfo{ + ApplicationName: "vscode", + ApplicationVersion: "1.124.2", + IntegrationName: "copilot-chat", + IntegrationVersion: "0.54.0", + }, +}) +if err := client.Start(ctx); err != nil { + return err +} +``` + +{% endcodetab %} +{% codetab dotnet %} + +```csharp +using GitHub.Copilot; + +await using var client = new CopilotClient(new CopilotClientOptions +{ + ClientInfo = new CopilotClientInfo + { + ApplicationName = "vscode", + ApplicationVersion = "1.124.2", + IntegrationName = "copilot-chat", + IntegrationVersion = "0.54.0", + }, +}); + +await client.StartAsync(); +``` + +{% endcodetab %} +{% codetab java %} + +```java +var options = new CopilotClientOptions() + .setClientInfo(new ClientInfo() + .setApplicationName("vscode") + .setApplicationVersion("1.124.2") + .setIntegrationName("copilot-chat") + .setIntegrationVersion("0.54.0")); + +var client = new CopilotClient(options); +client.start().get(); +``` + +{% endcodetab %} +{% codetab rust %} + +```rust +use github_copilot_sdk::{Client, ClientInfo, ClientOptions}; + +let client = Client::start( + ClientOptions::new().with_client_info( + ClientInfo::new() + .with_application_name("vscode") + .with_application_version("1.124.2") + .with_integration_name("copilot-chat") + .with_integration_version("0.54.0"), + ), +) +.await?; +``` + +{% endcodetab %} +{% endcodetabs %} + +## Notes + +* Client info is advisory. The runtime can ignore values that do not match the expected format, such as an invalid version string. +* Setting client info changes how the runtime attributes its telemetry. It does not change what the runtime records. +* If every field is unset or empty, the SDK omits client info from the handshake and the runtime keeps its default attribution. diff --git a/content/copilot/how-tos/copilot-sdk/features/hooks.md b/content/copilot/how-tos/copilot-sdk/features/hooks.md index 172c78fd7633..44d381007a0e 100644 --- a/content/copilot/how-tos/copilot-sdk/features/hooks.md +++ b/content/copilot/how-tos/copilot-sdk/features/hooks.md @@ -26,13 +26,13 @@ A hook is a callback you register once when creating a session. The SDK invokes | Hook | When it fires | What you can do | | ------------------------------------------------------------------- | ----------------------------------- | ------------------------------------------ | -| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-start) | Session begins (new or resumed) | Inject context, load preferences | +| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-start-hook) | Session begins (new or resumed) | Inject context, load preferences | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/user-prompt-submitted) | User sends a message | Rewrite prompts, add context, filter input | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/user-prompt-transformed) | Runtime builds the model prompt | Inspect or replace model-facing content | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/pre-tool-use) | Before a tool executes | Allow / deny / modify the call | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/post-tool-use) | After a tool returns (success only) | Transform results, redact secrets, audit | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/post-tool-use#failure-variant) | After a tool returns a failure | Inject retry guidance, log failures | -| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-end) | Session ends | Clean up, record metrics | +| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-end-hook) | Session ends | Clean up, record metrics | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/error-handling) | An error is raised | Custom logging, retry logic, alerts | All hooks are **optional**—register only the ones you need. Returning `null` (or the language equivalent) from any hook tells the SDK to continue with default behavior. diff --git a/content/copilot/how-tos/copilot-sdk/features/index.md b/content/copilot/how-tos/copilot-sdk/features/index.md index 319fb9980c9c..bcf8586f08c2 100644 --- a/content/copilot/how-tos/copilot-sdk/features/index.md +++ b/content/copilot/how-tos/copilot-sdk/features/index.md @@ -13,6 +13,7 @@ contentType: how-tos children: - /agent-loop - /citations + - /client-info - /cloud-sessions - /context-management - /custom-agents diff --git a/content/copilot/how-tos/copilot-sdk/features/plugin-directories.md b/content/copilot/how-tos/copilot-sdk/features/plugin-directories.md index 42543b900978..d7a9b68227b5 100644 --- a/content/copilot/how-tos/copilot-sdk/features/plugin-directories.md +++ b/content/copilot/how-tos/copilot-sdk/features/plugin-directories.md @@ -160,6 +160,34 @@ let client = Client::start( > The example above uses an stdio runtime connection — the default when the SDK bundles the CLI. If you connect to an external runtime via a URL (`forUri` / `ForUri`), pass `--plugin-dir` to the long-running CLI server when you start it; the SDK does not forward `--plugin-dir` to runtimes it didn't spawn. +## Per-session plugin directories + +`--plugin-dir` is a launch argument, so it fixes one plugin set for the CLI process and every session created against it. When sessions need different plugin sets, or when the SDK is connected to a runtime it did not spawn, pass the directories on the session config instead. They travel in the `session.create` and `session.resume` payloads over JSON-RPC rather than as process arguments, so they reach an external runtime the same way the startup option does. + +```typescript +import { CopilotClient } from "@github/copilot-sdk"; + +const client = new CopilotClient(); +await client.start(); + +const session = await client.createSession({ + pluginDirectories: ["./plugins/code-reviewer"], +}); +``` + +Relative paths resolve against `workingDirectory`, or the runtime working directory when that is unset, so absolute paths are recommended. Entries that do not resolve are logged and skipped rather than failing session creation. The option is an explicit opt-in, which means plugin agents and rules load even when `enableConfigDiscovery` is false. Assets loaded this way sit between project sources and personal or home sources in the session-wide precedence order. + +The equivalent option in each SDK is: + +| SDK | Session option | +|---|---| +| Node.js / TypeScript | `pluginDirectories: string[]` | +| Python | `plugin_directories=[...]` | +| Go | `PluginDirectories: []string{...}` | +| .NET | `PluginDirectories = [...]` | +| Java | `.setPluginDirectories(List.of(...))` | +| Rust | `.with_plugin_directories([...])` | + ## Trusted host-bundled plugin directories Applications that ship their own trusted plugins can register them as a client startup option. The SDK sends the complete ordered set after connecting and verifying the protocol, before `start` returns or any session can be created. Paths must be absolute; leaving the option unset or empty makes no RPC call. diff --git a/content/copilot/how-tos/copilot-sdk/features/session-persistence.md b/content/copilot/how-tos/copilot-sdk/features/session-persistence.md index 7f65427211dc..013b58ac3202 100644 --- a/content/copilot/how-tos/copilot-sdk/features/session-persistence.md +++ b/content/copilot/how-tos/copilot-sdk/features/session-persistence.md @@ -167,6 +167,8 @@ When resuming a session, you can optionally reconfigure many settings. This is u | `availableTools` | Restrict which tools are available | | `excludedTools` | Disable specific tools | | `provider` | Re-provide BYOK credentials (required for BYOK sessions) | +| `capi.autoTier` | Override the persisted Auto routing preference | +| `capi.enableWebSocketResponses` | Choose the Responses API transport for the resumed session | | `reasoningEffort` | Adjust reasoning effort level | | `streaming` | Enable/disable streaming responses | | `workingDirectory` | Change the working directory | @@ -178,6 +180,79 @@ When resuming a session, you can optionally reconfigure many settings. This is u | `disabledSkills` | Skills to disable | | `infiniteSessions` | Configure infinite session behavior | +### Auto tier persistence + +With `model: "auto"`, the optional `capi.autoTier` setting selects an Auto routing preference: `efficiency`, `balance`, `intelligence`, or `fast`. In Python, use `capi={"auto_tier": "balance"}`. This setting applies to V2 Auto routing; V1 Auto requests are unchanged. + +`fast` is an integrator-only latency preset, not a first-party GitHub Copilot product preference. The SDK does not decide Fast eligibility, inspect client identity, choose it as a default, or fall back to another tier when a runtime does not support it—an older runtime returns its native error unchanged. + +The runtime persists the selected tier, so applications do not need to resend it on every resume: + +* Omitting the tier when creating a session uses the runtime's default routing behavior. +* A cold resume restores the persisted tier. Supplying an explicit tier overrides the restored value for the new activation. +* When resuming a session already resident in the runtime, omitting the tier preserves the current selection and supplying the same tier is a no-op. Supplying a different tier requests a safe switch that the runtime applies after the resume succeeds; it cannot change a turn that is already in flight. +* Older sessions without a persisted tier retain default routing behavior. + +Tier selection is not a live model-switch operation. The SDK forwards the preference; the runtime owns persistence and validation. + +The `session.start` and `session.resume` events expose the selected tier in their optional `data.autoTier` field (`data.auto_tier` in Python). When no tier is selected, the field is omitted. + +### Changing the Auto tier during a session + +Call `setAutoTier` to change the routing preference on a live session without changing the selected model. Pass `null` (Python `None`, Go `nil`) to return to the provider's default Auto routing. + +```typescript +const result = await session.setAutoTier("intelligence"); +if (result.status === "pending") { + // Accepted, but not yet in effect. +} +``` + +The runtime does not apply the preference immediately. It records the request and commits it only when a later user turn using the `auto` model successfully obtains a usable model from the provider. A `pending` status therefore confirms that the request was accepted, not that it took effect. Only the most recent request survives: a new request replaces any earlier one that no turn has claimed yet. + +Watch for the outcome through these events: + +* `session.model_change` when the preference commits. +* `session.auto_tier_switch_failed` when it does not. This event is ephemeral, so the runtime never persists or replays it on resume. Its `reason` field is one of `policy_rejected`, `request_failed`, `setup_failed`, or `unsupported`, and the previously effective preference stays active. + +You can also read the authoritative state at any time through the session's `model.getCurrent` RPC method, which reports the committed `autoTier`, any unclaimed `pendingAutoTier`, and the `activatingAutoTier` currently claimed by an in-progress activation. + +| SDK | Change the tier | Return to provider-default routing | +|-----|-----------------|------------------------------------| +| Node.js | `session.setAutoTier("balance")` | `session.setAutoTier(null)` | +| Python | `session.set_auto_tier("balance")` | `session.set_auto_tier(None)` | +| Go | `session.SetAutoTier(ctx, &tier)` | `session.SetAutoTier(ctx, nil)` | +| .NET | `session.SetAutoTierAsync(AutoTier.Balance)` | `session.SetAutoTierAsync(null)` | +| Rust | `session.set_auto_tier(Some(AutoTier::Balance))` | `session.set_auto_tier(None)` | +| Java | `session.setAutoTier(AutoTier.BALANCE)` | `session.setAutoTier(null)` | + +To select the `auto` model and its routing preference in a single call, stage the tier on the model switch instead. The runtime rejects this option when the model is anything other than `auto`. + +| SDK | Stage a tier with the switch | Reset to provider-default routing | +|-----|------------------------------|-----------------------------------| +| Node.js | `setModel("auto", { autoTier: "balance" })` | `setModel("auto", { autoTier: null })` | +| Python | `set_model("auto", auto_tier="balance")` | `set_model("auto", auto_tier=None)` | +| Go | `SetModelOptions{AutoTier: &tier}` | `SetModelOptions{ResetAutoTier: true}` | +| .NET | `new SetModelOptions { AutoTier = AutoTier.Balance }` | `new SetModelOptions { ResetAutoTier = true }` | +| Rust | `SetModelOptions::default().with_auto_tier(AutoTier::Balance)` | `SetModelOptions::default().with_reset_auto_tier()` | +| Java | `new SetModelOptions().setModel("auto").setAutoTier(AutoTier.BALANCE)` | `new SetModelOptions().setModel("auto").setResetAutoTier(true)` | + +Node.js, Python, and Rust express all three states in a single value: Node.js and Python because `null`/`None` is distinguishable from an omitted argument, and Rust because `AutoTierPreference::Reset` is a distinct variant of the same option. Go, .NET, and Java have no way to distinguish "reset" from "unset" in one value, so they carry a separate reset flag. Omitting both always means "leave the current preference alone." + +### Responses transport on resume + +The optional `capi.enableWebSocketResponses` setting chooses the transport for the CAPI Responses API. It defaults to `true`, so the WebSocket transport is used whenever the selected model advertises the `ws:/responses` endpoint. Setting it to `false` falls back to the HTTP transport. In Python, use `capi={"enable_web_socket_responses": False}`. + +Supply it on the resume call when you need it. It is worth setting when WebSocket connections fail behind a proxy, and when a resumed session reports `400 input item ID does not belong to this connection`, which is specific to the WebSocket transport. + +```typescript +const session = await client.resumeSession("user-123-task-456", { + capi: { enableWebSocketResponses: false }, +}); +``` + +Setting this to `false` is equivalent to the `COPILOT_CLI_DISABLE_WEBSOCKET_RESPONSES` environment variable, which has the opposite polarity. + ### Example: changing model on resume ```typescript diff --git a/content/copilot/how-tos/copilot-sdk/features/skills.md b/content/copilot/how-tos/copilot-sdk/features/skills.md index 71fa9121dc63..cf1bc42374aa 100644 --- a/content/copilot/how-tos/copilot-sdk/features/skills.md +++ b/content/copilot/how-tos/copilot-sdk/features/skills.md @@ -303,6 +303,22 @@ The markdown body contains the instructions that are injected into the session c | .NET | `SkillDirectories` | `List` | Directories to load skills from | | .NET | `DisabledSkills` | `List` | Skills to disable | +### Built-in skills and `mode: "empty"` + +The runtime ships with a set of bundled **built-in** skills that are eligible by +default. When you run the client in `mode: "empty"` (the recommended baseline for +[AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy)), the SDK excludes every +runtime-bundled built-in skill: it sends an empty `includedBuiltinSkills` list on +the post-create and post-resume options patch, alongside the empty +`installedPlugins` list. + +This exclusion is the default, not a permanent restriction. To allow selected +runtime-bundled skills, set `includedBuiltinSkills` (or the language-specific +casing) to their names. You can also opt into your **own** custom skills under +`mode: "empty"`—enable skills and pass your own `skillDirectories`—and those +remain fully usable, including a custom skill that shares a name with a built-in. +Under `mode: "copilot-cli"` the field is omitted unless you set the option. + ## Best practices 1. **Organize by domain** - Group related skills together (e.g., `skills/security/`, `skills/testing/`) diff --git a/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md b/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md index 3669f9c5c2ca..7ea61b75539e 100644 --- a/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md +++ b/content/copilot/how-tos/copilot-sdk/features/steering-and-queueing.md @@ -27,6 +27,28 @@ When a session is actively processing a turn, incoming messages can be delivered ![Diagram: Sequence diagram showing the described process.](/assets/images/help/copilot/copilot-sdk/features-steering-and-queueing-diagram-0.png) +## Message provenance + +Set the optional source when forwarding a message from another agent. An identified agent source serializes as `agent-`. Leave source unset for ordinary human sends to preserve runtime defaults. Both send and send-and-wait APIs support source with `"enqueue"` and `"immediate"` delivery. + +| SDK | Identified agent source | +|-----|-------------------------| +| Node.js / TypeScript | `source: "agent-sender-id"` | +| Python | `source=AgentMessageSource("sender-id")` | +| Go | `Source: copilot.MessageSourceAgent("sender-id")` | +| .NET | `Source = MessageSource.Agent("sender-id")` | +| Java | `.setSource(MessageSource.agent("sender-id"))` | +| Rust | `.with_source(MessageSource::Agent("sender-id".into()))` | + +The typed APIs also support `user` and `system`. Use `system` for internal application context, not as a substitute for an identified agent. Agent provenance lets the runtime distinguish agent input from human authorization while retaining its agent-message steering behavior. Derive the sender ID from trusted application metadata, never from message text. + +Source identifies origin. Delivery mode requests urgency. Neither requires the recipient to produce a visible reply, and source does not set billing flags. The runtime applies its existing scheduling rules. Rust callers using the typed RPC API can also pass `MessageSource` to `rpc::SendRequest::with_source(...)`. + +A successful high-level `send` acknowledgement returns a message ID and confirms acceptance, not that the recipient has consumed the message. Do not automatically resend an accepted message merely because no reply appears. Send-and-wait can complete on an idle event without an assistant message. + +> [!WARNING] +> Remote backends do not necessarily preserve source end to end. The agent session can include source in its local echo without carrying it in the remote HTTP request. A local source event does not prove that the remote worker received the same provenance. + ## Steering (immediate mode) Steering sends a message that is injected directly into the agent's current turn. The agent sees the message in real time and adjusts its response accordingly—useful for course-correcting without aborting the turn. diff --git a/content/copilot/how-tos/copilot-sdk/features/streaming-events.md b/content/copilot/how-tos/copilot-sdk/features/streaming-events.md index 47e136e34e88..40df8147cd41 100644 --- a/content/copilot/how-tos/copilot-sdk/features/streaming-events.md +++ b/content/copilot/how-tos/copilot-sdk/features/streaming-events.md @@ -125,6 +125,48 @@ session.on(AssistantMessageDeltaEvent.class, event -> > [!TIP] > **(TypeScript)** The TypeScript SDK uses a discriminated union—when you match on `event.type`, the `data` payload is automatically narrowed to the correct shape. +## Subscribing before a session starts + +A session can emit events before its create or resume call returns. The agent may already be working—especially on resume with `continuePendingWork`—and ephemeral events such as `session.idle` are never written to the session log, so `getMessages` cannot recover them afterwards. A subscription installed after the session handle exists misses that startup window. + +> [!TIP] +> **(Rust)** `Client::prepare_session` and `Client::prepare_resume_session` return a `PreparedSession` that owns the session's event channel before any protocol activity happens. Subscribe first, then call `start()`. + +```rust +use github_copilot_sdk::{Client, SessionConfig}; + +async fn create_without_missing_startup_events( + client: &Client, +) -> Result<(), github_copilot_sdk::Error> { + let prepared = client.prepare_session( + SessionConfig::default().with_event_buffer_capacity(2048), + )?; + + // Installed before any wire activity: nothing is dropped for lack of a receiver. + let mut events = prepared.subscribe(); + tokio::spawn(async move { + while let Ok(event) = events.recv().await { + println!("{}", event.event_type); + } + }); + + let session = prepared.start().await?; + let _ = session; + Ok(()) +} +``` + +`prepare_*` is synchronous and inert: it validates the buffer capacity, allocates a local channel, and does nothing else. No session is registered and nothing reaches the CLI until `start()` is first polled. Dropping a prepared session that was never started leaves no state behind and closes its subscriptions; dropping the `start()` future cancels the in-flight startup and unregisters the session, so a retry with the same session ID succeeds. Cleanup is scoped to the exact registration the abandoned startup owned, so it cannot evict a retry that has already taken over the same session ID. + +Startup buffering is worth planning for: + +* The event buffer is finite—512 events unless `event_buffer_capacity` overrides it. A capacity of `0` is rejected with an invalid-config error rather than clamped. +* Slow subscribers observe a `Lagged` error reporting how many events were skipped. They never apply backpressure to the session's event loop. +* Consumers that need a lossless view of a large startup burst must either configure a capacity that covers it or drain the subscription concurrently with `start()`. + +> [!NOTE] +> For cloud sessions where the server assigns the session ID, the SDK cannot route notifications until the create response arrives and the ID is known. Events emitted before that point are not routable to any session. The guarantee is narrower: routed events are never dropped for lack of an installed receiver. Pin `session_id` on the config to get routing—and full pre-response coverage—from the first byte. + ## Render only the parent agent response Sub-agent events share the parent session stream and include envelope-level `agentId`. Root/main agent events and session-level events omit `agentId`, so main-chat renderers can ignore assistant events where `agentId` is set and route those events to traces or progress UI instead. diff --git a/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md b/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md index 58541e6eeb89..f9dfe320ff4d 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/hooks-overview.md @@ -30,10 +30,10 @@ contentType: how-tos | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/post-tool-use#failure-variant) | After a tool execution whose result was a failure | Inject retry guidance, log failures | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/user-prompt-submitted) | When user sends a message | Prompt modification, filtering | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/user-prompt-transformed) | After runtime prompt transformation | Inspect or replace model-facing content | -| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-start) | Session begins | Add context, configure session | -| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-end) | Session ends | Cleanup, analytics | +| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-start-hook) | Session begins | Add context, configure session | +| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#session-end-hook) | Session ends | Cleanup, analytics | | [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/error-handling) | Error happens | Custom error handling | -| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#agent-stop) | Top-level agent naturally stops | Validate completion or request another turn | +| [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#agent-stop-hook) | Top-level agent naturally stops | Validate completion or request another turn | ## Quick start @@ -272,7 +272,7 @@ const session = await client.createSession({ * **[AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/user-prompt-submitted)** - Modify user prompts * **[AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/user-prompt-transformed)** - Replace model-facing prompts * **[AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle)** - Session start and end -* **[AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#agent-stop)** - Validate completion before the agent stops +* **[AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle#agent-stop-hook)** - Validate completion before the agent stops * **[AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/error-handling)** - Custom error handling ## See also diff --git a/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md b/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md index ff8d463f6e73..fa73a3bd9f4b 100644 --- a/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md +++ b/content/copilot/how-tos/copilot-sdk/hooks/session-lifecycle.md @@ -20,8 +20,6 @@ contentType: how-tos * Track session metrics and analytics * Configure session behavior dynamically - - ## Session start hook The `onSessionStart` hook is called when a session begins (new or resumed). @@ -202,8 +200,6 @@ const session = await client.createSession({ }); ``` - - ## Session end hook The `onSessionEnd` hook is called when a session ends. @@ -449,8 +445,6 @@ Session Summary: }); ``` - - ## Agent stop hook The agent stop hook runs when the top-level agent naturally reaches the end of a turn. It is separate from `onSessionEnd`: the session remains active, and the hook can request another agent turn. diff --git a/content/copilot/how-tos/copilot-sdk/setup/backend-services.md b/content/copilot/how-tos/copilot-sdk/setup/backend-services.md index a70cdf76553f..c7024572bfa9 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/backend-services.md +++ b/content/copilot/how-tos/copilot-sdk/setup/backend-services.md @@ -417,7 +417,7 @@ setInterval(() => cleanupSessions(24 * 60 * 60 * 1000), 60 * 60 * 1000); | **Single CLI server = single point of failure** | See [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling) for HA patterns | | **No built-in auth between SDK and CLI** | Secure the network path (same host, VPC, etc.) | | **Session state on local disk** | Mount persistent storage for container restarts | -| **30-minute idle timeout** | Sessions without activity are auto-cleaned | +| **No idle timeout by default** | Pass `--session-idle-timeout ` to the CLI server to automatically clean up inactive sessions | ## When to move on diff --git a/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md b/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md index 51076cb21120..1042adc6cb6a 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md +++ b/content/copilot/how-tos/copilot-sdk/setup/bundled-cli.md @@ -40,6 +40,9 @@ When you install the SDK, the Copilot runtime is included automatically (Node.js ## Quick start +> [!NOTE] +> Each SDK has a minimum language runtime requirement—see the Prerequisites section of the [Node.js](https://github.com/github/copilot-sdk/tree/main/nodejs/README.md#prerequisites), [Python](https://github.com/github/copilot-sdk/tree/main/python/README.md#prerequisites), [Go](https://github.com/github/copilot-sdk/tree/main/go/README.md#prerequisites), [Rust](https://github.com/github/copilot-sdk/tree/main/rust/README.md#prerequisites), [Java](https://github.com/github/copilot-sdk/tree/main/java/README.md#prerequisites), or [.NET](https://github.com/github/copilot-sdk/tree/main/dotnet/README.md#prerequisites) README—since an unsupported runtime (e.g. Python below the stated floor) can cause `pip`/package managers to silently resolve an outdated SDK release instead of reporting a version conflict. + {% codetabs %} {% codetab typescript %} diff --git a/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md b/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md index 34c16e7d36cd..9b0ef338e28f 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md +++ b/content/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path.md @@ -84,6 +84,7 @@ Use this table to find the right guides based on what you need to do: | Use your own model keys (OpenAI, Azure, and more) | [AUTOTITLE](/copilot/how-tos/copilot-sdk/auth/byok) | | Azure BYOK with Managed Identity (no API keys) | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/azure-managed-identity) | | Run the SDK on a server | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services) | +| Host the runtime inside your application process (no separate CLI process) | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/in-process-runtime) *(experimental)* | | Configure SDK options for concurrent users | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/multi-tenancy) | | Serve multiple users / scale horizontally | [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling) | diff --git a/content/copilot/how-tos/copilot-sdk/setup/in-process-runtime.md b/content/copilot/how-tos/copilot-sdk/setup/in-process-runtime.md new file mode 100644 index 000000000000..5d5c50f5bc3b --- /dev/null +++ b/content/copilot/how-tos/copilot-sdk/setup/in-process-runtime.md @@ -0,0 +1,223 @@ +--- +title: Run the Copilot runtime in process +shortTitle: In-process runtime +intro: >- + In-process hosting loads the native Copilot runtime into your application + process instead of starting a separate Copilot CLI process. Use it to remove + child-process management while keeping the same Copilot SDK sessions, events, + tools, hooks, and JSON-RPC behavior. +versions: + fpt: '*' + ghec: '*' +contentType: how-tos +--- + + + + +> [!WARNING] +> In-process hosting is experimental in every SDK. Test startup, model turns, and shutdown behavior on every operating system and architecture that you deploy. + +## When to use in-process hosting + +In-process hosting is a good fit when: + +* Your application must run without a separate runtime process. +* You want the SDK to own the runtime lifecycle. +* You can ship a native library for each deployment platform. +* Process-wide environment and working-directory settings are acceptable. + +Use the [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/bundled-cli) when process isolation and the most established deployment path are more important. Use a [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services) when multiple application instances must connect to a shared runtime over TCP. + +## How it works + +The SDK loads the Copilot runtime native library and binds its fixed C ABI. All SDK methods continue to use the existing `Content-Length`-framed JSON-RPC protocol over an in-memory connection. + +![Diagram: Flowchart showing the described process.](/assets/images/help/copilot/copilot-sdk/setup-in-process-runtime-diagram-0.png) + +The runtime: + +* Runs in the application process without Node.js, a child process, a TCP port, or a connection token. +* Supports the same sessions, streaming events, tools, hooks, permissions, and server-to-client requests as other transports. +* Can invoke SDK callbacks from native worker threads. The SDK handles thread marshalling and callback lifetime. +* Keeps the loaded native library and its worker pool available for the lifetime of the application process. + +## SDK requirements + +All SDKs expose an explicit in-process connection option. Some languages require additional build or package configuration. + +| SDK | Connection option | Additional requirement | +|-----|-------------------|------------------------| +| TypeScript | `RuntimeConnection.forInProcess()` | None when the package includes a compatible runtime bundle | +| Python | `RuntimeConnection.for_inprocess()` | Pre-download with `python -m copilot download-runtime --in-process` when runtime download is unavailable during startup | +| Go | `copilot.InProcessConnection{}` | Build with `-tags copilot_inprocess` | +| .NET | `RuntimeConnection.ForInProcess()` | Allow the `GHCP001` experimental API diagnostic | +| Rust | `Transport::InProcess` | Enable the `bundled-in-process` Cargo feature | +| Java | `RuntimeConnection.forInProcess()` | Add JNA, a platform runtime classifier, and experimental API opt-in | + +The native runtime bundle must match the host operating system, CPU architecture, and, on Linux, C library. Unsupported hosts fail during runtime resolution or startup instead of falling back to a child process. + +## Configure an in-process connection + +Pass the language-specific connection option when you create the client. + +{% codetabs %} +{% codetab typescript %} + + + +```typescript +import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk"; + +const client = new CopilotClient({ + connection: RuntimeConnection.forInProcess(), +}); + +await client.start(); +``` + +{% endcodetab %} +{% codetab python %} + + + +```python +from copilot import CopilotClient, RuntimeConnection + +client = CopilotClient( + connection=RuntimeConnection.for_inprocess(), +) + +await client.start() +``` + +{% endcodetab %} +{% codetab go %} + + + +```golang +client := copilot.NewClient(&copilot.ClientOptions{ + Connection: copilot.InProcessConnection{}, +}) + +if err := client.Start(context.Background()); err != nil { + log.Fatal(err) +} +defer client.Stop() +``` + +{% endcodetab %} +{% codetab dotnet %} + + + +```csharp +#pragma warning disable GHCP001 + +var client = new CopilotClient(new CopilotClientOptions +{ + Connection = RuntimeConnection.ForInProcess(), +}); + +await client.StartAsync(); +``` + +{% endcodetab %} +{% codetab rust %} + + + +```rust +let options = ClientOptions::default() + .with_transport(Transport::InProcess); + +let client = Client::start(options).await?; +``` + +{% endcodetab %} +{% codetab java %} + + + +```java +import com.github.copilot.AllowCopilotExperimental; + +@AllowCopilotExperimental +public class Example { + public void run() throws Exception { + CopilotClientOptions options = new CopilotClientOptions() + .setConnection(RuntimeConnection.forInProcess()); + + CopilotClient client = new CopilotClient(options); + client.start().join(); + } +} +``` + +`RuntimeConnection.forInProcess()` is `@CopilotExperimental`, so the consuming class or method must opt in with `@AllowCopilotExperimental` (or compile with `-Acopilot.experimental.allowed=true`). See [Using experimental APIs](https://github.com/github/copilot-sdk/tree/main/java/README.md#using-experimental-apis). + +{% endcodetab %} +{% endcodetabs %} + +You can also set `COPILOT_SDK_DEFAULT_CONNECTION=inprocess` before starting the application. The SDK uses this value only when the client does not specify a connection explicitly. An invalid value causes startup to fail. + +Prefer explicit client configuration in application code. Use the environment variable when deployment configuration must select the transport without changing the application. + +## Configure the runtime + +The SDK converts supported typed client options into native runtime arguments and host-scoped environment values. Depending on the SDK, these options include: + +* Authentication token and logged-in-user fallback. +* Copilot base directory. +* Log level. +* Session idle timeout. +* Remote session mode. + +The in-process runtime receives a snapshot of the host environment plus supported SDK-managed overrides. It does not mutate the host environment. + +Set process-wide values before creating the first in-process client. This includes environment variables that are not represented by typed client options and the application's current working directory. + +## Runtime library resolution + +Each SDK first looks for a compatible bundled or cached runtime library. You can set `COPILOT_CLI_PATH` to point into a compatible Copilot runtime package when you need to provide the runtime separately. + +Only one native runtime library path and version can normally be loaded in a process. Starting another client with the same loaded library is supported, but attempting to load a different runtime library fails. + +For production deployments: + +1. Build and test the application for each target platform. +1. Ensure that the matching native runtime artifact is included in the deployed package or available through the SDK's runtime download mechanism. +1. Start at least one session and complete a model turn in a deployment smoke test. +1. Stop clients gracefully before the application exits. + +## Lifecycle behavior + +Starting an in-process client loads the native library, creates a runtime host, opens an in-memory connection, and performs the normal SDK protocol-version handshake. + +During graceful shutdown, the SDK: + +1. Closes active sessions. +1. Requests normal runtime shutdown over JSON-RPC. +1. Closes the JSON-RPC and native connections. +1. Releases the runtime host. + +The native library can remain loaded until the application process exits. Do not depend on unloading and replacing the runtime library after first use. + +## Limitations + +In-process hosting has these current constraints: + +* **Experimental API**: behavior and packaging requirements can change between releases. +* **Shared process state**: all clients share the host process environment, current working directory, native library, and runtime worker pool. +* **Restricted process options**: SDK options for an arbitrary environment, working directory, telemetry configuration, executable path, or CLI arguments are rejected where applicable. Configure process-global values on the host process and use supported typed options for runtime settings. +* **No per-client working directory**: the runtime uses the hosting process working directory. +* **One runtime version per process**: loading another native library path or version is not supported. +* **Platform maturity varies**: some SDK and platform combinations have reduced model-turn or shutdown coverage. Validate the exact combination that you deploy. + +## Further reading + +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/choosing-a-setup-path): compare in-process hosting with other deployment models +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/bundled-cli): run the bundled runtime in a managed child process +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/backend-services): connect applications to a shared runtime over TCP +* [AUTOTITLE](/copilot/how-tos/copilot-sdk/hooks/session-lifecycle): handle session start and end events diff --git a/content/copilot/how-tos/copilot-sdk/setup/index.md b/content/copilot/how-tos/copilot-sdk/setup/index.md index 1766006906b2..ebaa7049205e 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/index.md +++ b/content/copilot/how-tos/copilot-sdk/setup/index.md @@ -13,6 +13,7 @@ children: - /bundled-cli - /choosing-a-setup-path - /github-oauth + - /in-process-runtime - /local-cli - /multi-tenancy - /scaling diff --git a/content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md b/content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md index b2fda09f2a99..30d968fbfcbd 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md +++ b/content/copilot/how-tos/copilot-sdk/setup/multi-tenancy.md @@ -39,7 +39,9 @@ This guide is a sister to [AUTOTITLE](/copilot/how-tos/copilot-sdk/setup/scaling | `baseDirectory` | Isolating `COPILOT_HOME` per runtime instance | Ignored when connecting to an existing runtime. | | `sessionFs` | Routing session filesystem storage off local disk | Pair with per-session filesystem providers. | | `RuntimeConnection.forUri(url)` | Sharing one already-running runtime | Language names vary; see samples below. | -| Per-session `gitHubToken` | Scoping auth to the requesting user | Prefer this over a single shared user token. | +| Per-session GitHub token or provider | Scoping auth to the requesting user | Prefer a rotating provider for short-lived credentials; use a static `gitHubToken` only when rotation is unnecessary. | + +For callback-backed credentials, see [AUTOTITLE](/copilot/how-tos/copilot-sdk/auth/authenticate#rotating-session-scoped-github-tokens). Each session owns its provider registration, so concurrent sessions can use different GitHub hosts and accounts without sharing callback state. ### `mode: "empty"` @@ -299,10 +301,13 @@ Session-level isolation means the runtime keeps user-specific model and state in | Session state | Per session ID under `COPILOT_HOME/session-state/{sessionId}`. | | GitHub identity | Per-session when `gitHubToken` is set on the session. | | Tools | Explicit in `mode: "empty"`; ambient in `mode: "copilot-cli"`. | +| Skills | In `mode: "empty"` no runtime-bundled built-in skills are eligible by default; callers can allow selected built-ins or opt into their own custom skills. Ambient in `mode: "copilot-cli"`. | | Host filesystem | Shared by the runtime process if host tools are available. | `mode: "empty"` is what makes shared runtime patterns viable: no ambient OS tools are exposed unless your application registers or allows them. With `mode: "copilot-cli"`, OS filesystem access is shared through the host process, so do not use that mode for multi-user server mode. +Under `mode: "empty"` the SDK excludes every runtime-bundled built-in skill by default (it sends an empty `includedBuiltinSkills` list on the post-create/post-resume options patch, alongside the empty `installedPlugins` list). Set `includedBuiltinSkills` (or the language-specific casing) to explicitly allow selected built-ins, just as `availableTools` allows selected runtime-bundled tools. A caller can also opt into its **own** custom skills—for example by enabling skills and pointing at its own skill directories—and those remain usable. + Session state is stored under `COPILOT_HOME/session-state/{sessionId}` unless you route it through `sessionFs`. Use unique session IDs that include your own tenant or user boundary, and enforce access control before resuming or deleting sessions. ## Pattern comparison diff --git a/content/copilot/how-tos/copilot-sdk/setup/scaling.md b/content/copilot/how-tos/copilot-sdk/setup/scaling.md index c74fc90b6fb6..10474bdf13e9 100644 --- a/content/copilot/how-tos/copilot-sdk/setup/scaling.md +++ b/content/copilot/how-tos/copilot-sdk/setup/scaling.md @@ -444,7 +444,7 @@ volumes: | **No built-in session locking** | Implement application-level locking for concurrent access | | **No built-in load balancing** | Use external LB or service mesh | | **Session state is file-based** | Requires shared filesystem for multi-server setups | -| **30-minute idle timeout** | Sessions without activity are auto-cleaned by the CLI | +| **No idle timeout by default** | Pass `--session-idle-timeout ` to the CLI server to automatically clean up inactive sessions | | **CLI is single-process** | Scale by adding more CLI server instances, not threads | ## Next steps From bb972a646fa5cbe5f562849b7536e71ea68adb9c Mon Sep 17 00:00:00 2001 From: Jeff Widman Date: Thu, 24 Sep 2026 19:55:11 +0000 Subject: [PATCH 8/8] Clarify internal docs PR destination (#63518) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/instructions/all.instructions.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/instructions/all.instructions.md b/.github/instructions/all.instructions.md index 9651217e785f..dcc43377c460 100644 --- a/.github/instructions/all.instructions.md +++ b/.github/instructions/all.instructions.md @@ -6,6 +6,12 @@ applyTo: "**" This repository powers the GitHub Docs site (docs.github.com). It contains both the Next.js application code (TypeScript) and the documentation content (Markdown). +## Choosing the pull request repository + +- For work by GitHub employees, create pull requests in `github/docs-internal` by default, even if the current clone or `origin` remote points to `github/docs`. Use `github/docs` only when the contribution is intentionally public, such as when collaborating with an external contributor or customer. +- Treat work originating from an internal repository, issue, pull request, or discussion as internal. +- Before pushing a branch or creating a pull request, verify the destination repository explicitly instead of inferring it from the current Git remote. If the intended destination is unclear, ask the user. + ## Creating a pull request When you create a pull request: