Kaynağa Gözat

Merge branch 'main' into fix-listCodeDefinitionNamesTool-for-java

Christiaan Arnoldus 4 ay önce
ebeveyn
işleme
ad0843b5f3
100 değiştirilmiş dosya ile 17311 ekleme ve 2764 silme
  1. 1 1
      .github/workflows/code-qa.yml
  2. 11 12
      .github/workflows/marketplace-publish.yml
  3. 1 1
      .gitignore
  4. 2 1
      .vscode/settings.json
  5. 47 0
      CHANGELOG.md
  6. 1 1
      apps/kilocode-docs/docs/advanced-usage/free-and-budget-models.md
  7. 6 4
      apps/kilocode-docs/docs/basic-usage/adding-credits.md
  8. 224 0
      apps/kilocode-docs/docs/cli.md
  9. 13 3
      apps/kilocode-docs/docs/faq.md
  10. 12 2
      apps/kilocode-docs/docs/features/experimental/experimental-features.md
  11. 65 0
      apps/kilocode-docs/docs/features/experimental/native-function-calling.md
  12. 8 2
      apps/kilocode-docs/docs/seats/about.md
  13. 27 3
      apps/kilocode-docs/docs/seats/analytics.md
  14. 31 73
      apps/kilocode-docs/docs/seats/billing.md
  15. 1 1
      apps/kilocode-docs/docs/seats/dashboard.md
  16. 1 1
      apps/kilocode-docs/docs/seats/enterprise/SSO.md
  17. 11 1
      apps/kilocode-docs/docs/seats/enterprise/audit-logs.md
  18. 3 3
      apps/kilocode-docs/docs/seats/getting-started.md
  19. 0 184
      apps/kilocode-docs/docs/seats/roles-permissions.md
  20. 17 121
      apps/kilocode-docs/docs/seats/team-management.md
  21. 267 254
      apps/kilocode-docs/docusaurus.config.ts
  22. 2 2
      apps/kilocode-docs/sidebars.ts
  23. BIN
      apps/kilocode-docs/static/img/teams/org_credits.png
  24. 3 0
      apps/web-roo-code/package.json
  25. BIN
      apps/web-roo-code/public/heroes/cloud-screen.png
  26. 247 0
      apps/web-roo-code/src/app/cloud/page.tsx
  27. 15 9
      apps/web-roo-code/src/app/legal/subprocessors/page.tsx
  28. 55 31
      apps/web-roo-code/src/app/pricing/page.tsx
  29. 50 304
      apps/web-roo-code/src/app/terms/page.tsx
  30. 101 0
      apps/web-roo-code/src/app/terms/terms.md
  31. 13 2
      apps/web-roo-code/src/components/chromes/nav-bar.tsx
  32. 3 0
      cli/.kilocode-cli/workspace-storage/workspace-state.json
  33. 20 0
      cli/CHANGELOG.md
  34. 47 0
      cli/README.md
  35. 1 2
      cli/esbuild.config.mjs
  36. 12240 0
      cli/npm-shrinkwrap.dist.json
  37. 1 1
      cli/package.dist.json
  38. 4 1
      cli/package.json
  39. 98 0
      cli/src/__tests__/config-default-creation.test.ts
  40. 261 0
      cli/src/__tests__/history.test.ts
  41. 5 0
      cli/src/cli.ts
  42. 247 0
      cli/src/commands/__tests__/profile.test.ts
  43. 400 0
      cli/src/commands/__tests__/teams.test.ts
  44. 10 0
      cli/src/commands/core/types.ts
  45. 4 0
      cli/src/commands/index.ts
  46. 105 0
      cli/src/commands/profile.ts
  47. 324 0
      cli/src/commands/teams.ts
  48. 2 55
      cli/src/config/defaults.ts
  49. 198 0
      cli/src/config/history.ts
  50. 73 0
      cli/src/config/openConfig.ts
  51. 8 9
      cli/src/config/persistence.ts
  52. 1 0
      cli/src/host/ExtensionHost.ts
  53. 218 1
      cli/src/host/VSCode.ts
  54. 17 70
      cli/src/index.ts
  55. 100 0
      cli/src/services/__tests__/approvalDecision.test.ts
  56. 38 11
      cli/src/services/approvalDecision.ts
  57. 2 0
      cli/src/services/autocomplete.ts
  58. 50 1
      cli/src/services/logs.ts
  59. 0 448
      cli/src/state/atoms/__tests__/approval-logic.test.ts
  60. 0 233
      cli/src/state/atoms/__tests__/approval-race-conditions.test.ts
  61. 161 0
      cli/src/state/atoms/__tests__/approval.test.ts
  62. 0 392
      cli/src/state/atoms/__tests__/ci-approval.test.ts
  63. 117 2
      cli/src/state/atoms/__tests__/keyboard.test.ts
  64. 115 223
      cli/src/state/atoms/approval.ts
  65. 31 0
      cli/src/state/atoms/config.ts
  66. 27 0
      cli/src/state/atoms/effects.ts
  67. 245 0
      cli/src/state/atoms/history.ts
  68. 71 1
      cli/src/state/atoms/keyboard.ts
  69. 147 0
      cli/src/state/atoms/profile.ts
  70. 29 0
      cli/src/state/atoms/ui.ts
  71. 5 1
      cli/src/state/hooks/index.ts
  72. 40 5
      cli/src/state/hooks/useApprovalHandler.ts
  73. 85 78
      cli/src/state/hooks/useApprovalMonitor.ts
  74. 22 1
      cli/src/state/hooks/useCommandContext.ts
  75. 7 0
      cli/src/state/hooks/useCommandInput.ts
  76. 154 0
      cli/src/state/hooks/useProfile.ts
  77. 21 2
      cli/src/ui/UI.tsx
  78. 6 2
      cli/src/ui/components/ApprovalMenu.tsx
  79. 1 1
      cli/src/ui/components/AutocompleteMenu.tsx
  80. 1 1
      cli/src/ui/components/CommandInput.tsx
  81. 1 1
      cli/src/ui/components/FollowupSuggestionsMenu.tsx
  82. 1 1
      cli/src/ui/components/StatusBar.tsx
  83. 1 1
      cli/src/ui/components/StatusIndicator.tsx
  84. 0 1
      cli/src/ui/messages/MessageRow.tsx
  85. 2 1
      cli/src/ui/messages/cli/CliMessageRow.tsx
  86. 1 2
      cli/src/ui/messages/extension/ExtensionMessageRow.tsx
  87. 1 3
      cli/src/ui/messages/extension/ask/AskBrowserActionLaunchMessage.tsx
  88. 1 3
      cli/src/ui/messages/extension/ask/AskCommandMessage.tsx
  89. 1 3
      cli/src/ui/messages/extension/ask/AskToolMessage.tsx
  90. 1 3
      cli/src/ui/messages/extension/ask/AskUseMcpServerMessage.tsx
  91. 1 1
      cli/src/ui/messages/extension/say/SayCommandOutputMessage.tsx
  92. 1 1
      cli/src/ui/messages/extension/say/SayErrorMessage.tsx
  93. 1 1
      cli/src/ui/messages/extension/tools/ToolReadFileMessage.tsx
  94. 1 8
      cli/src/ui/messages/extension/tools/ToolRouter.tsx
  95. 0 54
      cli/src/ui/messages/utils/messageCompletion.ts
  96. 75 0
      cli/src/utils/authWizard.ts
  97. 5 0
      cli/src/utils/wait.ts
  98. 1 1
      flake.nix
  99. 1 0
      jetbrains/plugin/.gitignore
  100. 218 122
      jetbrains/plugin/build.gradle.kts

+ 1 - 1
.github/workflows/code-qa.yml

@@ -161,7 +161,7 @@ jobs:
             - uses: actions/setup-java@v4
               with:
                   distribution: 'jetbrains'
-                  java-version: '17'
+                  java-version: '21'
             - name: Install system dependencies
               run: |
                 sudo apt-get update

+ 11 - 12
.github/workflows/marketplace-publish.yml

@@ -133,7 +133,7 @@ jobs:
             - uses: actions/setup-java@v4
               with:
                   distribution: "jetbrains"
-                  java-version: "17"
+                  java-version: "21"
             - name: Install system dependencies
               run: |
                   sudo apt-get update
@@ -173,14 +173,13 @@ jobs:
               with:
                   name: ${{ env.BUNDLE_NAME }}
                   path: jetbrains/plugin/build/distributions/${{ env.BUNDLE_NAME }}
-            # Disabled while we figure out why our JetBrains builds are no longer being approved.
-            #- name: JetBrains Marketplace Publisher
-            #  run: |
-            #      curl \
-            #      -X POST \
-            #      -H "Authorization: Bearer ${{ secrets.JETBRAINS_MARKETPLACE_TOKEN }}" \
-            #      -F "file=@jetbrains/plugin/build/distributions/${{ env.BUNDLE_NAME }}" \
-            #      -F "pluginId=28350" \
-            #      -F "channel=stable" \
-            #      -F "isHidden=false" \
-            #      https://plugins.jetbrains.com/plugin/uploadPlugin
+            - name: JetBrains Marketplace Publisher
+              run: |
+                 curl \
+                 -X POST \
+                 -H "Authorization: Bearer ${{ secrets.JETBRAINS_MARKETPLACE_TOKEN }}" \
+                 -F "file=@jetbrains/plugin/build/distributions/${{ env.BUNDLE_NAME }}" \
+                 -F "pluginId=28350" \
+                 -F "channel=stable" \
+                 -F "isHidden=false" \
+                 https://plugins.jetbrains.com/plugin/uploadPlugin

+ 1 - 1
.gitignore

@@ -65,4 +65,4 @@ qdrant_storage/
 
 # allow multiple local clones with different workspaces with different colors
 # to make it easier to work on features in parallel
-*.code-workspace
+*.code-workspace

+ 2 - 1
.vscode/settings.json

@@ -23,5 +23,6 @@
 	"markdown.editor.filePaste.copyIntoWorkspace": "mediaFiles",
 	"markdown.copyFiles.destination": {
 		"**/*": "/static/img/${documentBaseName}/${documentBaseName}.${fileName/(.*)\\.(.*)/$2/}"
-	}
+	},
+	"java.configuration.updateBuildConfiguration": "interactive"
 }

+ 47 - 0
CHANGELOG.md

@@ -1,5 +1,52 @@
 # kilo-code
 
+## [v4.109.2]
+
+- [#3216](https://github.com/Kilo-Org/kilocode/pull/3216) [`3f34635`](https://github.com/Kilo-Org/kilocode/commit/3f3463554f7cf016db9b2851c40217e38a048840) Thanks [@markijbema](https://github.com/markijbema)! - Do not accept an autocomplete suggestion with shift-tab or ctrl-tab (only plain tab)
+
+- [#3214](https://github.com/Kilo-Org/kilocode/pull/3214) [`b271af9`](https://github.com/Kilo-Org/kilocode/commit/b271af9c51da9a8f6ec3a6f4caf78ff18db9b3a8) Thanks [@mcowger](https://github.com/mcowger)! - Update Synthetic Provider to support GLM 4.6, and enable native tool calling
+
+- [#3199](https://github.com/Kilo-Org/kilocode/pull/3199) [`14bbc5f`](https://github.com/Kilo-Org/kilocode/commit/14bbc5f9b5a61cbf2016c7b6a784fdc546fa6a0e) Thanks [@possible055](https://github.com/possible055)! - Improve Chinese translation of autocomplete-related terms
+
+## [v4.109.1]
+
+- [#3203](https://github.com/Kilo-Org/kilocode/pull/3203) [`aeb8bf3`](https://github.com/Kilo-Org/kilocode/commit/aeb8bf37df44532517db96511e3f0f85861f55b8) Thanks [@chrarnoldus](https://github.com/chrarnoldus)! - Fix Z.ai provider giving an Unauthorized error
+
+## [v4.109.0]
+
+- [#3088](https://github.com/Kilo-Org/kilocode/pull/3088) [`84a1fa3`](https://github.com/Kilo-Org/kilocode/commit/84a1fa3f84eac42fa76da9be09270cdb57b19b34) Thanks [@mcowger](https://github.com/mcowger)! - Update base URL for Vertex Anthropic models to work around outdated library.
+
+- [#3192](https://github.com/Kilo-Org/kilocode/pull/3192) [`7015c23`](https://github.com/Kilo-Org/kilocode/commit/7015c2367c0ddf45d40b4adf96386f3ca5005bc1) Thanks [@markijbema](https://github.com/markijbema)! - Fix bug: autocomplete no longer suggests strange XML
+
+### Patch Changes
+
+- [#3159](https://github.com/Kilo-Org/kilocode/pull/3159) [`935bbae`](https://github.com/Kilo-Org/kilocode/commit/935bbae3a080c8475671b97440eacf2ead939198) Thanks [@kevinvandijk](https://github.com/kevinvandijk)! - Include changes from Roo Code v3.28.18
+
+    - Fix: Remove request content from UI messages to improve performance and reduce clutter (#5601 by @MuriloFP, #8594 by @multivac2x, #8690 by @hannesrudolph, PR by @mrubens)
+    - Fix: Add userAgent to Bedrock client for version tracking (#8660 by @ajjuaire, PR by @app/roomote)
+    - Feat: Z AI now uses only two coding endpoints for better performance (#8687 by @hannesrudolph)
+    - Feat: Update image generation model selection for improved quality (thanks @chrarnoldus!)
+
+- [#3194](https://github.com/Kilo-Org/kilocode/pull/3194) [`b566965`](https://github.com/Kilo-Org/kilocode/commit/b56696581e82652086564503f7743e9e82585823) Thanks [@markijbema](https://github.com/markijbema)! - Do not trigger autocomplete for external events, like git changes
+
+- [#3100](https://github.com/Kilo-Org/kilocode/pull/3100) [`3e409b8`](https://github.com/Kilo-Org/kilocode/commit/3e409b84310f481d1c3be4095d887f5cf6d15282) Thanks [@markijbema](https://github.com/markijbema)! - Added Amazon Bedrock as a provider for autocomplete
+
+- [#3149](https://github.com/Kilo-Org/kilocode/pull/3149) [`79c7d60`](https://github.com/Kilo-Org/kilocode/commit/79c7d60a10a765da8195fde80e6a89630993b918) Thanks [@catrielmuller](https://github.com/catrielmuller)! - Jetbrains - Update framework (Plugin now requires IntelliJ IDEA 2024.3 or later)
+
+- [#3195](https://github.com/Kilo-Org/kilocode/pull/3195) [`93371d0`](https://github.com/Kilo-Org/kilocode/commit/93371d08f1c1b88eeb9f567af9ae74188fe7e379) Thanks [@chrarnoldus](https://github.com/chrarnoldus)! - Fixed crash when browser tool is used with native tool calling enabled
+
+## [v4.108.0]
+
+- [#2674](https://github.com/Kilo-Org/kilocode/pull/2674) [`2836aed`](https://github.com/Kilo-Org/kilocode/commit/2836aeddbbd6884f2c6f2421ca79387c25f5cd94) Thanks [@mcowger](https://github.com/mcowger)! - add send message on enter setting with configurable behavior
+
+- [#3090](https://github.com/Kilo-Org/kilocode/pull/3090) [`261889f`](https://github.com/Kilo-Org/kilocode/commit/261889f1d4fa853aea0ddb261856b6d4c63e1159) Thanks [@mcowger](https://github.com/mcowger)! - Allow the use of native function calling for OpenAI-compatible, LM Studio, Chutes, DeepInfra, xAI and Z.ai providers.
+
+### Patch Changes
+
+- [#3155](https://github.com/Kilo-Org/kilocode/pull/3155) [`6242b03`](https://github.com/Kilo-Org/kilocode/commit/6242b03e9fb58eff8da9f637fa448b35aeaae3a3) Thanks [@NikoDi2000](https://github.com/NikoDi2000)! - Improved the Chinese translation of "run" from '命令' to '运行'
+
+- [#3120](https://github.com/Kilo-Org/kilocode/pull/3120) [`ced4857`](https://github.com/Kilo-Org/kilocode/commit/ced48571894311e3350b9603071e5e2becc9473f) Thanks [@mcowger](https://github.com/mcowger)! - The apply_diff tool was implemented for experimental JSON-style tool calling
+
 ## [v4.107.0]
 
 ### Patch Changes

+ 1 - 1
apps/kilocode-docs/docs/advanced-usage/free-and-budget-models.md

@@ -204,7 +204,7 @@ When you need more capability than free models provide, these options deliver ex
 
 ### Track Your Usage
 
-**Monitor token consumption:**
+**Monitor credit consumption:**
 
 - Check cost estimates in chat history
 - Review monthly usage patterns

+ 6 - 4
apps/kilocode-docs/docs/basic-usage/adding-tokens.md → apps/kilocode-docs/docs/basic-usage/adding-credits.md

@@ -1,11 +1,11 @@
 import { DISCORD_URL } from '@site/src/constants.ts'
 
-# Adding More Tokens
+# Adding More Kilo Credits
 
-Once you've used any initial free tokens, you can easily add more:
+Once you've used any initial free Kilo Credits, you can easily add more:
 
 - Add a credit card to your account (all payments are securely processed through Stripe)
-- We don't currently offer a subscription, so you only pay for the tokens you use, and only when you choose to top up your tokens!
+- We don't currently offer a subscription, so you only pay for the credits you use, and only when you choose to top up your credits!
 - Leverage your own API provider by [connecting your own API provider](/getting-started/connecting-api-provider.md)
 
 ## Transparent Pricing
@@ -13,7 +13,9 @@ Once you've used any initial free tokens, you can easily add more:
 At Kilo Code, we believe in complete pricing transparency:
 
 - Our pricing matches the model provider's API rates exactly
-- We don't take any commission or markup, either per token or per top-up
+- We don't take any commission or markup.
+- $1 you give us becomes $1 of Kilo credits
+- We debit your Kilo credits exactly what the provider charges us in dollars
 - You only pay for what you use with no hidden fees
 
 ## Future Plans

+ 224 - 0
apps/kilocode-docs/docs/cli.md

@@ -0,0 +1,224 @@
+# Kilo Code CLI
+
+Orchestrate agents from your terminal. Plan, debug, and code fast with keyboard-first navigation on the command line.
+
+The Kilo Code CLI uses the same underlying technology that powers the IDE extensions, so you can expect the same workflow to handle agentic coding tasks from start to finish.
+
+## Install
+
+`npm install -g @kilocode/cli`
+
+Change directory to where you want to work and run kilocode:
+
+```
+# Start interactive chat session
+kilocode
+
+# Start with a specific mode
+kilocode --mode architect
+
+# Start with a specific workspace
+kilocode --workspace /path/to/project
+```
+
+to start the CLI and begin a new task with your preferred model and relevant mode.
+
+## What you can do with Kilo Code CLI
+
+- **Plan and execute code changes without leaving your terminal.** Use your command line to make edits to your project without opening your IDE.
+- **Switch between hundreds of LLMs without constraints.** Other CLI tools only work with one model or curate opinionated lists. With Kilo, you can switch models without booting up another tool.
+- **Choose the right mode for the task in your workflow.** Select between Architect, Ask, Debug, Orchestrator, or custom agent modes.
+- **Automate tasks.** Get AI assistance writing shell scripts for tasks like renaming all of the files in a folder or transforming sizes for a set of images.
+
+## CLI reference
+
+### CLI commands
+
+| Command         | Description                                                      | Example                     |
+| --------------- | ---------------------------------------------------------------- | --------------------------- |
+| `kilocode`      | Start interactive                                                |                             |
+| `/mode`         | Switch between modes (architect, code, debug, ask, orchestrator) | `/mode orchestrator`        |
+| `/model`        | Learn about available models and switch between them             |                             |
+| `/model list`   | List available models                                            |                             |
+| `/model info`   | Prints description for a specific model by name                  | `/model info z-ai/glm-4.5v` |
+| `/model select` | Select and switch to a new model                                 |                             |
+| `/new`          | Start a new task with the agent with a clean slate               |                             |
+| `/help`         | List available commands and how to use them                      |                             |
+| `/exit`         | Exit the CLI                                                     |                             |
+
+## Config reference for providers
+
+Kilo gives you the ability to bring your own keys for a number of model providers and AI gateways, like OpenRouter and Vercel AI Gateway. Each provider has unique configuration options and some let you set environment variables.
+
+You can reference the [Provider Configuration Guide](https://github.com/Kilo-Org/kilocode/blob/main/cli/docs/PROVIDER_CONFIGURATION.md) for examples if you want to edit .config files manually. You can also run:
+
+`kilocode config`
+
+to complete configuration with an interactive workflow on the command line.
+
+## Autonomous mode (Non-Interactive)
+
+Autonomous mode allows Kilo Code to run in automated environments like CI/CD pipelines without requiring user interaction.
+
+```bash
+# Run in autonomous mode with a prompt
+kilocode --auto "Implement feature X"
+
+# Run in autonomous mode with piped input
+echo "Fix the bug in app.ts" | kilocode --auto
+
+# Run in autonomous mode with timeout (in seconds)
+kilocode --auto "Run tests" --timeout 300
+```
+
+### Autonomous Mode Behavior
+
+When running in Autonomous mode (`--auto` flag):
+
+1. **No User Interaction**: All approval requests are handled automatically based on configuration
+2. **Auto-Approval/Rejection**: Operations are approved or rejected based on your auto-approval settings
+3. **Follow-up Questions**: Automatically responded with a message instructing the AI to make autonomous decisions
+4. **Automatic Exit**: The CLI exits automatically when the task completes or times out
+
+### Auto-Approval Configuration
+
+Autonomous mode respects your auto-approval configuration. Edit your config file with `kilocode config` to customize:
+
+```json
+{
+	"autoApproval": {
+		"enabled": true,
+		"read": {
+			"enabled": true,
+			"outside": true
+		},
+		"write": {
+			"enabled": true,
+			"outside": false,
+			"protected": false
+		},
+		"execute": {
+			"enabled": true,
+			"allowed": ["npm", "git", "pnpm"],
+			"denied": ["rm -rf", "sudo"]
+		},
+		"browser": {
+			"enabled": false
+		},
+		"mcp": {
+			"enabled": true
+		},
+		"mode": {
+			"enabled": true
+		},
+		"subtasks": {
+			"enabled": true
+		},
+		"question": {
+			"enabled": false,
+			"timeout": 60
+		},
+		"retry": {
+			"enabled": true,
+			"delay": 10
+		},
+		"todo": {
+			"enabled": true
+		}
+	}
+}
+```
+
+**Configuration Options:**
+
+- `read`: Auto-approve file read operations
+    - `outside`: Allow reading files outside workspace
+- `write`: Auto-approve file write operations
+    - `outside`: Allow writing files outside workspace
+    - `protected`: Allow writing to protected files (e.g., package.json)
+- `execute`: Auto-approve command execution
+    - `allowed`: List of allowed command patterns (e.g., ["npm", "git"])
+    - `denied`: List of denied command patterns (takes precedence)
+- `browser`: Auto-approve browser operations
+- `mcp`: Auto-approve MCP tool usage
+- `mode`: Auto-approve mode switching
+- `subtasks`: Auto-approve subtask creation
+- `question`: Auto-approve follow-up questions
+- `retry`: Auto-approve API retry requests
+- `todo`: Auto-approve todo list updates
+
+### Command Approval Patterns
+
+The `execute.allowed` and `execute.denied` lists support hierarchical pattern matching:
+
+- **Base command**: `"git"` matches any git command (e.g., `git status`, `git commit`, `git push`)
+- **Command + subcommand**: `"git status"` matches any git status command (e.g., `git status --short`, `git status -v`)
+- **Full command**: `"git status --short"` only matches exactly `git status --short`
+
+**Example:**
+
+```json
+{
+	"execute": {
+		"enabled": true,
+		"allowed": [
+			"npm", // Allows all npm commands
+			"git status", // Allows all git status commands
+			"ls -la" // Only allows exactly "ls -la"
+		],
+		"denied": [
+			"git push --force" // Denies this specific command even if "git" is allowed
+		]
+	}
+}
+```
+
+### Interactive Command Approval
+
+When running in interactive mode, command approval requests now show hierarchical options:
+
+```
+[!] Action Required:
+> ✓ Run Command (y)
+  ✓ Always run git (1)
+  ✓ Always run git status (2)
+  ✓ Always run git status --short --branch (3)
+  ✗ Reject (n)
+```
+
+Selecting an "Always run" option will:
+
+1. Approve and execute the current command
+2. Add the pattern to your `execute.allowed` list in the config
+3. Auto-approve matching commands in the future
+
+This allows you to progressively build your auto-approval rules without manually editing the config file.
+
+### Autonomous Mode Follow-up Questions
+
+In Autonomous mode, when the AI asks a follow-up question, it receives this response:
+
+> "This process is running in non-interactive Autonomous mode. The user cannot make decisions, so you should make the decision autonomously."
+
+This instructs the AI to proceed without user input.
+
+### Exit Codes
+
+- `0`: Success (task completed)
+- `124`: Timeout (task exceeded time limit)
+- `1`: Error (initialization or execution failure)
+
+### Example CI/CD Integration
+
+```yaml
+# GitHub Actions example
+- name: Run Kilo Code
+  run: |
+      echo "Implement the new feature" | kilocode --auto --timeout 600
+```
+
+## Local Development
+
+### DevTools
+
+In order to run the CLI with devtools, add `DEV=true` to your `pnpm start` command, and then run `npx react-devtools` to show the devtools inspector.

+ 13 - 3
apps/kilocode-docs/docs/faq.md

@@ -41,11 +41,21 @@ Kilo Code can help with a variety of coding tasks, including:
 
 ### Is Kilo Code free to use?
 
-The Kilo Code extension itself is free and open-source. If you're looking to earn some credits, you could join our <a href={DISCORD_URL} target='_blank'>Discord</a> where we sometimes have promotional offers!
+The Kilo Code extension itself is free and open-source. In order for Kilo Code to be useful, you need an AI model to respond to your queries. Models are hosted by providers and most charge for access.
 
-After that, you can add a credit card to buy more tokens (securely processed through Stripe. Our pricing matches Anthropic's API rates exactly. We don't take any cut, either per token or per top-up. In the future we'll add more LLM providers.
+There are some models available for free. The set of free models if constantly changing based on provider pricing decisions.
 
-Alternatively, you can "Bring Your Own API" (like [Anthropic](providers/anthropic), [OpenAI](providers/openai), [OpenRouter](providers/openrouter), [Requesty](providers/requesty), etc.) for its AI capabilities. These providers typically charge for API usage based on the number of tokens processed. You will need to create an account and obtain an API key from your chosen provider. See [Setting Up Your First AI Provider](getting-started/connecting-api-provider) for details.
+You can also use Kilo Code with a [local model](advanced-usage/local-models) or "Bring Your Own API Key" for [another model provider](getting-started/connecting-api-provider) (like [Anthropic](providers/anthropic), [OpenAI](providers/openai), [OpenRouter](providers/openrouter), [Requesty](providers/requesty), etc.).
+
+### How do I pay for model usage via Kilo Code?
+
+If you choose to pay for models via Kilo Code, you do so by buying Kilo Credits. You can [buy Kilo Credits](basic-usage/adding-credits) securely via Stripe with a credit card. We do not charge a markup on Kilo Credits. $1 you give us is $1 in Kilo Credits.
+
+Model usage is metered by the providers in terms of different kinds of tokens. When you use a model, we debit your Kilo credits by the amount the provider charges us -- with no markup.
+
+You can use any models you like as long as you have credits in your account. When you run out of credits, you can add more. It's that simple!
+
+If you're looking to earn some credits, you could join our <a href={DISCORD_URL} target='_blank'>Discord</a> where we sometimes have promotional offers!
 
 ### What are the risks of using Kilo Code?
 

+ 12 - 2
apps/kilocode-docs/docs/features/experimental/experimental-features.md

@@ -1,8 +1,8 @@
 # Experimental Features
 
-Kilo Code includes experimental features that are still under development.  These features may be unstable, change significantly, or be removed in future versions.  Use them with caution and be aware that they may not work as expected.
+Kilo Code includes experimental features that are still under development. These features may be unstable, change significantly, or be removed in future versions. Use them with caution and be aware that they may not work as expected.
 
-**Warning:** Experimental features may have unexpected behavior, including potential data loss or security vulnerabilities.  Enable them at your own risk.
+**Warning:** Experimental features may have unexpected behavior, including potential data loss or security vulnerabilities. Enable them at your own risk.
 
 ## Enabling Experimental Features
 
@@ -18,10 +18,20 @@ To enable or disable experimental features:
 
 The following experimental features are currently available:
 
+## Native Function Calling
+
+When enabled, native JSON function calling improves reliability via explicit signatures, first‑class schema validation, and better cache hit rates due to normalized structured arguments.
+
+It replaces brittle XML-style prompts that risk mixed prose/markup, missing fields, and regex-heavy cleanup, yielding more deterministic tool use and clearer error handling.
+
+[More Details are available](native-function-calling)
+
 ## Autocomplete
+
 When enabled, Kilo Code will provide inline code suggestions as you type. Currently this requires the Kilo Code API Provider in order to use it.
 
 ## Concurrent file edits
+
 When enabled, Kilo Code can edit multiple files in a single request. When disabled, Kilo Code must edit one file at a time. Disabling this can help when working with less capable models or when you want more control over file modifications.
 
 ### Power Steering

+ 65 - 0
apps/kilocode-docs/docs/features/experimental/native-function-calling.md

@@ -0,0 +1,65 @@
+# Native Function Calling
+
+## Context
+
+Historically, Kilo Code has relied on XML-style function and tool definitions embedded in the system prompt to inform the model about tools available to accomplish tasks. The model was given instructions and examples about how to use these tools:
+
+```xml
+<attempt_completion>
+<reason>Put your reason here</reason>
+</attempt_completion>
+
+Use this tool to signal to the user you are complete.
+```
+
+This technique was originally developed ca. 2023 and used first by Anthropic at scale. It was effective and valuable, because it allowed developers to specify arbitrary tools at runtime, rather than rely on pre-configured options from the model labs.
+
+However, it also suffers from numerous downsides. Its effective replacement is JSON-style native function calls that are sent to the model in a dedicated field and with a strong, easily validated schema.
+
+## What
+
+Kilo Code recently implemented _experimental_ support for native function calling in 4.106.0.
+
+## Why?
+
+1. Native function calling offers stronger reliability than older XML-style patterns because the model is explicitly trained to decide when to call a function and to return only the structured arguments that match a declared signature. This reduces the classic failure modes of XML prompts, where the model might interleave prose with markup, drop required fields, or hallucinate tag structures. With native calls, the function signature acts as a contract; the model returns arguments for that contract instead of free‑form text, which materially improves call success rates and downstream determinism.
+
+2. Schema validation becomes first‑class with native function calls. Rather than embedding schemas in prompts and hoping the model adheres, we register a JSON‑schema‑like parameter definition alongside the function. The model’s output is constrained to those types and enums, enabling straightforward server‑side validation and clearer error handling and retries. In practice, this eliminates much of the brittle regex and heuristic cleanup common with XML prompts, and allows us to implement robust “validate → correct → retry” loops tied to explicit parameter constraints.
+
+3. Finally, native function calls can improve cache effectiveness and throughput. Because arguments are structured and validated, equivalent calls normalize to the same payload more often than semantically similar but syntactically different XML blobs. That normalization increases cache hit rates across identical tool invocations, reducing latency and cost, and making end‑to‑end behavior more predictable when chaining multiple tools or working across providers. While XML calling can achieve 80-85% input token cache hit rates on modern models like GPT-5, native function calling can increase that to 90%+, while also achieving the stronger reliability described above.
+
+## Downsides
+
+There are a few considerations and challenges.
+
+1. Model Compatability: Not all models are trained for native function calling, especially small models below 4-7B parameters. That being said, the vast majority of models, both open and closed, released since June 2025 _do_ support native function calls.
+2. Provider Compatability: There are many OpenAI "compliant" providers on the market, using a variety of tools to support their products (often vLLM, SGLang, TensorRT-LLM). Beyond that are numerous local model tools (LM Studio, Ollama, Osaurus). Despite claiming compatability with the OpenAI API specification, its common to see partial or outright incorrect implementations.
+
+Because of these risks and considerations, this capability is experiment, and off by default for nearly all models and providers.
+
+## Use
+
+To enable and use native function calling, consider and perform the following:
+
+1. Ensure you are using a provider that has been enabled in Kilo Code for this experiment. As of Oct 16, 2025, they include:
+
+- OpenRouter
+- Kilo Code
+- LM Studio
+- OpenAI Compatible
+
+By default, native function calling is _disabled_ for most models. Should you wish to try it, open the Advanced settings for a given provider profile that is included in the testing group.
+
+Change the Tool Calling Style to `JSON`, and save the profile.
+
+## Caveats
+
+This feature is currently experimental and mostly intended for users interested in contributing to its development.
+It is so far only supported when using OpenRouter or Kilo Code providers. There are possible issues including, but not limited to:
+
+- Missing tools
+- Tools calls not updating the UI until they are complete
+- MCP servers not working
+- Errors specific to certain inference providers
+
+While nearly any provider can be configured via the OpenAI Compatible profile, testers should be aware that this is enabled purely for ease of testing and should be prepared to experience unexpected responses from providers that are not prepared to handle native function calls.

+ 8 - 2
apps/kilocode-docs/docs/seats/about.md

@@ -8,9 +8,15 @@ Kilo Code accelerates development with AI-driven code generation and task automa
 
 Organizations adopting AI accelerated coding at scale often want a better way to monitor, manage, and collaborate on their AI-drive practices.
 
-Kilo Code Seats, available via either the Teams or Enterprise subscriptions, are the solution for these organizations.
+Kilo Code seats, available via either the Teams or Enterprise subscriptions, are the solution for these organizations.
 
-Kilo Code seats are **billed separately** from credits for using models via the Kilo Code provider
+:::note
+
+Kilo Code seats purchases of Teams or Enterprise are separate from model provider credits.
+
+No credits are included with a Teams or Enterprise purchase.
+
+:::
 
 ## What You Get from Teams
 

+ 27 - 3
apps/kilocode-docs/docs/seats/analytics.md

@@ -4,7 +4,7 @@ sidebar_label: Usage Analytics & Reporting
 
 # Usage Analytics & Reporting
 
-Using Kilo Seats with an Enterprise or Teams subscription provides detailed usage analytics to help you monitor and understand your organization’s AI usage patterns, costs, and activity through the Kilo Code API provider.
+Using Kilo seats with an Enterprise or Teams subscription provides detailed usage analytics to help you monitor and understand your organization’s AI usage patterns, costs, and activity through the Kilo Code API provider.
 
 ## Analytics Dashboard Overview
 
@@ -73,7 +73,31 @@ Click on any row to expand and see which specific team members used that model o
 
 ### By Project View
 
-You can also view usage **by project**, which is automatically pulled from the repository name. Alternatively, you can configure or override the project name at the repository level via the `.kilocode/config.json` file.
+You can also view usage **by project**.
+
+Project names are automatically parsed from the project's `.git/config` for the remote named `origin` (if there is one).
+
+For example, if the following were in your `.git/config`:
+
+```bash
+[remote "origin"]
+    url = [email protected]:example-co/example-repo.git
+    fetch = +refs/heads/*:refs/remotes/origin/*
+```
+
+The project name would be `example-repo`.
+
+You can also manually override the project name in the `.kilocode/config.json` file in your project.
+
+To set the project identifier to `my-project`, create a `.kilocode/config.json` file with the following contents:
+
+```json
+{
+	"project": {
+		"id": "my-project"
+	}
+}
+```
 
 ## Understanding the Data
 
@@ -105,6 +129,6 @@ All costs are displayed in USD with detailed precision, helping you:
 ## Next Steps
 
 - [Manage team billing settings](/seats/billing)
-- [Configure team roles and permissions](/seats/roles-permissions)
+- [Configure team roles and permissions](/seats/team-management)
 
 The usage analytics provide the insights needed to optimize your team's AI usage while maintaining visibility into costs and activity patterns.

+ 31 - 73
apps/kilocode-docs/docs/seats/billing.md

@@ -1,37 +1,28 @@
 ---
-sidebar_label: Billing & Credits
+sidebar_label: Billing & Kilo Credits
 ---
 
-# Billing & Credits
+# Billing & Kilo Credits
 
-Kilo Seats uses a transparent, two-part billing system: a monthly subscription per seat, plus pay-as-you-go AI credits with zero markup.
+Kilo seats uses a transparent, two-part billing system: a monthly subscription per seat, plus pay-as-you-go Kilo credits with zero markup.
 
-## Understanding the Billing Model
+:::note
 
-### Monthly Subscription
+Kilo Code seats purchases of Teams or Enterprise are separate from Kilo credits.
 
-**Enterprise:**
+No Kilo credits are included with a Teams or Enterprise purchase.
 
-- **$299 per user per month** for platform access
-- Billed on your signup anniversary
-- **Includes** dashboard access, team management, model limitation, SSO, and all platform features
+:::
 
-**Teams:**
+## Organization Credits
 
-- **$29 per user per month** for platform access
-- Billed monthly on your signup anniversary
-- Includes dashboard access, team management, and all platform features
+Organization Owners can purchase Kilo credits on the [Organization dashboard](https://app.kilocode.ai).
 
-### AI Credits System
+Organization credits are purchased on behalf of all users in the organization. Every member of the organization can use the credits in the organization's balance with the Kilo Code model provider.
 
-- **Pay exactly what AI providers charge** - no markup
-- **Pre-purchase credits** to fund AI requests
-- **Real-time deduction** as your team uses AI models
-- **Transparent pricing** - see exact provider costs
+Using organization credits works exactly like spending [individual credits](/basic-usage/adding-credits), except that the credits come from the organization's credit balance, rather than the individuals.
 
-## How AI Credits Work
-
-### Credit Purchase Process
+### Buying Organization Credits
 
 1. **Navigate to Organization tab** in dashboard
 2. **Click "Buy More Credits"**
@@ -39,14 +30,23 @@ Kilo Seats uses a transparent, two-part billing system: a monthly subscription p
 4. **Complete payment** using saved payment method
 5. **Credits available immediately** for team use
 
-### Credit Consumption
+### Using Organization Credits
+
+Organization members can use organization credits by choosing the correct organization profile in the dropdown in the Profiles tab of the Kilo Code extension.
+
+<img src="/docs/img/teams/org_credits.png" alt="Dropdown showing different organizations available" width="600" />
+
+## Managing Seats Subscriptions
+
+In order to add Members to your Kilo Code Organization, you must have seat(s) available for them.
 
-- **Per-request billing** - pay only for what you use
-- **Model-specific rates** - different models have different costs
-- **Token-based pricing** - input and output tokens counted separately
-- **Real-time tracking** - see costs as requests happen
+You can purchase more seats at any time during your billing cycle and will pay a pro-rated amount for the number of days left in your billing cycle.
 
-## Subscription Management
+You can remove empty seats at any time. Your next payment will reflect the smaller number of seats.
+
+Your next billing date will not change.
+
+To fill empty seats or remove members ahead of seat deletion, see the [team management](/seats/team-management) page.
 
 ### Adding Seats
 
@@ -63,51 +63,11 @@ Kilo Seats uses a transparent, two-part billing system: a monthly subscription p
 3. **Select seats to remove** (must remove team members first)
 4. **Confirm reduction**
 
-### Pro-Rating Calculations
-
-- **Adding seats mid-cycle:** Pay proportional amount for remaining days
-- **Removing seats mid-cycle:** Seat change will start at the next billing cycle
-- **Billing date remains the same** regardless of seat changes
-- **Next full cycle** reflects new seat count
-
-## Invoice Management
-
-### Periodic Invoices
+To fill empty seats or remove members ahead of seat deletion, see the [team management](/seats/team-management) page.
 
-Each invoice includes:
+## Invoiceas
 
-- **Subscription charges** for all seats
-- **AI credit purchases** during billing period
-- **Tax calculations** based on your location
-- **Payment method** used for charges
-- **Detailed line items** for transparency
-
-### Downloading Invoices
-
-1. **Access Billing tab**
-2. **Find desired invoice** in history
-3. **Click "Download PDF"**
-4. **Save for expense reporting**
-
-## Billing Troubleshooting
-
-### Failed Payments
-
-If a payment fails:
-
-1. **Check payment method** validity (expiration, limits)
-2. **Update payment information** if needed
-3. **Retry payment** manually in dashboard
-4. **Contact support** if issues persist
-
-### Billing Disputes
-
-For billing questions:
-
-1. **Review invoice details** in dashboard
-2. **Check usage analytics** for the billing period
-3. **Contact support** with specific questions
-4. **Provide invoice number** and dispute details
+Invoices for any payment on the Kilo Code platform, for seats or credits, will be available in the Invoices tab.
 
 ### Service Suspension
 
@@ -121,7 +81,5 @@ If payment fails repeatedly:
 ## Next Steps
 
 - [Explore usage analytics](/seats/analytics)
-- [Learn about team roles and permissions](/seats/roles-permissions)
+- [Learn about team roles and permissions](/seats/team-management)
 - [Learn about team management](/seats/team-management)
-
-Transparent billing ensures you always know exactly what you're paying for, with no hidden fees or surprise charges.

+ 1 - 1
apps/kilocode-docs/docs/seats/dashboard.md

@@ -4,7 +4,7 @@ sidebar_label: Dashboard Overview
 
 # Seats Dashboard
 
-The Kilo Seats dashboard is the first screen that comes up when you visit [the Kilo Code web app](https://app.kilocode.ai). It provides complete visibility into your team's AI usage, costs, and management.
+The Kilo seats dashboard is the first screen that comes up when you visit [the Kilo Code web app](https://app.kilocode.ai). It provides complete visibility into your team's AI usage, costs, and management.
 
 <center>
 <img src="/docs/img/teams/dashboard.png" alt="Invite your team members" width="700" />

+ 1 - 1
apps/kilocode-docs/docs/seats/enterprise/SSO.md

@@ -27,7 +27,7 @@ You’ll need:
 Find the Single Sign-On (SSO) Configuration panel, and click "Set up SSO":
 <img width="822" height="288" alt="Set-up-SSO screen" src="https://github.com/user-attachments/assets/b6ca5f83-4533-4d41-bcb1-0038b645c030" />
 
-### 2. Submit the SSO Request Form:
+### 2. Submit the SSO Request Form
 
 Fill in your contact information and someone from our team will reach out soon to help you configure SSO.
 

+ 11 - 1
apps/kilocode-docs/docs/seats/enterprise/audit-logs.md

@@ -10,7 +10,7 @@ Owners and Admins can search and filter logs to review access patterns and ensur
 
 ## Viewing Audit Logs
 
-Only **Admins** and **Owners** can view and filter through logs.
+Only **Owners** can view and filter through logs.
 
 Go to **Enterprise Dashboard → Audit Logs** to view a searchable history of all organization events.
 Use filters to narrow down results by action, user, or date range.
@@ -37,3 +37,13 @@ Each event includes:
 | **Action**  | The event type (e.g. `user.login`, `settings.change`).                          |
 | **Actor**   | The user who performed the action.                                              |
 | **Details** | Context or additional data related to the event (e.g. models added or removed). |
+
+## Logged Events
+
+Here is the list of all events included in the Kilo Code audit logs:
+
+- Organization: Create, Settings Change, Purchase Credits
+- Organization Member: Remove, Change Role
+- User: Login, Logout, Accept Invite, Send Invite, Revoke Invite
+- [Custom Modes](/seats/custom-modes): Create, Update, Delete
+- [SSO](/seats/enterprise/SSO) (Enterprise Only): Auto Provision, Set Domain, Remove Domain

+ 3 - 3
apps/kilocode-docs/docs/seats/getting-started.md

@@ -4,7 +4,7 @@ sidebar_label: Getting Started
 
 # Get Started with Kilo Seats in 10 Minutes
 
-Seats for Kilo in the Teams or Enterprise subscription brings transparent AI coding to your entire engineering organization. No markup on AI costs, no vendor lock-in, complete usage visibility.
+seats for Kilo in the Teams or Enterprise subscription brings transparent AI coding to your entire engineering organization. No markup on AI costs, no vendor lock-in, complete usage visibility.
 
 ## Before You Begin
 
@@ -71,10 +71,10 @@ Team members receive invitation emails with these steps:
 
 ## Getting Support
 
-You can find the dedicated Teams support methods directly on your Organaization's page.
+You can find the dedicated Teams support methods directly on your Organization's page.
 
 ## Next Steps
 
-- [Learn about team roles and permissions](/seats/roles-permissions)
+- [Learn about team roles and permissions](/seats/team-management)
 - [Explore the dashboard features](/seats/dashboard)
 - [Set up team management policies](/seats/team-management)

+ 0 - 184
apps/kilocode-docs/docs/seats/roles-permissions.md

@@ -1,184 +0,0 @@
----
-sidebar_label: Enterprise Roles & Permissions
----
-
-# Enterprise Roles & Permissions
-
-Kilo Seats (both Teams & Enterprise) uses a three-tier role system designed for clear responsibility separation and secure team management.
-
-## Role Overview
-
-Every member has one of three roles that determine their access level and capabilities within your organization.
-
-### Owner
-
-**Full administrative control** - The person who created the organization or was promoted by another owner.
-
-**Key Responsibilities:**
-
-- Financial management and billing oversight
-- Strategic team planning and seat allocation
-- Ultimate security and compliance authority
-- Model/provider limitation and selection
-
-### Admin
-
-**Team management without financial access** - Trusted team leads who manage day-to-day operations.
-
-**Key Responsibilities:**
-
-- Team member onboarding and management
-- Usage monitoring and optimization
-- Policy enforcement and compliance
-
-### Member
-
-**Standard usage access** - Individual contributors who use Kilo Code for development work.
-
-**Key Responsibilities:**
-
-- Personal usage monitoring
-- Following team policies and guidelines
-- Productive AI-assisted development
-
-## Detailed Permissions Matrix
-
-| Capability                       | Owner | Admin          | Member |
-| -------------------------------- | ----- | -------------- | ------ |
-| **Financial Management**         |
-| Purchase AI credits              | ✅    | ❌             | ❌     |
-| View billing history             | ✅    | ✅ (read-only) | ❌     |
-| Manage payment methods           | ✅    | ❌             | ❌     |
-| Download invoices                | ✅    | ✅             | ❌     |
-| **Team Management**              |
-| Add/remove members               | ✅    | ✅             | ❌     |
-| Change member roles              | ✅    | ✅\*           | ❌     |
-| Manage seat count                | ✅    | ❌             | ❌     |
-| View team composition            | ✅    | ✅             | ✅     |
-| View audit logs                  | ✅    | ✅             | ✅     |
-| **Usage Controls**               |
-| Model/provider limitation        | ✅    | ✅             | ❌     |
-| Set daily usage limits           | ✅    | ✅             | ❌     |
-| View all usage statistics        | ✅    | ✅             | ❌     |
-| View personal usage              | ✅    | ✅             | ✅     |
-| **Security & Compliance**        |
-| Control data collection policies | ✅    | ✅             | ❌     |
-| Manage model access permissions  | ✅    | ✅             | ❌     |
-| Configure SSO settings           | ✅    | ✅             | ❌     |
-| **Development Access**           |
-| Use AI coding assistance         | ✅    | ✅             | ✅     |
-| Access all enabled models        | ✅    | ✅             | ✅     |
-| Personal settings management     | ✅    | ✅             | ✅     |
-
-\*Admins can change roles for other members and admins, but cannot promote/demote owners.
-
-## Role Assignment Best Practices
-
-### Choose Owners Carefully
-
-- Limit to 1-2 people maximum
-- Select individuals with financial authority
-- Ensure owners understand billing implications
-- Consider succession planning
-
-### Leverage Admin Role
-
-- Assign to team leads and senior developers
-- Perfect for those managing development workflows
-- Ideal for compliance officers or security leads
-- Use for people who need visibility without financial access
-
-### Member Role for Most Users
-
-- Default role for individual contributors
-- Appropriate for contractors and temporary team members
-- Suitable for junior developers learning the platform
-- Best for users who only need coding assistance
-
-## Changing Roles
-
-### Promoting Members
-
-1. Navigate to **Organization** tab
-2. Find the team member in the list
-3. Click the role dropdown next to their name
-4. Select the new role
-5. Confirm the change
-
-### Role Change Limitations
-
-- Only owners can promote other owners
-- Admins cannot change owner roles
-- Role changes take effect immediately
-- Members are notified of role changes via email
-
-## Security Considerations
-
-### Owner Security
-
-- Enable two-factor authentication
-- Use strong, unique passwords
-- Regularly review team access
-- Monitor billing for unusual activity
-
-### Admin Oversight
-
-- Admins should regularly audit usage
-- Review and update usage limits quarterly
-- Monitor for policy violations
-- Ensure compliance with data policies
-
-### Member Guidelines
-
-- Members should report suspicious activity
-- Follow organization data policies
-- Use AI assistance responsibly
-- Report technical issues promptly
-
-## Common Role Scenarios
-
-### Small Team (2-5 people)
-
-- **1 Owner:** Founder or technical lead
-- **1 Admin:** Senior developer or team lead
-- **2-3 Members:** Individual contributors
-
-### Medium Team (6-20 people)
-
-- **1-2 Owners:** CTO and engineering manager
-- **2-3 Admins:** Team leads and senior developers
-- **15+ Members:** Individual contributors and junior developers
-
-### Large Team (20+ people)
-
-- **2 Owners:** CTO and VP of Engineering
-- **4-6 Admins:** Team leads, security officer, compliance manager
-- **20+ Members:** All other developers and contributors
-
-## Troubleshooting Role Issues
-
-### Can't Change Someone's Role
-
-- Verify you have sufficient permissions (Owner or Admin)
-- Check if you're trying to modify an Owner (only Owners can do this)
-- Ensure the person is still an active team member
-
-### Missing Permissions
-
-- Confirm your current role in the Organization tab
-- Contact an Owner or Admin if you need elevated access
-- Check if your role was recently changed
-
-### Billing Access Issues
-
-- Only Owners can manage billing and payments
-- Admins can view billing history but cannot make changes
-- Contact an Owner for billing-related requests
-
-## Next Steps
-
-- [Learn about dashboard features](/seats/dashboard)
-- [Set up team management policies](/seats/team-management)
-- [Configure billing and credits](/seats/billing)
-
-Understanding roles and permissions ensures your team operates securely and efficiently with clear accountability.

+ 17 - 121
apps/kilocode-docs/docs/seats/team-management.md

@@ -4,80 +4,25 @@ sidebar_label: Managing Your Team
 
 # Managing Your Team
 
-Effective team management in Kilo for Enterprise ensures optimal AI usage, cost control, and smooth collaboration across your engineering organization.
+Every person on the team is an _Owner_ or a _Member_.
 
-## Adding Team Members
+Owners have full administrative oversight including billing, seat allocation, and model/provider selection.
+
+Only Owners can conduct team management activities.
 
-### Invitation Process
+Members can use the Kilo Code extension and see data on the team's usage in the [usage dashboard](/seats/analytics).
+
+## Adding Team Members
 
 1. **Navigate to Organization Tab** in your profile page and click on the team you want to manage
 2. **Click "Invite Member"** button
 3. **Enter the team member's email address**
-4. **Select initial role** (Member, Admin, or Owner)
+4. **Select initial role** (Member or Owner)
 5. Click **Send Invitation**
 
 <img width="619" height="311" alt="invite-member" src="https://github.com/user-attachments/assets/a3ca0391-8a61-457f-b38b-11f03b219b4f" />
 
-<!-- ## Setting Usage Limits
-
-### Daily Spending Limits
-
-Control costs by setting daily limits per user:
-
-1. **Go to Organization tab**
-2. **Find team member** in the list
-3. **Click "Set Limit"** next to their name
-4. **Enter daily dollar amount** (e.g., $10.00)
-5. **Save changes**
-
-### How Limits Work
-
-- **$0 = Unlimited** - No spending restrictions
-- **Soft limits** - Users receive warnings at 80% of limit
-- **Hard limits** - AI requests blocked when limit reached
-- **Daily reset** - Limits reset at midnight UTC
-- **Rollover** - Unused limits don't carry over to next day
-
-### Recommended Limit Guidelines
-
-**Individual Contributors**
-
-- **Junior developers:** $5-10/day
-- **Senior developers:** $10-20/day
-- **Occasional users:** $2-5/day
-
-**Team Leads and Architects**
-
-- **Team leads:** $15-25/day
-- **Architects:** $20-30/day
-- **Heavy users:** $25-50/day
-
-**Special Cases**
-
-- **Demo/training days:** Temporarily increase limits
-- **Hackathons:** Remove limits for event duration
-- **New feature development:** Higher limits for exploration
-
-### Monitoring Usage Patterns
-
-Track team usage to optimize limits:
-
-- **Weekly usage reports** show actual consumption
-- **Peak usage days** help identify patterns
-- **Model preferences** affect cost per request
-- **Task complexity** influences daily needs -->
-
-## Managing Team Composition
-
-### Viewing Team Status
-
-The Organization tab shows:
-
-- **Active members** with last activity
-- **Pending invitations** awaiting acceptance
-- **Role distribution** across the team
-
-### Removing Team Members
+## Removing Team Members
 
 When team members leave:
 
@@ -87,77 +32,28 @@ When team members leave:
 4. **Confirm removal**
 5. **Seat becomes available** immediately
 
-### Role Changes
+## Changing Team Member Roles
 
 Promote or demote team members as needed:
 
 1. **Locate team member** in Organization tab
 2. **Click role dropdown** next to their name
-3. **Select new role** (Member, Admin, Owner)
+3. **Select new role** (Member, Owner)
 4. **Confirm change**
 5. **Member receives email notification**
 
-### Cost Optimization Strategies
-
-**Model Selection**
-
-- Set cost-effective model limitations on the Model Access page
-- Recommend cheaper models for simple tasks
-- Reserve expensive models for complex problems
-- Monitor model performance vs. cost
-
-**Usage Patterns**
-
-- Identify peak usage times
-- Batch similar requests when possible
-- Avoid redundant AI requests
-- Share solutions across team members
-
-**Limit Adjustments**
-
-- Regularly review and adjust individual limits
-- Increase limits for high-value activities
-- Decrease limits for occasional users
-- Set temporary limits for special projects
-
-## Troubleshooting Common Issues
-
-### Invitation Problems
-
-**Invitations Not Received**
-
-- Check spam/junk folders
-- Verify email address spelling
-- Resend invitation after 24 hours
-- Contact support if persistent issues
-
-**Can't Accept Invitation**
-
-- Ensure using correct email address
-- Clear browser cache and cookies
-- Try different browser or incognito mode
-- Check for corporate firewall restrictions
-
-### Access Issues
-
-**Member Can't Access Dashboard**
-
-- Verify they accepted the invitation
-- Check their role permissions
-- Ensure they're using invited email address
-- Confirm organization membership
+### Viewing Team Status
 
-**Usage Limits Not Working**
+The Organization tab shows:
 
-- Verify limits are set correctly
-- Check timezone differences (limits reset at UTC midnight)
-- Confirm user is within their role permissions
-- Review recent usage in dashboard
+- **Active members** with last activity
+- **Pending invitations** awaiting acceptance
+- **Role distribution** across the team
 
 ## Next Steps
 
 - [Understand billing and credits](/seats/billing)
 - [Explore usage analytics](/seats/analytics)
-- [Learn about team roles and permissions](/seats/roles-permissions)
+- [Learn about team roles and permissions](/seats/team-management)
 
 Effective team management ensures your organization maximizes the benefits of AI-assisted development while maintaining cost control and security.

+ 267 - 254
apps/kilocode-docs/docusaurus.config.ts

@@ -1,269 +1,282 @@
-import {themes as prismThemes} from 'prism-react-renderer';
-import type {Config} from '@docusaurus/types';
-import type * as Preset from '@docusaurus/preset-classic';
+import { themes as prismThemes } from "prism-react-renderer"
+import type { Config } from "@docusaurus/types"
+import type * as Preset from "@docusaurus/preset-classic"
 import {
-  DISCORD_URL,
-  REDDIT_URL,
-  TWITTER_URL,
-  GITHUB_MAIN_REPO_URL,
-  GITHUB_ISSUES_MAIN_URL,
-  GITHUB_FEATURES_URL,
-  VSCODE_MARKETPLACE_URL,
-  OPEN_VSX_URL,
-  CONTACT_EMAIL,
-  CAREERS_URL,
-  WEBSITE_PRIVACY_URL,
-  EXTENSION_PRIVACY_URL,
-  GITHUB_REPO_URL
-} from './src/constants';
+	DISCORD_URL,
+	REDDIT_URL,
+	TWITTER_URL,
+	GITHUB_MAIN_REPO_URL,
+	GITHUB_ISSUES_MAIN_URL,
+	GITHUB_FEATURES_URL,
+	VSCODE_MARKETPLACE_URL,
+	OPEN_VSX_URL,
+	CONTACT_EMAIL,
+	CAREERS_URL,
+	WEBSITE_PRIVACY_URL,
+	EXTENSION_PRIVACY_URL,
+	GITHUB_REPO_URL,
+} from "./src/constants"
 
 // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
 
 const config: Config = {
-  title: 'Kilo Code Docs',
-  tagline: 'Kilo Code Documentation',
-  favicon: 'img/favicon.ico',
+	title: "Kilo Code Docs",
+	tagline: "Kilo Code Documentation",
+	favicon: "img/favicon.ico",
 
-  // Set the production url of your site here
-  url: 'https://kilocode.ai',
-  // Set the /<baseUrl>/ pathname under which your site is served
-  // For GitHub pages deployment, it is often '/<projectName>/'
-  baseUrl: '/docs',
+	// Set the production url of your site here
+	url: "https://kilocode.ai",
+	// Set the /<baseUrl>/ pathname under which your site is served
+	// For GitHub pages deployment, it is often '/<projectName>/'
+	baseUrl: "/docs",
 
-  customFields: {
-    freeTierAmount: process.env.FREE_TIER_AMOUNT || '$20',
-  },
+	customFields: {
+		freeTierAmount: process.env.FREE_TIER_AMOUNT || "$20",
+	},
 
+	onBrokenLinks: "throw",
+	onBrokenMarkdownLinks: "warn",
 
-  onBrokenLinks: 'throw',
-  onBrokenMarkdownLinks: 'warn',
+	// Even if you don't use internationalization, you can use this field to set
+	// useful metadata like html lang. For example, if your site is Chinese, you
+	// may want to replace "en" with "zh-Hans".
+	i18n: {
+		defaultLocale: "en",
+		locales: ["en", "zh-CN"],
+	},
 
-  // Even if you don't use internationalization, you can use this field to set
-  // useful metadata like html lang. For example, if your site is Chinese, you
-  // may want to replace "en" with "zh-Hans".
-  i18n: {
-    defaultLocale: 'en',
-    locales: ['en', 'zh-CN'],
-  },
+	presets: [
+		[
+			"classic",
+			{
+				docs: {
+					sidebarPath: "./sidebars.ts",
+					routeBasePath: "/",
+					editUrl: `${GITHUB_REPO_URL}/edit/main/`,
+					showLastUpdateTime: true,
+				},
+				blog: false, // Disable blog feature
+				sitemap: {
+					lastmod: "date",
+					priority: null,
+					changefreq: null,
+				},
+				theme: {
+					customCss: "./src/css/custom.css",
+				},
+			} satisfies Preset.Options,
+		],
+	],
 
-  presets: [
-    [
-      'classic',
-      {
-        docs: {
-          sidebarPath: './sidebars.ts',
-          routeBasePath: '/',
-          editUrl: `${GITHUB_REPO_URL}/edit/main/`,
-          showLastUpdateTime: true,
-        },
-        blog: false, // Disable blog feature
-        sitemap: {
-          lastmod: 'date',
-          priority: null,
-          changefreq: null,
-        },
-        theme: {
-          customCss: './src/css/custom.css',
-        },
-      } satisfies Preset.Options,
-    ],
-  ],
+	themes: [
+		[
+			require.resolve("@easyops-cn/docusaurus-search-local"),
+			{
+				hashed: true,
+				language: ["en"],
+				highlightSearchTermsOnTargetPage: false,
+				explicitSearchResultPath: true,
+				docsRouteBasePath: "/",
+			},
+		],
+	],
 
-  themes: [
-    [
-      require.resolve("@easyops-cn/docusaurus-search-local"),
-      {
-        hashed: true,
-        language: ["en"],
-        highlightSearchTermsOnTargetPage: false,
-        explicitSearchResultPath: true,
-        docsRouteBasePath: "/",
-      },
-    ],
-  ],
+	plugins: [
+		...(process.env.POSTHOG_API_KEY
+			? [
+					[
+						"posthog-docusaurus",
+						{
+							apiKey: process.env.POSTHOG_API_KEY,
+							appUrl: "https://us.i.posthog.com",
+							enableInDevelopment: true,
+						},
+					],
+				]
+			: []),
+		[
+			"@docusaurus/plugin-client-redirects",
+			{
+				redirects: [
+					// Files moved from advanced-usage to features
+					{
+						to: "/features/checkpoints",
+						from: ["/advanced-usage/checkpoints"],
+					},
+					{
+						to: "/features/code-actions",
+						from: ["/advanced-usage/code-actions"],
+					},
+					{
+						to: "/advanced-usage/custom-instructions",
+						from: ["/features/custom-instructions"],
+					},
+					{
+						to: "/features/custom-modes",
+						from: ["/advanced-usage/custom-modes"],
+					},
+					{
+						to: "/features/enhance-prompt",
+						from: ["/advanced-usage/enhance-prompt"],
+					},
+					{
+						to: "/features/experimental/experimental-features",
+						from: ["/advanced-usage/experimental-features"],
+					},
+					{
+						to: "/features/model-temperature",
+						from: ["/advanced-usage/model-temperature"],
+					},
+					{
+						to: "/features/auto-approving-actions",
+						from: ["/advanced-usage/auto-approving-actions"],
+					},
+					{
+						to: "/features/api-configuration-profiles",
+						from: ["/advanced-usage/api-configuration-profiles"],
+					},
 
-  plugins: [
-    ...(process.env.POSTHOG_API_KEY ? [
-      [
-        "posthog-docusaurus",
-        {
-          apiKey: process.env.POSTHOG_API_KEY,
-          appUrl: "https://us.i.posthog.com",
-          enableInDevelopment: true,
-        },
-      ],
-    ] : []),
-    [
-      '@docusaurus/plugin-client-redirects',
-      {
-        redirects: [
-          // Files moved from advanced-usage to features
-          {
-            to: '/features/checkpoints',
-            from: ['/advanced-usage/checkpoints'],
-          },
-          {
-            to: '/features/code-actions',
-            from: ['/advanced-usage/code-actions'],
-          },
-          {
-            to: '/advanced-usage/custom-instructions',
-            from: ['/features/custom-instructions'],
-          },
-          {
-            to: '/features/custom-modes',
-            from: ['/advanced-usage/custom-modes'],
-          },
-          {
-            to: '/features/enhance-prompt',
-            from: ['/advanced-usage/enhance-prompt'],
-          },
-          {
-            to: '/features/experimental/experimental-features',
-            from: ['/advanced-usage/experimental-features'],
-          },
-          {
-            to: '/features/model-temperature',
-            from: ['/advanced-usage/model-temperature'],
-          },
-          {
-            to: '/features/auto-approving-actions',
-            from: ['/advanced-usage/auto-approving-actions'],
-          },
-          {
-            to: '/features/api-configuration-profiles',
-            from: ['/advanced-usage/api-configuration-profiles'],
-          },
-          
-          // MCP related redirects
-          {
-            to: '/features/mcp/overview',
-            from: ['/advanced-usage/mcp', '/mcp/overview'],
-          },
-          {
-            to: '/features/mcp/using-mcp-in-kilo-code',
-            from: ['/mcp/using-mcp-in-kilo-code'],
-          },
-          {
-            to: '/features/mcp/what-is-mcp',
-            from: ['/mcp/what-is-mcp'],
-          },
-          {
-            to: '/features/mcp/server-transports',
-            from: ['/mcp/server-transports'],
-          },
-          {
-            to: '/features/mcp/mcp-vs-api',
-            from: ['/mcp/mcp-vs-api'],
-          },
-        ],
-      },
-    ],
-  ],
+					// MCP related redirects
+					{
+						to: "/features/mcp/overview",
+						from: ["/advanced-usage/mcp", "/mcp/overview"],
+					},
+					{
+						to: "/features/mcp/using-mcp-in-kilo-code",
+						from: ["/mcp/using-mcp-in-kilo-code"],
+					},
+					{
+						to: "/features/mcp/what-is-mcp",
+						from: ["/mcp/what-is-mcp"],
+					},
+					{
+						to: "/features/mcp/server-transports",
+						from: ["/mcp/server-transports"],
+					},
+					{
+						to: "/features/mcp/mcp-vs-api",
+						from: ["/mcp/mcp-vs-api"],
+					},
 
-  themeConfig: {
-    image: 'img/kilo-v1.svg',
-    navbar: {
-      title: 'Kilo Code',
-      logo: {
-        alt: 'Kilo Code Logo',
-        src: 'img/kilo-v1.svg',
-        srcDark: 'img/kilo-v1-white.svg',
-        href: '/',
-        target: '_self'
-      },
-      items: [
-        {
-          href: GITHUB_MAIN_REPO_URL,
-          label: 'GitHub',
-          position: 'right',
-        },
-        {
-          href: VSCODE_MARKETPLACE_URL,
-          label: 'Install Extension',
-          position: 'right',
-        },
-        {
-          type: 'localeDropdown',
-          position: 'right',
-        },
-      ],
-    },
-    footer: {
-      style: 'dark',
-      links: [
-        {
-          title: 'Community',
-          items: [
-            {
-              label: 'Discord',
-              href: DISCORD_URL,
-            },
-            {
-              label: 'Reddit',
-              href: REDDIT_URL,
-            },
-            {
-              label: 'Twitter',
-              href: TWITTER_URL,
-            },
-          ],
-        },
-        {
-          title: 'GitHub',
-          items: [
-            {
-              label: 'Issues',
-              href: GITHUB_ISSUES_MAIN_URL,
-            },
-            {
-              label: 'Feature Requests',
-              href: GITHUB_FEATURES_URL,
-            },
-          ],
-        },
-        {
-          title: 'Download',
-          items: [
-            {
-              label: 'VS Code Marketplace',
-              href: VSCODE_MARKETPLACE_URL,
-            },
-            {
-              label: 'Open VSX Registry',
-              href: OPEN_VSX_URL,
-            },
-          ],
-        },
-        {
-          title: 'Company',
-          items: [
-            {
-              label: 'Contact',
-              href: CONTACT_EMAIL,
-              target: '_self',
-            },
-            {
-              label: 'Careers',
-              href: CAREERS_URL,
-            },
-            {
-              label: 'Website Privacy Policy',
-              href: WEBSITE_PRIVACY_URL,
-            },
-            {
-              label: 'Extension Privacy Policy',
-              href: EXTENSION_PRIVACY_URL,
-            },
-          ],
-        },
-      ],
-    },
-    prism: {
-      theme: prismThemes.github,
-      darkTheme: prismThemes.dracula,
-    },
-  } satisfies Preset.ThemeConfig,
-};
+					// Deleted seats page
+					{
+						to: "/seats/team-management",
+						from: ["/seats/team-management"],
+					},
 
-export default config;
+					// Kilo credits, not tokens
+					{
+						to: "/basic-usage/adding-credits",
+						from: ["/basic-usage/adding-tokens"],
+					},
+				],
+			},
+		],
+	],
+
+	themeConfig: {
+		image: "img/kilo-v1.svg",
+		navbar: {
+			title: "Kilo Code",
+			logo: {
+				alt: "Kilo Code Logo",
+				src: "img/kilo-v1.svg",
+				srcDark: "img/kilo-v1-white.svg",
+				href: "/",
+				target: "_self",
+			},
+			items: [
+				{
+					href: GITHUB_MAIN_REPO_URL,
+					label: "GitHub",
+					position: "right",
+				},
+				{
+					href: VSCODE_MARKETPLACE_URL,
+					label: "Install Extension",
+					position: "right",
+				},
+				{
+					type: "localeDropdown",
+					position: "right",
+				},
+			],
+		},
+		footer: {
+			style: "dark",
+			links: [
+				{
+					title: "Community",
+					items: [
+						{
+							label: "Discord",
+							href: DISCORD_URL,
+						},
+						{
+							label: "Reddit",
+							href: REDDIT_URL,
+						},
+						{
+							label: "Twitter",
+							href: TWITTER_URL,
+						},
+					],
+				},
+				{
+					title: "GitHub",
+					items: [
+						{
+							label: "Issues",
+							href: GITHUB_ISSUES_MAIN_URL,
+						},
+						{
+							label: "Feature Requests",
+							href: GITHUB_FEATURES_URL,
+						},
+					],
+				},
+				{
+					title: "Download",
+					items: [
+						{
+							label: "VS Code Marketplace",
+							href: VSCODE_MARKETPLACE_URL,
+						},
+						{
+							label: "Open VSX Registry",
+							href: OPEN_VSX_URL,
+						},
+					],
+				},
+				{
+					title: "Company",
+					items: [
+						{
+							label: "Contact",
+							href: CONTACT_EMAIL,
+							target: "_self",
+						},
+						{
+							label: "Careers",
+							href: CAREERS_URL,
+						},
+						{
+							label: "Website Privacy Policy",
+							href: WEBSITE_PRIVACY_URL,
+						},
+						{
+							label: "Extension Privacy Policy",
+							href: EXTENSION_PRIVACY_URL,
+						},
+					],
+				},
+			],
+		},
+		prism: {
+			theme: prismThemes.github,
+			darkTheme: prismThemes.dracula,
+		},
+	} satisfies Preset.ThemeConfig,
+}
+
+export default config

+ 2 - 2
apps/kilocode-docs/sidebars.ts

@@ -81,7 +81,7 @@ const sidebars: SidebarsConfig = {
 						},
 					],
 				},
-				"basic-usage/adding-tokens",
+				"basic-usage/adding-credits",
 			],
 		},
 		{
@@ -105,7 +105,6 @@ const sidebars: SidebarsConfig = {
 				"seats/dashboard",
 				"seats/analytics",
 				"seats/team-management",
-				"seats/roles-permissions",
 				"seats/custom-modes",
 				"seats/billing",
 				{
@@ -202,6 +201,7 @@ const sidebars: SidebarsConfig = {
 				"features/tools/write-to-file",
 			],
 		},
+		"cli",
 	],
 }
 

BIN
apps/kilocode-docs/static/img/teams/org_credits.png


+ 3 - 0
apps/web-roo-code/package.json

@@ -31,7 +31,10 @@
 		"react-cookie-consent": "^9.0.0",
 		"react-dom": "^18.3.1",
 		"react-icons": "^5.5.0",
+		"react-markdown": "^9.0.3",
 		"recharts": "^2.15.3",
+		"rehype-raw": "^7.0.0",
+		"remark-gfm": "^4.0.1",
 		"tailwind-merge": "^3.3.0",
 		"tailwindcss-animate": "^1.0.7",
 		"tldts": "^6.1.86",

BIN
apps/web-roo-code/public/heroes/cloud-screen.png


+ 247 - 0
apps/web-roo-code/src/app/cloud/page.tsx

@@ -0,0 +1,247 @@
+import {
+	ArrowRight,
+	ChartLine,
+	Cloud,
+	Lock,
+	LucideIcon,
+	Megaphone,
+	MessageCircleQuestionMark,
+	ReplaceAll,
+	Router,
+	Share2,
+	Users,
+} from "lucide-react"
+import type { Metadata } from "next"
+
+import { Button } from "@/components/ui"
+import { AnimatedBackground } from "@/components/homepage"
+import { SEO } from "@/lib/seo"
+import { EXTERNAL_LINKS } from "@/lib/constants"
+import Image from "next/image"
+
+const TITLE = "Roo Code Cloud"
+const DESCRIPTION =
+	"Roo Code Cloud gives you and your team the tools to take AI-coding to the next level with cloud agents, remote control, and more."
+const PATH = "/cloud"
+const OG_IMAGE = SEO.ogImage
+
+export const metadata: Metadata = {
+	title: TITLE,
+	description: DESCRIPTION,
+	alternates: {
+		canonical: `${SEO.url}${PATH}`,
+	},
+	openGraph: {
+		title: TITLE,
+		description: DESCRIPTION,
+		url: `${SEO.url}${PATH}`,
+		siteName: SEO.name,
+		images: [
+			{
+				url: OG_IMAGE.url,
+				width: OG_IMAGE.width,
+				height: OG_IMAGE.height,
+				alt: OG_IMAGE.alt,
+			},
+		],
+		locale: SEO.locale,
+		type: "website",
+	},
+	twitter: {
+		card: SEO.twitterCard,
+		title: TITLE,
+		description: DESCRIPTION,
+		images: [OG_IMAGE.url],
+	},
+	keywords: [...SEO.keywords, "cloud", "subscription", "cloud agents", "AI cloud development"],
+}
+
+interface Feature {
+	icon: LucideIcon
+	title: string
+	description: string
+	logos?: string[]
+}
+
+const cloudFeatures: Feature[] = [
+	{
+		icon: Router,
+		title: "Roomote Control",
+		description: "Control your IDE from anywhere and keep coding away from your computer.",
+	},
+	{
+		icon: Cloud,
+		title: "Cloud Agents",
+		description:
+			"Specialized agents running in the Cloud to get stuff done while you sleep, with a credit-based system that doesn't lock you in or dumb your models down.",
+	},
+	{
+		icon: ReplaceAll,
+		title: "Still Model-agnostic",
+		description: "Bring your own provider key — no markup, lock-in, no restrictions.",
+		logos: ["Anthropic", "OpenAI", "Gemini", "Grok", "Qwen", "Kimi", "Mistral", "Ollama"],
+	},
+	{
+		icon: ChartLine,
+		title: "Usage Analytics",
+		description: "Detailed token analytics to help you optimize your costs and usage.",
+	},
+	{
+		icon: Megaphone,
+		title: "Early Model Access",
+		description: "Get early, free access to new, stealth coding models as they become available.",
+	},
+	{
+		icon: Share2,
+		title: "Task Sharing",
+		description: "Share tasks with friends and co-workers and let them follow your work.",
+	},
+	{
+		icon: Users,
+		title: "Team Management",
+		description:
+			"Manage your team and their access to tasks and resources, with centralized billing, analytics and configuration.",
+	},
+	{
+		icon: Lock,
+		title: "Secure and Private",
+		description:
+			"Your data is never used for training, and we're SOC2 Type 2 and GDPR compliant, following state-of-the-art security practices, with deep respect for your IP.",
+	},
+	{
+		icon: MessageCircleQuestionMark,
+		title: "Priority support",
+		description: "Get quick help from the people who know Roo best.",
+	},
+]
+
+// Workaround for next/image choking on these for some reason
+// import screenshotDark from "/public/heroes/cloud-screen.png"
+
+export default function CloudPage() {
+	return (
+		<>
+			<section className="relative flex md:h-[calc(80vh-theme(spacing.12))] items-center overflow-hidden">
+				<AnimatedBackground />
+				<div className="container relative flex items-center h-full z-10 mx-auto px-4 sm:px-6 lg:px-8">
+					<div className="grid h-full relative gap-4 md:gap-0 lg:grid-cols-2">
+						<div className="flex flex-col px-4 justify-center space-y-6 sm:space-y-8">
+							<div>
+								<h1 className="text-4xl font-bold tracking-tight mt-8 text-center md:text-left md:text-4xl lg:text-5xl lg:mt-0">
+									Go <em>way</em> beyond the IDE
+								</h1>
+								<p className="mt-4 max-w-md text-lg text-muted-foreground text-center md:text-left sm:mt-6">
+									Roo Code Cloud gives you (and your team) the tools to take AI-coding to the next
+									level
+								</p>
+							</div>
+							<div className="flex flex-col space-y-3 sm:flex-row sm:space-x-4 sm:space-y-0">
+								<Button
+									variant="outline"
+									size="lg"
+									className="w-full sm:w-auto bg-white/20 dark:bg-white/10 backdrop-blur-sm border border-black/40 dark:border-white/30 hover:border-blue-400 hover:bg-white/30 dark:hover:bg-white/20 hover:shadow-[0_0_20px_rgba(59,130,246,0.5)] transition-all duration-300">
+									<a
+										href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP}
+										target="_blank"
+										rel="noopener noreferrer"
+										className="flex w-full items-center justify-center">
+										Start Free Trial
+										<ArrowRight className="ml-2" />
+									</a>
+								</Button>
+							</div>
+						</div>
+						<div className="flex items-center justify-end mx-auto h-full mt-8 lg:mt-0">
+							<div className="md:w-[900px] md:h-[700px] relative rounded-md overflow-clip">
+								<div className="block">
+									<Image
+										src=""
+										alt="Screenshot of Roo Code Cloud"
+										className="max-w-full h-auto"
+										width={1390}
+										height={1012}
+									/>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</section>
+
+			<section className="relative overflow-hidden border-t border-border py-32">
+				<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
+					<div className="mx-auto mb-12 md:mb-24 max-w-4xl text-center">
+						<div>
+							<h2 className="text-4xl font-bold tracking-tight sm:text-5xl">Power and Flexibility</h2>
+							<p className="mt-6 text-lg text-muted-foreground">
+								Code in the cloud, access free models, get usage analytics and more
+							</p>
+						</div>
+					</div>
+
+					<div className="relative mx-auto md:max-w-[1200px]">
+						<ul className="grid grid-cols-1 place-items-center gap-6 md:grid-cols-2 lg:grid-cols-3 lg:gap-8">
+							{cloudFeatures.map((feature, index) => {
+								const Icon = feature.icon
+								return (
+									<li
+										key={index}
+										className="relative h-full border border-border rounded-2xl bg-background p-8 transition-all duration-300">
+										<Icon className="size-6 text-foreground/80" />
+										<h3 className="mb-3 mt-3 text-xl font-semibold text-foreground">
+											{feature.title}
+										</h3>
+										<p className="leading-relaxed font-light text-muted-foreground">
+											{feature.description}
+										</p>
+										{feature.logos && (
+											<div className="mt-4 flex flex-wrap items-center gap-4">
+												{feature.logos.map((logo) => (
+													<Image
+														key={logo}
+														width={20}
+														height={20}
+														className="w-5 h-5 overflow-clip opacity-50 dark:invert"
+														src={`/logos/${logo.toLowerCase()}.svg`}
+														alt={`${logo} Logo`}
+													/>
+												))}
+											</div>
+										)}
+									</li>
+								)
+							})}
+						</ul>
+					</div>
+				</div>
+			</section>
+
+			<div id="faq"></div>
+
+			{/* CTA Section */}
+			<section className="py-20">
+				<div className="container mx-auto px-4 sm:px-6 lg:px-8">
+					<div className="mx-auto max-w-4xl rounded-3xl border border-border/50 bg-gradient-to-br from-blue-500/5 via-cyan-500/5 to-purple-500/5 p-8 text-center shadow-2xl backdrop-blur-xl dark:border-white/20 dark:bg-gradient-to-br dark:from-gray-800 dark:via-gray-900 dark:to-black sm:p-12">
+						<h2 className="mb-4 text-3xl font-bold tracking-tight sm:text-4xl">Try Roo Code Cloud now</h2>
+						<p className="mx-auto mb-8 max-w-2xl text-lg text-muted-foreground">Code from anywhere.</p>
+						<div className="flex flex-col justify-center space-y-4 sm:flex-row sm:space-x-4 sm:space-y-0">
+							<Button
+								size="lg"
+								className="bg-black text-white hover:bg-gray-800 hover:shadow-lg hover:shadow-black/20 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:hover:shadow-white/20 transition-all duration-300"
+								asChild>
+								<a
+									href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP}
+									target="_blank"
+									rel="noopener noreferrer"
+									className="flex items-center justify-center">
+									Create a free Cloud account
+									<ArrowRight className="ml-2 h-4 w-4" />
+								</a>
+							</Button>
+						</div>
+					</div>
+				</div>
+			</section>
+		</>
+	)
+}

+ 15 - 9
apps/web-roo-code/src/app/legal/subprocessors/page.tsx

@@ -42,7 +42,7 @@ export default function SubProcessors() {
 		<>
 			<div className="container mx-auto px-4 py-12 sm:px-6 lg:px-8">
 				<div className="prose prose-lg mx-auto max-w-5xl dark:prose-invert">
-					<p className="text-muted-foreground">Updated: September 18, 2025</p>
+					<p className="text-muted-foreground">Updated: October 17, 2025</p>
 
 					<h1 className="text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl">Subprocessors</h1>
 
@@ -116,12 +116,18 @@ export default function SubProcessors() {
 									<td className="border border-border px-4 py-3">CRM and marketing automation</td>
 								</tr>
 								<tr className="bg-muted/25">
+									<td className="border border-border px-4 py-3 font-medium">Intercom</td>
+									<td className="border border-border px-4 py-3">Communication Services</td>
+									<td className="border border-border px-4 py-3">United States</td>
+									<td className="border border-border px-4 py-3">Customer messaging and support</td>
+								</tr>
+								<tr>
 									<td className="border border-border px-4 py-3 font-medium">Loops</td>
 									<td className="border border-border px-4 py-3">Communication Services</td>
 									<td className="border border-border px-4 py-3">United States</td>
 									<td className="border border-border px-4 py-3">Email and customer communication</td>
 								</tr>
-								<tr>
+								<tr className="bg-muted/25">
 									<td className="border border-border px-4 py-3 font-medium">Metabase</td>
 									<td className="border border-border px-4 py-3">Data Analytics</td>
 									<td className="border border-border px-4 py-3">United States</td>
@@ -129,43 +135,43 @@ export default function SubProcessors() {
 										Business intelligence and reporting
 									</td>
 								</tr>
-								<tr className="bg-muted/25">
+								<tr>
 									<td className="border border-border px-4 py-3 font-medium">PostHog</td>
 									<td className="border border-border px-4 py-3">Data Services</td>
 									<td className="border border-border px-4 py-3">United States</td>
 									<td className="border border-border px-4 py-3">Product analytics</td>
 								</tr>
-								<tr>
+								<tr className="bg-muted/25">
 									<td className="border border-border px-4 py-3 font-medium">Sentry</td>
 									<td className="border border-border px-4 py-3">All Services</td>
 									<td className="border border-border px-4 py-3">United States</td>
 									<td className="border border-border px-4 py-3">Error tracking and monitoring</td>
 								</tr>
-								<tr className="bg-muted/25">
+								<tr>
 									<td className="border border-border px-4 py-3 font-medium">Snowflake</td>
 									<td className="border border-border px-4 py-3">Data Services</td>
 									<td className="border border-border px-4 py-3">United States</td>
 									<td className="border border-border px-4 py-3">Data warehousing and analytics</td>
 								</tr>
-								<tr>
+								<tr className="bg-muted/25">
 									<td className="border border-border px-4 py-3 font-medium">Stripe</td>
 									<td className="border border-border px-4 py-3">Payment Services</td>
 									<td className="border border-border px-4 py-3">United States, Europe</td>
 									<td className="border border-border px-4 py-3">Payment processing and billing</td>
 								</tr>
-								<tr className="bg-muted/25">
+								<tr>
 									<td className="border border-border px-4 py-3 font-medium">Supabase</td>
 									<td className="border border-border px-4 py-3">Data Services</td>
 									<td className="border border-border px-4 py-3">United States</td>
 									<td className="border border-border px-4 py-3">Database management and storage</td>
 								</tr>
-								<tr>
+								<tr className="bg-muted/25">
 									<td className="border border-border px-4 py-3 font-medium">Upstash</td>
 									<td className="border border-border px-4 py-3">Infrastructure Services</td>
 									<td className="border border-border px-4 py-3">United States</td>
 									<td className="border border-border px-4 py-3">Serverless database services</td>
 								</tr>
-								<tr className="bg-muted/25">
+								<tr>
 									<td className="border border-border px-4 py-3 font-medium">Vercel</td>
 									<td className="border border-border px-4 py-3">Customer-facing Services</td>
 									<td className="border border-border px-4 py-3">United States, Europe</td>

+ 55 - 31
apps/web-roo-code/src/app/pricing/page.tsx

@@ -14,6 +14,8 @@ const DESCRIPTION =
 const PATH = "/pricing"
 const OG_IMAGE = SEO.ogImage
 
+const PRICE_CREDITS = 5
+
 export const metadata: Metadata = {
 	title: TITLE,
 	description: DESCRIPTION,
@@ -59,6 +61,7 @@ interface PricingTier {
 	icon: LucideIcon
 	price: string
 	period?: string
+	creditPrice?: string
 	trial?: string
 	cancellation?: string
 	description: string
@@ -80,8 +83,9 @@ const pricingTiers: PricingTier[] = [
 		description: "For folks just getting started",
 		features: [
 			"Token usage analytics",
-			"Access your task history across devices",
 			"Follow your tasks from anywhere",
+			"Share tasks with friends and co-workers",
+			"Early access to free AI Models",
 			"Community support",
 		],
 		cta: {
@@ -95,13 +99,13 @@ const pricingTiers: PricingTier[] = [
 		price: "$20",
 		period: "/mo",
 		trial: "Free 14-day trial · ",
+		creditPrice: `$${PRICE_CREDITS}`,
 		cancellation: "Cancel anytime",
 		description: "For pro Roo coders",
-		featuresIntro: "Everything in Free, plus:",
+		featuresIntro: "Everything in Free +",
 		features: [
-			"Roomote Control",
-			"Start, stop and control tasks from anywhere",
-			"Course-correct Roo from afar",
+			"Cloud Agents: PR Reviewer and more",
+			"Roomote Control: Start, stop and control tasks from anywhere",
 			"Paid support",
 		],
 		cta: {
@@ -114,33 +118,17 @@ const pricingTiers: PricingTier[] = [
 		icon: Users,
 		price: "$99",
 		period: "/mo",
+		creditPrice: `$${PRICE_CREDITS}`,
 		trial: "Free 14-day trial · ",
 		cancellation: "Cancel anytime",
 		description: "For AI-forward teams",
-		featuresIntro: "Everything in Pro, plus:",
+		featuresIntro: "Everything in Pro +",
 		features: ["Unlimited users (no per-seat cost)", "Shared configuration & policies", "Centralized billing"],
 		cta: {
 			text: "Get started",
 			href: EXTERNAL_LINKS.CLOUD_APP_SIGNUP + "?redirect_url=/billing",
 		},
 	},
-	{
-		name: "Enterprise",
-		icon: Building2,
-		price: "Custom",
-		description: "For complex orgs",
-		featuresIntro: "Everything in Team, plus:",
-		features: [
-			"SAML SSO provisioning",
-			"Custom integrations and terms",
-			"Security questionnaires and all that fun stuff",
-			"Dedicated support",
-		],
-		cta: {
-			text: "Talk to Sales",
-			isContactForm: true,
-		},
-	},
 ]
 
 export default function PricingPage() {
@@ -156,7 +144,7 @@ export default function PricingPage() {
 						<p className="mx-auto mt-4 max-w-2xl text-lg text-muted-foreground">
 							Simple, transparent pricing that scales with your needs.
 							<br />
-							Free 14-day trials to kick the tires.
+							No inference markups. Free 14-day trials to kick the tires.
 						</p>
 					</div>
 				</div>
@@ -175,7 +163,7 @@ export default function PricingPage() {
 			{/* Pricing Tiers */}
 			<section className="">
 				<div className="container mx-auto px-4 sm:px-6 lg:px-8">
-					<div className="mx-auto grid max-w-6xl gap-4 lg:grid-cols-4">
+					<div className="mx-auto grid max-w-6xl gap-4 lg:grid-cols-3">
 						{pricingTiers.map((tier) => {
 							const Icon = tier.icon
 							return (
@@ -194,7 +182,7 @@ export default function PricingPage() {
 										<p className="text-sm text-muted-foreground font-light mb-2">
 											{tier.featuresIntro}&nbsp;
 										</p>
-										<ul className="space-y-3 my-0">
+										<ul className="space-y-3 my-0 h-[148px]">
 											{tier.features.map((feature) => (
 												<li key={feature} className="flex items-start gap-2">
 													<Check className="mt-0.5 h-4 w-4 text-muted-foreground shrink-0" />
@@ -208,9 +196,16 @@ export default function PricingPage() {
 										<strong>{tier.price}</strong>
 										{tier.period}
 									</p>
+
+									{tier.creditPrice && (
+										<p className="text-sm text-muted-foreground mb-1">
+											+ {tier.creditPrice}/hour for Cloud tasks
+										</p>
+									)}
+
 									<p className="text-xs text-muted-foreground mb-4">
 										{tier.trial}
-										{tier.cancellation}&nbsp;
+										{tier.cancellation}
 									</p>
 
 									{tier.cta.isContactForm ? (
@@ -231,6 +226,19 @@ export default function PricingPage() {
 						})}
 					</div>
 				</div>
+
+				<div className="mx-auto grid max-w-6xl gap-4 mt-4 relative">
+					<p className="bg-background border rounded-2xl p-6 text-center text-sm text-muted-foreground">
+						<Building2 className="inline size-4 mr-2 mb-0.5" />
+						Need SAML, advanced security, custom integrations or terms? Enterprise is for you.
+						<Link
+							href="/enterprise#contact"
+							className="font-medium ml-1 text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300">
+							Talk to Sales
+						</Link>
+						.
+					</p>
+				</div>
 			</section>
 
 			{/* Additional Information */}
@@ -238,7 +246,6 @@ export default function PricingPage() {
 				<div className="container mx-auto px-4 sm:px-6 lg:px-8">
 					<div className="mx-auto max-w-3xl text-center">
 						<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">Frequently Asked Questions</h2>
-						<p className="mt-4 text-lg text-muted-foreground">Got questions about our pricing?</p>
 					</div>
 					<div className="mx-auto mt-12 grid max-w-5xl gap-8 md:grid-cols-2">
 						<div className="rounded-lg border border-border bg-card p-6">
@@ -252,15 +259,32 @@ export default function PricingPage() {
 						<div className="rounded-lg border border-border bg-card p-6">
 							<h3 className="font-semibold">Is there a free trial?</h3>
 							<p className="mt-2 text-sm text-muted-foreground">
-								Yes, all paid plans come with a 14-day free trial.
+								Yes, all paid plans come with a 14-day free trial to try out functionality.
+							</p>
+							<p className="mt-2 text-sm text-muted-foreground">
+								To use Cloud Agents, you can buy credits.
+							</p>
+						</div>
+						<div className="rounded-lg border border-border bg-card p-6">
+							<h3 className="font-semibold">How do Cloud Agent credits work?</h3>
+							<p className="mt-2 text-sm text-muted-foreground">
+								Cloud Agents are a version of Roo running in the cloud without depending on your IDE.
+								You can run as many as you want, and bring your own inference provider key.
+							</p>
+							<p className="mt-2 text-sm text-muted-foreground">
+								To cover our infrastructure costs, we charge ${PRICE_CREDITS}/hour while the agent is
+								running (independent of inference costs).
+							</p>
+							<p className="mt-2 text-sm text-muted-foreground">
+								There are no markups, no tiers, no dumbing-down of models to increase our profit.
 							</p>
 						</div>
 						<div className="rounded-lg border border-border bg-card p-6">
 							<h3 className="font-semibold">Do I need a credit card for the free trial?</h3>
 							<p className="mt-2 text-sm text-muted-foreground">
-								Yes, but you won&apos;t be charged until your trial ends. You can cancel anytime with
-								one click .
+								Yes, but you won&apos;t be charged until your trial ends, except for credit purchases.
 							</p>
+							<p className="mt-2 text-sm text-muted-foreground">You can cancel anytime with one click.</p>
 						</div>
 						<div className="rounded-lg border border-border bg-card p-6">
 							<h3 className="font-semibold">What payment methods do you accept?</h3>

+ 50 - 304
apps/web-roo-code/src/app/terms/page.tsx

@@ -1,5 +1,10 @@
 import type { Metadata } from "next"
 import { SEO } from "@/lib/seo"
+import fs from "fs"
+import path from "path"
+import ReactMarkdown from "react-markdown"
+import remarkGfm from "remark-gfm"
+import rehypeRaw from "rehype-raw"
 
 const TITLE = "Terms of Service"
 const DESCRIPTION =
@@ -38,315 +43,56 @@ export const metadata: Metadata = {
 	keywords: [...SEO.keywords, "terms of service", "legal", "agreement", "subscription"],
 }
 
-export default function Terms() {
-	return (
-		<>
-			<div className="container mx-auto px-4 py-12 sm:px-6 lg:px-8">
-				<div className="prose prose-lg mx-auto max-w-4xl dark:prose-invert">
-					<h1 className="text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl">
-						Roo Code Cloud Terms of Service
-					</h1>
-					<p className="text-muted-foreground">
-						<em>(Version 1.0 – Effective June 19, 2025)</em>
-					</p>
-
-					<p className="lead">
-						These Terms of Service (&quot;<strong>TOS</strong>&quot;) govern access to and use of the Roo
-						Code Cloud service (the &quot;<strong>Service</strong>&quot;). They apply to:
-					</p>
-					<ul className="lead">
-						<li>
-							<strong>(a)</strong> every <strong>Sales Order Form</strong> or similar document mutually
-							executed by Roo Code and the customer that references these TOS; <strong>and</strong>
-						</li>
-						<li>
-							<strong>(b)</strong> any{" "}
-							<strong>online plan-selection, self-service sign-up, or in-app purchase flow</strong>{" "}
-							through which a customer clicks an &quot;I Agree&quot; (or equivalent) button to accept
-							these TOS — such flow also being an <strong>&quot;Order Form.&quot;</strong>
-						</li>
-					</ul>
-
-					<p>
-						By <strong>creating an account, clicking to accept, or using the Service</strong>, the person or
-						entity doing so (&quot;<strong>Customer</strong>&quot;) agrees to be bound by these TOS, even if
-						no separate Order Form is signed.
-					</p>
+function getTermsContent() {
+	const filePath = path.join(process.cwd(), "src/app/terms/terms.md")
+	return fs.readFileSync(filePath, "utf8")
+}
 
-					<p>
-						If Roo Code and Customer later execute a Master Subscription Agreement (&quot;
-						<strong>MSA</strong>&quot;), the MSA governs; otherwise, these TOS and the applicable Order Form
-						together form the entire agreement (the &quot;<strong>Agreement</strong>&quot;).
-					</p>
+export default function Terms() {
+	const content = getTermsContent()
 
-					<h2 className="mt-12 text-2xl font-bold">1. Agreement Framework</h2>
-					<ol>
-						<li>
-							<strong>Incorporation of Standard Terms.</strong>
-							<br />
-							The{" "}
+	return (
+		<div className="container mx-auto px-4 py-12 sm:px-6 lg:px-8">
+			<div className="prose prose-lg mx-auto max-w-4xl dark:prose-invert">
+				<ReactMarkdown
+					remarkPlugins={[remarkGfm]}
+					rehypePlugins={[rehypeRaw]}
+					components={{
+						h1: ({ ...props }) => (
+							<h1 className="text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl" {...props} />
+						),
+						h2: ({ ...props }) => <h2 className="mt-12 text-2xl font-bold" {...props} />,
+						a: ({ ...props }) => (
 							<a
-								href="https://commonpaper.com/standards/cloud-service-agreement/2.0/"
+								className="text-primary hover:underline"
 								target="_blank"
 								rel="noopener noreferrer"
-								className="text-primary hover:underline">
-								<em>Common Paper Cloud Service Standard Terms v 2.0</em>
-							</a>{" "}
-							(the &quot;<strong>Standard Terms</strong>&quot;) are incorporated by reference. If these
-							TOS conflict with the Standard Terms, these TOS control.
-						</li>
-						<li>
-							<strong>Order of Precedence.</strong>
-							<br />
-							(a) Order Form (b) these TOS (c) Standard Terms.
-						</li>
-					</ol>
-
-					<h2 className="mt-12 text-2xl font-bold">2. Key Commercial Terms</h2>
-
-					<div className="overflow-x-auto">
-						<table className="min-w-full border-collapse border border-border">
-							<thead>
-								<tr className="bg-muted/50">
-									<th className="border border-border px-4 py-2 text-left font-semibold">Term</th>
-									<th className="border border-border px-4 py-2 text-left font-semibold">Value</th>
-								</tr>
-							</thead>
-							<tbody>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Governing Law / Forum
-									</td>
-									<td className="border border-border px-4 py-2">
-										Delaware law; exclusive jurisdiction and venue in the state or federal courts
-										located in Delaware
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">
-										Plans & Subscription Periods
-									</td>
-									<td className="border border-border px-4 py-2">
-										<em>Free Plan:</em> month-to-month.
-										<br />
-										<em>Paid Plans:</em> Monthly <strong>or</strong> Annual, as selected in an Order
-										Form or the online flow.
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Auto-Renewal & Non-Renewal Notice
-									</td>
-									<td className="border border-border px-4 py-2">
-										<em>Free Plan:</em> renews continuously until cancelled in the dashboard.
-										<br />
-										<em>Paid Plans:</em> renew for the same period unless either party gives 30
-										days&apos; written notice before the current period ends.
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">Fees & Usage</td>
-									<td className="border border-border px-4 py-2">
-										<em>Free Plan:</em> Subscription Fee = $0.
-										<br />
-										<em>Paid Plans:</em> Fees stated in the Order Form or online checkout{" "}
-										<strong>plus</strong> usage-based fees, calculated and invoiced monthly.
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">Payment Terms</td>
-									<td className="border border-border px-4 py-2">
-										<em>Monthly paid plans:</em> credit-card charge on the billing date.
-										<br />
-										<em>Annual paid plans:</em> invoiced Net 30 (credit card optional).
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">
-										General Liability Cap
-									</td>
-									<td className="border border-border px-4 py-2">
-										The greater of (i) USD 100 and (ii) 1 × Fees paid or payable in the 12 months
-										before the event giving rise to liability.
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Increased Cap / Unlimited Claims
-									</td>
-									<td className="border border-border px-4 py-2">None</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">Trial / Pilot</td>
-									<td className="border border-border px-4 py-2">Not offered</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">Beta Features</td>
-									<td className="border border-border px-4 py-2">
-										None – only generally available features are provided
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">Security Standard</td>
-									<td className="border border-border px-4 py-2">
-										Roo Code maintains commercially reasonable administrative, physical, and
-										technical safeguards
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">Machine-Learning Use</td>
-									<td className="border border-border px-4 py-2">
-										Roo Code <strong>does not</strong> use Customer Content to train, fine-tune, or
-										improve any ML or AI models
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">
-										Data Processing Addendum (DPA)
-									</td>
-									<td className="border border-border px-4 py-2">
-										GDPR/CCPA-ready DPA available upon written request
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Publicity / Logo Rights
-									</td>
-									<td className="border border-border px-4 py-2">
-										Roo Code may identify Customer (name & logo) in marketing materials unless
-										Customer opts out in writing
-									</td>
-								</tr>
-							</tbody>
-						</table>
-					</div>
-
-					<h2 className="mt-12 text-2xl font-bold">3. Modifications to the Standard Terms</h2>
-					<ol>
-						<li>
-							<strong>Section 1.6 (Machine Learning).</strong>
-							<br />
-							&quot;Provider will not use Customer Content or Usage Data to train, fine-tune, or improve
-							any machine-learning or AI model, except with Customer&apos;s prior written consent.&quot;
-						</li>
-						<li>
-							<strong>Section 3 (Security).</strong>
-							<br />
-							Replace &quot;reasonable&quot; with &quot;commercially reasonable.&quot;
-						</li>
-						<li>
-							<strong>Section 4 (Fees & Payment).</strong>
-							<br />
-							Add usage-billing language above and delete any provision allowing unilateral fee increases.
-						</li>
-						<li>
-							<strong>Section 5 (Term & Termination).</strong>
-							<br />
-							Insert auto-renewal and free-plan language above.
-						</li>
-						<li>
-							<strong>Sections 7 (Trials / Betas) and any SLA references.</strong>
-							<br />
-							Deleted – Roo Code offers no trials, pilots, betas, or SLA credits under these TOS.
-						</li>
-						<li>
-							<strong>Section 12.12 (Publicity).</strong>
-							<br />
-							As reflected in the &quot;Publicity / Logo Rights&quot; row above.
-						</li>
-					</ol>
-
-					<h2 className="mt-12 text-2xl font-bold">4. Use of the Service</h2>
-					<p>
-						Customer may access and use the Service solely for its internal business purposes and subject to
-						the Acceptable Use Policy in the Standard Terms.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">5. Account Management & Termination</h2>
-					<ul>
-						<li>
-							<strong>Self-service cancellation or downgrade.</strong>
-							<br />
-							Customer may cancel a Free Plan immediately, or cancel/downgrade a Paid Plan effective at
-							the end of the current billing cycle, via the web dashboard.
-						</li>
-						<li>
-							Either party may otherwise terminate the Agreement as allowed under Section 5 of the
-							Standard Terms.
-						</li>
-					</ul>
-
-					<h2 className="mt-12 text-2xl font-bold">6. Privacy & Data</h2>
-					<p>
-						Roo Code&apos;s Privacy Notice (
-						<a
-							href="https://roocode.com/privacy"
-							rel="noopener noreferrer"
-							className="text-primary hover:underline">
-							https://roocode.com/privacy
-						</a>
-						) explains how Roo Code collects and handles personal information. If Customer requires a DPA,
-						email{" "}
-						<a href="mailto:[email protected]" className="text-primary hover:underline">
-							[email protected]
-						</a>
-						.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">7. Warranty Disclaimer</h2>
-					<p>
-						Except as expressly stated in the Agreement, the Service is provided{" "}
-						<strong>&quot;as is,&quot;</strong> and all implied warranties are disclaimed to the maximum
-						extent allowed by law.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">8. Limitation of Liability</h2>
-					<p>
-						The caps in Section 2 apply to all claims under the Agreement, whether in contract, tort, or
-						otherwise, except for Excluded Claims defined in the Standard Terms.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">9. Miscellaneous</h2>
-					<ol>
-						<li>
-							<strong>Assignment.</strong>
-							<br />
-							Customer may not assign the Agreement without Roo Code&apos;s prior written consent, except
-							to a successor in a merger or sale of substantially all assets.
-						</li>
-						<li>
-							<strong>Export Compliance.</strong>
-							<br />
-							Each party will comply with all applicable export-control laws and regulations and will not
-							export or re-export any software or technical data without the required government licences.
-						</li>
-						<li>
-							<strong>Entire Agreement.</strong>
-							<br />
-							The Agreement supersedes all prior or contemporaneous agreements for the Service.
-						</li>
-						<li>
-							<strong>Amendments.</strong>
-							<br />
-							Roo Code may update these TOS by posting a revised version at the same URL and emailing or
-							in-app notifying Customer at least 30 days before changes take effect. Continued use after
-							the effective date constitutes acceptance.
-						</li>
-					</ol>
-
-					<h2 className="mt-12 text-2xl font-bold">10. Contact</h2>
-					<p>
-						<strong>Roo Code, Inc.</strong>
-						<br />
-						98 Graceland Dr, San Rafael, CA 94901 USA
-						<br />
-						Email:{" "}
-						<a href="mailto:[email protected]" className="text-primary hover:underline">
-							[email protected]
-						</a>
-					</p>
-				</div>
+								{...props}
+							/>
+						),
+						table: ({ ...props }) => (
+							<div className="overflow-x-auto">
+								<table className="min-w-full border-collapse border border-border" {...props} />
+							</div>
+						),
+						th: ({ ...props }) => (
+							<th
+								className="border border-border px-4 py-2 text-left font-bold bg-muted-foreground/5"
+								{...props}
+							/>
+						),
+						td: ({ node: _node, ...props }) => {
+							// Check if this is the first column (Term column)
+							const isTermColumn = _node?.position?.start.column === 1
+							if (isTermColumn) {
+								return <td className="border border-border px-4 py-2 font-medium" {...props} />
+							}
+							return <td className="border border-border px-4 py-2" {...props} />
+						},
+					}}>
+					{content}
+				</ReactMarkdown>
 			</div>
-		</>
+		</div>
 	)
 }

+ 101 - 0
apps/web-roo-code/src/app/terms/terms.md

@@ -0,0 +1,101 @@
+# Roo Code Cloud Terms of Service
+
+_(Version 1.1 – Effective Oct 16, 2025)_
+
+These Terms of Service ("**TOS**") govern access to and use of the Roo Code Cloud service (the "**Service**"). They apply to:
+
+- **(a)** every **Sales Order Form** or similar document mutually executed by Roo Code and the customer that references these TOS; **and**
+- **(b)** any **online plan-selection, self-service sign-up, or in-app purchase flow** through which a customer clicks an "I Agree" (or equivalent) button to accept these TOS — such flow also being an **"Order Form."**
+
+By **creating an account, clicking to accept, or using the Service**, the person or entity doing so ("**Customer**") agrees to be bound by these TOS, even if no separate Order Form is signed.
+
+If Roo Code and Customer later execute a Master Subscription Agreement ("**MSA**"), the MSA governs; otherwise, these TOS and the applicable Order Form together form the entire agreement (the "**Agreement**").
+
+## 1. Agreement Framework
+
+1. **Incorporation of Standard Terms.**  
+   The [_Common Paper Cloud Service Standard Terms v 2.0_](https://commonpaper.com/standards/cloud-service-agreement/2.0/) (the "**Standard Terms**") are incorporated by reference. If these TOS conflict with the Standard Terms, these TOS control.
+
+2. **Order of Precedence.**  
+   (a) Order Form (b) these TOS (c) Standard Terms.
+
+## 2. Key Commercial Terms
+
+| Term                              | Value                                                                                                                                                                                             |
+| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Governing Law / Forum             | Delaware law; exclusive jurisdiction and venue in the state or federal courts located in Delaware                                                                                                 |
+| Plans & Subscription Periods      | _Free Plan:_ month-to-month. <br> _Paid Plans:_ Monthly **or** Annual, as selected in an Order Form or the online flow.                                                                           |
+| Auto-Renewal & Non-Renewal Notice | _Free Plan:_ renews continuously until cancelled in the dashboard. <br> _Paid Plans:_ renew for the same period unless either party gives 30 days' written notice before the current period ends. |
+| Fees & Usage                      | _Free Plan:_ Subscription Fee = $0.<br/>_Paid Plans:_ Fees stated in the Order Form or online checkout, invoiced monthly, **plus** Credits, credit-card charge upon online checkout.              |
+| Payment Terms                     | _Monthly paid plans:_ credit-card charge on the billing date.<br/>_Annual paid plans:_ invoiced Net 30 (credit card optional).<br/>_Credits:_ credit-card charge upon online checkout.            |
+| Credit Expiration.                | Credits expire one calendar year after purchase                                                                                                                                                   |
+| General Liability Cap             | The greater of (i) USD 100 and (ii) 1 × Fees paid or payable in the 12 months before the event giving rise to liability.                                                                          |
+| Increased Cap / Unlimited Claims  | None.                                                                                                                                                                                             |
+| Trial / Pilot                     | Self-service paid plans offer a 14-day free trial, with no subscription charge during the period. Credits are always charged, including during the free trial.                                    |
+| Beta Features                     | None – only generally available features are provided.                                                                                                                                            |
+| Security Standard                 | Roo Code is SOC2 Type 2 compliant and follows industry-standard security practices.                                                                                                               |
+| Machine-Learning Use              | Roo Code **does not** use Customer Content to train, fine-tune, or improve any ML or AI models.                                                                                                   |
+| Data Processing Addendum (DPA)    | GDPR/CCPA-ready DPA available upon written request. Subprocessors listed [here](/legal/subprocessors).                                                                                            |
+| Publicity / Logo Rights           | Roo Code may identify Customer (name & logo) in marketing materials unless Customer opts out in writing.                                                                                          |
+
+## 3. Modifications to the Standard Terms
+
+1. **Section 1.6 (Machine Learning).**  
+   "Provider will not use Customer Content or Usage Data to train, fine-tune, or improve any machine-learning or AI model, except with Customer's prior written consent."
+
+2. **Section 3 (Security).**  
+   Replace "reasonable" with "commercially reasonable."
+
+3. **Section 4 (Fees & Payment).**  
+   Add usage-billing language above and delete any provision allowing unilateral fee increases.
+
+4. **Section 5 (Term & Termination).**  
+   Insert auto-renewal and free-plan language above.
+
+5. **Sections 7 (Trials / Betas) and any SLA references.**  
+   Deleted – Roo Code offers no pilots, betas, or SLA credits under these TOS.
+
+6. **Section 12.12 (Publicity).**  
+   As reflected in the "Publicity / Logo Rights" row above.
+
+## 4. Use of the Service
+
+Customer may access and use the Service solely for its internal business purposes and subject to the Acceptable Use Policy in the Standard Terms.
+
+## 5. Account Management & Termination
+
+- **Self-service cancellation or downgrade.**  
+  Customer may cancel a Free Plan immediately, or cancel/downgrade a Paid Plan effective at the end of the current billing cycle, via the web dashboard.
+- Either party may otherwise terminate the Agreement as allowed under Section 5 of the Standard Terms.
+
+## 6. Privacy & Data
+
+Roo Code's Privacy Notice ([https://roocode.com/privacy](https://roocode.com/privacy)) explains how Roo Code collects and handles personal information. If Customer requires a DPA, email [[email protected]](mailto:[email protected]).
+
+## 7. Warranty Disclaimer
+
+Except as expressly stated in the Agreement, the Service is provided **"as is,"** and all implied warranties are disclaimed to the maximum extent allowed by law.
+
+## 8. Limitation of Liability
+
+The caps in Section 2 apply to all claims under the Agreement, whether in contract, tort, or otherwise, except for Excluded Claims defined in the Standard Terms.
+
+## 9. Miscellaneous
+
+1. **Assignment.**  
+   Customer may not assign the Agreement without Roo Code's prior written consent, except to a successor in a merger or sale of substantially all assets.
+
+2. **Export Compliance.**  
+   Each party will comply with all applicable export-control laws and regulations and will not export or re-export any software or technical data without the required government licences.
+
+3. **Entire Agreement.**  
+   The Agreement supersedes all prior or contemporaneous agreements for the Service.
+
+4. **Amendments.**  
+   Roo Code may update these TOS by posting a revised version at the same URL and emailing or in-app notifying Customer at least 30 days before changes take effect. Continued use after the effective date constitutes acceptance.
+
+## 10. Contact
+
+**Roo Code, Inc.**  
+98 Graceland Dr, San Rafael, CA 94901 USA  
+Email: [[email protected]](mailto:[email protected])

+ 13 - 2
apps/web-roo-code/src/components/chromes/nav-bar.tsx

@@ -38,8 +38,13 @@ export function NavBar({ stars, downloads }: NavBarProps) {
 					<ScrollButton
 						targetId="product"
 						className="text-muted-foreground px-4 py-6 transition-transform duration-200 hover:scale-105 hover:text-foreground max-lg:hidden">
-						Product
+						Extension
 					</ScrollButton>
+					<Link
+						href="/cloud"
+						className="text-muted-foreground px-4 py-6 transition-transform duration-200 hover:scale-105 hover:text-foreground">
+						Cloud
+					</Link>
 					<a
 						href={EXTERNAL_LINKS.DOCUMENTATION}
 						target="_blank"
@@ -140,8 +145,14 @@ export function NavBar({ stars, downloads }: NavBarProps) {
 							targetId="product"
 							className="block w-full p-5 py-3 text-left text-foreground active:opacity-50"
 							onClick={() => setIsMenuOpen(false)}>
-							Product
+							Extension
 						</ScrollButton>
+						<Link
+							href="/cloud"
+							className="block w-full p-5 text-left text-foreground active:opacity-50"
+							onClick={() => setIsMenuOpen(false)}>
+							Cloud
+						</Link>
 						<a
 							href={EXTERNAL_LINKS.DOCUMENTATION}
 							target="_blank"

+ 3 - 0
cli/.kilocode-cli/workspace-storage/workspace-state.json

@@ -0,0 +1,3 @@
+{
+	"localWorkflowToggles": {}
+}

+ 20 - 0
cli/CHANGELOG.md

@@ -1,5 +1,25 @@
 # @kilocode/cli
 
+## 0.0.8
+
+### Patch Changes
+
+- [#3201](https://github.com/Kilo-Org/kilocode/pull/3201) [`c44f948`](https://github.com/Kilo-Org/kilocode/commit/c44f9482fd024f38b7216a7f74b20a96445461a7) Thanks [@RSO](https://github.com/RSO)! - Added an onboarding wizard that helps you get set up in the CLI.
+
+- [#3208](https://github.com/Kilo-Org/kilocode/pull/3208) [`cdc007c`](https://github.com/Kilo-Org/kilocode/commit/cdc007c1150d5210cc0b9c8e5c2b4c57efadfd44) Thanks [@catrielmuller](https://github.com/catrielmuller)! - Allow auto-approval of commands straight from the approval menu
+
+- [#3202](https://github.com/Kilo-Org/kilocode/pull/3202) [`6ab57f4`](https://github.com/Kilo-Org/kilocode/commit/6ab57f441847e07dd6868a87913a41e0cb137fa8) Thanks [@catrielmuller](https://github.com/catrielmuller)! - Added prompt history. Use your up/down keys to navigate through previous prompts!
+
+## 0.0.7
+
+### Patch Changes
+
+- [#3176](https://github.com/Kilo-Org/kilocode/pull/3176) [`4bcc1ee`](https://github.com/Kilo-Org/kilocode/commit/4bcc1ee557ae4b4244365a72679ec1f13332e856) Thanks [@catrielmuller](https://github.com/catrielmuller)! - Support Kilo Code for Teams
+
+- [#3168](https://github.com/Kilo-Org/kilocode/pull/3168) [`476d835`](https://github.com/Kilo-Org/kilocode/commit/476d835b7ab9fee35e2832fe329b2256b36b78c7) Thanks [@catrielmuller](https://github.com/catrielmuller)! - Fix compatibility with extension v4.107.0
+
+- [#3161](https://github.com/Kilo-Org/kilocode/pull/3161) [`712b104`](https://github.com/Kilo-Org/kilocode/commit/712b104acb323da51ac271b7eb95741b3cfa6d9d) Thanks [@catrielmuller](https://github.com/catrielmuller)! - Improved install speed and fixed the outdated dependencies
+
 ## 0.0.6
 
 ### Patch Changes

+ 47 - 0
cli/README.md

@@ -136,6 +136,53 @@ Autonomous mode respects your auto-approval configuration. Edit your config file
 - `retry`: Auto-approve API retry requests
 - `todo`: Auto-approve todo list updates
 
+#### Command Approval Patterns
+
+The `execute.allowed` and `execute.denied` lists support hierarchical pattern matching:
+
+- **Base command**: `"git"` matches any git command (e.g., `git status`, `git commit`, `git push`)
+- **Command + subcommand**: `"git status"` matches any git status command (e.g., `git status --short`, `git status -v`)
+- **Full command**: `"git status --short"` only matches exactly `git status --short`
+
+**Example:**
+
+```json
+{
+	"execute": {
+		"enabled": true,
+		"allowed": [
+			"npm", // Allows all npm commands
+			"git status", // Allows all git status commands
+			"ls -la" // Only allows exactly "ls -la"
+		],
+		"denied": [
+			"git push --force" // Denies this specific command even if "git" is allowed
+		]
+	}
+}
+```
+
+#### Interactive Command Approval
+
+When running in interactive mode, command approval requests now show hierarchical options:
+
+```
+[!] Action Required:
+> ✓ Run Command (y)
+  ✓ Always run git (1)
+  ✓ Always run git status (2)
+  ✓ Always run git status --short --branch (3)
+  ✗ Reject (n)
+```
+
+Selecting an "Always run" option will:
+
+1. Approve and execute the current command
+2. Add the pattern to your `execute.allowed` list in the config
+3. Auto-approve matching commands in the future
+
+This allows you to progressively build your auto-approval rules without manually editing the config file.
+
 #### Autonomous mode Follow-up Questions
 
 In Autonomous mode, when the AI asks a follow-up question, it receives this response:

+ 1 - 2
cli/esbuild.config.mjs

@@ -10,6 +10,7 @@ function copyPostBuildFiles() {
 
 		copyFileSync("src/config/schema.json", "dist/config/schema.json")
 		copyFileSync("package.dist.json", "dist/package.json")
+		copyFileSync("npm-shrinkwrap.dist.json", "dist/npm-shrinkwrap.json")
 		copyFileSync("README.md", "dist/README.md")
 
 		try {
@@ -148,8 +149,6 @@ const __dirname = __dirname__(__filename);
 		"socket.io-client",
 		"sound-play",
 		"stream-json",
-		"string-width",
-		"strip-ansi",
 		"strip-bom",
 		"tiktoken",
 		"tmp",

+ 12240 - 0
cli/npm-shrinkwrap.dist.json

@@ -0,0 +1,12240 @@
+{
+	"name": "@kilocode/cli",
+	"version": "0.0.6",
+	"lockfileVersion": 3,
+	"requires": true,
+	"packages": {
+		"": {
+			"name": "@kilocode/cli",
+			"version": "0.0.6",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@anthropic-ai/bedrock-sdk": "^0.22.0",
+				"@anthropic-ai/sdk": "^0.51.0",
+				"@anthropic-ai/vertex-sdk": "^0.11.3",
+				"@aws-sdk/client-bedrock-runtime": "^3.812.0",
+				"@aws-sdk/credential-providers": "^3.806.0",
+				"@google/genai": "^1.0.0",
+				"@lmstudio/sdk": "^1.1.1",
+				"@mistralai/mistralai": "^1.9.18",
+				"@modelcontextprotocol/sdk": "1.12.0",
+				"@qdrant/js-client-rest": "^1.14.0",
+				"@vscode/codicons": "^0.0.36",
+				"@vscode/ripgrep": "^1.15.11",
+				"ajv": "^8.12.0",
+				"async-mutex": "^0.5.0",
+				"axios": "^1.7.4",
+				"chalk": "^5.3.0",
+				"cheerio": "^1.0.0",
+				"chokidar": "^4.0.1",
+				"clone-deep": "^4.0.1",
+				"commander": "^12.1.0",
+				"default-shell": "^2.2.0",
+				"delay": "^6.0.0",
+				"diff": "^5.2.0",
+				"diff-match-patch": "^1.0.5",
+				"dotenv": "^16.4.7",
+				"eventemitter3": "^5.0.1",
+				"exceljs": "^4.4.0",
+				"fast-deep-equal": "^3.1.3",
+				"fast-xml-parser": "^5.0.0",
+				"fastest-levenshtein": "^1.0.16",
+				"fs-extra": "^11.2.0",
+				"fuse.js": "^7.1.0",
+				"fzf": "^0.5.2",
+				"get-folder-size": "^5.0.0",
+				"google-auth-library": "^9.15.1",
+				"gray-matter": "^4.0.3",
+				"i18next": "^25.0.0",
+				"ignore": "^7.0.3",
+				"ink": "^6.3.1",
+				"ink-big-text": "^2.0.0",
+				"ink-gradient": "^3.0.0",
+				"ink-select-input": "^6.2.0",
+				"ink-spinner": "^5.0.0",
+				"ink-table": "^3.1.0",
+				"ink-text-input": "^6.0.0",
+				"is-wsl": "^3.1.0",
+				"isbinaryfile": "^5.0.2",
+				"jotai": "^2.14.0",
+				"jsdom": "^26.0.0",
+				"json5": "^2.2.3",
+				"jwt-decode": "^4.0.0",
+				"lodash.debounce": "^4.0.8",
+				"lru-cache": "^11.1.0",
+				"mammoth": "^1.9.1",
+				"marked": "^11.2.0",
+				"marked-terminal": "^6.2.0",
+				"monaco-vscode-textmate-theme-converter": "^0.1.7",
+				"node-cache": "^5.1.2",
+				"node-ipc": "^12.0.0",
+				"ollama": "^0.5.17",
+				"openai": "^5.12.2",
+				"os-name": "^6.0.0",
+				"p-limit": "^6.2.0",
+				"p-wait-for": "^5.0.2",
+				"package-json": "^10.0.1",
+				"pdf-parse": "^1.1.1",
+				"pkce-challenge": "^5.0.0",
+				"posthog-node": "^4.2.1",
+				"pretty-bytes": "^7.0.0",
+				"proper-lockfile": "^4.1.2",
+				"ps-tree": "^1.2.0",
+				"puppeteer-chromium-resolver": "^24.0.2",
+				"puppeteer-core": "^23.4.0",
+				"react": "^19.2.0",
+				"react-devtools-core": "^6.1.5",
+				"react-error-boundary": "^6.0.0",
+				"reconnecting-eventsource": "^1.6.4",
+				"sanitize-filename": "^1.6.3",
+				"say": "^0.16.0",
+				"semver": "^7.7.3",
+				"serialize-error": "^11.0.3",
+				"shiki": "^3.6.0",
+				"simple-git": "^3.27.0",
+				"socket.io-client": "^4.8.1",
+				"sound-play": "^1.1.0",
+				"stream-json": "^1.8.0",
+				"string-width": "^8.1.0",
+				"strip-ansi": "^7.1.0",
+				"strip-bom": "^5.0.0",
+				"tiktoken": "^1.0.21",
+				"tmp": "^0.2.3",
+				"tree-sitter-wasms": "^0.1.12",
+				"ts-node": "^10.9.1",
+				"turndown": "^7.2.0",
+				"undici": "^7.13.0",
+				"uri-js": "^4.4.1",
+				"uuid": "^11.1.0",
+				"vscode-material-icons": "^0.1.1",
+				"vscode-uri": "^3.0.8",
+				"web-tree-sitter": "^0.25.6",
+				"workerpool": "^9.2.0",
+				"yaml": "^2.6.1",
+				"zod": "^3.25.61"
+			},
+			"bin": {
+				"kilo": "index.js",
+				"kilocode": "index.js"
+			},
+			"engines": {
+				"node": ">=20.19.2"
+			}
+		},
+		"node_modules/@alcalzone/ansi-tokenize": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.1.tgz",
+			"integrity": "sha512-0rJMGIohyuFVf/uq9wCTtVLmVs/+7zoCGYkj7T8igV3XMPpjaSspXx/JvD9zmGprPVsIVvVRYVCaBkEz+SvN9g==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^6.2.1",
+				"is-fullwidth-code-point": "^5.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/@anthropic-ai/bedrock-sdk": {
+			"version": "0.22.4",
+			"resolved": "https://registry.npmjs.org/@anthropic-ai/bedrock-sdk/-/bedrock-sdk-0.22.4.tgz",
+			"integrity": "sha512-8u9RYH5Sfd9NykfJe86zX21Tc1I/1rLLl/DK9gkCL+xLgtSfUcAY285Fov6xk8ErRJfQLbGpbLAjSAzJNmf3sg==",
+			"license": "MIT",
+			"dependencies": {
+				"@anthropic-ai/sdk": ">=0.50.3 <1",
+				"@aws-crypto/sha256-js": "^4.0.0",
+				"@aws-sdk/client-bedrock-runtime": "^3.797.0",
+				"@aws-sdk/credential-providers": "^3.796.0",
+				"@smithy/eventstream-serde-node": "^2.0.10",
+				"@smithy/fetch-http-handler": "^5.0.4",
+				"@smithy/protocol-http": "^3.0.6",
+				"@smithy/signature-v4": "^3.1.1",
+				"@smithy/smithy-client": "^2.1.9",
+				"@smithy/types": "^2.3.4",
+				"@smithy/util-base64": "^2.0.0"
+			}
+		},
+		"node_modules/@anthropic-ai/sdk": {
+			"version": "0.51.0",
+			"resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.51.0.tgz",
+			"integrity": "sha512-fAFC/uHhyzfw7rs65EPVV+scXDytGNm5BjttxHf6rP/YGvaBRKEvp2lwyuMigTwMI95neeG4bzrZigz7KCikjw==",
+			"license": "MIT",
+			"bin": {
+				"anthropic-ai-sdk": "bin/cli"
+			}
+		},
+		"node_modules/@anthropic-ai/vertex-sdk": {
+			"version": "0.11.5",
+			"resolved": "https://registry.npmjs.org/@anthropic-ai/vertex-sdk/-/vertex-sdk-0.11.5.tgz",
+			"integrity": "sha512-V7sB5nY80unEQu8lSQaEzh1WhYwpIdpC3iXNRHUskghkuQDhS6dQu2ASZBgA5MNuJ1Yv5PhY61NM15dLaQhPQw==",
+			"license": "MIT",
+			"dependencies": {
+				"@anthropic-ai/sdk": ">=0.50.3 <1",
+				"google-auth-library": "^9.4.2"
+			}
+		},
+		"node_modules/@asamuzakjp/css-color": {
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz",
+			"integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==",
+			"license": "MIT",
+			"dependencies": {
+				"@csstools/css-calc": "^2.1.3",
+				"@csstools/css-color-parser": "^3.0.9",
+				"@csstools/css-parser-algorithms": "^3.0.4",
+				"@csstools/css-tokenizer": "^3.0.3",
+				"lru-cache": "^10.4.3"
+			}
+		},
+		"node_modules/@asamuzakjp/css-color/node_modules/lru-cache": {
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+			"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+			"license": "ISC"
+		},
+		"node_modules/@aws-crypto/crc32": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
+			"integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^5.2.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/crc32/node_modules/@aws-crypto/util": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+			"integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@smithy/util-utf8": "^2.0.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-crypto/crc32/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/crc32/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/crc32/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/crc32/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-crypto/sha256-browser": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz",
+			"integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/sha256-js": "^5.2.0",
+				"@aws-crypto/supports-web-crypto": "^5.2.0",
+				"@aws-crypto/util": "^5.2.0",
+				"@aws-sdk/types": "^3.222.0",
+				"@aws-sdk/util-locate-window": "^3.0.0",
+				"@smithy/util-utf8": "^2.0.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-crypto/sha256-browser/node_modules/@aws-crypto/sha256-js": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+			"integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^5.2.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/sha256-browser/node_modules/@aws-crypto/util": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+			"integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@smithy/util-utf8": "^2.0.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-crypto/sha256-js": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-4.0.0.tgz",
+			"integrity": "sha512-MHGJyjE7TX9aaqXj7zk2ppnFUOhaDs5sP+HtNS0evOxn72c+5njUmyJmpGd7TfyoDznZlHMmdo/xGUdu2NIjNQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^4.0.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^1.11.1"
+			}
+		},
+		"node_modules/@aws-crypto/supports-web-crypto": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz",
+			"integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-crypto/util": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-4.0.0.tgz",
+			"integrity": "sha512-2EnmPy2gsFZ6m8bwUQN4jq+IyXV3quHAcwPOS6ZA3k+geujiqI8aRokO2kFJe+idJ/P3v4qWI186rVMo0+zLDQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@aws-sdk/util-utf8-browser": "^3.0.0",
+				"tslib": "^1.11.1"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime": {
+			"version": "3.913.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.913.0.tgz",
+			"integrity": "sha512-DzsB7iO8u1S6mg2ObtYEpCxWrfdCbl1a2aimiQoWZViT7zFCC4v193C2NF7VeU7xAYvQ0dSEZAYMKSwymvHAmg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/sha256-browser": "5.2.0",
+				"@aws-crypto/sha256-js": "5.2.0",
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/credential-provider-node": "3.913.0",
+				"@aws-sdk/eventstream-handler-node": "3.910.0",
+				"@aws-sdk/middleware-eventstream": "3.910.0",
+				"@aws-sdk/middleware-host-header": "3.910.0",
+				"@aws-sdk/middleware-logger": "3.910.0",
+				"@aws-sdk/middleware-recursion-detection": "3.910.0",
+				"@aws-sdk/middleware-user-agent": "3.911.0",
+				"@aws-sdk/middleware-websocket": "3.910.0",
+				"@aws-sdk/region-config-resolver": "3.910.0",
+				"@aws-sdk/token-providers": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@aws-sdk/util-endpoints": "3.910.0",
+				"@aws-sdk/util-user-agent-browser": "3.910.0",
+				"@aws-sdk/util-user-agent-node": "3.911.0",
+				"@smithy/config-resolver": "^4.3.2",
+				"@smithy/core": "^3.16.1",
+				"@smithy/eventstream-serde-browser": "^4.2.2",
+				"@smithy/eventstream-serde-config-resolver": "^4.3.2",
+				"@smithy/eventstream-serde-node": "^4.2.2",
+				"@smithy/fetch-http-handler": "^5.3.3",
+				"@smithy/hash-node": "^4.2.2",
+				"@smithy/invalid-dependency": "^4.2.2",
+				"@smithy/middleware-content-length": "^4.2.2",
+				"@smithy/middleware-endpoint": "^4.3.3",
+				"@smithy/middleware-retry": "^4.4.3",
+				"@smithy/middleware-serde": "^4.2.2",
+				"@smithy/middleware-stack": "^4.2.2",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/node-http-handler": "^4.4.1",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/smithy-client": "^4.8.1",
+				"@smithy/types": "^4.7.1",
+				"@smithy/url-parser": "^4.2.2",
+				"@smithy/util-base64": "^4.3.0",
+				"@smithy/util-body-length-browser": "^4.2.0",
+				"@smithy/util-body-length-node": "^4.2.1",
+				"@smithy/util-defaults-mode-browser": "^4.3.2",
+				"@smithy/util-defaults-mode-node": "^4.2.3",
+				"@smithy/util-endpoints": "^3.2.2",
+				"@smithy/util-middleware": "^4.2.2",
+				"@smithy/util-retry": "^4.2.2",
+				"@smithy/util-stream": "^4.5.2",
+				"@smithy/util-utf8": "^4.2.0",
+				"@smithy/uuid": "^1.1.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@aws-crypto/sha256-js": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+			"integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^5.2.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@aws-crypto/util": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+			"integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@smithy/util-utf8": "^2.0.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@smithy/eventstream-serde-node": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.3.tgz",
+			"integrity": "sha512-uQobOTQq2FapuSOlmGLUeGTpvcBLE5Fc7XjERUSk4dxEi4AhTwuyHYZNAvL4EMUp7lzxxkKDFaJ1GY0ovrj0Kg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/eventstream-serde-universal": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-bedrock-runtime/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/client-cognito-identity": {
+			"version": "3.913.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.913.0.tgz",
+			"integrity": "sha512-TdEwasoXnLIb90z7NL1vLbEprzY0vdRqZH97ubIUDo8EaJ6WrJ35Um5g0rcnWKR6C+P9lKKI4mVv2BI2EwY94Q==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/sha256-browser": "5.2.0",
+				"@aws-crypto/sha256-js": "5.2.0",
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/credential-provider-node": "3.913.0",
+				"@aws-sdk/middleware-host-header": "3.910.0",
+				"@aws-sdk/middleware-logger": "3.910.0",
+				"@aws-sdk/middleware-recursion-detection": "3.910.0",
+				"@aws-sdk/middleware-user-agent": "3.911.0",
+				"@aws-sdk/region-config-resolver": "3.910.0",
+				"@aws-sdk/types": "3.910.0",
+				"@aws-sdk/util-endpoints": "3.910.0",
+				"@aws-sdk/util-user-agent-browser": "3.910.0",
+				"@aws-sdk/util-user-agent-node": "3.911.0",
+				"@smithy/config-resolver": "^4.3.2",
+				"@smithy/core": "^3.16.1",
+				"@smithy/fetch-http-handler": "^5.3.3",
+				"@smithy/hash-node": "^4.2.2",
+				"@smithy/invalid-dependency": "^4.2.2",
+				"@smithy/middleware-content-length": "^4.2.2",
+				"@smithy/middleware-endpoint": "^4.3.3",
+				"@smithy/middleware-retry": "^4.4.3",
+				"@smithy/middleware-serde": "^4.2.2",
+				"@smithy/middleware-stack": "^4.2.2",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/node-http-handler": "^4.4.1",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/smithy-client": "^4.8.1",
+				"@smithy/types": "^4.7.1",
+				"@smithy/url-parser": "^4.2.2",
+				"@smithy/util-base64": "^4.3.0",
+				"@smithy/util-body-length-browser": "^4.2.0",
+				"@smithy/util-body-length-node": "^4.2.1",
+				"@smithy/util-defaults-mode-browser": "^4.3.2",
+				"@smithy/util-defaults-mode-node": "^4.2.3",
+				"@smithy/util-endpoints": "^3.2.2",
+				"@smithy/util-middleware": "^4.2.2",
+				"@smithy/util-retry": "^4.2.2",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-js": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+			"integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^5.2.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+			"integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@smithy/util-utf8": "^2.0.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/client-sso": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.911.0.tgz",
+			"integrity": "sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/sha256-browser": "5.2.0",
+				"@aws-crypto/sha256-js": "5.2.0",
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/middleware-host-header": "3.910.0",
+				"@aws-sdk/middleware-logger": "3.910.0",
+				"@aws-sdk/middleware-recursion-detection": "3.910.0",
+				"@aws-sdk/middleware-user-agent": "3.911.0",
+				"@aws-sdk/region-config-resolver": "3.910.0",
+				"@aws-sdk/types": "3.910.0",
+				"@aws-sdk/util-endpoints": "3.910.0",
+				"@aws-sdk/util-user-agent-browser": "3.910.0",
+				"@aws-sdk/util-user-agent-node": "3.911.0",
+				"@smithy/config-resolver": "^4.3.2",
+				"@smithy/core": "^3.16.1",
+				"@smithy/fetch-http-handler": "^5.3.3",
+				"@smithy/hash-node": "^4.2.2",
+				"@smithy/invalid-dependency": "^4.2.2",
+				"@smithy/middleware-content-length": "^4.2.2",
+				"@smithy/middleware-endpoint": "^4.3.3",
+				"@smithy/middleware-retry": "^4.4.3",
+				"@smithy/middleware-serde": "^4.2.2",
+				"@smithy/middleware-stack": "^4.2.2",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/node-http-handler": "^4.4.1",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/smithy-client": "^4.8.1",
+				"@smithy/types": "^4.7.1",
+				"@smithy/url-parser": "^4.2.2",
+				"@smithy/util-base64": "^4.3.0",
+				"@smithy/util-body-length-browser": "^4.2.0",
+				"@smithy/util-body-length-node": "^4.2.1",
+				"@smithy/util-defaults-mode-browser": "^4.3.2",
+				"@smithy/util-defaults-mode-node": "^4.2.3",
+				"@smithy/util-endpoints": "^3.2.2",
+				"@smithy/util-middleware": "^4.2.2",
+				"@smithy/util-retry": "^4.2.2",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-js": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+			"integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^5.2.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/util": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+			"integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@smithy/util-utf8": "^2.0.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/client-sso/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/core": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.911.0.tgz",
+			"integrity": "sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@aws-sdk/xml-builder": "3.911.0",
+				"@smithy/core": "^3.16.1",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/signature-v4": "^5.3.2",
+				"@smithy/smithy-client": "^4.8.1",
+				"@smithy/types": "^4.7.1",
+				"@smithy/util-base64": "^4.3.0",
+				"@smithy/util-middleware": "^4.2.2",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/core/node_modules/@smithy/is-array-buffer": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz",
+			"integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/core/node_modules/@smithy/signature-v4": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.3.tgz",
+			"integrity": "sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^4.2.0",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-hex-encoding": "^4.2.0",
+				"@smithy/util-middleware": "^4.2.3",
+				"@smithy/util-uri-escape": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/core/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/core/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/core/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/core/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-cognito-identity": {
+			"version": "3.913.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.913.0.tgz",
+			"integrity": "sha512-AYZNpy3eEFzopzntLcrkEQQ1qyhg0V7BL8U77QdLSYtzoYvI9CqnWOGdWnNSEUp+Mpbk1VJyPzVfkDoDq5kX6g==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/client-cognito-identity": "3.913.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-env": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.911.0.tgz",
+			"integrity": "sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-http": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.911.0.tgz",
+			"integrity": "sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/fetch-http-handler": "^5.3.3",
+				"@smithy/node-http-handler": "^4.4.1",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/smithy-client": "^4.8.1",
+				"@smithy/types": "^4.7.1",
+				"@smithy/util-stream": "^4.5.2",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-http/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-ini": {
+			"version": "3.913.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.913.0.tgz",
+			"integrity": "sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/credential-provider-env": "3.911.0",
+				"@aws-sdk/credential-provider-http": "3.911.0",
+				"@aws-sdk/credential-provider-process": "3.911.0",
+				"@aws-sdk/credential-provider-sso": "3.911.0",
+				"@aws-sdk/credential-provider-web-identity": "3.911.0",
+				"@aws-sdk/nested-clients": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/credential-provider-imds": "^4.2.2",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/shared-ini-file-loader": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-node": {
+			"version": "3.913.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.913.0.tgz",
+			"integrity": "sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/credential-provider-env": "3.911.0",
+				"@aws-sdk/credential-provider-http": "3.911.0",
+				"@aws-sdk/credential-provider-ini": "3.913.0",
+				"@aws-sdk/credential-provider-process": "3.911.0",
+				"@aws-sdk/credential-provider-sso": "3.911.0",
+				"@aws-sdk/credential-provider-web-identity": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/credential-provider-imds": "^4.2.2",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/shared-ini-file-loader": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-process": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.911.0.tgz",
+			"integrity": "sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/shared-ini-file-loader": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-sso": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.911.0.tgz",
+			"integrity": "sha512-JAxd4uWe0Zc9tk6+N0cVxe9XtJVcOx6Ms0k933ZU9QbuRMH6xti/wnZxp/IvGIWIDzf5fhqiGyw5MSyDeI5b1w==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/client-sso": "3.911.0",
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/token-providers": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/shared-ini-file-loader": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-provider-web-identity": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.911.0.tgz",
+			"integrity": "sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/nested-clients": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/shared-ini-file-loader": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/credential-providers": {
+			"version": "3.913.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.913.0.tgz",
+			"integrity": "sha512-KnkvoLXGszXNV7IMLdUH2Smo+tr4MiHUp2zkkrhl+6uXdSWpEAhlARSA8OPIxgVMabUW1AWDumN7Km7z0GvnWg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/client-cognito-identity": "3.913.0",
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/credential-provider-cognito-identity": "3.913.0",
+				"@aws-sdk/credential-provider-env": "3.911.0",
+				"@aws-sdk/credential-provider-http": "3.911.0",
+				"@aws-sdk/credential-provider-ini": "3.913.0",
+				"@aws-sdk/credential-provider-node": "3.913.0",
+				"@aws-sdk/credential-provider-process": "3.911.0",
+				"@aws-sdk/credential-provider-sso": "3.911.0",
+				"@aws-sdk/credential-provider-web-identity": "3.911.0",
+				"@aws-sdk/nested-clients": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/config-resolver": "^4.3.2",
+				"@smithy/core": "^3.16.1",
+				"@smithy/credential-provider-imds": "^4.2.2",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-providers/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/credential-providers/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/eventstream-handler-node": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-handler-node/-/eventstream-handler-node-3.910.0.tgz",
+			"integrity": "sha512-oh91l4hR0makDcdK2uPoIETI8QKrDxgEDdo5VZNPddnr7XBNPenm8bWLvSQI2sEtn0uaQw5q9eT75I5HaiWB5g==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/eventstream-codec": "^4.2.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/eventstream-handler-node/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/eventstream-handler-node/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/middleware-eventstream": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.910.0.tgz",
+			"integrity": "sha512-zeV4DVypzV+77AQ7sqVfKacVWFBM2HVBVORZ4PnCjToCg1BQgw39IDVtklF1/Fs+mmGp4dJdTlJ7TKBCqBNdhw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-eventstream/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-eventstream/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-eventstream/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/middleware-host-header": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.910.0.tgz",
+			"integrity": "sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/middleware-logger": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.910.0.tgz",
+			"integrity": "sha512-3LJyyfs1USvRuRDla1pGlzGRtXJBXD1zC9F+eE9Iz/V5nkmhyv52A017CvKWmYoR0DM9dzjLyPOI0BSSppEaTw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-logger/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-logger/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/middleware-recursion-detection": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.910.0.tgz",
+			"integrity": "sha512-m/oLz0EoCy+WoIVBnXRXJ4AtGpdl0kPE7U+VH9TsuUzHgxY1Re/176Q1HWLBRVlz4gr++lNsgsMWEC+VnAwMpw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@aws/lambda-invoke-store": "^0.0.1",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/middleware-user-agent": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.911.0.tgz",
+			"integrity": "sha512-rY3LvGvgY/UI0nmt5f4DRzjEh8135A2TeHcva1bgOmVfOI4vkkGfA20sNRqerOkSO6hPbkxJapO50UJHFzmmyA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@aws-sdk/util-endpoints": "3.910.0",
+				"@smithy/core": "^3.16.1",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/middleware-websocket": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-websocket/-/middleware-websocket-3.910.0.tgz",
+			"integrity": "sha512-W0t8nHo6SY2g5+ZAofsnzxr3K8E1hRT2qq1BlYcNwX76m2Kw0wP+kaMhKlAdtY7rglu7HZhwErZHxQfenO9UZg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@aws-sdk/util-format-url": "3.910.0",
+				"@smithy/eventstream-codec": "^4.2.2",
+				"@smithy/eventstream-serde-browser": "^4.2.2",
+				"@smithy/fetch-http-handler": "^5.3.3",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/signature-v4": "^5.3.2",
+				"@smithy/types": "^4.7.1",
+				"@smithy/util-hex-encoding": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">= 14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-websocket/node_modules/@smithy/is-array-buffer": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz",
+			"integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-websocket/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-websocket/node_modules/@smithy/signature-v4": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.3.tgz",
+			"integrity": "sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^4.2.0",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-hex-encoding": "^4.2.0",
+				"@smithy/util-middleware": "^4.2.3",
+				"@smithy/util-uri-escape": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-websocket/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/middleware-websocket/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/nested-clients": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.911.0.tgz",
+			"integrity": "sha512-lp/sXbdX/S0EYaMYPVKga0omjIUbNNdFi9IJITgKZkLC6CzspihIoHd5GIdl4esMJevtTQQfkVncXTFkf/a4YA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/sha256-browser": "5.2.0",
+				"@aws-crypto/sha256-js": "5.2.0",
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/middleware-host-header": "3.910.0",
+				"@aws-sdk/middleware-logger": "3.910.0",
+				"@aws-sdk/middleware-recursion-detection": "3.910.0",
+				"@aws-sdk/middleware-user-agent": "3.911.0",
+				"@aws-sdk/region-config-resolver": "3.910.0",
+				"@aws-sdk/types": "3.910.0",
+				"@aws-sdk/util-endpoints": "3.910.0",
+				"@aws-sdk/util-user-agent-browser": "3.910.0",
+				"@aws-sdk/util-user-agent-node": "3.911.0",
+				"@smithy/config-resolver": "^4.3.2",
+				"@smithy/core": "^3.16.1",
+				"@smithy/fetch-http-handler": "^5.3.3",
+				"@smithy/hash-node": "^4.2.2",
+				"@smithy/invalid-dependency": "^4.2.2",
+				"@smithy/middleware-content-length": "^4.2.2",
+				"@smithy/middleware-endpoint": "^4.3.3",
+				"@smithy/middleware-retry": "^4.4.3",
+				"@smithy/middleware-serde": "^4.2.2",
+				"@smithy/middleware-stack": "^4.2.2",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/node-http-handler": "^4.4.1",
+				"@smithy/protocol-http": "^5.3.2",
+				"@smithy/smithy-client": "^4.8.1",
+				"@smithy/types": "^4.7.1",
+				"@smithy/url-parser": "^4.2.2",
+				"@smithy/util-base64": "^4.3.0",
+				"@smithy/util-body-length-browser": "^4.2.0",
+				"@smithy/util-body-length-node": "^4.2.1",
+				"@smithy/util-defaults-mode-browser": "^4.3.2",
+				"@smithy/util-defaults-mode-node": "^4.2.3",
+				"@smithy/util-endpoints": "^3.2.2",
+				"@smithy/util-middleware": "^4.2.2",
+				"@smithy/util-retry": "^4.2.2",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-js": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz",
+			"integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^5.2.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz",
+			"integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@smithy/util-utf8": "^2.0.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/nested-clients/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/region-config-resolver": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.910.0.tgz",
+			"integrity": "sha512-gzQAkuHI3xyG6toYnH/pju+kc190XmvnB7X84vtN57GjgdQJICt9So/BD0U6h+eSfk9VBnafkVrAzBzWMEFZVw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"@smithy/util-config-provider": "^4.2.0",
+				"@smithy/util-middleware": "^4.2.2",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/region-config-resolver/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/token-providers": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.911.0.tgz",
+			"integrity": "sha512-O1c5F1pbEImgEe3Vr8j1gpWu69UXWj3nN3vvLGh77hcrG5dZ8I27tSP5RN4Labm8Dnji/6ia+vqSYpN8w6KN5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/core": "3.911.0",
+				"@aws-sdk/nested-clients": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/property-provider": "^4.2.2",
+				"@smithy/shared-ini-file-loader": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/token-providers/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/types": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.910.0.tgz",
+			"integrity": "sha512-o67gL3vjf4nhfmuSUNNkit0d62QJEwwHLxucwVJkR/rw9mfUtAWsgBs8Tp16cdUbMgsyQtCQilL8RAJDoGtadQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/types/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/types/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/util-endpoints": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.910.0.tgz",
+			"integrity": "sha512-6XgdNe42ibP8zCQgNGDWoOF53RfEKzpU/S7Z29FTTJ7hcZv0SytC0ZNQQZSx4rfBl036YWYwJRoJMlT4AA7q9A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/types": "^4.7.1",
+				"@smithy/url-parser": "^4.2.2",
+				"@smithy/util-endpoints": "^3.2.2",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/util-endpoints/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/util-format-url": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.910.0.tgz",
+			"integrity": "sha512-cYfgDGxZnrAq7wvntBjW6/ZewRcwywOE1Q9KKPO05ZHXpWCrqKNkx0JG8h2xlu+2qX6lkLZS+NyFAlwCQa0qfA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/querystring-builder": "^4.2.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/util-format-url/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/util-format-url/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/util-locate-window": {
+			"version": "3.893.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz",
+			"integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/util-locate-window/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/util-user-agent-browser": {
+			"version": "3.910.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.910.0.tgz",
+			"integrity": "sha512-iOdrRdLZHrlINk9pezNZ82P/VxO/UmtmpaOAObUN+xplCUJu31WNM2EE/HccC8PQw6XlAudpdA6HDTGiW6yVGg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/types": "^4.7.1",
+				"bowser": "^2.11.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@aws-sdk/util-user-agent-browser/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/util-user-agent-node": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.911.0.tgz",
+			"integrity": "sha512-3l+f6ooLF6Z6Lz0zGi7vSKSUYn/EePPizv88eZQpEAFunBHv+CSVNPtxhxHfkm7X9tTsV4QGZRIqo3taMLolmA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/middleware-user-agent": "3.911.0",
+				"@aws-sdk/types": "3.910.0",
+				"@smithy/node-config-provider": "^4.3.2",
+				"@smithy/types": "^4.7.1",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			},
+			"peerDependencies": {
+				"aws-crt": ">=1.0.0"
+			},
+			"peerDependenciesMeta": {
+				"aws-crt": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/util-utf8-browser": {
+			"version": "3.259.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+			"integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.3.1"
+			}
+		},
+		"node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws-sdk/xml-builder": {
+			"version": "3.911.0",
+			"resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.911.0.tgz",
+			"integrity": "sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.7.1",
+				"fast-xml-parser": "5.2.5",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/xml-builder/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser": {
+			"version": "5.2.5",
+			"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz",
+			"integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/NaturalIntelligence"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"strnum": "^2.1.0"
+			},
+			"bin": {
+				"fxparser": "src/cli/cli.js"
+			}
+		},
+		"node_modules/@aws-sdk/xml-builder/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@aws/lambda-invoke-store": {
+			"version": "0.0.1",
+			"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz",
+			"integrity": "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==",
+			"license": "Apache-2.0",
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@babel/runtime": {
+			"version": "7.28.4",
+			"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
+			"integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6.9.0"
+			}
+		},
+		"node_modules/@colors/colors": {
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+			"integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+			"license": "MIT",
+			"optional": true,
+			"engines": {
+				"node": ">=0.1.90"
+			}
+		},
+		"node_modules/@cspotcode/source-map-support": {
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+			"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+			"license": "MIT",
+			"dependencies": {
+				"@jridgewell/trace-mapping": "0.3.9"
+			},
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/@csstools/color-helpers": {
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
+			"integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/csstools"
+				},
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/csstools"
+				}
+			],
+			"license": "MIT-0",
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/@csstools/css-calc": {
+			"version": "2.1.4",
+			"resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz",
+			"integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/csstools"
+				},
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/csstools"
+				}
+			],
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"peerDependencies": {
+				"@csstools/css-parser-algorithms": "^3.0.5",
+				"@csstools/css-tokenizer": "^3.0.4"
+			}
+		},
+		"node_modules/@csstools/css-color-parser": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
+			"integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/csstools"
+				},
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/csstools"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"@csstools/color-helpers": "^5.1.0",
+				"@csstools/css-calc": "^2.1.4"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"peerDependencies": {
+				"@csstools/css-parser-algorithms": "^3.0.5",
+				"@csstools/css-tokenizer": "^3.0.4"
+			}
+		},
+		"node_modules/@csstools/css-parser-algorithms": {
+			"version": "3.0.5",
+			"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+			"integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/csstools"
+				},
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/csstools"
+				}
+			],
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"peerDependencies": {
+				"@csstools/css-tokenizer": "^3.0.4"
+			}
+		},
+		"node_modules/@csstools/css-tokenizer": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+			"integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/csstools"
+				},
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/csstools"
+				}
+			],
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/@fast-csv/format": {
+			"version": "5.0.5",
+			"resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-5.0.5.tgz",
+			"integrity": "sha512-0P9SJXXnqKdmuWlLaTelqbrfdgN37Mvrb369J6eNmqL41IEIZQmV4sNM4GgAK2Dz3aH04J0HKGDMJFkYObThTw==",
+			"license": "MIT",
+			"dependencies": {
+				"lodash.escaperegexp": "^4.1.2",
+				"lodash.isboolean": "^3.0.3",
+				"lodash.isfunction": "^3.0.9",
+				"lodash.isnil": "^4.0.0"
+			}
+		},
+		"node_modules/@fast-csv/parse": {
+			"version": "5.0.5",
+			"resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-5.0.5.tgz",
+			"integrity": "sha512-M0IbaXZDbxfOnpVE5Kps/a6FGlILLhtLsvWd9qNH3d2TxNnpbNkFf3KD26OmJX6MHq7PdQAl5htStDwnuwHx6w==",
+			"license": "MIT",
+			"dependencies": {
+				"lodash.escaperegexp": "^4.1.2",
+				"lodash.groupby": "^4.6.0",
+				"lodash.isfunction": "^3.0.9",
+				"lodash.isnil": "^4.0.0",
+				"lodash.isundefined": "^3.0.1",
+				"lodash.uniq": "^4.5.0"
+			}
+		},
+		"node_modules/@google/genai": {
+			"version": "1.25.0",
+			"resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.25.0.tgz",
+			"integrity": "sha512-IBNyel/umavam98SQUfvQSvh/Rp6Ql2fysQLqPyWZr5K8d768X9AO+JZU4o+3qvFDUBA0dVYUSkxyYonVcICvA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"google-auth-library": "^9.14.2",
+				"ws": "^8.18.0"
+			},
+			"engines": {
+				"node": ">=20.0.0"
+			},
+			"peerDependencies": {
+				"@modelcontextprotocol/sdk": "^1.11.4"
+			},
+			"peerDependenciesMeta": {
+				"@modelcontextprotocol/sdk": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/@isaacs/cliui": {
+			"version": "8.0.2",
+			"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+			"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+			"license": "ISC",
+			"dependencies": {
+				"string-width": "^5.1.2",
+				"string-width-cjs": "npm:string-width@^4.2.0",
+				"strip-ansi": "^7.0.1",
+				"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+				"wrap-ansi": "^8.1.0",
+				"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+			},
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+			"version": "9.2.2",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+			"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+			"license": "MIT"
+		},
+		"node_modules/@isaacs/cliui/node_modules/string-width": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+			"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+			"license": "MIT",
+			"dependencies": {
+				"eastasianwidth": "^0.2.0",
+				"emoji-regex": "^9.2.2",
+				"strip-ansi": "^7.0.1"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+			"version": "8.1.0",
+			"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+			"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^6.1.0",
+				"string-width": "^5.0.1",
+				"strip-ansi": "^7.0.1"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+			}
+		},
+		"node_modules/@jridgewell/resolve-uri": {
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+			"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6.0.0"
+			}
+		},
+		"node_modules/@jridgewell/sourcemap-codec": {
+			"version": "1.5.5",
+			"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+			"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+			"license": "MIT"
+		},
+		"node_modules/@jridgewell/trace-mapping": {
+			"version": "0.3.9",
+			"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+			"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@jridgewell/resolve-uri": "^3.0.3",
+				"@jridgewell/sourcemap-codec": "^1.4.10"
+			}
+		},
+		"node_modules/@kwsites/file-exists": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
+			"integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
+			"license": "MIT",
+			"dependencies": {
+				"debug": "^4.1.1"
+			}
+		},
+		"node_modules/@kwsites/promise-deferred": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
+			"integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
+			"license": "MIT"
+		},
+		"node_modules/@lmstudio/lms-isomorphic": {
+			"version": "0.4.6",
+			"resolved": "https://registry.npmjs.org/@lmstudio/lms-isomorphic/-/lms-isomorphic-0.4.6.tgz",
+			"integrity": "sha512-v0LIjXKnDe3Ff3XZO5eQjlVxTjleUHXaom14MV7QU9bvwaoo3l5p71+xJ3mmSaqZq370CQ6pTKCn1Bb7Jf+VwQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"ws": "^8.16.0"
+			}
+		},
+		"node_modules/@lmstudio/sdk": {
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/@lmstudio/sdk/-/sdk-1.5.0.tgz",
+			"integrity": "sha512-fdY12x4hb14PEjYijh7YeCqT1ZDY5Ok6VR4l4+E/dI+F6NW8oB+P83Sxed5vqE4XgTzbgyPuSR2ZbMNxxF+6jA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@lmstudio/lms-isomorphic": "^0.4.6",
+				"chalk": "^4.1.2",
+				"jsonschema": "^1.5.0",
+				"zod": "^3.22.4",
+				"zod-to-json-schema": "^3.22.5"
+			}
+		},
+		"node_modules/@lmstudio/sdk/node_modules/ansi-styles": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+			"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+			"license": "MIT",
+			"dependencies": {
+				"color-convert": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+			}
+		},
+		"node_modules/@lmstudio/sdk/node_modules/chalk": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+			"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^4.1.0",
+				"supports-color": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/chalk?sponsor=1"
+			}
+		},
+		"node_modules/@lmstudio/sdk/node_modules/supports-color": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+			"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+			"license": "MIT",
+			"dependencies": {
+				"has-flag": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/@mistralai/mistralai": {
+			"version": "1.10.0",
+			"resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-1.10.0.tgz",
+			"integrity": "sha512-tdIgWs4Le8vpvPiUEWne6tK0qbVc+jMenujnvTqOjogrJUsCSQhus0tHTU1avDDh5//Rq2dFgP9mWRAdIEoBqg==",
+			"dependencies": {
+				"zod": "^3.20.0",
+				"zod-to-json-schema": "^3.24.1"
+			}
+		},
+		"node_modules/@mixmark-io/domino": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz",
+			"integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==",
+			"license": "BSD-2-Clause"
+		},
+		"node_modules/@modelcontextprotocol/sdk": {
+			"version": "1.12.0",
+			"resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.12.0.tgz",
+			"integrity": "sha512-m//7RlINx1F3sz3KqwY1WWzVgTcYX52HYk4bJ1hkBXV3zccAEth+jRvG8DBRrdaQuRsPAJOx2MH3zaHNCKL7Zg==",
+			"license": "MIT",
+			"dependencies": {
+				"ajv": "^6.12.6",
+				"content-type": "^1.0.5",
+				"cors": "^2.8.5",
+				"cross-spawn": "^7.0.5",
+				"eventsource": "^3.0.2",
+				"express": "^5.0.1",
+				"express-rate-limit": "^7.5.0",
+				"pkce-challenge": "^5.0.0",
+				"raw-body": "^3.0.0",
+				"zod": "^3.23.8",
+				"zod-to-json-schema": "^3.24.1"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/@modelcontextprotocol/sdk/node_modules/ajv": {
+			"version": "6.12.6",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+			"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+			"license": "MIT",
+			"dependencies": {
+				"fast-deep-equal": "^3.1.1",
+				"fast-json-stable-stringify": "^2.0.0",
+				"json-schema-traverse": "^0.4.1",
+				"uri-js": "^4.2.2"
+			},
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/epoberezkin"
+			}
+		},
+		"node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": {
+			"version": "0.4.1",
+			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+			"license": "MIT"
+		},
+		"node_modules/@pkgjs/parseargs": {
+			"version": "0.11.0",
+			"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+			"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+			"license": "MIT",
+			"optional": true,
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/@pnpm/config.env-replace": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+			"integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12.22.0"
+			}
+		},
+		"node_modules/@pnpm/network.ca-file": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+			"integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+			"license": "MIT",
+			"dependencies": {
+				"graceful-fs": "4.2.10"
+			},
+			"engines": {
+				"node": ">=12.22.0"
+			}
+		},
+		"node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
+			"version": "4.2.10",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+			"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+			"license": "ISC"
+		},
+		"node_modules/@pnpm/npm-conf": {
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz",
+			"integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
+			"license": "MIT",
+			"dependencies": {
+				"@pnpm/config.env-replace": "^1.1.0",
+				"@pnpm/network.ca-file": "^1.0.1",
+				"config-chain": "^1.1.11"
+			},
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/@puppeteer/browsers": {
+			"version": "2.10.12",
+			"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.12.tgz",
+			"integrity": "sha512-mP9iLFZwH+FapKJLeA7/fLqOlSUwYpMwjR1P5J23qd4e7qGJwecJccJqHYrjw33jmIZYV4dtiTHPD/J+1e7cEw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"debug": "^4.4.3",
+				"extract-zip": "^2.0.1",
+				"progress": "^2.0.3",
+				"proxy-agent": "^6.5.0",
+				"semver": "^7.7.3",
+				"tar-fs": "^3.1.1",
+				"yargs": "^17.7.2"
+			},
+			"bin": {
+				"browsers": "lib/cjs/main-cli.js"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/@qdrant/js-client-rest": {
+			"version": "1.15.1",
+			"resolved": "https://registry.npmjs.org/@qdrant/js-client-rest/-/js-client-rest-1.15.1.tgz",
+			"integrity": "sha512-FAPMz6Z7RFj9vUun8R9e8SYcX6EkZtdfYfnh5lFXWcjEaat9q/jce1baAJCWAr3k8yHh62HpzCRYOatLVII28g==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@qdrant/openapi-typescript-fetch": "1.2.6",
+				"@sevinf/maybe": "0.5.0",
+				"undici": "^6.0.0"
+			},
+			"engines": {
+				"node": ">=18.17.0",
+				"pnpm": ">=8"
+			},
+			"peerDependencies": {
+				"typescript": ">=4.7"
+			}
+		},
+		"node_modules/@qdrant/js-client-rest/node_modules/undici": {
+			"version": "6.22.0",
+			"resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz",
+			"integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18.17"
+			}
+		},
+		"node_modules/@qdrant/openapi-typescript-fetch": {
+			"version": "1.2.6",
+			"resolved": "https://registry.npmjs.org/@qdrant/openapi-typescript-fetch/-/openapi-typescript-fetch-1.2.6.tgz",
+			"integrity": "sha512-oQG/FejNpItrxRHoyctYvT3rwGZOnK4jr3JdppO/c78ktDvkWiPXPHNsrDf33K9sZdRb6PR7gi4noIapu5q4HA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18.0.0",
+				"pnpm": ">=8"
+			}
+		},
+		"node_modules/@sevinf/maybe": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/@sevinf/maybe/-/maybe-0.5.0.tgz",
+			"integrity": "sha512-ARhyoYDnY1LES3vYI0fiG6e9esWfTNcXcO6+MPJJXcnyMV3bim4lnFt45VXouV7y82F4x3YH8nOQ6VztuvUiWg==",
+			"license": "MIT"
+		},
+		"node_modules/@shikijs/core": {
+			"version": "3.13.0",
+			"resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.13.0.tgz",
+			"integrity": "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==",
+			"license": "MIT",
+			"dependencies": {
+				"@shikijs/types": "3.13.0",
+				"@shikijs/vscode-textmate": "^10.0.2",
+				"@types/hast": "^3.0.4",
+				"hast-util-to-html": "^9.0.5"
+			}
+		},
+		"node_modules/@shikijs/engine-javascript": {
+			"version": "3.13.0",
+			"resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.13.0.tgz",
+			"integrity": "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==",
+			"license": "MIT",
+			"dependencies": {
+				"@shikijs/types": "3.13.0",
+				"@shikijs/vscode-textmate": "^10.0.2",
+				"oniguruma-to-es": "^4.3.3"
+			}
+		},
+		"node_modules/@shikijs/engine-oniguruma": {
+			"version": "3.13.0",
+			"resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.13.0.tgz",
+			"integrity": "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==",
+			"license": "MIT",
+			"dependencies": {
+				"@shikijs/types": "3.13.0",
+				"@shikijs/vscode-textmate": "^10.0.2"
+			}
+		},
+		"node_modules/@shikijs/langs": {
+			"version": "3.13.0",
+			"resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.13.0.tgz",
+			"integrity": "sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@shikijs/types": "3.13.0"
+			}
+		},
+		"node_modules/@shikijs/themes": {
+			"version": "3.13.0",
+			"resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.13.0.tgz",
+			"integrity": "sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==",
+			"license": "MIT",
+			"dependencies": {
+				"@shikijs/types": "3.13.0"
+			}
+		},
+		"node_modules/@shikijs/types": {
+			"version": "3.13.0",
+			"resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz",
+			"integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==",
+			"license": "MIT",
+			"dependencies": {
+				"@shikijs/vscode-textmate": "^10.0.2",
+				"@types/hast": "^3.0.4"
+			}
+		},
+		"node_modules/@shikijs/vscode-textmate": {
+			"version": "10.0.2",
+			"resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+			"integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+			"license": "MIT"
+		},
+		"node_modules/@sindresorhus/is": {
+			"version": "4.6.0",
+			"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+			"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sindresorhus/is?sponsor=1"
+			}
+		},
+		"node_modules/@smithy/abort-controller": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.3.tgz",
+			"integrity": "sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/abort-controller/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/abort-controller/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/config-resolver": {
+			"version": "4.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.3.3.tgz",
+			"integrity": "sha512-xSql8A1Bl41O9JvGU/CtgiLBlwkvpHTSKRlvz9zOBvBCPjXghZ6ZkcVzmV2f7FLAA+80+aqKmIOmy8pEDrtCaw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/node-config-provider": "^4.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-config-provider": "^4.2.0",
+				"@smithy/util-middleware": "^4.2.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/config-resolver/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/config-resolver/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/core": {
+			"version": "3.17.0",
+			"resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.17.0.tgz",
+			"integrity": "sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/middleware-serde": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-base64": "^4.3.0",
+				"@smithy/util-body-length-browser": "^4.2.0",
+				"@smithy/util-middleware": "^4.2.3",
+				"@smithy/util-stream": "^4.5.3",
+				"@smithy/util-utf8": "^4.2.0",
+				"@smithy/uuid": "^1.1.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/core/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/core/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/core/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/core/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/credential-provider-imds": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.3.tgz",
+			"integrity": "sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/node-config-provider": "^4.3.3",
+				"@smithy/property-provider": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/url-parser": "^4.2.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/credential-provider-imds/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/eventstream-codec": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.3.tgz",
+			"integrity": "sha512-rcr0VH0uNoMrtgKuY7sMfyKqbHc4GQaQ6Yp4vwgm+Z6psPuOgL+i/Eo/QWdXRmMinL3EgFM0Z1vkfyPyfzLmjw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/crc32": "5.2.0",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-hex-encoding": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-codec/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/eventstream-serde-browser": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.3.tgz",
+			"integrity": "sha512-EcS0kydOr2qJ3vV45y7nWnTlrPmVIMbUFOZbMG80+e2+xePQISX9DrcbRpVRFTS5Nqz3FiEbDcTCAV0or7bqdw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/eventstream-serde-universal": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-browser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/eventstream-serde-config-resolver": {
+			"version": "4.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.3.tgz",
+			"integrity": "sha512-GewKGZ6lIJ9APjHFqR2cUW+Efp98xLu1KmN0jOWxQ1TN/gx3HTUPVbLciFD8CfScBj2IiKifqh9vYFRRXrYqXA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-config-resolver/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/eventstream-serde-node": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz",
+			"integrity": "sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/eventstream-serde-universal": "^2.2.0",
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/@aws-crypto/crc32": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz",
+			"integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/util": "^3.0.0",
+				"@aws-sdk/types": "^3.222.0",
+				"tslib": "^1.11.1"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/@aws-crypto/crc32/node_modules/tslib": {
+			"version": "1.14.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/@aws-crypto/util": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+			"integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-sdk/types": "^3.222.0",
+				"@aws-sdk/util-utf8-browser": "^3.0.0",
+				"tslib": "^1.11.1"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/@aws-crypto/util/node_modules/tslib": {
+			"version": "1.14.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/eventstream-codec": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz",
+			"integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@aws-crypto/crc32": "3.0.0",
+				"@smithy/types": "^2.12.0",
+				"@smithy/util-hex-encoding": "^2.2.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/eventstream-serde-universal": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz",
+			"integrity": "sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/eventstream-codec": "^2.2.0",
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/util-hex-encoding": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz",
+			"integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-node/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/eventstream-serde-universal": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.3.tgz",
+			"integrity": "sha512-QIvH/CKOk1BZPz/iwfgbh1SQD5Y0lpaw2kLA8zpLRRtYMPXeYUEWh+moTaJyqDaKlbrB174kB7FSRFiZ735tWw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/eventstream-codec": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/eventstream-serde-universal/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/fetch-http-handler": {
+			"version": "5.3.4",
+			"resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.4.tgz",
+			"integrity": "sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/querystring-builder": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-base64": "^4.3.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/fetch-http-handler/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/fetch-http-handler/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/fetch-http-handler/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/hash-node": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.3.tgz",
+			"integrity": "sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/hash-node/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/hash-node/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/invalid-dependency": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.3.tgz",
+			"integrity": "sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/invalid-dependency/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/is-array-buffer": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz",
+			"integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/is-array-buffer/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/middleware-content-length": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.3.tgz",
+			"integrity": "sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-content-length/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/middleware-endpoint": {
+			"version": "4.3.4",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.4.tgz",
+			"integrity": "sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-serde": "^4.2.3",
+				"@smithy/node-config-provider": "^4.3.3",
+				"@smithy/shared-ini-file-loader": "^4.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/url-parser": "^4.2.3",
+				"@smithy/util-middleware": "^4.2.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-endpoint/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-endpoint/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/middleware-retry": {
+			"version": "4.4.4",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.4.tgz",
+			"integrity": "sha512-vSgABQAkuUHRO03AhR2rWxVQ1un284lkBn+NFawzdahmzksAoOeVMnXXsuPViL4GlhRHXqFaMlc8Mj04OfQk1w==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/node-config-provider": "^4.3.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/service-error-classification": "^4.2.3",
+				"@smithy/smithy-client": "^4.9.0",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-middleware": "^4.2.3",
+				"@smithy/util-retry": "^4.2.3",
+				"@smithy/uuid": "^1.1.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-retry/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-retry/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-retry/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/middleware-serde": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.3.tgz",
+			"integrity": "sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-serde/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-serde/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-serde/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/middleware-stack": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.3.tgz",
+			"integrity": "sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-stack/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/middleware-stack/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/node-config-provider": {
+			"version": "4.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.3.tgz",
+			"integrity": "sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/property-provider": "^4.2.3",
+				"@smithy/shared-ini-file-loader": "^4.3.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/node-config-provider/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/node-config-provider/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/node-http-handler": {
+			"version": "4.4.2",
+			"resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.2.tgz",
+			"integrity": "sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/abort-controller": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/querystring-builder": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/node-http-handler/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/node-http-handler/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/property-provider": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.3.tgz",
+			"integrity": "sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/property-provider/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/property-provider/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/protocol-http": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz",
+			"integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/protocol-http/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/querystring-builder": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.3.tgz",
+			"integrity": "sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-uri-escape": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/querystring-builder/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/querystring-builder/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/querystring-parser": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.3.tgz",
+			"integrity": "sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/querystring-parser/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/querystring-parser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/service-error-classification": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.3.tgz",
+			"integrity": "sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/service-error-classification/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/service-error-classification/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/shared-ini-file-loader": {
+			"version": "4.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.3.3.tgz",
+			"integrity": "sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/shared-ini-file-loader/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/signature-v4": {
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.2.tgz",
+			"integrity": "sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^3.0.0",
+				"@smithy/types": "^3.3.0",
+				"@smithy/util-hex-encoding": "^3.0.0",
+				"@smithy/util-middleware": "^3.0.3",
+				"@smithy/util-uri-escape": "^3.0.0",
+				"@smithy/util-utf8": "^3.0.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/signature-v4/node_modules/@smithy/types": {
+			"version": "3.7.2",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz",
+			"integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz",
+			"integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^3.0.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/signature-v4/node_modules/@smithy/util-hex-encoding": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz",
+			"integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": {
+			"version": "3.0.11",
+			"resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz",
+			"integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^3.7.2",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/signature-v4/node_modules/@smithy/util-uri-escape": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz",
+			"integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz",
+			"integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^3.0.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			}
+		},
+		"node_modules/@smithy/signature-v4/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/smithy-client": {
+			"version": "2.5.1",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.1.tgz",
+			"integrity": "sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/middleware-endpoint": "^2.5.1",
+				"@smithy/middleware-stack": "^2.2.0",
+				"@smithy/protocol-http": "^3.3.0",
+				"@smithy/types": "^2.12.0",
+				"@smithy/util-stream": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/abort-controller": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz",
+			"integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/fetch-http-handler": {
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz",
+			"integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/protocol-http": "^3.3.0",
+				"@smithy/querystring-builder": "^2.2.0",
+				"@smithy/types": "^2.12.0",
+				"@smithy/util-base64": "^2.3.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/middleware-endpoint": {
+			"version": "2.5.1",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz",
+			"integrity": "sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/middleware-serde": "^2.3.0",
+				"@smithy/node-config-provider": "^2.3.0",
+				"@smithy/shared-ini-file-loader": "^2.4.0",
+				"@smithy/types": "^2.12.0",
+				"@smithy/url-parser": "^2.2.0",
+				"@smithy/util-middleware": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/middleware-serde": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz",
+			"integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/middleware-stack": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz",
+			"integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/node-config-provider": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz",
+			"integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/property-provider": "^2.2.0",
+				"@smithy/shared-ini-file-loader": "^2.4.0",
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/node-http-handler": {
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz",
+			"integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/abort-controller": "^2.2.0",
+				"@smithy/protocol-http": "^3.3.0",
+				"@smithy/querystring-builder": "^2.2.0",
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/property-provider": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz",
+			"integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/querystring-builder": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz",
+			"integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"@smithy/util-uri-escape": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/querystring-parser": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz",
+			"integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/shared-ini-file-loader": {
+			"version": "2.4.0",
+			"resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz",
+			"integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/url-parser": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz",
+			"integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/querystring-parser": "^2.2.0",
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/util-hex-encoding": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz",
+			"integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/util-middleware": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz",
+			"integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^2.12.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/util-stream": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz",
+			"integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/fetch-http-handler": "^2.5.0",
+				"@smithy/node-http-handler": "^2.5.0",
+				"@smithy/types": "^2.12.0",
+				"@smithy/util-base64": "^2.3.0",
+				"@smithy/util-buffer-from": "^2.2.0",
+				"@smithy/util-hex-encoding": "^2.2.0",
+				"@smithy/util-utf8": "^2.3.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/util-uri-escape": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz",
+			"integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/smithy-client/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/types": {
+			"version": "2.12.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz",
+			"integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/types/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/url-parser": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.3.tgz",
+			"integrity": "sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/querystring-parser": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/url-parser/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/url-parser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-base64": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz",
+			"integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"@smithy/util-utf8": "^2.3.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/util-base64/node_modules/@smithy/is-array-buffer": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+			"integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+			"integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/util-base64/node_modules/@smithy/util-utf8": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+			"integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^2.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/@smithy/util-base64/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-body-length-browser": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz",
+			"integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-body-length-browser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-body-length-node": {
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz",
+			"integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-body-length-node/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-buffer-from": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz",
+			"integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/is-array-buffer": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-buffer-from/node_modules/@smithy/is-array-buffer": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz",
+			"integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-buffer-from/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-config-provider": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz",
+			"integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-config-provider/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-defaults-mode-browser": {
+			"version": "4.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.3.tgz",
+			"integrity": "sha512-vqHoybAuZXbFXZqgzquiUXtdY+UT/aU33sxa4GBPkiYklmR20LlCn+d3Wc3yA5ZM13gQ92SZe/D8xh6hkjx+IQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/property-provider": "^4.2.3",
+				"@smithy/smithy-client": "^4.9.0",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-defaults-mode-node": {
+			"version": "4.2.4",
+			"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.4.tgz",
+			"integrity": "sha512-X5/xrPHedifo7hJUUWKlpxVb2oDOiqPUXlvsZv1EZSjILoutLiJyWva3coBpn00e/gPSpH8Rn2eIbgdwHQdW7Q==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/config-resolver": "^4.3.3",
+				"@smithy/credential-provider-imds": "^4.2.3",
+				"@smithy/node-config-provider": "^4.3.3",
+				"@smithy/property-provider": "^4.2.3",
+				"@smithy/smithy-client": "^4.9.0",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/protocol-http": {
+			"version": "5.3.3",
+			"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.3.tgz",
+			"integrity": "sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/smithy-client": {
+			"version": "4.9.0",
+			"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz",
+			"integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/core": "^3.17.0",
+				"@smithy/middleware-endpoint": "^4.3.4",
+				"@smithy/middleware-stack": "^4.2.3",
+				"@smithy/protocol-http": "^5.3.3",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-stream": "^4.5.3",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-endpoints": {
+			"version": "3.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.3.tgz",
+			"integrity": "sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/node-config-provider": "^4.3.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-endpoints/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-endpoints/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-hex-encoding": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz",
+			"integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-hex-encoding/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-middleware": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.3.tgz",
+			"integrity": "sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-middleware/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-middleware/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-retry": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.3.tgz",
+			"integrity": "sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/service-error-classification": "^4.2.3",
+				"@smithy/types": "^4.8.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-retry/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-retry/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-stream": {
+			"version": "4.5.3",
+			"resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.3.tgz",
+			"integrity": "sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/fetch-http-handler": "^5.3.4",
+				"@smithy/node-http-handler": "^4.4.2",
+				"@smithy/types": "^4.8.0",
+				"@smithy/util-base64": "^4.3.0",
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-hex-encoding": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-stream/node_modules/@smithy/types": {
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.8.0.tgz",
+			"integrity": "sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-stream/node_modules/@smithy/util-base64": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz",
+			"integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"@smithy/util-utf8": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-stream/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-uri-escape": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz",
+			"integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-uri-escape/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/util-utf8": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz",
+			"integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@smithy/util-buffer-from": "^4.2.0",
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/util-utf8/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@smithy/uuid": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz",
+			"integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"tslib": "^2.6.2"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/@smithy/uuid/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/@socket.io/component-emitter": {
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+			"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+			"license": "MIT"
+		},
+		"node_modules/@tootallnate/quickjs-emscripten": {
+			"version": "0.23.0",
+			"resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+			"integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
+			"license": "MIT"
+		},
+		"node_modules/@tsconfig/node10": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+			"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+			"license": "MIT"
+		},
+		"node_modules/@tsconfig/node12": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+			"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+			"license": "MIT"
+		},
+		"node_modules/@tsconfig/node14": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+			"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+			"license": "MIT"
+		},
+		"node_modules/@tsconfig/node16": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+			"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+			"license": "MIT"
+		},
+		"node_modules/@types/gradient-string": {
+			"version": "1.1.6",
+			"resolved": "https://registry.npmjs.org/@types/gradient-string/-/gradient-string-1.1.6.tgz",
+			"integrity": "sha512-LkaYxluY4G5wR1M4AKQUal2q61Di1yVVCw42ImFTuaIoQVgmV0WP1xUaLB8zwb47mp82vWTpePI9JmrjEnJ7nQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/tinycolor2": "*"
+			}
+		},
+		"node_modules/@types/hast": {
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+			"integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "*"
+			}
+		},
+		"node_modules/@types/mdast": {
+			"version": "4.0.4",
+			"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+			"integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "*"
+			}
+		},
+		"node_modules/@types/node": {
+			"version": "24.8.1",
+			"resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz",
+			"integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==",
+			"license": "MIT",
+			"dependencies": {
+				"undici-types": "~7.14.0"
+			}
+		},
+		"node_modules/@types/tinycolor2": {
+			"version": "1.4.6",
+			"resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz",
+			"integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==",
+			"license": "MIT"
+		},
+		"node_modules/@types/unist": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+			"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+			"license": "MIT"
+		},
+		"node_modules/@types/yauzl": {
+			"version": "2.10.3",
+			"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+			"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+			"license": "MIT",
+			"optional": true,
+			"dependencies": {
+				"@types/node": "*"
+			}
+		},
+		"node_modules/@ungap/structured-clone": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+			"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+			"license": "ISC"
+		},
+		"node_modules/@vscode/codicons": {
+			"version": "0.0.36",
+			"resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.36.tgz",
+			"integrity": "sha512-wsNOvNMMJ2BY8rC2N2MNBG7yOowV3ov8KlvUE/AiVUlHKTfWsw3OgAOQduX7h0Un6GssKD3aoTVH+TF3DSQwKQ==",
+			"license": "CC-BY-4.0"
+		},
+		"node_modules/@vscode/ripgrep": {
+			"version": "1.15.14",
+			"resolved": "https://registry.npmjs.org/@vscode/ripgrep/-/ripgrep-1.15.14.tgz",
+			"integrity": "sha512-/G1UJPYlm+trBWQ6cMO3sv6b8D1+G16WaJH1/DSqw32JOVlzgZbLkDxRyzIpTpv30AcYGMkCf5tUqGlW6HbDWw==",
+			"hasInstallScript": true,
+			"license": "MIT",
+			"dependencies": {
+				"https-proxy-agent": "^7.0.2",
+				"proxy-from-env": "^1.1.0",
+				"yauzl": "^2.9.2"
+			}
+		},
+		"node_modules/@xmldom/xmldom": {
+			"version": "0.8.11",
+			"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
+			"integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10.0.0"
+			}
+		},
+		"node_modules/abort-controller": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+			"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+			"license": "MIT",
+			"dependencies": {
+				"event-target-shim": "^5.0.0"
+			},
+			"engines": {
+				"node": ">=6.5"
+			}
+		},
+		"node_modules/accepts": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+			"integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+			"license": "MIT",
+			"dependencies": {
+				"mime-types": "^3.0.0",
+				"negotiator": "^1.0.0"
+			},
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/acorn": {
+			"version": "8.15.0",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+			"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+			"license": "MIT",
+			"bin": {
+				"acorn": "bin/acorn"
+			},
+			"engines": {
+				"node": ">=0.4.0"
+			}
+		},
+		"node_modules/acorn-walk": {
+			"version": "8.3.4",
+			"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+			"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+			"license": "MIT",
+			"dependencies": {
+				"acorn": "^8.11.0"
+			},
+			"engines": {
+				"node": ">=0.4.0"
+			}
+		},
+		"node_modules/agent-base": {
+			"version": "7.1.4",
+			"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+			"integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/ajv": {
+			"version": "8.17.1",
+			"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+			"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+			"license": "MIT",
+			"dependencies": {
+				"fast-deep-equal": "^3.1.3",
+				"fast-uri": "^3.0.1",
+				"json-schema-traverse": "^1.0.0",
+				"require-from-string": "^2.0.2"
+			},
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/epoberezkin"
+			}
+		},
+		"node_modules/ansi-escapes": {
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz",
+			"integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==",
+			"license": "MIT",
+			"dependencies": {
+				"environment": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/ansi-regex": {
+			"version": "6.2.2",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+			"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
+			}
+		},
+		"node_modules/ansi-styles": {
+			"version": "6.2.3",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+			"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+			}
+		},
+		"node_modules/ansicolors": {
+			"version": "0.3.2",
+			"resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
+			"integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
+			"license": "MIT"
+		},
+		"node_modules/archiver": {
+			"version": "7.0.1",
+			"resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz",
+			"integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==",
+			"license": "MIT",
+			"dependencies": {
+				"archiver-utils": "^5.0.2",
+				"async": "^3.2.4",
+				"buffer-crc32": "^1.0.0",
+				"readable-stream": "^4.0.0",
+				"readdir-glob": "^1.1.2",
+				"tar-stream": "^3.0.0",
+				"zip-stream": "^6.0.1"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/archiver-utils": {
+			"version": "5.0.2",
+			"resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz",
+			"integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==",
+			"license": "MIT",
+			"dependencies": {
+				"glob": "^10.0.0",
+				"graceful-fs": "^4.2.0",
+				"is-stream": "^2.0.1",
+				"lazystream": "^1.0.0",
+				"lodash": "^4.17.15",
+				"normalize-path": "^3.0.0",
+				"readable-stream": "^4.0.0"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/archiver-utils/node_modules/readable-stream": {
+			"version": "4.7.0",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+			"integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+			"license": "MIT",
+			"dependencies": {
+				"abort-controller": "^3.0.0",
+				"buffer": "^6.0.3",
+				"events": "^3.3.0",
+				"process": "^0.11.10",
+				"string_decoder": "^1.3.0"
+			},
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			}
+		},
+		"node_modules/archiver/node_modules/readable-stream": {
+			"version": "4.7.0",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+			"integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+			"license": "MIT",
+			"dependencies": {
+				"abort-controller": "^3.0.0",
+				"buffer": "^6.0.3",
+				"events": "^3.3.0",
+				"process": "^0.11.10",
+				"string_decoder": "^1.3.0"
+			},
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			}
+		},
+		"node_modules/arg": {
+			"version": "4.1.3",
+			"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+			"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+			"license": "MIT"
+		},
+		"node_modules/argparse": {
+			"version": "1.0.10",
+			"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+			"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+			"license": "MIT",
+			"dependencies": {
+				"sprintf-js": "~1.0.2"
+			}
+		},
+		"node_modules/ast-types": {
+			"version": "0.13.4",
+			"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+			"integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+			"license": "MIT",
+			"dependencies": {
+				"tslib": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/ast-types/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/async": {
+			"version": "3.2.6",
+			"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+			"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+			"license": "MIT"
+		},
+		"node_modules/async-mutex": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz",
+			"integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==",
+			"license": "MIT",
+			"dependencies": {
+				"tslib": "^2.4.0"
+			}
+		},
+		"node_modules/async-mutex/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/asynckit": {
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+			"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+			"license": "MIT"
+		},
+		"node_modules/auto-bind": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz",
+			"integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==",
+			"license": "MIT",
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/axios": {
+			"version": "1.12.2",
+			"resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz",
+			"integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==",
+			"license": "MIT",
+			"dependencies": {
+				"follow-redirects": "^1.15.6",
+				"form-data": "^4.0.4",
+				"proxy-from-env": "^1.1.0"
+			}
+		},
+		"node_modules/b4a": {
+			"version": "1.7.3",
+			"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
+			"integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
+			"license": "Apache-2.0",
+			"peerDependencies": {
+				"react-native-b4a": "*"
+			},
+			"peerDependenciesMeta": {
+				"react-native-b4a": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/balanced-match": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+			"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+			"license": "MIT"
+		},
+		"node_modules/bare-events": {
+			"version": "2.8.0",
+			"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz",
+			"integrity": "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==",
+			"license": "Apache-2.0",
+			"peerDependencies": {
+				"bare-abort-controller": "*"
+			},
+			"peerDependenciesMeta": {
+				"bare-abort-controller": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/bare-fs": {
+			"version": "4.4.11",
+			"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.11.tgz",
+			"integrity": "sha512-Bejmm9zRMvMTRoHS+2adgmXw1ANZnCNx+B5dgZpGwlP1E3x6Yuxea8RToddHUbWtVV0iUMWqsgZr8+jcgUI2SA==",
+			"license": "Apache-2.0",
+			"optional": true,
+			"dependencies": {
+				"bare-events": "^2.5.4",
+				"bare-path": "^3.0.0",
+				"bare-stream": "^2.6.4",
+				"bare-url": "^2.2.2",
+				"fast-fifo": "^1.3.2"
+			},
+			"engines": {
+				"bare": ">=1.16.0"
+			},
+			"peerDependencies": {
+				"bare-buffer": "*"
+			},
+			"peerDependenciesMeta": {
+				"bare-buffer": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/bare-os": {
+			"version": "3.6.2",
+			"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
+			"integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
+			"license": "Apache-2.0",
+			"optional": true,
+			"engines": {
+				"bare": ">=1.14.0"
+			}
+		},
+		"node_modules/bare-path": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
+			"integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+			"license": "Apache-2.0",
+			"optional": true,
+			"dependencies": {
+				"bare-os": "^3.0.1"
+			}
+		},
+		"node_modules/bare-stream": {
+			"version": "2.7.0",
+			"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
+			"integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
+			"license": "Apache-2.0",
+			"optional": true,
+			"dependencies": {
+				"streamx": "^2.21.0"
+			},
+			"peerDependencies": {
+				"bare-buffer": "*",
+				"bare-events": "*"
+			},
+			"peerDependenciesMeta": {
+				"bare-buffer": {
+					"optional": true
+				},
+				"bare-events": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/bare-url": {
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.1.tgz",
+			"integrity": "sha512-v2yl0TnaZTdEnelkKtXZGnotiV6qATBlnNuUMrHl6v9Lmmrh9mw9RYyImPU7/4RahumSwQS1k2oKXcRfXcbjJw==",
+			"license": "Apache-2.0",
+			"optional": true,
+			"dependencies": {
+				"bare-path": "^3.0.0"
+			}
+		},
+		"node_modules/base64-js": {
+			"version": "1.5.1",
+			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+			"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/feross"
+				},
+				{
+					"type": "patreon",
+					"url": "https://www.patreon.com/feross"
+				},
+				{
+					"type": "consulting",
+					"url": "https://feross.org/support"
+				}
+			],
+			"license": "MIT"
+		},
+		"node_modules/basic-ftp": {
+			"version": "5.0.5",
+			"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
+			"integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10.0.0"
+			}
+		},
+		"node_modules/bignumber.js": {
+			"version": "9.3.1",
+			"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
+			"integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
+			"license": "MIT",
+			"engines": {
+				"node": "*"
+			}
+		},
+		"node_modules/bluebird": {
+			"version": "3.4.7",
+			"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz",
+			"integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==",
+			"license": "MIT"
+		},
+		"node_modules/body-parser": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
+			"integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
+			"license": "MIT",
+			"dependencies": {
+				"bytes": "^3.1.2",
+				"content-type": "^1.0.5",
+				"debug": "^4.4.0",
+				"http-errors": "^2.0.0",
+				"iconv-lite": "^0.6.3",
+				"on-finished": "^2.4.1",
+				"qs": "^6.14.0",
+				"raw-body": "^3.0.0",
+				"type-is": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/boolbase": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+			"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+			"license": "ISC"
+		},
+		"node_modules/bowser": {
+			"version": "2.12.1",
+			"resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz",
+			"integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==",
+			"license": "MIT"
+		},
+		"node_modules/brace-expansion": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+			"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+			"license": "MIT",
+			"dependencies": {
+				"balanced-match": "^1.0.0"
+			}
+		},
+		"node_modules/buffer": {
+			"version": "6.0.3",
+			"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+			"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/feross"
+				},
+				{
+					"type": "patreon",
+					"url": "https://www.patreon.com/feross"
+				},
+				{
+					"type": "consulting",
+					"url": "https://feross.org/support"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"base64-js": "^1.3.1",
+				"ieee754": "^1.2.1"
+			}
+		},
+		"node_modules/buffer-crc32": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
+			"integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8.0.0"
+			}
+		},
+		"node_modules/buffer-equal-constant-time": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+			"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/bytes": {
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+			"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/call-bind-apply-helpers": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+			"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+			"license": "MIT",
+			"dependencies": {
+				"es-errors": "^1.3.0",
+				"function-bind": "^1.1.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/call-bound": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+			"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+			"license": "MIT",
+			"dependencies": {
+				"call-bind-apply-helpers": "^1.0.2",
+				"get-intrinsic": "^1.3.0"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/cardinal": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
+			"integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==",
+			"license": "MIT",
+			"dependencies": {
+				"ansicolors": "~0.3.2",
+				"redeyed": "~2.1.0"
+			},
+			"bin": {
+				"cdl": "bin/cdl.js"
+			}
+		},
+		"node_modules/ccount": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+			"integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/cfonts": {
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/cfonts/-/cfonts-3.3.1.tgz",
+			"integrity": "sha512-ZGEmN3W9mViWEDjsuPo4nK4h39sfh6YtoneFYp9WLPI/rw8BaSSrfQC6jkrGW3JMvV3ZnExJB/AEqXc/nHYxkw==",
+			"license": "GPL-3.0-or-later",
+			"dependencies": {
+				"supports-color": "^8",
+				"window-size": "^1"
+			},
+			"bin": {
+				"cfonts": "bin/index.js"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/chalk": {
+			"version": "5.6.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+			"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+			"license": "MIT",
+			"engines": {
+				"node": "^12.17.0 || ^14.13 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/chalk?sponsor=1"
+			}
+		},
+		"node_modules/char-regex": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+			"integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/character-entities-html4": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+			"integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/character-entities-legacy": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+			"integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/cheerio": {
+			"version": "1.1.2",
+			"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz",
+			"integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==",
+			"license": "MIT",
+			"dependencies": {
+				"cheerio-select": "^2.1.0",
+				"dom-serializer": "^2.0.0",
+				"domhandler": "^5.0.3",
+				"domutils": "^3.2.2",
+				"encoding-sniffer": "^0.2.1",
+				"htmlparser2": "^10.0.0",
+				"parse5": "^7.3.0",
+				"parse5-htmlparser2-tree-adapter": "^7.1.0",
+				"parse5-parser-stream": "^7.1.2",
+				"undici": "^7.12.0",
+				"whatwg-mimetype": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=20.18.1"
+			},
+			"funding": {
+				"url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+			}
+		},
+		"node_modules/cheerio-select": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+			"integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"boolbase": "^1.0.0",
+				"css-select": "^5.1.0",
+				"css-what": "^6.1.0",
+				"domelementtype": "^2.3.0",
+				"domhandler": "^5.0.3",
+				"domutils": "^3.0.1"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/fb55"
+			}
+		},
+		"node_modules/chokidar": {
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+			"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+			"license": "MIT",
+			"dependencies": {
+				"readdirp": "^4.0.1"
+			},
+			"engines": {
+				"node": ">= 14.16.0"
+			},
+			"funding": {
+				"url": "https://paulmillr.com/funding/"
+			}
+		},
+		"node_modules/chromium-bidi": {
+			"version": "0.11.0",
+			"resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz",
+			"integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"mitt": "3.0.1",
+				"zod": "3.23.8"
+			},
+			"peerDependencies": {
+				"devtools-protocol": "*"
+			}
+		},
+		"node_modules/chromium-bidi/node_modules/zod": {
+			"version": "3.23.8",
+			"resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
+			"integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+			"license": "MIT",
+			"funding": {
+				"url": "https://github.com/sponsors/colinhacks"
+			}
+		},
+		"node_modules/cli-boxes": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+			"integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/cli-cursor": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+			"integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+			"license": "MIT",
+			"dependencies": {
+				"restore-cursor": "^4.0.0"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/cli-progress": {
+			"version": "3.12.0",
+			"resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
+			"integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
+			"license": "MIT",
+			"dependencies": {
+				"string-width": "^4.2.3"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/cli-progress/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-progress/node_modules/is-fullwidth-code-point": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-progress/node_modules/string-width": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^8.0.0",
+				"is-fullwidth-code-point": "^3.0.0",
+				"strip-ansi": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-progress/node_modules/strip-ansi": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-spinners": {
+			"version": "2.9.2",
+			"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+			"integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/cli-table3": {
+			"version": "0.6.5",
+			"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+			"integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+			"license": "MIT",
+			"dependencies": {
+				"string-width": "^4.2.0"
+			},
+			"engines": {
+				"node": "10.* || >= 12.*"
+			},
+			"optionalDependencies": {
+				"@colors/colors": "1.5.0"
+			}
+		},
+		"node_modules/cli-table3/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-table3/node_modules/is-fullwidth-code-point": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-table3/node_modules/string-width": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^8.0.0",
+				"is-fullwidth-code-point": "^3.0.0",
+				"strip-ansi": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-table3/node_modules/strip-ansi": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cli-truncate": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+			"integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+			"license": "MIT",
+			"dependencies": {
+				"slice-ansi": "^5.0.0",
+				"string-width": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/cli-truncate/node_modules/emoji-regex": {
+			"version": "10.6.0",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+			"integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+			"license": "MIT"
+		},
+		"node_modules/cli-truncate/node_modules/is-fullwidth-code-point": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+			"integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/cli-truncate/node_modules/slice-ansi": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+			"integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^6.0.0",
+				"is-fullwidth-code-point": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/slice-ansi?sponsor=1"
+			}
+		},
+		"node_modules/cli-truncate/node_modules/string-width": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+			"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^10.3.0",
+				"get-east-asian-width": "^1.0.0",
+				"strip-ansi": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/cliui": {
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+			"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+			"license": "ISC",
+			"dependencies": {
+				"string-width": "^4.2.0",
+				"strip-ansi": "^6.0.1",
+				"wrap-ansi": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/cliui/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cliui/node_modules/ansi-styles": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+			"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+			"license": "MIT",
+			"dependencies": {
+				"color-convert": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+			}
+		},
+		"node_modules/cliui/node_modules/is-fullwidth-code-point": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cliui/node_modules/string-width": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^8.0.0",
+				"is-fullwidth-code-point": "^3.0.0",
+				"strip-ansi": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cliui/node_modules/strip-ansi": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/cliui/node_modules/wrap-ansi": {
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+			"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^4.0.0",
+				"string-width": "^4.1.0",
+				"strip-ansi": "^6.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+			}
+		},
+		"node_modules/clone": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+			"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.8"
+			}
+		},
+		"node_modules/clone-deep": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+			"integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+			"license": "MIT",
+			"dependencies": {
+				"is-plain-object": "^2.0.4",
+				"kind-of": "^6.0.2",
+				"shallow-clone": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/code-excerpt": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz",
+			"integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==",
+			"license": "MIT",
+			"dependencies": {
+				"convert-to-spaces": "^2.0.1"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			}
+		},
+		"node_modules/color-convert": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+			"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+			"license": "MIT",
+			"dependencies": {
+				"color-name": "~1.1.4"
+			},
+			"engines": {
+				"node": ">=7.0.0"
+			}
+		},
+		"node_modules/color-name": {
+			"version": "1.1.4",
+			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+			"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+			"license": "MIT"
+		},
+		"node_modules/combined-stream": {
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+			"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+			"license": "MIT",
+			"dependencies": {
+				"delayed-stream": "~1.0.0"
+			},
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/comma-separated-tokens": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+			"integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/commander": {
+			"version": "12.1.0",
+			"resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+			"integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/compress-commons": {
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
+			"integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
+			"license": "MIT",
+			"dependencies": {
+				"crc-32": "^1.2.0",
+				"crc32-stream": "^6.0.0",
+				"is-stream": "^2.0.1",
+				"normalize-path": "^3.0.0",
+				"readable-stream": "^4.0.0"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/compress-commons/node_modules/readable-stream": {
+			"version": "4.7.0",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+			"integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+			"license": "MIT",
+			"dependencies": {
+				"abort-controller": "^3.0.0",
+				"buffer": "^6.0.3",
+				"events": "^3.3.0",
+				"process": "^0.11.10",
+				"string_decoder": "^1.3.0"
+			},
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			}
+		},
+		"node_modules/config-chain": {
+			"version": "1.1.13",
+			"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+			"integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ini": "^1.3.4",
+				"proto-list": "~1.2.1"
+			}
+		},
+		"node_modules/content-disposition": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
+			"integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
+			"license": "MIT",
+			"dependencies": {
+				"safe-buffer": "5.2.1"
+			},
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/content-type": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+			"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/convert-to-spaces": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz",
+			"integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==",
+			"license": "MIT",
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			}
+		},
+		"node_modules/cookie": {
+			"version": "0.7.2",
+			"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+			"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/cookie-signature": {
+			"version": "1.2.2",
+			"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+			"integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6.6.0"
+			}
+		},
+		"node_modules/copyfiles": {
+			"name": "empty-module",
+			"version": "0.0.2",
+			"resolved": "https://registry.npmjs.org/empty-module/-/empty-module-0.0.2.tgz",
+			"integrity": "sha512-NFzPF5kG18UwYoRaXIylf8mpFEGOePZmKnbv3WUsEFxPe0w8NXPovJfm8t+tYoKwYmyRdQ2bZUizl/EiElJ7+g==",
+			"license": "MIT"
+		},
+		"node_modules/core-util-is": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+			"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+			"license": "MIT"
+		},
+		"node_modules/cors": {
+			"version": "2.8.5",
+			"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+			"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+			"license": "MIT",
+			"dependencies": {
+				"object-assign": "^4",
+				"vary": "^1"
+			},
+			"engines": {
+				"node": ">= 0.10"
+			}
+		},
+		"node_modules/crc-32": {
+			"version": "1.2.2",
+			"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+			"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+			"license": "Apache-2.0",
+			"bin": {
+				"crc32": "bin/crc32.njs"
+			},
+			"engines": {
+				"node": ">=0.8"
+			}
+		},
+		"node_modules/crc32-stream": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz",
+			"integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==",
+			"license": "MIT",
+			"dependencies": {
+				"crc-32": "^1.2.0",
+				"readable-stream": "^4.0.0"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/crc32-stream/node_modules/readable-stream": {
+			"version": "4.7.0",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+			"integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+			"license": "MIT",
+			"dependencies": {
+				"abort-controller": "^3.0.0",
+				"buffer": "^6.0.3",
+				"events": "^3.3.0",
+				"process": "^0.11.10",
+				"string_decoder": "^1.3.0"
+			},
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			}
+		},
+		"node_modules/create-require": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+			"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+			"license": "MIT"
+		},
+		"node_modules/cross-spawn": {
+			"version": "7.0.6",
+			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+			"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+			"license": "MIT",
+			"dependencies": {
+				"path-key": "^3.1.0",
+				"shebang-command": "^2.0.0",
+				"which": "^2.0.1"
+			},
+			"engines": {
+				"node": ">= 8"
+			}
+		},
+		"node_modules/css-select": {
+			"version": "5.2.2",
+			"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+			"integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"boolbase": "^1.0.0",
+				"css-what": "^6.1.0",
+				"domhandler": "^5.0.2",
+				"domutils": "^3.0.1",
+				"nth-check": "^2.0.1"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/fb55"
+			}
+		},
+		"node_modules/css-what": {
+			"version": "6.2.2",
+			"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+			"integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">= 6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/fb55"
+			}
+		},
+		"node_modules/cssstyle": {
+			"version": "4.6.0",
+			"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
+			"integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
+			"license": "MIT",
+			"dependencies": {
+				"@asamuzakjp/css-color": "^3.2.0",
+				"rrweb-cssom": "^0.8.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/data-uri-to-buffer": {
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+			"integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/data-urls": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+			"integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+			"license": "MIT",
+			"dependencies": {
+				"whatwg-mimetype": "^4.0.0",
+				"whatwg-url": "^14.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/dayjs": {
+			"version": "1.11.18",
+			"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
+			"integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
+			"license": "MIT"
+		},
+		"node_modules/debug": {
+			"version": "4.4.3",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+			"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+			"license": "MIT",
+			"dependencies": {
+				"ms": "^2.1.3"
+			},
+			"engines": {
+				"node": ">=6.0"
+			},
+			"peerDependenciesMeta": {
+				"supports-color": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/decimal.js": {
+			"version": "10.6.0",
+			"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+			"integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+			"license": "MIT"
+		},
+		"node_modules/deep-extend": {
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+			"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=4.0.0"
+			}
+		},
+		"node_modules/default-shell": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/default-shell/-/default-shell-2.2.0.tgz",
+			"integrity": "sha512-sPpMZcVhRQ0nEMDtuMJ+RtCxt7iHPAMBU+I4tAlo5dU1sjRpNax0crj6nR3qKpvVnckaQ9U38enXcwW9nZJeCw==",
+			"license": "MIT",
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/define-property": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+			"integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+			"license": "MIT",
+			"dependencies": {
+				"is-descriptor": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/degenerator": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+			"integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ast-types": "^0.13.4",
+				"escodegen": "^2.1.0",
+				"esprima": "^4.0.1"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/delay": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz",
+			"integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/delayed-stream": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+			"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.4.0"
+			}
+		},
+		"node_modules/depd": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+			"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/dequal": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+			"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/devlop": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+			"integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+			"license": "MIT",
+			"dependencies": {
+				"dequal": "^2.0.0"
+			},
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/devtools-protocol": {
+			"version": "0.0.1367902",
+			"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz",
+			"integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==",
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/diff": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+			"integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+			"license": "BSD-3-Clause",
+			"engines": {
+				"node": ">=0.3.1"
+			}
+		},
+		"node_modules/diff-match-patch": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
+			"integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==",
+			"license": "Apache-2.0"
+		},
+		"node_modules/dingbat-to-unicode": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz",
+			"integrity": "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==",
+			"license": "BSD-2-Clause"
+		},
+		"node_modules/dom-serializer": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+			"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+			"license": "MIT",
+			"dependencies": {
+				"domelementtype": "^2.3.0",
+				"domhandler": "^5.0.2",
+				"entities": "^4.2.0"
+			},
+			"funding": {
+				"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+			}
+		},
+		"node_modules/domelementtype": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+			"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/fb55"
+				}
+			],
+			"license": "BSD-2-Clause"
+		},
+		"node_modules/domhandler": {
+			"version": "5.0.3",
+			"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+			"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"domelementtype": "^2.3.0"
+			},
+			"engines": {
+				"node": ">= 4"
+			},
+			"funding": {
+				"url": "https://github.com/fb55/domhandler?sponsor=1"
+			}
+		},
+		"node_modules/domutils": {
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+			"integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"dom-serializer": "^2.0.0",
+				"domelementtype": "^2.3.0",
+				"domhandler": "^5.0.3"
+			},
+			"funding": {
+				"url": "https://github.com/fb55/domutils?sponsor=1"
+			}
+		},
+		"node_modules/dotenv": {
+			"version": "16.6.1",
+			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+			"integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://dotenvx.com"
+			}
+		},
+		"node_modules/duck": {
+			"version": "0.1.12",
+			"resolved": "https://registry.npmjs.org/duck/-/duck-0.1.12.tgz",
+			"integrity": "sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==",
+			"license": "BSD",
+			"dependencies": {
+				"underscore": "^1.13.1"
+			}
+		},
+		"node_modules/dunder-proto": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+			"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+			"license": "MIT",
+			"dependencies": {
+				"call-bind-apply-helpers": "^1.0.1",
+				"es-errors": "^1.3.0",
+				"gopd": "^1.2.0"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/duplexer": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+			"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+			"license": "MIT"
+		},
+		"node_modules/duplexer2": {
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+			"integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+			"license": "BSD-3-Clause",
+			"dependencies": {
+				"readable-stream": "^2.0.2"
+			}
+		},
+		"node_modules/duplexer2/node_modules/readable-stream": {
+			"version": "2.3.8",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+			"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+			"license": "MIT",
+			"dependencies": {
+				"core-util-is": "~1.0.0",
+				"inherits": "~2.0.3",
+				"isarray": "~1.0.0",
+				"process-nextick-args": "~2.0.0",
+				"safe-buffer": "~5.1.1",
+				"string_decoder": "~1.1.1",
+				"util-deprecate": "~1.0.1"
+			}
+		},
+		"node_modules/duplexer2/node_modules/safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+			"license": "MIT"
+		},
+		"node_modules/duplexer2/node_modules/string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"license": "MIT",
+			"dependencies": {
+				"safe-buffer": "~5.1.0"
+			}
+		},
+		"node_modules/eastasianwidth": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+			"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+			"license": "MIT"
+		},
+		"node_modules/easy-stack": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz",
+			"integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6.0.0"
+			}
+		},
+		"node_modules/ecdsa-sig-formatter": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+			"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"safe-buffer": "^5.0.1"
+			}
+		},
+		"node_modules/ee-first": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+			"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+			"license": "MIT"
+		},
+		"node_modules/eight-colors": {
+			"version": "1.3.1",
+			"resolved": "https://registry.npmjs.org/eight-colors/-/eight-colors-1.3.1.tgz",
+			"integrity": "sha512-7nXPYDeKh6DgJDR/mpt2G7N/hCNSGwwoPVmoI3+4TEwOb07VFN1WMPG0DFf6nMEjrkgdj8Og7l7IaEEk3VE6Zg==",
+			"license": "MIT"
+		},
+		"node_modules/emoji-regex": {
+			"version": "8.0.0",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+			"license": "MIT"
+		},
+		"node_modules/emojilib": {
+			"version": "2.4.0",
+			"resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
+			"integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==",
+			"license": "MIT"
+		},
+		"node_modules/encodeurl": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+			"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/encoding-sniffer": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+			"integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+			"license": "MIT",
+			"dependencies": {
+				"iconv-lite": "^0.6.3",
+				"whatwg-encoding": "^3.1.1"
+			},
+			"funding": {
+				"url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+			}
+		},
+		"node_modules/end-of-stream": {
+			"version": "1.4.5",
+			"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+			"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+			"license": "MIT",
+			"dependencies": {
+				"once": "^1.4.0"
+			}
+		},
+		"node_modules/engine.io-client": {
+			"version": "6.6.3",
+			"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
+			"integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
+			"license": "MIT",
+			"dependencies": {
+				"@socket.io/component-emitter": "~3.1.0",
+				"debug": "~4.3.1",
+				"engine.io-parser": "~5.2.1",
+				"ws": "~8.17.1",
+				"xmlhttprequest-ssl": "~2.1.1"
+			}
+		},
+		"node_modules/engine.io-client/node_modules/debug": {
+			"version": "4.3.7",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+			"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ms": "^2.1.3"
+			},
+			"engines": {
+				"node": ">=6.0"
+			},
+			"peerDependenciesMeta": {
+				"supports-color": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/engine.io-client/node_modules/ws": {
+			"version": "8.17.1",
+			"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+			"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10.0.0"
+			},
+			"peerDependencies": {
+				"bufferutil": "^4.0.1",
+				"utf-8-validate": ">=5.0.2"
+			},
+			"peerDependenciesMeta": {
+				"bufferutil": {
+					"optional": true
+				},
+				"utf-8-validate": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/engine.io-parser": {
+			"version": "5.2.3",
+			"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+			"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10.0.0"
+			}
+		},
+		"node_modules/entities": {
+			"version": "4.5.0",
+			"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+			"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=0.12"
+			},
+			"funding": {
+				"url": "https://github.com/fb55/entities?sponsor=1"
+			}
+		},
+		"node_modules/environment": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+			"integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/es-define-property": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+			"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/es-errors": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+			"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/es-object-atoms": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+			"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+			"license": "MIT",
+			"dependencies": {
+				"es-errors": "^1.3.0"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/es-set-tostringtag": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+			"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+			"license": "MIT",
+			"dependencies": {
+				"es-errors": "^1.3.0",
+				"get-intrinsic": "^1.2.6",
+				"has-tostringtag": "^1.0.2",
+				"hasown": "^2.0.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/es-toolkit": {
+			"version": "1.40.0",
+			"resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.40.0.tgz",
+			"integrity": "sha512-8o6w0KFmU0CiIl0/Q/BCEOabF2IJaELM1T2PWj6e8KqzHv1gdx+7JtFnDwOx1kJH/isJ5NwlDG1nCr1HrRF94Q==",
+			"license": "MIT",
+			"workspaces": ["docs", "benchmarks"]
+		},
+		"node_modules/escalade": {
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+			"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/escape-html": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+			"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+			"license": "MIT"
+		},
+		"node_modules/escape-string-regexp": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+			"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/escodegen": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+			"integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"esprima": "^4.0.1",
+				"estraverse": "^5.2.0",
+				"esutils": "^2.0.2"
+			},
+			"bin": {
+				"escodegen": "bin/escodegen.js",
+				"esgenerate": "bin/esgenerate.js"
+			},
+			"engines": {
+				"node": ">=6.0"
+			},
+			"optionalDependencies": {
+				"source-map": "~0.6.1"
+			}
+		},
+		"node_modules/esprima": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+			"license": "BSD-2-Clause",
+			"bin": {
+				"esparse": "bin/esparse.js",
+				"esvalidate": "bin/esvalidate.js"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/estraverse": {
+			"version": "5.3.0",
+			"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+			"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=4.0"
+			}
+		},
+		"node_modules/esutils": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/etag": {
+			"version": "1.8.1",
+			"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+			"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/event-pubsub": {
+			"version": "5.0.3",
+			"resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-5.0.3.tgz",
+			"integrity": "sha512-2QiHxshejKgJrYMzSI9MEHrvhmzxBL+eLyiM5IiyjDBySkgwS2+tdtnO3gbx8pEisu/yOFCIhfCb63gCEu0yBQ==",
+			"license": "MIT",
+			"dependencies": {
+				"copyfiles": "^2.4.0",
+				"strong-type": "^0.1.3"
+			},
+			"engines": {
+				"node": ">=13.0.0"
+			}
+		},
+		"node_modules/event-pubsub/node_modules/strong-type": {
+			"version": "0.1.6",
+			"resolved": "https://registry.npmjs.org/strong-type/-/strong-type-0.1.6.tgz",
+			"integrity": "sha512-eJe5caH6Pi5oMMeQtIoBPpvNu/s4jiyb63u5tkHNnQXomK+puyQ5i+Z5iTLBr/xUz/pIcps0NSfzzFI34+gAXg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12.0.0"
+			}
+		},
+		"node_modules/event-stream": {
+			"version": "3.3.4",
+			"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+			"integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==",
+			"license": "MIT",
+			"dependencies": {
+				"duplexer": "~0.1.1",
+				"from": "~0",
+				"map-stream": "~0.1.0",
+				"pause-stream": "0.0.11",
+				"split": "0.3",
+				"stream-combiner": "~0.0.4",
+				"through": "~2.3.1"
+			}
+		},
+		"node_modules/event-target-shim": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+			"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/eventemitter3": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+			"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+			"license": "MIT"
+		},
+		"node_modules/events": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+			"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.8.x"
+			}
+		},
+		"node_modules/events-universal": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+			"integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"bare-events": "^2.7.0"
+			}
+		},
+		"node_modules/eventsource": {
+			"version": "3.0.7",
+			"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
+			"integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
+			"license": "MIT",
+			"dependencies": {
+				"eventsource-parser": "^3.0.1"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/eventsource-parser": {
+			"version": "3.0.6",
+			"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz",
+			"integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
+		"node_modules/exceljs": {
+			"version": "4.4.0",
+			"resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz",
+			"integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==",
+			"license": "MIT",
+			"dependencies": {
+				"archiver": "^5.0.0",
+				"dayjs": "^1.8.34",
+				"fast-csv": "^4.3.1",
+				"jszip": "^3.10.1",
+				"readable-stream": "^3.6.0",
+				"saxes": "^5.0.1",
+				"tmp": "^0.2.0",
+				"unzipper": "^0.10.11",
+				"uuid": "^8.3.0"
+			},
+			"engines": {
+				"node": ">=8.3.0"
+			}
+		},
+		"node_modules/exceljs/node_modules/uuid": {
+			"version": "8.3.2",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+			"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+			"license": "MIT",
+			"bin": {
+				"uuid": "dist/bin/uuid"
+			}
+		},
+		"node_modules/execa": {
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+			"integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+			"license": "MIT",
+			"dependencies": {
+				"cross-spawn": "^7.0.3",
+				"get-stream": "^8.0.1",
+				"human-signals": "^5.0.0",
+				"is-stream": "^3.0.0",
+				"merge-stream": "^2.0.0",
+				"npm-run-path": "^5.1.0",
+				"onetime": "^6.0.0",
+				"signal-exit": "^4.1.0",
+				"strip-final-newline": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=16.17"
+			},
+			"funding": {
+				"url": "https://github.com/sindresorhus/execa?sponsor=1"
+			}
+		},
+		"node_modules/execa/node_modules/get-stream": {
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+			"integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/execa/node_modules/is-stream": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+			"integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+			"license": "MIT",
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/execa/node_modules/mimic-fn": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+			"integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/execa/node_modules/onetime": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+			"integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+			"license": "MIT",
+			"dependencies": {
+				"mimic-fn": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/express": {
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
+			"integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+			"license": "MIT",
+			"dependencies": {
+				"accepts": "^2.0.0",
+				"body-parser": "^2.2.0",
+				"content-disposition": "^1.0.0",
+				"content-type": "^1.0.5",
+				"cookie": "^0.7.1",
+				"cookie-signature": "^1.2.1",
+				"debug": "^4.4.0",
+				"encodeurl": "^2.0.0",
+				"escape-html": "^1.0.3",
+				"etag": "^1.8.1",
+				"finalhandler": "^2.1.0",
+				"fresh": "^2.0.0",
+				"http-errors": "^2.0.0",
+				"merge-descriptors": "^2.0.0",
+				"mime-types": "^3.0.0",
+				"on-finished": "^2.4.1",
+				"once": "^1.4.0",
+				"parseurl": "^1.3.3",
+				"proxy-addr": "^2.0.7",
+				"qs": "^6.14.0",
+				"range-parser": "^1.2.1",
+				"router": "^2.2.0",
+				"send": "^1.1.0",
+				"serve-static": "^2.2.0",
+				"statuses": "^2.0.1",
+				"type-is": "^2.0.1",
+				"vary": "^1.1.2"
+			},
+			"engines": {
+				"node": ">= 18"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/express"
+			}
+		},
+		"node_modules/express-rate-limit": {
+			"version": "7.5.1",
+			"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz",
+			"integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/express-rate-limit"
+			},
+			"peerDependencies": {
+				"express": ">= 4.11"
+			}
+		},
+		"node_modules/extend": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+			"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+			"license": "MIT"
+		},
+		"node_modules/extend-shallow": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+			"integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+			"license": "MIT",
+			"dependencies": {
+				"is-extendable": "^0.1.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/extract-zip": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+			"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"debug": "^4.1.1",
+				"get-stream": "^5.1.0",
+				"yauzl": "^2.10.0"
+			},
+			"bin": {
+				"extract-zip": "cli.js"
+			},
+			"engines": {
+				"node": ">= 10.17.0"
+			},
+			"optionalDependencies": {
+				"@types/yauzl": "^2.9.1"
+			}
+		},
+		"node_modules/fast-csv": {
+			"version": "5.0.5",
+			"resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-5.0.5.tgz",
+			"integrity": "sha512-9//QpogDIPln5Dc8e3Q3vbSSLXlTeU7z1JqsUOXZYOln8EIn/OOO8+NS2c3ukR6oYngDd3+P1HXSkby3kNV9KA==",
+			"license": "MIT",
+			"dependencies": {
+				"@fast-csv/format": "5.0.5",
+				"@fast-csv/parse": "5.0.5"
+			},
+			"engines": {
+				"node": ">=10.0.0"
+			}
+		},
+		"node_modules/fast-deep-equal": {
+			"version": "3.1.3",
+			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+			"license": "MIT"
+		},
+		"node_modules/fast-fifo": {
+			"version": "1.3.2",
+			"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+			"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+			"license": "MIT"
+		},
+		"node_modules/fast-json-stable-stringify": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+			"license": "MIT"
+		},
+		"node_modules/fast-uri": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
+			"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/fastify"
+				},
+				{
+					"type": "opencollective",
+					"url": "https://opencollective.com/fastify"
+				}
+			],
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/fast-xml-parser": {
+			"version": "5.3.0",
+			"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.0.tgz",
+			"integrity": "sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/NaturalIntelligence"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"strnum": "^2.1.0"
+			},
+			"bin": {
+				"fxparser": "src/cli/cli.js"
+			}
+		},
+		"node_modules/fastest-levenshtein": {
+			"version": "1.0.16",
+			"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+			"integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 4.9.1"
+			}
+		},
+		"node_modules/fd-slicer": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+			"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+			"license": "MIT",
+			"dependencies": {
+				"pend": "~1.2.0"
+			}
+		},
+		"node_modules/figures": {
+			"version": "6.1.0",
+			"resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
+			"integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+			"license": "MIT",
+			"dependencies": {
+				"is-unicode-supported": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/finalhandler": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+			"integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
+			"license": "MIT",
+			"dependencies": {
+				"debug": "^4.4.0",
+				"encodeurl": "^2.0.0",
+				"escape-html": "^1.0.3",
+				"on-finished": "^2.4.1",
+				"parseurl": "^1.3.3",
+				"statuses": "^2.0.1"
+			},
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/follow-redirects": {
+			"version": "1.15.11",
+			"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+			"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+			"funding": [
+				{
+					"type": "individual",
+					"url": "https://github.com/sponsors/RubenVerborgh"
+				}
+			],
+			"license": "MIT",
+			"engines": {
+				"node": ">=4.0"
+			},
+			"peerDependenciesMeta": {
+				"debug": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/foreground-child": {
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+			"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+			"license": "ISC",
+			"dependencies": {
+				"cross-spawn": "^7.0.6",
+				"signal-exit": "^4.0.1"
+			},
+			"engines": {
+				"node": ">=14"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			}
+		},
+		"node_modules/form-data": {
+			"version": "4.0.4",
+			"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+			"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+			"license": "MIT",
+			"dependencies": {
+				"asynckit": "^0.4.0",
+				"combined-stream": "^1.0.8",
+				"es-set-tostringtag": "^2.1.0",
+				"hasown": "^2.0.2",
+				"mime-types": "^2.1.12"
+			},
+			"engines": {
+				"node": ">= 6"
+			}
+		},
+		"node_modules/form-data/node_modules/mime-db": {
+			"version": "1.52.0",
+			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+			"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/form-data/node_modules/mime-types": {
+			"version": "2.1.35",
+			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+			"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+			"license": "MIT",
+			"dependencies": {
+				"mime-db": "1.52.0"
+			},
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/forwarded": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+			"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/fresh": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+			"integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/from": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+			"integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==",
+			"license": "MIT"
+		},
+		"node_modules/fs-extra": {
+			"version": "11.3.2",
+			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
+			"integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+			"license": "MIT",
+			"dependencies": {
+				"graceful-fs": "^4.2.0",
+				"jsonfile": "^6.0.1",
+				"universalify": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=14.14"
+			}
+		},
+		"node_modules/function-bind": {
+			"version": "1.1.2",
+			"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+			"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+			"license": "MIT",
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/fuse.js": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
+			"integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==",
+			"license": "Apache-2.0",
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/fzf": {
+			"version": "0.5.2",
+			"resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz",
+			"integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==",
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/gaxios": {
+			"version": "6.7.1",
+			"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+			"integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"extend": "^3.0.2",
+				"https-proxy-agent": "^7.0.1",
+				"is-stream": "^2.0.0",
+				"node-fetch": "^2.6.9",
+				"uuid": "^9.0.1"
+			},
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/gaxios/node_modules/uuid": {
+			"version": "9.0.1",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+			"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+			"funding": ["https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan"],
+			"license": "MIT",
+			"bin": {
+				"uuid": "dist/bin/uuid"
+			}
+		},
+		"node_modules/gcp-metadata": {
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+			"integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"gaxios": "^6.1.1",
+				"google-logging-utils": "^0.0.2",
+				"json-bigint": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/get-caller-file": {
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+			"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+			"license": "ISC",
+			"engines": {
+				"node": "6.* || 8.* || >= 10.*"
+			}
+		},
+		"node_modules/get-east-asian-width": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz",
+			"integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/get-folder-size": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-5.0.0.tgz",
+			"integrity": "sha512-+fgtvbL83tSDypEK+T411GDBQVQtxv+qtQgbV+HVa/TYubqDhNd5ghH/D6cOHY9iC5/88GtOZB7WI8PXy2A3bg==",
+			"license": "MIT",
+			"bin": {
+				"get-folder-size": "bin/get-folder-size.js"
+			},
+			"engines": {
+				"node": ">=18.11.0"
+			}
+		},
+		"node_modules/get-intrinsic": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+			"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+			"license": "MIT",
+			"dependencies": {
+				"call-bind-apply-helpers": "^1.0.2",
+				"es-define-property": "^1.0.1",
+				"es-errors": "^1.3.0",
+				"es-object-atoms": "^1.1.1",
+				"function-bind": "^1.1.2",
+				"get-proto": "^1.0.1",
+				"gopd": "^1.2.0",
+				"has-symbols": "^1.1.0",
+				"hasown": "^2.0.2",
+				"math-intrinsics": "^1.1.0"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/get-proto": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+			"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+			"license": "MIT",
+			"dependencies": {
+				"dunder-proto": "^1.0.1",
+				"es-object-atoms": "^1.0.0"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/get-stream": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+			"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+			"license": "MIT",
+			"dependencies": {
+				"pump": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=8"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/get-uri": {
+			"version": "6.0.5",
+			"resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
+			"integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
+			"license": "MIT",
+			"dependencies": {
+				"basic-ftp": "^5.0.2",
+				"data-uri-to-buffer": "^6.0.2",
+				"debug": "^4.3.4"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/glob": {
+			"version": "10.4.5",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+			"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+			"license": "ISC",
+			"dependencies": {
+				"foreground-child": "^3.1.0",
+				"jackspeak": "^3.1.2",
+				"minimatch": "^9.0.4",
+				"minipass": "^7.1.2",
+				"package-json-from-dist": "^1.0.0",
+				"path-scurry": "^1.11.1"
+			},
+			"bin": {
+				"glob": "dist/esm/bin.mjs"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			}
+		},
+		"node_modules/google-auth-library": {
+			"version": "9.15.1",
+			"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+			"integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"base64-js": "^1.3.0",
+				"ecdsa-sig-formatter": "^1.0.11",
+				"gaxios": "^6.1.1",
+				"gcp-metadata": "^6.1.0",
+				"gtoken": "^7.0.0",
+				"jws": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/google-logging-utils": {
+			"version": "0.0.2",
+			"resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+			"integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+			"license": "Apache-2.0",
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/gopd": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+			"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/graceful-fs": {
+			"version": "4.2.11",
+			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+			"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+			"license": "ISC"
+		},
+		"node_modules/gradient-string": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz",
+			"integrity": "sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==",
+			"license": "MIT",
+			"dependencies": {
+				"chalk": "^4.1.2",
+				"tinygradient": "^1.1.5"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/gradient-string/node_modules/ansi-styles": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+			"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+			"license": "MIT",
+			"dependencies": {
+				"color-convert": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+			}
+		},
+		"node_modules/gradient-string/node_modules/chalk": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+			"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^4.1.0",
+				"supports-color": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/chalk?sponsor=1"
+			}
+		},
+		"node_modules/gradient-string/node_modules/supports-color": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+			"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+			"license": "MIT",
+			"dependencies": {
+				"has-flag": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/gray-matter": {
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
+			"integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+			"license": "MIT",
+			"dependencies": {
+				"js-yaml": "^3.13.1",
+				"kind-of": "^6.0.2",
+				"section-matter": "^1.0.0",
+				"strip-bom-string": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=6.0"
+			}
+		},
+		"node_modules/gtoken": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+			"integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+			"license": "MIT",
+			"dependencies": {
+				"gaxios": "^6.0.0",
+				"jws": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=14.0.0"
+			}
+		},
+		"node_modules/has-flag": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+			"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/has-symbols": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+			"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/has-tostringtag": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+			"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+			"license": "MIT",
+			"dependencies": {
+				"has-symbols": "^1.0.3"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/hasown": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+			"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+			"license": "MIT",
+			"dependencies": {
+				"function-bind": "^1.1.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/hast-util-to-html": {
+			"version": "9.0.5",
+			"resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+			"integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/hast": "^3.0.0",
+				"@types/unist": "^3.0.0",
+				"ccount": "^2.0.0",
+				"comma-separated-tokens": "^2.0.0",
+				"hast-util-whitespace": "^3.0.0",
+				"html-void-elements": "^3.0.0",
+				"mdast-util-to-hast": "^13.0.0",
+				"property-information": "^7.0.0",
+				"space-separated-tokens": "^2.0.0",
+				"stringify-entities": "^4.0.0",
+				"zwitch": "^2.0.4"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/hast-util-whitespace": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+			"integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/hast": "^3.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/html-encoding-sniffer": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+			"integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+			"license": "MIT",
+			"dependencies": {
+				"whatwg-encoding": "^3.1.1"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/html-void-elements": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+			"integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/htmlparser2": {
+			"version": "10.0.0",
+			"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
+			"integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
+			"funding": [
+				"https://github.com/fb55/htmlparser2?sponsor=1",
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/fb55"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"domelementtype": "^2.3.0",
+				"domhandler": "^5.0.3",
+				"domutils": "^3.2.1",
+				"entities": "^6.0.0"
+			}
+		},
+		"node_modules/htmlparser2/node_modules/entities": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+			"integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=0.12"
+			},
+			"funding": {
+				"url": "https://github.com/fb55/entities?sponsor=1"
+			}
+		},
+		"node_modules/http-errors": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+			"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+			"license": "MIT",
+			"dependencies": {
+				"depd": "2.0.0",
+				"inherits": "2.0.4",
+				"setprototypeof": "1.2.0",
+				"statuses": "2.0.1",
+				"toidentifier": "1.0.1"
+			},
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/http-errors/node_modules/statuses": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+			"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/http-proxy-agent": {
+			"version": "7.0.2",
+			"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+			"integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+			"license": "MIT",
+			"dependencies": {
+				"agent-base": "^7.1.0",
+				"debug": "^4.3.4"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/https-proxy-agent": {
+			"version": "7.0.6",
+			"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+			"integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+			"license": "MIT",
+			"dependencies": {
+				"agent-base": "^7.1.2",
+				"debug": "4"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/human-signals": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+			"integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+			"license": "Apache-2.0",
+			"engines": {
+				"node": ">=16.17.0"
+			}
+		},
+		"node_modules/i18next": {
+			"version": "25.6.0",
+			"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.6.0.tgz",
+			"integrity": "sha512-tTn8fLrwBYtnclpL5aPXK/tAYBLWVvoHM1zdfXoRNLcI+RvtMsoZRV98ePlaW3khHYKuNh/Q65W/+NVFUeIwVw==",
+			"funding": [
+				{
+					"type": "individual",
+					"url": "https://locize.com"
+				},
+				{
+					"type": "individual",
+					"url": "https://locize.com/i18next.html"
+				},
+				{
+					"type": "individual",
+					"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"@babel/runtime": "^7.27.6"
+			},
+			"peerDependencies": {
+				"typescript": "^5"
+			},
+			"peerDependenciesMeta": {
+				"typescript": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/iconv-lite": {
+			"version": "0.6.3",
+			"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+			"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+			"license": "MIT",
+			"dependencies": {
+				"safer-buffer": ">= 2.1.2 < 3.0.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/ieee754": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+			"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/feross"
+				},
+				{
+					"type": "patreon",
+					"url": "https://www.patreon.com/feross"
+				},
+				{
+					"type": "consulting",
+					"url": "https://feross.org/support"
+				}
+			],
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/ignore": {
+			"version": "7.0.5",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+			"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 4"
+			}
+		},
+		"node_modules/immediate": {
+			"version": "3.0.6",
+			"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+			"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+			"license": "MIT"
+		},
+		"node_modules/indent-string": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+			"integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/inherits": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+			"license": "ISC"
+		},
+		"node_modules/ini": {
+			"version": "1.3.8",
+			"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+			"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+			"license": "ISC"
+		},
+		"node_modules/ink": {
+			"version": "6.3.1",
+			"resolved": "https://registry.npmjs.org/ink/-/ink-6.3.1.tgz",
+			"integrity": "sha512-3wGwITGrzL6rkWsi2gEKzgwdafGn4ZYd3u4oRp+sOPvfoxEHlnoB5Vnk9Uy5dMRUhDOqF3hqr4rLQ4lEzBc2sQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@alcalzone/ansi-tokenize": "^0.2.0",
+				"ansi-escapes": "^7.0.0",
+				"ansi-styles": "^6.2.1",
+				"auto-bind": "^5.0.1",
+				"chalk": "^5.6.0",
+				"cli-boxes": "^3.0.0",
+				"cli-cursor": "^4.0.0",
+				"cli-truncate": "^4.0.0",
+				"code-excerpt": "^4.0.0",
+				"es-toolkit": "^1.39.10",
+				"indent-string": "^5.0.0",
+				"is-in-ci": "^2.0.0",
+				"patch-console": "^2.0.0",
+				"react-reconciler": "^0.32.0",
+				"signal-exit": "^3.0.7",
+				"slice-ansi": "^7.1.0",
+				"stack-utils": "^2.0.6",
+				"string-width": "^7.2.0",
+				"type-fest": "^4.27.0",
+				"widest-line": "^5.0.0",
+				"wrap-ansi": "^9.0.0",
+				"ws": "^8.18.0",
+				"yoga-layout": "~3.2.1"
+			},
+			"engines": {
+				"node": ">=20"
+			},
+			"peerDependencies": {
+				"@types/react": ">=19.0.0",
+				"react": ">=19.0.0",
+				"react-devtools-core": "^6.1.2"
+			},
+			"peerDependenciesMeta": {
+				"@types/react": {
+					"optional": true
+				},
+				"react-devtools-core": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/ink-big-text": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/ink-big-text/-/ink-big-text-2.0.0.tgz",
+			"integrity": "sha512-Juzqv+rIOLGuhMJiE50VtS6dg6olWfzFdL7wsU/EARSL5Eaa5JNXMogMBm9AkjgzO2Y3UwWCOh87jbhSn8aNdw==",
+			"license": "MIT",
+			"dependencies": {
+				"cfonts": "^3.1.1",
+				"prop-types": "^15.8.1"
+			},
+			"engines": {
+				"node": ">=14.16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			},
+			"peerDependencies": {
+				"ink": ">=4",
+				"react": ">=18"
+			}
+		},
+		"node_modules/ink-gradient": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/ink-gradient/-/ink-gradient-3.0.0.tgz",
+			"integrity": "sha512-OVyPBovBxE1tFcBhSamb+P1puqDP6pG3xFe2W9NiLgwUZd9RbcjBeR7twLbliUT9navrUstEf1ZcPKKvx71BsQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/gradient-string": "^1.1.2",
+				"gradient-string": "^2.0.2",
+				"prop-types": "^15.8.1",
+				"strip-ansi": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			},
+			"peerDependencies": {
+				"ink": ">=4"
+			}
+		},
+		"node_modules/ink-select-input": {
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/ink-select-input/-/ink-select-input-6.2.0.tgz",
+			"integrity": "sha512-304fZXxkpYxJ9si5lxRCaX01GNlmPBgOZumXXRnPYbHW/iI31cgQynqk2tRypGLOF1cMIwPUzL2LSm6q4I5rQQ==",
+			"license": "MIT",
+			"dependencies": {
+				"figures": "^6.1.0",
+				"to-rotated": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"peerDependencies": {
+				"ink": ">=5.0.0",
+				"react": ">=18.0.0"
+			}
+		},
+		"node_modules/ink-spinner": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-5.0.0.tgz",
+			"integrity": "sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA==",
+			"license": "MIT",
+			"dependencies": {
+				"cli-spinners": "^2.7.0"
+			},
+			"engines": {
+				"node": ">=14.16"
+			},
+			"peerDependencies": {
+				"ink": ">=4.0.0",
+				"react": ">=18.0.0"
+			}
+		},
+		"node_modules/ink-table": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/ink-table/-/ink-table-3.1.0.tgz",
+			"integrity": "sha512-qxVb4DIaEaJryvF9uZGydnmP9Hkmas3DCKVpEcBYC0E4eJd3qNgNe+PZKuzgCERFe9LfAS1TNWxCr9+AU4v3YA==",
+			"license": "MIT",
+			"dependencies": {
+				"object-hash": "^2.0.3"
+			},
+			"peerDependencies": {
+				"ink": ">=3.0.0",
+				"react": ">=16.8.0"
+			}
+		},
+		"node_modules/ink-text-input": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/ink-text-input/-/ink-text-input-6.0.0.tgz",
+			"integrity": "sha512-Fw64n7Yha5deb1rHY137zHTAbSTNelUKuB5Kkk2HACXEtwIHBCf9OH2tP/LQ9fRYTl1F0dZgbW0zPnZk6FA9Lw==",
+			"license": "MIT",
+			"dependencies": {
+				"chalk": "^5.3.0",
+				"type-fest": "^4.18.2"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"peerDependencies": {
+				"ink": ">=5",
+				"react": ">=18"
+			}
+		},
+		"node_modules/ink/node_modules/emoji-regex": {
+			"version": "10.6.0",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+			"integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+			"license": "MIT"
+		},
+		"node_modules/ink/node_modules/signal-exit": {
+			"version": "3.0.7",
+			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+			"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+			"license": "ISC"
+		},
+		"node_modules/ink/node_modules/string-width": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+			"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^10.3.0",
+				"get-east-asian-width": "^1.0.0",
+				"strip-ansi": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/ip-address": {
+			"version": "10.0.1",
+			"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
+			"integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 12"
+			}
+		},
+		"node_modules/ipaddr.js": {
+			"version": "1.9.1",
+			"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+			"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.10"
+			}
+		},
+		"node_modules/is-accessor-descriptor": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+			"integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+			"license": "MIT",
+			"dependencies": {
+				"hasown": "^2.0.0"
+			},
+			"engines": {
+				"node": ">= 0.10"
+			}
+		},
+		"node_modules/is-buffer": {
+			"version": "1.1.6",
+			"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+			"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+			"license": "MIT"
+		},
+		"node_modules/is-data-descriptor": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+			"integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+			"license": "MIT",
+			"dependencies": {
+				"hasown": "^2.0.0"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/is-descriptor": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
+			"integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+			"license": "MIT",
+			"dependencies": {
+				"is-accessor-descriptor": "^1.0.1",
+				"is-data-descriptor": "^1.0.1"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/is-docker": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+			"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+			"license": "MIT",
+			"bin": {
+				"is-docker": "cli.js"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/is-extendable": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+			"integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/is-fullwidth-code-point": {
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz",
+			"integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==",
+			"license": "MIT",
+			"dependencies": {
+				"get-east-asian-width": "^1.3.1"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/is-in-ci": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz",
+			"integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==",
+			"license": "MIT",
+			"bin": {
+				"is-in-ci": "cli.js"
+			},
+			"engines": {
+				"node": ">=20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/is-inside-container": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+			"integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+			"license": "MIT",
+			"dependencies": {
+				"is-docker": "^3.0.0"
+			},
+			"bin": {
+				"is-inside-container": "cli.js"
+			},
+			"engines": {
+				"node": ">=14.16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/is-number": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+			"integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+			"license": "MIT",
+			"dependencies": {
+				"kind-of": "^3.0.2"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/is-number/node_modules/kind-of": {
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+			"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+			"license": "MIT",
+			"dependencies": {
+				"is-buffer": "^1.1.5"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/is-plain-object": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+			"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+			"license": "MIT",
+			"dependencies": {
+				"isobject": "^3.0.1"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/is-potential-custom-element-name": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+			"integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+			"license": "MIT"
+		},
+		"node_modules/is-promise": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+			"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+			"license": "MIT"
+		},
+		"node_modules/is-stream": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+			"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/is-unicode-supported": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+			"integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/is-wsl": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+			"integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+			"license": "MIT",
+			"dependencies": {
+				"is-inside-container": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/isarray": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+			"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+			"license": "MIT"
+		},
+		"node_modules/isbinaryfile": {
+			"version": "5.0.6",
+			"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.6.tgz",
+			"integrity": "sha512-I+NmIfBHUl+r2wcDd6JwE9yWje/PIVY/R5/CmV8dXLZd5K+L9X2klAOwfAHNnondLXkbHyTAleQAWonpTJBTtw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 18.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/gjtorikian/"
+			}
+		},
+		"node_modules/isexe": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+			"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+			"license": "ISC"
+		},
+		"node_modules/isobject": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+			"integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/jackspeak": {
+			"version": "3.4.3",
+			"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+			"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+			"license": "BlueOak-1.0.0",
+			"dependencies": {
+				"@isaacs/cliui": "^8.0.2"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			},
+			"optionalDependencies": {
+				"@pkgjs/parseargs": "^0.11.0"
+			}
+		},
+		"node_modules/jotai": {
+			"version": "2.15.0",
+			"resolved": "https://registry.npmjs.org/jotai/-/jotai-2.15.0.tgz",
+			"integrity": "sha512-nbp/6jN2Ftxgw0VwoVnOg0m5qYM1rVcfvij+MZx99Z5IK13eGve9FJoCwGv+17JvVthTjhSmNtT5e1coJnr6aw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12.20.0"
+			},
+			"peerDependencies": {
+				"@babel/core": ">=7.0.0",
+				"@babel/template": ">=7.0.0",
+				"@types/react": ">=17.0.0",
+				"react": ">=17.0.0"
+			},
+			"peerDependenciesMeta": {
+				"@babel/core": {
+					"optional": true
+				},
+				"@babel/template": {
+					"optional": true
+				},
+				"@types/react": {
+					"optional": true
+				},
+				"react": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/js-message": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz",
+			"integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.6.0"
+			}
+		},
+		"node_modules/js-queue": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz",
+			"integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==",
+			"license": "MIT",
+			"dependencies": {
+				"easy-stack": "^1.0.1"
+			},
+			"engines": {
+				"node": ">=1.0.0"
+			}
+		},
+		"node_modules/js-tokens": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+			"license": "MIT"
+		},
+		"node_modules/js-yaml": {
+			"version": "3.14.1",
+			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+			"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+			"license": "MIT",
+			"dependencies": {
+				"argparse": "^1.0.7",
+				"esprima": "^4.0.0"
+			},
+			"bin": {
+				"js-yaml": "bin/js-yaml.js"
+			}
+		},
+		"node_modules/jsdom": {
+			"version": "26.1.0",
+			"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz",
+			"integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==",
+			"license": "MIT",
+			"dependencies": {
+				"cssstyle": "^4.2.1",
+				"data-urls": "^5.0.0",
+				"decimal.js": "^10.5.0",
+				"html-encoding-sniffer": "^4.0.0",
+				"http-proxy-agent": "^7.0.2",
+				"https-proxy-agent": "^7.0.6",
+				"is-potential-custom-element-name": "^1.0.1",
+				"nwsapi": "^2.2.16",
+				"parse5": "^7.2.1",
+				"rrweb-cssom": "^0.8.0",
+				"saxes": "^6.0.0",
+				"symbol-tree": "^3.2.4",
+				"tough-cookie": "^5.1.1",
+				"w3c-xmlserializer": "^5.0.0",
+				"webidl-conversions": "^7.0.0",
+				"whatwg-encoding": "^3.1.1",
+				"whatwg-mimetype": "^4.0.0",
+				"whatwg-url": "^14.1.1",
+				"ws": "^8.18.0",
+				"xml-name-validator": "^5.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"peerDependencies": {
+				"canvas": "^3.0.0"
+			},
+			"peerDependenciesMeta": {
+				"canvas": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/jsdom/node_modules/saxes": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+			"integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+			"license": "ISC",
+			"dependencies": {
+				"xmlchars": "^2.2.0"
+			},
+			"engines": {
+				"node": ">=v12.22.7"
+			}
+		},
+		"node_modules/json-bigint": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
+			"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
+			"license": "MIT",
+			"dependencies": {
+				"bignumber.js": "^9.0.0"
+			}
+		},
+		"node_modules/json-schema-traverse": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+			"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+			"license": "MIT"
+		},
+		"node_modules/json5": {
+			"version": "2.2.3",
+			"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+			"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+			"license": "MIT",
+			"bin": {
+				"json5": "lib/cli.js"
+			},
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/jsonfile": {
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+			"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+			"license": "MIT",
+			"dependencies": {
+				"universalify": "^2.0.0"
+			},
+			"optionalDependencies": {
+				"graceful-fs": "^4.1.6"
+			}
+		},
+		"node_modules/jsonschema": {
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz",
+			"integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==",
+			"license": "MIT",
+			"engines": {
+				"node": "*"
+			}
+		},
+		"node_modules/jszip": {
+			"version": "3.10.1",
+			"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+			"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+			"license": "(MIT OR GPL-3.0-or-later)",
+			"dependencies": {
+				"lie": "~3.3.0",
+				"pako": "~1.0.2",
+				"readable-stream": "~2.3.6",
+				"setimmediate": "^1.0.5"
+			}
+		},
+		"node_modules/jszip/node_modules/readable-stream": {
+			"version": "2.3.8",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+			"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+			"license": "MIT",
+			"dependencies": {
+				"core-util-is": "~1.0.0",
+				"inherits": "~2.0.3",
+				"isarray": "~1.0.0",
+				"process-nextick-args": "~2.0.0",
+				"safe-buffer": "~5.1.1",
+				"string_decoder": "~1.1.1",
+				"util-deprecate": "~1.0.1"
+			}
+		},
+		"node_modules/jszip/node_modules/safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+			"license": "MIT"
+		},
+		"node_modules/jszip/node_modules/string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"license": "MIT",
+			"dependencies": {
+				"safe-buffer": "~5.1.0"
+			}
+		},
+		"node_modules/jwa": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
+			"integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
+			"license": "MIT",
+			"dependencies": {
+				"buffer-equal-constant-time": "^1.0.1",
+				"ecdsa-sig-formatter": "1.0.11",
+				"safe-buffer": "^5.0.1"
+			}
+		},
+		"node_modules/jws": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+			"integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+			"license": "MIT",
+			"dependencies": {
+				"jwa": "^2.0.0",
+				"safe-buffer": "^5.0.1"
+			}
+		},
+		"node_modules/jwt-decode": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+			"integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/kind-of": {
+			"version": "6.0.3",
+			"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+			"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/ky": {
+			"version": "1.12.0",
+			"resolved": "https://registry.npmjs.org/ky/-/ky-1.12.0.tgz",
+			"integrity": "sha512-YRLmSUHCwOJRBMArtqMRLOmO7fewn3yOoui6aB8ERkRVXupa0UiaQaKbIXteMt4jUElhbdqTMsLFHs8APxxUoQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sindresorhus/ky?sponsor=1"
+			}
+		},
+		"node_modules/lazystream": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+			"integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+			"license": "MIT",
+			"dependencies": {
+				"readable-stream": "^2.0.5"
+			},
+			"engines": {
+				"node": ">= 0.6.3"
+			}
+		},
+		"node_modules/lazystream/node_modules/readable-stream": {
+			"version": "2.3.8",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+			"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+			"license": "MIT",
+			"dependencies": {
+				"core-util-is": "~1.0.0",
+				"inherits": "~2.0.3",
+				"isarray": "~1.0.0",
+				"process-nextick-args": "~2.0.0",
+				"safe-buffer": "~5.1.1",
+				"string_decoder": "~1.1.1",
+				"util-deprecate": "~1.0.1"
+			}
+		},
+		"node_modules/lazystream/node_modules/safe-buffer": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+			"license": "MIT"
+		},
+		"node_modules/lazystream/node_modules/string_decoder": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+			"license": "MIT",
+			"dependencies": {
+				"safe-buffer": "~5.1.0"
+			}
+		},
+		"node_modules/lie": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+			"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+			"license": "MIT",
+			"dependencies": {
+				"immediate": "~3.0.5"
+			}
+		},
+		"node_modules/lodash": {
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.debounce": {
+			"version": "4.0.8",
+			"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+			"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.escaperegexp": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+			"integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.groupby": {
+			"version": "4.6.0",
+			"resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
+			"integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.isboolean": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+			"integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.isfunction": {
+			"version": "3.0.9",
+			"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+			"integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.isnil": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz",
+			"integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.isundefined": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz",
+			"integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==",
+			"license": "MIT"
+		},
+		"node_modules/lodash.uniq": {
+			"version": "4.5.0",
+			"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+			"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+			"license": "MIT"
+		},
+		"node_modules/loose-envify": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+			"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+			"license": "MIT",
+			"dependencies": {
+				"js-tokens": "^3.0.0 || ^4.0.0"
+			},
+			"bin": {
+				"loose-envify": "cli.js"
+			}
+		},
+		"node_modules/lop": {
+			"version": "0.4.2",
+			"resolved": "https://registry.npmjs.org/lop/-/lop-0.4.2.tgz",
+			"integrity": "sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"duck": "^0.1.12",
+				"option": "~0.2.1",
+				"underscore": "^1.13.1"
+			}
+		},
+		"node_modules/lru-cache": {
+			"version": "11.2.2",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
+			"integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
+			"license": "ISC",
+			"engines": {
+				"node": "20 || >=22"
+			}
+		},
+		"node_modules/macos-release": {
+			"version": "3.4.0",
+			"resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.4.0.tgz",
+			"integrity": "sha512-wpGPwyg/xrSp4H4Db4xYSeAr6+cFQGHfspHzDUdYxswDnUW0L5Ov63UuJiSr8NMSpyaChO4u1n0MXUvVPtrN6A==",
+			"license": "MIT",
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/make-error": {
+			"version": "1.3.6",
+			"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+			"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+			"license": "ISC"
+		},
+		"node_modules/mammoth": {
+			"version": "1.11.0",
+			"resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.11.0.tgz",
+			"integrity": "sha512-BcEqqY/BOwIcI1iR5tqyVlqc3KIaMRa4egSoK83YAVrBf6+yqdAAbtUcFDCWX8Zef8/fgNZ6rl4VUv+vVX8ddQ==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"@xmldom/xmldom": "^0.8.6",
+				"argparse": "~1.0.3",
+				"base64-js": "^1.5.1",
+				"bluebird": "~3.4.0",
+				"dingbat-to-unicode": "^1.0.1",
+				"jszip": "^3.7.1",
+				"lop": "^0.4.2",
+				"path-is-absolute": "^1.0.0",
+				"underscore": "^1.13.1",
+				"xmlbuilder": "^10.0.0"
+			},
+			"bin": {
+				"mammoth": "bin/mammoth"
+			},
+			"engines": {
+				"node": ">=12.0.0"
+			}
+		},
+		"node_modules/map-stream": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+			"integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g=="
+		},
+		"node_modules/marked": {
+			"version": "11.2.0",
+			"resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz",
+			"integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==",
+			"license": "MIT",
+			"bin": {
+				"marked": "bin/marked.js"
+			},
+			"engines": {
+				"node": ">= 18"
+			}
+		},
+		"node_modules/marked-terminal": {
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz",
+			"integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-escapes": "^6.2.0",
+				"cardinal": "^2.1.1",
+				"chalk": "^5.3.0",
+				"cli-table3": "^0.6.3",
+				"node-emoji": "^2.1.3",
+				"supports-hyperlinks": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=16.0.0"
+			},
+			"peerDependencies": {
+				"marked": ">=1 <12"
+			}
+		},
+		"node_modules/marked-terminal/node_modules/ansi-escapes": {
+			"version": "6.2.1",
+			"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
+			"integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=14.16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/math-intrinsics": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+			"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4"
+			}
+		},
+		"node_modules/mdast-util-to-hast": {
+			"version": "13.2.0",
+			"resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+			"integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/hast": "^3.0.0",
+				"@types/mdast": "^4.0.0",
+				"@ungap/structured-clone": "^1.0.0",
+				"devlop": "^1.0.0",
+				"micromark-util-sanitize-uri": "^2.0.0",
+				"trim-lines": "^3.0.0",
+				"unist-util-position": "^5.0.0",
+				"unist-util-visit": "^5.0.0",
+				"vfile": "^6.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/media-typer": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+			"integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/merge-descriptors": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+			"integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/merge-stream": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+			"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+			"license": "MIT"
+		},
+		"node_modules/micromark-util-character": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+			"integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+			"funding": [
+				{
+					"type": "GitHub Sponsors",
+					"url": "https://github.com/sponsors/unifiedjs"
+				},
+				{
+					"type": "OpenCollective",
+					"url": "https://opencollective.com/unified"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"micromark-util-symbol": "^2.0.0",
+				"micromark-util-types": "^2.0.0"
+			}
+		},
+		"node_modules/micromark-util-encode": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+			"integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+			"funding": [
+				{
+					"type": "GitHub Sponsors",
+					"url": "https://github.com/sponsors/unifiedjs"
+				},
+				{
+					"type": "OpenCollective",
+					"url": "https://opencollective.com/unified"
+				}
+			],
+			"license": "MIT"
+		},
+		"node_modules/micromark-util-sanitize-uri": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+			"integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+			"funding": [
+				{
+					"type": "GitHub Sponsors",
+					"url": "https://github.com/sponsors/unifiedjs"
+				},
+				{
+					"type": "OpenCollective",
+					"url": "https://opencollective.com/unified"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"micromark-util-character": "^2.0.0",
+				"micromark-util-encode": "^2.0.0",
+				"micromark-util-symbol": "^2.0.0"
+			}
+		},
+		"node_modules/micromark-util-symbol": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+			"integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+			"funding": [
+				{
+					"type": "GitHub Sponsors",
+					"url": "https://github.com/sponsors/unifiedjs"
+				},
+				{
+					"type": "OpenCollective",
+					"url": "https://opencollective.com/unified"
+				}
+			],
+			"license": "MIT"
+		},
+		"node_modules/micromark-util-types": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+			"integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+			"funding": [
+				{
+					"type": "GitHub Sponsors",
+					"url": "https://github.com/sponsors/unifiedjs"
+				},
+				{
+					"type": "OpenCollective",
+					"url": "https://opencollective.com/unified"
+				}
+			],
+			"license": "MIT"
+		},
+		"node_modules/mime-db": {
+			"version": "1.54.0",
+			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+			"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/mime-types": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+			"integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+			"license": "MIT",
+			"dependencies": {
+				"mime-db": "^1.54.0"
+			},
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/mimic-fn": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+			"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/minimatch": {
+			"version": "9.0.5",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+			"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+			"license": "ISC",
+			"dependencies": {
+				"brace-expansion": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=16 || 14 >=14.17"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			}
+		},
+		"node_modules/minimist": {
+			"version": "1.2.8",
+			"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+			"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+			"license": "MIT",
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/minipass": {
+			"version": "7.1.2",
+			"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+			"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+			"license": "ISC",
+			"engines": {
+				"node": ">=16 || 14 >=14.17"
+			}
+		},
+		"node_modules/mitt": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+			"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+			"license": "MIT"
+		},
+		"node_modules/monaco-vscode-textmate-theme-converter": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/monaco-vscode-textmate-theme-converter/-/monaco-vscode-textmate-theme-converter-0.1.7.tgz",
+			"integrity": "sha512-ZMsq1RPWwOD3pvXD0n+9ddnhfzZoiUMwNIWPNUqYqEiQeH2HjyZ9KYOdt/pqe0kkN8WnYWLrxT9C/SrtIsAu2Q==",
+			"license": "MIT",
+			"dependencies": {
+				"commander": "^8.1.0",
+				"fs-extra": "^7.0.1",
+				"tslib": "^2.3.0"
+			},
+			"bin": {
+				"mvttc": "lib/cjs/npx-script.js"
+			},
+			"peerDependencies": {
+				"tslib": "^2.0.1"
+			}
+		},
+		"node_modules/monaco-vscode-textmate-theme-converter/node_modules/commander": {
+			"version": "8.3.0",
+			"resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+			"integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 12"
+			}
+		},
+		"node_modules/monaco-vscode-textmate-theme-converter/node_modules/fs-extra": {
+			"version": "7.0.1",
+			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+			"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+			"license": "MIT",
+			"dependencies": {
+				"graceful-fs": "^4.1.2",
+				"jsonfile": "^4.0.0",
+				"universalify": "^0.1.0"
+			},
+			"engines": {
+				"node": ">=6 <7 || >=8"
+			}
+		},
+		"node_modules/monaco-vscode-textmate-theme-converter/node_modules/jsonfile": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+			"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+			"license": "MIT",
+			"optionalDependencies": {
+				"graceful-fs": "^4.1.6"
+			}
+		},
+		"node_modules/monaco-vscode-textmate-theme-converter/node_modules/tslib": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+			"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+			"license": "0BSD"
+		},
+		"node_modules/monaco-vscode-textmate-theme-converter/node_modules/universalify": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+			"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 4.0.0"
+			}
+		},
+		"node_modules/ms": {
+			"version": "2.1.3",
+			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+			"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+			"license": "MIT"
+		},
+		"node_modules/negotiator": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+			"integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/netmask": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
+			"integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4.0"
+			}
+		},
+		"node_modules/node-cache": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
+			"integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
+			"license": "MIT",
+			"dependencies": {
+				"clone": "2.x"
+			},
+			"engines": {
+				"node": ">= 8.0.0"
+			}
+		},
+		"node_modules/node-emoji": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz",
+			"integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==",
+			"license": "MIT",
+			"dependencies": {
+				"@sindresorhus/is": "^4.6.0",
+				"char-regex": "^1.0.2",
+				"emojilib": "^2.4.0",
+				"skin-tone": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/node-ensure": {
+			"version": "0.0.0",
+			"resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz",
+			"integrity": "sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==",
+			"license": "MIT"
+		},
+		"node_modules/node-fetch": {
+			"version": "2.7.0",
+			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+			"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+			"license": "MIT",
+			"dependencies": {
+				"whatwg-url": "^5.0.0"
+			},
+			"engines": {
+				"node": "4.x || >=6.0.0"
+			},
+			"peerDependencies": {
+				"encoding": "^0.1.0"
+			},
+			"peerDependenciesMeta": {
+				"encoding": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/node-fetch/node_modules/tr46": {
+			"version": "0.0.3",
+			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+			"license": "MIT"
+		},
+		"node_modules/node-fetch/node_modules/webidl-conversions": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+			"license": "BSD-2-Clause"
+		},
+		"node_modules/node-fetch/node_modules/whatwg-url": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+			"license": "MIT",
+			"dependencies": {
+				"tr46": "~0.0.3",
+				"webidl-conversions": "^3.0.0"
+			}
+		},
+		"node_modules/node-int64": {
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+			"integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+			"license": "MIT"
+		},
+		"node_modules/node-ipc": {
+			"version": "12.0.0",
+			"resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-12.0.0.tgz",
+			"integrity": "sha512-QHJ2gAJiqA3cM7cQiRjLsfCOBRB0TwQ6axYD4FSllQWipEbP6i7Se1dP8EzPKk5J1nCe27W69eqPmCoKyQ61Vg==",
+			"license": "MIT",
+			"dependencies": {
+				"event-pubsub": "5.0.3",
+				"js-message": "1.0.7",
+				"js-queue": "2.0.2",
+				"strong-type": "^1.0.1"
+			},
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/normalize-path": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+			"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/npm-run-path": {
+			"version": "5.3.0",
+			"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+			"integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+			"license": "MIT",
+			"dependencies": {
+				"path-key": "^4.0.0"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/npm-run-path/node_modules/path-key": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+			"integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/nth-check": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+			"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"boolbase": "^1.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/fb55/nth-check?sponsor=1"
+			}
+		},
+		"node_modules/nwsapi": {
+			"version": "2.2.22",
+			"resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz",
+			"integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==",
+			"license": "MIT"
+		},
+		"node_modules/object-assign": {
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+			"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/object-hash": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+			"integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 6"
+			}
+		},
+		"node_modules/object-inspect": {
+			"version": "1.13.4",
+			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+			"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/ollama": {
+			"version": "0.5.18",
+			"resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.18.tgz",
+			"integrity": "sha512-lTFqTf9bo7Cd3hpF6CviBe/DEhewjoZYd9N/uCe7O20qYTvGqrNOFOBDj3lbZgFWHUgDv5EeyusYxsZSLS8nvg==",
+			"license": "MIT",
+			"dependencies": {
+				"whatwg-fetch": "^3.6.20"
+			}
+		},
+		"node_modules/on-finished": {
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+			"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+			"license": "MIT",
+			"dependencies": {
+				"ee-first": "1.1.1"
+			},
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/once": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+			"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+			"license": "ISC",
+			"dependencies": {
+				"wrappy": "1"
+			}
+		},
+		"node_modules/one-time": {
+			"version": "0.0.4",
+			"resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
+			"integrity": "sha512-qAMrwuk2xLEutlASoiPiAMW3EN3K96Ka/ilSXYr6qR1zSVXw2j7+yDSqGTC4T9apfLYxM3tLLjKvgPdAUK7kYQ==",
+			"license": "MIT"
+		},
+		"node_modules/onetime": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+			"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+			"license": "MIT",
+			"dependencies": {
+				"mimic-fn": "^2.1.0"
+			},
+			"engines": {
+				"node": ">=6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/oniguruma-parser": {
+			"version": "0.12.1",
+			"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz",
+			"integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==",
+			"license": "MIT"
+		},
+		"node_modules/oniguruma-to-es": {
+			"version": "4.3.3",
+			"resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz",
+			"integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==",
+			"license": "MIT",
+			"dependencies": {
+				"oniguruma-parser": "^0.12.1",
+				"regex": "^6.0.1",
+				"regex-recursion": "^6.0.2"
+			}
+		},
+		"node_modules/openai": {
+			"version": "5.23.2",
+			"resolved": "https://registry.npmjs.org/openai/-/openai-5.23.2.tgz",
+			"integrity": "sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==",
+			"license": "Apache-2.0",
+			"bin": {
+				"openai": "bin/cli"
+			},
+			"peerDependencies": {
+				"ws": "^8.18.0",
+				"zod": "^3.23.8"
+			},
+			"peerDependenciesMeta": {
+				"ws": {
+					"optional": true
+				},
+				"zod": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/option": {
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/option/-/option-0.2.4.tgz",
+			"integrity": "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==",
+			"license": "BSD-2-Clause"
+		},
+		"node_modules/os-name": {
+			"version": "6.1.0",
+			"resolved": "https://registry.npmjs.org/os-name/-/os-name-6.1.0.tgz",
+			"integrity": "sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==",
+			"license": "MIT",
+			"dependencies": {
+				"macos-release": "^3.3.0",
+				"windows-release": "^6.1.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/p-limit": {
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz",
+			"integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==",
+			"license": "MIT",
+			"dependencies": {
+				"yocto-queue": "^1.1.1"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/p-timeout": {
+			"version": "6.1.4",
+			"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz",
+			"integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=14.16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/p-wait-for": {
+			"version": "5.0.2",
+			"resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.2.tgz",
+			"integrity": "sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==",
+			"license": "MIT",
+			"dependencies": {
+				"p-timeout": "^6.0.0"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/pac-proxy-agent": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+			"integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
+			"license": "MIT",
+			"dependencies": {
+				"@tootallnate/quickjs-emscripten": "^0.23.0",
+				"agent-base": "^7.1.2",
+				"debug": "^4.3.4",
+				"get-uri": "^6.0.1",
+				"http-proxy-agent": "^7.0.0",
+				"https-proxy-agent": "^7.0.6",
+				"pac-resolver": "^7.0.1",
+				"socks-proxy-agent": "^8.0.5"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/pac-resolver": {
+			"version": "7.0.1",
+			"resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+			"integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
+			"license": "MIT",
+			"dependencies": {
+				"degenerator": "^5.0.0",
+				"netmask": "^2.0.2"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/package-json": {
+			"version": "10.0.1",
+			"resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz",
+			"integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==",
+			"license": "MIT",
+			"dependencies": {
+				"ky": "^1.2.0",
+				"registry-auth-token": "^5.0.2",
+				"registry-url": "^6.0.1",
+				"semver": "^7.6.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/package-json-from-dist": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+			"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+			"license": "BlueOak-1.0.0"
+		},
+		"node_modules/pako": {
+			"version": "1.0.11",
+			"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+			"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+			"license": "(MIT AND Zlib)"
+		},
+		"node_modules/parse5": {
+			"version": "7.3.0",
+			"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+			"integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+			"license": "MIT",
+			"dependencies": {
+				"entities": "^6.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/inikulin/parse5?sponsor=1"
+			}
+		},
+		"node_modules/parse5-htmlparser2-tree-adapter": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+			"integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+			"license": "MIT",
+			"dependencies": {
+				"domhandler": "^5.0.3",
+				"parse5": "^7.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/inikulin/parse5?sponsor=1"
+			}
+		},
+		"node_modules/parse5-parser-stream": {
+			"version": "7.1.2",
+			"resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+			"integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+			"license": "MIT",
+			"dependencies": {
+				"parse5": "^7.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/inikulin/parse5?sponsor=1"
+			}
+		},
+		"node_modules/parse5/node_modules/entities": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+			"integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=0.12"
+			},
+			"funding": {
+				"url": "https://github.com/fb55/entities?sponsor=1"
+			}
+		},
+		"node_modules/parseurl": {
+			"version": "1.3.3",
+			"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+			"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/patch-console": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz",
+			"integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==",
+			"license": "MIT",
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			}
+		},
+		"node_modules/path-is-absolute": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+			"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/path-key": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+			"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/path-scurry": {
+			"version": "1.11.1",
+			"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+			"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+			"license": "BlueOak-1.0.0",
+			"dependencies": {
+				"lru-cache": "^10.2.0",
+				"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+			},
+			"engines": {
+				"node": ">=16 || 14 >=14.18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			}
+		},
+		"node_modules/path-scurry/node_modules/lru-cache": {
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+			"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+			"license": "ISC"
+		},
+		"node_modules/path-to-regexp": {
+			"version": "8.3.0",
+			"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
+			"integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
+			"license": "MIT",
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/express"
+			}
+		},
+		"node_modules/pause-stream": {
+			"version": "0.0.11",
+			"resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+			"integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
+			"license": ["MIT", "Apache2"],
+			"dependencies": {
+				"through": "~2.3"
+			}
+		},
+		"node_modules/pdf-parse": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz",
+			"integrity": "sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==",
+			"license": "MIT",
+			"dependencies": {
+				"debug": "^3.1.0",
+				"node-ensure": "^0.0.0"
+			},
+			"engines": {
+				"node": ">=6.8.1"
+			}
+		},
+		"node_modules/pdf-parse/node_modules/debug": {
+			"version": "3.2.7",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+			"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ms": "^2.1.1"
+			}
+		},
+		"node_modules/pend": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+			"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+			"license": "MIT"
+		},
+		"node_modules/pkce-challenge": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz",
+			"integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=16.20.0"
+			}
+		},
+		"node_modules/posthog-node": {
+			"version": "4.18.0",
+			"resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-4.18.0.tgz",
+			"integrity": "sha512-XROs1h+DNatgKh/AlIlCtDxWzwrKdYDb2mOs58n4yN8BkGN9ewqeQwG5ApS4/IzwCb7HPttUkOVulkYatd2PIw==",
+			"license": "MIT",
+			"dependencies": {
+				"axios": "^1.8.2"
+			},
+			"engines": {
+				"node": ">=15.0.0"
+			}
+		},
+		"node_modules/pretty-bytes": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.1.0.tgz",
+			"integrity": "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/process": {
+			"version": "0.11.10",
+			"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+			"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6.0"
+			}
+		},
+		"node_modules/process-nextick-args": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+			"license": "MIT"
+		},
+		"node_modules/progress": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+			"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.4.0"
+			}
+		},
+		"node_modules/prop-types": {
+			"version": "15.8.1",
+			"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+			"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+			"license": "MIT",
+			"dependencies": {
+				"loose-envify": "^1.4.0",
+				"object-assign": "^4.1.1",
+				"react-is": "^16.13.1"
+			}
+		},
+		"node_modules/proper-lockfile": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+			"integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
+			"license": "MIT",
+			"dependencies": {
+				"graceful-fs": "^4.2.4",
+				"retry": "^0.12.0",
+				"signal-exit": "^3.0.2"
+			}
+		},
+		"node_modules/proper-lockfile/node_modules/signal-exit": {
+			"version": "3.0.7",
+			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+			"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+			"license": "ISC"
+		},
+		"node_modules/property-information": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+			"integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/proto-list": {
+			"version": "1.2.4",
+			"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+			"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+			"license": "ISC"
+		},
+		"node_modules/proxy-addr": {
+			"version": "2.0.7",
+			"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+			"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+			"license": "MIT",
+			"dependencies": {
+				"forwarded": "0.2.0",
+				"ipaddr.js": "1.9.1"
+			},
+			"engines": {
+				"node": ">= 0.10"
+			}
+		},
+		"node_modules/proxy-agent": {
+			"version": "6.5.0",
+			"resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+			"integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
+			"license": "MIT",
+			"dependencies": {
+				"agent-base": "^7.1.2",
+				"debug": "^4.3.4",
+				"http-proxy-agent": "^7.0.1",
+				"https-proxy-agent": "^7.0.6",
+				"lru-cache": "^7.14.1",
+				"pac-proxy-agent": "^7.1.0",
+				"proxy-from-env": "^1.1.0",
+				"socks-proxy-agent": "^8.0.5"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/proxy-agent/node_modules/lru-cache": {
+			"version": "7.18.3",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+			"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+			"license": "ISC",
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/proxy-from-env": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+			"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+			"license": "MIT"
+		},
+		"node_modules/ps-tree": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz",
+			"integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==",
+			"license": "MIT",
+			"dependencies": {
+				"event-stream": "=3.3.4"
+			},
+			"bin": {
+				"ps-tree": "bin/ps-tree.js"
+			},
+			"engines": {
+				"node": ">= 0.10"
+			}
+		},
+		"node_modules/pump": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
+			"integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+			"license": "MIT",
+			"dependencies": {
+				"end-of-stream": "^1.1.0",
+				"once": "^1.3.1"
+			}
+		},
+		"node_modules/punycode": {
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+			"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/puppeteer-chromium-resolver": {
+			"version": "24.0.2",
+			"resolved": "https://registry.npmjs.org/puppeteer-chromium-resolver/-/puppeteer-chromium-resolver-24.0.2.tgz",
+			"integrity": "sha512-YktJ1t0Qx7fC6OITmeZvDsT1fIiwmR6A7XIfKVHTcvztLy5vgCjglkYBEpyVHx2S6EiSawKTdAd4/mhlK/hl1A==",
+			"hasInstallScript": true,
+			"license": "MIT",
+			"dependencies": {
+				"@puppeteer/browsers": "^2.10.12",
+				"cli-progress": "^3.12.0",
+				"eight-colors": "^1.3.1",
+				"puppeteer-core": "^24.25.0"
+			}
+		},
+		"node_modules/puppeteer-chromium-resolver/node_modules/chromium-bidi": {
+			"version": "9.1.0",
+			"resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz",
+			"integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"mitt": "^3.0.1",
+				"zod": "^3.24.1"
+			},
+			"peerDependencies": {
+				"devtools-protocol": "*"
+			}
+		},
+		"node_modules/puppeteer-chromium-resolver/node_modules/devtools-protocol": {
+			"version": "0.0.1508733",
+			"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz",
+			"integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==",
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/puppeteer-chromium-resolver/node_modules/puppeteer-core": {
+			"version": "24.25.0",
+			"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.25.0.tgz",
+			"integrity": "sha512-8Xs6q3Ut+C8y7sAaqjIhzv1QykGWG4gc2mEZ2mYE7siZFuRp4xQVehOf8uQKSQAkeL7jXUs3mknEeiqnRqUKvQ==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@puppeteer/browsers": "2.10.12",
+				"chromium-bidi": "9.1.0",
+				"debug": "^4.4.3",
+				"devtools-protocol": "0.0.1508733",
+				"typed-query-selector": "^2.12.0",
+				"webdriver-bidi-protocol": "0.3.7",
+				"ws": "^8.18.3"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/puppeteer-core": {
+			"version": "23.11.1",
+			"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.11.1.tgz",
+			"integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"@puppeteer/browsers": "2.6.1",
+				"chromium-bidi": "0.11.0",
+				"debug": "^4.4.0",
+				"devtools-protocol": "0.0.1367902",
+				"typed-query-selector": "^2.12.0",
+				"ws": "^8.18.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/puppeteer-core/node_modules/@puppeteer/browsers": {
+			"version": "2.6.1",
+			"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz",
+			"integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"debug": "^4.4.0",
+				"extract-zip": "^2.0.1",
+				"progress": "^2.0.3",
+				"proxy-agent": "^6.5.0",
+				"semver": "^7.6.3",
+				"tar-fs": "^3.0.6",
+				"unbzip2-stream": "^1.4.3",
+				"yargs": "^17.7.2"
+			},
+			"bin": {
+				"browsers": "lib/cjs/main-cli.js"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/qs": {
+			"version": "6.14.0",
+			"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+			"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+			"license": "BSD-3-Clause",
+			"dependencies": {
+				"side-channel": "^1.1.0"
+			},
+			"engines": {
+				"node": ">=0.6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/range-parser": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+			"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/raw-body": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz",
+			"integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==",
+			"license": "MIT",
+			"dependencies": {
+				"bytes": "3.1.2",
+				"http-errors": "2.0.0",
+				"iconv-lite": "0.7.0",
+				"unpipe": "1.0.0"
+			},
+			"engines": {
+				"node": ">= 0.10"
+			}
+		},
+		"node_modules/raw-body/node_modules/iconv-lite": {
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
+			"integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
+			"license": "MIT",
+			"dependencies": {
+				"safer-buffer": ">= 2.1.2 < 3.0.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/express"
+			}
+		},
+		"node_modules/rc": {
+			"version": "1.2.8",
+			"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+			"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+			"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+			"dependencies": {
+				"deep-extend": "^0.6.0",
+				"ini": "~1.3.0",
+				"minimist": "^1.2.0",
+				"strip-json-comments": "~2.0.1"
+			},
+			"bin": {
+				"rc": "cli.js"
+			}
+		},
+		"node_modules/react": {
+			"version": "19.2.0",
+			"resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
+			"integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/react-devtools-core": {
+			"version": "6.1.5",
+			"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz",
+			"integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==",
+			"license": "MIT",
+			"dependencies": {
+				"shell-quote": "^1.6.1",
+				"ws": "^7"
+			}
+		},
+		"node_modules/react-devtools-core/node_modules/ws": {
+			"version": "7.5.10",
+			"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+			"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8.3.0"
+			},
+			"peerDependencies": {
+				"bufferutil": "^4.0.1",
+				"utf-8-validate": "^5.0.2"
+			},
+			"peerDependenciesMeta": {
+				"bufferutil": {
+					"optional": true
+				},
+				"utf-8-validate": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/react-error-boundary": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-6.0.0.tgz",
+			"integrity": "sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA==",
+			"license": "MIT",
+			"dependencies": {
+				"@babel/runtime": "^7.12.5"
+			},
+			"peerDependencies": {
+				"react": ">=16.13.1"
+			}
+		},
+		"node_modules/react-is": {
+			"version": "16.13.1",
+			"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+			"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+			"license": "MIT"
+		},
+		"node_modules/react-reconciler": {
+			"version": "0.32.0",
+			"resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.32.0.tgz",
+			"integrity": "sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ==",
+			"license": "MIT",
+			"dependencies": {
+				"scheduler": "^0.26.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			},
+			"peerDependencies": {
+				"react": "^19.1.0"
+			}
+		},
+		"node_modules/readable-stream": {
+			"version": "3.6.2",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+			"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+			"license": "MIT",
+			"dependencies": {
+				"inherits": "^2.0.3",
+				"string_decoder": "^1.1.1",
+				"util-deprecate": "^1.0.1"
+			},
+			"engines": {
+				"node": ">= 6"
+			}
+		},
+		"node_modules/readdir-glob": {
+			"version": "1.1.3",
+			"resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
+			"integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"minimatch": "^5.1.0"
+			}
+		},
+		"node_modules/readdir-glob/node_modules/minimatch": {
+			"version": "5.1.6",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+			"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+			"license": "ISC",
+			"dependencies": {
+				"brace-expansion": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/readdirp": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+			"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 14.18.0"
+			},
+			"funding": {
+				"type": "individual",
+				"url": "https://paulmillr.com/funding/"
+			}
+		},
+		"node_modules/reconnecting-eventsource": {
+			"version": "1.6.4",
+			"resolved": "https://registry.npmjs.org/reconnecting-eventsource/-/reconnecting-eventsource-1.6.4.tgz",
+			"integrity": "sha512-0L3IS3wxcNFApTPPHkcbY8Aya7XZIpYDzhxa8j6QSufVkUN018XJKfh2ZaThLBGP/iN5UTz2yweMhkqr0PKa7A==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12.0.0"
+			}
+		},
+		"node_modules/redeyed": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+			"integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==",
+			"license": "MIT",
+			"dependencies": {
+				"esprima": "~4.0.0"
+			}
+		},
+		"node_modules/regex": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz",
+			"integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==",
+			"license": "MIT",
+			"dependencies": {
+				"regex-utilities": "^2.3.0"
+			}
+		},
+		"node_modules/regex-recursion": {
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+			"integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+			"license": "MIT",
+			"dependencies": {
+				"regex-utilities": "^2.3.0"
+			}
+		},
+		"node_modules/regex-utilities": {
+			"version": "2.3.0",
+			"resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+			"integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+			"license": "MIT"
+		},
+		"node_modules/registry-auth-token": {
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz",
+			"integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==",
+			"license": "MIT",
+			"dependencies": {
+				"@pnpm/npm-conf": "^2.1.0"
+			},
+			"engines": {
+				"node": ">=14"
+			}
+		},
+		"node_modules/registry-url": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
+			"integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
+			"license": "MIT",
+			"dependencies": {
+				"rc": "1.2.8"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/require-directory": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+			"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/require-from-string": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+			"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/restore-cursor": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
+			"integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+			"license": "MIT",
+			"dependencies": {
+				"onetime": "^5.1.0",
+				"signal-exit": "^3.0.2"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/restore-cursor/node_modules/signal-exit": {
+			"version": "3.0.7",
+			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+			"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+			"license": "ISC"
+		},
+		"node_modules/retry": {
+			"version": "0.12.0",
+			"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+			"integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 4"
+			}
+		},
+		"node_modules/router": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+			"integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+			"license": "MIT",
+			"dependencies": {
+				"debug": "^4.4.0",
+				"depd": "^2.0.0",
+				"is-promise": "^4.0.0",
+				"parseurl": "^1.3.3",
+				"path-to-regexp": "^8.0.0"
+			},
+			"engines": {
+				"node": ">= 18"
+			}
+		},
+		"node_modules/rrweb-cssom": {
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz",
+			"integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==",
+			"license": "MIT"
+		},
+		"node_modules/safe-buffer": {
+			"version": "5.2.1",
+			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+			"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/feross"
+				},
+				{
+					"type": "patreon",
+					"url": "https://www.patreon.com/feross"
+				},
+				{
+					"type": "consulting",
+					"url": "https://feross.org/support"
+				}
+			],
+			"license": "MIT"
+		},
+		"node_modules/safer-buffer": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+			"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+			"license": "MIT"
+		},
+		"node_modules/sanitize-filename": {
+			"version": "1.6.3",
+			"resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
+			"integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
+			"license": "WTFPL OR ISC",
+			"dependencies": {
+				"truncate-utf8-bytes": "^1.0.0"
+			}
+		},
+		"node_modules/saxes": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+			"integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+			"license": "ISC",
+			"dependencies": {
+				"xmlchars": "^2.2.0"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/say": {
+			"version": "0.16.0",
+			"resolved": "https://registry.npmjs.org/say/-/say-0.16.0.tgz",
+			"integrity": "sha512-yEfncNu3I6lcZ6RIrXgE9DqbrEmvV5uQQ8ReM14u/DodlvJYpveqNphO55RLMSj77b06ZKNif/FLmhzQxcuUXg==",
+			"license": "MIT",
+			"dependencies": {
+				"one-time": "0.0.4"
+			},
+			"engines": {
+				"node": ">=6.9"
+			}
+		},
+		"node_modules/scheduler": {
+			"version": "0.26.0",
+			"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+			"integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+			"license": "MIT"
+		},
+		"node_modules/section-matter": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
+			"integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+			"license": "MIT",
+			"dependencies": {
+				"extend-shallow": "^2.0.1",
+				"kind-of": "^6.0.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/semver": {
+			"version": "7.7.3",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+			"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+			"license": "ISC",
+			"bin": {
+				"semver": "bin/semver.js"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/send": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
+			"integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
+			"license": "MIT",
+			"dependencies": {
+				"debug": "^4.3.5",
+				"encodeurl": "^2.0.0",
+				"escape-html": "^1.0.3",
+				"etag": "^1.8.1",
+				"fresh": "^2.0.0",
+				"http-errors": "^2.0.0",
+				"mime-types": "^3.0.1",
+				"ms": "^2.1.3",
+				"on-finished": "^2.4.1",
+				"range-parser": "^1.2.1",
+				"statuses": "^2.0.1"
+			},
+			"engines": {
+				"node": ">= 18"
+			}
+		},
+		"node_modules/serialize-error": {
+			"version": "11.0.3",
+			"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz",
+			"integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==",
+			"license": "MIT",
+			"dependencies": {
+				"type-fest": "^2.12.2"
+			},
+			"engines": {
+				"node": ">=14.16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/serialize-error/node_modules/type-fest": {
+			"version": "2.19.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+			"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+			"license": "(MIT OR CC0-1.0)",
+			"engines": {
+				"node": ">=12.20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/serve-static": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
+			"integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
+			"license": "MIT",
+			"dependencies": {
+				"encodeurl": "^2.0.0",
+				"escape-html": "^1.0.3",
+				"parseurl": "^1.3.3",
+				"send": "^1.2.0"
+			},
+			"engines": {
+				"node": ">= 18"
+			}
+		},
+		"node_modules/setimmediate": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+			"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+			"license": "MIT"
+		},
+		"node_modules/setprototypeof": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+			"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+			"license": "ISC"
+		},
+		"node_modules/shallow-clone": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+			"integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+			"license": "MIT",
+			"dependencies": {
+				"kind-of": "^6.0.2"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/shebang-command": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+			"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+			"license": "MIT",
+			"dependencies": {
+				"shebang-regex": "^3.0.0"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/shebang-regex": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+			"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/shell-quote": {
+			"version": "1.8.3",
+			"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+			"integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/shiki": {
+			"version": "3.13.0",
+			"resolved": "https://registry.npmjs.org/shiki/-/shiki-3.13.0.tgz",
+			"integrity": "sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==",
+			"license": "MIT",
+			"dependencies": {
+				"@shikijs/core": "3.13.0",
+				"@shikijs/engine-javascript": "3.13.0",
+				"@shikijs/engine-oniguruma": "3.13.0",
+				"@shikijs/langs": "3.13.0",
+				"@shikijs/themes": "3.13.0",
+				"@shikijs/types": "3.13.0",
+				"@shikijs/vscode-textmate": "^10.0.2",
+				"@types/hast": "^3.0.4"
+			}
+		},
+		"node_modules/side-channel": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+			"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+			"license": "MIT",
+			"dependencies": {
+				"es-errors": "^1.3.0",
+				"object-inspect": "^1.13.3",
+				"side-channel-list": "^1.0.0",
+				"side-channel-map": "^1.0.1",
+				"side-channel-weakmap": "^1.0.2"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/side-channel-list": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+			"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+			"license": "MIT",
+			"dependencies": {
+				"es-errors": "^1.3.0",
+				"object-inspect": "^1.13.3"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/side-channel-map": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+			"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+			"license": "MIT",
+			"dependencies": {
+				"call-bound": "^1.0.2",
+				"es-errors": "^1.3.0",
+				"get-intrinsic": "^1.2.5",
+				"object-inspect": "^1.13.3"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/side-channel-weakmap": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+			"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+			"license": "MIT",
+			"dependencies": {
+				"call-bound": "^1.0.2",
+				"es-errors": "^1.3.0",
+				"get-intrinsic": "^1.2.5",
+				"object-inspect": "^1.13.3",
+				"side-channel-map": "^1.0.1"
+			},
+			"engines": {
+				"node": ">= 0.4"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/signal-exit": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+			"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+			"license": "ISC",
+			"engines": {
+				"node": ">=14"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/isaacs"
+			}
+		},
+		"node_modules/simple-git": {
+			"version": "3.28.0",
+			"resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz",
+			"integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==",
+			"license": "MIT",
+			"dependencies": {
+				"@kwsites/file-exists": "^1.1.1",
+				"@kwsites/promise-deferred": "^1.1.1",
+				"debug": "^4.4.0"
+			},
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/steveukx/git-js?sponsor=1"
+			}
+		},
+		"node_modules/skin-tone": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
+			"integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==",
+			"license": "MIT",
+			"dependencies": {
+				"unicode-emoji-modifier-base": "^1.0.0"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/slice-ansi": {
+			"version": "7.1.2",
+			"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz",
+			"integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^6.2.1",
+				"is-fullwidth-code-point": "^5.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/slice-ansi?sponsor=1"
+			}
+		},
+		"node_modules/smart-buffer": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+			"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 6.0.0",
+				"npm": ">= 3.0.0"
+			}
+		},
+		"node_modules/socket.io-client": {
+			"version": "4.8.1",
+			"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
+			"integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@socket.io/component-emitter": "~3.1.0",
+				"debug": "~4.3.2",
+				"engine.io-client": "~6.6.1",
+				"socket.io-parser": "~4.2.4"
+			},
+			"engines": {
+				"node": ">=10.0.0"
+			}
+		},
+		"node_modules/socket.io-client/node_modules/debug": {
+			"version": "4.3.7",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+			"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ms": "^2.1.3"
+			},
+			"engines": {
+				"node": ">=6.0"
+			},
+			"peerDependenciesMeta": {
+				"supports-color": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/socket.io-parser": {
+			"version": "4.2.4",
+			"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+			"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+			"license": "MIT",
+			"dependencies": {
+				"@socket.io/component-emitter": "~3.1.0",
+				"debug": "~4.3.1"
+			},
+			"engines": {
+				"node": ">=10.0.0"
+			}
+		},
+		"node_modules/socket.io-parser/node_modules/debug": {
+			"version": "4.3.7",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+			"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+			"license": "MIT",
+			"dependencies": {
+				"ms": "^2.1.3"
+			},
+			"engines": {
+				"node": ">=6.0"
+			},
+			"peerDependenciesMeta": {
+				"supports-color": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/socks": {
+			"version": "2.8.7",
+			"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
+			"integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+			"license": "MIT",
+			"dependencies": {
+				"ip-address": "^10.0.1",
+				"smart-buffer": "^4.2.0"
+			},
+			"engines": {
+				"node": ">= 10.0.0",
+				"npm": ">= 3.0.0"
+			}
+		},
+		"node_modules/socks-proxy-agent": {
+			"version": "8.0.5",
+			"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+			"integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+			"license": "MIT",
+			"dependencies": {
+				"agent-base": "^7.1.2",
+				"debug": "^4.3.4",
+				"socks": "^2.8.3"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/sound-play": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/sound-play/-/sound-play-1.1.0.tgz",
+			"integrity": "sha512-Bd/L0AoCwITFeOnpNLMsfPXrV5GG5NhrC/T6odveahYbhPZkdTnrFXRia9FCC5WBWdUTw1d+yvLBvi4wnD1xOA==",
+			"license": "MIT"
+		},
+		"node_modules/source-map": {
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+			"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+			"license": "BSD-3-Clause",
+			"optional": true,
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/space-separated-tokens": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+			"integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/split": {
+			"version": "0.3.3",
+			"resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+			"integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==",
+			"license": "MIT",
+			"dependencies": {
+				"through": "2"
+			},
+			"engines": {
+				"node": "*"
+			}
+		},
+		"node_modules/sprintf-js": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+			"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/stack-utils": {
+			"version": "2.0.6",
+			"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+			"integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+			"license": "MIT",
+			"dependencies": {
+				"escape-string-regexp": "^2.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/statuses": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+			"integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/stream-chain": {
+			"version": "2.2.5",
+			"resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz",
+			"integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==",
+			"license": "BSD-3-Clause"
+		},
+		"node_modules/stream-combiner": {
+			"version": "0.0.4",
+			"resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+			"integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==",
+			"license": "MIT",
+			"dependencies": {
+				"duplexer": "~0.1.1"
+			}
+		},
+		"node_modules/stream-json": {
+			"version": "1.9.1",
+			"resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz",
+			"integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==",
+			"license": "BSD-3-Clause",
+			"dependencies": {
+				"stream-chain": "^2.2.5"
+			}
+		},
+		"node_modules/streamx": {
+			"version": "2.23.0",
+			"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
+			"integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
+			"license": "MIT",
+			"dependencies": {
+				"events-universal": "^1.0.0",
+				"fast-fifo": "^1.3.2",
+				"text-decoder": "^1.1.0"
+			}
+		},
+		"node_modules/string_decoder": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+			"license": "MIT",
+			"dependencies": {
+				"safe-buffer": "~5.2.0"
+			}
+		},
+		"node_modules/string-width": {
+			"version": "8.1.0",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz",
+			"integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==",
+			"license": "MIT",
+			"dependencies": {
+				"get-east-asian-width": "^1.3.0",
+				"strip-ansi": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/string-width-cjs": {
+			"name": "string-width",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^8.0.0",
+				"is-fullwidth-code-point": "^3.0.0",
+				"strip-ansi": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/string-width-cjs/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/string-width-cjs/node_modules/strip-ansi": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/stringify-entities": {
+			"version": "4.0.4",
+			"resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+			"integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+			"license": "MIT",
+			"dependencies": {
+				"character-entities-html4": "^2.0.0",
+				"character-entities-legacy": "^3.0.0"
+			},
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/strip-ansi": {
+			"version": "7.1.2",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+			"integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
+			}
+		},
+		"node_modules/strip-ansi-cjs": {
+			"name": "strip-ansi",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/strip-bom": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-5.0.0.tgz",
+			"integrity": "sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/strip-bom-string": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+			"integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/strip-final-newline": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+			"integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/strip-json-comments": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+			"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/strnum": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz",
+			"integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/NaturalIntelligence"
+				}
+			],
+			"license": "MIT"
+		},
+		"node_modules/strong-type": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/strong-type/-/strong-type-1.1.0.tgz",
+			"integrity": "sha512-X5Z6riticuH5GnhUyzijfDi1SoXas8ODDyN7K8lJeQK+Jfi4dKdoJGL4CXTskY/ATBcN+rz5lROGn1tAUkOX7g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12.21.0"
+			}
+		},
+		"node_modules/supports-color": {
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+			"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+			"license": "MIT",
+			"dependencies": {
+				"has-flag": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/supports-color?sponsor=1"
+			}
+		},
+		"node_modules/supports-hyperlinks": {
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz",
+			"integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==",
+			"license": "MIT",
+			"dependencies": {
+				"has-flag": "^4.0.0",
+				"supports-color": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=14.18"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/supports-hyperlinks?sponsor=1"
+			}
+		},
+		"node_modules/supports-hyperlinks/node_modules/supports-color": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+			"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+			"license": "MIT",
+			"dependencies": {
+				"has-flag": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/symbol-tree": {
+			"version": "3.2.4",
+			"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+			"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+			"license": "MIT"
+		},
+		"node_modules/tar-fs": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz",
+			"integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==",
+			"license": "MIT",
+			"dependencies": {
+				"pump": "^3.0.0",
+				"tar-stream": "^3.1.5"
+			},
+			"optionalDependencies": {
+				"bare-fs": "^4.0.1",
+				"bare-path": "^3.0.0"
+			}
+		},
+		"node_modules/tar-stream": {
+			"version": "3.1.7",
+			"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+			"integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+			"license": "MIT",
+			"dependencies": {
+				"b4a": "^1.6.4",
+				"fast-fifo": "^1.2.0",
+				"streamx": "^2.15.0"
+			}
+		},
+		"node_modules/text-decoder": {
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
+			"integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+			"license": "Apache-2.0",
+			"dependencies": {
+				"b4a": "^1.6.4"
+			}
+		},
+		"node_modules/through": {
+			"version": "2.3.8",
+			"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+			"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+			"license": "MIT"
+		},
+		"node_modules/tiktoken": {
+			"version": "1.0.22",
+			"resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.22.tgz",
+			"integrity": "sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA==",
+			"license": "MIT"
+		},
+		"node_modules/tinycolor2": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+			"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
+			"license": "MIT"
+		},
+		"node_modules/tinygradient": {
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz",
+			"integrity": "sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/tinycolor2": "^1.4.0",
+				"tinycolor2": "^1.0.0"
+			}
+		},
+		"node_modules/tldts": {
+			"version": "6.1.86",
+			"resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+			"integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+			"license": "MIT",
+			"dependencies": {
+				"tldts-core": "^6.1.86"
+			},
+			"bin": {
+				"tldts": "bin/cli.js"
+			}
+		},
+		"node_modules/tldts-core": {
+			"version": "6.1.86",
+			"resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+			"integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+			"license": "MIT"
+		},
+		"node_modules/tmp": {
+			"version": "0.2.5",
+			"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
+			"integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=14.14"
+			}
+		},
+		"node_modules/to-rotated": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/to-rotated/-/to-rotated-1.0.0.tgz",
+			"integrity": "sha512-KsEID8AfgUy+pxVRLsWp0VzCa69wxzUDZnzGbyIST/bcgcrMvTYoFBX/QORH4YApoD89EDuUovx4BTdpOn319Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/toidentifier": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+			"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=0.6"
+			}
+		},
+		"node_modules/tough-cookie": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+			"integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+			"license": "BSD-3-Clause",
+			"dependencies": {
+				"tldts": "^6.1.32"
+			},
+			"engines": {
+				"node": ">=16"
+			}
+		},
+		"node_modules/tr46": {
+			"version": "5.1.1",
+			"resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
+			"integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
+			"license": "MIT",
+			"dependencies": {
+				"punycode": "^2.3.1"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/tree-sitter-wasms": {
+			"version": "0.1.13",
+			"resolved": "https://registry.npmjs.org/tree-sitter-wasms/-/tree-sitter-wasms-0.1.13.tgz",
+			"integrity": "sha512-wT+cR6DwaIz80/vho3AvSF0N4txuNx/5bcRKoXouOfClpxh/qqrF4URNLQXbbt8MaAxeksZcZd1j8gcGjc+QxQ==",
+			"license": "Unlicense",
+			"dependencies": {
+				"tree-sitter-wasms": "^0.1.11"
+			}
+		},
+		"node_modules/trim-lines": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+			"integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		},
+		"node_modules/truncate-utf8-bytes": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+			"integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+			"license": "WTFPL",
+			"dependencies": {
+				"utf8-byte-length": "^1.0.1"
+			}
+		},
+		"node_modules/ts-node": {
+			"version": "10.9.2",
+			"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+			"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@cspotcode/source-map-support": "^0.8.0",
+				"@tsconfig/node10": "^1.0.7",
+				"@tsconfig/node12": "^1.0.7",
+				"@tsconfig/node14": "^1.0.0",
+				"@tsconfig/node16": "^1.0.2",
+				"acorn": "^8.4.1",
+				"acorn-walk": "^8.1.1",
+				"arg": "^4.1.0",
+				"create-require": "^1.1.0",
+				"diff": "^4.0.1",
+				"make-error": "^1.1.1",
+				"v8-compile-cache-lib": "^3.0.1",
+				"yn": "3.1.1"
+			},
+			"bin": {
+				"ts-node": "dist/bin.js",
+				"ts-node-cwd": "dist/bin-cwd.js",
+				"ts-node-esm": "dist/bin-esm.js",
+				"ts-node-script": "dist/bin-script.js",
+				"ts-node-transpile-only": "dist/bin-transpile.js",
+				"ts-script": "dist/bin-script-deprecated.js"
+			},
+			"peerDependencies": {
+				"@swc/core": ">=1.2.50",
+				"@swc/wasm": ">=1.2.50",
+				"@types/node": "*",
+				"typescript": ">=2.7"
+			},
+			"peerDependenciesMeta": {
+				"@swc/core": {
+					"optional": true
+				},
+				"@swc/wasm": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/ts-node/node_modules/diff": {
+			"version": "4.0.2",
+			"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+			"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+			"license": "BSD-3-Clause",
+			"engines": {
+				"node": ">=0.3.1"
+			}
+		},
+		"node_modules/tslib": {
+			"version": "1.14.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+			"license": "0BSD"
+		},
+		"node_modules/turndown": {
+			"version": "7.2.1",
+			"resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.1.tgz",
+			"integrity": "sha512-7YiPJw6rLClQL3oUKN3KgMaXeJJ2lAyZItclgKDurqnH61so4k4IH/qwmMva0zpuJc/FhRExBBnk7EbeFANlgQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@mixmark-io/domino": "^2.2.0"
+			}
+		},
+		"node_modules/type-fest": {
+			"version": "4.41.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+			"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+			"license": "(MIT OR CC0-1.0)",
+			"engines": {
+				"node": ">=16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/type-is": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+			"integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+			"license": "MIT",
+			"dependencies": {
+				"content-type": "^1.0.5",
+				"media-typer": "^1.1.0",
+				"mime-types": "^3.0.0"
+			},
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/typed-query-selector": {
+			"version": "2.12.0",
+			"resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz",
+			"integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==",
+			"license": "MIT"
+		},
+		"node_modules/typescript": {
+			"version": "5.9.3",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+			"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+			"license": "Apache-2.0",
+			"peer": true,
+			"bin": {
+				"tsc": "bin/tsc",
+				"tsserver": "bin/tsserver"
+			},
+			"engines": {
+				"node": ">=14.17"
+			}
+		},
+		"node_modules/unbzip2-stream": {
+			"version": "1.4.3",
+			"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+			"integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+			"license": "MIT",
+			"dependencies": {
+				"buffer": "^5.2.1",
+				"through": "^2.3.8"
+			}
+		},
+		"node_modules/unbzip2-stream/node_modules/buffer": {
+			"version": "5.7.1",
+			"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+			"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/feross"
+				},
+				{
+					"type": "patreon",
+					"url": "https://www.patreon.com/feross"
+				},
+				{
+					"type": "consulting",
+					"url": "https://feross.org/support"
+				}
+			],
+			"license": "MIT",
+			"dependencies": {
+				"base64-js": "^1.3.1",
+				"ieee754": "^1.1.13"
+			}
+		},
+		"node_modules/underscore": {
+			"version": "1.13.7",
+			"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+			"integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
+			"license": "MIT"
+		},
+		"node_modules/undici": {
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz",
+			"integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=20.18.1"
+			}
+		},
+		"node_modules/undici-types": {
+			"version": "7.14.0",
+			"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
+			"integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==",
+			"license": "MIT"
+		},
+		"node_modules/unicode-emoji-modifier-base": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz",
+			"integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/unist-util-is": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+			"integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "^3.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/unist-util-position": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+			"integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "^3.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/unist-util-stringify-position": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+			"integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "^3.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/unist-util-visit": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+			"integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "^3.0.0",
+				"unist-util-is": "^6.0.0",
+				"unist-util-visit-parents": "^6.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/unist-util-visit-parents": {
+			"version": "6.0.2",
+			"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+			"integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "^3.0.0",
+				"unist-util-is": "^6.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/universalify": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+			"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 10.0.0"
+			}
+		},
+		"node_modules/unpipe": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+			"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/unzipper": {
+			"version": "0.12.3",
+			"resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz",
+			"integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==",
+			"license": "MIT",
+			"dependencies": {
+				"bluebird": "~3.7.2",
+				"duplexer2": "~0.1.4",
+				"fs-extra": "^11.2.0",
+				"graceful-fs": "^4.2.2",
+				"node-int64": "^0.4.0"
+			}
+		},
+		"node_modules/unzipper/node_modules/bluebird": {
+			"version": "3.7.2",
+			"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+			"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+			"license": "MIT"
+		},
+		"node_modules/uri-js": {
+			"version": "4.4.1",
+			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+			"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+			"license": "BSD-2-Clause",
+			"dependencies": {
+				"punycode": "^2.1.0"
+			}
+		},
+		"node_modules/utf8-byte-length": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz",
+			"integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==",
+			"license": "(WTFPL OR MIT)"
+		},
+		"node_modules/util-deprecate": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+			"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+			"license": "MIT"
+		},
+		"node_modules/uuid": {
+			"version": "11.1.0",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+			"integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+			"funding": ["https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan"],
+			"license": "MIT",
+			"bin": {
+				"uuid": "dist/esm/bin/uuid"
+			}
+		},
+		"node_modules/v8-compile-cache-lib": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+			"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+			"license": "MIT"
+		},
+		"node_modules/vary": {
+			"version": "1.1.2",
+			"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+			"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">= 0.8"
+			}
+		},
+		"node_modules/vfile": {
+			"version": "6.0.3",
+			"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+			"integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "^3.0.0",
+				"vfile-message": "^4.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/vfile-message": {
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+			"integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+			"license": "MIT",
+			"dependencies": {
+				"@types/unist": "^3.0.0",
+				"unist-util-stringify-position": "^4.0.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/unified"
+			}
+		},
+		"node_modules/vscode-material-icons": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/vscode-material-icons/-/vscode-material-icons-0.1.1.tgz",
+			"integrity": "sha512-GsoEEF8Tbb0yUFQ6N6FPvh11kFkL9F95x0FkKlbbfRQN9eFms67h+L3t6b9cUv58dSn2gu8kEhNfoESVCrz4ag==",
+			"license": "MIT"
+		},
+		"node_modules/vscode-uri": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
+			"integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
+			"license": "MIT"
+		},
+		"node_modules/w3c-xmlserializer": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+			"integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+			"license": "MIT",
+			"dependencies": {
+				"xml-name-validator": "^5.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/web-tree-sitter": {
+			"version": "0.25.10",
+			"resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.25.10.tgz",
+			"integrity": "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA==",
+			"license": "MIT",
+			"peerDependencies": {
+				"@types/emscripten": "^1.40.0"
+			},
+			"peerDependenciesMeta": {
+				"@types/emscripten": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/webdriver-bidi-protocol": {
+			"version": "0.3.7",
+			"resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.7.tgz",
+			"integrity": "sha512-wIx5Gu/LLTeexxilpk8WxU2cpGAKlfbWRO5h+my6EMD1k5PYqM1qQO1MHUFf4f3KRnhBvpbZU7VkizAgeSEf7g==",
+			"license": "Apache-2.0"
+		},
+		"node_modules/webidl-conversions": {
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+			"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+			"license": "BSD-2-Clause",
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/whatwg-encoding": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+			"integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+			"license": "MIT",
+			"dependencies": {
+				"iconv-lite": "0.6.3"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/whatwg-fetch": {
+			"version": "3.6.20",
+			"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+			"integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+			"license": "MIT"
+		},
+		"node_modules/whatwg-mimetype": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+			"integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/whatwg-url": {
+			"version": "14.2.0",
+			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
+			"integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
+			"license": "MIT",
+			"dependencies": {
+				"tr46": "^5.1.0",
+				"webidl-conversions": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/which": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+			"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+			"license": "ISC",
+			"dependencies": {
+				"isexe": "^2.0.0"
+			},
+			"bin": {
+				"node-which": "bin/node-which"
+			},
+			"engines": {
+				"node": ">= 8"
+			}
+		},
+		"node_modules/widest-line": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz",
+			"integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==",
+			"license": "MIT",
+			"dependencies": {
+				"string-width": "^7.0.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/widest-line/node_modules/emoji-regex": {
+			"version": "10.6.0",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+			"integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+			"license": "MIT"
+		},
+		"node_modules/widest-line/node_modules/string-width": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+			"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^10.3.0",
+				"get-east-asian-width": "^1.0.0",
+				"strip-ansi": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/window-size": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz",
+			"integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==",
+			"license": "MIT",
+			"dependencies": {
+				"define-property": "^1.0.0",
+				"is-number": "^3.0.0"
+			},
+			"bin": {
+				"window-size": "cli.js"
+			},
+			"engines": {
+				"node": ">= 0.10.0"
+			}
+		},
+		"node_modules/windows-release": {
+			"version": "6.1.0",
+			"resolved": "https://registry.npmjs.org/windows-release/-/windows-release-6.1.0.tgz",
+			"integrity": "sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==",
+			"license": "MIT",
+			"dependencies": {
+				"execa": "^8.0.1"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/workerpool": {
+			"version": "9.3.4",
+			"resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz",
+			"integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==",
+			"license": "Apache-2.0"
+		},
+		"node_modules/wrap-ansi": {
+			"version": "9.0.2",
+			"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+			"integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^6.2.1",
+				"string-width": "^7.0.0",
+				"strip-ansi": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+			}
+		},
+		"node_modules/wrap-ansi-cjs": {
+			"name": "wrap-ansi",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+			"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-styles": "^4.0.0",
+				"string-width": "^4.1.0",
+				"strip-ansi": "^6.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+			}
+		},
+		"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+			"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+			"license": "MIT",
+			"dependencies": {
+				"color-convert": "^2.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+			}
+		},
+		"node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/wrap-ansi-cjs/node_modules/string-width": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^8.0.0",
+				"is-fullwidth-code-point": "^3.0.0",
+				"strip-ansi": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/wrap-ansi/node_modules/emoji-regex": {
+			"version": "10.6.0",
+			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+			"integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+			"license": "MIT"
+		},
+		"node_modules/wrap-ansi/node_modules/string-width": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+			"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^10.3.0",
+				"get-east-asian-width": "^1.0.0",
+				"strip-ansi": "^7.1.0"
+			},
+			"engines": {
+				"node": ">=18"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/wrappy": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+			"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+			"license": "ISC"
+		},
+		"node_modules/ws": {
+			"version": "8.18.3",
+			"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+			"integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=10.0.0"
+			},
+			"peerDependencies": {
+				"bufferutil": "^4.0.1",
+				"utf-8-validate": ">=5.0.2"
+			},
+			"peerDependenciesMeta": {
+				"bufferutil": {
+					"optional": true
+				},
+				"utf-8-validate": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/xml-name-validator": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+			"integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+			"license": "Apache-2.0",
+			"engines": {
+				"node": ">=18"
+			}
+		},
+		"node_modules/xmlbuilder": {
+			"version": "10.1.1",
+			"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz",
+			"integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=4.0"
+			}
+		},
+		"node_modules/xmlchars": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+			"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+			"license": "MIT"
+		},
+		"node_modules/xmlhttprequest-ssl": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
+			"integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
+			"engines": {
+				"node": ">=0.4.0"
+			}
+		},
+		"node_modules/y18n": {
+			"version": "5.0.8",
+			"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+			"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+			"license": "ISC",
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/yaml": {
+			"version": "2.8.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
+			"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+			"license": "ISC",
+			"bin": {
+				"yaml": "bin.mjs"
+			},
+			"engines": {
+				"node": ">= 14.6"
+			}
+		},
+		"node_modules/yargs": {
+			"version": "17.7.2",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+			"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+			"license": "MIT",
+			"dependencies": {
+				"cliui": "^8.0.1",
+				"escalade": "^3.1.1",
+				"get-caller-file": "^2.0.5",
+				"require-directory": "^2.1.1",
+				"string-width": "^4.2.3",
+				"y18n": "^5.0.5",
+				"yargs-parser": "^21.1.1"
+			},
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/yargs-parser": {
+			"version": "21.1.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+			"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+			"license": "ISC",
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/yargs/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/yargs/node_modules/is-fullwidth-code-point": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/yargs/node_modules/string-width": {
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+			"license": "MIT",
+			"dependencies": {
+				"emoji-regex": "^8.0.0",
+				"is-fullwidth-code-point": "^3.0.0",
+				"strip-ansi": "^6.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/yargs/node_modules/strip-ansi": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+			"license": "MIT",
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/yauzl": {
+			"version": "2.10.0",
+			"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+			"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+			"license": "MIT",
+			"dependencies": {
+				"buffer-crc32": "~0.2.3",
+				"fd-slicer": "~1.1.0"
+			}
+		},
+		"node_modules/yauzl/node_modules/buffer-crc32": {
+			"version": "0.2.13",
+			"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+			"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+			"license": "MIT",
+			"engines": {
+				"node": "*"
+			}
+		},
+		"node_modules/yn": {
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+			"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=6"
+			}
+		},
+		"node_modules/yocto-queue": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz",
+			"integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==",
+			"license": "MIT",
+			"engines": {
+				"node": ">=12.20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/yoga-layout": {
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz",
+			"integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==",
+			"license": "MIT"
+		},
+		"node_modules/zip-stream": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",
+			"integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==",
+			"license": "MIT",
+			"dependencies": {
+				"archiver-utils": "^5.0.0",
+				"compress-commons": "^6.0.2",
+				"readable-stream": "^4.0.0"
+			},
+			"engines": {
+				"node": ">= 14"
+			}
+		},
+		"node_modules/zip-stream/node_modules/readable-stream": {
+			"version": "4.7.0",
+			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+			"integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+			"license": "MIT",
+			"dependencies": {
+				"abort-controller": "^3.0.0",
+				"buffer": "^6.0.3",
+				"events": "^3.3.0",
+				"process": "^0.11.10",
+				"string_decoder": "^1.3.0"
+			},
+			"engines": {
+				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+			}
+		},
+		"node_modules/zod": {
+			"version": "3.25.76",
+			"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+			"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+			"license": "MIT",
+			"funding": {
+				"url": "https://github.com/sponsors/colinhacks"
+			}
+		},
+		"node_modules/zod-to-json-schema": {
+			"version": "3.24.6",
+			"resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz",
+			"integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==",
+			"license": "ISC",
+			"peerDependencies": {
+				"zod": "^3.24.1"
+			}
+		},
+		"node_modules/zwitch": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+			"integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+			"license": "MIT",
+			"funding": {
+				"type": "github",
+				"url": "https://github.com/sponsors/wooorm"
+			}
+		}
+	}
+}

+ 1 - 1
cli/package.dist.json

@@ -1,6 +1,6 @@
 {
 	"name": "@kilocode/cli",
-	"version": "0.0.6",
+	"version": "0.0.8",
 	"description": "Terminal User Interface for Kilo Code",
 	"type": "module",
 	"main": "index.js",

+ 4 - 1
cli/package.json

@@ -1,6 +1,6 @@
 {
 	"name": "@kilocode/cli",
-	"version": "0.0.6",
+	"version": "0.0.8",
 	"description": "Terminal User Interface for Kilo Code",
 	"type": "module",
 	"main": "dist/index.js",
@@ -12,6 +12,8 @@
 		"build": "node esbuild.config.mjs",
 		"dev": "pnpm build --watch",
 		"deps:install": "npm install --omit=dev --prefix ./dist",
+		"deps:freeze": "npm shrinkwrap --prefix ./dist",
+		"shrinkwrap": "pnpm run deps:install && pnpm run deps:freeze && cp ./dist/npm-shrinkwrap.json ./npm-shrinkwrap.dist.json",
 		"start": "node dist/index.js",
 		"clean": "rimraf dist",
 		"test": "vitest run",
@@ -72,6 +74,7 @@
 		"ink-spinner": "^5.0.0",
 		"ink-table": "^3.1.0",
 		"ink-text-input": "^6.0.0",
+		"inquirer": "^12.10.0",
 		"is-wsl": "^3.1.0",
 		"isbinaryfile": "^5.0.2",
 		"jotai": "^2.14.0",

+ 98 - 0
cli/src/__tests__/config-default-creation.test.ts

@@ -0,0 +1,98 @@
+import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"
+import * as fs from "fs/promises"
+import * as path from "path"
+import { homedir } from "os"
+import { saveConfig, setConfigPaths, resetConfigPaths, ensureConfigDir } from "../config/persistence.js"
+import { DEFAULT_CONFIG } from "../config/defaults.js"
+
+// Mock the logs service
+vi.mock("../services/logs.js", () => ({
+	logs: {
+		info: vi.fn(),
+		debug: vi.fn(),
+		error: vi.fn(),
+		warn: vi.fn(),
+	},
+}))
+
+// Mock fs/promises to handle schema.json reads
+vi.mock("fs/promises", async () => {
+	const actual = await vi.importActual<typeof import("fs/promises")>("fs/promises")
+	return {
+		...actual,
+		readFile: vi.fn(async (filePath: any, encoding?: any) => {
+			// If reading schema.json, return a minimal valid schema
+			if (typeof filePath === "string" && filePath.includes("schema.json")) {
+				return JSON.stringify({
+					type: "object",
+					properties: {},
+					additionalProperties: true,
+				})
+			}
+			// Otherwise use the actual implementation
+			return actual.readFile(filePath, encoding)
+		}),
+	}
+})
+
+// Define test paths
+const TEST_CONFIG_DIR = path.join(homedir(), ".kilocode", "cli-test-default")
+const TEST_CONFIG_FILE = path.join(TEST_CONFIG_DIR, "config.json")
+
+describe("Default Config Creation", () => {
+	beforeEach(async () => {
+		// Set test config paths
+		setConfigPaths(TEST_CONFIG_DIR, TEST_CONFIG_FILE)
+
+		// Clean up test directory before each test
+		try {
+			await fs.rm(TEST_CONFIG_DIR, { recursive: true, force: true })
+		} catch {
+			// Ignore if doesn't exist
+		}
+	})
+
+	afterEach(async () => {
+		// Reset config paths
+		resetConfigPaths()
+
+		// Clean up test directory after each test
+		try {
+			await fs.rm(TEST_CONFIG_DIR, { recursive: true, force: true })
+		} catch {
+			// Ignore if doesn't exist
+		}
+	})
+
+	it("should create default config without validation when skipValidation is true", async () => {
+		// Ensure directory exists
+		await ensureConfigDir()
+
+		// Save default config with skipValidation=true (simulating 'kilocode config' command)
+		// This should succeed even though DEFAULT_CONFIG has empty tokens
+		await expect(saveConfig(DEFAULT_CONFIG, true)).resolves.not.toThrow()
+
+		// Verify file was created
+		const content = await fs.readFile(TEST_CONFIG_FILE, "utf-8")
+		const parsed = JSON.parse(content)
+		expect(parsed).toEqual(DEFAULT_CONFIG)
+	})
+
+	it("should fail to save default config when validation is enabled", async () => {
+		// Ensure directory exists
+		await ensureConfigDir()
+
+		// Save default config with skipValidation=false (default)
+		// This should fail because DEFAULT_CONFIG has empty tokens
+		await expect(saveConfig(DEFAULT_CONFIG, false)).rejects.toThrow(/Invalid config/)
+	})
+
+	it("should fail to save default config when skipValidation is not provided", async () => {
+		// Ensure directory exists
+		await ensureConfigDir()
+
+		// Save default config without skipValidation parameter (defaults to false)
+		// This should fail because DEFAULT_CONFIG has empty tokens
+		await expect(saveConfig(DEFAULT_CONFIG)).rejects.toThrow(/Invalid config/)
+	})
+})

+ 261 - 0
cli/src/__tests__/history.test.ts

@@ -0,0 +1,261 @@
+/**
+ * Tests for history persistence and navigation
+ */
+
+import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"
+import * as fs from "fs/promises"
+import * as path from "path"
+import * as os from "os"
+import {
+	loadHistory,
+	saveHistory,
+	addEntry,
+	clearHistory,
+	setHistoryPaths,
+	resetHistoryPaths,
+	type HistoryData,
+} from "../config/history.js"
+
+describe("History Persistence", () => {
+	let testDir: string
+	let testFile: string
+
+	beforeEach(async () => {
+		// Create temporary test directory
+		testDir = path.join(os.tmpdir(), `kilocode-test-${Date.now()}`)
+		testFile = path.join(testDir, "history.json")
+		await fs.mkdir(testDir, { recursive: true })
+
+		// Override history paths for testing
+		setHistoryPaths(testDir, testFile)
+	})
+
+	afterEach(async () => {
+		// Clean up test directory
+		try {
+			await fs.rm(testDir, { recursive: true, force: true })
+		} catch (error) {
+			// Ignore cleanup errors
+		}
+
+		// Reset history paths
+		resetHistoryPaths()
+	})
+
+	describe("loadHistory", () => {
+		it("should create default history file if it doesn't exist", async () => {
+			const data = await loadHistory()
+
+			expect(data.version).toBe("1.0.0")
+			expect(data.entries).toEqual([])
+			expect(data.maxSize).toBe(500)
+
+			// Verify file was created
+			const fileExists = await fs
+				.access(testFile)
+				.then(() => true)
+				.catch(() => false)
+			expect(fileExists).toBe(true)
+		})
+
+		it("should load existing history file", async () => {
+			const testData: HistoryData = {
+				version: "1.0.0",
+				entries: [
+					{ prompt: "test command 1", timestamp: Date.now() },
+					{ prompt: "test command 2", timestamp: Date.now() },
+				],
+				maxSize: 500,
+			}
+
+			await fs.writeFile(testFile, JSON.stringify(testData, null, 2))
+
+			const data = await loadHistory()
+
+			expect(data.entries).toHaveLength(2)
+			expect(data.entries[0]?.prompt).toBe("test command 1")
+			expect(data.entries[1]?.prompt).toBe("test command 2")
+		})
+
+		it("should return default history on invalid JSON", async () => {
+			await fs.writeFile(testFile, "invalid json")
+
+			const data = await loadHistory()
+
+			expect(data.version).toBe("1.0.0")
+			expect(data.entries).toEqual([])
+		})
+
+		it("should return default history on invalid structure", async () => {
+			await fs.writeFile(testFile, JSON.stringify({ invalid: "structure" }))
+
+			const data = await loadHistory()
+
+			expect(data.version).toBe("1.0.0")
+			expect(data.entries).toEqual([])
+		})
+	})
+
+	describe("saveHistory", () => {
+		it("should save history to file", async () => {
+			const testData: HistoryData = {
+				version: "1.0.0",
+				entries: [{ prompt: "test command", timestamp: Date.now() }],
+				maxSize: 500,
+			}
+
+			await saveHistory(testData)
+
+			const content = await fs.readFile(testFile, "utf-8")
+			const parsed = JSON.parse(content)
+
+			expect(parsed.entries).toHaveLength(1)
+			expect(parsed.entries[0].prompt).toBe("test command")
+		})
+
+		it("should trim entries to maxSize when saving", async () => {
+			const entries = Array.from({ length: 600 }, (_, i) => ({
+				prompt: `command ${i}`,
+				timestamp: Date.now(),
+			}))
+
+			const testData: HistoryData = {
+				version: "1.0.0",
+				entries,
+				maxSize: 500,
+			}
+
+			await saveHistory(testData)
+
+			const content = await fs.readFile(testFile, "utf-8")
+			const parsed = JSON.parse(content)
+
+			expect(parsed.entries).toHaveLength(500)
+			// Should keep the most recent 500
+			expect(parsed.entries[0].prompt).toBe("command 100")
+			expect(parsed.entries[499].prompt).toBe("command 599")
+		})
+	})
+
+	describe("addEntry", () => {
+		it("should add new entry to history", () => {
+			const data: HistoryData = {
+				version: "1.0.0",
+				entries: [],
+				maxSize: 500,
+			}
+
+			const newData = addEntry(data, "test command")
+
+			expect(newData.entries).toHaveLength(1)
+			expect(newData.entries[0]?.prompt).toBe("test command")
+			expect(newData.entries[0]?.timestamp).toBeDefined()
+		})
+
+		it("should skip empty commands", () => {
+			const data: HistoryData = {
+				version: "1.0.0",
+				entries: [],
+				maxSize: 500,
+			}
+
+			const newData = addEntry(data, "")
+
+			expect(newData.entries).toHaveLength(0)
+		})
+
+		it("should skip whitespace-only commands", () => {
+			const data: HistoryData = {
+				version: "1.0.0",
+				entries: [],
+				maxSize: 500,
+			}
+
+			const newData = addEntry(data, "   ")
+
+			expect(newData.entries).toHaveLength(0)
+		})
+
+		it("should skip consecutive duplicates", () => {
+			const data: HistoryData = {
+				version: "1.0.0",
+				entries: [{ prompt: "test command", timestamp: Date.now() }],
+				maxSize: 500,
+			}
+
+			const newData = addEntry(data, "test command")
+
+			expect(newData.entries).toHaveLength(1)
+		})
+
+		it("should allow non-consecutive duplicates", () => {
+			const data: HistoryData = {
+				version: "1.0.0",
+				entries: [
+					{ prompt: "command 1", timestamp: Date.now() },
+					{ prompt: "command 2", timestamp: Date.now() },
+				],
+				maxSize: 500,
+			}
+
+			const newData = addEntry(data, "command 1")
+
+			expect(newData.entries).toHaveLength(3)
+			expect(newData.entries[2]?.prompt).toBe("command 1")
+		})
+
+		it("should trim to maxSize when adding", () => {
+			const entries = Array.from({ length: 500 }, (_, i) => ({
+				prompt: `command ${i}`,
+				timestamp: Date.now(),
+			}))
+
+			const data: HistoryData = {
+				version: "1.0.0",
+				entries,
+				maxSize: 500,
+			}
+
+			const newData = addEntry(data, "new command")
+
+			expect(newData.entries).toHaveLength(500)
+			expect(newData.entries[0]?.prompt).toBe("command 1")
+			expect(newData.entries[499]?.prompt).toBe("new command")
+		})
+	})
+
+	describe("clearHistory", () => {
+		it("should clear all history entries", async () => {
+			const testData: HistoryData = {
+				version: "1.0.0",
+				entries: [
+					{ prompt: "command 1", timestamp: Date.now() },
+					{ prompt: "command 2", timestamp: Date.now() },
+				],
+				maxSize: 500,
+			}
+
+			await saveHistory(testData)
+			await clearHistory()
+
+			const data = await loadHistory()
+
+			expect(data.entries).toHaveLength(0)
+		})
+	})
+})
+
+describe("History Navigation", () => {
+	it("should navigate through history in reverse chronological order", () => {
+		const entries = [
+			{ prompt: "oldest", timestamp: 1 },
+			{ prompt: "middle", timestamp: 2 },
+			{ prompt: "newest", timestamp: 3 },
+		]
+
+		// When navigating up (to older), we should see: newest -> middle -> oldest
+		expect(entries[entries.length - 1]?.prompt).toBe("newest")
+		expect(entries[entries.length - 2]?.prompt).toBe("middle")
+		expect(entries[entries.length - 3]?.prompt).toBe("oldest")
+	})
+})

+ 5 - 0
cli/src/cli.ts

@@ -10,6 +10,7 @@ import { initializeServiceEffectAtom } from "./state/atoms/effects.js"
 import { loadConfigAtom, mappedExtensionStateAtom } from "./state/atoms/config.js"
 import { ciExitReasonAtom } from "./state/atoms/ci.js"
 import { requestRouterModelsAtom } from "./state/atoms/actions.js"
+import { loadHistoryAtom } from "./state/atoms/history.js"
 import { getTelemetryService, getIdentityManager } from "./services/telemetry/index.js"
 
 export interface CLIOptions {
@@ -107,6 +108,10 @@ export class CLI {
 			// Track successful extension initialization
 			telemetryService.trackExtensionInitialized(true)
 
+			// Load command history
+			await this.store.set(loadHistoryAtom)
+			logs.debug("Command history loaded", "CLI")
+
 			// Inject CLI configuration into ExtensionHost
 			await this.injectConfigurationToExtension()
 			logs.debug("CLI configuration injected into extension", "CLI")

+ 247 - 0
cli/src/commands/__tests__/profile.test.ts

@@ -0,0 +1,247 @@
+/**
+ * Tests for the /profile command
+ */
+
+import { describe, it, expect, vi, beforeEach } from "vitest"
+import { profileCommand } from "../profile.js"
+import type { CommandContext } from "../core/types.js"
+
+describe("/profile command", () => {
+	let mockContext: CommandContext
+	let addMessageMock: ReturnType<typeof vi.fn>
+
+	beforeEach(() => {
+		addMessageMock = vi.fn()
+
+		mockContext = {
+			input: "/profile",
+			args: [],
+			options: {},
+			sendMessage: vi.fn().mockResolvedValue(undefined),
+			addMessage: addMessageMock,
+			clearMessages: vi.fn(),
+			replaceMessages: vi.fn(),
+			clearTask: vi.fn().mockResolvedValue(undefined),
+			setMode: vi.fn(),
+			exit: vi.fn(),
+			routerModels: null,
+			currentProvider: {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			},
+			kilocodeDefaultModel: "test-model",
+			updateProviderModel: vi.fn().mockResolvedValue(undefined),
+			refreshRouterModels: vi.fn().mockResolvedValue(undefined),
+			updateProvider: vi.fn().mockResolvedValue(undefined),
+			profileData: null,
+			balanceData: null,
+			profileLoading: false,
+			balanceLoading: false,
+		}
+	})
+
+	describe("Command metadata", () => {
+		it("should have correct name", () => {
+			expect(profileCommand.name).toBe("profile")
+		})
+
+		it("should have correct aliases", () => {
+			expect(profileCommand.aliases).toEqual(["me", "whoami"])
+		})
+
+		it("should have correct description", () => {
+			expect(profileCommand.description).toBe("View your Kilocode profile information")
+		})
+
+		it("should have correct category", () => {
+			expect(profileCommand.category).toBe("settings")
+		})
+
+		it("should have correct priority", () => {
+			expect(profileCommand.priority).toBe(9)
+		})
+
+		it("should have correct usage", () => {
+			expect(profileCommand.usage).toBe("/profile")
+		})
+
+		it("should have examples", () => {
+			expect(profileCommand.examples).toContain("/profile")
+		})
+	})
+
+	describe("Authentication check", () => {
+		it("should show error when not using Kilocode provider", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "anthropic",
+			}
+
+			await profileCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledTimes(1)
+			const message = addMessageMock.mock.calls[0][0]
+			expect(message.type).toBe("error")
+			expect(message.content).toContain("Profile command requires Kilocode provider")
+		})
+
+		it("should show error when not authenticated", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+			}
+
+			await profileCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledTimes(1)
+			const message = addMessageMock.mock.calls[0][0]
+			expect(message.type).toBe("error")
+			expect(message.content).toContain("Not authenticated")
+		})
+	})
+
+	describe("Profile display", () => {
+		it("should show loading message when profile is loading", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileLoading = true
+
+			await profileCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledWith(
+				expect.objectContaining({
+					type: "system",
+					content: "Loading profile information...",
+				}),
+			)
+		})
+
+		it("should display profile information when loaded", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {
+					name: "John Doe",
+					email: "[email protected]",
+				},
+				organizations: [],
+			}
+			mockContext.balanceData = {
+				balance: 42.75,
+			}
+			mockContext.profileLoading = false
+			mockContext.balanceLoading = false
+
+			await profileCommand.handler(mockContext)
+
+			const profileMessage = addMessageMock.mock.calls.find((call: any) =>
+				call[0].content?.includes("Profile Information"),
+			)
+			expect(profileMessage).toBeDefined()
+			if (profileMessage) {
+				expect(profileMessage[0].content).toContain("John Doe")
+				expect(profileMessage[0].content).toContain("[email protected]")
+				expect(profileMessage[0].content).toContain("$42.75")
+			}
+		})
+
+		it("should show Personal when no organization is set", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {
+					name: "Test User",
+					email: "[email protected]",
+				},
+				organizations: [],
+			}
+			mockContext.balanceData = {
+				balance: 10.0,
+			}
+			mockContext.profileLoading = false
+			mockContext.balanceLoading = false
+
+			await profileCommand.handler(mockContext)
+
+			const profileMessage = addMessageMock.mock.calls.find((call: any) =>
+				call[0].content?.includes("Profile Information"),
+			)
+			expect(profileMessage).toBeDefined()
+			if (profileMessage) {
+				expect(profileMessage[0].content).toContain("Teams: Personal")
+			}
+		})
+
+		it("should show organization name when set", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+				kilocodeOrganizationId: "org-123",
+			}
+			mockContext.profileData = {
+				user: {
+					name: "Test User",
+					email: "[email protected]",
+				},
+				organizations: [
+					{
+						id: "org-123",
+						name: "Acme Corp",
+						role: "admin",
+					},
+				],
+			}
+			mockContext.balanceData = {
+				balance: 100.0,
+			}
+			mockContext.profileLoading = false
+			mockContext.balanceLoading = false
+
+			await profileCommand.handler(mockContext)
+
+			const profileMessage = addMessageMock.mock.calls.find((call: any) =>
+				call[0].content?.includes("Profile Information"),
+			)
+			expect(profileMessage).toBeDefined()
+			if (profileMessage) {
+				expect(profileMessage[0].content).toContain("Teams: Acme Corp (admin)")
+			}
+		})
+	})
+
+	describe("Error handling", () => {
+		it("should handle missing user data", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				organizations: [],
+			}
+			mockContext.balanceData = {
+				balance: 10.0,
+			}
+			mockContext.profileLoading = false
+			mockContext.balanceLoading = false
+
+			await profileCommand.handler(mockContext)
+
+			const errorMessage = addMessageMock.mock.calls.find(
+				(call: any) => call[0].type === "error" && call[0].content?.includes("No user data available"),
+			)
+			expect(errorMessage).toBeDefined()
+		})
+	})
+})

+ 400 - 0
cli/src/commands/__tests__/teams.test.ts

@@ -0,0 +1,400 @@
+/**
+ * Tests for the /teams command
+ */
+
+import { describe, it, expect, vi, beforeEach } from "vitest"
+import { teamsCommand } from "../teams.js"
+import type { CommandContext } from "../core/types.js"
+
+describe("/teams command", () => {
+	let mockContext: CommandContext
+	let addMessageMock: ReturnType<typeof vi.fn>
+	let updateProviderMock: ReturnType<typeof vi.fn>
+
+	beforeEach(() => {
+		addMessageMock = vi.fn()
+		updateProviderMock = vi.fn().mockResolvedValue(undefined)
+
+		mockContext = {
+			input: "/teams",
+			args: [],
+			options: {},
+			sendMessage: vi.fn().mockResolvedValue(undefined),
+			addMessage: addMessageMock,
+			clearMessages: vi.fn(),
+			replaceMessages: vi.fn(),
+			clearTask: vi.fn().mockResolvedValue(undefined),
+			setMode: vi.fn(),
+			exit: vi.fn(),
+			routerModels: null,
+			currentProvider: {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			},
+			kilocodeDefaultModel: "test-model",
+			updateProviderModel: vi.fn().mockResolvedValue(undefined),
+			refreshRouterModels: vi.fn().mockResolvedValue(undefined),
+			updateProvider: updateProviderMock,
+			profileData: null,
+			balanceData: null,
+			profileLoading: false,
+			balanceLoading: false,
+		}
+	})
+
+	describe("Command metadata", () => {
+		it("should have correct name", () => {
+			expect(teamsCommand.name).toBe("teams")
+		})
+
+		it("should have correct aliases", () => {
+			expect(teamsCommand.aliases).toEqual(["team", "org", "orgs"])
+		})
+
+		it("should have correct description", () => {
+			expect(teamsCommand.description).toBe("Manage team/organization selection")
+		})
+
+		it("should have correct category", () => {
+			expect(teamsCommand.category).toBe("settings")
+		})
+
+		it("should have correct priority", () => {
+			expect(teamsCommand.priority).toBe(10)
+		})
+
+		it("should have correct usage", () => {
+			expect(teamsCommand.usage).toBe("/teams [subcommand] [args]")
+		})
+
+		it("should have examples", () => {
+			expect(teamsCommand.examples).toContain("/teams")
+			expect(teamsCommand.examples).toContain("/teams select personal")
+		})
+	})
+
+	describe("Authentication check", () => {
+		it("should show error when not using Kilocode provider", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "anthropic",
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledTimes(1)
+			const message = addMessageMock.mock.calls[0][0]
+			expect(message.type).toBe("error")
+			expect(message.content).toContain("Teams command requires Kilocode provider")
+		})
+
+		it("should show error when not authenticated", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledTimes(1)
+			const message = addMessageMock.mock.calls[0][0]
+			expect(message.type).toBe("error")
+			expect(message.content).toContain("Not authenticated")
+		})
+	})
+
+	describe("List teams (no args)", () => {
+		it("should show loading message when profile is loading", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileLoading = true
+
+			await teamsCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledWith(
+				expect.objectContaining({
+					type: "system",
+					content: "Loading available teams...",
+				}),
+			)
+		})
+
+		it("should direct user to create a new organization when they don't have any", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {},
+				organizations: [],
+			}
+			mockContext.profileLoading = false
+
+			await teamsCommand.handler(mockContext)
+
+			const message = addMessageMock.mock.calls[0][0]
+			expect(message.type).toBe("system")
+			expect(message.content).toContain("https://app.kilocode.ai/get-started/teams")
+		})
+
+		it("should list all teams including organizations", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {},
+				organizations: [
+					{
+						id: "org-1",
+						name: "Team Alpha",
+						role: "admin",
+					},
+					{
+						id: "org-2",
+						name: "Team Beta",
+						role: "member",
+					},
+				],
+			}
+			mockContext.profileLoading = false
+
+			await teamsCommand.handler(mockContext)
+
+			const message = addMessageMock.mock.calls[0][0]
+			expect(message.content).toContain("Personal")
+			expect(message.content).toContain("team-alpha")
+			expect(message.content).toContain("team-beta")
+		})
+
+		it("should mark current organization with arrow", async () => {
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+				kilocodeOrganizationId: "org-1",
+			}
+			mockContext.profileData = {
+				user: {},
+				organizations: [
+					{
+						id: "org-1",
+						name: "Current Team",
+						role: "admin",
+					},
+				],
+			}
+			mockContext.profileLoading = false
+
+			await teamsCommand.handler(mockContext)
+
+			const message = addMessageMock.mock.calls[0][0]
+			expect(message.content).toContain("→ current-team (current)")
+		})
+	})
+
+	describe("Select team subcommand", () => {
+		it("should switch to personal account", async () => {
+			mockContext.args = ["select", "personal"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(updateProviderMock).toHaveBeenCalledWith("test-provider", {
+				kilocodeOrganizationId: undefined,
+			})
+
+			const successMessage = addMessageMock.mock.calls.find((call: any) =>
+				call[0].content?.includes("Switched to"),
+			)
+			expect(successMessage).toBeDefined()
+			if (successMessage) {
+				expect(successMessage[0].content).toContain("Personal")
+			}
+		})
+
+		it("should switch to organization by ID", async () => {
+			mockContext.args = ["select", "org-123"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {},
+				organizations: [
+					{
+						id: "org-123",
+						name: "Target Team",
+						role: "member",
+					},
+				],
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(updateProviderMock).toHaveBeenCalledWith("test-provider", {
+				kilocodeOrganizationId: "org-123",
+			})
+
+			const successMessage = addMessageMock.mock.calls.find((call: any) =>
+				call[0].content?.includes("Switched to team"),
+			)
+			expect(successMessage).toBeDefined()
+			if (successMessage) {
+				expect(successMessage[0].content).toContain("Target Team")
+			}
+		})
+
+		it("should switch to organization by normalized name", async () => {
+			mockContext.args = ["select", "kilo-code"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {},
+				organizations: [
+					{
+						id: "org-456",
+						name: "Kilo Code",
+						role: "admin",
+					},
+				],
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(updateProviderMock).toHaveBeenCalledWith("test-provider", {
+				kilocodeOrganizationId: "org-456",
+			})
+
+			const successMessage = addMessageMock.mock.calls.find((call: any) =>
+				call[0].content?.includes("Switched to team"),
+			)
+			expect(successMessage).toBeDefined()
+			if (successMessage) {
+				expect(successMessage[0].content).toContain("Kilo Code")
+			}
+		})
+
+		it("should normalize team names with spaces and special characters", async () => {
+			mockContext.args = ["select", "my-awesome-team"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {},
+				organizations: [
+					{
+						id: "org-789",
+						name: "My Awesome Team!",
+						role: "member",
+					},
+				],
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(updateProviderMock).toHaveBeenCalledWith("test-provider", {
+				kilocodeOrganizationId: "org-789",
+			})
+
+			const successMessage = addMessageMock.mock.calls.find((call: any) =>
+				call[0].content?.includes("Switched to team"),
+			)
+			expect(successMessage).toBeDefined()
+			if (successMessage) {
+				expect(successMessage[0].content).toContain("My Awesome Team!")
+			}
+		})
+
+		it("should show error for invalid team ID", async () => {
+			mockContext.args = ["select", "invalid-org"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = {
+				user: {},
+				organizations: [],
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			const errorMessage = addMessageMock.mock.calls.find(
+				(call: any) => call[0].type === "error" && call[0].content?.includes("not found"),
+			)
+			expect(errorMessage).toBeDefined()
+		})
+
+		it("should show error when team ID is missing", async () => {
+			mockContext.args = ["select"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledWith(
+				expect.objectContaining({
+					type: "error",
+					content: expect.stringContaining("Usage: /teams select"),
+				}),
+			)
+		})
+
+		it("should show error when profile data is not loaded", async () => {
+			mockContext.args = ["select", "org-123"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+			mockContext.profileData = null
+
+			await teamsCommand.handler(mockContext)
+
+			const errorMessage = addMessageMock.mock.calls.find(
+				(call: any) => call[0].type === "error" && call[0].content?.includes("Failed to switch team"),
+			)
+			expect(errorMessage).toBeDefined()
+		})
+	})
+
+	describe("Invalid subcommand", () => {
+		it("should show error for unknown subcommand", async () => {
+			mockContext.args = ["unknown"]
+			mockContext.currentProvider = {
+				id: "test-provider",
+				provider: "kilocode",
+				kilocodeToken: "test-token",
+			}
+
+			await teamsCommand.handler(mockContext)
+
+			expect(addMessageMock).toHaveBeenCalledWith(
+				expect.objectContaining({
+					type: "error",
+					content: expect.stringContaining("Unknown subcommand"),
+				}),
+			)
+		})
+	})
+})

+ 10 - 0
cli/src/commands/core/types.ts

@@ -4,6 +4,7 @@
 
 import type { RouterModels } from "../../types/messages.js"
 import type { ProviderConfig } from "../../config/types.js"
+import type { ProfileData, BalanceData } from "../../state/atoms/profile.js"
 
 export interface Command {
 	name: string
@@ -44,6 +45,13 @@ export interface CommandContext {
 	kilocodeDefaultModel: string
 	updateProviderModel: (modelId: string) => Promise<void>
 	refreshRouterModels: () => Promise<void>
+	// Provider update function for teams command
+	updateProvider: (providerId: string, updates: Partial<ProviderConfig>) => Promise<void>
+	// Profile data context
+	profileData: ProfileData | null
+	balanceData: BalanceData | null
+	profileLoading: boolean
+	balanceLoading: boolean
 }
 
 export type CommandHandler = (context: CommandContext) => Promise<void> | void
@@ -100,6 +108,8 @@ export interface ArgumentProviderContext {
 		routerModels: RouterModels | null
 		currentProvider: ProviderConfig | null
 		kilocodeDefaultModel: string
+		profileData: ProfileData | null
+		profileLoading: boolean
 		updateProviderModel: (modelId: string) => Promise<void>
 		refreshRouterModels: () => Promise<void>
 	}

+ 4 - 0
cli/src/commands/index.ts

@@ -12,6 +12,8 @@ import { newCommand } from "./new.js"
 import { exitCommand } from "./exit.js"
 import { modeCommand } from "./mode.js"
 import { modelCommand } from "./model.js"
+import { profileCommand } from "./profile.js"
+import { teamsCommand } from "./teams.js"
 
 /**
  * Initialize all commands
@@ -23,4 +25,6 @@ export function initializeCommands(): void {
 	commandRegistry.register(exitCommand)
 	commandRegistry.register(modeCommand)
 	commandRegistry.register(modelCommand)
+	commandRegistry.register(profileCommand)
+	commandRegistry.register(teamsCommand)
 }

+ 105 - 0
cli/src/commands/profile.ts

@@ -0,0 +1,105 @@
+/**
+ * /profile command - View user profile information
+ */
+
+import type { Command } from "./core/types.js"
+import type { UserOrganization } from "../state/atoms/profile.js"
+
+/**
+ * Show user profile information
+ */
+async function showProfile(context: any): Promise<void> {
+	const { currentProvider, addMessage, profileData, balanceData, profileLoading, balanceLoading } = context
+
+	// Check if user is authenticated with Kilocode
+	if (!currentProvider || currentProvider.provider !== "kilocode") {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: "Profile command requires Kilocode provider. Please configure Kilocode as your provider.",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	if (!currentProvider.kilocodeToken) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: "Not authenticated. Please configure your Kilocode token first.",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	// Check if still loading
+	if (profileLoading || balanceLoading) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "system",
+			content: "Loading profile information...",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	// Display profile information
+	const user = profileData.user
+
+	if (!user) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: "No user data available",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	// Format profile information
+	let content = "**Profile Information:**\n\n"
+
+	if (user.name) {
+		content += `Name: ${user.name}\n`
+	}
+
+	if (user.email) {
+		content += `Email: ${user.email}\n`
+	}
+
+	if (balanceData?.balance !== undefined && balanceData?.balance !== null) {
+		content += `Balance: $${balanceData.balance.toFixed(2)}\n`
+	}
+
+	// Show current organization if set
+	const currentOrgId = currentProvider.kilocodeOrganizationId
+	if (currentOrgId && profileData.organizations) {
+		const currentOrg = profileData.organizations.find((org: UserOrganization) => org.id === currentOrgId)
+		if (currentOrg) {
+			content += `Teams: ${currentOrg.name} (${currentOrg.role})\n`
+		}
+	} else {
+		content += `Teams: Personal\n`
+	}
+
+	addMessage({
+		id: Date.now().toString(),
+		type: "system",
+		content,
+		ts: Date.now(),
+	})
+}
+
+export const profileCommand: Command = {
+	name: "profile",
+	aliases: ["me", "whoami"],
+	description: "View your Kilocode profile information",
+	usage: "/profile",
+	examples: ["/profile"],
+	category: "settings",
+	priority: 9,
+	arguments: [],
+	handler: async (context) => {
+		await showProfile(context)
+	},
+}

+ 324 - 0
cli/src/commands/teams.ts

@@ -0,0 +1,324 @@
+/**
+ * /teams command - Manage team/organization selection
+ */
+
+import type { Command, ArgumentProviderContext, ArgumentSuggestion } from "./core/types.js"
+import type { UserOrganization } from "../state/atoms/profile.js"
+
+/**
+ * Normalize team name to lowercase with dashes
+ * Example: "Kilo Code" -> "kilo-code"
+ */
+function normalizeTeamName(name: string): string {
+	return name
+		.toLowerCase()
+		.trim()
+		.replace(/\s+/g, "-") // Replace spaces with dashes
+		.replace(/[^a-z0-9-]/g, "") // Remove special characters except dashes
+		.replace(/-+/g, "-") // Replace multiple dashes with single dash
+		.replace(/^-|-$/g, "") // Remove leading/trailing dashes
+}
+
+/**
+ * List all available teams
+ */
+async function listTeams(context: any): Promise<void> {
+	const { currentProvider, addMessage, profileData, profileLoading } = context
+
+	// Check if user is authenticated with Kilocode
+	if (!currentProvider || currentProvider.provider !== "kilocode") {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: "Teams command requires Kilocode provider. Please configure Kilocode as your provider.",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	if (!currentProvider.kilocodeToken) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: "Not authenticated. Please configure your Kilocode token first.",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	// Check if still loading
+	if (profileLoading) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "system",
+			content: "Loading available teams...",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	const organizations = profileData.organizations || []
+	const currentOrgId = currentProvider.kilocodeOrganizationId
+
+	if (organizations.length < 1) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "system",
+			content: `You're currently not a part of any Kilo Code teams. Go to https://app.kilocode.ai/get-started/teams to get started with Kilo Code for Teams!`,
+			ts: Date.now(),
+		})
+		return
+	}
+
+	let content = "**Available Teams:**\n\n"
+
+	// Add Personal option
+	const isPersonal = !currentOrgId
+	content += `${isPersonal ? "→ " : "  "}Personal${isPersonal ? " (current)" : ""}\n`
+
+	// Add organizations
+	for (const org of organizations) {
+		const isCurrent = org.id === currentOrgId
+		content += `${isCurrent ? "→ " : "  "}${normalizeTeamName(org.name)}${isCurrent ? " (current)" : ""}\n`
+	}
+	content += `\nUse \`/teams select ${normalizeTeamName(organizations[0].name)}\` select the ${organizations[0].name} profile\n`
+	content += `Use \`/teams select personal\` to switch to personal account\n`
+
+	addMessage({
+		id: Date.now().toString(),
+		type: "system",
+		content,
+		ts: Date.now(),
+	})
+}
+
+/**
+ * Select a team
+ */
+async function selectTeam(context: any, teamId: string): Promise<void> {
+	const { currentProvider, addMessage, updateProvider, profileData } = context
+
+	// Check if user is authenticated with Kilocode
+	if (!currentProvider || currentProvider.provider !== "kilocode") {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: "Teams command requires Kilocode provider. Please configure Kilocode as your provider.",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	if (!currentProvider.kilocodeToken) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: "Not authenticated. Please configure your Kilocode token first.",
+			ts: Date.now(),
+		})
+		return
+	}
+
+	try {
+		// Handle "personal" as special case
+		if (teamId.toLowerCase() === "personal") {
+			addMessage({
+				id: Date.now().toString(),
+				type: "system",
+				content: "✓ Switched to **Personal** account",
+				ts: Date.now(),
+			})
+
+			// Update provider configuration to remove organization ID
+			await updateProvider(currentProvider.id, {
+				kilocodeOrganizationId: undefined,
+			})
+
+			return
+		}
+
+		// Validate team ID if we have profile data
+		if (profileData?.organizations) {
+			// Try to find by ID first
+			let targetOrg = profileData.organizations.find((org: UserOrganization) => org.id === teamId)
+
+			// If not found by ID, try normalized name match
+			if (!targetOrg) {
+				const normalizedInput = normalizeTeamName(teamId)
+				targetOrg = profileData.organizations.find(
+					(org: UserOrganization) => normalizeTeamName(org.name) === normalizedInput,
+				)
+			}
+
+			if (!targetOrg) {
+				addMessage({
+					id: Date.now().toString(),
+					type: "error",
+					content: `Team "${teamId}" not found. Use \`/teams list\` to see available teams.`,
+					ts: Date.now(),
+				})
+				return
+			}
+
+			addMessage({
+				id: Date.now().toString(),
+				type: "system",
+				content: `✓ Switched to team: **${targetOrg.name}** (${targetOrg.role})`,
+				ts: Date.now(),
+			})
+
+			// Update provider configuration with new organization ID (use the actual org.id)
+			await updateProvider(currentProvider.id, {
+				kilocodeOrganizationId: targetOrg.id,
+			})
+		} else {
+			// No profile data loaded
+			addMessage({
+				id: Date.now().toString(),
+				type: "error",
+				content: `Failed to switch team`,
+				ts: Date.now(),
+			})
+		}
+	} catch (error) {
+		addMessage({
+			id: Date.now().toString(),
+			type: "error",
+			content: `Failed to switch team: ${error instanceof Error ? error.message : String(error)}`,
+			ts: Date.now(),
+		})
+	}
+}
+/**
+ * Autocomplete provider for team names
+ */
+async function teamAutocompleteProvider(context: ArgumentProviderContext): Promise<ArgumentSuggestion[]> {
+	// Check if commandContext is available
+	if (!context.commandContext) {
+		return []
+	}
+
+	const { currentProvider, profileData, profileLoading } = context.commandContext as any
+
+	// Check if user is authenticated with Kilocode
+	if (!currentProvider || currentProvider.provider !== "kilocode") {
+		return []
+	}
+
+	if (!currentProvider.kilocodeToken) {
+		return []
+	}
+
+	// If still loading, return loading state
+	if (profileLoading) {
+		return [
+			{
+				value: "loading",
+				title: "Loading teams...",
+				description: "Please wait",
+				matchScore: 1.0,
+				highlightedValue: "loading",
+				loading: true,
+			},
+		]
+	}
+
+	const organizations = profileData?.organizations || []
+	const suggestions: ArgumentSuggestion[] = []
+
+	// Add Personal option
+	suggestions.push({
+		value: "personal",
+		title: "Personal",
+		description: "Your personal account",
+		matchScore: 1.0,
+		highlightedValue: "personal",
+	})
+
+	// Add organizations
+	for (const org of organizations) {
+		const normalizedName = normalizeTeamName(org.name)
+		suggestions.push({
+			value: normalizedName,
+			title: org.name,
+			description: `${org.name} (${org.role})`,
+			matchScore: 1.0,
+			highlightedValue: normalizedName,
+		})
+	}
+
+	return suggestions
+}
+
+export const teamsCommand: Command = {
+	name: "teams",
+	aliases: ["team", "org", "orgs"],
+	description: "Manage team/organization selection",
+	usage: "/teams [subcommand] [args]",
+	examples: ["/teams", "/teams select personal", "/teams select kilo-code", "/teams select my-team"],
+	category: "settings",
+	priority: 10,
+	arguments: [
+		{
+			name: "subcommand",
+			description: "Subcommand: select",
+			required: false,
+			values: [{ value: "select", description: "Switch to a different team" }],
+		},
+		{
+			name: "team-name",
+			description:
+				"Team name in lowercase with dashes (e.g., 'kilo-code' for 'Kilo Code') or 'personal' (for select subcommand)",
+			required: false,
+			conditionalProviders: [
+				{
+					condition: (context) => {
+						const subcommand = context.getArgument("subcommand")
+						return subcommand === "select"
+					},
+					provider: teamAutocompleteProvider,
+				},
+			],
+		},
+	],
+	handler: async (context) => {
+		const { args } = context
+
+		// No arguments - show current team
+		if (args.length === 0) {
+			await listTeams(context)
+			return
+		}
+
+		const subcommand = args[0]?.toLowerCase()
+		if (!subcommand) {
+			await listTeams(context)
+			return
+		}
+
+		// Handle subcommands
+		switch (subcommand) {
+			case "select":
+				if (args.length < 2 || !args[1]) {
+					context.addMessage({
+						id: Date.now().toString(),
+						type: "error",
+						content:
+							"Usage: /teams select <team-id-or-name>\nUse 'personal' to switch to personal account.",
+						ts: Date.now(),
+					})
+					return
+				}
+				await selectTeam(context, args[1])
+				break
+
+			default:
+				context.addMessage({
+					id: Date.now().toString(),
+					type: "error",
+					content: `Unknown subcommand "${subcommand}". Available: list, select`,
+					ts: Date.now(),
+				})
+		}
+	},
+}

+ 2 - 55
cli/src/config/defaults.ts

@@ -45,7 +45,7 @@ export const DEFAULT_AUTO_APPROVAL: AutoApprovalConfig = {
 	},
 }
 
-export const DEFAULT_CONFIG: CLIConfig = {
+export const DEFAULT_CONFIG = {
 	version: "1.0.0",
 	mode: "code",
 	telemetry: true,
@@ -60,57 +60,4 @@ export const DEFAULT_CONFIG: CLIConfig = {
 	],
 	autoApproval: DEFAULT_AUTO_APPROVAL,
 	theme: "dark",
-}
-
-export function createDefaultProvider(provider: string): any {
-	switch (provider) {
-		case "kilocode":
-			return {
-				id: "kilocode-default",
-				provider: "kilocode",
-				kilocodeToken: "",
-				kilocodeModel: "anthropic/claude-sonnet-4",
-			}
-		case "anthropic":
-			return {
-				id: "anthropic-default",
-				provider: "anthropic",
-				apiKey: "",
-				apiModelId: "claude-3-5-sonnet-20241022",
-			}
-		case "openai-native":
-			return {
-				id: "openai-default",
-				provider: "openai-native",
-				openAiNativeApiKey: "",
-				apiModelId: "gpt-4o",
-			}
-		case "openrouter":
-			return {
-				id: "openrouter-default",
-				provider: "openrouter",
-				openRouterApiKey: "",
-				openRouterModelId: "anthropic/claude-3-5-sonnet",
-			}
-		case "ollama":
-			return {
-				id: "ollama-default",
-				provider: "ollama",
-				ollamaBaseUrl: "http://localhost:11434",
-				ollamaModelId: "llama3.2",
-			}
-		case "openai":
-			return {
-				id: "openai-default",
-				provider: "openai",
-				openAiApiKey: "",
-				openAiBaseUrl: "",
-				apiModelId: "gpt-4o",
-			}
-		default:
-			return {
-				id: `${provider}-default`,
-				provider,
-			}
-	}
-}
+} satisfies CLIConfig

+ 198 - 0
cli/src/config/history.ts

@@ -0,0 +1,198 @@
+/**
+ * History persistence module
+ * Manages command history storage and retrieval
+ * Follows the same pattern as config persistence
+ */
+
+import * as fs from "fs/promises"
+import * as path from "path"
+import { homedir } from "os"
+import { logs } from "../services/logs.js"
+
+// ============================================================================
+// Types
+// ============================================================================
+
+export interface HistoryEntry {
+	prompt: string
+	timestamp: number
+}
+
+export interface HistoryData {
+	version: "1.0.0"
+	maxSize: number
+	entries: HistoryEntry[]
+}
+
+// ============================================================================
+// Constants
+// ============================================================================
+
+export const HISTORY_DIR = path.join(homedir(), ".kilocode", "cli")
+export const HISTORY_FILE = path.join(HISTORY_DIR, "history.json")
+export const DEFAULT_MAX_SIZE = 500
+
+// Allow overriding paths for testing
+let historyDir = HISTORY_DIR
+let historyFile = HISTORY_FILE
+
+export function setHistoryPaths(dir: string, file: string): void {
+	historyDir = dir
+	historyFile = file
+}
+
+export function resetHistoryPaths(): void {
+	historyDir = HISTORY_DIR
+	historyFile = HISTORY_FILE
+}
+
+// ============================================================================
+// Default History Data
+// ============================================================================
+
+const DEFAULT_HISTORY: HistoryData = {
+	version: "1.0.0",
+	entries: [],
+	maxSize: DEFAULT_MAX_SIZE,
+}
+
+// ============================================================================
+// File Operations
+// ============================================================================
+
+/**
+ * Ensure history directory exists
+ */
+export async function ensureHistoryDir(): Promise<void> {
+	try {
+		await fs.mkdir(historyDir, { recursive: true })
+	} catch (error) {
+		logs.error("Failed to create history directory", "HistoryPersistence", { error })
+		throw error
+	}
+}
+
+/**
+ * Check if history file exists
+ */
+export async function historyExists(): Promise<boolean> {
+	try {
+		await fs.access(historyFile)
+		return true
+	} catch {
+		return false
+	}
+}
+
+/**
+ * Load history from disk
+ * Returns default history if file doesn't exist or is invalid
+ */
+export async function loadHistory(): Promise<HistoryData> {
+	try {
+		await ensureHistoryDir()
+
+		// Check if history file exists
+		const exists = await historyExists()
+		if (!exists) {
+			// Create default history file
+			await fs.writeFile(historyFile, JSON.stringify(DEFAULT_HISTORY, null, 2))
+			return DEFAULT_HISTORY
+		}
+
+		// Read and parse history
+		const content = await fs.readFile(historyFile, "utf-8")
+		const data = JSON.parse(content) as HistoryData
+
+		// Validate structure
+		if (!data.version || !Array.isArray(data.entries)) {
+			logs.warn("Invalid history file structure, using defaults", "HistoryPersistence")
+			return DEFAULT_HISTORY
+		}
+
+		// Ensure maxSize is set
+		if (!data.maxSize) {
+			data.maxSize = DEFAULT_MAX_SIZE
+		}
+
+		return data
+	} catch (error) {
+		logs.error("Failed to load history", "HistoryPersistence", { error })
+		// Return default history on error instead of throwing
+		return DEFAULT_HISTORY
+	}
+}
+
+/**
+ * Save history to disk
+ */
+export async function saveHistory(data: HistoryData): Promise<void> {
+	try {
+		// Ensure history directory exists
+		await ensureHistoryDir()
+
+		// Ensure entries don't exceed maxSize
+		if (data.entries.length > data.maxSize) {
+			data.entries = data.entries.slice(-data.maxSize)
+		}
+
+		// Write history with pretty formatting
+		const jsonContent = JSON.stringify(data, null, 2)
+		await fs.writeFile(historyFile, jsonContent)
+	} catch (error) {
+		logs.error("Failed to save history", "HistoryPersistence", { error })
+		throw error
+	}
+}
+
+/**
+ * Add entry to history
+ * Avoids consecutive duplicates
+ */
+export function addEntry(data: HistoryData, prompt: string): HistoryData {
+	// Skip empty prompts
+	if (!prompt.trim()) {
+		return data
+	}
+
+	// Check if this is a consecutive duplicate
+	const lastEntry = data.entries[data.entries.length - 1]
+	if (lastEntry && lastEntry.prompt === prompt) {
+		return data
+	}
+
+	// Add new entry
+	const newEntry: HistoryEntry = {
+		prompt,
+		timestamp: Date.now(),
+	}
+
+	const newEntries = [...data.entries, newEntry]
+
+	// Trim to maxSize if needed
+	const trimmedEntries = newEntries.length > data.maxSize ? newEntries.slice(-data.maxSize) : newEntries
+
+	return {
+		...data,
+		entries: trimmedEntries,
+	}
+}
+
+/**
+ * Clear all history
+ */
+export async function clearHistory(): Promise<void> {
+	try {
+		await saveHistory(DEFAULT_HISTORY)
+	} catch (error) {
+		logs.error("Failed to clear history", "HistoryPersistence", { error })
+		throw error
+	}
+}
+
+/**
+ * Get history file path
+ */
+export function getHistoryPath(): string {
+	return historyFile
+}

+ 73 - 0
cli/src/config/openConfig.ts

@@ -0,0 +1,73 @@
+import { spawn } from "child_process"
+import { platform } from "os"
+import { ensureConfigDir, configExists, saveConfig, DEFAULT_CONFIG, getConfigPath } from "."
+
+export default async function openConfigFile() {
+	try {
+		// Ensure config directory exists
+		await ensureConfigDir()
+
+		// Check if config file exists, if not create it with defaults
+		const exists = await configExists()
+		if (!exists) {
+			console.log("Config file not found. Creating default configuration...")
+			// Skip validation when creating default config since tokens may be empty
+			await saveConfig(DEFAULT_CONFIG, true)
+			console.log("Default configuration created.")
+		}
+
+		// Get the config file path
+		const configPath = await getConfigPath()
+		console.log(`Opening config file: ${configPath}`)
+
+		// Determine the editor command based on platform and environment
+		const editor = process.env.EDITOR || process.env.VISUAL
+		let editorCommand: string
+		let editorArgs: string[]
+
+		if (editor) {
+			// Use user's preferred editor from environment variable
+			editorCommand = editor
+			editorArgs = [configPath]
+		} else {
+			// Use platform-specific default
+			const currentPlatform = platform()
+			switch (currentPlatform) {
+				case "darwin": // macOS
+					editorCommand = "open"
+					editorArgs = ["-t", configPath] // -t opens in default text editor
+					break
+				case "win32": // Windows
+					editorCommand = "cmd"
+					editorArgs = ["/c", "start", "", configPath]
+					break
+				default: // Linux and others
+					editorCommand = "xdg-open"
+					editorArgs = [configPath]
+					break
+			}
+		}
+
+		// Spawn the editor process
+		const editorProcess = spawn(editorCommand, editorArgs, {
+			stdio: "inherit",
+		})
+
+		editorProcess.on("error", (error) => {
+			console.error(`Failed to open editor: ${error.message}`)
+			console.error(`Tried to run: ${editorCommand} ${editorArgs.join(" ")}`)
+			console.error(`\nYou can manually edit the config file at: ${configPath}`)
+			process.exit(1)
+		})
+
+		editorProcess.on("exit", (code) => {
+			if (code !== 0 && code !== null) {
+				console.error(`Editor exited with code ${code}`)
+				console.error(`Config file location: ${configPath}`)
+			}
+		})
+	} catch (error) {
+		console.error("Error managing config file:", error instanceof Error ? error.message : String(error))
+		process.exit(1)
+	}
+}

+ 8 - 9
cli/src/config/persistence.ts

@@ -116,10 +116,7 @@ export async function loadConfig(): Promise<ConfigLoadResult> {
 	try {
 		await ensureConfigDir()
 
-		// Check if config file exists
-		try {
-			await fs.access(configFile)
-		} catch {
+		if (!(await configExists())) {
 			// File doesn't exist, write default config directly without validation
 			// (DEFAULT_CONFIG may have empty credentials which is ok for initial setup)
 			await fs.writeFile(configFile, JSON.stringify(DEFAULT_CONFIG, null, 2))
@@ -166,14 +163,16 @@ export async function loadConfig(): Promise<ConfigLoadResult> {
 	}
 }
 
-export async function saveConfig(config: CLIConfig): Promise<void> {
+export async function saveConfig(config: CLIConfig, skipValidation: boolean = false): Promise<void> {
 	try {
 		await ensureConfigDir()
 
-		// Validate before saving
-		const validation = await validateConfig(config)
-		if (!validation.valid) {
-			throw new Error(`Invalid config: ${validation.errors?.join(", ")}`)
+		// Validate before saving (unless explicitly skipped for initial config creation)
+		if (!skipValidation) {
+			const validation = await validateConfig(config)
+			if (!validation.valid) {
+				throw new Error(`Invalid config: ${validation.errors?.join(", ")}`)
+			}
 		}
 
 		// Write config with pretty formatting

+ 1 - 0
cli/src/host/ExtensionHost.ts

@@ -501,6 +501,7 @@ export class ExtensionHost extends EventEmitter {
 			logs.info("Calling extension activate function...", "ExtensionHost")
 
 			// Call the extension's activate function with our mocked context
+			// Use safeExecute to catch and handle any errors without crashing the CLI
 			this.extensionAPI = await this.safeExecute(
 				async () => await this.extensionModule.activate(this.vscodeAPI.context),
 				"extension.activate",

+ 218 - 1
cli/src/host/VSCode.ts

@@ -87,6 +87,11 @@ export enum TextEditorRevealType {
 	AtTop = 3,
 }
 
+export enum StatusBarAlignment {
+	Left = 1,
+	Right = 2,
+}
+
 export enum DiagnosticSeverity {
 	Error = 0,
 	Warning = 1,
@@ -456,6 +461,82 @@ export class ThemeColor {
 	constructor(public id: string) {}
 }
 
+// Theme Icon mock
+export class ThemeIcon {
+	constructor(
+		public id: string,
+		public color?: ThemeColor,
+	) {}
+}
+
+// Cancellation Token mock
+export interface CancellationToken {
+	isCancellationRequested: boolean
+	onCancellationRequested: (listener: (e: any) => any) => Disposable
+}
+
+export class CancellationTokenSource {
+	private _token: CancellationToken
+	private _isCancelled = false
+	private _onCancellationRequestedEmitter = new EventEmitter<any>()
+
+	constructor() {
+		this._token = {
+			isCancellationRequested: false,
+			onCancellationRequested: this._onCancellationRequestedEmitter.event,
+		}
+	}
+
+	get token(): CancellationToken {
+		return this._token
+	}
+
+	cancel(): void {
+		if (!this._isCancelled) {
+			this._isCancelled = true
+			;(this._token as any).isCancellationRequested = true
+			this._onCancellationRequestedEmitter.fire(undefined)
+		}
+	}
+
+	dispose(): void {
+		this.cancel()
+		this._onCancellationRequestedEmitter.dispose()
+	}
+}
+
+// CodeLens mock
+export class CodeLens {
+	public range: Range
+	public command?: { command: string; title: string; arguments?: any[] } | undefined
+	public isResolved: boolean = false
+
+	constructor(range: Range, command?: { command: string; title: string; arguments?: any[] } | undefined) {
+		this.range = range
+		this.command = command
+	}
+}
+
+// Language Model API mocks (for VSCode LM API)
+export class LanguageModelTextPart {
+	constructor(public value: string) {}
+}
+
+export class LanguageModelToolCallPart {
+	constructor(
+		public callId: string,
+		public name: string,
+		public input: any,
+	) {}
+}
+
+export class LanguageModelToolResultPart {
+	constructor(
+		public callId: string,
+		public content: any[],
+	) {}
+}
+
 // Decoration Range Behavior mock
 export enum DecorationRangeBehavior {
 	OpenOpen = 0,
@@ -464,7 +545,7 @@ export enum DecorationRangeBehavior {
 	ClosedOpen = 3,
 }
 
-// Override Behavior mock
+// Overview Ruler Lane mock
 export enum OverviewRulerLane {
 	Left = 1,
 	Center = 2,
@@ -1230,6 +1311,73 @@ export class TextEditorDecorationType implements Disposable {
 	}
 }
 
+// StatusBarItem mock
+export class StatusBarItem implements Disposable {
+	private _text: string = ""
+	private _tooltip: string | undefined
+	private _command: string | undefined
+	private _color: string | undefined
+	private _backgroundColor: string | undefined
+	private _isVisible: boolean = false
+
+	constructor(
+		public readonly alignment: StatusBarAlignment,
+		public readonly priority?: number,
+	) {}
+
+	get text(): string {
+		return this._text
+	}
+
+	set text(value: string) {
+		this._text = value
+	}
+
+	get tooltip(): string | undefined {
+		return this._tooltip
+	}
+
+	set tooltip(value: string | undefined) {
+		this._tooltip = value
+	}
+
+	get command(): string | undefined {
+		return this._command
+	}
+
+	set command(value: string | undefined) {
+		this._command = value
+	}
+
+	get color(): string | undefined {
+		return this._color
+	}
+
+	set color(value: string | undefined) {
+		this._color = value
+	}
+
+	get backgroundColor(): string | undefined {
+		return this._backgroundColor
+	}
+
+	set backgroundColor(value: string | undefined) {
+		this._backgroundColor = value
+	}
+
+	show(): void {
+		this._isVisible = true
+	}
+
+	hide(): void {
+		this._isVisible = false
+	}
+
+	dispose(): void {
+		this._isVisible = false
+	}
+}
+
 // Tab and TabGroup interfaces for VSCode API
 export interface Tab {
 	input: TabInputText | any
@@ -1301,10 +1449,67 @@ export class WindowAPI {
 		return new OutputChannel(name)
 	}
 
+	createStatusBarItem(alignment?: StatusBarAlignment, priority?: number): StatusBarItem
+	createStatusBarItem(id?: string, alignment?: StatusBarAlignment, priority?: number): StatusBarItem
+	createStatusBarItem(
+		idOrAlignment?: string | StatusBarAlignment,
+		alignmentOrPriority?: StatusBarAlignment | number,
+		priority?: number,
+	): StatusBarItem {
+		// Handle overloaded signatures
+		let actualAlignment: StatusBarAlignment
+		let actualPriority: number | undefined
+
+		if (typeof idOrAlignment === "string") {
+			// Called with id, alignment, priority
+			actualAlignment = (alignmentOrPriority as StatusBarAlignment) ?? StatusBarAlignment.Left
+			actualPriority = priority
+		} else {
+			// Called with alignment, priority
+			actualAlignment = (idOrAlignment as StatusBarAlignment) ?? StatusBarAlignment.Left
+			actualPriority = alignmentOrPriority as number | undefined
+		}
+
+		return new StatusBarItem(actualAlignment, actualPriority)
+	}
+
 	createTextEditorDecorationType(_options: any): TextEditorDecorationType {
 		return new TextEditorDecorationType(`decoration-${Date.now()}`)
 	}
 
+	createTerminal(options?: {
+		name?: string
+		shellPath?: string
+		shellArgs?: string[]
+		cwd?: string
+		env?: { [key: string]: string | null | undefined }
+		iconPath?: ThemeIcon
+		hideFromUser?: boolean
+		message?: string
+		strictEnv?: boolean
+	}): any {
+		// Return a mock terminal object
+		return {
+			name: options?.name || "Terminal",
+			processId: Promise.resolve(undefined),
+			creationOptions: options || {},
+			exitStatus: undefined,
+			state: { isInteractedWith: false },
+			sendText: (text: string, _addNewLine?: boolean) => {
+				logs.debug(`Terminal sendText: ${text}`, "VSCode.Terminal")
+			},
+			show: (_preserveFocus?: boolean) => {
+				logs.debug("Terminal show called", "VSCode.Terminal")
+			},
+			hide: () => {
+				logs.debug("Terminal hide called", "VSCode.Terminal")
+			},
+			dispose: () => {
+				logs.debug("Terminal disposed", "VSCode.Terminal")
+			},
+		}
+	}
+
 	showInformationMessage(message: string, ..._items: string[]): Thenable<string | undefined> {
 		logs.info(message, "VSCode.Window")
 		return Promise.resolve(undefined)
@@ -1717,6 +1922,7 @@ export function createVSCodeAPIMock(extensionRootPath: string, workspacePath: st
 		ConfigurationTarget,
 		ViewColumn,
 		TextEditorRevealType,
+		StatusBarAlignment,
 		DiagnosticSeverity,
 		DiagnosticTag,
 		Position,
@@ -1732,8 +1938,19 @@ export function createVSCodeAPIMock(extensionRootPath: string, workspacePath: st
 		ExtensionMode,
 		CodeActionKind,
 		ThemeColor,
+		ThemeIcon,
 		DecorationRangeBehavior,
 		OverviewRulerLane,
+		StatusBarItem,
+		CancellationToken: class CancellationTokenClass implements CancellationToken {
+			isCancellationRequested = false
+			onCancellationRequested = (_listener: (e: any) => any) => ({ dispose: () => {} })
+		},
+		CancellationTokenSource,
+		CodeLens,
+		LanguageModelTextPart,
+		LanguageModelToolCallPart,
+		LanguageModelToolResultPart,
 		ExtensionContext,
 		FileType,
 		FileSystemError,

+ 17 - 70
cli/src/index.ts

@@ -6,14 +6,13 @@ loadEnvFile()
 
 import { Command } from "commander"
 import { existsSync } from "fs"
-import { spawn } from "child_process"
-import { platform } from "os"
 import { CLI } from "./cli.js"
 import { DEFAULT_MODES } from "./constants/modes/defaults.js"
-import { configExists, saveConfig, getConfigPath, ensureConfigDir } from "./config/persistence.js"
-import { DEFAULT_CONFIG } from "./config/defaults.js"
 import { getTelemetryService } from "./services/telemetry/index.js"
 import { Package } from "./constants/package.js"
+import openConfigFile from "./config/openConfig.js"
+import authWizard from "./utils/authWizard.js"
+import { configExists } from "./config/persistence.js"
 
 const program = new Command()
 let cli: CLI | null = null
@@ -83,6 +82,12 @@ program
 			getTelemetryService().trackCIModeStarted(finalPrompt.length, options.timeout)
 		}
 
+		if (!(await configExists())) {
+			console.info("Welcome to the Kilo Code CLI! 🎉\n")
+			console.info("To get you started, please fill out these following questions.")
+			await authWizard()
+		}
+
 		cli = new CLI({
 			mode: options.mode,
 			workspace: options.workspace,
@@ -94,77 +99,19 @@ program
 		await cli.dispose()
 	})
 
+program
+	.command("auth")
+	.description("Manage authentication for the Kilo Code CLI")
+	.action(async () => {
+		await authWizard()
+	})
+
 // Config command - opens the config file in the default editor
 program
 	.command("config")
 	.description("Open the configuration file in your default editor")
 	.action(async () => {
-		try {
-			// Ensure config directory exists
-			await ensureConfigDir()
-
-			// Check if config file exists, if not create it with defaults
-			const exists = await configExists()
-			if (!exists) {
-				console.log("Config file not found. Creating default configuration...")
-				await saveConfig(DEFAULT_CONFIG)
-				console.log("Default configuration created.")
-			}
-
-			// Get the config file path
-			const configPath = await getConfigPath()
-			console.log(`Opening config file: ${configPath}`)
-
-			// Determine the editor command based on platform and environment
-			const editor = process.env.EDITOR || process.env.VISUAL
-			let editorCommand: string
-			let editorArgs: string[]
-
-			if (editor) {
-				// Use user's preferred editor from environment variable
-				editorCommand = editor
-				editorArgs = [configPath]
-			} else {
-				// Use platform-specific default
-				const currentPlatform = platform()
-				switch (currentPlatform) {
-					case "darwin": // macOS
-						editorCommand = "open"
-						editorArgs = ["-t", configPath] // -t opens in default text editor
-						break
-					case "win32": // Windows
-						editorCommand = "cmd"
-						editorArgs = ["/c", "start", "", configPath]
-						break
-					default: // Linux and others
-						editorCommand = "xdg-open"
-						editorArgs = [configPath]
-						break
-				}
-			}
-
-			// Spawn the editor process
-			const editorProcess = spawn(editorCommand, editorArgs, {
-				stdio: "inherit",
-			})
-
-			editorProcess.on("error", (error) => {
-				console.error(`Failed to open editor: ${error.message}`)
-				console.error(`Tried to run: ${editorCommand} ${editorArgs.join(" ")}`)
-				console.error(`\nYou can manually edit the config file at: ${configPath}`)
-				process.exit(1)
-			})
-
-			editorProcess.on("exit", (code) => {
-				if (code !== 0 && code !== null) {
-					console.error(`Editor exited with code ${code}`)
-					console.error(`Config file location: ${configPath}`)
-				}
-			})
-		} catch (error) {
-			console.error("Error managing config file:", error instanceof Error ? error.message : String(error))
-			process.exit(1)
-		}
+		await openConfigFile()
 	})
 
 // Handle process termination signals

+ 100 - 0
cli/src/services/__tests__/approvalDecision.test.ts

@@ -297,6 +297,106 @@ describe("approvalDecision", () => {
 				const decision = getApprovalDecision(message, config, false)
 				expect(decision.action).toBe("auto-approve")
 			})
+
+			describe("hierarchical command matching", () => {
+				it("should match base command pattern", () => {
+					const message = createMessage("command", JSON.stringify({ command: "git status --short" }))
+					const config = {
+						...createBaseConfig(),
+						execute: {
+							enabled: true,
+							allowed: ["git"],
+							denied: [],
+						},
+					}
+					const decision = getApprovalDecision(message, config, false)
+					expect(decision.action).toBe("auto-approve")
+				})
+
+				it("should match command with subcommand pattern", () => {
+					const message = createMessage("command", JSON.stringify({ command: "git status --short --branch" }))
+					const config = {
+						...createBaseConfig(),
+						execute: {
+							enabled: true,
+							allowed: ["git status"],
+							denied: [],
+						},
+					}
+					const decision = getApprovalDecision(message, config, false)
+					expect(decision.action).toBe("auto-approve")
+				})
+
+				it("should match exact command pattern", () => {
+					const message = createMessage("command", JSON.stringify({ command: "git status --short" }))
+					const config = {
+						...createBaseConfig(),
+						execute: {
+							enabled: true,
+							allowed: ["git status --short"],
+							denied: [],
+						},
+					}
+					const decision = getApprovalDecision(message, config, false)
+					expect(decision.action).toBe("auto-approve")
+				})
+
+				it("should not match partial word patterns", () => {
+					const message = createMessage("command", JSON.stringify({ command: "gitignore" }))
+					const config = {
+						...createBaseConfig(),
+						execute: {
+							enabled: true,
+							allowed: ["git"],
+							denied: [],
+						},
+					}
+					const decision = getApprovalDecision(message, config, false)
+					expect(decision.action).toBe("manual")
+				})
+
+				it("should handle commands with multiple spaces", () => {
+					const message = createMessage("command", JSON.stringify({ command: "npm  install  --save" }))
+					const config = {
+						...createBaseConfig(),
+						execute: {
+							enabled: true,
+							allowed: ["npm"],
+							denied: [],
+						},
+					}
+					const decision = getApprovalDecision(message, config, false)
+					expect(decision.action).toBe("auto-approve")
+				})
+
+				it("should handle commands with tabs", () => {
+					const message = createMessage("command", JSON.stringify({ command: "git\tstatus" }))
+					const config = {
+						...createBaseConfig(),
+						execute: {
+							enabled: true,
+							allowed: ["git"],
+							denied: [],
+						},
+					}
+					const decision = getApprovalDecision(message, config, false)
+					expect(decision.action).toBe("auto-approve")
+				})
+
+				it("should respect denied patterns over allowed patterns", () => {
+					const message = createMessage("command", JSON.stringify({ command: "git push --force" }))
+					const config = {
+						...createBaseConfig(),
+						execute: {
+							enabled: true,
+							allowed: ["git"],
+							denied: ["git push --force"],
+						},
+					}
+					const decision = getApprovalDecision(message, config, false)
+					expect(decision.action).toBe("manual")
+				})
+			})
 		})
 
 		describe("followup questions", () => {

+ 38 - 11
cli/src/services/approvalDecision.ts

@@ -27,16 +27,34 @@ export interface ApprovalDecision {
 
 /**
  * Helper function to check if a command matches allowed/denied patterns
+ * Supports hierarchical matching:
+ * - "git" matches "git status", "git commit", etc.
+ * - "git status" matches "git status --short", "git status -v", etc.
+ * - Exact match: "git status --short" only matches "git status --short"
  */
 function matchesCommandPattern(command: string, patterns: string[]): boolean {
 	if (patterns.length === 0) return false
 
+	const normalizedCommand = command.trim()
+
 	return patterns.some((pattern) => {
-		// Simple pattern matching - can be enhanced with regex if needed
-		if (pattern === "*") return true
-		if (pattern === command) return true
-		// Check if command starts with pattern (for partial matches like "npm")
-		if (command.startsWith(pattern)) return true
+		const normalizedPattern = pattern.trim()
+
+		// Wildcard matches everything
+		if (normalizedPattern === "*") return true
+
+		// Exact match
+		if (normalizedPattern === normalizedCommand) return true
+
+		// Hierarchical match: pattern is a prefix of the command
+		// Must match word boundaries to avoid false positives
+		// e.g., "git" matches "git status" but not "gitignore"
+		if (normalizedCommand.startsWith(normalizedPattern)) {
+			// Check if it's followed by whitespace or end of string
+			const nextChar = normalizedCommand[normalizedPattern.length]
+			return nextChar === undefined || nextChar === " " || nextChar === "\t"
+		}
+
 		return false
 	})
 }
@@ -161,25 +179,27 @@ function getCommandApprovalDecision(
 		return isCIMode ? { action: "auto-reject", message: CI_MODE_MESSAGES.AUTO_REJECTED } : { action: "manual" }
 	}
 
-	// Parse command from message - it's stored as JSON with a "command" field
+	// Parse command from message
+	// It can be either JSON with a "command" field or plain text
 	let command = ""
 	try {
 		const commandData = JSON.parse(message.text || "{}")
-		command = commandData.command || message.text || ""
+		command = commandData.command || ""
 	} catch {
-		// If parsing fails, use text directly
+		// If parsing fails, use text directly as the command
 		command = message.text || ""
 	}
 
 	const allowedCommands = config.execute?.allowed ?? []
 	const deniedCommands = config.execute?.denied ?? []
 
-	logs.debug("Checking command approval", "approvalDecision", {
+	logs.info("Checking command approval", "approvalDecision", {
 		command,
 		rawText: message.text,
 		allowedCommands,
 		deniedCommands,
 		executeEnabled: config.execute?.enabled,
+		configExecute: config.execute,
 	})
 
 	// Check denied list first (takes precedence)
@@ -196,11 +216,18 @@ function getCommandApprovalDecision(
 
 	// Check if command matches allowed patterns
 	if (matchesCommandPattern(command, allowedCommands)) {
-		logs.debug("Command matches allowed pattern - auto-approving", "approvalDecision", { command })
+		logs.info("Command matches allowed pattern - auto-approving", "approvalDecision", {
+			command,
+			matchedAgainst: allowedCommands,
+		})
 		return { action: "auto-approve" }
 	}
 
-	logs.debug("Command does not match any allowed pattern", "approvalDecision", { command, allowedCommands })
+	logs.info("Command does not match any allowed pattern", "approvalDecision", {
+		command,
+		allowedCommands,
+		deniedCommands,
+	})
 	return isCIMode ? { action: "auto-reject", message: CI_MODE_MESSAGES.AUTO_REJECTED } : { action: "manual" }
 }
 

+ 2 - 0
cli/src/services/autocomplete.ts

@@ -442,6 +442,8 @@ function createProviderContext(
 			routerModels: commandContext.routerModels || null,
 			currentProvider: commandContext.currentProvider || null,
 			kilocodeDefaultModel: commandContext.kilocodeDefaultModel || "",
+			profileData: commandContext.profileData || null,
+			profileLoading: commandContext.profileLoading || false,
 			updateProviderModel: commandContext.updateProviderModel,
 			refreshRouterModels: commandContext.refreshRouterModels,
 		}

+ 50 - 1
cli/src/services/logs.ts

@@ -67,17 +67,66 @@ export class LogsService {
 		return LogsService.instance
 	}
 
+	/**
+	 * Serialize an error object to a plain object with all relevant properties
+	 */
+	private serializeError(error: any): any {
+		if (error instanceof Error) {
+			return {
+				message: error.message,
+				name: error.name,
+				stack: error.stack,
+				// Include any additional enumerable properties
+				...Object.getOwnPropertyNames(error)
+					.filter(key => key !== "message" && key !== "name" && key !== "stack")
+					.reduce(
+						(acc, key) => {
+							acc[key] = (error as any)[key]
+							return acc
+						},
+						{} as Record<string, any>,
+					),
+			}
+		}
+		return error
+	}
+
+	/**
+	 * Serialize context object, handling Error objects specially
+	 */
+	private serializeContext(context?: Record<string, any>): Record<string, any> | undefined {
+		if (!context) {
+			return undefined
+		}
+
+		const serialized: Record<string, any> = {}
+		for (const [key, value] of Object.entries(context)) {
+			if (value instanceof Error) {
+				serialized[key] = this.serializeError(value)
+			} else if (typeof value === "object" && value !== null) {
+				// Recursively handle nested objects that might contain errors
+				serialized[key] = this.serializeContext(value as Record<string, any>) || value
+			} else {
+				serialized[key] = value
+			}
+		}
+		return serialized
+	}
+
 	/**
 	 * Add a log entry with the specified level
 	 */
 	private addLog(level: LogLevel, message: string, source?: string, context?: Record<string, any>): void {
+		// Serialize context to handle Error objects properly
+		const serializedContext = this.serializeContext(context)
+
 		const entry: LogEntry = {
 			id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
 			ts: Date.now(),
 			level,
 			message,
 			...(source && { source }),
-			...(context && { context }),
+			...(serializedContext && { context: serializedContext }),
 		}
 
 		// Add to logs array

+ 0 - 448
cli/src/state/atoms/__tests__/approval-logic.test.ts

@@ -1,448 +0,0 @@
-import { describe, it, expect, beforeEach } from "vitest"
-import { createStore } from "jotai"
-import { shouldAutoApproveAtom, setPendingApprovalAtom } from "../approval.js"
-import { configAtom } from "../config.js"
-import type { ExtensionChatMessage } from "../../../types/messages.js"
-import type { CLIConfig } from "../../../config/types.js"
-import { DEFAULT_CONFIG } from "../../../config/defaults.js"
-
-describe("Auto Approval Logic", () => {
-	let store: ReturnType<typeof createStore>
-
-	beforeEach(() => {
-		store = createStore()
-	})
-
-	const createMockMessage = (ask: string, text: string): ExtensionChatMessage => ({
-		ts: Date.now(),
-		type: "ask",
-		ask: ask as any,
-		text,
-		partial: false,
-	})
-
-	describe("Global Auto Approval Toggle", () => {
-		it("should not auto-approve when global enabled is false", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: false,
-					read: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			const shouldApprove = store.get(shouldAutoApproveAtom)
-			expect(shouldApprove).toBe(false)
-		})
-
-		it("should check specific settings when global enabled is true", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			const shouldApprove = store.get(shouldAutoApproveAtom)
-			expect(shouldApprove).toBe(true)
-		})
-	})
-
-	describe("Read Operations", () => {
-		it("should auto-approve read operations when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-
-		it("should not auto-approve read operations when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-
-		it("should respect outside workspace setting", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: true, outside: false },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile", isOutsideWorkspace: true }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-	})
-
-	describe("Write Operations", () => {
-		it("should auto-approve write operations when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					write: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "editedExistingFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-
-		it("should not auto-approve protected files when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					write: { enabled: true, protected: false },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "editedExistingFile", isProtected: true }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-
-		it("should auto-approve protected files when explicitly enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					write: { enabled: true, protected: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "editedExistingFile", isProtected: true }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-	})
-
-	describe("Command Execution", () => {
-		it("should not auto-approve when allowed list is empty", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: [], denied: [] },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("command", "npm install")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-
-		it("should auto-approve commands in allowed list", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: ["npm", "git"], denied: [] },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("command", "npm install")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-
-		it("should not auto-approve commands not in allowed list", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: ["npm", "git"], denied: [] },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("command", "rm -rf /")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-
-		it("should not auto-approve commands in denied list", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: [], denied: ["rm -rf"] },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("command", "rm -rf /")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-
-		it("should auto-approve with wildcard in allowed list", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: ["*"], denied: [] },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("command", "any command")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-
-		it("denied list should take precedence over wildcard allowed", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: ["*"], denied: ["rm -rf"] },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("command", "rm -rf /")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-	})
-
-	describe("Browser Operations", () => {
-		it("should auto-approve browser operations when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					browser: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "browser_action" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-
-		it("should not auto-approve browser operations when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					browser: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "browser_action" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-	})
-
-	describe("MCP Operations", () => {
-		it("should auto-approve MCP tool usage when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					mcp: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "use_mcp_tool" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-
-		it("should auto-approve MCP resource access when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					mcp: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "access_mcp_resource" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-	})
-
-	describe("Mode Switching", () => {
-		it("should auto-approve mode switching when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					mode: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "switchMode" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-	})
-
-	describe("Subtasks", () => {
-		it("should auto-approve subtask creation when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					subtasks: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "newTask" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-	})
-
-	describe("Todo List Updates", () => {
-		it("should auto-approve todo updates when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					todo: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "updateTodoList" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-	})
-
-	describe("Followup Questions", () => {
-		it("should auto-approve followup questions when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					question: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("followup", "What should I do next?")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-	})
-
-	describe("Retry Operations", () => {
-		it("should auto-approve retry when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					retry: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("api_req_failed", "API request failed")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-		})
-	})
-
-	describe("Error Handling", () => {
-		it("should not auto-approve when message parsing fails", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("tool", "invalid json")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-
-		it("should not auto-approve unknown ask types", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-				},
-			}
-			store.set(configAtom, config)
-
-			const message = createMockMessage("unknown_type", "some text")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-		})
-	})
-})

+ 0 - 233
cli/src/state/atoms/__tests__/approval-race-conditions.test.ts

@@ -1,233 +0,0 @@
-/**
- * Tests for approval system race condition fixes
- *
- * These tests verify that the atomic state operations prevent:
- * - Duplicate approval attempts
- * - Stale closure issues
- * - UI not hiding after approval/rejection
- * - Synchronization issues between components
- */
-
-import { describe, it, expect, beforeEach } from "vitest"
-import { createStore } from "jotai"
-import {
-	pendingApprovalAtom,
-	approvalProcessingAtom,
-	setPendingApprovalAtom,
-	clearPendingApprovalAtom,
-	startApprovalProcessingAtom,
-	completeApprovalProcessingAtom,
-	isApprovalPendingAtom,
-} from "../approval.js"
-import type { ExtensionChatMessage } from "../../../types/messages.js"
-
-describe("Approval Race Condition Fixes", () => {
-	let store: ReturnType<typeof createStore>
-
-	beforeEach(() => {
-		store = createStore()
-	})
-
-	const createMockMessage = (ts: number, isAnswered = false): ExtensionChatMessage => ({
-		ts,
-		type: "ask",
-		ask: "tool",
-		text: JSON.stringify({ tool: "listFilesTopLevel", path: "." }),
-		partial: false,
-		isAnswered,
-	})
-
-	describe("Atomic State Operations", () => {
-		it("should prevent setting pending approval while processing", () => {
-			const message1 = createMockMessage(1000)
-			const message2 = createMockMessage(2000)
-
-			// Set first message as pending
-			store.set(setPendingApprovalAtom, message1)
-			expect(store.get(pendingApprovalAtom)).toBe(message1)
-
-			// Start processing
-			const started = store.set(startApprovalProcessingAtom, "approve")
-			expect(started).toBe(true)
-			expect(store.get(approvalProcessingAtom).isProcessing).toBe(true)
-
-			// Try to set second message while processing - should be ignored
-			store.set(setPendingApprovalAtom, message2)
-			expect(store.get(pendingApprovalAtom)).toBe(message1) // Still first message
-		})
-
-		it("should prevent duplicate approval processing", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-
-			// Start processing first time
-			const started1 = store.set(startApprovalProcessingAtom, "approve")
-			expect(started1).toBe(true)
-
-			// Try to start processing again - should fail
-			const started2 = store.set(startApprovalProcessingAtom, "approve")
-			expect(started2).toBe(false)
-
-			const processing = store.get(approvalProcessingAtom)
-			expect(processing.isProcessing).toBe(true)
-			expect(processing.processingTs).toBe(1000)
-		})
-
-		it("should clear both pending and processing state atomically", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			store.set(startApprovalProcessingAtom, "approve")
-
-			expect(store.get(pendingApprovalAtom)).toBe(message)
-			expect(store.get(approvalProcessingAtom).isProcessing).toBe(true)
-
-			// Complete processing - should clear both
-			store.set(completeApprovalProcessingAtom)
-
-			expect(store.get(pendingApprovalAtom)).toBeNull()
-			expect(store.get(approvalProcessingAtom).isProcessing).toBe(false)
-		})
-	})
-
-	describe("UI Visibility", () => {
-		it("should hide approval UI while processing", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			expect(store.get(isApprovalPendingAtom)).toBe(true)
-
-			// Start processing
-			store.set(startApprovalProcessingAtom, "approve")
-
-			// UI should be hidden while processing
-			expect(store.get(isApprovalPendingAtom)).toBe(false)
-		})
-
-		it("should hide approval UI after completion", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			store.set(startApprovalProcessingAtom, "approve")
-			store.set(completeApprovalProcessingAtom)
-
-			// UI should be hidden after completion
-			expect(store.get(isApprovalPendingAtom)).toBe(false)
-			expect(store.get(pendingApprovalAtom)).toBeNull()
-		})
-	})
-
-	describe("Message State Handling", () => {
-		it("should not set pending approval for answered messages", () => {
-			const message = createMockMessage(1000, true)
-
-			store.set(setPendingApprovalAtom, message)
-
-			// Should not set pending approval for answered message
-			expect(store.get(pendingApprovalAtom)).toBeNull()
-		})
-
-		it("should clear pending approval when message is answered", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			expect(store.get(pendingApprovalAtom)).toBe(message)
-
-			// Clear when answered
-			store.set(clearPendingApprovalAtom)
-			expect(store.get(pendingApprovalAtom)).toBeNull()
-		})
-
-		it("should handle multiple messages sequentially", () => {
-			const message1 = createMockMessage(1000)
-			const message2 = createMockMessage(2000)
-
-			// Process first message
-			store.set(setPendingApprovalAtom, message1)
-			store.set(startApprovalProcessingAtom, "approve")
-			store.set(completeApprovalProcessingAtom)
-
-			// Now process second message
-			store.set(setPendingApprovalAtom, message2)
-			expect(store.get(pendingApprovalAtom)).toBe(message2)
-
-			const started = store.set(startApprovalProcessingAtom, "approve")
-			expect(started).toBe(true)
-		})
-	})
-
-	describe("Processing State Tracking", () => {
-		it("should track processing operation type", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			store.set(startApprovalProcessingAtom, "approve")
-
-			const processing = store.get(approvalProcessingAtom)
-			expect(processing.operation).toBe("approve")
-		})
-
-		it("should track processing timestamp", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			store.set(startApprovalProcessingAtom, "reject")
-
-			const processing = store.get(approvalProcessingAtom)
-			expect(processing.processingTs).toBe(1000)
-		})
-
-		it("should clear processing state on completion", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			store.set(startApprovalProcessingAtom, "approve")
-			store.set(completeApprovalProcessingAtom)
-
-			const processing = store.get(approvalProcessingAtom)
-			expect(processing.isProcessing).toBe(false)
-			expect(processing.processingTs).toBeUndefined()
-			expect(processing.operation).toBeUndefined()
-		})
-	})
-
-	describe("Edge Cases", () => {
-		it("should handle clearing when no pending approval exists", () => {
-			expect(store.get(pendingApprovalAtom)).toBeNull()
-
-			// Should not throw
-			store.set(clearPendingApprovalAtom)
-			expect(store.get(pendingApprovalAtom)).toBeNull()
-		})
-
-		it("should handle starting processing when no pending approval", () => {
-			expect(store.get(pendingApprovalAtom)).toBeNull()
-
-			const started = store.set(startApprovalProcessingAtom, "approve")
-			expect(started).toBe(false)
-			expect(store.get(approvalProcessingAtom).isProcessing).toBe(false)
-		})
-
-		it("should handle completing processing when not processing", () => {
-			expect(store.get(approvalProcessingAtom).isProcessing).toBe(false)
-
-			// Should not throw
-			store.set(completeApprovalProcessingAtom)
-			expect(store.get(approvalProcessingAtom).isProcessing).toBe(false)
-		})
-
-		it("should clear processing state when clearing pending approval with matching timestamp", () => {
-			const message = createMockMessage(1000)
-
-			store.set(setPendingApprovalAtom, message)
-			store.set(startApprovalProcessingAtom, "approve")
-
-			// Clear pending approval
-			store.set(clearPendingApprovalAtom)
-
-			// Processing state should also be cleared since timestamps match
-			expect(store.get(approvalProcessingAtom).isProcessing).toBe(false)
-		})
-	})
-})

+ 161 - 0
cli/src/state/atoms/__tests__/approval.test.ts

@@ -0,0 +1,161 @@
+/**
+ * Tests for approval atoms
+ */
+
+import { describe, it, expect } from "vitest"
+import { atom } from "jotai"
+import { createStore } from "jotai"
+import { approvalOptionsAtom, pendingApprovalAtom } from "../approval.js"
+import type { ExtensionChatMessage } from "../../../types/messages.js"
+
+// Helper to create a test message
+const createMessage = (ask: string, text: string = "{}"): ExtensionChatMessage => ({
+	type: "ask",
+	ask,
+	text,
+	ts: Date.now(),
+	partial: false,
+	isAnswered: false,
+	say: "assistant",
+})
+
+describe("approval atoms", () => {
+	describe("approvalOptionsAtom", () => {
+		it("should return empty array when no pending approval", () => {
+			const store = createStore()
+			const options = store.get(approvalOptionsAtom)
+			expect(options).toEqual([])
+		})
+
+		it("should return basic options for tool requests", () => {
+			const store = createStore()
+			const message = createMessage("tool", JSON.stringify({ tool: "readFile" }))
+			store.set(pendingApprovalAtom, message)
+
+			const options = store.get(approvalOptionsAtom)
+			expect(options).toHaveLength(2)
+			expect(options[0].action).toBe("approve")
+			expect(options[1].action).toBe("reject")
+		})
+
+		it("should return Save label for file operations", () => {
+			const store = createStore()
+			const message = createMessage("tool", JSON.stringify({ tool: "editedExistingFile" }))
+			store.set(pendingApprovalAtom, message)
+
+			const options = store.get(approvalOptionsAtom)
+			expect(options[0].label).toBe("Save")
+		})
+
+		describe("command approval options", () => {
+			it("should generate hierarchical options for simple command (plain text)", () => {
+				const store = createStore()
+				const message = createMessage("command", "git")
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				expect(options).toHaveLength(3) // Run Command, Always Run "git", Reject
+				expect(options[0].label).toBe("Run Command")
+				expect(options[0].action).toBe("approve")
+				expect(options[1].label).toBe('Always Run "git"')
+				expect(options[1].action).toBe("approve-and-remember")
+				expect(options[1].commandPattern).toBe("git")
+				expect(options[2].label).toBe("Reject")
+				expect(options[2].action).toBe("reject")
+			})
+
+			it("should generate hierarchical options for simple command (JSON format)", () => {
+				const store = createStore()
+				const message = createMessage("command", JSON.stringify({ command: "git" }))
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				expect(options).toHaveLength(3) // Run Command, Always Run "git", Reject
+				expect(options[0].label).toBe("Run Command")
+				expect(options[0].action).toBe("approve")
+				expect(options[1].label).toBe('Always Run "git"')
+				expect(options[1].action).toBe("approve-and-remember")
+				expect(options[1].commandPattern).toBe("git")
+				expect(options[2].label).toBe("Reject")
+				expect(options[2].action).toBe("reject")
+			})
+
+			it("should generate hierarchical options for command with subcommand (plain text)", () => {
+				const store = createStore()
+				const message = createMessage("command", "git status")
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				expect(options).toHaveLength(4) // Run Command, Always Run "git", Always Run "git status", Reject
+				expect(options[0].label).toBe("Run Command")
+				expect(options[1].label).toBe('Always Run "git"')
+				expect(options[1].commandPattern).toBe("git")
+				expect(options[2].label).toBe('Always Run "git status"')
+				expect(options[2].commandPattern).toBe("git status")
+				expect(options[3].label).toBe("Reject")
+			})
+
+			it("should generate hierarchical options for full command with flags (plain text)", () => {
+				const store = createStore()
+				const message = createMessage("command", "git status --short --branch")
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				expect(options).toHaveLength(5) // Run Command, 3 Always Run options, Reject
+				expect(options[0].label).toBe("Run Command")
+				expect(options[1].label).toBe('Always Run "git"')
+				expect(options[1].commandPattern).toBe("git")
+				expect(options[2].label).toBe('Always Run "git status"')
+				expect(options[2].commandPattern).toBe("git status")
+				expect(options[3].label).toBe('Always Run "git status --short --branch"')
+				expect(options[3].commandPattern).toBe("git status --short --branch")
+				expect(options[4].label).toBe("Reject")
+			})
+
+			it("should assign hotkeys correctly (plain text)", () => {
+				const store = createStore()
+				const message = createMessage("command", "git status --short")
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				expect(options[0].hotkey).toBe("y") // Run Command
+				expect(options[1].hotkey).toBe("1") // Always Run "git"
+				expect(options[2].hotkey).toBe("2") // Always Run "git status"
+				expect(options[3].hotkey).toBe("3") // Always Run "git status --short --branch"
+				expect(options[4].hotkey).toBe("n") // Reject
+			})
+
+			it("should handle commands with extra whitespace (plain text)", () => {
+				const store = createStore()
+				const message = createMessage("command", "  npm   install  ")
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				expect(options).toHaveLength(4) // Run Command, Always run npm, Always run npm install, Reject
+				expect(options[1].commandPattern).toBe("npm")
+				expect(options[2].commandPattern).toBe("npm install")
+			})
+
+			it("should handle empty command gracefully (plain text)", () => {
+				const store = createStore()
+				const message = createMessage("command", "")
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				expect(options).toHaveLength(2) // Run Command, Reject (no Always run options)
+			})
+
+			it("should handle invalid JSON as plain text command", () => {
+				const store = createStore()
+				const message = createMessage("command", "invalid json")
+				store.set(pendingApprovalAtom, message)
+
+				const options = store.get(approvalOptionsAtom)
+				// "invalid json" is treated as a command with two parts: "invalid" and "invalid json"
+				expect(options).toHaveLength(4) // Run Command, Always run invalid, Always run invalid json, Reject
+				expect(options[1].commandPattern).toBe("invalid")
+				expect(options[2].commandPattern).toBe("invalid json")
+			})
+		})
+	})
+})

+ 0 - 392
cli/src/state/atoms/__tests__/ci-approval.test.ts

@@ -1,392 +0,0 @@
-import { describe, it, expect, beforeEach } from "vitest"
-import { createStore } from "jotai"
-import { shouldAutoApproveAtom, shouldAutoRejectAtom, setPendingApprovalAtom } from "../approval.js"
-import { ciModeAtom } from "../ci.js"
-import { configAtom } from "../config.js"
-import type { ExtensionChatMessage } from "../../../types/messages.js"
-import type { CLIConfig } from "../../../config/types.js"
-import { DEFAULT_CONFIG } from "../../../config/defaults.js"
-
-describe("CI Mode Auto Approval", () => {
-	let store: ReturnType<typeof createStore>
-
-	beforeEach(() => {
-		store = createStore()
-	})
-
-	const createMockMessage = (ask: string, text: string): ExtensionChatMessage => ({
-		ts: Date.now(),
-		type: "ask",
-		ask: ask as any,
-		text,
-		partial: false,
-	})
-
-	describe("CI Mode Detection", () => {
-		it("should not affect approval when CI mode is disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, false)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-
-		it("should enable auto-reject in CI mode when operation is not allowed", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-	})
-
-	describe("CI Mode Read Operations", () => {
-		it("should auto-approve read operations in CI mode when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-
-		it("should auto-reject read operations in CI mode when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-
-		it("should auto-reject outside workspace reads in CI mode when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: true, outside: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile", isOutsideWorkspace: true }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-	})
-
-	describe("CI Mode Write Operations", () => {
-		it("should auto-approve write operations in CI mode when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					write: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "editedExistingFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-
-		it("should auto-reject protected file writes in CI mode when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					write: { enabled: true, protected: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "editedExistingFile", isProtected: true }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-
-		it("should auto-approve protected file writes in CI mode when explicitly enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					write: { enabled: true, protected: true },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "editedExistingFile", isProtected: true }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-	})
-
-	describe("CI Mode Command Execution", () => {
-		it("should auto-reject commands in CI mode when allowed list is empty", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: [], denied: [] },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("command", "npm install")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-
-		it("should auto-approve allowed commands in CI mode", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: ["npm", "git"], denied: [] },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("command", "npm install")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-
-		it("should auto-reject denied commands in CI mode", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					execute: { enabled: true, allowed: ["*"], denied: ["rm -rf"] },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("command", "rm -rf /")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-	})
-
-	describe("CI Mode Followup Questions", () => {
-		it("should handle followup questions in CI mode (approval logic in hook)", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					question: { enabled: false }, // Even if disabled, CI mode should handle it
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("followup", "What should I do next?")
-			store.set(setPendingApprovalAtom, message)
-
-			// In CI mode, followup questions are handled specially by the hook
-			// The atom logic shows it would be rejected based on config
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			// But the hook will override this and approve with a special message
-		})
-
-		it("should auto-approve followup questions when enabled in config", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					question: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("followup", "What should I do next?")
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-	})
-
-	describe("CI Mode Browser Operations", () => {
-		it("should auto-approve browser operations in CI mode when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					browser: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "browser_action" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-
-		it("should auto-reject browser operations in CI mode when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					browser: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "browser_action" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-	})
-
-	describe("CI Mode MCP Operations", () => {
-		it("should auto-approve MCP operations in CI mode when enabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					mcp: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "use_mcp_tool" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-		})
-
-		it("should auto-reject MCP operations in CI mode when disabled", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					mcp: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "use_mcp_tool" }))
-			store.set(setPendingApprovalAtom, message)
-
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-	})
-
-	describe("CI Mode Complex Scenarios", () => {
-		it("should handle multiple operations with mixed approval settings", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: true,
-					read: { enabled: true },
-					write: { enabled: false },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			// Read should be approved
-			const readMessage = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, readMessage)
-			expect(store.get(shouldAutoApproveAtom)).toBe(true)
-			expect(store.get(shouldAutoRejectAtom)).toBe(false)
-
-			// Write should be rejected
-			const writeMessage = createMockMessage("tool", JSON.stringify({ tool: "editedExistingFile" }))
-			store.set(setPendingApprovalAtom, writeMessage)
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-
-		it("should handle global auto-approval disabled in CI mode", () => {
-			const config: CLIConfig = {
-				...DEFAULT_CONFIG,
-				autoApproval: {
-					enabled: false,
-					read: { enabled: true },
-				},
-			}
-			store.set(configAtom, config)
-			store.set(ciModeAtom, true)
-
-			const message = createMockMessage("tool", JSON.stringify({ tool: "readFile" }))
-			store.set(setPendingApprovalAtom, message)
-
-			// Even in CI mode, if global auto-approval is disabled, nothing should be approved
-			expect(store.get(shouldAutoApproveAtom)).toBe(false)
-			expect(store.get(shouldAutoRejectAtom)).toBe(true)
-		})
-	})
-})

+ 117 - 2
cli/src/state/atoms/__tests__/keyboard.test.ts

@@ -10,6 +10,7 @@ import {
 import { textBufferStringAtom, textBufferStateAtom } from "../textBuffer.js"
 import { keyboardHandlerAtom, submissionCallbackAtom, submitInputAtom } from "../keyboard.js"
 import { pendingApprovalAtom } from "../approval.js"
+import { historyDataAtom, historyModeAtom, historyIndexAtom } from "../history.js"
 import type { Key } from "../../../types/keyboard.js"
 import type { CommandSuggestion, ArgumentSuggestion } from "../../../services/autocomplete.js"
 import type { Command } from "../../../commands/core/types.js"
@@ -147,7 +148,7 @@ describe("keypress atoms", () => {
 	})
 
 	describe("submission callback", () => {
-		it("should call submission callback when Enter is pressed with text", () => {
+		it("should call submission callback when Enter is pressed with text", async () => {
 			const mockCallback = vi.fn()
 			store.set(submissionCallbackAtom, { callback: mockCallback })
 
@@ -174,7 +175,10 @@ describe("keypress atoms", () => {
 				shift: false,
 				paste: false,
 			}
-			store.set(keyboardHandlerAtom, enterKey)
+			await store.set(keyboardHandlerAtom, enterKey)
+
+			// Wait for async operations to complete
+			await new Promise((resolve) => setTimeout(resolve, 10))
 
 			expect(mockCallback).toHaveBeenCalledWith("hello")
 		})
@@ -636,4 +640,115 @@ describe("keypress atoms", () => {
 			expect(selectedIndex).toBe(0) // Should remain unchanged
 		})
 	})
+
+	describe("history navigation", () => {
+		it("should display most recent entry when entering history mode with up arrow", () => {
+			// Set up history with multiple entries
+			store.set(historyDataAtom, {
+				version: "1.0.0",
+				entries: [
+					{ prompt: "/help", timestamp: 1 },
+					{ prompt: "/mode ask", timestamp: 2 },
+					{ prompt: "what time is now?", timestamp: 3 },
+				],
+				maxSize: 500,
+			})
+
+			// Ensure input is empty
+			expect(store.get(textBufferStringAtom)).toBe("")
+
+			// Press up arrow to enter history mode
+			const upKey: Key = {
+				name: "up",
+				sequence: "\x1b[A",
+				ctrl: false,
+				meta: false,
+				shift: false,
+				paste: false,
+			}
+			store.set(keyboardHandlerAtom, upKey)
+
+			// Should display the most recent entry
+			const text = store.get(textBufferStringAtom)
+			expect(text).toBe("what time is now?")
+
+			// Should be in history mode
+			expect(store.get(historyModeAtom)).toBe(true)
+		})
+
+		it("should navigate to older entries on subsequent up presses", () => {
+			// Set up history with multiple entries
+			store.set(historyDataAtom, {
+				version: "1.0.0",
+				entries: [
+					{ prompt: "/help", timestamp: 1 },
+					{ prompt: "/mode ask", timestamp: 2 },
+					{ prompt: "what time is now?", timestamp: 3 },
+				],
+				maxSize: 500,
+			})
+
+			// Press up arrow to enter history mode (shows most recent)
+			const upKey: Key = {
+				name: "up",
+				sequence: "\x1b[A",
+				ctrl: false,
+				meta: false,
+				shift: false,
+				paste: false,
+			}
+
+			// First press - enter history mode
+			store.set(keyboardHandlerAtom, upKey)
+			expect(store.get(textBufferStringAtom)).toBe("what time is now?")
+			expect(store.get(historyModeAtom)).toBe(true)
+
+			// Second press - navigate to older
+			store.set(keyboardHandlerAtom, upKey)
+			expect(store.get(textBufferStringAtom)).toBe("/mode ask")
+
+			// Third press - navigate to oldest
+			store.set(keyboardHandlerAtom, upKey)
+			expect(store.get(textBufferStringAtom)).toBe("/help")
+		})
+
+		it("should not enter history mode when input is not empty", () => {
+			// Set up history
+			store.set(historyDataAtom, {
+				version: "1.0.0",
+				entries: [{ prompt: "test", timestamp: 1 }],
+				maxSize: 500,
+			})
+
+			// Type some text
+			const chars = ["h", "i"]
+			for (const char of chars) {
+				const key: Key = {
+					name: char,
+					sequence: char,
+					ctrl: false,
+					meta: false,
+					shift: false,
+					paste: false,
+				}
+				store.set(keyboardHandlerAtom, key)
+			}
+
+			// Press up arrow
+			const upKey: Key = {
+				name: "up",
+				sequence: "\x1b[A",
+				ctrl: false,
+				meta: false,
+				shift: false,
+				paste: false,
+			}
+			store.set(keyboardHandlerAtom, upKey)
+
+			// Should not enter history mode
+			expect(store.get(historyModeAtom)).toBe(false)
+			// Text should remain unchanged
+			expect(store.get(textBufferStringAtom)).toBe("hi")
+		})
+	})
 })

+ 115 - 223
cli/src/state/atoms/approval.ts

@@ -1,34 +1,20 @@
 import { atom } from "jotai"
 import type { ExtensionChatMessage } from "../../types/messages.js"
-import { ciModeAtom } from "./ci.js"
 import { logs } from "../../services/logs.js"
 import { selectedIndexAtom } from "./ui.js"
-import {
-	autoApproveReadAtom,
-	autoApproveReadOutsideAtom,
-	autoApproveWriteAtom,
-	autoApproveWriteOutsideAtom,
-	autoApproveWriteProtectedAtom,
-	autoApproveBrowserAtom,
-	autoApproveRetryAtom,
-	autoApproveMcpAtom,
-	autoApproveModeAtom,
-	autoApproveSubtasksAtom,
-	autoApproveExecuteAtom,
-	autoApproveExecuteAllowedAtom,
-	autoApproveExecuteDeniedAtom,
-	autoApproveQuestionAtom,
-	autoApproveTodoAtom,
-} from "./config.js"
 
 /**
  * Approval option interface
  */
 export interface ApprovalOption {
 	label: string
-	action: "approve" | "reject"
+	action: "approve" | "reject" | "approve-and-remember"
 	hotkey: string
 	color: "green" | "red"
+	/** Command pattern to remember (for approve-and-remember action) */
+	commandPattern?: string
+	/** Unique key for React rendering (combines action + pattern) */
+	key?: string
 }
 
 /**
@@ -70,8 +56,41 @@ export const isApprovalPendingAtom = atom<boolean>((get) => {
 	return pending !== null && !processing.isProcessing
 })
 
+/**
+ * Helper function to parse command into hierarchical parts
+ * Example: "git status --short --branch" returns:
+ * - "git"
+ * - "git status"
+ * - "git status --short --branch"
+ */
+function parseCommandHierarchy(command: string): string[] {
+	const parts = command.trim().split(/\s+/).filter(Boolean)
+	if (parts.length === 0) return []
+
+	const hierarchy: string[] = []
+
+	// Add base command
+	if (parts[0]) {
+		hierarchy.push(parts[0])
+	}
+
+	// Add command + first subcommand if exists
+	if (parts.length > 1 && parts[0] && parts[1]) {
+		hierarchy.push(`${parts[0]} ${parts[1]}`)
+	}
+
+	// Add full command if it's different from the previous entries
+	if (parts.length > 2) {
+		hierarchy.push(command)
+	}
+
+	return hierarchy
+}
+
 /**
  * Derived atom to get approval options based on the pending message type
+ * Note: This atom recalculates whenever the pending message changes OR when
+ * the message text/partial status changes (for streaming messages)
  */
 export const approvalOptionsAtom = atom<ApprovalOption[]>((get) => {
 	const pendingMessage = get(pendingApprovalAtom)
@@ -80,6 +99,26 @@ export const approvalOptionsAtom = atom<ApprovalOption[]>((get) => {
 		return []
 	}
 
+	// For command messages, wait until the message is complete (not partial)
+	// and has text before generating hierarchical options
+	if (pendingMessage.ask === "command" && (pendingMessage.partial || !pendingMessage.text)) {
+		// Return basic options while waiting for complete message
+		return [
+			{
+				label: "Run Command",
+				action: "approve" as const,
+				hotkey: "y",
+				color: "green" as const,
+			},
+			{
+				label: "Reject",
+				action: "reject" as const,
+				hotkey: "n",
+				color: "red" as const,
+			},
+		]
+	}
+
 	// Determine button labels based on ask type
 	let approveLabel = "Approve"
 	const rejectLabel = "Reject"
@@ -99,6 +138,50 @@ export const approvalOptionsAtom = atom<ApprovalOption[]>((get) => {
 		}
 	} else if (pendingMessage.ask === "command") {
 		approveLabel = "Run Command"
+
+		// Parse command and generate hierarchical approval options
+		let command = ""
+		try {
+			// Try parsing as JSON first
+			const commandData = JSON.parse(pendingMessage.text || "{}")
+			command = commandData.command || ""
+		} catch {
+			// If not JSON, use the text directly as the command
+			command = pendingMessage.text || ""
+		}
+
+		if (command) {
+			const hierarchy = parseCommandHierarchy(command)
+			const options: ApprovalOption[] = [
+				{
+					label: approveLabel,
+					action: "approve" as const,
+					hotkey: "y",
+					color: "green" as const,
+				},
+			]
+
+			// Add "Always run X" options for each level of the hierarchy
+			hierarchy.forEach((pattern, index) => {
+				options.push({
+					label: `Always Run "${pattern}"`,
+					action: "approve-and-remember" as const,
+					hotkey: String(index + 1),
+					color: "green" as const,
+					commandPattern: pattern,
+					key: `approve-and-remember-${pattern}`,
+				})
+			})
+
+			options.push({
+				label: rejectLabel,
+				action: "reject" as const,
+				hotkey: "n",
+				color: "red" as const,
+			})
+
+			return options
+		}
 	}
 
 	return [
@@ -126,29 +209,28 @@ export const setPendingApprovalAtom = atom(null, (get, set, message: ExtensionCh
 
 	// Don't set pending approval if we're currently processing an approval
 	if (processing.isProcessing) {
-		logs.debug("Skipping setPendingApproval - approval is being processed", "approval", {
-			processingTs: processing.processingTs,
-			newTs: message?.ts,
-		})
 		return
 	}
 
 	// Don't set if message is already answered
 	if (message?.isAnswered) {
-		logs.debug("Skipping setPendingApproval - message already answered", "approval", {
-			ts: message.ts,
-		})
 		return
 	}
 
-	logs.debug("Setting pending approval", "approval", {
-		ts: message?.ts,
-		ask: message?.ask,
-		text: message?.text?.substring(0, 100),
-	})
+	// Always create a new object reference to force Jotai to re-evaluate dependent atoms
+	// This is critical for streaming messages that update from partial to complete
+	// and ensures approvalOptionsAtom recalculates when message content changes
+	const messageToSet = message ? { ...message } : null
+	set(pendingApprovalAtom, messageToSet)
 
-	set(pendingApprovalAtom, message)
-	set(selectedIndexAtom, 0) // Reset selection
+	// Get the current pending message to check if this is a new message or an update
+	const current = get(pendingApprovalAtom)
+	const isNewMessage = !current || current.ts !== message?.ts
+
+	// Reset selection if this is a new message (different timestamp)
+	if (isNewMessage) {
+		set(selectedIndexAtom, 0)
+	}
 })
 
 /**
@@ -159,14 +241,6 @@ export const clearPendingApprovalAtom = atom(null, (get, set) => {
 	const current = get(pendingApprovalAtom)
 	const processing = get(approvalProcessingAtom)
 
-	if (current) {
-		logs.debug("Clearing pending approval atom", "approval", {
-			ts: current.ts,
-			ask: current.ask,
-			wasProcessing: processing.isProcessing,
-		})
-	}
-
 	set(pendingApprovalAtom, null)
 	set(selectedIndexAtom, 0)
 
@@ -197,11 +271,6 @@ export const startApprovalProcessingAtom = atom(null, (get, set, operation: "app
 		return false
 	}
 
-	logs.debug("Starting approval processing", "approval", {
-		ts: pending.ts,
-		operation,
-	})
-
 	set(approvalProcessingAtom, {
 		isProcessing: true,
 		processingTs: pending.ts,
@@ -216,14 +285,6 @@ export const startApprovalProcessingAtom = atom(null, (get, set, operation: "app
  * This clears both the pending approval and processing state atomically
  */
 export const completeApprovalProcessingAtom = atom(null, (get, set) => {
-	const processing = get(approvalProcessingAtom)
-
-	logs.debug("Completing approval processing", "approval", {
-		ts: processing.processingTs,
-		operation: processing.operation,
-	})
-
-	// Clear both pending approval and processing state atomically
 	set(pendingApprovalAtom, null)
 	set(selectedIndexAtom, 0)
 	set(approvalProcessingAtom, { isProcessing: false })
@@ -263,175 +324,6 @@ export const selectedApprovalOptionAtom = atom<ApprovalOption | null>((get) => {
 	return options[selectedIndex] ?? null
 })
 
-/**
- * Helper function to check if a command matches allowed/denied patterns
- */
-function matchesCommandPattern(command: string, patterns: string[]): boolean {
-	if (patterns.length === 0) return false
-
-	return patterns.some((pattern) => {
-		// Simple pattern matching - can be enhanced with regex if needed
-		if (pattern === "*") return true
-		if (pattern === command) return true
-		// Check if command starts with pattern (for partial matches like "npm")
-		if (command.startsWith(pattern)) return true
-		return false
-	})
-}
-
-/**
- * Derived atom to check if the current pending approval should be auto-approved
- * based on CLI configuration
- */
-export const shouldAutoApproveAtom = atom<boolean>((get) => {
-	const pendingMessage = get(pendingApprovalAtom)
-
-	if (!pendingMessage || pendingMessage.type !== "ask") {
-		return false
-	}
-
-	const askType = pendingMessage.ask
-
-	try {
-		switch (askType) {
-			case "tool": {
-				const toolData = JSON.parse(pendingMessage.text || "{}")
-				const tool = toolData.tool
-
-				// Read operations
-				if (
-					tool === "readFile" ||
-					tool === "listFiles" ||
-					tool === "listFilesTopLevel" ||
-					tool === "listFilesRecursive" ||
-					tool === "searchFiles" ||
-					tool === "codebaseSearch" ||
-					tool === "listCodeDefinitionNames"
-				) {
-					const isOutsideWorkspace = toolData.isOutsideWorkspace === true
-					if (isOutsideWorkspace) {
-						return get(autoApproveReadOutsideAtom)
-					}
-					return get(autoApproveReadAtom)
-				}
-
-				// Write operations
-				if (
-					tool === "editedExistingFile" ||
-					tool === "appliedDiff" ||
-					tool === "newFileCreated" ||
-					tool === "insertContent" ||
-					tool === "searchAndReplace"
-				) {
-					const isOutsideWorkspace = toolData.isOutsideWorkspace === true
-					const isProtected = toolData.isProtected === true
-
-					if (isProtected) {
-						return get(autoApproveWriteProtectedAtom)
-					}
-					if (isOutsideWorkspace) {
-						return get(autoApproveWriteOutsideAtom)
-					}
-					return get(autoApproveWriteAtom)
-				}
-
-				// Browser operations
-				if (tool === "browser_action") {
-					return get(autoApproveBrowserAtom)
-				}
-
-				// MCP operations
-				if (tool === "use_mcp_tool" || tool === "access_mcp_resource") {
-					return get(autoApproveMcpAtom)
-				}
-
-				// Mode switching
-				if (tool === "switchMode") {
-					return get(autoApproveModeAtom)
-				}
-
-				// Subtasks
-				if (tool === "newTask") {
-					return get(autoApproveSubtasksAtom)
-				}
-
-				// Todo list updates
-				if (tool === "updateTodoList") {
-					return get(autoApproveTodoAtom)
-				}
-
-				break
-			}
-
-			case "command": {
-				const autoApproveExecute = get(autoApproveExecuteAtom)
-				if (!autoApproveExecute) return false
-
-				// Parse command from message - it's stored as JSON with a "command" field
-				let command = ""
-				try {
-					const commandData = JSON.parse(pendingMessage.text || "{}")
-					command = commandData.command || pendingMessage.text || ""
-				} catch {
-					// If parsing fails, use text directly
-					command = pendingMessage.text || ""
-				}
-
-				const allowedCommands = get(autoApproveExecuteAllowedAtom)
-				const deniedCommands = get(autoApproveExecuteDeniedAtom)
-
-				// Check denied list first (takes precedence)
-				if (matchesCommandPattern(command, deniedCommands)) {
-					return false
-				}
-
-				// If allowed list is empty, don't allow any commands
-				if (allowedCommands.length === 0) {
-					return false
-				}
-
-				// Check if command matches allowed patterns
-				return matchesCommandPattern(command, allowedCommands)
-			}
-
-			case "followup": {
-				return get(autoApproveQuestionAtom)
-			}
-
-			case "api_req_failed": {
-				return get(autoApproveRetryAtom)
-			}
-
-			default:
-				return false
-		}
-	} catch {
-		// If we can't parse the message, don't auto-approve
-		return false
-	}
-
-	return false
-})
-
-/**
- * Derived atom to check if the current pending approval should be auto-rejected
- * in CI mode based on CLI configuration.
- *
- * This atom returns true when:
- * 1. CI mode is active
- * 2. The operation is NOT allowed by shouldAutoApproveAtom
- *
- * This is used to automatically reject operations in CI mode that don't meet
- * the auto-approval criteria.
- */
-export const shouldAutoRejectAtom = atom<boolean>((get) => {
-	const isCIMode = get(ciModeAtom)
-	const shouldApprove = get(shouldAutoApproveAtom)
-
-	// Only auto-reject in CI mode when the operation is not approved
-	return isCIMode && !shouldApprove
-})
-
 // ============================================================================
 // Approval Action Callbacks (for keyboard handler)
 // ============================================================================

+ 31 - 0
cli/src/state/atoms/config.ts

@@ -460,3 +460,34 @@ export const updateAutoApprovalSettingAtom = atom(
 		logs.info(`Auto approval ${category} setting updated`, "ConfigAtoms")
 	},
 )
+
+/**
+ * Action atom to add a command pattern to the auto-approval allowed list
+ */
+export const addAllowedCommandAtom = atom(null, async (get, set, commandPattern: string) => {
+	const config = get(configAtom)
+	const currentAllowed = config.autoApproval?.execute?.allowed ?? []
+
+	// Don't add if already exists
+	if (currentAllowed.includes(commandPattern)) {
+		logs.debug("Command pattern already in allowed list", "ConfigAtoms", { commandPattern })
+		return
+	}
+
+	const updatedConfig = {
+		...config,
+		autoApproval: {
+			...config.autoApproval,
+			execute: {
+				...config.autoApproval?.execute,
+				enabled: true, // Enable execute auto-approval when adding patterns
+				allowed: [...currentAllowed, commandPattern],
+			},
+		},
+	}
+
+	set(configAtom, updatedConfig)
+	await set(saveConfigAtom, updatedConfig)
+
+	logs.info(`Added command pattern to allowed list: ${commandPattern}`, "ConfigAtoms")
+})

+ 27 - 0
cli/src/state/atoms/effects.ts

@@ -8,6 +8,14 @@ import type { ExtensionMessage } from "../../types/messages.js"
 import { extensionServiceAtom, setServiceReadyAtom, setServiceErrorAtom, setIsInitializingAtom } from "./service.js"
 import { updateExtensionStateAtom, updateChatMessageByTsAtom, updateRouterModelsAtom } from "./extension.js"
 import { ciCompletionDetectedAtom } from "./ci.js"
+import {
+	updateProfileDataAtom,
+	updateBalanceDataAtom,
+	setProfileLoadingAtom,
+	setBalanceLoadingAtom,
+	setProfileErrorAtom,
+	setBalanceErrorAtom,
+} from "./profile.js"
 import { logs } from "../../services/logs.js"
 
 /**
@@ -135,6 +143,25 @@ export const messageHandlerEffectAtom = atom(null, (get, set, message: Extension
 				}
 				break
 
+			case "profileDataResponse":
+				set(setProfileLoadingAtom, false)
+				if (message.payload?.success) {
+					set(updateProfileDataAtom, message.payload.data)
+				} else {
+					set(setProfileErrorAtom, message.payload?.error || "Failed to fetch profile")
+				}
+				break
+
+			case "balanceDataResponse":
+				// Handle balance data response
+				set(setBalanceLoadingAtom, false)
+				if (message.payload?.success) {
+					set(updateBalanceDataAtom, message.payload.data)
+				} else {
+					set(setBalanceErrorAtom, message.payload?.error || "Failed to fetch balance")
+				}
+				break
+
 			case "action":
 				// Action messages are typically handled by the UI
 				break

+ 245 - 0
cli/src/state/atoms/history.ts

@@ -0,0 +1,245 @@
+/**
+ * History state management atoms
+ * Manages command history navigation and persistence
+ */
+
+import { atom } from "jotai"
+import type { HistoryData, HistoryEntry } from "../../config/history.js"
+import { loadHistory, saveHistory, addEntry } from "../../config/history.js"
+import { logs } from "../../services/logs.js"
+
+// ============================================================================
+// Core State Atoms
+// ============================================================================
+
+/**
+ * History data atom - holds all history entries
+ */
+export const historyDataAtom = atom<HistoryData>({
+	version: "1.0.0",
+	entries: [],
+	maxSize: 500,
+})
+
+/**
+ * History navigation index
+ * -1 means not in history mode
+ * 0 means at the most recent entry
+ * entries.length - 1 means at the oldest entry
+ */
+export const historyIndexAtom = atom<number>(-1)
+
+/**
+ * Whether we're currently in history navigation mode
+ */
+export const historyModeAtom = atom<boolean>(false)
+
+/**
+ * Original input before entering history mode
+ * Used to restore when exiting history mode
+ */
+export const originalInputAtom = atom<string>("")
+
+// ============================================================================
+// Derived Atoms (Read-only)
+// ============================================================================
+
+/**
+ * Get all history entries
+ */
+export const historyEntriesAtom = atom<HistoryEntry[]>((get) => {
+	const data = get(historyDataAtom)
+	return data.entries
+})
+
+/**
+ * Get current history entry based on navigation index
+ * Returns null if not in history mode or index is invalid
+ */
+export const currentHistoryEntryAtom = atom<HistoryEntry | null>((get) => {
+	const entries = get(historyEntriesAtom)
+	const index = get(historyIndexAtom)
+	const inHistoryMode = get(historyModeAtom)
+
+	if (!inHistoryMode || index < 0 || index >= entries.length) {
+		return null
+	}
+
+	// History is stored oldest to newest, but we navigate newest to oldest
+	// So we need to reverse the index
+	const reverseIndex = entries.length - 1 - index
+	return entries[reverseIndex] || null
+})
+
+/**
+ * Get the prompt text from current history entry
+ */
+export const currentHistoryCommandAtom = atom<string>((get) => {
+	const entry = get(currentHistoryEntryAtom)
+	return entry?.prompt || ""
+})
+
+/**
+ * Check if we can navigate up (to older entries)
+ */
+export const canNavigateUpAtom = atom<boolean>((get) => {
+	const entries = get(historyEntriesAtom)
+	const index = get(historyIndexAtom)
+	return index < entries.length - 1
+})
+
+/**
+ * Check if we can navigate down (to newer entries)
+ */
+export const canNavigateDownAtom = atom<boolean>((get) => {
+	const index = get(historyIndexAtom)
+	return index > 0
+})
+
+// ============================================================================
+// Action Atoms - History Loading/Saving
+// ============================================================================
+
+/**
+ * Load history from disk
+ */
+export const loadHistoryAtom = atom(null, async (get, set) => {
+	try {
+		const data = await loadHistory()
+		set(historyDataAtom, data)
+	} catch (error) {
+		logs.error("Failed to load history into state", "HistoryAtoms", { error })
+		throw error
+	}
+})
+
+/**
+ * Save history to disk
+ */
+export const saveHistoryAtom = atom(null, async (get, set) => {
+	try {
+		const data = get(historyDataAtom)
+		await saveHistory(data)
+	} catch (error) {
+		logs.error("Failed to save history from state", "HistoryAtoms", { error })
+		throw error
+	}
+})
+
+/**
+ * Add command to history and save
+ * Avoids consecutive duplicates
+ */
+export const addToHistoryAtom = atom(null, async (get, set, prompt: string) => {
+	try {
+		const currentData = get(historyDataAtom)
+		const newData = addEntry(currentData, prompt)
+
+		// Only save if data actually changed
+		if (newData.entries.length !== currentData.entries.length) {
+			set(historyDataAtom, newData)
+			await saveHistory(newData)
+		}
+	} catch (error) {
+		logs.error("Failed to add prompt to history", "HistoryAtoms", { error })
+		// Don't throw - history is not critical
+	}
+})
+
+// ============================================================================
+// Action Atoms - History Navigation
+// ============================================================================
+
+/**
+ * Enter history mode and navigate to most recent entry
+ * Should only be called when input is empty
+ */
+export const enterHistoryModeAtom = atom(null, (get, set, originalInput: string = "") => {
+	const entries = get(historyEntriesAtom)
+
+	// Can't enter history mode if no entries
+	if (entries.length === 0) {
+		return false
+	}
+
+	set(historyModeAtom, true)
+	set(historyIndexAtom, 0) // Start at most recent
+	set(originalInputAtom, originalInput)
+
+	return true
+})
+
+/**
+ * Exit history mode and restore original input
+ */
+export const exitHistoryModeAtom = atom(null, (get, set) => {
+	const wasInHistoryMode = get(historyModeAtom)
+
+	if (wasInHistoryMode) {
+		set(historyModeAtom, false)
+		set(historyIndexAtom, -1)
+		set(originalInputAtom, "")
+	}
+
+	return wasInHistoryMode
+})
+
+/**
+ * Navigate up in history (to older entries)
+ * Returns the prompt to display, or null if can't navigate
+ */
+export const navigateHistoryUpAtom = atom(null, (get, set): string | null => {
+	const canNavigate = get(canNavigateUpAtom)
+
+	if (!canNavigate) {
+		return null
+	}
+
+	const currentIndex = get(historyIndexAtom)
+	const newIndex = currentIndex + 1
+	set(historyIndexAtom, newIndex)
+
+	const entries = get(historyEntriesAtom)
+	const reverseIndex = entries.length - 1 - newIndex
+	const entry = entries[reverseIndex]
+
+	return entry?.prompt || null
+})
+
+/**
+ * Navigate down in history (to newer entries)
+ * Returns the prompt to display, or null if can't navigate
+ */
+export const navigateHistoryDownAtom = atom(null, (get, set): string | null => {
+	const canNavigate = get(canNavigateDownAtom)
+
+	if (!canNavigate) {
+		return null
+	}
+
+	const currentIndex = get(historyIndexAtom)
+	const newIndex = currentIndex - 1
+	set(historyIndexAtom, newIndex)
+
+	// If we're back at index 0 or below, return to original input
+	if (newIndex < 0) {
+		const originalInput = get(originalInputAtom)
+		return originalInput
+	}
+
+	const entries = get(historyEntriesAtom)
+	const reverseIndex = entries.length - 1 - newIndex
+	const entry = entries[reverseIndex]
+
+	return entry?.prompt || null
+})
+
+/**
+ * Reset history navigation state
+ * Used when submitting a command from history
+ */
+export const resetHistoryNavigationAtom = atom(null, (get, set) => {
+	set(historyModeAtom, false)
+	set(historyIndexAtom, -1)
+	set(originalInputAtom, "")
+})

+ 71 - 1
cli/src/state/atoms/keyboard.ts

@@ -20,6 +20,7 @@ import {
 } from "./ui.js"
 import {
 	textBufferStringAtom,
+	textBufferIsEmptyAtom,
 	moveUpAtom,
 	moveDownAtom,
 	moveLeftAtom,
@@ -39,6 +40,14 @@ import {
 import { isApprovalPendingAtom, approvalOptionsAtom, approveAtom, rejectAtom, executeSelectedAtom } from "./approval.js"
 import { hasResumeTaskAtom } from "./extension.js"
 import { cancelTaskAtom, resumeTaskAtom } from "./actions.js"
+import {
+	historyModeAtom,
+	historyEntriesAtom,
+	enterHistoryModeAtom,
+	exitHistoryModeAtom,
+	navigateHistoryUpAtom,
+	navigateHistoryDownAtom,
+} from "./history.js"
 
 // ============================================================================
 // Core State Atoms
@@ -535,11 +544,66 @@ function handleAutocompleteKeys(get: any, set: any, key: Key): void {
 	handleTextInputKeys(get, set, key)
 }
 
+/**
+ * History mode keyboard handler
+ * Handles navigation through command history
+ */
+function handleHistoryKeys(get: any, set: any, key: Key): void {
+	switch (key.name) {
+		case "up": {
+			// Navigate to older command
+			const command = set(navigateHistoryUpAtom)
+			if (command !== null) {
+				set(setTextAtom, command)
+			}
+			return
+		}
+
+		case "down": {
+			// Navigate to newer command
+			const command = set(navigateHistoryDownAtom)
+			if (command !== null) {
+				set(setTextAtom, command)
+			}
+			return
+		}
+
+		default:
+			// Any other key exits history mode
+			set(exitHistoryModeAtom)
+			// Fall through to normal text handling
+			handleTextInputKeys(get, set, key)
+			return
+	}
+}
+
 /**
  * Unified text input keyboard handler
  * Handles both normal (single-line) and multiline text input
  */
 function handleTextInputKeys(get: any, set: any, key: Key) {
+	// Check if we should enter history mode
+	const isEmpty = get(textBufferIsEmptyAtom)
+	const isInHistoryMode = get(historyModeAtom)
+
+	// Enter history mode on up/down when input is empty and not already in history mode
+	if (isEmpty && !isInHistoryMode && (key.name === "up" || key.name === "down")) {
+		const entered = set(enterHistoryModeAtom, "")
+		if (entered) {
+			// Successfully entered history mode
+			// Get the current entry (most recent) and display it
+			const entries = get(historyEntriesAtom)
+			if (entries.length > 0) {
+				const mostRecent = entries[entries.length - 1]
+				if (mostRecent) {
+					set(setTextAtom, mostRecent.prompt)
+				}
+			}
+			return
+		}
+		// If couldn't enter history mode (no history), fall through to normal handling
+	}
+
 	switch (key.name) {
 		// Navigation keys (multiline only)
 		case "up":
@@ -680,11 +744,15 @@ export const keyboardHandlerAtom = atom(null, async (get, set, key: Key) => {
 	const isApprovalPending = get(isApprovalPendingAtom)
 	const isFollowupVisible = get(showFollowupSuggestionsAtom)
 	const isAutocompleteVisible = get(showAutocompleteAtom)
+	const isInHistoryMode = get(historyModeAtom)
 
-	// Mode priority: approval > followup > autocomplete > normal
+	// Mode priority: approval > followup > history > autocomplete > normal
+	// History has higher priority than autocomplete because when navigating history,
+	// the text buffer may contain commands that start with "/" which would trigger autocomplete
 	let mode: InputMode = "normal"
 	if (isApprovalPending) mode = "approval"
 	else if (isFollowupVisible) mode = "followup"
+	else if (isInHistoryMode) mode = "history"
 	else if (isAutocompleteVisible) mode = "autocomplete"
 
 	// Update mode atom
@@ -698,6 +766,8 @@ export const keyboardHandlerAtom = atom(null, async (get, set, key: Key) => {
 			return handleFollowupKeys(get, set, key)
 		case "autocomplete":
 			return handleAutocompleteKeys(get, set, key)
+		case "history":
+			return handleHistoryKeys(get, set, key)
 		default:
 			return handleTextInputKeys(get, set, key)
 	}

+ 147 - 0
cli/src/state/atoms/profile.ts

@@ -0,0 +1,147 @@
+/**
+ * Profile and balance state atoms for Kilocode user data
+ */
+
+import { atom } from "jotai"
+
+/**
+ * Profile data structure from Kilocode API
+ */
+export interface ProfileUser {
+	name?: string
+	email?: string
+	image?: string
+}
+
+export interface UserOrganization {
+	id: string
+	name: string
+	role: string
+}
+
+export interface ProfileData {
+	user?: ProfileUser
+	organizations?: UserOrganization[]
+}
+
+export interface BalanceData {
+	balance: number
+}
+
+/**
+ * Atom to hold profile data
+ */
+export const profileDataAtom = atom<ProfileData | null>(null)
+
+/**
+ * Atom to hold balance data
+ */
+export const balanceDataAtom = atom<BalanceData | null>(null)
+
+/**
+ * Atom to track profile loading state
+ */
+export const profileLoadingAtom = atom<boolean>(false)
+
+/**
+ * Atom to track balance loading state
+ */
+export const balanceLoadingAtom = atom<boolean>(false)
+
+/**
+ * Atom to store profile errors
+ */
+export const profileErrorAtom = atom<string | null>(null)
+
+/**
+ * Atom to store balance errors
+ */
+export const balanceErrorAtom = atom<string | null>(null)
+
+/**
+ * Derived atom to get current organization details
+ * Takes the organizationId as a parameter to avoid circular dependencies
+ * Usage: get(getCurrentOrganization(organizationId))
+ */
+export const getCurrentOrganization = (organizationId: string | undefined) =>
+	atom((get) => {
+		const profileData = get(profileDataAtom)
+
+		if (!profileData?.organizations || !organizationId) {
+			return null
+		}
+
+		return profileData.organizations.find((org) => org.id === organizationId) || null
+	})
+
+/**
+ * Derived atom to check if user has any organizations
+ */
+export const hasOrganizationsAtom = atom((get) => {
+	const profileData = get(profileDataAtom)
+	return (profileData?.organizations?.length ?? 0) > 0
+})
+
+/**
+ * Action atom to update profile data
+ */
+export const updateProfileDataAtom = atom(null, (get, set, data: ProfileData | null) => {
+	set(profileDataAtom, data)
+	set(profileErrorAtom, null)
+})
+
+/**
+ * Action atom to update balance data
+ */
+export const updateBalanceDataAtom = atom(null, (get, set, data: BalanceData | null) => {
+	set(balanceDataAtom, data)
+	set(balanceErrorAtom, null)
+})
+
+/**
+ * Action atom to set profile loading state
+ */
+export const setProfileLoadingAtom = atom(null, (get, set, loading: boolean) => {
+	set(profileLoadingAtom, loading)
+	if (loading) {
+		set(profileErrorAtom, null)
+	}
+})
+
+/**
+ * Action atom to set balance loading state
+ */
+export const setBalanceLoadingAtom = atom(null, (get, set, loading: boolean) => {
+	set(balanceLoadingAtom, loading)
+	if (loading) {
+		set(balanceErrorAtom, null)
+	}
+})
+
+/**
+ * Action atom to set profile error
+ */
+export const setProfileErrorAtom = atom(null, (get, set, error: string | null) => {
+	set(profileErrorAtom, error)
+	set(profileLoadingAtom, false)
+})
+
+/**
+ * Action atom to set balance error
+ */
+export const setBalanceErrorAtom = atom(null, (get, set, error: string | null) => {
+	set(balanceErrorAtom, error)
+	set(balanceLoadingAtom, false)
+})
+
+/**
+ * Action atom to clear all profile data
+ */
+export const clearProfileDataAtom = atom(null, (get, set) => {
+	set(profileDataAtom, null)
+	set(balanceDataAtom, null)
+	set(profileLoadingAtom, false)
+	set(balanceLoadingAtom, false)
+	set(profileErrorAtom, null)
+	set(balanceErrorAtom, null)
+})

+ 29 - 0
cli/src/state/atoms/ui.ts

@@ -112,6 +112,7 @@ export type InputMode =
 	| "approval" // Approval pending (blocks input)
 	| "autocomplete" // Command autocomplete active
 	| "followup" // Followup suggestions active
+	| "history" // History navigation mode
 
 /**
  * Current input mode
@@ -235,6 +236,34 @@ export const lastMessageAtom = atom<CliMessage | null>((get) => {
 	return messages.length > 0 ? (messages[messages.length - 1] ?? null) : null
 })
 
+/**
+ * Derived atom to get the last ask message from extension messages
+ * Returns the most recent unanswered ask message that requires user approval, or null if none exists
+ */
+export const lastAskMessageAtom = atom<ExtensionChatMessage | null>((get) => {
+	const messages = get(chatMessagesAtom)
+
+	// Ask types that require user approval (not auto-handled)
+	const approvalAskTypes = [
+		"tool",
+		"command",
+		"followup",
+		"api_req_failed",
+		"browser_action_launch",
+		"use_mcp_server",
+	]
+
+	// Find the last unanswered ask message that requires approval
+	for (let i = messages.length - 1; i >= 0; i--) {
+		const msg = messages[i]
+		if (msg && msg.type === "ask" && !msg.isAnswered && msg.ask && approvalAskTypes.includes(msg.ask)) {
+			return msg
+		}
+	}
+
+	return null
+})
+
 /**
  * Derived atom to check if there's an active error
  */

+ 5 - 1
cli/src/state/hooks/index.ts

@@ -33,6 +33,10 @@ export type { UseTaskManagementReturn, TodoFilter } from "./useTaskManagement.js
 export { useModelSelection } from "./useModelSelection.js"
 export type { UseModelSelectionReturn } from "./useModelSelection.js"
 
+// Profile hooks
+export { useProfile } from "./useProfile.js"
+export type { UseProfileReturn } from "./useProfile.js"
+
 // Command input hooks
 export { useCommandInput } from "./useCommandInput.js"
 export type { UseCommandInputReturn } from "./useCommandInput.js"
@@ -61,7 +65,7 @@ export { useTheme } from "./useTheme.js"
 export { useApprovalHandler } from "./useApprovalHandler.js"
 export type { UseApprovalHandlerOptions, UseApprovalHandlerReturn } from "./useApprovalHandler.js"
 
-export { useApprovalEffect } from "./useApprovalEffect.js"
+export { useApprovalMonitor } from "./useApprovalMonitor.js"
 
 export { useFollowupSuggestions } from "./useFollowupSuggestions.js"
 export type { UseFollowupSuggestionsReturn } from "./useFollowupSuggestions.js"

+ 40 - 5
cli/src/state/hooks/useApprovalHandler.ts

@@ -16,6 +16,8 @@ import {
 	executeSelectedCallbackAtom,
 	type ApprovalOption,
 } from "../atoms/approval.js"
+import { addAllowedCommandAtom, autoApproveExecuteAllowedAtom } from "../atoms/config.js"
+import { updateChatMessageByTsAtom } from "../atoms/extension.js"
 import { useWebviewMessage } from "./useWebviewMessage.js"
 import type { ExtensionChatMessage } from "../../types/messages.js"
 import { logs } from "../../services/logs.js"
@@ -134,6 +136,14 @@ export function useApprovalHandler(): UseApprovalHandlerReturn {
 					ts: currentPendingApproval.ts,
 				})
 
+				// Mark message as answered locally BEFORE sending response
+				// This prevents lastAskMessageAtom from returning it again
+				const answeredMessage: ExtensionChatMessage = {
+					...currentPendingApproval,
+					isAnswered: true,
+				}
+				store.set(updateChatMessageByTsAtom, answeredMessage)
+
 				await sendAskResponse({
 					response: "yesButtonClicked",
 					...(text && { text }),
@@ -191,6 +201,14 @@ export function useApprovalHandler(): UseApprovalHandlerReturn {
 			try {
 				logs.debug("Rejecting request", "useApprovalHandler", { ask: currentPendingApproval.ask })
 
+				// Mark message as answered locally BEFORE sending response
+				// This prevents lastAskMessageAtom from returning it again
+				const answeredMessage: ExtensionChatMessage = {
+					...currentPendingApproval,
+					isAnswered: true,
+				}
+				store.set(updateChatMessageByTsAtom, answeredMessage)
+
 				await sendAskResponse({
 					response: "noButtonClicked",
 					...(text && { text }),
@@ -223,11 +241,32 @@ export function useApprovalHandler(): UseApprovalHandlerReturn {
 
 			if (selectedOption.action === "approve") {
 				await approve(text, images)
+			} else if (selectedOption.action === "approve-and-remember") {
+				// First add the command pattern to config
+				if (selectedOption.commandPattern) {
+					try {
+						logs.info("Adding command pattern to auto-approval list", "useApprovalHandler", {
+							pattern: selectedOption.commandPattern,
+						})
+						await store.set(addAllowedCommandAtom, selectedOption.commandPattern)
+
+						// Verify the config was updated
+						const updatedAllowed = store.get(autoApproveExecuteAllowedAtom)
+						logs.info("Command pattern added successfully - current allowed list", "useApprovalHandler", {
+							pattern: selectedOption.commandPattern,
+							allowedList: updatedAllowed,
+						})
+					} catch (error) {
+						logs.error("Failed to add command pattern to config", "useApprovalHandler", { error })
+					}
+				}
+				// Then approve the current command
+				await approve(text, images)
 			} else {
 				await reject(text, images)
 			}
 		},
-		[selectedOption, approve, reject],
+		[selectedOption, approve, reject, store],
 	)
 
 	// Set callbacks for keyboard handler to use
@@ -237,10 +276,6 @@ export function useApprovalHandler(): UseApprovalHandlerReturn {
 		setExecuteSelectedCallback(() => executeSelected)
 	}, [approve, reject, executeSelected, setApproveCallback, setRejectCallback, setExecuteSelectedCallback])
 
-	// Note: All auto-approval logic has been moved to useApprovalEffect hook
-	// and the approvalDecision service. This hook now only handles manual
-	// approve/reject actions triggered by user interaction.
-
 	return {
 		pendingApproval,
 		approvalOptions,

+ 85 - 78
cli/src/state/hooks/useApprovalEffect.ts → cli/src/state/hooks/useApprovalMonitor.ts

@@ -1,29 +1,22 @@
 /**
- * Centralized Approval Effect Hook
+ * Centralized Approval Monitor Hook
  *
- * This hook handles all approval orchestration for Ask messages.
- * It replaces the duplicated approval logic that was previously
- * scattered across multiple Ask message components.
+ * This hook monitors extension messages for ask messages and handles all approval orchestration.
+ * It replaces the distributed useApprovalEffect that was previously called from multiple components.
  *
- * RACE CONDITION FIXES:
- * - Uses atomic state operations to prevent duplicate approvals
- * - Single source of truth for approval processing
- * - Proper cleanup when messages are answered
- * - No stale closures - reads state from store at execution time
- * - Prevents re-processing same message on re-renders
+ * Similar to useFollowupHandler, this hook:
+ * - Monitors messages from a single source (chatMessagesAtom via lastAskMessageAtom)
+ * - Handles approval state management centrally
+ * - Executes auto-approval logic when appropriate
+ * - Cleans up when messages are answered
  *
- * @module useApprovalEffect
+ * @module useApprovalMonitor
  */
 
 import { useEffect, useRef } from "react"
 import { useAtomValue, useSetAtom, useStore } from "jotai"
-import type { ExtensionChatMessage } from "../../types/messages.js"
-import {
-	setPendingApprovalAtom,
-	clearPendingApprovalAtom,
-	approvalProcessingAtom,
-	pendingApprovalAtom,
-} from "../atoms/approval.js"
+import { lastAskMessageAtom } from "../atoms/ui.js"
+import { setPendingApprovalAtom, clearPendingApprovalAtom, approvalProcessingAtom } from "../atoms/approval.js"
 import {
 	autoApproveReadAtom,
 	autoApproveReadOutsideAtom,
@@ -51,32 +44,29 @@ import { logs } from "../../services/logs.js"
 import { useApprovalTelemetry } from "./useApprovalTelemetry.js"
 
 /**
- * Hook that orchestrates approval flow for Ask messages
+ * Hook that monitors messages and orchestrates approval flow
  *
  * This hook:
- * 1. Sets the message as pending approval when it arrives
- * 2. Gets the approval decision from the service
- * 3. Executes auto-approve/reject based on the decision
- * 4. Handles timeouts and cleanup
- * 5. Clears pending approval when message is answered
- *
- * IMPORTANT: This is the ONLY place where auto-approval should be triggered.
- * Other components should only set pending approval, not execute approvals.
- *
- * @param message - The Ask message to handle
+ * 1. Watches for new ask messages via lastAskMessageAtom
+ * 2. Sets the message as pending approval when it arrives
+ * 3. Gets the approval decision from the service
+ * 4. Executes auto-approve/reject based on the decision
+ * 5. Handles timeouts and cleanup
+ * 6. Clears pending approval when message is answered
  *
  * @example
  * ```typescript
- * export const AskCommandMessage = ({ message }) => {
- *   useApprovalEffect(message)
+ * export const UI = () => {
+ *   // Call once at the top level
+ *   useApprovalMonitor()
  *
- *   // Just render UI
  *   return <Box>...</Box>
  * }
  * ```
  */
-export function useApprovalEffect(message: ExtensionChatMessage): void {
+export function useApprovalMonitor(): void {
 	const store = useStore()
+	const lastAskMessage = useAtomValue(lastAskMessageAtom)
 	const setPendingApproval = useSetAtom(setPendingApprovalAtom)
 	const clearPendingApproval = useSetAtom(clearPendingApprovalAtom)
 
@@ -105,8 +95,6 @@ export function useApprovalEffect(message: ExtensionChatMessage): void {
 
 	// Track if we've already handled auto-approval for this message timestamp
 	const autoApprovalHandledRef = useRef<Set<number>>(new Set())
-	// Track the last message timestamp we processed to prevent re-processing on re-renders
-	const lastProcessedTsRef = useRef<number | null>(null)
 
 	// Build config object with proper nested structure
 	const config: AutoApprovalConfig = {
@@ -149,83 +137,105 @@ export function useApprovalEffect(message: ExtensionChatMessage): void {
 		},
 	}
 
+	// Track the last message we set as pending (full message snapshot for comparison)
+	const lastPendingRef = useRef<{
+		ts: number
+		partial: boolean
+		text: string
+	} | null>(null)
+
 	// Main effect: handle approval orchestration
 	useEffect(() => {
 		let timeoutId: NodeJS.Timeout | null = null
 
-		// If message is answered, clear pending approval and don't process
-		if (message.isAnswered) {
+		// If no ask message, clear pending approval
+		if (!lastAskMessage) {
 			clearPendingApproval()
+			lastPendingRef.current = null
 			return
 		}
 
-		// Skip if this is a partial message
-		if (message.partial) {
-			return
-		}
-
-		// CRITICAL FIX: Skip if we've already processed this exact message timestamp
-		// This prevents re-processing on re-renders when the message object reference changes
-		if (lastProcessedTsRef.current === message.ts) {
+		// If message is answered, clear pending approval
+		if (lastAskMessage.isAnswered) {
+			clearPendingApproval()
+			lastPendingRef.current = null
 			return
 		}
 
 		// Check if we're already processing this message
 		const processingState = store.get(approvalProcessingAtom)
-		if (processingState.isProcessing && processingState.processingTs === message.ts) {
+		if (processingState.isProcessing && processingState.processingTs === lastAskMessage.ts) {
 			return
 		}
 
-		// Check if this message is already pending
-		const currentPending = store.get(pendingApprovalAtom)
-		if (currentPending?.ts === message.ts) {
-			// Don't set pending again, but continue with auto-approval check
-		} else {
-			// Set pending approval (this will be skipped if already processing)
-			setPendingApproval(message)
-		}
+		// Set as pending if:
+		// 1. This is a new message (different timestamp), OR
+		// 2. The message transitioned from partial to complete (need to update options), OR
+		// 3. The message text changed (for command messages, this means the command is now available)
+		const isNewMessage = !lastPendingRef.current || lastPendingRef.current.ts !== lastAskMessage.ts
+		const transitionedToComplete =
+			lastPendingRef.current &&
+			lastPendingRef.current.ts === lastAskMessage.ts &&
+			lastPendingRef.current.partial &&
+			!lastAskMessage.partial
+		const textChanged =
+			lastPendingRef.current &&
+			lastPendingRef.current.ts === lastAskMessage.ts &&
+			lastPendingRef.current.text !== (lastAskMessage.text || "")
 
-		// Mark this timestamp as processed
-		lastProcessedTsRef.current = message.ts
+		if (isNewMessage || transitionedToComplete || textChanged) {
+			lastPendingRef.current = {
+				ts: lastAskMessage.ts,
+				partial: lastAskMessage.partial || false,
+				text: lastAskMessage.text || "",
+			}
+			setPendingApproval(lastAskMessage)
+		}
 
-		// Handle auto-approval once per message timestamp
-		if (!autoApprovalHandledRef.current.has(message.ts)) {
-			autoApprovalHandledRef.current.add(message.ts)
+		// Handle auto-approval once per message timestamp, but ONLY for complete messages
+		// This allows the approval modal to show for partial messages while preventing premature auto-approval
+		if (!lastAskMessage.partial && !autoApprovalHandledRef.current.has(lastAskMessage.ts)) {
+			autoApprovalHandledRef.current.add(lastAskMessage.ts)
 
 			// Get approval decision from service
-			const decision = getApprovalDecision(message, config, isCIMode)
+			const decision = getApprovalDecision(lastAskMessage, config, isCIMode)
 
 			// Execute based on decision
 			if (decision.action === "auto-approve") {
 				const delay = decision.delay || 0
 
 				if (delay > 0) {
-					logs.info(`Auto-approving ${message.ask} after ${delay / 1000}s delay`, "useApprovalEffect")
+					logs.info(`Auto-approving ${lastAskMessage.ask} after ${delay / 1000}s delay`, "useApprovalMonitor")
 					timeoutId = setTimeout(() => {
-						// Check if message is still pending before approving
-						const currentPending = store.get(pendingApprovalAtom)
-						if (currentPending?.ts === message.ts && !currentPending.isAnswered) {
+						// Check if message is still the current ask before approving
+						const currentAsk = store.get(lastAskMessageAtom)
+						if (currentAsk?.ts === lastAskMessage.ts && !currentAsk.isAnswered) {
 							approve(decision.message).catch((error) => {
-								logs.error(`Failed to auto-approve ${message.ask}`, "useApprovalEffect", { error })
+								logs.error(`Failed to auto-approve ${lastAskMessage.ask}`, "useApprovalMonitor", {
+									error,
+								})
 							})
 						}
 					}, delay)
 				} else {
-					logs.info(`${isCIMode ? "CI mode: " : ""}Auto-approving ${message.ask}`, "useApprovalEffect")
+					logs.info(
+						`${isCIMode ? "CI mode: " : ""}Auto-approving ${lastAskMessage.ask}`,
+						"useApprovalMonitor",
+					)
 					// Track auto-approval
-					approvalTelemetry.trackAutoApproval(message)
+					approvalTelemetry.trackAutoApproval(lastAskMessage)
 					// Execute approval immediately
 					approve(decision.message).catch((error) => {
-						logs.error(`Failed to auto-approve ${message.ask}`, "useApprovalEffect", { error })
+						logs.error(`Failed to auto-approve ${lastAskMessage.ask}`, "useApprovalMonitor", { error })
 					})
 				}
 			} else if (decision.action === "auto-reject") {
-				logs.info(`CI mode: Auto-rejecting ${message.ask}`, "useApprovalEffect")
+				logs.info(`CI mode: Auto-rejecting ${lastAskMessage.ask}`, "useApprovalMonitor")
 				// Track auto-rejection
-				approvalTelemetry.trackAutoRejection(message)
+				approvalTelemetry.trackAutoRejection(lastAskMessage)
 				// Execute rejection immediately
 				reject(decision.message).catch((error) => {
-					logs.error(`CI mode: Failed to auto-reject ${message.ask}`, "useApprovalEffect", { error })
+					logs.error(`CI mode: Failed to auto-reject ${lastAskMessage.ask}`, "useApprovalMonitor", { error })
 				})
 			}
 		}
@@ -237,10 +247,7 @@ export function useApprovalEffect(message: ExtensionChatMessage): void {
 			}
 		}
 	}, [
-		message.ts,
-		message.isAnswered,
-		message.partial,
-		message.ask,
+		lastAskMessage,
 		setPendingApproval,
 		clearPendingApproval,
 		approve,
@@ -248,12 +255,12 @@ export function useApprovalEffect(message: ExtensionChatMessage): void {
 		config,
 		isCIMode,
 		store,
+		approvalTelemetry,
 	])
 
-	// Cleanup: remove timestamp from handled set when message timestamp changes
+	// Cleanup: remove old timestamps to prevent memory leak
 	useEffect(() => {
 		return () => {
-			// Clean up old timestamps to prevent memory leak
 			// Keep only the last 100 timestamps
 			if (autoApprovalHandledRef.current.size > 100) {
 				const timestamps = Array.from(autoApprovalHandledRef.current)
@@ -261,5 +268,5 @@ export function useApprovalEffect(message: ExtensionChatMessage): void {
 				autoApprovalHandledRef.current = new Set(toKeep)
 			}
 		}
-	}, [message.ts])
+	}, [lastAskMessage?.ts])
 }

+ 22 - 1
cli/src/state/hooks/useCommandContext.ts

@@ -11,6 +11,7 @@ import { addMessageAtom, clearMessagesAtom, replaceMessagesAtom } from "../atoms
 import { setModeAtom, providerAtom, updateProviderAtom } from "../atoms/config.js"
 import { routerModelsAtom, extensionStateAtom } from "../atoms/extension.js"
 import { requestRouterModelsAtom } from "../atoms/actions.js"
+import { profileDataAtom, balanceDataAtom, profileLoadingAtom, balanceLoadingAtom } from "../atoms/profile.js"
 import { useWebviewMessage } from "./useWebviewMessage.js"
 import { getModelIdKey } from "../../constants/providers/models.js"
 
@@ -66,6 +67,12 @@ export function useCommandContext(): UseCommandContextReturn {
 	const extensionState = useAtomValue(extensionStateAtom)
 	const kilocodeDefaultModel = extensionState?.kilocodeDefaultModel || ""
 
+	// Get profile state
+	const profileData = useAtomValue(profileDataAtom)
+	const balanceData = useAtomValue(balanceDataAtom)
+	const profileLoading = useAtomValue(profileLoadingAtom)
+	const balanceLoading = useAtomValue(balanceLoadingAtom)
+
 	// Create the factory function
 	const createContext = useCallback<CommandContextFactory>(
 		(input: string, args: string[], options: Record<string, any>, onExit: () => void): CommandContext => {
@@ -94,7 +101,7 @@ export function useCommandContext(): UseCommandContextReturn {
 				exit: () => {
 					onExit()
 				},
-				// New model-related context
+				// Model-related context
 				routerModels,
 				currentProvider: currentProvider || null,
 				kilocodeDefaultModel,
@@ -111,6 +118,15 @@ export function useCommandContext(): UseCommandContextReturn {
 				refreshRouterModels: async () => {
 					await refreshRouterModels()
 				},
+				// Provider update function for teams command
+				updateProvider: async (providerId: string, updates: any) => {
+					await updateProvider(providerId, updates)
+				},
+				// Profile data context
+				profileData,
+				balanceData,
+				profileLoading,
+				balanceLoading,
 			}
 		},
 		[
@@ -124,6 +140,11 @@ export function useCommandContext(): UseCommandContextReturn {
 			kilocodeDefaultModel,
 			updateProvider,
 			refreshRouterModels,
+			replaceMessages,
+			profileData,
+			balanceData,
+			profileLoading,
+			balanceLoading,
 		],
 	)
 

+ 7 - 0
cli/src/state/hooks/useCommandInput.ts

@@ -34,6 +34,7 @@ import { textBufferStringAtom } from "../atoms/textBuffer.js"
 import { routerModelsAtom, extensionStateAtom } from "../atoms/extension.js"
 import { providerAtom, updateProviderAtom } from "../atoms/config.js"
 import { requestRouterModelsAtom } from "../atoms/actions.js"
+import { profileDataAtom, profileLoadingAtom } from "../atoms/profile.js"
 import { getModelIdKey } from "../../constants/providers/models.js"
 
 /**
@@ -144,6 +145,8 @@ export function useCommandInput(): UseCommandInputReturn {
 	const currentProvider = useAtomValue(providerAtom)
 	const extensionState = useAtomValue(extensionStateAtom)
 	const kilocodeDefaultModel = extensionState?.kilocodeDefaultModel || ""
+	const profileData = useAtomValue(profileDataAtom)
+	const profileLoading = useAtomValue(profileLoadingAtom)
 
 	// Write atoms
 	const setInputAction = useSetAtom(updateTextBufferAtom)
@@ -205,6 +208,8 @@ export function useCommandInput(): UseCommandInputReturn {
 				routerModels,
 				currentProvider: currentProvider || null,
 				kilocodeDefaultModel,
+				profileData,
+				profileLoading,
 				updateProviderModel: async (modelId: string) => {
 					if (!currentProvider) {
 						throw new Error("No provider configured")
@@ -234,6 +239,8 @@ export function useCommandInput(): UseCommandInputReturn {
 		routerModels,
 		currentProvider,
 		kilocodeDefaultModel,
+		profileData,
+		profileLoading,
 		updateProvider,
 		refreshRouterModels,
 	])

+ 154 - 0
cli/src/state/hooks/useProfile.ts

@@ -0,0 +1,154 @@
+/**
+ * Hook for managing Kilocode profile and balance data
+ */
+
+import { useSetAtom, useAtomValue } from "jotai"
+import { useCallback, useEffect, useRef } from "react"
+import {
+	profileDataAtom,
+	balanceDataAtom,
+	profileLoadingAtom,
+	balanceLoadingAtom,
+	profileErrorAtom,
+	balanceErrorAtom,
+	setProfileLoadingAtom,
+	setBalanceLoadingAtom,
+	setProfileErrorAtom,
+	setBalanceErrorAtom,
+	hasOrganizationsAtom,
+	getCurrentOrganization,
+	type ProfileData,
+	type BalanceData,
+} from "../atoms/profile.js"
+import { providerAtom } from "../atoms/config.js"
+import { useWebviewMessage } from "./useWebviewMessage.js"
+
+/**
+ * Return type for useProfile hook
+ */
+export interface UseProfileReturn {
+	// Data
+	profileData: ProfileData | null
+	balanceData: BalanceData | null
+	currentOrganization: ReturnType<typeof getCurrentOrganization> | null
+	hasOrganizations: boolean
+
+	// Loading states
+	profileLoading: boolean
+	balanceLoading: boolean
+
+	// Errors
+	profileError: string | null
+	balanceError: string | null
+
+	// Actions
+	fetchProfile: () => Promise<void>
+	fetchBalance: () => Promise<void>
+	fetchAll: () => Promise<void>
+}
+
+/**
+ * Hook for managing Kilocode profile and balance data
+ *
+ * Provides access to profile data, balance, organizations, and methods to fetch data.
+ * Automatically handles loading states and errors.
+ *
+ */
+export function useProfile(): UseProfileReturn {
+	// Get atoms
+	const profileData = useAtomValue(profileDataAtom)
+	const balanceData = useAtomValue(balanceDataAtom)
+	const profileLoading = useAtomValue(profileLoadingAtom)
+	const balanceLoading = useAtomValue(balanceLoadingAtom)
+	const profileError = useAtomValue(profileErrorAtom)
+	const balanceError = useAtomValue(balanceErrorAtom)
+	const hasOrganizations = useAtomValue(hasOrganizationsAtom)
+	const currentProvider = useAtomValue(providerAtom)
+
+	// Get action atoms
+	const setProfileLoading = useSetAtom(setProfileLoadingAtom)
+	const setBalanceLoading = useSetAtom(setBalanceLoadingAtom)
+	const setProfileError = useSetAtom(setProfileErrorAtom)
+	const setBalanceError = useSetAtom(setBalanceErrorAtom)
+
+	// Get webview message sender
+	const { sendMessage } = useWebviewMessage()
+
+	// Get current organization
+	const currentOrganization = currentProvider?.kilocodeOrganizationId
+		? getCurrentOrganization(currentProvider.kilocodeOrganizationId)
+		: null
+
+	/**
+	 * Fetch profile data from the extension
+	 */
+	const fetchProfile = useCallback(async () => {
+		setProfileLoading(true)
+		try {
+			await sendMessage({
+				type: "fetchProfileDataRequest",
+			})
+		} catch (error) {
+			setProfileError(error instanceof Error ? error.message : "Failed to fetch profile")
+		}
+	}, [sendMessage, setProfileLoading, setProfileError])
+
+	/**
+	 * Fetch balance data from the extension
+	 */
+	const fetchBalance = useCallback(async () => {
+		setBalanceLoading(true)
+		try {
+			await sendMessage({
+				type: "fetchBalanceDataRequest",
+			})
+		} catch (error) {
+			setBalanceError(error instanceof Error ? error.message : "Failed to fetch balance")
+		}
+	}, [sendMessage, setBalanceLoading, setBalanceError])
+
+	/**
+	 * Fetch both profile and balance data
+	 */
+	const fetchAll = useCallback(async () => {
+		await Promise.all([fetchProfile(), fetchBalance()])
+	}, [fetchProfile, fetchBalance])
+
+	// Track if initial fetch has been triggered
+	const initialFetchTriggered = useRef(false)
+
+	// Automatically fetch profile and balance data on mount if using Kilocode provider
+	useEffect(() => {
+		if (
+			!initialFetchTriggered.current &&
+			currentProvider?.provider === "kilocode" &&
+			currentProvider?.kilocodeToken &&
+			!profileData &&
+			!profileLoading
+		) {
+			initialFetchTriggered.current = true
+			fetchAll()
+		}
+	}, [currentProvider, profileData, profileLoading, fetchAll])
+
+	return {
+		// Data
+		profileData,
+		balanceData,
+		currentOrganization,
+		hasOrganizations,
+
+		// Loading states
+		profileLoading,
+		balanceLoading,
+
+		// Errors
+		profileError,
+		balanceError,
+
+		// Actions
+		fetchProfile,
+		fetchBalance,
+		fetchAll,
+	}
+}

+ 21 - 2
cli/src/ui/UI.tsx

@@ -9,6 +9,7 @@ import { useAtomValue, useSetAtom } from "jotai"
 import { isStreamingAtom, errorAtom, addMessageAtom } from "../state/atoms/ui.js"
 import { setCIModeAtom } from "../state/atoms/ci.js"
 import { configValidationAtom } from "../state/atoms/config.js"
+import { addToHistoryAtom, resetHistoryNavigationAtom, exitHistoryModeAtom } from "../state/atoms/history.js"
 import { MessageDisplay } from "./messages/MessageDisplay.js"
 import { CommandInput } from "./components/CommandInput.js"
 import { StatusBar } from "./components/StatusBar.js"
@@ -18,6 +19,8 @@ import { isCommandInput } from "../services/autocomplete.js"
 import { useCommandHandler } from "../state/hooks/useCommandHandler.js"
 import { useMessageHandler } from "../state/hooks/useMessageHandler.js"
 import { useFollowupHandler } from "../state/hooks/useFollowupHandler.js"
+import { useApprovalMonitor } from "../state/hooks/useApprovalMonitor.js"
+import { useProfile } from "../state/hooks/useProfile.js"
 import { useCIMode } from "../state/hooks/useCIMode.js"
 import { useTheme } from "../state/hooks/useTheme.js"
 import { AppOptions } from "./App.js"
@@ -42,6 +45,9 @@ export const UI: React.FC<UIAppProps> = ({ options, onExit }) => {
 	// Initialize CI mode configuration
 	const setCIMode = useSetAtom(setCIModeAtom)
 	const addMessage = useSetAtom(addMessageAtom)
+	const addToHistory = useSetAtom(addToHistoryAtom)
+	const resetHistoryNavigation = useSetAtom(resetHistoryNavigationAtom)
+	const exitHistoryMode = useSetAtom(exitHistoryModeAtom)
 
 	// Use specialized hooks for command and message handling
 	const { executeCommand, isExecuting: isExecutingCommand } = useCommandHandler()
@@ -52,6 +58,12 @@ export const UI: React.FC<UIAppProps> = ({ options, onExit }) => {
 	// Followup handler hook for automatic suggestion population
 	useFollowupHandler()
 
+	// Approval monitor hook for centralized approval handling
+	useApprovalMonitor()
+
+	// Profile hook for handling profile/balance data responses
+	useProfile()
+
 	// CI mode hook for automatic exit
 	const { shouldExit, exitReason } = useCIMode({
 		enabled: options.ci || false,
@@ -111,6 +123,13 @@ export const UI: React.FC<UIAppProps> = ({ options, onExit }) => {
 			const trimmedInput = input.trim()
 			if (!trimmedInput) return
 
+			// Add to history
+			await addToHistory(trimmedInput)
+
+			// Exit history mode and reset navigation state
+			exitHistoryMode()
+			resetHistoryNavigation()
+
 			// Determine if it's a command or regular message
 			if (isCommandInput(trimmedInput)) {
 				// Handle as command
@@ -120,7 +139,7 @@ export const UI: React.FC<UIAppProps> = ({ options, onExit }) => {
 				await sendUserMessage(trimmedInput)
 			}
 		},
-		[executeCommand, sendUserMessage, onExit],
+		[executeCommand, sendUserMessage, onExit, addToHistory, resetHistoryNavigation, exitHistoryMode],
 	)
 
 	// Determine if any operation is in progress
@@ -174,7 +193,7 @@ export const UI: React.FC<UIAppProps> = ({ options, onExit }) => {
 			</Box>
 
 			{error && (
-				<Box borderStyle="single" borderColor={theme.semantic.error} paddingX={1} marginY={1}>
+				<Box borderStyle="round" borderColor={theme.semantic.error} paddingX={1} marginY={1}>
 					<Text color={theme.semantic.error}>⚠ {error}</Text>
 				</Box>
 			)}

+ 6 - 2
cli/src/ui/components/ApprovalMenu.tsx

@@ -22,12 +22,16 @@ export const ApprovalMenu: React.FC<ApprovalMenuProps> = ({ options, selectedInd
 	}
 
 	return (
-		<Box flexDirection="column" borderStyle="single" borderColor={theme.actions.pending} paddingX={1}>
+		<Box flexDirection="column" borderStyle="round" borderColor={theme.actions.pending} paddingX={1}>
 			<Text bold color={theme.actions.pending}>
 				[!] Action Required:
 			</Text>
 			{options.map((option, index) => (
-				<ApprovalOptionRow key={option.action} option={option} isSelected={index === selectedIndex} />
+				<ApprovalOptionRow
+					key={option.key || `${option.action}-${index}`}
+					option={option}
+					isSelected={index === selectedIndex}
+				/>
 			))}
 		</Box>
 	)

+ 1 - 1
cli/src/ui/components/AutocompleteMenu.tsx

@@ -64,7 +64,7 @@ const SuggestionsMenu: React.FC<SuggestionsMenuProps> = ({ type, suggestions, se
 	const borderColor = type === "command" ? theme.ui.border.default : theme.ui.border.active
 
 	return (
-		<Box flexDirection="column" borderStyle="single" borderColor={borderColor} paddingX={1}>
+		<Box flexDirection="column" borderStyle="round" borderColor={borderColor} paddingX={1}>
 			<Text bold color={theme.semantic.info}>
 				{title}
 			</Text>

+ 1 - 1
cli/src/ui/components/CommandInput.tsx

@@ -61,7 +61,7 @@ export const CommandInput: React.FC<CommandInputProps> = ({
 		<Box flexDirection="column">
 			{/* Input field */}
 			<Box
-				borderStyle="single"
+				borderStyle="round"
 				borderColor={isApprovalPending ? theme.actions.pending : theme.ui.border.active}
 				paddingX={1}>
 				<Text color={isApprovalPending ? theme.actions.pending : theme.ui.border.active} bold>

+ 1 - 1
cli/src/ui/components/FollowupSuggestionsMenu.tsx

@@ -26,7 +26,7 @@ export const FollowupSuggestionsMenu: React.FC<FollowupSuggestionsMenuProps> = (
 	}
 
 	return (
-		<Box flexDirection="column" borderStyle="single" borderColor={theme.actions.pending} paddingX={1}>
+		<Box flexDirection="column" borderStyle="round" borderColor={theme.actions.pending} paddingX={1}>
 			<Text bold color={theme.actions.pending}>
 				Suggestions:
 			</Text>

+ 1 - 1
cli/src/ui/components/StatusBar.tsx

@@ -125,7 +125,7 @@ export const StatusBar: React.FC = () => {
 	const gitStatusColor = gitInfo.isClean ? theme.semantic.success : theme.semantic.warning
 
 	return (
-		<Box borderStyle="single" borderColor={theme.ui.border.default} paddingX={1} justifyContent="space-between">
+		<Box borderStyle="round" borderColor={theme.ui.border.default} paddingX={1} justifyContent="space-between">
 			{/* Left side: Project and Git Branch */}
 			<Box>
 				{/* Project Name */}

+ 1 - 1
cli/src/ui/components/StatusIndicator.tsx

@@ -40,7 +40,7 @@ export const StatusIndicator: React.FC<StatusIndicatorProps> = ({ disabled = fal
 	}
 
 	return (
-		<Box borderStyle="single" borderColor={theme.ui.border.default} paddingX={1} justifyContent="space-between">
+		<Box borderStyle="round" borderColor={theme.ui.border.default} paddingX={1} justifyContent="space-between">
 			{/* Status text on the left */}
 			<Box>
 				{isStreaming && <Text color={theme.ui.text.dimmed}>Thinking...</Text>}

+ 0 - 1
cli/src/ui/messages/MessageRow.tsx

@@ -9,7 +9,6 @@ interface MessageRowProps {
 }
 
 export const MessageRow: React.FC<MessageRowProps> = ({ unifiedMessage }) => {
-	//logs.debug("Message", "MessageRow", { unifiedMessage })
 	if (unifiedMessage.source === "cli") {
 		return <CliMessageRow message={unifiedMessage.message} />
 	}

+ 2 - 1
cli/src/ui/messages/cli/CliMessageRow.tsx

@@ -60,7 +60,8 @@ export const CliMessageRow: React.FC<CliMessageRowProps> = ({ message }) => {
 		<Box flexDirection="column" marginBottom={1}>
 			<Box>
 				<Text color={getColor()} bold>
-					{getPrefix()}{" "}
+					{getPrefix()}
+					{"  "}
 				</Text>
 				<MarkdownText>{message.content}</MarkdownText>
 				{message.partial && (

+ 1 - 2
cli/src/ui/messages/extension/ExtensionMessageRow.tsx

@@ -14,7 +14,7 @@ interface ExtensionMessageRowProps {
 function ErrorFallback({ error }: { error: Error }) {
 	const theme = useTheme()
 	return (
-		<Box width={BOX_L1} borderColor={theme.semantic.error} borderStyle="single" padding={1} marginY={1}>
+		<Box width={BOX_L1} borderColor={theme.semantic.error} borderStyle="round" padding={1} marginY={1}>
 			<Text color={theme.semantic.error}>Error rendering message: {error.message}</Text>
 		</Box>
 	)
@@ -22,7 +22,6 @@ function ErrorFallback({ error }: { error: Error }) {
 
 export const ExtensionMessageRow: React.FC<ExtensionMessageRowProps> = ({ message }) => {
 	const theme = useTheme()
-	//logs.debug("Rendering ExtensionMessageRow", "ExtensionMessageRow", { message })
 
 	return (
 		<ErrorBoundary fallbackRender={ErrorFallback}>

+ 1 - 3
cli/src/ui/messages/extension/ask/AskBrowserActionLaunchMessage.tsx

@@ -2,16 +2,14 @@ import React from "react"
 import { Box, Text } from "ink"
 import type { MessageComponentProps } from "../types.js"
 import { getMessageIcon } from "../utils.js"
-import { useApprovalEffect } from "../../../../state/hooks/useApprovalEffect.js"
 import { useTheme } from "../../../../state/hooks/useTheme.js"
 
 /**
  * Display browser action launch request
+ * Approval is handled centrally by useApprovalMonitor in UI.tsx
  */
 export const AskBrowserActionLaunchMessage: React.FC<MessageComponentProps> = ({ message }) => {
 	const theme = useTheme()
-	// Use centralized approval orchestration
-	useApprovalEffect(message)
 
 	const icon = getMessageIcon("ask", "browser_action_launch")
 

+ 1 - 3
cli/src/ui/messages/extension/ask/AskCommandMessage.tsx

@@ -2,17 +2,15 @@ import React from "react"
 import { Box, Text } from "ink"
 import type { MessageComponentProps } from "../types.js"
 import { getMessageIcon, parseToolData } from "../utils.js"
-import { useApprovalEffect } from "../../../../state/hooks/useApprovalEffect.js"
 import { useTheme } from "../../../../state/hooks/useTheme.js"
 import { BOX_L3 } from "../../../utils/width.js"
 
 /**
  * Display command execution request with terminal icon and command in a bordered box
+ * Approval is handled centrally by useApprovalMonitor in UI.tsx
  */
 export const AskCommandMessage: React.FC<MessageComponentProps> = ({ message }) => {
 	const theme = useTheme()
-	// Use centralized approval orchestration
-	useApprovalEffect(message)
 
 	const icon = getMessageIcon("ask", "command")
 	const toolData = parseToolData(message)

+ 1 - 3
cli/src/ui/messages/extension/ask/AskToolMessage.tsx

@@ -2,18 +2,16 @@ import React from "react"
 import { Box, Text } from "ink"
 import type { MessageComponentProps } from "../types.js"
 import { parseToolData, getToolIcon } from "../utils.js"
-import { useApprovalEffect } from "../../../../state/hooks/useApprovalEffect.js"
 import { useTheme } from "../../../../state/hooks/useTheme.js"
 import { BOX_L3 } from "../../../utils/width.js"
 
 /**
  * Display tool usage requests requiring approval
  * Parses tool data and shows tool information
+ * Approval is handled centrally by useApprovalMonitor in UI.tsx
  */
 export const AskToolMessage: React.FC<MessageComponentProps> = ({ message }) => {
 	const theme = useTheme()
-	// Use centralized approval orchestration
-	useApprovalEffect(message)
 
 	const toolData = parseToolData(message)
 

+ 1 - 3
cli/src/ui/messages/extension/ask/AskUseMcpServerMessage.tsx

@@ -2,17 +2,15 @@ import React from "react"
 import { Box, Text } from "ink"
 import type { MessageComponentProps } from "../types.js"
 import { getMessageIcon, parseMcpServerData } from "../utils.js"
-import { useApprovalEffect } from "../../../../state/hooks/useApprovalEffect.js"
 import { useTheme } from "../../../../state/hooks/useTheme.js"
 import { BOX_L3 } from "../../../utils/width.js"
 
 /**
  * Display MCP server usage request (tool or resource access)
+ * Approval is handled centrally by useApprovalMonitor in UI.tsx
  */
 export const AskUseMcpServerMessage: React.FC<MessageComponentProps> = ({ message }) => {
 	const theme = useTheme()
-	// Use centralized approval orchestration
-	useApprovalEffect(message)
 
 	const icon = getMessageIcon("ask", "use_mcp_server")
 	const mcpData = parseMcpServerData(message)

+ 1 - 1
cli/src/ui/messages/extension/say/SayCommandOutputMessage.tsx

@@ -18,7 +18,7 @@ export const SayCommandOutputMessage: React.FC<MessageComponentProps> = ({ messa
 
 	return (
 		<Box flexDirection="column" marginBottom={1}>
-			<Box width={BOX_L1} borderStyle="single" borderColor={theme.ui.border.default} paddingX={1}>
+			<Box width={BOX_L1} borderStyle="round" borderColor={theme.ui.border.default} paddingX={1}>
 				<Text color={theme.ui.text.dimmed} dimColor>
 					{text}
 				</Text>

+ 1 - 1
cli/src/ui/messages/extension/say/SayErrorMessage.tsx

@@ -14,7 +14,7 @@ export const SayErrorMessage: React.FC<MessageComponentProps> = ({ message }) =>
 		<Box
 			width={BOX_L1}
 			flexDirection="column"
-			borderStyle="single"
+			borderStyle="round"
 			borderColor={theme.semantic.error}
 			paddingX={1}
 			marginY={1}>

+ 1 - 1
cli/src/ui/messages/extension/tools/ToolReadFileMessage.tsx

@@ -19,7 +19,7 @@ export const ToolReadFileMessage: React.FC<ToolMessageProps> = ({ toolData }) =>
 			<Box
 				width={BOX_L1}
 				flexDirection="column"
-				borderStyle="single"
+				borderStyle="round"
 				borderColor={theme.messages.user}
 				paddingX={1}
 				marginY={1}>

+ 1 - 8
cli/src/ui/messages/extension/tools/ToolRouter.tsx

@@ -1,7 +1,6 @@
 import React from "react"
 import { Box, Text } from "ink"
 import type { ToolMessageProps } from "../types.js"
-import { useApprovalEffect } from "../../../../state/hooks/useApprovalEffect.js"
 import { useTheme } from "../../../../state/hooks/useTheme.js"
 import {
 	ToolEditedExistingFileMessage,
@@ -25,16 +24,10 @@ import {
 
 /**
  * Routes tool data to the appropriate component based on tool type
- *
- * RACE CONDITION FIX:
- * - Removed duplicate approval logic (now handled by useApprovalEffect)
- * - This component only handles routing and rendering
+ * Approval is handled centrally by useApprovalMonitor in UI.tsx
  */
 export const ToolRouter: React.FC<ToolMessageProps> = ({ message, toolData }) => {
 	const theme = useTheme()
-	// Use centralized approval orchestration
-	// This handles all approval logic including auto-approval
-	useApprovalEffect(message)
 
 	switch (toolData.tool) {
 		case "editedExistingFile":

+ 0 - 54
cli/src/ui/messages/utils/messageCompletion.ts

@@ -9,7 +9,6 @@ import type { UnifiedMessage } from "../../../state/atoms/ui.js"
 import type { ExtensionChatMessage } from "../../../types/messages.js"
 import type { CliMessage } from "../../../types/cli.js"
 import { parseApiReqInfo } from "../extension/utils.js"
-import { logs } from "../../../services/logs.js"
 
 /**
  * Determines if a CLI message is complete
@@ -17,12 +16,6 @@ import { logs } from "../../../services/logs.js"
  */
 function isCliMessageComplete(message: CliMessage): boolean {
 	const isComplete = message.partial !== true
-	logs.debug("CLI message completion check", "messageCompletion", {
-		id: message.id,
-		type: message.type,
-		partial: message.partial,
-		isComplete,
-	})
 	return isComplete
 }
 
@@ -38,12 +31,6 @@ function isCliMessageComplete(message: CliMessage): boolean {
 function isExtensionMessageComplete(message: ExtensionChatMessage): boolean {
 	// Handle partial flag first - if partial is explicitly true, not complete
 	if (message.partial === true) {
-		logs.debug("Extension message incomplete: partial=true", "messageCompletion", {
-			ts: message.ts,
-			type: message.type,
-			say: message.say,
-			ask: message.ask,
-		})
 		return false
 	}
 
@@ -52,13 +39,6 @@ function isExtensionMessageComplete(message: ExtensionChatMessage): boolean {
 	if (message.say === "api_req_started") {
 		const apiInfo = parseApiReqInfo(message)
 		const isComplete = !!(apiInfo?.streamingFailedMessage || apiInfo?.cancelReason || apiInfo?.cost !== undefined)
-		logs.debug("api_req_started completion check", "messageCompletion", {
-			ts: message.ts,
-			hasStreamingFailed: !!apiInfo?.streamingFailedMessage,
-			hasCancelReason: !!apiInfo?.cancelReason,
-			hasCost: apiInfo?.cost !== undefined,
-			isComplete,
-		})
 		return isComplete
 	}
 
@@ -67,10 +47,6 @@ function isExtensionMessageComplete(message: ExtensionChatMessage): boolean {
 		// These ask types don't render, so they're immediately complete
 		const nonRenderingAskTypes = ["completion_result", "command_output"]
 		if (message.ask && nonRenderingAskTypes.includes(message.ask)) {
-			logs.debug("Ask message complete (non-rendering type)", "messageCompletion", {
-				ts: message.ts,
-				ask: message.ask,
-			})
 			return true
 		}
 
@@ -78,25 +54,9 @@ function isExtensionMessageComplete(message: ExtensionChatMessage): boolean {
 		// They don't need to wait for isAnswered since they're just displaying
 		// the request and waiting for user interaction
 		const isComplete = !message.partial
-		logs.debug("Ask message completion check", "messageCompletion", {
-			ts: message.ts,
-			ask: message.ask,
-			isAnswered: message.isAnswered,
-			isAnsweredType: typeof message.isAnswered,
-			partial: message.partial,
-			isComplete,
-			reason: isComplete ? "not partial" : "still partial",
-		})
 		return isComplete
 	}
 
-	// All other messages are complete if not partial
-	logs.debug("Extension message complete (default)", "messageCompletion", {
-		ts: message.ts,
-		type: message.type,
-		say: message.say,
-		partial: message.partial,
-	})
 	return true
 }
 
@@ -129,10 +89,6 @@ function deduplicateCheckpointMessages(messages: UnifiedMessage[]): UnifiedMessa
 			const hash = msg.message.text.trim()
 			if (seenCheckpointHashes.has(hash)) {
 				// Skip duplicate checkpoint
-				logs.debug("Skipping duplicate checkpoint message", "messageCompletion", {
-					ts: msg.message.ts,
-					hash,
-				})
 				continue
 			}
 			seenCheckpointHashes.add(hash)
@@ -211,16 +167,6 @@ export function splitMessages(messages: UnifiedMessage[]): {
 	const staticMessages = deduplicatedMessages.slice(0, lastCompleteIndex + 1)
 	const dynamicMessages = deduplicatedMessages.slice(lastCompleteIndex + 1)
 
-	logs.debug("Message split summary", "messageCompletion", {
-		originalCount: messages.length,
-		deduplicatedCount: deduplicatedMessages.length,
-		totalMessages: deduplicatedMessages.length,
-		staticCount: staticMessages.length,
-		dynamicCount: dynamicMessages.length,
-		lastCompleteIndex,
-		incompleteReasons: incompleteReasons.length > 0 ? incompleteReasons : "All messages complete",
-	})
-
 	return {
 		staticMessages,
 		dynamicMessages,

+ 75 - 0
cli/src/utils/authWizard.ts

@@ -0,0 +1,75 @@
+import inquirer from "inquirer"
+import { loadConfig, saveConfig, CLIConfig } from "../config"
+import openConfigFile from "../config/openConfig"
+import wait from "../utils/wait"
+
+export default async function authWizard() {
+	const config = await loadConfig()
+	let providerSpecificConfig: Record<string, string> = {}
+
+	const providerOptions = [
+		{ name: "Kilo Code", value: "kilocode" },
+		{ name: "zAI", value: "zai" },
+		{ name: "Other", value: "other" },
+	] as const
+	type ProviderOption = (typeof providerOptions)[number]["value"]
+
+	const { provider } = await inquirer.prompt<{ provider: ProviderOption; kilocodeToken: string }>([
+		{
+			type: "list",
+			name: "provider",
+			message: "Please select which provider you would like to use:",
+			choices: providerOptions,
+		},
+	])
+
+	switch (provider) {
+		case "kilocode": {
+			console.info(
+				"\nPlease navigate to https://app.kilocode.ai and copy your API key from the bottom of the page!\n",
+			)
+			const { kilocodeToken } = await inquirer.prompt<{ kilocodeToken: string }>([
+				{
+					type: "password",
+					name: "kilocodeToken",
+					message: "API Key:",
+				},
+			])
+			providerSpecificConfig = { kilocodeToken, kilocodeModel: "anthropic/claude-sonnet-4.5" }
+			break
+		}
+		case "zai": {
+			const { zaiApiKey } = await inquirer.prompt<{ zaiApiKey: string }>([
+				{
+					type: "password",
+					name: "zaiApiKey",
+					message: "Please enter your zAI token:",
+				},
+			])
+			providerSpecificConfig = { zaiApiKey }
+			break
+		}
+		case "other": {
+			console.info("Please manually add your provider setttings to the config file.")
+			console.info(
+				"Check out https://github.com/Kilo-Org/kilocode/blob/main/cli/docs/PROVIDER_CONFIGURATION.md to see potential configuration options",
+			)
+			await wait(1500)
+			await openConfigFile()
+			return
+		}
+	}
+
+	const newConfig = {
+		...config.config,
+		providers: [
+			{
+				id: "default",
+				provider,
+				...providerSpecificConfig,
+			},
+		],
+	}
+
+	await saveConfig(newConfig as CLIConfig)
+}

+ 5 - 0
cli/src/utils/wait.ts

@@ -0,0 +1,5 @@
+export default async function wait(t: number) {
+	return new Promise((resolve) => {
+		setTimeout(resolve, t)
+	})
+}

+ 1 - 1
flake.nix

@@ -21,7 +21,7 @@
         libnotify
         jetbrains.idea-community
         jetbrains.jdk
-        jdk17
+        jdk21
         gradle
         unzip
         # Build tools for native modules

+ 1 - 0
jetbrains/plugin/.gitignore

@@ -3,6 +3,7 @@
 # SPDX-License-Identifier: Apache-2.0
 
 .gradle
+.intellijPlatform/
 build/
 !gradle/wrapper/gradle-wrapper.jar
 !**/src/main/**/build/

+ 218 - 122
jetbrains/plugin/build.gradle.kts

@@ -15,10 +15,10 @@ buildscript {
 
 plugins {
     id("java")
-    id("org.jetbrains.kotlin.jvm") version "1.8.10"
-    id("org.jetbrains.intellij") version "1.17.4"
+    id("org.jetbrains.kotlin.jvm") version "2.0.21"
+    id("org.jetbrains.intellij.platform") version "2.10.0"
     id("org.jlleitschuh.gradle.ktlint") version "11.6.1"
-    id("io.gitlab.arturbosch.detekt") version "1.23.4"
+    id("io.gitlab.arturbosch.detekt") version "1.23.7"
 }
 
 apply("genPlatform.gradle")
@@ -61,117 +61,82 @@ project.afterEvaluate {
     tasks.findByName(":prepareSandbox")?.inputs?.properties?.put("build_mode", ext.get("debugMode"))
 }
 
-fun Sync.prepareSandbox() {
-    // Set duplicate strategy to include files, with later sources taking precedence
-    duplicatesStrategy = DuplicatesStrategy.INCLUDE
-    
-    if (ext.get("debugMode") == "idea") {
-        from("${project.projectDir.absolutePath}/src/main/resources/themes/") {
-            into("${ext.get("debugResource")}/${ext.get("vscodePlugin")}/integrations/theme/default-themes/")
-        }
-        doLast {
-            val vscodePluginDir = File("${ext.get("debugResource")}/${ext.get("vscodePlugin")}")
-            vscodePluginDir.mkdirs()
-            File(vscodePluginDir, ".env").createNewFile()
-        }
-    } else {
-        val vscodePluginDir = File("./plugins/${ext.get("vscodePlugin")}")
-        if (!vscodePluginDir.exists()) {
-            throw IllegalStateException("missing plugin dir")
-        }
-        val list = mutableListOf<String>()
-        val depfile = File("prodDep.txt")
-        if (!depfile.exists()) {
-            throw IllegalStateException("missing prodDep.txt")
-        }
-        depfile.readLines().let {
-            it.forEach { line ->
-                list.add(line.substringAfterLast("node_modules/") + "/**")
-            }
-        }
-
-        from("../host/dist") { into("${intellij.pluginName.get()}/runtime/") }
-        from("../host/package.json") { into("${intellij.pluginName.get()}/runtime/") }
-        
-        // First copy host node_modules
-        from("../resources/node_modules") {
-            into("${intellij.pluginName.get()}/node_modules/")
-            list.forEach {
-                include(it)
-            }
-        }
-
-        from("${vscodePluginDir.path}/extension") { into("${intellij.pluginName.get()}/${ext.get("vscodePlugin")}") }
-        from("src/main/resources/themes/") { into("${intellij.pluginName.get()}/${ext.get("vscodePlugin")}/integrations/theme/default-themes/") }
-        
-        // The platform.zip file required for release mode is associated with the code in ../base/vscode, currently using version 1.100.0. If upgrading this code later
-        // Need to modify the vscodeVersion value in gradle.properties, then execute the task named genPlatform, which will generate a new platform.zip file for submission
-        // To support new architectures, modify according to the logic in genPlatform.gradle script
-        if (ext.get("debugMode") == "release") {
-            // Check if platform.zip file exists and is larger than 1MB, otherwise throw exception
-            val platformZip = File("platform.zip")
-            if (platformZip.exists() && platformZip.length() >= 1024 * 1024) {
-                // Extract platform.zip to the platform subdirectory under the project build directory
-                val platformDir = File("${layout.buildDirectory.get().asFile}/platform")
-                platformDir.mkdirs()
-                copy {
-                    from(zipTree(platformZip))
-                    into(platformDir)
-                }
-            } else {
-                throw IllegalStateException("platform.zip file does not exist or is smaller than 1MB. This file is supported through git lfs and needs to be obtained through git lfs")
-            }
-
-            from(File(layout.buildDirectory.get().asFile, "platform/platform.txt")) { into("${intellij.pluginName.get()}/") }
-            // Copy platform node_modules last to ensure it takes precedence over host node_modules
-            from(File(layout.buildDirectory.get().asFile, "platform/node_modules")) { into("${intellij.pluginName.get()}/node_modules") }
-        }
-
-        doLast {
-            File("${destinationDir}/${intellij.pluginName.get()}/${ext.get("vscodePlugin")}/.env").createNewFile()
-        }
-    }
-}
 
 group = properties("pluginGroup").get()
 version = properties("pluginVersion").get()
 
 repositories {
     mavenCentral()
+
+    intellijPlatform {
+        defaultRepositories()
+    }
 }
 
 dependencies {
     implementation("com.squareup.okhttp3:okhttp:4.10.0")
     implementation("com.google.code.gson:gson:2.10.1")
     testImplementation("junit:junit:4.13.2")
-    detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.4")
+    detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.7")
+
+    intellijPlatform {
+        create(properties("platformType"), properties("platformVersion"))
+
+        // Bundled plugins
+        bundledPlugins(
+            listOf(
+                "com.intellij.java",
+                "org.jetbrains.plugins.terminal",
+            ),
+        )
+
+        // Plugin verifier
+        pluginVerifier()
+
+        // Instrumentation tools
+        instrumentationTools()
+    }
 }
 
-// Configure Java toolchain to force Java 17
+// Configure Java toolchain to force Java 21
 java {
-    sourceCompatibility = JavaVersion.VERSION_17
-    targetCompatibility = JavaVersion.VERSION_17
+    sourceCompatibility = JavaVersion.VERSION_21
+    targetCompatibility = JavaVersion.VERSION_21
     toolchain {
-        languageVersion.set(JavaLanguageVersion.of(17))
+        languageVersion.set(JavaLanguageVersion.of(21))
     }
 }
 
-// Configure Gradle IntelliJ Plugin
-// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html
-intellij {
-    version = properties("platformVersion")
-    type = properties("platformType")
-
-    plugins.set(
-        listOf(
-            "com.intellij.java",
-            // Add JCEF support
-            "org.jetbrains.plugins.terminal"
-        )
-    )
+// Configure IntelliJ Platform Gradle Plugin 2.x
+// Read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin.html
+intellijPlatform {
+    pluginConfiguration {
+        version = properties("pluginVersion")
+
+        ideaVersion {
+            sinceBuild = properties("pluginSinceBuild")
+            untilBuild = provider { null }
+        }
+    }
+
+    pluginVerification {
+        ides {
+            recommended()
+        }
+    }
 }
 
 tasks {
+    // Configure test task to disable CDS (Class Data Sharing) to avoid warning:
+    // "Archived non-system classes are disabled because the java.system.class.loader
+    // property is specified (value = "com.intellij.util.lang.PathClassLoader")"
+    //
+    // IntelliJ Platform uses a custom PathClassLoader which conflicts with CDS's
+    // archived non-system classes feature. Disabling CDS for tests eliminates the
+    // warning while maintaining test functionality. Production builds are unaffected.
+    withType<Test> {
+        jvmArgs("-Xshare:off")
+    }
 
     // Create task for generating configuration files
     register("generateConfigProperties") {
@@ -187,9 +152,146 @@ tasks {
             println("Configuration file generated: ${configFile.absolutePath}")
         }
     }
+    
 
+    buildPlugin {
+        dependsOn(prepareSandbox)
+        
+        // Include the jetbrains directory contents from sandbox in the distribution root
+        doLast {
+            if (ext.get("debugMode") != "idea" && ext.get("debugMode") != "none") {
+                val distributionFile = archiveFile.get().asFile
+                val sandboxPluginsDir = layout.buildDirectory.get().asFile.resolve("idea-sandbox/IC-2024.3/plugins")
+                val jetbrainsDir = sandboxPluginsDir.resolve("jetbrains")
+                
+                if (jetbrainsDir.exists() && distributionFile.exists()) {
+                    logger.lifecycle("Adding sandbox resources to distribution ZIP...")
+                    logger.lifecycle("Sandbox jetbrains dir: ${jetbrainsDir.absolutePath}")
+                    logger.lifecycle("Distribution file: ${distributionFile.absolutePath}")
+                    
+                    // Extract the existing ZIP
+                    val tempDir = layout.buildDirectory.get().asFile.resolve("temp-dist")
+                    tempDir.deleteRecursively()
+                    tempDir.mkdirs()
+                    
+                    copy {
+                        from(zipTree(distributionFile))
+                        into(tempDir)
+                    }
+                    
+                    // Copy jetbrains directory CONTENTS directly to plugin root (not the jetbrains folder itself)
+                    val pluginDir = tempDir.resolve(rootProject.name)
+                    copy {
+                        from(jetbrainsDir) // Copy contents of jetbrains dir
+                        into(pluginDir)     // Directly into plugin root
+                    }
+                    
+                    // Re-create the ZIP with resources included
+                    distributionFile.delete()
+                    ant.invokeMethod("zip", mapOf(
+                        "destfile" to distributionFile.absolutePath,
+                        "basedir" to tempDir.absolutePath
+                    ))
+                    
+                    // Clean up temp directory
+                    tempDir.deleteRecursively()
+                    
+                    logger.lifecycle("Distribution ZIP updated with sandbox resources at root level")
+                }
+            }
+        }
+    }
+    
     prepareSandbox {
-        prepareSandbox()
+        dependsOn("generateConfigProperties")
+        duplicatesStrategy = DuplicatesStrategy.INCLUDE
+        
+        if (ext.get("debugMode") == "idea") {
+            from("${project.projectDir.absolutePath}/src/main/resources/themes/") {
+                into("${ext.get("debugResource")}/${ext.get("vscodePlugin")}/integrations/theme/default-themes/")
+            }
+            doLast {
+                val vscodePluginDir = File("${ext.get("debugResource")}/${ext.get("vscodePlugin")}")
+                vscodePluginDir.mkdirs()
+                File(vscodePluginDir, ".env").createNewFile()
+            }
+        } else if (ext.get("debugMode") != "none") {
+            doFirst {
+                // Validate required files exist
+                val vscodePluginDir = File("./plugins/${ext.get("vscodePlugin")}")
+                if (!vscodePluginDir.exists()) {
+                    throw IllegalStateException("missing plugin dir: ${vscodePluginDir.absolutePath}")
+                }
+                val depfile = File("prodDep.txt")
+                if (!depfile.exists()) {
+                    throw IllegalStateException("missing prodDep.txt")
+                }
+                
+                // Handle platform.zip for release mode
+                if (ext.get("debugMode") == "release") {
+                    val platformZip = File("platform.zip")
+                    if (!platformZip.exists() || platformZip.length() < 1024 * 1024) {
+                        throw IllegalStateException("platform.zip file does not exist or is smaller than 1MB. This file is supported through git lfs and needs to be obtained through git lfs")
+                    }
+                    
+                    // Extract platform.zip to the platform subdirectory under the project build directory
+                    val platformDir = File("${layout.buildDirectory.get().asFile}/platform")
+                    platformDir.mkdirs()
+                    copy {
+                        from(zipTree(platformZip))
+                        into(platformDir)
+                    }
+                }
+            }
+            
+            val vscodePluginDir = File("./plugins/${ext.get("vscodePlugin")}")
+            val depfile = File("prodDep.txt")
+            val list = mutableListOf<String>()
+            
+            // Read dependencies during execution
+            doFirst {
+                depfile.readLines().forEach { line ->
+                    list.add(line.substringAfterLast("node_modules/") + "/**")
+                }
+            }
+
+            val pluginName = properties("pluginGroup").get().split(".").last()
+
+            // Copy host runtime files
+            from("../host/dist") { into("$pluginName/runtime/") }
+            from("../host/package.json") { into("$pluginName/runtime/") }
+
+            // Copy host node_modules based on prodDep.txt
+            from("../resources/node_modules") {
+                into("$pluginName/node_modules/")
+                doFirst {
+                    list.forEach {
+                        include(it)
+                    }
+                }
+            }
+
+            // Copy VSCode plugin extension
+            from("${vscodePluginDir.path}/extension") { into("$pluginName/${ext.get("vscodePlugin")}") }
+            
+            // Copy themes
+            from("src/main/resources/themes/") { into("$pluginName/${ext.get("vscodePlugin")}/integrations/theme/default-themes/") }
+
+            // Copy platform files for release mode
+            if (ext.get("debugMode") == "release") {
+                val platformDir = File("${layout.buildDirectory.get().asFile}/platform")
+                from(File(platformDir, "platform.txt")) { into("$pluginName/") }
+                // Copy platform node_modules last to ensure it takes precedence over host node_modules
+                from(File(platformDir, "node_modules")) { into("$pluginName/node_modules") }
+            }
+
+            doLast {
+                File("$destinationDir/$pluginName/${ext.get("vscodePlugin")}/.env").apply {
+                    parentFile.mkdirs()
+                    createNewFile()
+                }
+            }
+        }
     }
 
     // Generate configuration file before compilation
@@ -200,20 +302,14 @@ tasks {
     // Set the JVM compatibility versions
     withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
         dependsOn("generateConfigProperties")
-        kotlinOptions {
-            jvmTarget = "17"
+        compilerOptions {
+            jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21)
         }
     }
 
     withType<JavaCompile> {
-        sourceCompatibility = "17"
-        targetCompatibility = "17"
-    }
-
-    patchPluginXml {
-        version.set(properties("pluginVersion"))
-        sinceBuild.set(properties("pluginSinceBuild"))
-        untilBuild.set("")
+        sourceCompatibility = "21"
+        targetCompatibility = "21"
     }
 
     signPlugin {
@@ -229,20 +325,20 @@ tasks {
     // Convert the extension's JSON translation files to JetBrains ResourceBundle .properties format
     register("convertTranslations") {
         description = "Convert JSON translation files to the native ResourceBundle .properties format"
-        
+
         val sourceDir = file("../../src/i18n/locales")
         val targetDir = file("src/main/resources/messages")
-        
+
         inputs.dir(sourceDir)
         outputs.dir(targetDir)
-        
+
         doLast {
             if (!sourceDir.exists()) {
                 throw IllegalStateException("Source translation directory not found: ${sourceDir.absolutePath}")
             }
-            
+
             targetDir.mkdirs()
-            
+
             // Find all JSON bundles (jetbrains.json, kilocode.json, etc.)
             val jsonBundles = mutableSetOf<String>()
             sourceDir.listFiles()?.forEach { localeDir ->
@@ -253,7 +349,7 @@ tasks {
                 }
             }
             println("Found translation bundles: ${jsonBundles.joinToString(", ")}")
-            
+
             jsonBundles.forEach { bundleName ->
                 convertBundleToProperties(sourceDir, targetDir, bundleName)
             }
@@ -264,13 +360,12 @@ tasks {
     named("processResources") {
         dependsOn("convertTranslations")
     }
-
 }
 
 // Helper function to convert JSON bundle to .properties files
 fun convertBundleToProperties(sourceDir: File, targetDir: File, bundleName: String) {
     val gson = com.google.gson.Gson()
-    
+
     sourceDir.listFiles()?.forEach { localeDir ->
         if (localeDir.isDirectory) {
             val jsonFile = File(localeDir, "$bundleName.json")
@@ -278,24 +373,24 @@ fun convertBundleToProperties(sourceDir: File, targetDir: File, bundleName: Stri
                 try {
                     val locale = localeDir.name
                     val capitalizedBundleName = bundleName.replaceFirstChar { it.uppercase() }
-                    
+
                     // Determine properties file name
                     val propertiesFileName = if (locale == "en") {
                         "${capitalizedBundleName}Bundle.properties"
                     } else {
                         "${capitalizedBundleName}Bundle_${locale.replace("-", "_")}.properties"
                     }
-                    
+
                     val propertiesFile = File(targetDir, propertiesFileName)
-                    
+
                     // Parse JSON
                     val jsonContent = jsonFile.readText()
                     val jsonObject = gson.fromJson(jsonContent, com.google.gson.JsonObject::class.java)
-                    
+
                     // Convert to flat properties
                     val properties = mutableMapOf<String, String>()
                     flattenJsonObject(jsonObject, "", properties)
-                    
+
                     // Write properties file
                     propertiesFile.writeText("# Auto-generated from $bundleName.json - do not edit directly\n")
                     properties.toSortedMap().forEach { (key, value) ->
@@ -309,12 +404,11 @@ fun convertBundleToProperties(sourceDir: File, targetDir: File, bundleName: Stri
                             .replace(":", "\\:")
                             .replace("#", "\\#")
                             .replace("!", "\\!")
-                        
+
                         propertiesFile.appendText("$key=$escapedValue\n")
                     }
-                    
+
                     println("  → $locale: ${properties.size} keys → $propertiesFileName")
-                    
                 } catch (e: Exception) {
                     throw RuntimeException("Failed to convert $jsonFile", e)
                 }
@@ -329,7 +423,7 @@ fun flattenJsonObject(jsonObject: com.google.gson.JsonObject, prefix: String, pr
         val key = entry.key
         val element = entry.value
         val fullKey = if (prefix.isEmpty()) key else "$prefix.$key"
-        
+
         when {
             element.isJsonObject -> {
                 flattenJsonObject(element.asJsonObject, fullKey, properties)
@@ -363,11 +457,13 @@ ktlint {
 
 // Configure detekt
 detekt {
-    toolVersion = "1.23.4"
+    toolVersion = "1.23.7"
     config.setFrom(file("detekt.yml"))
     buildUponDefaultConfig = true
     allRules = false
-    
+}
+
+tasks.withType<io.gitlab.arturbosch.detekt.Detekt>().configureEach {
     reports {
         html.required.set(true)
         xml.required.set(true)

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor