anyray-connect 0.11.41 → 0.11.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +127 -51
  2. package/dist/assets/vscodeExtensionAsset.js +12 -0
  3. package/dist/assets/vscodeExtensionAsset.js.map +1 -0
  4. package/dist/cli.js +428 -268
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/acpAgent.js +114 -0
  7. package/dist/commands/acpAgent.js.map +1 -0
  8. package/dist/commands/desktop.js +298 -100
  9. package/dist/commands/desktop.js.map +1 -1
  10. package/dist/commands/desktopHelper.js +340 -0
  11. package/dist/commands/desktopHelper.js.map +1 -0
  12. package/dist/commands/doctor.js +149 -15
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/managed.js +27 -39
  15. package/dist/commands/managed.js.map +1 -1
  16. package/dist/commands/mcpServer.js +1 -101
  17. package/dist/commands/mcpServer.js.map +1 -1
  18. package/dist/commands/printKey.js +27 -11
  19. package/dist/commands/printKey.js.map +1 -1
  20. package/dist/commands/retrieval.js +145 -0
  21. package/dist/commands/retrieval.js.map +1 -0
  22. package/dist/target.js +13 -1
  23. package/dist/target.js.map +1 -1
  24. package/dist/tools/acpAgents.js +161 -0
  25. package/dist/tools/acpAgents.js.map +1 -0
  26. package/dist/tools/claudeCode.js +27 -6
  27. package/dist/tools/claudeCode.js.map +1 -1
  28. package/dist/tools/claudeCodeEnv.js +5 -4
  29. package/dist/tools/claudeCodeEnv.js.map +1 -1
  30. package/dist/tools/claudeDesktop.js +378 -0
  31. package/dist/tools/claudeDesktop.js.map +1 -0
  32. package/dist/tools/claudeDesktopNative.js +793 -0
  33. package/dist/tools/claudeDesktopNative.js.map +1 -0
  34. package/dist/tools/claudeDesktopWindows.js +1296 -0
  35. package/dist/tools/claudeDesktopWindows.js.map +1 -0
  36. package/dist/tools/codex.js +47 -9
  37. package/dist/tools/codex.js.map +1 -1
  38. package/dist/tools/copilotChat.js +536 -366
  39. package/dist/tools/copilotChat.js.map +1 -1
  40. package/dist/tools/cursor.js +452 -120
  41. package/dist/tools/cursor.js.map +1 -1
  42. package/dist/tools/devinDesktop.js +315 -0
  43. package/dist/tools/devinDesktop.js.map +1 -0
  44. package/dist/tools/index.js +4 -2
  45. package/dist/tools/index.js.map +1 -1
  46. package/dist/tools/jetbrains.js +230 -0
  47. package/dist/tools/jetbrains.js.map +1 -0
  48. package/dist/tools/jetbrainsCapability.js +460 -0
  49. package/dist/tools/jetbrainsCapability.js.map +1 -0
  50. package/dist/tools/manual.js +5 -101
  51. package/dist/tools/manual.js.map +1 -1
  52. package/dist/tools/opencode.js +116 -36
  53. package/dist/tools/opencode.js.map +1 -1
  54. package/dist/tools/shellEnv.js +114 -6
  55. package/dist/tools/shellEnv.js.map +1 -1
  56. package/dist/types.js +3 -3
  57. package/dist/types.js.map +1 -1
  58. package/dist/util/atomicFile.js +48 -0
  59. package/dist/util/atomicFile.js.map +1 -0
  60. package/dist/util/devRefresh.js +50 -17
  61. package/dist/util/devRefresh.js.map +1 -1
  62. package/dist/util/hookCache.js +3 -2
  63. package/dist/util/hookCache.js.map +1 -1
  64. package/dist/util/jsonFile.js +367 -5
  65. package/dist/util/jsonFile.js.map +1 -1
  66. package/dist/util/retrieval.js +181 -0
  67. package/dist/util/retrieval.js.map +1 -0
  68. package/dist/util/seatState.js +5 -5
  69. package/dist/util/secureTextFile.js +30 -0
  70. package/dist/util/secureTextFile.js.map +1 -0
  71. package/dist/util/ssoGateState.js +3 -2
  72. package/dist/util/ssoGateState.js.map +1 -1
  73. package/dist/util/verify.js +21 -10
  74. package/dist/util/verify.js.map +1 -1
  75. package/dist/util/vscodeExtension.js +361 -0
  76. package/dist/util/vscodeExtension.js.map +1 -0
  77. package/dist/util/vscodeState.js +54 -68
  78. package/dist/util/vscodeState.js.map +1 -1
  79. package/package.json +5 -3
package/README.md CHANGED
@@ -1,94 +1,168 @@
1
1
  # anyray-connect
2
2
 
3
3
  The on-ramp. A small, dependency-free Node CLI that points a developer's local
4
- coding tools at the **Anyray gateway** by writing each tool's base URL and a
5
- **placeholder** API key. The gateway stays the brain (routing, spend store,
6
- content encryption, optimizer) — this only does capture/onboarding.
4
+ coding tools at the **Anyray gateway** through supported application config and
5
+ the developer's personal gateway key. The gateway stays the brain (routing,
6
+ spend store, content encryption, optimizer) — this only does capture/onboarding.
7
7
 
8
8
  > The Anyray gateway you target may itself front an existing gateway (LiteLLM, OpenRouter, Portkey, homegrown) via the `anyray-upstream` provider — that's configured server-side on the gateway, with no client-side difference to `connect`.
9
9
 
10
10
  ```bash
11
- npx anyray-connect --gateway https://gw.yourorg.internal --user you@yourorg.com
11
+ npx anyray-connect --enroll https://app.anyray.ai/enroll/enl_…
12
12
  ```
13
13
 
14
14
  An `npx` run first copies its published runtime into a versioned directory under
15
15
  `~/.anyray/bin`. Hooks, MCP registrations, and login services point at that
16
16
  durable copy instead of npm's disposable `_npx` cache.
17
17
 
18
- ## Personal gateway keys (invites)
18
+ ## Personal gateway keys (enrollment)
19
19
 
20
- When the gateway is exposed publicly, each dev authenticates with a **personal
21
- gateway key** (`ark_...`) instead of the shared placeholder:
20
+ Every gateway `/v1` request requires a **personal gateway key** (`ark_...`). Enroll
21
+ before a real apply:
22
22
 
23
- 1. An org admin creates an invite on the gateway (admin-token-gated):
24
- `POST <gateway>/admin/invites` with `{ "user": "<email>", "team": "..." }`
25
- → an `ari_...` invite token. (`POST /admin/client-keys` mints a key
26
- directly, skipping the invite step.)
27
- 2. The dev redeems it while connecting:
23
+ 1. An org admin uses the console's **Users** page to create a passwordless
24
+ enrollment link, or shares the org's SSO enrollment command.
25
+ 2. The developer enrolls while connecting:
28
26
 
29
27
  ```bash
30
- npx anyray-connect --gateway https://gw.yourorg.example --invite ari_xxxxxxxx
28
+ npx anyray-connect --enroll https://app.anyray.ai/enroll/enl_…
29
+ # Enterprise SSO:
30
+ npx anyray-connect --sso https://app.anyray.ai/sso/tnt_…
31
31
  ```
32
32
 
33
- Redemption (`POST <gateway>/connect/redeem`) is **single-use**: it returns the
34
- personal key plus the user/team the invite was issued for, which become the
35
- attribution defaults (explicit `--user`/`--team` win). The key is written
36
- straight into the tool configs and never printed (the CLI shows only a masked
37
- `ark_…xxxx`). Because redemption is single-use, `--dry-run` skips it the
38
- invite is not consumed on a dry run.
33
+ Enrollment mints the short-lived personal key and binds its verified user/team
34
+ to spend attribution. The key lands in owner-only local state and the supported
35
+ tool credential stores; it is never printed in full. Connect reuses a cached,
36
+ unexpired key on later runs. A dry run never consumes an enrollment link or
37
+ writes configuration; without an existing key it reports the selected installs
38
+ that would be configured after enrollment.
39
39
 
