Просмотр исходного кода

Merge branch 'main' into catrielmuller/cli-always-approve-commands-option

Catriel Müller 4 месяцев назад
Родитель
Сommit
377efee9fd
63 измененных файлов с 1346 добавлено и 1141 удалено
  1. 5 0
      .changeset/cute-states-stop.md
  2. 0 5
      .changeset/eager-cloths-return.md
  3. 0 5
      .changeset/fancy-windows-wave.md
  4. 0 5
      .changeset/honest-jeans-design.md
  5. 5 0
      .changeset/neat-steaks-add.md
  6. 0 5
      .changeset/old-rivers-pay.md
  7. 0 5
      .changeset/pink-monkeys-cross.md
  8. 0 5
      .changeset/real-bottles-smoke.md
  9. 5 0
      .changeset/small-monkeys-attack.md
  10. 1 1
      .changeset/wise-berries-work.md
  11. 27 0
      CHANGELOG.md
  12. 8 2
      apps/kilocode-docs/docs/seats/about.md
  13. 27 3
      apps/kilocode-docs/docs/seats/analytics.md
  14. 29 71
      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. 261 254
      apps/kilocode-docs/docusaurus.config.ts
  22. 0 1
      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. 10 0
      cli/CHANGELOG.md
  33. 1 1
      cli/package.dist.json
  34. 1 1
      cli/package.json
  35. 2 0
      packages/types/src/kilocode/native-function-calling.ts
  36. 1 1
      packages/types/src/provider-settings.ts
  37. 10 1
      packages/types/src/providers/synthetic.ts
  38. 5 3
      packages/types/src/providers/zai.ts
  39. 9 0
      pnpm-lock.yaml
  40. 1 0
      src/api/providers/__tests__/anthropic-vertex.spec.ts
  41. 15 15
      src/api/providers/__tests__/zai.spec.ts
  42. 23 21
      src/api/providers/anthropic-vertex.ts
  43. 3 5
      src/api/providers/bedrock.ts
  44. 0 4
      src/core/task/Task.ts
  45. 0 2
      src/core/task/__tests__/Task.spec.ts
  46. 1 1
      src/core/tools/__tests__/generateImageTool.test.ts
  47. 28 2
      src/core/tools/browserActionTool.ts
  48. 1 1
      src/core/tools/generateImageTool.ts
  49. 14 2
      src/core/webview/webviewMessageHandler.ts
  50. 2 2
      src/package.json
  51. 28 0
      src/services/ghost/GhostProvider.ts
  52. 244 0
      src/services/ghost/__tests__/GhostProvider.spec.ts
  53. 14 0
      src/shared/WebviewMessage.ts
  54. 2 26
      webview-ui/src/components/chat/ChatRow.tsx
  55. 1 1
      webview-ui/src/components/settings/ApiOptions.tsx
  56. 4 2
      webview-ui/src/components/settings/ImageGenerationSettings.tsx
  57. 1 1
      webview-ui/src/components/ui/hooks/useSelectedModel.ts
  58. 7 7
      webview-ui/src/i18n/locales/zh-CN/kilocode.json
  59. 2 2
      webview-ui/src/i18n/locales/zh-CN/settings.json
  60. 14 14
      webview-ui/src/i18n/locales/zh-TW/kilocode.json
  61. 6 6
      webview-ui/src/i18n/locales/zh-TW/settings.json
  62. 10 0
      webview-ui/src/utils/globalStateHelpers.ts
  63. 1 1
      webview-ui/src/utils/vscode.ts

+ 5 - 0
.changeset/cute-states-stop.md

@@ -0,0 +1,5 @@
+---
+"kilo-code": patch
+---
+
+Do not accept an autocomplete suggestion with shift-tab or ctrl-tab (only plain tab)

+ 0 - 5
.changeset/eager-cloths-return.md

@@ -1,5 +0,0 @@
----
-"kilo-code": minor
----
-
-Fix bug: autocomplete no longer suggests strange XML

+ 0 - 5
.changeset/fancy-windows-wave.md

@@ -1,5 +0,0 @@
----
-"@kilocode/cli": patch
----
-
-Support Kilo Code for Teams

+ 0 - 5
.changeset/honest-jeans-design.md

@@ -1,5 +0,0 @@
----
-"kilo-code": patch
----
-
-Added Amazon Bedrock as a provider for autocomplete

+ 5 - 0
.changeset/neat-steaks-add.md

@@ -0,0 +1,5 @@
+---
+"kilo-code": patch
+---
+
+Update Synthetic Provider to support GLM 4.6, and enable native tool calling

+ 0 - 5
.changeset/old-rivers-pay.md

@@ -1,5 +0,0 @@
----
-"@kilocode/cli": patch
----
-
-Fix compatibility with extension v4.107.0

+ 0 - 5
.changeset/pink-monkeys-cross.md

@@ -1,5 +0,0 @@
----
-"@kilocode/cli": patch
----
-
-Improved install speed and fixed the outdated dependencies

+ 0 - 5
.changeset/real-bottles-smoke.md

@@ -1,5 +0,0 @@
----
-"kilo-code": patch
----
-
-Jetbrains - Update framework (Plugin now requires IntelliJ IDEA 2024.3 or later)

+ 5 - 0
.changeset/small-monkeys-attack.md

@@ -0,0 +1,5 @@
+---
+"kilo-code": patch
+---
+
+Improve Chinese translation of autocomplete-related terms

+ 1 - 1
.changeset/wise-berries-work.md

@@ -2,4 +2,4 @@
 "@kilocode/cli": patch
 ---
 
-Prompt history
+Added prompt history. Use your up/down keys to navigate through previous prompts!

+ 27 - 0
CHANGELOG.md

@@ -1,5 +1,32 @@
 # kilo-code
 
+## [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

+ 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.

+ 29 - 71
apps/kilocode-docs/docs/seats/billing.md

@@ -4,34 +4,25 @@ sidebar_label: Billing & Credits
 
 # Billing & 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 model credits with zero markup.
 
-## Understanding the Billing Model
+:::note
 
-### Monthly Subscription
+Kilo Code seats purchases of Teams or Enterprise are separate from model provider credits.
 
-**Enterprise:**
+No 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 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 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-tokens), 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.

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

@@ -1,269 +1,276 @@
-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;
+	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

+ 0 - 1
apps/kilocode-docs/sidebars.ts

@@ -105,7 +105,6 @@ const sidebars: SidebarsConfig = {
 				"seats/dashboard",
 				"seats/analytics",
 				"seats/team-management",
-				"seats/roles-permissions",
 				"seats/custom-modes",
 				"seats/billing",
 				{

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"

+ 10 - 0
cli/CHANGELOG.md

@@ -1,5 +1,15 @@
 # @kilocode/cli
 
+## 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

+ 1 - 1
cli/package.dist.json

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

+ 1 - 1
cli/package.json

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

+ 2 - 0
packages/types/src/kilocode/native-function-calling.ts

@@ -17,6 +17,8 @@ export const nativeFunctionCallingProviders = [
 	"deepinfra",
 	"xai",
 	"zai",
+	"synthetic",
+	"human-relay",
 ] satisfies ProviderName[] as ProviderName[]
 
 const modelsDefaultingToNativeFunctionCalls = ["anthropic/claude-haiku-4.5"]

+ 1 - 1
packages/types/src/provider-settings.ts

@@ -449,7 +449,7 @@ const virtualQuotaFallbackSchema = baseProviderSettingsSchema.extend({
 })
 // kilocode_change end
 
-export const zaiApiLineSchema = z.enum(["international_coding", "international", "china_coding", "china"])
+export const zaiApiLineSchema = z.enum(["international_coding", "china_coding"])
 
 export type ZaiApiLine = z.infer<typeof zaiApiLineSchema>
 

+ 10 - 1
packages/types/src/providers/synthetic.ts

@@ -3,6 +3,7 @@
 import type { ModelInfo } from "../model.js"
 
 export type SyntheticModelId =
+	| "hf:zai-org/GLM-4.6"
 	| "hf:zai-org/GLM-4.5"
 	| "hf:openai/gpt-oss-120b"
 	| "hf:moonshotai/Kimi-K2-Instruct-0905"
@@ -22,7 +23,7 @@ export type SyntheticModelId =
 	| "hf:Qwen/Qwen3-235B-A22B-Thinking-2507"
 	| "hf:Qwen/Qwen3-235B-A22B-Instruct-2507"
 
-export const syntheticDefaultModelId: SyntheticModelId = "hf:zai-org/GLM-4.5"
+export const syntheticDefaultModelId: SyntheticModelId = "hf:zai-org/GLM-4.6"
 
 export const syntheticModels = {
 	"hf:moonshotai/Kimi-K2-Instruct-0905": {
@@ -51,6 +52,14 @@ export const syntheticModels = {
 		inputPrice: 0.55,
 		outputPrice: 2.19,
 	},
+	"hf:zai-org/GLM-4.6": {
+		maxTokens: 200000,
+		contextWindow: 200000,
+		supportsImages: false,
+		supportsPromptCache: false,
+		inputPrice: 0.55,
+		outputPrice: 2.19,
+	},
 	"hf:reissbaker/llama-3.1-70b-abliterated-lora": {
 		maxTokens: 128000,
 		contextWindow: 128000,

+ 5 - 3
packages/types/src/providers/zai.ts

@@ -181,7 +181,9 @@ export const zaiApiLineConfigs = {
 		baseUrl: "https://api.z.ai/api/coding/paas/v4",
 		isChina: false,
 	},
-	international: { name: "International Standard", baseUrl: "https://api.z.ai/api/paas/v4", isChina: false },
-	china_coding: { name: "China Coding Plan", baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4", isChina: true },
-	china: { name: "China Standard", baseUrl: "https://open.bigmodel.cn/api/paas/v4", isChina: true },
+	china_coding: {
+		name: "China Coding Plan",
+		baseUrl: "https://open.bigmodel.cn/api/coding/paas/v4",
+		isChina: true,
+	},
 } satisfies Record<ZaiApiLine, { name: string; baseUrl: string; isChina: boolean }>

+ 9 - 0
pnpm-lock.yaml

@@ -518,9 +518,18 @@ importers:
       react-icons:
         specifier: ^5.5.0
         version: 5.5.0([email protected])
+      react-markdown:
+        specifier: ^9.0.3
+        version: 9.1.0(@types/[email protected])([email protected])
       recharts:
         specifier: ^2.15.3
         version: 2.15.4([email protected]([email protected]))([email protected])
+      rehype-raw:
+        specifier: ^7.0.0
+        version: 7.0.0
+      remark-gfm:
+        specifier: ^4.0.1
+        version: 4.0.1
       tailwind-merge:
         specifier: ^3.3.0
         version: 3.3.0

+ 1 - 0
src/api/providers/__tests__/anthropic-vertex.spec.ts

@@ -60,6 +60,7 @@ describe("VertexHandler", () => {
 			})
 
 			expect(AnthropicVertex).toHaveBeenCalledWith({
+				baseURL: "https://aiplatform.googleapis.com/v1", // kilocode_change
 				projectId: "test-project",
 				region: "us-central1",
 			})

+ 15 - 15
src/api/providers/__tests__/zai.spec.ts

@@ -43,21 +43,21 @@ describe("ZAiHandler", () => {
 
 	describe("International Z AI", () => {
 		beforeEach(() => {
-			handler = new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international" })
+			handler = new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international_coding" })
 		})
 
 		it("should use the correct international Z AI base URL", () => {
-			new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international" })
+			new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international_coding" })
 			expect(OpenAI).toHaveBeenCalledWith(
 				expect.objectContaining({
-					baseURL: "https://api.z.ai/api/paas/v4",
+					baseURL: "https://api.z.ai/api/coding/paas/v4",
 				}),
 			)
 		})
 
 		it("should use the provided API key for international", () => {
 			const zaiApiKey = "test-zai-api-key"
-			new ZAiHandler({ zaiApiKey, zaiApiLine: "international" })
+			new ZAiHandler({ zaiApiKey, zaiApiLine: "international_coding" })
 			expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({ apiKey: zaiApiKey }))
 		})
 
@@ -72,7 +72,7 @@ describe("ZAiHandler", () => {
 			const handlerWithModel = new ZAiHandler({
 				apiModelId: testModelId,
 				zaiApiKey: "test-zai-api-key",
-				zaiApiLine: "international",
+				zaiApiLine: "international_coding",
 			})
 			const model = handlerWithModel.getModel()
 			expect(model.id).toBe(testModelId)
@@ -84,7 +84,7 @@ describe("ZAiHandler", () => {
 			const handlerWithModel = new ZAiHandler({
 				apiModelId: testModelId,
 				zaiApiKey: "test-zai-api-key",
-				zaiApiLine: "international",
+				zaiApiLine: "international_coding",
 			})
 			const model = handlerWithModel.getModel()
 			expect(model.id).toBe(testModelId)
@@ -95,19 +95,19 @@ describe("ZAiHandler", () => {
 
 	describe("China Z AI", () => {
 		beforeEach(() => {
-			handler = new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "china" })
+			handler = new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "china_coding" })
 		})
 
 		it("should use the correct China Z AI base URL", () => {
-			new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "china" })
+			new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "china_coding" })
 			expect(OpenAI).toHaveBeenCalledWith(
-				expect.objectContaining({ baseURL: "https://open.bigmodel.cn/api/paas/v4" }),
+				expect.objectContaining({ baseURL: "https://open.bigmodel.cn/api/coding/paas/v4" }),
 			)
 		})
 
 		it("should use the provided API key for China", () => {
 			const zaiApiKey = "test-zai-api-key"
-			new ZAiHandler({ zaiApiKey, zaiApiLine: "china" })
+			new ZAiHandler({ zaiApiKey, zaiApiLine: "china_coding" })
 			expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({ apiKey: zaiApiKey }))
 		})
 
@@ -122,7 +122,7 @@ describe("ZAiHandler", () => {
 			const handlerWithModel = new ZAiHandler({
 				apiModelId: testModelId,
 				zaiApiKey: "test-zai-api-key",
-				zaiApiLine: "china",
+				zaiApiLine: "china_coding",
 			})
 			const model = handlerWithModel.getModel()
 			expect(model.id).toBe(testModelId)
@@ -134,7 +134,7 @@ describe("ZAiHandler", () => {
 			const handlerWithModel = new ZAiHandler({
 				apiModelId: testModelId,
 				zaiApiKey: "test-zai-api-key",
-				zaiApiLine: "china",
+				zaiApiLine: "china_coding",
 			})
 			const model = handlerWithModel.getModel()
 			expect(model.id).toBe(testModelId)
@@ -158,14 +158,14 @@ describe("ZAiHandler", () => {
 		})
 
 		it("should use 'not-provided' as default API key when none is specified", () => {
-			new ZAiHandler({ zaiApiLine: "international" })
+			new ZAiHandler({ zaiApiLine: "international_coding" })
 			expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({ apiKey: "not-provided" }))
 		})
 	})
 
 	describe("API Methods", () => {
 		beforeEach(() => {
-			handler = new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international" })
+			handler = new ZAiHandler({ zaiApiKey: "test-zai-api-key", zaiApiLine: "international_coding" })
 		})
 
 		it("completePrompt method should return text from Z AI API", async () => {
@@ -238,7 +238,7 @@ describe("ZAiHandler", () => {
 			const handlerWithModel = new ZAiHandler({
 				apiModelId: modelId,
 				zaiApiKey: "test-zai-api-key",
-				zaiApiLine: "international",
+				zaiApiLine: "international_coding",
 			})
 
 			mockCreate.mockImplementationOnce(() => {

+ 23 - 21
src/api/providers/anthropic-vertex.ts

@@ -34,27 +34,29 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple
 		const projectId = this.options.vertexProjectId ?? "not-provided"
 		const region = this.options.vertexRegion ?? "us-east5"
 
-		if (this.options.vertexJsonCredentials) {
-			this.client = new AnthropicVertex({
-				projectId,
-				region,
-				googleAuth: new GoogleAuth({
-					scopes: ["https://www.googleapis.com/auth/cloud-platform"],
-					credentials: safeJsonParse<JWTInput>(this.options.vertexJsonCredentials, undefined),
-				}),
-			})
-		} else if (this.options.vertexKeyFile) {
-			this.client = new AnthropicVertex({
-				projectId,
-				region,
-				googleAuth: new GoogleAuth({
-					scopes: ["https://www.googleapis.com/auth/cloud-platform"],
-					keyFile: this.options.vertexKeyFile,
-				}),
-			})
-		} else {
-			this.client = new AnthropicVertex({ projectId, region })
-		}
+		//kilocode_change start
+		// Manually construct the baseURL because the format has changed (there are no longer
+		// dedicated hosts), but the required updated Anthropic libraries have significant
+		// breaking changes for other parts of the application.
+		const updatedBaseUrl = `https://aiplatform.googleapis.com/v1`
+
+		const googleAuthConfig =
+			this.options.vertexJsonCredentials || this.options.vertexKeyFile
+				? {
+						scopes: ["https://www.googleapis.com/auth/cloud-platform"],
+						...(this.options.vertexJsonCredentials
+							? { credentials: safeJsonParse<JWTInput>(this.options.vertexJsonCredentials, undefined) }
+							: { keyFile: this.options.vertexKeyFile }),
+					}
+				: undefined
+
+		this.client = new AnthropicVertex({
+			baseURL: updatedBaseUrl,
+			projectId,
+			region,
+			...(googleAuthConfig && { googleAuth: new GoogleAuth(googleAuthConfig) }),
+		})
+		//kilocode_change end
 	}
 
 	override async *createMessage(

+ 3 - 5
src/api/providers/bedrock.ts

@@ -27,6 +27,7 @@ import {
 import { ApiStream } from "../transform/stream"
 import { BaseProvider } from "./base-provider"
 import { logger } from "../../utils/logging"
+import { Package } from "../../shared/package"
 import { MultiPointStrategy } from "../transform/cache-strategy/multi-point-strategy"
 import { ModelInfo as CacheModelInfo } from "../transform/cache-strategy/types"
 import { convertToBedrockConverseMessages as sharedConverter } from "../transform/bedrock-converse-format"
@@ -217,11 +218,8 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH
 
 		this.costModelConfig = this.getModel()
 
-		// Extended type to support custom authentication properties
-		const clientConfig: BedrockRuntimeClientConfig & {
-			token?: { token: string }
-			authSchemePreference?: string[]
-		} = {
+		const clientConfig: BedrockRuntimeClientConfig = {
+			defaultUserAgentProvider: () => Promise.resolve([["KiloCode", Package.version]]),
 			region: this.options.awsRegion,
 			// Add the endpoint configuration when specified and enabled
 			...(this.options.awsBedrockEndpoint &&

+ 0 - 4
src/core/task/Task.ts

@@ -1853,9 +1853,6 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
 			await this.say(
 				"api_req_started",
 				JSON.stringify({
-					request:
-						currentUserContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n") +
-						"\n\nLoading...",
 					apiProtocol,
 				}),
 			)
@@ -1905,7 +1902,6 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
 			const lastApiReqIndex = findLastIndex(this.clineMessages, (m) => m.say === "api_req_started")
 
 			this.clineMessages[lastApiReqIndex].text = JSON.stringify({
-				request: finalUserContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n"),
 				apiProtocol,
 			} satisfies ClineApiReqInfo)
 

+ 0 - 2
src/core/task/__tests__/Task.spec.ts

@@ -720,7 +720,6 @@ describe("Cline", () => {
 							tokensOut: 50,
 							cacheWrites: 0,
 							cacheReads: 0,
-							request: "test request",
 						}),
 					},
 				]
@@ -846,7 +845,6 @@ describe("Cline", () => {
 							tokensOut: 50,
 							cacheWrites: 0,
 							cacheReads: 0,
-							request: "test request",
 						}),
 					},
 				]

+ 1 - 1
src/core/tools/__tests__/generateImageTool.test.ts

@@ -47,7 +47,7 @@ describe("generateImageTool", () => {
 							[EXPERIMENT_IDS.IMAGE_GENERATION]: true,
 						},
 						openRouterImageApiKey: "test-api-key",
-						openRouterImageGenerationSelectedModel: "google/gemini-2.5-flash-image-preview",
+						openRouterImageGenerationSelectedModel: "google/gemini-2.5-flash-image",
 					}),
 				}),
 			},

+ 28 - 2
src/core/tools/browserActionTool.ts

@@ -8,6 +8,32 @@ import {
 } from "../../shared/ExtensionMessage"
 import { formatResponse } from "../prompts/responses"
 
+function toStringlyTyped_kilocode(value: string | number[] | object | null | undefined): string | undefined {
+	if (typeof value === "string") {
+		console.debug("toStringlyTyped: returning string as-is", value)
+		return value
+	}
+	if (Array.isArray(value)) {
+		console.debug(
+			"toStringlyTyped: model returned an array, this is not allowed by either the XML or JSON tool.",
+			value,
+		)
+		return value.join(",")
+	}
+	if (value && typeof value === "object") {
+		if ("x" in value && "y" in value) {
+			console.debug("toStringlyTyped: x,y object", value)
+			return `${value.x},${value.y}`
+		}
+		if ("width" in value && "height" in value) {
+			console.debug("toStringlyTyped: width,height object", value)
+			return `${value.width},${value.height}`
+		}
+	}
+	console.debug("toStringlyTyped: returning undefined", value)
+	return undefined
+}
+
 export async function browserActionTool(
 	cline: Task,
 	block: ToolUse,
@@ -18,9 +44,9 @@ export async function browserActionTool(
 ) {
 	const action: BrowserAction | undefined = block.params.action as BrowserAction
 	const url: string | undefined = block.params.url
-	const coordinate: string | undefined = block.params.coordinate
+	const coordinate: string | undefined = toStringlyTyped_kilocode(block.params.coordinate)
 	const text: string | undefined = block.params.text
-	const size: string | undefined = block.params.size
+	const size: string | undefined = toStringlyTyped_kilocode(block.params.size)
 
 	if (!action || !browserActions.includes(action)) {
 		// checking for action to ensure it is complete and valid

+ 1 - 1
src/core/tools/generateImageTool.ts

@@ -12,7 +12,7 @@ import { OpenRouterHandler } from "../../api/providers/openrouter"
 import { KilocodeOpenrouterHandler } from "../../api/providers/kilocode-openrouter"
 
 // Hardcoded list of image generation models for now
-const IMAGE_GENERATION_MODELS = ["google/gemini-2.5-flash-image"] // kilocode_change
+const IMAGE_GENERATION_MODELS = ["google/gemini-2.5-flash-image", "openai/gpt-5-image", "openai/gpt-5-image-mini"]
 
 export async function generateImageTool(
 	cline: Task,

+ 14 - 2
src/core/webview/webviewMessageHandler.ts

@@ -6,12 +6,14 @@ import pWaitFor from "p-wait-for"
 import * as vscode from "vscode"
 // kilocode_change start
 import axios from "axios"
-import { getKiloBaseUriFromToken } from "@roo-code/types"
+import { getKiloBaseUriFromToken, isGlobalStateKey } from "@roo-code/types"
 import {
+	MaybeTypedWebviewMessage,
 	ProfileData,
 	SeeNewChangesPayload,
 	TaskHistoryRequestPayload,
 	TasksByIdRequestPayload,
+	UpdateGlobalStateMessage,
 } from "../../shared/WebviewMessage"
 // kilocode_change end
 
@@ -85,7 +87,7 @@ import { fetchAndRefreshOrganizationModesOnStartup, refreshOrganizationModes } f
 
 export const webviewMessageHandler = async (
 	provider: ClineProvider,
-	message: WebviewMessage,
+	message: MaybeTypedWebviewMessage, // kilocode_change switch to MaybeTypedWebviewMessage for better type-safety
 	marketplaceManager?: MarketplaceManager,
 ) => {
 	// Utility functions provided for concise get/update of global state via contextProxy API.
@@ -3505,6 +3507,16 @@ export const webviewMessageHandler = async (
 			break
 		}
 		// kilocode_change end
+		// kilocode_change start: Type-safe global state handler
+		case "updateGlobalState": {
+			const { stateKey, stateValue } = message as UpdateGlobalStateMessage
+			if (stateKey !== undefined && stateValue !== undefined && isGlobalStateKey(stateKey)) {
+				await updateGlobalState(stateKey, stateValue)
+				await provider.postStateToWebview()
+			}
+			break
+		}
+		// kilocode_change end: Type-safe global state handler
 		case "insertTextToChatArea":
 			provider.postMessageToWebview({ type: "insertTextToChatArea", text: message.text })
 			break

+ 2 - 2
src/package.json

@@ -3,7 +3,7 @@
 	"displayName": "%extension.displayName%",
 	"description": "%extension.description%",
 	"publisher": "kilocode",
-	"version": "4.108.0",
+	"version": "4.109.1",
 	"icon": "assets/icons/logo-outline-black.png",
 	"galleryBanner": {
 		"color": "#FFFFFF",
@@ -437,7 +437,7 @@
 			{
 				"command": "editor.action.inlineSuggest.commit",
 				"key": "tab",
-				"when": "inlineSuggestionVisible && editorTextFocus && !editorTabMovesFocus && !inSnippetMode && !suggestWidgetVisible && editorLangId != 'markdown'"
+				"when": "inlineSuggestionVisible && editorTextFocus && !editorTabMovesFocus && !inSnippetMode && !suggestWidgetVisible && editorLangId != 'markdown' && !shiftKey && !ctrlKey && !altKey && !metaKey"
 			},
 			{
 				"command": "kilo-code.ghost.applyAllSuggestions",

+ 28 - 0
src/services/ghost/GhostProvider.ts

@@ -204,9 +204,37 @@ export class GhostProvider {
 		if (this.workspaceEdit.isLocked()) {
 			return
 		}
+
+		// Filter out undo/redo operations
+		if (event.reason !== undefined) {
+			return
+		}
+
 		if (event.contentChanges.length === 0) {
 			return
 		}
+
+		// Heuristic to filter out bulk changes (git operations, external edits)
+		const isBulkChange = event.contentChanges.some((change) => change.rangeLength > 100 || change.text.length > 100)
+		if (isBulkChange) {
+			return
+		}
+
+		// Heuristic to filter out changes far from cursor (likely external or LLM edits)
+		const editor = vscode.window.activeTextEditor
+		if (!editor || editor.document !== event.document) {
+			return
+		}
+
+		const cursorPos = editor.selection.active
+		const isNearCursor = event.contentChanges.some((change) => {
+			const distance = Math.abs(cursorPos.line - change.range.start.line)
+			return distance <= 2
+		})
+		if (!isNearCursor) {
+			return
+		}
+
 		await this.documentStore.storeDocument({ document: event.document })
 		this.lastTextChangeTime = Date.now()
 		this.handleTypingEvent(event)

+ 244 - 0
src/services/ghost/__tests__/GhostProvider.spec.ts

@@ -267,4 +267,248 @@ console.log('test');]]></replace></change>`
 			expect(result.suggestions.hasSuggestions()).toBe(true)
 		})
 	})
+
+	describe("onDidChangeTextDocument filtering", () => {
+		it("should process user typing (small changes near cursor)", async () => {
+			const initialContent = `console.log('test');`
+			const { testUri, mockDocument } = await setupTestDocument("typing.js", initialContent)
+
+			// Mock active editor with cursor at line 0
+			;(vscode.window as any).activeTextEditor = {
+				document: mockDocument,
+				selection: {
+					active: new vscode.Position(0, 10),
+				},
+			}
+
+			// Simulate user typing - small change near cursor
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(0, 10), new vscode.Position(0, 10)),
+						rangeLength: 0,
+						text: "a",
+					},
+				],
+				reason: undefined, // User typing has no reason
+			}
+
+			// This should be processed (not filtered out)
+			// We can't directly test the private method, but we can verify the logic
+			expect(event.reason).toBeUndefined()
+			expect(event.contentChanges.length).toBeGreaterThan(0)
+			expect(event.contentChanges[0].text.length).toBeLessThanOrEqual(100)
+		})
+
+		it("should filter out undo operations", async () => {
+			const initialContent = `console.log('test');`
+			const { mockDocument } = await setupTestDocument("undo.js", initialContent)
+
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 10)),
+						rangeLength: 10,
+						text: "",
+					},
+				],
+				reason: 1, // Undo
+			}
+
+			// Should be filtered out
+			expect(event.reason).toBe(1)
+		})
+
+		it("should filter out redo operations", async () => {
+			const initialContent = `console.log('test');`
+			const { mockDocument } = await setupTestDocument("redo.js", initialContent)
+
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 10)),
+						rangeLength: 0,
+						text: "console.log",
+					},
+				],
+				reason: 2, // Redo
+			}
+
+			// Should be filtered out
+			expect(event.reason).toBe(2)
+		})
+
+		it("should filter out bulk changes (git operations)", async () => {
+			const initialContent = `console.log('test');`
+			const { mockDocument } = await setupTestDocument("bulk.js", initialContent)
+
+			// Simulate git checkout - large text replacement
+			const largeText = "a".repeat(150)
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 20)),
+						rangeLength: 20,
+						text: largeText,
+					},
+				],
+				reason: undefined,
+			}
+
+			// Should be filtered out due to bulk change
+			const isBulkChange = event.contentChanges.some(
+				(change) => change.rangeLength > 100 || change.text.length > 100,
+			)
+			expect(isBulkChange).toBe(true)
+		})
+
+		it("should filter out changes far from cursor (LLM edits)", async () => {
+			const initialContent = `line 1\nline 2\nline 3\nline 4\nline 5\nline 6\nline 7\nline 8`
+			const { mockDocument } = await setupTestDocument("far.js", initialContent)
+
+			// Mock active editor with cursor at line 0
+			;(vscode.window as any).activeTextEditor = {
+				document: mockDocument,
+				selection: {
+					active: new vscode.Position(0, 0),
+				},
+			}
+
+			// Simulate change at line 7 (far from cursor at line 0)
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(7, 0), new vscode.Position(7, 6)),
+						rangeLength: 6,
+						text: "modified",
+					},
+				],
+				reason: undefined,
+			}
+
+			// Should be filtered out - change is more than 2 lines away
+			const cursorPos = (vscode.window as any).activeTextEditor.selection.active
+			const isNearCursor = event.contentChanges.some((change) => {
+				const distance = Math.abs(cursorPos.line - change.range.start.line)
+				return distance <= 2
+			})
+			expect(isNearCursor).toBe(false)
+		})
+
+		it("should allow changes within 2 lines of cursor", async () => {
+			const initialContent = `line 1\nline 2\nline 3\nline 4\nline 5`
+			const { mockDocument } = await setupTestDocument("near.js", initialContent)
+
+			// Mock active editor with cursor at line 2
+			;(vscode.window as any).activeTextEditor = {
+				document: mockDocument,
+				selection: {
+					active: new vscode.Position(2, 0),
+				},
+			}
+
+			// Simulate change at line 4 (2 lines away from cursor)
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(4, 0), new vscode.Position(4, 6)),
+						rangeLength: 6,
+						text: "modified",
+					},
+				],
+				reason: undefined,
+			}
+
+			// Should NOT be filtered out - change is within 2 lines
+			const cursorPos = (vscode.window as any).activeTextEditor.selection.active
+			const isNearCursor = event.contentChanges.some((change) => {
+				const distance = Math.abs(cursorPos.line - change.range.start.line)
+				return distance <= 2
+			})
+			expect(isNearCursor).toBe(true)
+		})
+
+		it("should filter out changes to non-active documents", async () => {
+			const initialContent = `console.log('test');`
+			const { mockDocument } = await setupTestDocument("inactive.js", initialContent)
+
+			// Create a different document for the active editor
+			const activeContent = `console.log('active');`
+			const activeUri = vscode.Uri.parse("file://active.js")
+			mockWorkspace.addDocument(activeUri, activeContent)
+			const activeDocument = await mockWorkspace.openTextDocument(activeUri)
+
+			// Mock active editor with a different document
+			;(vscode.window as any).activeTextEditor = {
+				document: activeDocument,
+				selection: {
+					active: new vscode.Position(0, 10),
+				},
+			}
+
+			// Simulate change to the non-active document
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(0, 10), new vscode.Position(0, 10)),
+						rangeLength: 0,
+						text: "a",
+					},
+				],
+				reason: undefined,
+			}
+
+			// Should be filtered out - document doesn't match active editor
+			const editor = (vscode.window as any).activeTextEditor
+			const shouldProcess = editor && editor.document === event.document
+			expect(shouldProcess).toBe(false)
+		})
+
+		it("should allow small paste operations near cursor", async () => {
+			const initialContent = `console.log('test');`
+			const { mockDocument } = await setupTestDocument("paste.js", initialContent)
+
+			// Mock active editor with cursor at line 0
+			;(vscode.window as any).activeTextEditor = {
+				document: mockDocument,
+				selection: {
+					active: new vscode.Position(0, 10),
+				},
+			}
+
+			// Simulate paste of 50 characters (under threshold)
+			const pastedText = "a".repeat(50)
+			const event = {
+				document: mockDocument,
+				contentChanges: [
+					{
+						range: new vscode.Range(new vscode.Position(0, 10), new vscode.Position(0, 10)),
+						rangeLength: 0,
+						text: pastedText,
+					},
+				],
+				reason: undefined,
+			}
+
+			// Should NOT be filtered out - paste is small and near cursor
+			const isBulkChange = event.contentChanges.some(
+				(change) => change.rangeLength > 100 || change.text.length > 100,
+			)
+			expect(isBulkChange).toBe(false)
+
+			const cursorPos = (vscode.window as any).activeTextEditor.selection.active
+			const isNearCursor = event.contentChanges.some((change) => {
+				const distance = Math.abs(cursorPos.line - change.range.start.line)
+				return distance <= 2
+			})
+			expect(isNearCursor).toBe(true)
+		})
+	})
 })

+ 14 - 0
src/shared/WebviewMessage.ts

@@ -12,6 +12,7 @@ import {
 	// kilocode_change start
 	CommitRange,
 	HistoryItem,
+	GlobalState,
 	// kilocode_change end
 } from "@roo-code/types"
 
@@ -34,6 +35,15 @@ export interface UpdateTodoListPayload {
 
 export type EditQueuedMessagePayload = Pick<QueuedMessage, "id" | "text" | "images">
 
+// kilocode_change start: Type-safe global state update message
+export type GlobalStateValue<K extends keyof GlobalState> = GlobalState[K]
+export type UpdateGlobalStateMessage<K extends keyof GlobalState = keyof GlobalState> = {
+	type: "updateGlobalState"
+	stateKey: K
+	stateValue: GlobalStateValue<K>
+}
+// kilocode_change end: Type-safe global state update message
+
 export interface WebviewMessage {
 	type:
 		| "updateTodoList"
@@ -268,6 +278,7 @@ export interface WebviewMessage {
 		| "dismissNotificationId" // kilocode_change
 		| "tasksByIdRequest" // kilocode_change
 		| "taskHistoryRequest" // kilocode_change
+		| "updateGlobalState" // kilocode_change
 		| "shareTaskSuccess"
 		| "exportMode"
 		| "exportModeResult"
@@ -387,6 +398,9 @@ export interface WebviewMessage {
 	}
 }
 
+// kilocode_change: Create discriminated union for type-safe messages
+export type MaybeTypedWebviewMessage = WebviewMessage | UpdateGlobalStateMessage
+
 // kilocode_change begin
 export type OrganizationRole = "owner" | "admin" | "member"
 

+ 2 - 26
webview-ui/src/components/chat/ChatRow.tsx

@@ -54,8 +54,6 @@ import { MAX_IMAGES_PER_MESSAGE } from "./ChatView"
 import { InvalidModelWarning } from "../kilocode/chat/InvalidModelWarning" // kilocode_change
 import { useSelectedModel } from "../ui/hooks/useSelectedModel"
 import {
-	ChevronRight,
-	ChevronDown,
 	Eye,
 	FileDiff,
 	ListTree,
@@ -328,11 +326,7 @@ export const ChatRowContent = ({
 							getIconSpan("error", errorColor)
 						)
 					) : cost !== null && cost !== undefined ? (
-						isExpanded ? (
-							<ChevronDown className="w-4 shrink-0" />
-						) : (
-							<ChevronRight className="w-4 shrink-0" />
-						)
+						getIconSpan("arrow-swap", normalColor)
 					) : apiRequestFailedMessage ? (
 						getIconSpan("error", errorColor)
 					) : (
@@ -377,7 +371,6 @@ export const ChatRowContent = ({
 		cost,
 		apiRequestFailedMessage,
 		t,
-		isExpanded,
 		inferenceProvider, // kilocode_change
 	])
 
@@ -1116,13 +1109,7 @@ export const ChatRowContent = ({
 											? 10
 											: 0,
 									justifyContent: "space-between",
-									cursor: "pointer",
-									userSelect: "none",
-									WebkitUserSelect: "none",
-									MozUserSelect: "none",
-									msUserSelect: "none",
-								}}
-								onClick={handleToggleExpand}>
+								}}>
 								<div style={{ display: "flex", alignItems: "center", gap: "10px", flexGrow: 1 }}>
 									{icon}
 									{/* kilocode_change start */}
@@ -1172,17 +1159,6 @@ export const ChatRowContent = ({
 									}
 								/>
 							)}
-
-							{isExpanded && (
-								<div className="ml-6" style={{ marginTop: "10px" }}>
-									<CodeAccordian
-										code={safeJsonParse<any>(message.text)?.request}
-										language="markdown"
-										isExpanded={true}
-										onToggleExpand={handleToggleExpand}
-									/>
-								</div>
-							)}
 						</>
 					)
 				case "api_req_finished":

+ 1 - 1
webview-ui/src/components/settings/ApiOptions.tsx

@@ -392,7 +392,7 @@ const ApiOptions = ({
 				zai: {
 					field: "apiModelId",
 					default:
-						apiConfiguration.zaiApiLine === "china"
+						apiConfiguration.zaiApiLine === "china_coding"
 							? mainlandZAiDefaultModelId
 							: internationalZAiDefaultModelId,
 				},

+ 4 - 2
webview-ui/src/components/settings/ImageGenerationSettings.tsx

@@ -18,7 +18,9 @@ interface ImageGenerationSettingsProps {
 
 // Hardcoded list of image generation models
 const IMAGE_GENERATION_MODELS = [
-	{ value: "google/gemini-2.5-flash-image", label: "Gemini 2.5 Flash Image" }, // kilocode_change
+	{ value: "google/gemini-2.5-flash-image", label: "Gemini 2.5 Flash Image" },
+	{ value: "openai/gpt-5-image", label: "GPT-5 Image" },
+	{ value: "openai/gpt-5-image-mini", label: "GPT-5 Image Mini" },
 	// Add more models as they become available
 ]
 
@@ -188,7 +190,7 @@ export const ImageGenerationSettings = ({
 					</div>
 
 					{/* Model Selection */}
-					<div style={{ display: isUsingOpenRouter ? undefined : "none" } /*kilocode_change*/}>
+					<div>
 						<label className="block font-medium mb-1">
 							{t("settings:experimental.IMAGE_GENERATION.modelSelectionLabel")}
 						</label>

+ 1 - 1
webview-ui/src/components/ui/hooks/useSelectedModel.ts

@@ -281,7 +281,7 @@ function getSelectedModel({
 			return { id, info }
 		}
 		case "zai": {
-			const isChina = apiConfiguration.zaiApiLine === "china"
+			const isChina = apiConfiguration.zaiApiLine === "china_coding"
 			const models = isChina ? mainlandZAiModels : internationalZAiModels
 			const defaultModelId = isChina ? mainlandZAiDefaultModelId : internationalZAiDefaultModelId
 			const id = apiConfiguration.apiModelId ?? defaultModelId

+ 7 - 7
webview-ui/src/i18n/locales/zh-CN/kilocode.json

@@ -212,30 +212,30 @@
 		}
 	},
 	"ghost": {
-		"title": "Autocomplete",
+		"title": "自动补全",
 		"settings": {
 			"triggers": "触发器",
-			"keybindingDescription": "Autocomplete 功能可以通过命令触发。你可以在<DocsLink>这里配置键盘快捷键</DocsLink>。",
+			"keybindingDescription": "自动补全功能可以通过命令触发。你可以在<DocsLink>这里配置键盘快捷键</DocsLink>。",
 			"enableAutoTrigger": {
-				"label": "启用 Autocomplete",
-				"description": "启用后,当你停止输入时 Kilo Code 将自动触发 Autocomplete。这对快速修复和建议很有用。"
+				"label": "启用自动补全",
+				"description": "启用后,当你停止输入时 Kilo Code 将自动触发自动补全。这对快速修复和建议很有用。"
 			},
 			"autoTriggerDelay": {
 				"label": "自动触发延迟",
-				"description": "你停止输入后 Kilo Code 触发 Autocomplete 前的秒数延迟。延迟越短建议越快,但可能更消耗资源。"
+				"description": "你停止输入后 Kilo Code 触发自动补全前的秒数延迟。延迟越短建议获取速度越快,但可能更消耗资源。"
 			},
 			"enableQuickInlineTaskKeybinding": {
 				"label": "快速任务 ({{keybinding}})",
 				"description": "只需要快速更改?选择一些代码(或不选!)然后按 Cmd+I。用简单的中文描述你的目标(\"用这些 props 创建 React 组件\",\"给这个函数添加错误处理\"),在编辑器中直接获得多个即用建议。<DocsLink>查看快捷键</DocsLink>"
 			},
 			"enableSmartInlineTaskKeybinding": {
-				"label": "手动自动完成({{keybinding}})",
+				"label": "手动自动补全({{keybinding}})",
 				"description": "需要快速修复、补全或重构?Kilo 将使用周围上下文提供即时改进,保持你的工作流。<DocsLink>查看快捷键</DocsLink>"
 			},
 			"keybindingNotFound": "未找到",
 			"noModelConfigured": "未找到合适的自动补全模型。请在 API 设置中配置提供商。",
 			"model": "模型",
-			"provider": "Provider"
+			"provider": "提供商"
 		}
 	},
 	"virtualProvider": {

+ 2 - 2
webview-ui/src/i18n/locales/zh-CN/settings.json

@@ -798,8 +798,8 @@
 			"successConfigured": "✓ 图像生成已配置完成,可以使用"
 		},
 		"INLINE_ASSIST": {
-			"name": "Autocomplete",
-			"description": "启用 Autocomplete 功能,在编辑器中直接提供快速代码建议和改进。包括针对性更改的快速任务(Cmd+I)和上下文改进的 Autocomplete。"
+			"name": "自动补全",
+			"description": "启用自动补全功能,在编辑器中直接提供快速代码建议和改进。包括针对性更改的快速任务(Cmd+I)和上下文改进的自动补全。"
 		},
 		"MORPH_FAST_APPLY": {
 			"name": "启用快速应用",

+ 14 - 14
webview-ui/src/i18n/locales/zh-TW/kilocode.json

@@ -207,30 +207,30 @@
 		}
 	},
 	"ghost": {
-		"title": "Autocomplete",
+		"title": "自動補全",
 		"settings": {
 			"triggers": "觸發器",
-			"keybindingDescription": "Autocomplete 功能可以透過指令觸發。你可以在<DocsLink>這裡設定鍵盤快速鍵</DocsLink>。",
+			"keybindingDescription": "自動補全功能可以透過指令觸發。你可以在<DocsLink>這裡設定鍵盤快速鍵</DocsLink>。",
 			"enableAutoTrigger": {
-				"label": "啟用 Autocomplete",
-				"description": "啟用後,當你停止輸入時 Kilo Code 將自動觸發 Autocomplete。這對快速修正和建議很有用。"
+				"label": "啟用自動補全",
+				"description": "啟用後,當你停止輸入時 Kilo Code 將自動觸發自動補全。這對快速修正和建議很有用。"
 			},
 			"autoTriggerDelay": {
 				"label": "自動觸發延遲",
-				"description": "你停止輸入後 Kilo Code 觸發 Autocomplete 前的秒數延遲。延遲越短建議越快,但可能更耗費資源。"
+				"description": "你停止輸入後 Kilo Code 觸發自動補全前的秒數延遲。延遲越短建議獲取速度越快,但可能更耗費資源。"
 			},
 			"enableQuickInlineTaskKeybinding": {
-				"label": "快速任 ({{keybinding}})",
+				"label": "快速任 ({{keybinding}})",
 				"description": "只需要快速變更?選取一些程式碼(或不選!)然後按 Cmd+I。用簡單的中文描述你的目標(「用這些 props 建立 React 元件」,「為這個函數新增錯誤處理」),在編輯器中直接取得多個即用建議。<DocsLink>檢視快速鍵</DocsLink>"
 			},
 			"enableSmartInlineTaskKeybinding": {
-				"label": "手动自动补全 ({{keybinding}})",
+				"label": "手動自動補全 ({{keybinding}})",
 				"description": "需要快速修正、補全或重構?Kilo 將使用周圍內容提供即時改進,保持你的工作流程。<DocsLink>檢視快速鍵</DocsLink>"
 			},
 			"keybindingNotFound": "未找到",
-			"noModelConfigured": "找不到合適的自動完成模型。請在 API 設定中配置提供者。",
+			"noModelConfigured": "找不到合適的自動補全模型。請在 API 設定中配置提供者。",
 			"model": "模型",
-			"provider": "Provider"
+			"provider": "供應商"
 		}
 	},
 	"virtualProvider": {
@@ -243,12 +243,12 @@
 		"removeProfile": "移除設定檔",
 		"selectProfilePlaceholder": "選擇設定檔...",
 		"addProfile": "新增設定檔",
-		"noProfilesAvailable": "没有可用的配置文件。请先配置至少一个非虚拟提供商配置文件。",
+		"noProfilesAvailable": "沒有可用的設定檔。請先配置至少一個非虛擬供應商設定檔。",
 		"dangerZoneTitle": "危險區域",
 		"dangerZoneDescription": "這些操作具有破壞性且無法復原。",
 		"clearUsageData": "清除使用資料",
 		"confirmClearTitle": "確定嗎?",
-		"confirmClearDescription": "這將永久刪除虛擬提供者的所有儲存使用資料。此操作無法復原。",
+		"confirmClearDescription": "這將永久刪除虛擬供應商儲存的所有使用資料。此操作無法復原。",
 		"perMinute": "每分鐘",
 		"tokensLabel": "Tokens",
 		"perDay": "每天",
@@ -261,9 +261,9 @@
 		"page": "第 {{page}} 頁 / 共 {{count}} 頁"
 	},
 	"imageWarnings": {
-		"modelNoImageSupport": "当前模型不支持图片。",
-		"maxImagesReached": "每条信息最多可发送20张图片。要添加更多图片,请先删除一些现有图片。",
-		"imagesRemovedNoSupport": "已移除图像,模型不支持。"
+		"modelNoImageSupport": "當前模型不支援圖片。",
+		"maxImagesReached": "每條訊息最多可包含 20 張圖片。請刪除部分圖片以新增更多圖片。",
+		"imagesRemovedNoSupport": "已移除圖片,模型不支援。"
 	},
 	"memoryWarning": {
 		"message": "記憶體使用量已達 {{percentage}}%。請重新啟動您的 IDE 以防止當機。"

+ 6 - 6
webview-ui/src/i18n/locales/zh-TW/settings.json

@@ -808,11 +808,11 @@
 			"successConfigured": "✓ 圖像生成已設定完成並準備使用"
 		},
 		"INLINE_ASSIST": {
-			"name": "Autocomplete",
-			"description": "啟用 Autocomplete 功能,在編輯器中直接提供快速程式碼建議和改進。包括針對性變更的快速工作(Cmd+I)和內容改進的 Autocomplete。"
+			"name": "自動補全",
+			"description": "啟用自動補全功能,在編輯器中直接提供快速程式碼建議和改進。包括針對性變更的快速工作(Cmd+I)和內容改進的自動補全"
 		},
 		"RUN_SLASH_COMMAND": {
-			"name": "啟用模型啟動的斜線命令",
+			"name": "啟用模型發起斜線命令",
 			"description": "啟用時,Kilo Code 可以執行您的斜線命令來執行工作流程。"
 		}
 	},
@@ -934,9 +934,9 @@
 			"description": "啟用後,按 Enter 鍵傳送訊息,Shift+Enter 鍵換行。停用後,使用 Shift+Enter 鍵傳送訊息。"
 		},
 		"costThreshold": {
-			"description": "仅显示超过此金额的请求费用。当详细信息面板打开时,费用始终可见。",
-			"label": "隐藏低于阈值的费用",
-			"currentValue": "当前阈值:${{value}}"
+			"description": "僅顯示超過此金額的請求費用。當詳細資訊儀錶板打開時,費用始終可見。",
+			"label": "隱藏低於閾值的費用",
+			"currentValue": "當前閾值:${{value}}"
 		},
 		"showTimestamps": {
 			"label": "顯示時間戳記",

+ 10 - 0
webview-ui/src/utils/globalStateHelpers.ts

@@ -0,0 +1,10 @@
+import { vscode } from "@src/utils/vscode"
+import type { GlobalState } from "@roo-code/types"
+import { GlobalStateValue } from "@roo/WebviewMessage"
+
+/**
+ * Type-safe helper for sending global state updates from the WebView
+ */
+export function updateHostGlobalState<K extends keyof GlobalState>(stateKey: K, stateValue: GlobalStateValue<K>): void {
+	vscode.postMessage({ type: "updateGlobalState", stateKey, stateValue })
+}

+ 1 - 1
webview-ui/src/utils/vscode.ts

@@ -1,6 +1,6 @@
 import type { WebviewApi } from "vscode-webview"
 
-import { WebviewMessage } from "@roo/WebviewMessage"
+import { MaybeTypedWebviewMessage as WebviewMessage } from "@roo/WebviewMessage" // kilocode_change - using MaybeTypedWebviewMessage
 
 /**
  * A utility wrapper around the acquireVsCodeApi() function, which enables