Commit Graph

99 Commits

Author SHA1 Message Date
dileepyavan 7422e06ada [main] Cherry-pick MSRC fixes (#320659)
* OTel visibility in Copilot Chat UI (#47)

* [msrc/1.123] 114763

* Add maxAttributeSizeChars configuration to OpenTelemetry settings

---------

Co-authored-by: Zhichao Li <zhichli@microsoft.com>
(cherry picked from commit 042dc59dbb51f58ef03a6909d5dfb0292a6b2576)
(cherry picked from commit be6ab8b589)

* Prompt before connecting to non-loopback remote host:port authorities (#46)

A direct `<host>:<port>` remote authority (no resolver `+` prefix) bypasses
resolver extensions and connects straight to the given server. Since this form
can originate from untrusted sources (e.g. the `remoteAuthority` of a
`.code-workspace` file), a crafted workspace could silently point the window's
extension host backend at an attacker-controlled server.

Centralize a confirmation prompt at the connection point in the renderer:
when resolving a direct authority whose host is not loopback (localhost,
127.0.0.1, ::1), ask the user to confirm before connecting and abort if
declined. Add `isLoopbackHost` helper and tests.

(cherry picked from commit 9505d0fca49eadb707c450d18dcb41a46b720a9e)
(cherry picked from commit 9673132502)

* GitHub - improve host parsing (#48)

(cherry picked from commit 4b6e2467dbd828018d602f73cc25d1b11f699d2c)
(cherry picked from commit 9fea92e141)

* path traversal fix (#50)

* fix path traversal

* fix compilation

(cherry picked from commit 9b31ff896671125cbfc65f33731c4a99660d6201)
(cherry picked from commit a703741497)

* Path - improve isEqualOrParent calculation (#49)

(cherry picked from commit 0f1ba1ea103757f3023cc1f9c3eb7327c3ec4b02)
(cherry picked from commit 5927baa7af)

---------

Co-authored-by: Zhichao Li <Li.Zhichao@microsoft.com>
Co-authored-by: Zhichao Li <zhichli@microsoft.com>
Co-authored-by: Alexandru Dima <alexdima@microsoft.com>
Co-authored-by: Ladislau Szomoru <lszomoru@microsoft.com>
Co-authored-by: Sandeep Somavarapu <sasomava@microsoft.com>
2026-06-09 14:26:48 -07:00
Federico Brancasi 97ec683c46 Merge branch 'main' into fb/copilot-image-dimensions 2026-05-28 14:57:10 +02:00
Zhichao Li a82d87c5e3 feat(otel): add github.copilot.* attribute constants and hash helper 2026-05-22 11:07:52 -07:00
Federico Brancasi e88145350c Address image dimension telemetry review feedback 2026-05-22 16:11:58 +02:00
Martin Aeschlimann 904c914799 copilot: updateSources (#315005)
* copilot: updateSources

* update
2026-05-07 18:13:04 +02:00
Paul b712765852 Add support for usage-based billing (#312892) 2026-04-28 02:37:05 +00:00
Peng Lyu 6b7525fd34 re #311393. introduce chat info part api (#311772)
* Add ChatResponseInfoPart proposed API and stream.info()

Add a new 'info' chat content kind that mirrors the existing 'warning'
path and renders via ChatErrorContentPart with ChatErrorLevel.Info, which
already has blue notification styling (.chat-info-codicon). Expose this
via a new ChatResponseInfoPart proposed API and stream.info() method.

Cherry-picked from 87ce530566 (src/vs and src/vscode-dts parts only).

* Disable github.copilot.chat.cli.remote.enabled in agents window

The /remote slash command targets the CLI chat in the main workbench.
Explicitly keep it disabled in the agents sessions app via the session
configurationDefaultsOverrides.

* Adopt types in copilot ext
2026-04-21 23:22:57 +00:00
Matt Bierner 110f6f9559 Fix some basic eslint errors in copilot
Starts working through some basic repo wide eslint rules for the copilot extension. Stuff like missing semicolons and missing readonly modifiers for disposables
2026-04-20 11:48:22 -07:00
Anthony Kim 23e042ff73 Fix Copilot CLI terminal profile launch for non-default shells (#310006)
* Fix Copilot CLI terminal profile launch for non-default shells (fish, Git Bash, custom profiles, etc)

* retrun parentehsis

* better follow terminLEnvironment

* Make sure to cover windows for powershell well

* addres feedback on fish

* clean up non null asesrtion

* add support for windows

* use git bash converter from terminal suggest code

* comment should be less verbose

* better qaulity comments
2026-04-15 18:11:59 +00:00
Paul 6afe18b48d Clean up perf API (#308354)
* wip

* chat ext

* PR
2026-04-08 22:51:48 -07:00
Paul 5bcd0f958f Add chat perf markers (#4673)
* Revert "Revert "Add chat perf markers (#4456)" (#4508)"

This reverts commit c8c2d68a11.

* update

* clean

* PR

* update

* Clean

* use sessions

* fix

* update

* PR

* Update src/util/common/test/performance.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/extension/intents/node/toolCallingLoop.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* PR

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-26 23:23:19 +00:00
Don Jayamanne 91cec44cae Copilot CLI - enhance chat request handling with mode instructions (#4603)
* Copilot CLI - enhance chat request handling with mode instructions

* Skip to verify tests pass

* Address review comments

* Updates

* Updates

* Updates

* Updates

* Updates to package.json

* Updates

* Updates

* Fixes
2026-03-24 08:08:06 +00:00
Connor Peet 7e7c1a6cc7 tools: add binary file support with hexdump display (#4331)
* tools: add binary file support with hexdump display

Adds support for reading and displaying binary files in the read file tool
with a hexdump-formatted view. This enables better handling of binary content
in the IDE context without attempting to interpret them as text.

- Adds hexdump utility to format binary data in a readable hex/ASCII view
- Extends readFileTool to detect binary files and provide formatted output
- Adds binaryFileHexdump prompt component for displaying binary content
- Integrates binary file variable support in file variable display
- Updates test fixtures with binary file handling scenarios

Fixes https://github.com/microsoft/vscode/issues/284178
Fixes https://github.com/microsoft/vscode/issues/299973

(Commit message generated by Copilot)

* pr comments

* baseline update

* baseline update
2026-03-10 21:49:13 +00:00
Daniel Rosenwasser b6aa5a1828 Make development more-friendly for TypeScript 6/7 (#4272)
* Update devcontainer.

* Switch module settings, turn on `noEmit`, and drop explicit `lib`.

* module->namespace

* Switch troublesome packages to use `import = require()` syntax.

* Remove unnecessary declaration file.

* Drop DOM declarations.

* Fix up errors from more restrictive signature of `vscode.l10n.t`.

* Fix chat-lib script - we no longer have that stray file.

* Update dependencies.
2026-03-09 16:28:43 +00:00
Tyler James Leonhardt a47354e6f8 Adopt built-in model picker to fix context window number (#4009)
Fixes https://github.com/microsoft/vscode/issues/297142
2026-02-25 22:44:31 +00:00
Ulugbek Abdullaev c49f41b98c error utils: nicer dx (#3943) 2026-02-23 23:00:20 +00:00
Alex Ross 45bbb4f4da The reckoning: Update all the vscode.proposed.*.d.ts files (#3895)
* The reckoning: Update all the vscode.proposed.*.d.ts files
and run the update on post install

* Improve proposed update and check
- Pin it to a commit
- Require that update be run manually, not as post install
- Add PR check

---------

Co-authored-by: João Moreno <joaomoreno@users.noreply.github.com>
2026-02-20 14:06:58 +00:00
Ulugbek Abdullaev cd55e7e19f nes: recent files: more strategies to include recent files (#3753)
* nes: tests: fix trailing whitespace sensitivity

* nes: xtab: split promptCrafting.ts up

* nes: recent files: split up into functions

* nes: recent files: more strategies to include recent files

* fix: transform older focal ranges through edit chain in historyEntriesToCodeSnippet

Older history entries' focal ranges (from getNewRanges()) pointed into
stale document states, not the most recent content. Now each older
edit entry's ranges are projected forward through subsequent edits
using StringEdit.applyToOffsetRange(). VisibleRanges entries no longer
contribute focal ranges since their offsets cannot be reliably
transformed.

* add validator
2026-02-15 23:16:50 +00:00
Ulugbek Abdullaev b86d986cbd util: result: extend functionality with some common utils (#3750) 2026-02-14 23:37:51 +00:00
Rob Lourens a4ffdcf03b Sync chatParticipantPrivate.d.ts with vscode (#3734)
* Sync chatParticipantPrivate.d.ts

* Sync ChatRequestEditorData with vscode
2026-02-13 21:07:31 +00:00
Alex Ross fc6fb25988 Better install of GHPR from PR card (#3518)
* Better install of GHPR from PR card
Fixes microsoft/vscode#290997

* Fix tests
2026-02-13 14:24:30 +00:00
Josh Spicer 79a0db8a49 Revert "chatSessions growth agent (#3633)" (#3663)
This reverts commit b1197ec596.
2026-02-11 18:20:22 +00:00
Ulugbek Abdullaev 46c155182e nes: add xtab tests (#3657)
* nes: xtab: extract methods into functions

* nes: xtab: add tests

* nes: add xtab tests

* fix after rebase
2026-02-11 09:54:14 +00:00
Josh Spicer b1197ec596 chatSessions growth agent (#3633)
* [POC] Growth chat sessions with NeedsInput status indicator

Proof of concept for https://github.com/microsoft/vscode/issues/292430

This demonstrates using the agent sessions sidebar to drive Copilot
awareness for anonymous/free-tier users by showing a session with
"Input Needed" status that displays "GitHub Copilot is now enabled.
Try for free?" in the sidebar.

**GrowthChatSessionItemProvider** — Returns a single session item with
`status: NeedsInput` so the sidebar immediately shows the "Input Needed"
badge and description text without the user needing to click first.

**GrowthChatSessionContentProvider** — When the user opens the session:
1. Only serves content for the known `growth-tip` session ID. Untitled
   sessions (created when navigating away) get empty history, preventing
   a bug where users were trapped in a loop of re-created sessions.
2. Uses `activeResponseCallback` to stream the response (markdown +
   confirmation part) rather than static history. The callback keeps
   the response alive by awaiting token cancellation, which is critical
   to avoid a race condition where `$handleProgressComplete` deletes
   queued progress chunks before the main thread initializes the session.
3. Schedules a delayed `refresh()` so the sidebar re-queries items and
   `handleSessionModelOverrides` can detect the NeedsInput model state.

**GrowthChatSessionParticipant** — Simplified to a basic request handler.

Requires exposing `NeedsInput = 3` in the extension API:
- `vscode.proposed.chatSessionsProvider.d.ts` — Add NeedsInput to enum
- `extHostTypes.ts` — Add NeedsInput = 3 to ChatSessionStatus
- `extHostChatSessions.ts` — Add case 3 to convertChatSessionStatus

- **Can't exit growth session**: Content provider was serving growth
  content for ALL URIs with the copilot-growth scheme, including
  untitled sessions created on navigation. Fixed by checking session ID.
- **NeedsInput never triggers with static history**: Confirmations in
  history don't set NeedsInput because the response is already complete.
  Fixed by using activeResponseCallback to keep the response active.
- **activeResponseCallback race condition**: Callback completing before
  main thread initialization causes $handleProgressComplete to delete
  queued chunks. Fixed by keeping the callback alive until cancellation.

- Remove debug logging ([GrowthItemProvider], [GrowthContentProvider])
- Activation blockers temporarily commented out in extension.ts
- Cloud agent registration temporarily disabled
- No gating on user state (anonymous, free tier, signed-in, etc.)
- Hardcoded message content needs localization
- No telemetry or analytics
- No dismiss/archive mechanism for the growth session

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Mark copilot-growth session as isReadOnly instead of canDelegate (adopt microsoft/vscode#8e9ec4c5f59)

* Clear growth session attention badge on open and remove placeholder boilerplate

  - Track seen state in GrowthChatSessionItemProvider; mark session as
    seen when content provider is opened so NeedsInput badge clears
    without requiring a confirmation click
  - Remove confirmation hack, never-resolving promise, and delayed
    refresh from content provider; return a request/response history
    with a Copilot overview instead
  - Add random tip pool to participant request handler
  - Remove debug sendMessage command
  - Register agent for isReadOnly contributions so request routing works

* hacks to not clear eager calls to provideChatSessionContent()

* tidy

* off by default

* update config file

* simplify

* config

* remove merge accident

* codereview

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 04:18:18 +00:00
Rob Lourens 8c26b39f97 Support rendering subagent details from claude code (#3554)
* Support rendering subagent details from claude code

* fix build
2026-02-07 22:49:28 +00:00
Justin Chen 8e0020e26e use hook progress in chat (#3511)
* use hook progress in chat

* update for subagent

* modify api shape

* use unkown for api instead

* no more continue in api
2026-02-07 01:17:13 +00:00
Ulugbek Abdullaev a6d5099b15 nes/completionsFetchService: reuse util code (#3536)
* nes/completionsFetchService: reuse util code

* Update src/util/common/test/common/asyncIterableUtils.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-06 21:57:59 +00:00
Ulugbek Abdullaev eabee66fbf completionsFetchService: more cancellation checks and fix behavior gap against SSEProcessor (#3494)
* utils: implement AsyncIterUtils#map/filter/etc.

* fix streamToLines

* completions checks for cancellations similarly to SSEProcessor

* fix: add cancellation checks and finishedCb call to convertStreamToApiChoices

Align convertStreamToApiChoices (used by fetchAndStreamCompletions2)
with SSEProcessor (used by fetchAndStreamCompletions):

- Pass cancellation token and check it after awaiting each chunk,
  after finishedCb, and after yielding each choice
- Add finally block to destroy the network stream on completion/cancel
- Call finishedCb with finished=true for unfinished completions at
  stream end (matches SSEProcessor.finishSolutions behavior)

* fix: prevent double-yield in convertStreamToApiChoices

Add a yielded flag per completion, matching SSEProcessor's
solution.yielded guard. Without this, StreamedCompletionSplitter
could yield a trimmed first segment on a newline, then yield the
full untrimmed text again when finish_reason arrives — resulting
in a spurious ghost text suggestion cached at the wrong location.

Also ensure finish_reason explicitly overrides solutionDecision
to yieldSolution=true, continueStreaming=false, matching
SSEProcessor's semantics.
2026-02-05 23:32:19 +00:00
Don Jayamanne 72098df594 Disable the repo dropdown as soon as we handle new sessions (#3470)
* Disable the repo dropdown as soon as we handle new sessions

* Update src/extension/chatSessions/vscode-node/test/copilotCLIChatSessionParticipant.spec.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-05 05:16:42 +00:00
Copilot 5505824ef2 Filter Claude Agent plan files from edit tracking (#3343)
* Initial plan

* Filter out Claude plan files from edit tracking

- Modified `_onWillEditTool` to filter out plan files before tracking edits
- Plan files (in ~/.claude/plans/) are now excluded from the "files changed" UI
- Added unit tests to verify plan file filtering logic works correctly
- Regular files and files in other .claude subdirectories are still tracked properly

Co-authored-by: TylerLeonhardt <2644648+TylerLeonhardt@users.noreply.github.com>

* Improve plan file filtering with proper path comparison

- Use `isEqualOrParent` instead of string prefix comparison for robust path checking
- Prevents false positives like filtering `.claude/plans-backup/` files
- Added test case to verify files with similar prefix are not filtered
- All 9 tests pass

Co-authored-by: TylerLeonhardt <2644648+TylerLeonhardt@users.noreply.github.com>

* Refactor: Move plan file filtering to ExternalEditTracker

- Added constructor parameter `ignoreDirectories` to ExternalEditTracker
- Filtering logic now lives in trackEdit() method for better testability
- Updated claudeCodeAgent to pass plan directory when creating tracker
- Created comprehensive unit tests for ExternalEditTracker class (7 tests)
- Removed old planFileFiltering.spec.ts as logic moved to tracker
- All tests pass (7 new + 9 existing = 16 total)

Co-authored-by: TylerLeonhardt <2644648+TylerLeonhardt@users.noreply.github.com>

* Fix formatting: Remove extra blank lines in constructor

Co-authored-by: TylerLeonhardt <2644648+TylerLeonhardt@users.noreply.github.com>

* fix tests

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: TylerLeonhardt <2644648+TylerLeonhardt@users.noreply.github.com>
Co-authored-by: Tyler Leonhardt <tyleonha@microsoft.com>
2026-02-03 00:20:32 +00:00
Logan Ramos 17ae8ceee4 Consume new API (#3322)
* Consume new API

* Update snapshot

* Update api version
2026-02-02 17:54:30 +00:00
Don Jayamanne 60b0d9ca1a Update sources to include date.ts (#3359) 2026-02-02 08:27:31 +00:00
Ulugbek Abdullaev b09aedac0d chore: copy latest vscode sources (#3318)
* copy vscode sources

* make adoption of new vscode sources

* Updates

---------

Co-authored-by: Don Jayamanne <don.jayamanne@outlook.com>
2026-02-02 06:25:59 +00:00
Ulugbek Abdullaev 7a1b252bc9 adopt changes from core to ensure disjoint edits (#3281)
should fix https://github.com/microsoft/vscode/issues/291596
2026-01-29 18:37:47 +00:00
Ulugbek Abdullaev af7f4018f7 nes: initial support for patch-based format v01 (#3280)
* nes: initial support for patch-based format v01

* fix test
2026-01-29 18:36:17 +00:00
Karthik Nadig 86e5f95490 Add question functionality and related types for chat interactions (#3157)
* Add question carousel functionality and related types for chat interactions

* feat: enhance logging for question carousel processing and answer conversion

* feat: enhance answer processing in AskQuestionsTool to support freeform text input

* cleanup: remove unused AskQuestionResult type from IQuestionAnswer

* clenaup: restore package.json

* feat: enhance AskQuestionsTool to handle no stream scenario and improve carousel answer conversion
2026-01-26 19:23:30 +00:00
Ulugbek Abdullaev 311d7fab8b update to latest vscode sources (#3118) 2026-01-26 09:52:58 +00:00
Ulugbek Abdullaev 0ae760bbed logService: feat: migrate ITracer to ILogger interface (#3127)
* logService: feat: migrate ITracer to ILogger interface

Replace deprecated ITracer interface with ILogger across inline edits
and xtab providers. Add LogTarget.fromCallback() and withExtraTarget()
to ILogger for callback-based logging support previously provided by
ITracer's sub() method.

* tracing: migrate off of ITracer in favor of ILogService

* Update src/extension/xtab/node/xtabProvider.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* address copilot review

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-26 09:52:49 +00:00
Don Jayamanne b93aa72c1e Improved MCP tool call rendering for background agents (#3047)
* Improved MCP tool call rendering for background agents

* Temporary solution until API is stable

* Update src/extension/agents/copilotcli/common/copilotCLITools.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fixes

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-22 23:21:26 +00:00
Don Jayamanne e9719c4240 Retrieve list of MCP servers from VS Code API (#2966)
* Retrieve list of MCP servers from VS Code API

* Update src/extension/agents/copilotcli/node/mcpHandler.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* resolve comments

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-22 09:53:35 +00:00
Paul afffd434ef update per discussion (#3039) 2026-01-21 22:53:12 +00:00
Connor Peet 2b4e4592d6 tools: support delete file operations in apply_patch tool (#3023)
Adds support for file deletion in the apply_patch tool by introducing
new VS Code API types for workspace-level file edits. The apply_patch
tool now properly reports deleted files through the new workspaceEdit()
response stream method.

- Introduces ChatWorkspaceFileEdit interface to represent file-level
  operations (create, delete, rename) with optional oldResource and
  newResource properties
- Adds ChatResponseWorkspaceEditPart class for workspace edits containing
  file-level operations
- Updates ExtendedChatResponsePart type to include the new workspace edit
  part type
- Adds workspaceEdit() method to ChatResponseStream for reporting
  file-level edits
- Modifies applyPatchTool to track deleted files in a separate set and
  report them through the new workspaceEdit() method
- Removes subagentInvocationId from ChatToolInvocationData base interface
  and moves it to optional streamData parameter in beginToolInvocation()
- Changes chatStreamToolCallId from readonly to mutable in
  LanguageModelToolInvocationOptions to allow modifications

Fixes https://github.com/microsoft/vscode/issues/275705

(Commit message generated by Copilot)
2026-01-21 00:49:18 +00:00
Ulugbek Abdullaev 8dd3be96d7 logService: feat: allow creating sub-loggers (#2879)
* logService: feat: allow creating sub-loggers

* fix var name inconsistency

* address comments
2026-01-16 11:47:28 +00:00
Paul 6183985f6d Adopt latest provider pattern for org/enterprise custom agents (#2737)
* PR

* activation

* fix test

* wip

* update

* tests

* Update src/platform/github/common/githubService.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/extension/agents/vscode-node/organizationInstructionsProvider.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/platform/github/common/octoKitServiceImpl.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* update

* update setting name

* wip

* fix

* use enum

* PR

* nit

* add polling

* tests

* cleanup

* use helper

* remove instructions

* clean

* use custom source

* update

* update

* test updates

* fix tests

* update types

* PR

* use proposed API

* Update src/platform/customInstructions/common/customInstructionsService.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix tests

* update for skills

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-16 02:46:47 +00:00
Logan Ramos 78046bd098 Handle partial tool streaming (#2165)
* Start work on handling tool calls as they stream in

* Explore partial tool streaming

* consume new proposal

* Match main PR

* Better partial json handling

* Plumb through tool call id to invoke

* Hack internal ids to be the stream id

* Add suppot for a few more stream handlers

* Accumulate args

* Show lines instead of characters

* Fix tests

* Leave debug string commented

* Feedback
2026-01-14 18:27:52 +00:00
Tyler James Leonhardt fcacdfefc0 Fix localize calls in errorMessage helpers (#2554)
* Fix localize calls in errorMessage helpers

ref https://github.com/microsoft/vscode/issues/282674

* localize missing message
2025-12-12 04:06:05 +00:00
Alexandru Dima 9b6925edd5 Log an error and prompt when debugging for expired configs (#2477)
* 💄

* Log an error and prompt when debugging to attest custom team defaults
2025-12-08 11:10:32 +00:00
Matt Bierner 3c8134184b Enable no-unexternalized-strings in repo (#2448)
Enables the same `no-unexternalized-strings` with have in `vscode` in this repo. This make sure we have a more consistent style across repos and when generating edits
2025-12-05 18:45:12 +00:00
Kyle Cutler 82d607be00 Make capabilities checks synchronous (#2340)
* Make capabilities checks synchronous

* Add sync hash implementation

* warn insecure
2025-12-03 18:25:43 +00:00
Ulugbek Abdullaev 6843bcd5ef tracer: fix stringifying arrays (#2353)
issue: The Array.isArray(value) check at line 113 will never be reached because arrays are also objects in JavaScript. The earlier check at line 105 (typeof value === 'object') will catch arrays first and pass them to stringifyObj(), making the array-specific handling code unreachable.
2025-12-03 13:43:43 +00:00