40
- Already have a key? Set `ANYRAY_CLIENT_KEY` in the environment and run without
41
- `--invite`; it's picked up the same way.
40
+ Already have a key? Set `ANYRAY_CLIENT_KEY` in the environment. It must be a
41
+ minted `ark_...` key; the old `anyray-placeholder` value cannot authenticate.
42
42
 
43
43
  How the key is sent depends on the auth mode:
44
44
 
45
- - **Placeholder mode** (default): the key replaces the shared placeholder as
46
- the `Authorization` bearer.
45
+ - **Org API mode**: the personal key is the `Authorization` bearer; the gateway
46
+ selects the server-held provider credential after authenticating the developer.
47
47
  - **`--subscription`**: the tool's seat OAuth token keeps the `Authorization`
48
48
  header, and the personal key rides the `x-anyray-api-key` header instead so
49
49
  the gateway can still identify the dev.
50
50
 
51
- ## What it changes
52
-
53
- | Tool | How |
54
- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
55
- | **Claude Code** | Automatic — writes the `env` block in `~/.claude/settings.json` (`ANTHROPIC_BASE_URL`, placeholder `ANTHROPIC_AUTH_TOKEN`, and `ANTHROPIC_CUSTOM_HEADERS` carrying `x-anyray-metadata`). With `--subscription`, no auth token is written: Claude Code keeps its seat (Pro/Max/Team/Enterprise) sign-in and the gateway passes the OAuth token through (`x-anyray-auth-mode: passthrough`), so spend stays on the subscription. |
56
- | **Codex app / CLI / IDE** | Automatic, always-on all three share `~/.codex/config.toml`. Connect writes the `anyray` provider as the default route (`model_provider = "anyray"`), preserves the user's keys/tables, and backs up the original. With `--subscription`, Codex attaches its ChatGPT sign-in and the gateway passes it to the ChatGPT Codex backend, so spend stays on the seat. |
57
- | **Shell env** | Automatic — a managed, idempotent block in your shell profile with `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL` + placeholder keys (covers SDK jobs and scripts). |
58
- | **OpenCode** | Automatic for direct API providers and its Copilot seat route. OpenCode ChatGPT OAuth has no user-facing endpoint override, so Connect detects but leaves that lane untouched; use Codex for config-native ChatGPT subscription routing. |
59
- | **VS Code Copilot Chat** | Custom Endpoint is API-key usage. A Copilot subscription seat uses the extension's CAPI redirect; inline completions remain on GitHub. |
60
- | **JetBrains** | Prints separate steps for AI Assistant's OpenAI-compatible custom provider (API-key usage). The GitHub Copilot plugin has no documented custom CAPI URL, so Connect leaves it untouched and points subscription users to VS Code Copilot Chat or OpenCode. |
61
- | **Claude desktop** | Uses Claude Desktop's supported third-party Gateway mode (`desktop claude`), which is API-key usage. Its first-party subscription endpoint is not configurable; use Claude Code for subscription pass-through. |
62
- | **Cursor / Windsurf** | Cursor's OpenAI custom endpoint/BYOK is API-key usage and covers only requests sent through that lane. Native Windsurf has no documented OpenAI-compatible endpoint; connect gives a concrete Roo Code/Continue extension bridge and leaves native Cascade/autocomplete on Windsurf. |
51
+ ## Automatic coverage matrix
52
+
53
+ “Automatic” has two different meanings here: **route** means the request takes a supported path
54
+ through the gateway and can be optimized; **visibility** means content-free usage arrives through
55
+ the request path or an official vendor reporting API. A visibility connector does not pretend that
56
+ closed first-party traffic was routed.
57
+
58
+ | Tool | Route setup | Spend visibility | Boundary |
59
+ | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
60
+ | **Claude Code** | **Automatic** writes the supported `env` block in `~/.claude/settings.json`. | **Automatic** — API-key and Anthropic seat traffic is attributed on the gateway path. | Seat OAuth passes through unchanged; provider routing applies only to API-key traffic. |
61
+ | **Codex app / CLI / IDE** | **Automatic** all three share `~/.codex/config.toml`; Connect makes the `anyray` provider the default without replacing foreign config. | **Automatic** — API-key and ChatGPT-seat traffic is attributed on the gateway path. | The genuine Codex seat envelope and OAuth token are preserved. If an app/IDE picker omits custom-provider models, pin `ANYRAY_CODEX_MODEL` and rerun Connect. |
62
+ | **Cursor** | **Automatic only when Cursor is closed and a system `sqlite3` executable is available**; Connect updates the exact application-owned OpenAI custom-endpoint/BYOK cells with a reversible value backup. | **Automatic** — routed BYOK requests are recorded by the gateway; native Cursor Teams usage can be imported by the official Admin API connector. | Restart Cursor afterward. A running app, missing `sqlite3`, or unfamiliar store shape falls back to the supported manual UI. The route also requires a publicly reachable TLS gateway and an eligible paid plan. |
63
+ | **OpenCode** | **Automatic** for direct API providers and its Copilot provider. | **Automatic** for those routed lanes. | Restart OpenCode afterward. Built-in ChatGPT OAuth exposes no endpoint override; use Codex for that seat. |
64
+ | **VS Code Copilot Chat** | **Automatic** on VS Code 1.121+ — Connect installs and configures an explicit Anyray chat provider through VS Code's supported language-model-provider API. | **Automatic** for gateway API-key mode. Copilot-seat/native automatic reporting requires Copilot Business or Enterprise plus the official GitHub connector; the current Anyray connector does not cover Individual plans. | The developer selects an “Anyray · …” chat model. Native Copilot Chat and inline completions remain GitHub traffic. VS Code profiles scope extensions: Connect installs the Default Profile; use the official **Apply Extension to all Profiles** action for additional profiles. |
65
+ | **JetBrains AI Assistant** | **Automatic** on IDE 2025.3.2+ with enabled JetBrains AI 253.30387.147+ — registers pinned Claude and Codex ACP launchers in `~/.jetbrains/acp.json`. | **Automatic** on those ACP carriers; native Copilot reporting requires Copilot Business or Enterprise plus the official GitHub connector. | Connect proves both versions from local JetBrains metadata before writing. Native JetBrains AI and Copilot traffic is untouched. A carrier may request its normal provider sign-in on first launch. |
66
+ | **Claude Desktop** | **Automatic** on Windows and on macOS for Claude Desktop 1.21459.0. Other macOS builds use the in-app flow. | **Automatic** for third-party API traffic. | Restart Claude after first setup. Later enrolled-key renewals need no restart. First-party subscription traffic stays direct; use Claude Code. Machine-level Windows policy takes priority. |
67
+ | **Devin Desktop** | **Automatic registry write only** for pinned Claude and Codex ACP agents; route activation is not automatic. | **Automatic** once requests use those carriers; the official enterprise consumption connector covers native Devin usage. | Devin requires its documented one-time vendor UI agent-enable action and an app restart. Native Devin traffic is not redirected. |
68
+ | **Shell / SDK env** | **Automatic** — writes a managed, idempotent shell-profile block. | **Automatic** on the gateway request path. | Subscription seats are not applicable to generic SDK traffic. |
63
69
 
