diff --git a/content/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise.md b/content/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise.md index 5a10b18e37ed..3be236fa4050 100644 --- a/content/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise.md +++ b/content/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise.md @@ -26,6 +26,8 @@ Streaming audit log data has these benefits: * **Data continuity**. If you pause a stream, it retains a buffer for seven days, so there is no data loss for the first week. If the stream remains paused for more than seven days, it will resume from a point one week prior to the current time. If paused for three weeks or more, the stream won't retain any data and will start anew from the current timestamp.{% endif %} * **Data retention**. Keep your exported audit logs and Git events data as long as you need to. +You can also stream agent session activity from {% data variables.product.prodname_copilot %} to the same destination you use for other enterprise audit events. This is currently in {% data variables.release-phases.public_preview %}. See [AUTOTITLE](/enterprise-cloud@latest/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-agents/monitor-agentic-activity#tracking-agentic-activity-in-your-enterprise-through-the-audit-log) in the {% data variables.product.prodname_ghe_cloud %} documentation. + You can set up{% ifversion pause-audit-log-stream %}, pause,{% endif %} or delete a stream at any time. The stream exports audit and Git events data for all of the organizations in your enterprise, for activity from the time the stream is enabled onwards. All streamed audit logs are sent as compressed JSON files. The filename format is in`YYYY/MM/HH/MM/.json.gz`. @@ -57,6 +59,7 @@ To set up the audit log stream, follow the instructions for your provider: * [Azure Event Hubs](#setting-up-streaming-to-azure-event-hubs) * [Datadog](#setting-up-streaming-to-datadog) * [Google Cloud Storage](#setting-up-streaming-to-google-cloud-storage) +* [Microsoft Purview](#setting-up-streaming-to-microsoft-purview) (Copilot agent session events only) * [Splunk](#setting-up-streaming-to-splunk) {% ifversion ghec %} @@ -265,6 +268,20 @@ To set up streaming to Google Cloud Storage, create a service account in Google 1. To verify that {% data variables.product.prodname_dotcom %} can connect and write to the Google Cloud Storage bucket, click **Check endpoint**. {% data reusables.enterprise.verify-audit-log-streaming-endpoint %} +### Setting up streaming to Microsoft Purview + +{% data reusables.copilot.agent-session-streaming-availability-note %} + +Microsoft Purview only supports streaming {% data variables.product.prodname_copilot_short %} agent session events. For more information on Microsoft Purview, see [Learn about the Microsoft Purview portal](https://learn.microsoft.com/en-us/purview/purview-portal) in the Microsoft documentation. + +To set up streaming to Microsoft Purview, configure streaming in {% data variables.product.github %}, then authorize access through Microsoft Entra. + +1. Configure streaming in {% data variables.product.github %}. See [Enabling audit log streaming of {% data variables.product.prodname_copilot_short %} agent session events](#enabling-audit-log-streaming-of-copilot-agent-session-events) below. +{% data reusables.enterprise.navigate-to-log-streaming-tab %} +1. Select the **Configure stream** dropdown and click **Microsoft Purview**. +1. Click **Authorize with Entra**. +1. When you're redirected to Microsoft Entra, add the {% data variables.product.github %} app and authorize it for your tenant. + ### Setting up streaming to Splunk To stream audit logs to Splunk's HTTP Event Collector (HEC) endpoint, make sure that the endpoint is configured to accept HTTPS connections. See [Set up and use HTTP Event Collector in Splunk Web](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector) in the Splunk documentation. @@ -328,3 +345,20 @@ To restart streaming, click **Resume stream**. 1. Click **Save**. {% endif %} + +{% ifversion ghec %} + +## Enabling audit log streaming of {% data variables.product.prodname_copilot_short %} agent session events + +{% data reusables.copilot.agent-session-streaming-availability-note %} + +{% data reusables.enterprise-accounts.access-enterprise %} +1. At the top of the page, click AI Controls +1. Under "Copilot", select **Enabled everywhere** for "Copilot Usage Records Streaming" +1. Configure a streaming destination. See [Setting up audit log streaming](#setting-up-audit-log-streaming). + +You can also retrieve {% data variables.product.prodname_copilot_short %} usage data through the REST API by selecting **Enabled everywhere** for "Copilot Usage Records API". See [AUTOTITLE](/rest/copilot/copilot-usage-metrics#get-copilot-usage-records-for-an-enterprise). + +For help interpreting the audit log events for agentic activity, see [AUTOTITLE](/copilot/reference/agentic-audit-log-events#streaming-audit-log-events). + +{% endif %} diff --git a/content/copilot/concepts/agents/about-agent-skills.md b/content/copilot/concepts/agents/about-agent-skills.md index 46a1c2ca0d4a..ecf2747d859c 100644 --- a/content/copilot/concepts/agents/about-agent-skills.md +++ b/content/copilot/concepts/agents/about-agent-skills.md @@ -27,8 +27,6 @@ You can also use `gh skill` in {% data variables.product.prodname_cli %} to disc * Project skills, stored in your repository (`.github/skills`, `.claude/skills`, or `.agents/skills`) * Personal skills, stored in your home directory and shared across projects (`~/.copilot/skills` or `~/.agents/skills`) -Support for organization-level and enterprise-level skills is coming soon. - ## Next steps To create or add agent skills, see: diff --git a/content/copilot/concepts/agents/enterprise-management.md b/content/copilot/concepts/agents/enterprise-management.md index 9d4c530bed12..f863018070e0 100644 --- a/content/copilot/concepts/agents/enterprise-management.md +++ b/content/copilot/concepts/agents/enterprise-management.md @@ -44,6 +44,8 @@ An agent session encompasses an entire interaction with {% data variables.copilo Enterprise administrators can use AI Controls to view active and recent agent sessions, track audit log events, and search agentic activity in your enterprise using filters. See [AUTOTITLE](/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-agents/monitor-agentic-activity) and [AUTOTITLE](/copilot/reference/agent-session-filters). +For long-term retention and analysis, you can stream enterprise audit log data to supported destinations. For more information, see [AUTOTITLE](/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise) and [AUTOTITLE](/copilot/reference/agentic-audit-log-events). + For billing information on agent sessions, see [AUTOTITLE](/billing/concepts/product-billing/github-copilot-premium-requests#usage-by-copilot-cloud-agent). ## Third-party agents diff --git a/content/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-agents/monitor-agentic-activity.md b/content/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-agents/monitor-agentic-activity.md index 1f70d8ef74b1..c6a95a99f3e1 100644 --- a/content/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-agents/monitor-agentic-activity.md +++ b/content/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-agents/monitor-agentic-activity.md @@ -19,8 +19,18 @@ category: ## Tracking agentic activity in your enterprise through the audit log +Track agentic activity on {% data variables.product.github %} or through streaming to an external destination. + +### Viewing agentic activity in the audit log on {% data variables.product.github %} + {% data reusables.enterprise-accounts.access-enterprise %} {% data reusables.enterprise-accounts.ai-controls-tab %} -1. To see a list of agentic activity in your enterprise over the last 180 days, at the bottom of the page, click {% octicon "log" aria-hidden="true" aria-label="log" %} **Audit logs**. +1. At the bottom of the page, click {% octicon "log" aria-hidden="true" aria-label="log" %} **Audit logs**. + +### Streaming agentic activity from the audit log + +{% data reusables.copilot.agent-session-streaming-availability-note %} + +To enable streaming for {% data variables.product.prodname_copilot_short %} agent session events and configure a streaming destination from your enterprise audit log settings, see [AUTOTITLE](/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise#enabling-audit-log-streaming-of-copilot-agent-session-events). -For help interpreting the audit log events for agentic activity, see [AUTOTITLE](/copilot/reference/agentic-audit-log-events). +In addition to streaming, you can also retrieve Copilot usage data through the REST API. See [AUTOTITLE](/rest/copilot/copilot-usage-metrics#get-copilot-usage-records-for-an-enterprise). diff --git a/content/copilot/how-tos/copilot-cli/use-copilot-cli/overview.md b/content/copilot/how-tos/copilot-cli/use-copilot-cli/overview.md index 5c330a1b9336..f8ceb71ca138 100644 --- a/content/copilot/how-tos/copilot-cli/use-copilot-cli/overview.md +++ b/content/copilot/how-tos/copilot-cli/use-copilot-cli/overview.md @@ -95,6 +95,20 @@ To add a specific file to your prompt, use `@` followed by the relative path to When you start typing a file path, the matching paths are displayed below the prompt box. Use the arrow keys to select a path and press Tab to complete the path in your prompt. +### Attach images and PDFs + +You can attach images and PDFs to your prompts when using a model that supports image input. + +{% data reusables.copilot.supported-attachment-file-types %} + +{% data reusables.copilot.image-pdf-attachment-handling %} + +You can attach a file in the following ways during an interactive session: + +* Reference the file in your prompt using `@` followed by the path to the file. +* Drag and drop a file into the interactive session. +* Copy an image to your clipboard, then paste it as an attachment. + ### Work with files in a different location To complete a task, {% data variables.product.prodname_copilot_short %} may need to work with files that are outside the current working directory. If a prompt you have entered in an interactive session requires {% data variables.product.prodname_copilot_short %} to modify a file outside the current location, it will ask you to approve access to the file's directory. diff --git a/content/copilot/how-tos/copilot-on-github/chat-with-copilot/chat-in-github.md b/content/copilot/how-tos/copilot-on-github/chat-with-copilot/chat-in-github.md index 47bb3dada0c6..2586826dcb71 100644 --- a/content/copilot/how-tos/copilot-on-github/chat-with-copilot/chat-in-github.md +++ b/content/copilot/how-tos/copilot-on-github/chat-with-copilot/chat-in-github.md @@ -68,9 +68,9 @@ The response to your edited question is displayed in a new subthread. An edit co ### Using images in {% data variables.copilot.copilot_chat_short %} -> [!NOTE] This feature is currently in {% data variables.release-phases.public_preview %} and subject to change. +{% data reusables.copilot.using-images-in-chat %} -You can attach images to your prompts by pasting, dragging, or clicking {% octicon "plus" aria-label="Add attachment" %} in the prompt box and then selecting **{% octicon "file-code" aria-hidden="true" %} Upload from computer**. Select a model that supports images from the model picker. For supported file types and example questions, see [AUTOTITLE](/copilot/how-tos/use-copilot-agents/coding-agent/provide-visual-inputs). +To attach a file, drag and drop it into the prompt box, or click {% octicon "plus" aria-label="Add attachment" %} and select **{% octicon "file-code" aria-hidden="true" %} Upload from computer**. Select a model that supports image input from the model picker. ### Continuing a conversation alongside an agent session diff --git a/content/copilot/reference/agentic-audit-log-events.md b/content/copilot/reference/agentic-audit-log-events.md index b71656d40bca..db15accd4b9b 100644 --- a/content/copilot/reference/agentic-audit-log-events.md +++ b/content/copilot/reference/agentic-audit-log-events.md @@ -10,7 +10,9 @@ category: - Learn about Copilot --- -You can apply the `actor:Copilot` filter to your enterprise audit log to view agentic activity over the last 180 days. The following key fields can help you interpret agentic events: +You can apply the `actor:Copilot` filter to your enterprise audit log to view agentic activity over the last 180 days. + +The following key fields can help you interpret agentic events: | Field | Description | Example value | | --- | --- | --- | @@ -18,3 +20,23 @@ You can apply the `actor:Copilot` filter to your enterprise audit log to view ag | `actor_is_agent` | Indicates whether the actor is an AI agent. This will always be `true` for agentic audit log events. | `true` | | `agent_session_id` | A unique identifier linking to the specific agent session that generated the event. This field only appears when the event is the result of an agent session. | `012345a6-b7c8-9012-de3f-45gh678i9012` | | `user` | The person who initiated the agentic event. | `octocat` | + +## Streaming audit log events + +{% data reusables.copilot.agent-session-streaming-availability-note %} + +The table below shows the fields that are included in each streamed {% data variables.product.prodname_copilot_short %} API usage record. + +Each streamed record is a JSON object with the following properties: + +| Field | Type | Description | +| --- | --- | --- | +| `type` | `string` | The record type (`request` or `response`). | +| `user_id` | `integer` | The ID of the user who made the request. | +| `enterprise_id` | `integer` | The ID of the enterprise. | +| `endpoint` | `string` | The {% data variables.product.prodname_copilot_short %} API endpoint the usage record interacted with. | +| `body` | `string` | The request or response body (JSON-encoded string). | +| `@timestamp` | `integer` | Milliseconds since Unix epoch. | +| `truncated` | `boolean` | `true` when the `body` field has been trimmed to fit within the 1 MB document size limit. Omitted (treated as `false`) when the body is delivered in full. | +| `event_id` | `string` | Unique event identifier for this streamed usage record. | +| `github_request_id` | `string` | {% data variables.product.github %} request identifier associated with the {% data variables.product.prodname_copilot_short %} usage event. | diff --git a/content/issues/planning-and-tracking-with-projects/understanding-fields/about-issue-fields.md b/content/issues/planning-and-tracking-with-projects/understanding-fields/about-issue-fields.md index c8eafe716170..aac2816d059a 100644 --- a/content/issues/planning-and-tracking-with-projects/understanding-fields/about-issue-fields.md +++ b/content/issues/planning-and-tracking-with-projects/understanding-fields/about-issue-fields.md @@ -9,8 +9,6 @@ category: - Manage project items and fields --- -{% data reusables.issues.issue-fields-public-preview-note %} - Issue fields are organization-level fields that provide consistent, typed metadata across all repositories. Unlike project custom fields, issue fields are defined once at the organization level and are available on every issue and in every project across the organization. For more information on creating and managing issue fields, see [AUTOTITLE](/issues/tracking-your-work-with-issues/using-issues/managing-issue-fields-in-your-organization). ## Issue fields in public and internal projects diff --git a/content/issues/tracking-your-work-with-issues/using-issues/adding-and-managing-issue-fields.md b/content/issues/tracking-your-work-with-issues/using-issues/adding-and-managing-issue-fields.md index 6be91e10ffb2..318c414ffafa 100644 --- a/content/issues/tracking-your-work-with-issues/using-issues/adding-and-managing-issue-fields.md +++ b/content/issues/tracking-your-work-with-issues/using-issues/adding-and-managing-issue-fields.md @@ -10,8 +10,6 @@ category: - Create and work with issues --- -{% data reusables.issues.issue-fields-public-preview-note %} - Issue fields appear in the right-hand sidebar of issues, alongside system fields like assignees, labels, and type. You can set values when creating or editing an issue. When you select an issue type while creating an issue, any fields pinned to that type automatically appear in the sidebar. > [!NOTE] diff --git a/content/issues/tracking-your-work-with-issues/using-issues/managing-issue-fields-in-your-organization.md b/content/issues/tracking-your-work-with-issues/using-issues/managing-issue-fields-in-your-organization.md index 4fe806c46743..94c665bfe551 100644 --- a/content/issues/tracking-your-work-with-issues/using-issues/managing-issue-fields-in-your-organization.md +++ b/content/issues/tracking-your-work-with-issues/using-issues/managing-issue-fields-in-your-organization.md @@ -12,8 +12,6 @@ category: - Triage and organize issues --- -{% data reusables.issues.issue-fields-public-preview-note %} - Issue fields let you add structured metadata to issues across your organization. Instead of relying on labels or free-text workarounds, you can create fields like priority, effort, impact, or any custom category your team needs. Fields are defined at the organization level and apply across all repositories in your organization. ## About issue field types diff --git a/data/features/issue-fields.yml b/data/features/issue-fields.yml index e5a59082ca8c..36d22b63598f 100644 --- a/data/features/issue-fields.yml +++ b/data/features/issue-fields.yml @@ -2,3 +2,4 @@ versions: fpt: '*' ghec: '*' + ghes: '>=3.23' diff --git a/data/release-notes/enterprise-server/3-17/17.yml b/data/release-notes/enterprise-server/3-17/17.yml index c9292f5fcae6..d271411d409e 100644 --- a/data/release-notes/enterprise-server/3-17/17.yml +++ b/data/release-notes/enterprise-server/3-17/17.yml @@ -3,8 +3,6 @@ sections: security_fixes: - | **MEDIUM**: An attacker could create issues, issue comments, commit comments, and private vulnerability reports in public repositories they did not have write access to. This was possible by using a user-to-server token against endpoints that validated repository read access but did not validate the required write permission for those operations. GitHub has requested CVE ID [CVE-2026-14340](https://www.cve.org/cverecord?id=CVE-2026-14340) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - - | - **MEDIUM**: An attacker with site administrator privileges could extract arbitrary data from the instance's database, including user password hashes, by exploiting a blind SQL injection vulnerability in the `dependenciesPrefers` argument of the `dependencyGraphManifests` GraphQL field. This vulnerability affected instances with the dependency graph enabled and was reported via the GitHub Bug Bounty program. - | **MEDIUM**: An attacker could gain unintended access to an organization's runner management by directing a user to authorize an OAuth app whose requested manage_runners:org scope was not displayed on the authorization consent screen. GitHub has requested CVE ID [CVE-2026-9106](https://www.cve.org/cverecord?id=CVE-2026-9106) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - | diff --git a/data/release-notes/enterprise-server/3-18/11.yml b/data/release-notes/enterprise-server/3-18/11.yml index 11c1f789a726..5da2869fe098 100644 --- a/data/release-notes/enterprise-server/3-18/11.yml +++ b/data/release-notes/enterprise-server/3-18/11.yml @@ -3,8 +3,6 @@ sections: security_fixes: - | **MEDIUM**: An attacker could create issues, issue comments, commit comments, and private vulnerability reports in public repositories they did not have write access to. This was possible by using a user-to-server token against endpoints that validated repository read access but did not validate the required write permission for those operations. GitHub has requested CVE ID [CVE-2026-14340](https://www.cve.org/cverecord?id=CVE-2026-14340) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - - | - **MEDIUM**: An attacker with site administrator privileges could extract arbitrary data from the instance's database, including user password hashes, by exploiting a blind SQL injection vulnerability in the `dependenciesPrefers` argument of the `dependencyGraphManifests` GraphQL field. This vulnerability affected instances with the dependency graph enabled and was reported via the GitHub Bug Bounty program. - | **MEDIUM**: An attacker could gain unintended access to an organization's runner management by directing a user to authorize an OAuth app whose requested manage_runners:org scope was not displayed on the authorization consent screen. GitHub has requested CVE ID [CVE-2026-9106](https://www.cve.org/cverecord?id=CVE-2026-9106) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - | diff --git a/data/release-notes/enterprise-server/3-19/8.yml b/data/release-notes/enterprise-server/3-19/8.yml index 6a1db32aeb95..6f370d778699 100644 --- a/data/release-notes/enterprise-server/3-19/8.yml +++ b/data/release-notes/enterprise-server/3-19/8.yml @@ -3,8 +3,6 @@ sections: security_fixes: - | **MEDIUM**: An attacker could create issues, issue comments, commit comments, and private vulnerability reports in public repositories they did not have write access to. This was possible by using a user-to-server token against endpoints that validated repository read access but did not validate the required write permission for those operations. GitHub has requested CVE ID [CVE-2026-14340](https://www.cve.org/cverecord?id=CVE-2026-14340) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - - | - **MEDIUM**: An attacker with site administrator privileges could extract arbitrary data from the instance's database, including user password hashes, by exploiting a blind SQL injection vulnerability in the `dependenciesPrefers` argument of the `dependencyGraphManifests` GraphQL field. This vulnerability affected instances with the dependency graph enabled and was reported via the GitHub Bug Bounty program. - | **MEDIUM**: An attacker could gain unintended access to an organization's runner management by directing a user to authorize an OAuth app whose requested manage_runners:org scope was not displayed on the authorization consent screen. GitHub has requested CVE ID [CVE-2026-9106](https://www.cve.org/cverecord?id=CVE-2026-9106) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - | diff --git a/data/release-notes/enterprise-server/3-20/4.yml b/data/release-notes/enterprise-server/3-20/4.yml index ee76bb01623c..0cbe8f02986b 100644 --- a/data/release-notes/enterprise-server/3-20/4.yml +++ b/data/release-notes/enterprise-server/3-20/4.yml @@ -3,8 +3,6 @@ sections: security_fixes: - | **MEDIUM**: An attacker could create issues, issue comments, commit comments, and private vulnerability reports in public repositories they did not have write access to. This was possible by using a user-to-server token against endpoints that validated repository read access but did not validate the required write permission for those operations. GitHub has requested CVE ID [CVE-2026-14340](https://www.cve.org/cverecord?id=CVE-2026-14340) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - - | - **MEDIUM**: An attacker with site administrator privileges could extract arbitrary data from the instance's database, including user password hashes, by exploiting a blind SQL injection vulnerability in the `dependenciesPrefers` argument of the `dependencyGraphManifests` GraphQL field. This vulnerability affected instances with the dependency graph enabled and was reported via the GitHub Bug Bounty program. - | **MEDIUM**: An attacker could gain unintended access to an organization's runner management by directing a user to authorize an OAuth app whose requested manage_runners:org scope was not displayed on the authorization consent screen. GitHub has requested CVE ID [CVE-2026-9106](https://www.cve.org/cverecord?id=CVE-2026-9106) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - | diff --git a/data/release-notes/enterprise-server/3-21/2.yml b/data/release-notes/enterprise-server/3-21/2.yml index cf99d0168fe3..3a5d22a28916 100644 --- a/data/release-notes/enterprise-server/3-21/2.yml +++ b/data/release-notes/enterprise-server/3-21/2.yml @@ -6,8 +6,6 @@ sections: security_fixes: - | **MEDIUM**: An attacker could create issues, issue comments, commit comments, and private vulnerability reports in public repositories they did not have write access to. This was possible by using a user-to-server token against endpoints that validated repository read access but did not validate the required write permission for those operations. GitHub has requested CVE ID [CVE-2026-14340](https://www.cve.org/cverecord?id=CVE-2026-14340) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - - | - **MEDIUM**: An attacker with site administrator privileges could extract arbitrary data from the instance's database, including user password hashes, by exploiting a blind SQL injection vulnerability in the `dependenciesPrefers` argument of the `dependencyGraphManifests` GraphQL field. This vulnerability affected instances with the dependency graph enabled and was reported via the GitHub Bug Bounty program. - | **MEDIUM**: An attacker could gain unintended access to an organization's runner management by directing a user to authorize an OAuth app whose requested manage_runners:org scope was not displayed on the authorization consent screen. GitHub has requested CVE ID [CVE-2026-9106](https://www.cve.org/cverecord?id=CVE-2026-9106) for this vulnerability, which was reported via the [GitHub Bug Bounty](https://bounty.github.com/) program. - | diff --git a/data/reusables/actions/comparing-artifacts-caching.md b/data/reusables/actions/comparing-artifacts-caching.md index f3658f94cb36..29073733b1ca 100644 --- a/data/reusables/actions/comparing-artifacts-caching.md +++ b/data/reusables/actions/comparing-artifacts-caching.md @@ -2,5 +2,5 @@ Artifacts and caching are similar because they provide the ability to store files on {% data variables.product.prodname_dotcom %}, but each feature offers different use cases and cannot be used interchangeably. -* Use caching when you want to reuse files that don't change often between jobs or workflow runs, such as build dependencies from a package management system. -* Use artifacts when you want to save files produced by a job to view after a workflow run has ended, such as built binaries or build logs. +* Use caching when you want to reuse files that don't change often between workflow runs, such as dependencies downloaded by a package management system, intermediate build outputs, or other files that are expensive to regenerate. Caching these files can speed up your workflow runs, though a job should always be able to re-download or regenerate these files if a cache isn't available. +* Use artifacts when you want to save files produced by a job to use or view after a workflow run has ended, such as built binaries or build logs, or when you want to pass files between jobs in a workflow. diff --git a/data/reusables/copilot/agent-session-streaming-availability-note.md b/data/reusables/copilot/agent-session-streaming-availability-note.md new file mode 100644 index 000000000000..f0bf17b39252 --- /dev/null +++ b/data/reusables/copilot/agent-session-streaming-availability-note.md @@ -0,0 +1 @@ +>[!NOTE] This feature is in {% data variables.release-phases.public_preview %} and is available for enterprises that use {% data variables.product.prodname_emus %} and for enterprises that use {% data variables.product.prodname_ghe_cloud %} with data residency. \ No newline at end of file diff --git a/data/reusables/copilot/image-pdf-attachment-handling.md b/data/reusables/copilot/image-pdf-attachment-handling.md new file mode 100644 index 000000000000..f358b80122d9 --- /dev/null +++ b/data/reusables/copilot/image-pdf-attachment-handling.md @@ -0,0 +1 @@ +Image and PDF attachments are available on all {% data variables.product.prodname_copilot_short %} plans and are enabled by default, with no policy required to turn the feature on or off. diff --git a/data/reusables/copilot/image-questions-and-file-types.md b/data/reusables/copilot/image-questions-and-file-types.md index 00d094d6948a..cbe9bea44a43 100644 --- a/data/reusables/copilot/image-questions-and-file-types.md +++ b/data/reusables/copilot/image-questions-and-file-types.md @@ -2,6 +2,3 @@ * A mockup of the user interface for an application and ask {% data variables.product.prodname_copilot_short %} to generate the code. * A flowchart and ask {% data variables.product.prodname_copilot_short %} to describe the processes shown in the image. * A screenshot of a web page and ask {% data variables.product.prodname_copilot_short %} to generate HTML for a similar page. - -> [!NOTE] -> The following types of image file are supported: JPEG (`.jpg`, `.jpeg`), PNG (`.png`), GIF (`.gif`), or WEBP (`.webp`). diff --git a/data/reusables/copilot/supported-attachment-file-types.md b/data/reusables/copilot/supported-attachment-file-types.md new file mode 100644 index 000000000000..09a179cc3e94 --- /dev/null +++ b/data/reusables/copilot/supported-attachment-file-types.md @@ -0,0 +1,9 @@ +{% data variables.product.prodname_copilot_short %} supports the following file types: + +* JPEG (`.jpg`, `.jpeg`) +* PNG (`.png`) +* GIF (`.gif`) +* WEBP (`.webp`) +* PDF (`.pdf`) +* HEIC (`.heic`) +* HEIF (`.heif`) diff --git a/data/reusables/copilot/using-images-in-chat.md b/data/reusables/copilot/using-images-in-chat.md index 8c5f73111984..faee89a50e52 100644 --- a/data/reusables/copilot/using-images-in-chat.md +++ b/data/reusables/copilot/using-images-in-chat.md @@ -1,6 +1,9 @@ -> [!NOTE] -> * {% data reusables.copilot.editor-preview-settings %} +You can attach images and PDFs to your prompts when using a model that supports image input. -You can attach images to your chat prompts and then ask {% data variables.product.prodname_copilot_short %} about the images. For example, you can attach: +{% data reusables.copilot.supported-attachment-file-types %} + +For example, you can attach: {% data reusables.copilot.image-questions-and-file-types %} + +{% data reusables.copilot.image-pdf-attachment-handling %} diff --git a/data/reusables/issues/issue-fields-public-preview-note.md b/data/reusables/issues/issue-fields-public-preview-note.md deleted file mode 100644 index d4e35550e44b..000000000000 --- a/data/reusables/issues/issue-fields-public-preview-note.md +++ /dev/null @@ -1,2 +0,0 @@ -> [!NOTE] -> Issue fields are currently in {% data variables.release-phases.public_preview %} and subject to change. To share feedback, see the [community discussion](https://github.com/orgs/community/discussions/189141). diff --git a/data/tables/copilot/model-supported-clients.yml b/data/tables/copilot/model-supported-clients.yml index e33839fa169d..a8755d060b9e 100644 --- a/data/tables/copilot/model-supported-clients.yml +++ b/data/tables/copilot/model-supported-clients.yml @@ -100,9 +100,9 @@ cli: true vscode: true vs: true - eclipse: false - xcode: false - jetbrains: false + eclipse: true + xcode: true + jetbrains: true - name: Gemini 2.5 Pro dotcom: false diff --git a/src/fixtures/tests/playwright-rendering.spec.ts b/src/fixtures/tests/playwright-rendering.spec.ts index c9dc604eacc0..8041a1c6165a 100644 --- a/src/fixtures/tests/playwright-rendering.spec.ts +++ b/src/fixtures/tests/playwright-rendering.spec.ts @@ -1534,3 +1534,38 @@ test.describe('Non-child page resolution', () => { // The detailed sidebar filtering is tested by the survey test which verifies no duplicate entries }) }) + +test.describe('copy as markdown button', () => { + // The article-body fetch backing this button is served for this fixture page + // (see src/fixtures/tests/api-article-body.ts), so the copy path succeeds. + const articlePath = '/en/get-started/start-your-journey/api-article-body-test-page' + + test('swaps the copy icon for a checkmark after a successful copy', async ({ page, context }) => { + // The click handler writes the article markdown to the clipboard. + await context.grantPermissions(['clipboard-read', 'clipboard-write']) + + await page.goto(articlePath) + await turnOffExperimentsInPage(page) + + const copyButton = page.getByRole('button', { name: 'Copy as Markdown' }) + await expect(copyButton).toBeVisible() + + // Before clicking, the leading icon is the copy icon, not the checkmark. + await expect(copyButton.locator('.octicon-copy')).toBeVisible() + await expect(copyButton.locator('.octicon-check')).toHaveCount(0) + + await copyButton.click() + + // After a successful copy, the icon swaps to a checkmark... + await expect(copyButton.locator('.octicon-check')).toBeVisible() + await expect(copyButton.locator('.octicon-copy')).toHaveCount(0) + + // ...and the article markdown lands on the clipboard. + const clipboardText = await page.evaluate(() => navigator.clipboard.readText()) + expect(clipboardText).toContain('About GitHub') + + // The checkmark is temporary and reverts to the copy icon (2s timeout). + await expect(copyButton.locator('.octicon-copy')).toBeVisible({ timeout: 5000 }) + await expect(copyButton.locator('.octicon-check')).toHaveCount(0) + }) +}) diff --git a/src/frame/components/article/ViewMarkdownButton.tsx b/src/frame/components/article/ViewMarkdownButton.tsx index 63701f327a03..f42f25bf13f1 100644 --- a/src/frame/components/article/ViewMarkdownButton.tsx +++ b/src/frame/components/article/ViewMarkdownButton.tsx @@ -1,5 +1,6 @@ -import { useCallback } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import { + CheckIcon, CopyIcon, CopilotIcon, FileIcon, @@ -22,6 +23,15 @@ interface CopyMarkdownMenuProps { export const CopyMarkdownMenu = ({ currentPath }: CopyMarkdownMenuProps) => { const { t } = useTranslation('pages') + const [copied, setCopied] = useState(false) + const timeoutRef = useRef | null>(null) + + useEffect(() => { + return () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current) + } + }, []) + const encodedPath = encodeURIComponent(currentPath).replace(/%2F/g, '/').replace(/%40/g, '@') const markdownUrl = `/api/article/body?pathname=${encodedPath}` @@ -64,6 +74,9 @@ export const CopyMarkdownMenu = ({ currentPath }: CopyMarkdownMenuProps) => { const text = await res.text() await navigator.clipboard.writeText(text) announce(t('copied')) + setCopied(true) + if (timeoutRef.current) clearTimeout(timeoutRef.current) + timeoutRef.current = setTimeout(() => setCopied(false), 2000) } catch { // Fallback: open in new tab if fetch or clipboard fails window.open(markdownUrl, '_blank') @@ -81,7 +94,11 @@ export const CopyMarkdownMenu = ({ currentPath }: CopyMarkdownMenuProps) => { )} onClick={handleCopyClick} > -