64
70
  The real provider key is never written here — it stays server-side in the
65
- gateway (`ANYRAY_PROVIDER_KEY_*`), which swaps it in per request. Only metadata
66
- (user/team) is attached for spend attribution; **prompt/response content is never
67
- touched.**
68
-
69
- These adapters use application-owned configuration only. They do **not** install
70
- a certificate authority, change DNS/NAT, or modify the operating-system proxy.
71
+ gateway (`ANYRAY_PROVIDER_KEY_*`), which swaps it in per request. Connect itself
72
+ only writes routing and attribution configuration; it never reads or persists
73
+ prompt/response content. Routed requests are handled by the gateway under the
74
+ deployment's configured content mode.
75
+
76
+ These adapters use application-owned configuration only. Cursor's BYOK route is a supported UI
77
+ setting, but Cursor publishes no managed-config contract for it; Connect's best-effort automation
78
+ targets only its exact journaled settings cells. Existing malformed values fail closed. Missing rows
79
+ are seeded as first use, so a future release moving the keys cannot be distinguished automatically;
80
+ verify the override after Cursor upgrades and use the UI when it no longer appears.
81
+ Claude Desktop similarly publishes its third-party inference UI, not a managed contract for the
82
+ local config-library files. The macOS write is limited to the observed Claude Desktop `1.21459.0`
83
+ build, journaled, and fails closed to the supported UI on every other or unverifiable version.
84
+ On Windows, Connect writes Claude's per-user policy and installs a key-free credential helper.
85
+ Restart Claude after first setup. Later enrolled-key renewals need no policy update or restart.
86
+ Connect changes only settings and files it owns, and rolls back incomplete setup. Normal `npx`
87
+ setup saves the stable Connect copy the helper needs; direct temporary-only runs stop before making
88
+ changes.
89
+ The adapters do **not** install a certificate authority, change DNS/NAT, or modify the
90
+ operating-system proxy.
71
91
  When a first-party client has no supported endpoint seam, Connect leaves it
72
92
  untouched and names a config-native alternative.
73
93
 
94
+ JetBrains and Devin ACP carriers require Node.js with npm/npx on the endpoint. Connect resolves
95
+ the absolute `npx` launcher during setup and stores only that non-secret path in its durable ACP
96
+ launcher, so an IDE's reduced GUI `PATH` does not create a false-success install. JetBrains setup
97
+ also fails closed unless local `product-info.json`, the AI Assistant plugin descriptor, and the
98
+ enabled-plugin state prove IDE 2025.3.2+ with JetBrains AI 253.30387.147+. Custom IDE/plugin paths
99
+ that are not represented by those local metadata locations are left for the supported in-IDE ACP
100
+ flow. For JetBrains Remote Development, run Connect in the remote backend user's shell: that is
101
+ where the plugin and ACP process run, and configuring only the local frontend does not configure
102
+ the backend. JetBrains currently does not support ACP in WSL. A key supplied
103
+ through `ANYRAY_CLIENT_KEY` is usable by these durable helpers but cannot be refreshed on this
104
+ machine; rerun Connect with a replacement key when the administrator rotates or expires it.
105
+
106
+ ## Desktop fleet credential helper
107
+
108
+ Claude Desktop and Codex fleet artifacts contain no static personal key. They require an
109
+ explicitly deployed local helper; artifact generation fails if `--helper-path` is missing.
110
+
111
+ First deploy the standalone binary to a stable absolute path, then install the helper on each
112
+ endpoint:
113
+
114
+ ```bash
115
+ sudo /usr/local/bin/anyray-connect desktop helper --write --platform posix \
116
+ --bin /usr/local/bin/anyray-connect
117
+ ```
118
+
119
+ ```powershell
120
+ & "C:\Program Files\Anyray\anyray-connect.exe" desktop helper --write `
121
+ --platform windows --bin "C:\Program Files\Anyray\anyray-connect.exe"
122
+ ```
123
+
124
+ The default destinations are `/usr/local/bin/anyray-credential-helper` and
125
+ `C:\Program Files\Anyray\anyray-credential-helper.cmd`. `--write` verifies the runtime and writes
126
+ atomically (mode `0755` on POSIX); `--print` emits only wrapper bytes for MDM packaging. The wrapper
127
+ never uses `PATH` and contains no key. Each signed-in user must already be enrolled.
128
+
129
+ Generate a policy only after choosing the matching helper path:
130
+
131
+ ```bash
132
+ anyray-connect desktop --mobileconfig claude.mobileconfig \
133
+ --gateway https://gw.example.com \
134
+ --helper-path /usr/local/bin/anyray-credential-helper
135
+
136
+ anyray-connect desktop --reg claude.reg \
137
+ --gateway https://gw.example.com \
138
+ --helper-path "C:\Program Files\Anyray\anyray-credential-helper.cmd"
139
+
140
+ anyray-connect desktop codex --mobileconfig codex.mobileconfig \
141
+ --gateway https://gw.example.com \
142
+ --helper-path /usr/local/bin/anyray-credential-helper
143
+ ```
144
+
145
+ Claude consumes the helper's `print-key --json` output. Codex's supported command-auth contract
146
+ expects a raw bearer token, so its generated config selects the wrapper's private raw-token mode;
147
+ on Windows it invokes the `.cmd` through the system `cmd.exe` instead of relying on shell lookup.
148
+
74
149
  ## Common flags
75
150
 
76
151
  ```
77
152
  --gateway <url> Gateway origin (default: $ANYRAY_GATEWAY_URL or http://localhost:8787)
78
153
  --user <id> Attribute spend to this user (default: git email, else OS user)
79
154
  --team <id> Attribute spend to this team
80
- --tools <ids> Subset: claude-code, codex, cursor, copilot-chat, opencode,
81
- jetbrains, claude-desktop, windsurf, shell-env
82
- --invite <token> Redeem an org invite (single-use) for a personal gateway key
83
- and use it as your auth; defaults --user/--team from the
84
- invite. Skipped under --dry-run (the invite isn't consumed).
85
- Already have a key? Set $ANYRAY_CLIENT_KEY instead.
155
+ --tools <ids> Subset: claude-code, codex, cursor, copilot, opencode,
156
+ jetbrains, claude-desktop, windsurf (Devin Desktop), shell-env
157
+ --enroll <link> Passwordless enrollment link; mints the personal gateway key.
158
+ --sso <link> Enterprise SSO enrollment; mints the same kind of key after
159
+ the developer signs in with the configured identity provider.
86
160
  --subscription Seat-billed (subscription) auth: pass the tool's own OAuth
87
161
  token through the gateway instead of the org API key.
88
162
  Honored directly by Claude Code (Anthropic seats) and Codex
89
- (ChatGPT seats), plus supported Copilot CAPI/provider routes.
163
+ (ChatGPT seats), plus supported Copilot provider routes.
90
164
  Unsupported first-party endpoints are left untouched. With a
91
- personal gateway key (--invite / $ANYRAY_CLIENT_KEY), the key
165
+ personal gateway key (--enroll / --sso / $ANYRAY_CLIENT_KEY), the key
92
166
  rides x-anyray-api-key while the seat token stays the bearer.
93
167
  --dry-run Show what would change without writing
94
168
  --yes, -y Skip confirmation (scripted/fleet rollout)
@@ -114,8 +188,10 @@ line to the registry. Nothing in the CLI orchestrator changes.
114
188
  ## Develop
115
189
 
116
190
  ```bash
117
- npm install
191
+ # From the monorepo root; Connect's build embeds the sibling VS Code extension.
192
+ corepack pnpm install
193
+ cd connect
118
194
  npm run dev -- --dry-run # run from source
119
195
  npm test # node --test
120
- npm run build # tsc → dist/
196
+ npm run build # build/check bundled VSIX, then tsc → dist/
121
197
  ```
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generated from the `vscode-extension/` package by
3
+ * `connect/scripts/package-vscode-extension.mjs`. The archive is embedded as
4
+ * source so both npm/npx runtimes and Bun's single-file executable carry the
5
+ * same installable extension without a Marketplace dependency.
6
+ */
7
+ export const BUNDLED_VSCODE_EXTENSION_VERSION = "0.1.1";
8
+ export const BUNDLED_VSCODE_EXTENSION_SOURCE_SHA256 = "bc3d1964758b33bf4ee057403aa5ad35e55f32b604456eda311363ae2546c518";
9
+ export const BUNDLED_VSCODE_EXTENSION_DIST_SHA256 = "55806ad0c3421697458cf3e84f6d3ff3a60b1ac40950211d45b3e35db85e232f";
10
+ export const BUNDLED_VSCODE_EXTENSION_SHA256 = "e65704e9d318d06aa8ca6fd03d34ee9cfdab182f4b8cfc98581c8b982ee26768";
11
+ export const BUNDLED_VSCODE_EXTENSION_BASE64 = "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";
12
+ //# sourceMappingURL=vscodeExtensionAsset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscodeExtensionAsset.js","sourceRoot":"","sources":["../../src/assets/vscodeExtensionAsset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AACxD,MAAM,CAAC,MAAM,sCAAsC,GACjD,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,oCAAoC,GAC/C,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,kEAAkE,CAAC;AACrE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,kxcAAkxc,CAAC"}