@limecloud/cli 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"schema_version":1,"snapshots":[{"schema_version":1,"software_version":"0.10.0","locale":"en","visibility":"public","source_url":"https://open.limeai.run/llms.txt","revision":"sha256:93040656ec202006a306dd51c04827c7dbf6c547b7569b3f027c67fc1527b387","articles":[{"id":"platform-overview","group":"guide","category":"Platform introduction","title":"Lime Open Platform overview","summary":"Connect Lime to the products and systems you already use. A shared identity, application lifecycle, open APIs and business capabilities help you build applications, distribute products and keep access and operations under control.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/platform-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"integration","title":"Connect, build and distribute"},{"id":"architecture","title":"How the platform fits together"},{"id":"application-shapes","title":"Application shapes for different scenarios"},{"id":"capabilities","title":"Open capabilities across your product lifecycle"},{"id":"identity","title":"Identity and organization access"},{"id":"applications","title":"Application configuration and distribution"},{"id":"commerce","title":"Commerce and entitlements"},{"id":"finance","title":"Finance, operations and audit"},{"id":"journey","title":"Get started"},{"id":"developer-tools","title":"Developer tools"},{"id":"support","title":"Support and troubleshooting"}],"markdown":"# Lime Open Platform overview\n\nConnect Lime to the products and systems you already use. A shared identity, application lifecycle, open APIs and business capabilities help you build applications, distribute products and keep access and operations under control.\n\n<a id=\"integration\"></a>\n\n## Connect, build and distribute\n\n[integration-scenarios](https://open.limeai.run/docs/platform-overview?locale=en#integration)\n\n<a id=\"architecture\"></a>\n\n## How the platform fits together\n\nLime separates the identity of a user, access to a workspace, application configuration and commercial entitlement. Web, desktop and command-line applications connect through standard protocols, resource APIs and signed events. Your application keeps its own hosting and business data.\n\n[platform-architecture](https://open.limeai.run/docs/platform-overview?locale=en#architecture)\n\n<a id=\"application-shapes\"></a>\n\n## Application shapes for different scenarios\n\nChoose an integration model based on where your code runs and whether it can protect a client secret. Application ownership and distribution are configured separately from the client type.\n\n| Application shape | Integration | Get started |\n| --- | --- | --- |\n| Web application | A server callback or a public browser client uses authorization code with S256 PKCE. | Web sign-in tutorial |\n| Desktop and mobile application | Use the system browser and an exact registered callback. Protect tokens with operating-system credential storage. | Native application guide |\n| CLI and devices | Device authorization connects a terminal to a user-approved browser sign-in. | Device authorization tutorial |\n| Server integration | Use a client credential only for its permitted machine audience; user management APIs require delegated user authorization. | Server integration guide |\n\n[Application ownership and types](https://open.limeai.run/docs/application-types?locale=en)\n\n[Client integration reference](https://open.limeai.run/docs/client-overview?locale=en)\n\n<a id=\"capabilities\"></a>\n\n## Open capabilities across your product lifecycle\n\nStart with the capability your application needs. The reference documents every implemented public operation, its input and output schema, required delegated scope and CLI example. Authorization is checked again against the current user and resource on every call.\n\n<a id=\"identity\"></a>\n\n### Identity and organization access\n\nUse OAuth 2.0 and OpenID Connect for sign-in, including S256 PKCE and device authorization. A user can work across personal and organization spaces while each resource remains owned by its original space. Session revocation and current membership continue to affect access.\n\n[OAuth and OpenID Connect](https://open.limeai.run/docs/oauth-overview?locale=en)\n\n[Accounts and workspaces](https://open.limeai.run/docs/account-spaces?locale=en)\n\n<a id=\"applications\"></a>\n\n### Application configuration and distribution\n\nRegister internal or partner applications, configure clients, scopes, collaborators and test access, then freeze a version for independent review. Explicit publishing and installation decisions keep development configuration separate from production access.\n\n[Development workflow](https://open.limeai.run/docs/development-workflow?locale=en)\n\n[Versions and releases](https://open.limeai.run/docs/releases?locale=en)\n\n[Application installation](https://open.limeai.run/docs/installations?locale=en)\n\n<a id=\"commerce\"></a>\n\n### Commerce and entitlements\n\nPublish products and campaigns, create server-calculated quotes and recover orders with the original idempotency key. Sandbox payment and refund flows update entitlements and durable accounting/receipt sources. Production payment, subscriptions and full license delivery remain under construction.\n\n[commerce-flow](https://open.limeai.run/docs/platform-overview?locale=en#commerce)\n\n[Products and pricing](https://open.limeai.run/docs/products-pricing?locale=en)\n\n[Orders and recovery](https://open.limeai.run/docs/checkout-orders?locale=en)\n\n[Entitlements and licenses](https://open.limeai.run/docs/entitlements-licenses?locale=en)\n\n<a id=\"finance\"></a>\n\n### Finance, operations and audit\n\nControlled resource APIs expose the implemented ledger, balanced journals, reversal, trial balance, campaign, notification and audit tasks. Platform roles, environment, strong authentication and immutable posted facts remain authoritative; a delegated scope does not grant a finance role.\n\n[Ledger and journal integration](https://open.limeai.run/docs/finance-ledger?locale=en)\n\n[Audit and notifications](https://open.limeai.run/docs/audit-notifications?locale=en)\n\n<a id=\"journey\"></a>\n\n## Get started\n\n1. Choose a workspace and application type, then create your application in the developer console.\n2. Configure the client, callback and minimum scopes, and test with eligible sandbox members.\n3. Freeze the intended configuration, submit it for independent review and explicitly publish the approved version.\n\n[Create your first application](https://open.limeai.run/docs/create-application?locale=en)\n\n[Connect web sign-in](https://open.limeai.run/docs/pkce-tutorial?locale=en)\n\n[Publish your first version](https://open.limeai.run/docs/first-release-tutorial?locale=en)\n\n<a id=\"developer-tools\"></a>\n\n## Developer tools\n\nUse the API reference to inspect exact request fields and the CLI to discover schemas, preview requests and execute authorized operations. Client guides cover browser, native and server integration boundaries. No developer tool bypasses resource permissions or recent strong authentication.\n\n[Server API reference](https://open.limeai.run/docs/api-overview?locale=en)\n\n[Client integration](https://open.limeai.run/docs/client-overview?locale=en)\n\n[LimeCloud CLI](https://open.limeai.run/docs/cli-overview?locale=en)\n\n[Diagnose an integration](https://open.limeai.run/docs/api-debugging?locale=en)\n\n<a id=\"support\"></a>\n\n## Support and troubleshooting\n\nStart with the error code, operation, environment and a redacted request identifier. Check client registration, callback, user consent and current resource access before retrying. Keep tokens, secrets and recovery codes out of screenshots and support logs.\n\n[Frequently asked questions](https://open.limeai.run/docs/integration-faq?locale=en)\n\n[Errors and recovery](https://open.limeai.run/docs/errors?locale=en)\n\n[Security checklist](https://open.limeai.run/docs/security?locale=en)\n","revision":"sha256:745bdc73d1710ca340c09276a665c6d5252af230299f900944c86d32db45dac5"},{"id":"application-types","group":"guide","category":"Get started","title":"Choose an application type","summary":"Understand internal, partner and official applications before choosing ownership and distribution.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-types?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"types","title":"Application types"},{"id":"ownership","title":"Ownership and runtime are separate"}],"markdown":"# Choose an application type\n\nUnderstand internal, partner and official applications before choosing ownership and distribution.\n\n<a id=\"types\"></a>\n\n## Application types\n\n| Type | Purpose | Distribution |\n| --- | --- | --- |\n| Internal | A workspace builds an application for its own organization. | Production private access; no public listing request. |\n| Partner | An independent developer provides an application to customers. | Developer qualification, published version and listing review are required for public discovery. |\n| Official | An application maintained by Lime under controlled platform permissions. | Publishing and distribution still follow the applicable review checks. |\n\n<a id=\"ownership\"></a>\n\n## Ownership and runtime are separate\n\nWeb, desktop and CLI are runtime choices, not separate application types. One application has one Application ID and separate sandbox and production clients. Application ownership does not grant platform review, operations or finance roles.\n\n[Workspace guide](https://open.limeai.run/docs/workspaces?locale=en)\n\n[Publishing guide](https://open.limeai.run/docs/releases?locale=en)\n","revision":"sha256:0f330575896323e8dcc6b3e7b6d537a39c1f166e16df5fe5cb0c30c7a63e3a88"},{"id":"workspaces","group":"guide","category":"Get started","title":"Workspaces and organization members","summary":"Keep personal and organization ownership explicit, and add organization members before application collaboration.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/workspaces?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_space_list","management_open_space_create","management_open_member_list","management_account_space_list"],"sections":[{"id":"choose","title":"Choose the owning workspace"},{"id":"members","title":"Invite organization members"}],"markdown":"# Workspaces and organization members\n\nKeep personal and organization ownership explicit, and add organization members before application collaboration.\n\n<a id=\"choose\"></a>\n\n## Choose the owning workspace\n\nWorkspace selection scopes the current task. It does not silently transfer application ownership or select a global customer context for sign-in and billing.\n\n1. Sign in to the developer console and select the intended workspace above the application list.\n2. If you need an organization workspace, use Create organization workspace and enter its name. Continue only with a workspace you are authorized to manage.\n3. Verify the selected workspace before creating an application, inviting a member or submitting a qualification request.\n\n[Open the application list](https://open.limeai.run/app)\n\n<a id=\"members\"></a>\n\n## Invite organization members\n\nPersonal workspaces do not support organization invitations. Organization membership alone does not grant application administrator privileges or access to every application's data.\n\n1. An organization owner or administrator opens the workspace member page and sends an invitation to the member's email.\n2. The recipient signs in with the invited, verified email, reviews the original invitation and explicitly accepts it.\n3. Assign application collaboration or testing access separately after membership is active.\n\n[Application collaboration](https://open.limeai.run/docs/collaboration?locale=en)\n","revision":"sha256:9d8851c5ad554223a324ccbca23f2585efa979c76bf946b1cfd16f2acbda3f40"},{"id":"create-application","group":"guide","category":"Get started","title":"Create an application","summary":"Create the first application draft and prepare the configuration needed for integration.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/create-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"create","title":"Create the draft"},{"id":"next","title":"Prepare the integration"}],"markdown":"# Create an application\n\nCreate the first application draft and prepare the configuration needed for integration.\n\n<a id=\"create\"></a>\n\n## Create the draft\n\nNames support up to 32 characters and descriptions up to 120 characters. A Chinese translation contains both its name and description. Official application creation requires an explicit platform role.\n\n1. Open the developer console, confirm the owning workspace and select Internal or Partner applications.\n2. Choose Create application. Enter an English name and description; optionally add the Simplified Chinese name and description.\n3. Choose a preset icon and background, then submit once. The resulting application opens on its basic information page.\n\n[Create in the console](https://open.limeai.run/app)\n\n<a id=\"next\"></a>\n\n## Prepare the integration\n\n1. Record the Application ID from basic information. Register a separate sign-in client; Application ID and Client ID are different identifiers.\n2. Configure the required scopes and exact callback URI. Add a test member and use the sandbox client for initial sign-in.\n3. Keep the draft unpublished until the integration is tested. Creating a draft does not make the application available in production.\n\n[Register a sign-in client](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Configure permissions](https://open.limeai.run/docs/scopes?locale=en)\n","revision":"sha256:7557b12c6992c176aaefb089013c522dea7e2221e4617b4e6b3fa312de272f4c"},{"id":"application-profile","group":"guide","category":"Build your application","title":"Application information and icons","summary":"Maintain bilingual application information and the profile users see while authorizing access.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-profile?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"profile","title":"Edit basic information"},{"id":"authorization","title":"Information on the authorization page"}],"markdown":"# Application information and icons\n\nMaintain bilingual application information and the profile users see while authorizing access.\n\n<a id=\"profile\"></a>\n\n## Edit basic information\n\nLanguage switching changes presentation, not the stored source fields. Removing a Chinese translation returns the interface to the English fallback.\n\n1. Open an application and choose Basic information. Edit the default English name and description and, when needed, the Simplified Chinese translation.\n2. Choose a preset icon/background or use the available image upload and crop controls. Save and verify the resulting preview.\n3. If another collaborator changed the same draft, refresh its latest revision before reapplying your edits.\n\n<a id=\"authorization\"></a>\n\n## Information on the authorization page\n\nSandbox authorization reads the current draft profile. Production authorization reads the published snapshot; an installed application reads the release bound to that installation. Updating a draft therefore does not replace information on an existing published version.\n\nConfigure public HTTPS privacy-policy and terms URLs before release. Public listing requires a published version with complete English and Simplified Chinese names and descriptions.\n\n[Publish a version](https://open.limeai.run/docs/releases?locale=en)\n","revision":"sha256:51308400249afdaf55fc4bdee5e9d0322957ce83c9e26654aad7449f8cfbd7c0"},{"id":"collaboration","group":"guide","category":"Build your application","title":"Collaborators and test members","summary":"Grant the minimum role needed for configuration, operation or sandbox testing.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/collaboration?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"roles","title":"Application roles"},{"id":"add","title":"Add a collaborator or tester"}],"markdown":"# Collaborators and test members\n\nGrant the minimum role needed for configuration, operation or sandbox testing.\n\n<a id=\"roles\"></a>\n\n## Application roles\n\nPlatform review and finance roles are independent. An application owner cannot approve their own release by assigning an application administrator role.\n\n| Role | Actions |\n| --- | --- |\n| Owner / administrator | Configure, manage collaborators and clients, publish approved releases and manage distribution. |\n| Developer | Configure, manage testers, create and submit releases, and read logs. |\n| Operator | Read application information and diagnostic logs. |\n\n<a id=\"add\"></a>\n\n## Add a collaborator or tester\n\nRemoving a collaborator or tester can revoke the related sandbox grants. The owner cannot be removed or transferred from the collaborator table. Production private access is managed separately.\n\n1. Ensure the person is an active, verified member of the owning workspace.\n2. Open Collaborators or Test members in the application navigation and add the member by verified email.\n3. Use a developer role for configuration work and a tester entry for sandbox access. A tester entry alone does not grant configuration permissions.\n\n[Environment and access rules](https://open.limeai.run/docs/environments?locale=en)\n","revision":"sha256:37d068cbc7b860578ec218286d3067efb327eaa77145bab49e009aec1cbca0da"},{"id":"scopes","group":"guide","category":"Identity and authorization","title":"Configure OAuth permissions","summary":"Request the minimum permissions needed by each identity and resource operation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/scopes?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"catalog","title":"Identity scopes"},{"id":"configure","title":"Configure identity permissions"},{"id":"resource-scopes","title":"Controlled resource scopes"}],"markdown":"# Configure OAuth permissions\n\nRequest the minimum permissions needed by each identity and resource operation.\n\n<a id=\"catalog\"></a>\n\n## Identity scopes\n\n| Scope | Purpose |\n| --- | --- |\n| openid | Identify the signed-in user. Required for OpenID Connect and UserInfo. |\n| profile | Read the permitted profile name. |\n| email | Read email and verification status when consent permits. |\n| offline_access | Request a rotating refresh token for an eligible user grant. |\n\n<a id=\"configure\"></a>\n\n## Configure identity permissions\n\nRefreshing a token can narrow the original scope but cannot add permissions. An ID token is not an API access token; machine tokens do not grant user profile permissions.\n\n1. Open Permissions in the application console, choose Configure and select the required catalog entries.\n2. Register an OAuth client whose scopes fit within the application configuration. Request a space-separated subset in the authorization request.\n3. Read the scope returned with the token and handle omitted optional fields. A configured scope is not proof of user consent.\n\n```text\nscope=openid profile email offline_access\n```\n\n[Token guide](https://open.limeai.run/docs/tokens?locale=en)\n\n<a id=\"resource-scopes\"></a>\n\n## Controlled resource scopes\n\nThe dedicated public CLI client can request eight management scopes after explicit platform provisioning and deployment binding. These scopes are not available to ordinary application clients. Each scope bounds the delegated entry point and never replaces current membership, application/environment roles or strong-authentication checks.\n\nRead does not imply write, and write does not imply read. Request each required scope explicitly, review it during device consent and inspect the returned scope. Password and authenticator interactions remain in Auth; listing account security state does not expose secrets.\n\n| Resource | Read | Write |\n| --- | --- | --- |\n| Development | lime:open:read | lime:open:write |\n| Own account | lime:account:read | lime:account:write |\n| Operations | lime:operations:read | lime:operations:write |\n| Platform administration | lime:admin:read | lime:admin:write |\n\n[Management API access](https://open.limeai.run/docs/management-api?locale=en)\n","revision":"sha256:4b28e714bb1418d3e7270ebccecfbc04945471bf1a0328abb5e63120ac5d4288"},{"id":"oauth-clients","group":"guide","category":"Identity and authorization","title":"Register sign-in clients","summary":"Choose a public or confidential client and register exact callbacks for each environment.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/oauth-clients?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_client_list","management_open_client_create","management_open_client_update","management_open_client_activate","management_open_client_revoke","management_open_client_rotate_secret"],"sections":[{"id":"choose","title":"Choose a client type"},{"id":"register","title":"Register a client"},{"id":"credentials","title":"Rotate or revoke credentials"}],"markdown":"# Register sign-in clients\n\nChoose a public or confidential client and register exact callbacks for each environment.\n\n<a id=\"choose\"></a>\n\n## Choose a client type\n\nThe console currently registers public and confidential user clients. Machine-client provisioning is controlled separately; selecting a confidential client does not enable client_credentials.\n\n| Type | Use when | Authentication |\n| --- | --- | --- |\n| Public | Desktop, CLI or a client that cannot protect a secret. | Send client_id. Never embed a secret. Authorization-code flow requires S256. |\n| Confidential | A trusted server can keep credentials outside the browser. | Use client_secret_basic and S256 for authorization-code flow. |\n\n<a id=\"register\"></a>\n\n## Register a client\n\nSandbox accepts an explicitly registered HTTP loopback callback. Production requires HTTPS and an eligible published configuration. Client creation, key rotation and sensitive changes may require recent multi-factor authentication.\n\n1. An owner or administrator opens Sign-in clients, selects Sandbox and chooses Create client.\n2. Enter the name, client type, exact callback URI and required scopes. Callbacks on one client must share one hostname; use separate clients for different hosts.\n3. Copy the Client ID. For a confidential client, save the one-time secret in a server-side secret store before closing the dialog.\n\n<a id=\"credentials\"></a>\n\n## Rotate or revoke credentials\n\n1. Prepare your application to receive the replacement confidential-client secret before rotating it.\n2. If a request times out, use the console's recovery action and the original request context. Replaying a completed credential operation does not reveal the secret again.\n3. If the original secret was not saved, perform a new explicit rotation. Revoking a client disables its access and grants; read the current state before retrying.\n\n[Public protocol fields](https://open.limeai.run/docs/api?operation=identity_token&locale=en)\n","revision":"sha256:6d382fdd51b9ef969b6897729dd5201f7f0d110544a8e837dac9e7724b7f2bef"},{"id":"environments","group":"guide","category":"Identity and authorization","title":"Sandbox, production and access","summary":"Keep credentials and authorization boundaries separate while using the same Application ID.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/environments?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"compare","title":"Environment differences"},{"id":"promote","title":"Prepare production access"}],"markdown":"# Sandbox, production and access\n\nKeep credentials and authorization boundaries separate while using the same Application ID.\n\n<a id=\"compare\"></a>\n\n## Environment differences\n\n| Setting | Sandbox | Production |\n| --- | --- | --- |\n| Configuration | Current draft. | Published or installation-bound frozen version. |\n| User access | Eligible collaborators and test members. | Approved internal private access or an eligible customer installation. |\n| Callbacks | Exact registration; HTTP loopback is permitted. | Exact HTTPS registration. |\n| Client state | Available under sandbox policy. | Explicit activation after release checks. |\n\n<a id=\"promote\"></a>\n\n## Prepare production access\n\nAdding a user as a developer is not a substitute for production customer access. Removing membership, access or an installation can revoke related grants immediately.\n\n1. Complete sandbox tests, publish an independently approved version and register a production client within that published configuration.\n2. Explicitly activate a pending production client. Configure internal private access or complete partner distribution and customer installation as applicable.\n3. Use the production Client ID and current allowed scopes. Never reuse a sandbox credential as a production credential.\n\n[Customer installation](https://open.limeai.run/docs/installations?locale=en)\n","revision":"sha256:4bafa629667768cc2f689a4a7653efd07ede337ede5cc5c35f7206c4ed8d82fd"},{"id":"webhooks","group":"guide","category":"Events and callbacks","title":"Subscribe to application events","summary":"Receive application lifecycle changes through a verified HTTPS endpoint.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhooks?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"events","title":"Available event types"},{"id":"activate","title":"Configure and activate"}],"markdown":"# Subscribe to application events\n\nReceive application lifecycle changes through a verified HTTPS endpoint.\n\n<a id=\"events\"></a>\n\n## Available event types\n\nThese are application management events, currently emitted with environment=sandbox. They do not represent production customer messages, purchases or profile-data events. Events are queued only while an endpoint is active and subscribed; activation does not replay historical events.\n\n| Event | Meaning |\n| --- | --- |\n| application.created.v1 | Application draft created. |\n| application.updated.v1 | Application display information changed. |\n| application.configuration.updated.v1 | Draft configuration revision changed. |\n| application.release.published.v1 | An approved configuration release was published. |\n\n<a id=\"activate\"></a>\n\n## Configure and activate\n\nPrivate networks, localhost, reserved IPs, credentials in URLs and redirects are rejected. A changed endpoint URL invalidates the old verification and queued endpoint generation.\n\n1. Prepare a public HTTPS endpoint that accepts JSON POST requests and supports endpoint verification.\n2. Choose the event types and save the URL on the application's Event subscriptions page. Saving a URL does not send a request or activate delivery.\n3. An authorized administrator completes recent multi-factor authentication and chooses Activate. Return the received challenge in a JSON response.\n4. Store the one-time signing secret securely and verify every subsequent delivery signature before processing.\n\n```json\n{\"challenge\":\"<received challenge>\"}\n```\n\n[Build a webhook receiver](https://open.limeai.run/docs/webhook-tutorial?locale=en)\n\n[Verify event signatures](https://open.limeai.run/docs/webhook-signatures?locale=en)\n","revision":"sha256:95644fb0692c57cbba927562cd0a965dc19ff8b56b80e5b973f02735c93e0866"},{"id":"webhook-signatures","group":"guide","category":"Events and callbacks","title":"Webhook signatures and key rotation","summary":"Verify the raw request body, timestamp and delivery identity before acknowledging events.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-signatures?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"headers","title":"Delivery headers"},{"id":"verify","title":"Verify a delivery"},{"id":"rotate","title":"Rotate signing keys"}],"markdown":"# Webhook signatures and key rotation\n\nVerify the raw request body, timestamp and delivery identity before acknowledging events.\n\n<a id=\"headers\"></a>\n\n## Delivery headers\n\n| Header | Meaning |\n| --- | --- |\n| X-Lime-Event-Id | Stable event identity. |\n| X-Lime-Delivery-Id | Delivery identity used in signing and deduplication. |\n| X-Lime-Timestamp | Unix timestamp in seconds. |\n| X-Lime-Key-Id | Selects the signing key. |\n| X-Lime-Attempt | Current delivery attempt number. |\n| X-Lime-Signature | v1= followed by the hexadecimal HMAC-SHA256. |\n\n<a id=\"verify\"></a>\n\n## Verify a delivery\n\n1. Read the exact raw body bytes before parsing JSON. Select a trusted secret by X-Lime-Key-Id and reject unknown keys.\n2. Remove whsec_ from the secret and base64url-decode the remaining string to a 32-byte key.\n3. Reject timestamps more than five minutes in the past or future. Compute the HMAC below and compare the signature in constant time.\n4. Persistently deduplicate the delivery ID. Also use the event ID as the business idempotency key when an event can have multiple deliveries.\n\n```text\nmessage = timestamp + '.' + delivery_id + '.' + key_id + '.' + raw_body\nsignature = 'v1=' + hex(HMAC-SHA256(decoded_key, message))\n```\n\n<a id=\"rotate\"></a>\n\n## Rotate signing keys\n\n1. While the endpoint is active, choose Rotate key and complete the required authentication.\n2. Store the newly returned key and secret immediately. New deliveries use the new key ID; keep the previous key for the displayed 24-hour transition window.\n3. Remove the previous key after its transition expiry. If a rotation result is unknown, read the current key ID before deciding on another explicit rotation.\n\n[Delivery troubleshooting](https://open.limeai.run/docs/webhook-deliveries?locale=en)\n","revision":"sha256:d8dc4c27abb8752674e9048dba35fd37dac64fda8f4c243aa516d04a0ef2cd31"},{"id":"webhook-deliveries","group":"guide","category":"Events and callbacks","title":"Delivery logs, retries and quality","summary":"Understand delivery states and recover failed events without duplicating business actions.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-deliveries?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"states","title":"Delivery states"},{"id":"diagnose","title":"Troubleshoot a failed delivery"}],"markdown":"# Delivery logs, retries and quality\n\nUnderstand delivery states and recover failed events without duplicating business actions.\n\n<a id=\"states\"></a>\n\n## Delivery states\n\nDelivery is bounded and may repeat. Retries back off from about one minute up to one hour with a small jitter, and queued deliveries expire after seven days. The returned attempts and max_attempts fields show the current retry budget.\n\n| State | What to do |\n| --- | --- |\n| queued / delivering | Wait for scheduled processing; do not create a second business action. |\n| delivered | Receiver returned a 2xx response. |\n| dead_letter | Fix the receiver, inspect the failure, then explicitly retry when allowed. |\n| cancelled | Endpoint or generation is no longer active; inspect the current configuration. |\n\n<a id=\"diagnose\"></a>\n\n## Troubleshoot a failed delivery\n\nQuality statistics count deliveries created in the selected window by their status at the time of reading. Retry attempts are not separate deliveries. The default is seven days; a custom positive window can span at most 31 days.\n\n1. Open Event subscriptions > Delivery logs, or the application's Logs page, and locate the delivery by event type, status or request identifier.\n2. Check the last HTTP status, error, attempt count and next scheduled attempt. Fix TLS, public DNS, signature handling or receiver errors first.\n3. For an eligible dead-letter delivery on the current active endpoint, explicitly choose Retry once. Deduplicate the event in the receiver even after a manual retry.\n\n[Event receiver tutorial](https://open.limeai.run/docs/webhook-tutorial?locale=en)\n","revision":"sha256:b8261769d9034fd4955c3444f24ac403eb1c3de2271d4e1b6b454c103f0fd613"},{"id":"security-settings","group":"guide","category":"Build your application","title":"Security settings and policy URLs","summary":"Configure exact callback URLs, allowed origins and application security information.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/security-settings?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"settings","title":"Application security configuration"},{"id":"changes","title":"Change configuration safely"}],"markdown":"# Security settings and policy URLs\n\nConfigure exact callback URLs, allowed origins and application security information.\n\n<a id=\"settings\"></a>\n\n## Application security configuration\n\nSaving a security setting records configuration. It does not automatically create a client, activate production, or make a setting an authorization grant. Follow the individual API's current enforcement rules.\n\n| Setting | Value |\n| --- | --- |\n| redirect_uris | Up to 20 exact callback URLs. Production callbacks require HTTPS. |\n| allowed_origins | Up to 20 exact origins, without an arbitrary path. |\n| ip_allowlist | Up to 50 valid IP or CIDR entries. |\n| privacy_url / terms_url | Public HTTPS policy URLs used in the authorization profile. |\n\n<a id=\"changes\"></a>\n\n## Change configuration safely\n\n1. Open Security settings and edit one section or import one value per line in the section's bulk editor.\n2. Save and read the returned configuration. If a revision conflict occurs, refresh before applying changes to the new revision.\n3. For production changes, create a new frozen version and complete the review and publishing flow. Do not assume a draft edit changed an installed version.\n\n[Client callbacks](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Security practices](https://open.limeai.run/docs/security?locale=en)\n","revision":"sha256:269e4875d66824e6a9f1db7c1db4f74383970d4a98cc6d699b2499aaa0467151"},{"id":"releases","group":"guide","category":"Publish and distribute","title":"Create, review and publish versions","summary":"Freeze a tested draft, obtain independent approval and explicitly release it to production.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/releases?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_release_list","management_open_release_create","management_open_release_get","management_open_release_submit","management_open_release_publish"],"sections":[{"id":"freeze","title":"Create an immutable version"},{"id":"review","title":"Independent review and explicit publishing"},{"id":"recovery","title":"Recover an uncertain result"}],"markdown":"# Create, review and publish versions\n\nFreeze a tested draft, obtain independent approval and explicitly release it to production.\n\n<a id=\"freeze\"></a>\n\n## Create an immutable version\n\nA version freezes the current profile and configuration. Later draft edits do not alter that snapshot. Native application packages and the platform configuration release have separate lifecycles.\n\n1. Finish testing the intended application profile, scopes, callback settings and event configuration.\n2. Open Version management > Create version, enter an unused three-part semantic version such as 1.0.0, and describe the change.\n3. Open the version detail and confirm its frozen application information and configuration before submitting.\n\n<a id=\"review\"></a>\n\n## Independent review and explicit publishing\n\n1. Submit the exact frozen version. An independently authorized platform reviewer reviews it in the administration review center.\n2. If rejected, read the reason, modify the draft and create a new version. An application owner or submitter cannot replace independent review.\n3. After approval, an authorized owner or administrator explicitly publishes the version. Approval alone does not change the current published version.\n\n[First release tutorial](https://open.limeai.run/docs/first-release-tutorial?locale=en)\n\n[Production clients](https://open.limeai.run/docs/environments?locale=en)\n\n<a id=\"recovery\"></a>\n\n## Recover an uncertain result\n\nIf creating, submitting or publishing times out, use the displayed recovery action. The console preserves the original version request or reads the exact target version before continuing. Do not create a replacement version merely because a response was lost.\n\nA revision conflict, revoked permission or suspended application can reject the action. Refresh the current facts and choose the next permitted action rather than repeatedly submitting stale data.\n\n[Errors and recovery](https://open.limeai.run/docs/errors?locale=en)\n","revision":"sha256:d7fb5e513a19f9de37078e33c5168ebd71d364b481a8755265fb5c8b68449c85"},{"id":"distribution","group":"guide","category":"Publish and distribute","title":"Developer qualification and public listing","summary":"Make a partner application discoverable after the qualification, release and listing checks.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/distribution?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"qualification","title":"Apply for developer qualification"},{"id":"listing","title":"Submit a public listing"}],"markdown":"# Developer qualification and public listing\n\nMake a partner application discoverable after the qualification, release and listing checks.\n\n<a id=\"qualification\"></a>\n\n## Apply for developer qualification\n\nQualification belongs to the user/workspace context. A qualification approval does not approve an application version, listing or customer installation.\n\n1. Select the application's owning workspace and open Developer qualification.\n2. An eligible workspace owner or administrator enters the required profile and submits it for platform review.\n3. Wait for approval, or read the rejection reason and explicitly submit a corrected application.\n\n<a id=\"listing\"></a>\n\n## Submit a public listing\n\nHistorical published versions cannot be used to request a new listing. An internal application uses private availability rather than public listing. Installing an application and consenting to profile scopes remain separate steps.\n\n1. Publish the intended partner or official application version and ensure its frozen English and Chinese names and descriptions are complete.\n2. Open Publish and distribute, verify the selected current published version and submit the listing request with an approved developer profile.\n3. An independently authorized reviewer approves or rejects the exact request. Only the current eligible published and approved listing appears in the public application directory.\n\n[Customer installation and consent](https://open.limeai.run/docs/installations?locale=en)\n","revision":"sha256:23c62d6e03035ad5c28115c4c5f28d5d4930e27d2cc9561a8f1ce631eb17f132"},{"id":"installations","group":"guide","category":"Publish and distribute","title":"Installation and user consent","summary":"Bind customer access to an exact workspace, installation and release without merging authorization decisions.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/installations?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_account_installation_list","management_account_installation_get","management_account_installation_uninstall"],"sections":[{"id":"install","title":"Install an eligible application"},{"id":"authorize","title":"Authorize a user within an installation"}],"markdown":"# Installation and user consent\n\nBind customer access to an exact workspace, installation and release without merging authorization decisions.\n\n<a id=\"install\"></a>\n\n## Install an eligible application\n\nInternal production applications instead use approved private access in the owning workspace. Installation does not grant developer collaboration roles, and application ownership does not grant access to customer workspaces.\n\n1. A customer opens a currently published and approved application in the application directory.\n2. Choose the intended personal or organization workspace and review the exact release and requested scopes.\n3. An authorized customer explicitly approves the installation. Keep its installation ID, workspace ID and bound release together.\n\n<a id=\"authorize\"></a>\n\n## Authorize a user within an installation\n\nWhen using installation-bound production authorization, provide installation_id and space_id together when starting authorization or device authorization. The installation context is frozen before token exchange; do not send replacement installation fields to /oauth/token.\n\nAdministrator installation approval does not replace each user's consent to profile scopes. Uninstalling revokes related grants; it does not implicitly cancel a commercial subscription, refund a payment or delete financial records.\n\n[Authorization parameters](https://open.limeai.run/docs/api?operation=identity_authorize&locale=en)\n\n[Device authorization parameters](https://open.limeai.run/docs/api?operation=identity_device_authorization&locale=en)\n","revision":"sha256:a062e23a10a2d227caab723dedf324f9640f601af0a4752aa01c31d64b25b561"},{"id":"errors","group":"guide","category":"Troubleshooting","title":"Errors, rate limits and recovery","summary":"Distinguish protocol errors, rejected changes and uncertain results before retrying.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/errors?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"oauth","title":"OAuth error handling"},{"id":"console","title":"Console changes and uncertain results"}],"markdown":"# Errors, rate limits and recovery\n\nDistinguish protocol errors, rejected changes and uncertain results before retrying.\n\n<a id=\"oauth\"></a>\n\n## OAuth error handling\n\nProtocol endpoints return plain OAuth JSON. Branch on the error field rather than translated descriptions. A revoke success may have an empty response body.\n\n| Error / status | Recovery |\n| --- | --- |\n| invalid_client / 401 | Check client type, environment, activation and Basic authentication. Do not expose secrets in logs. |\n| invalid_grant | The code or grant is invalid, expired or already used. Start a new authorization when necessary. |\n| authorization_pending | Continue device polling at the returned interval. |\n| slow_down | Add five seconds to subsequent device polling intervals. |\n| access_denied / expired_token | Stop device polling and allow the user to start a new request. |\n| 429 / Retry-After | Wait for the indicated duration before retrying an eligible request. |\n\n<a id=\"console\"></a>\n\n## Console changes and uncertain results\n\nA 409 conflict commonly means stale configuration, a changed release state or a reused request key with different content. Read the current resource and review the permitted action before trying again.\n\nTimeouts, dropped responses and 5xx errors may occur after a change committed. Use the console recovery action with the original request. Credential recovery never returns an already-disclosed secret again; rotate explicitly if it was lost.\n\nIf recent authentication is required, complete the prompt, return to the pending operation and explicitly submit it. Switching account, workspace or application must not reuse another context's request.\n\n[Token rotation rules](https://open.limeai.run/docs/tokens?locale=en)\n\n[Webhook diagnostics](https://open.limeai.run/docs/webhook-deliveries?locale=en)\n","revision":"sha256:4f36217ad0b1dacbbd33fc9e622d000e7fcc14cd727f88f3a2a37e2bb763eaac"},{"id":"security","group":"guide","category":"Troubleshooting","title":"Integration security practices","summary":"Protect credentials, validate authentication and keep application, customer and installation scopes explicit.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/security?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"credentials","title":"Protect credentials"},{"id":"validation","title":"Validate authentication results"}],"markdown":"# Integration security practices\n\nProtect credentials, validate authentication and keep application, customer and installation scopes explicit.\n\n<a id=\"credentials\"></a>\n\n## Protect credentials\n\n1. Use a public client when a secret cannot be kept private. Keep confidential-client secrets and refresh tokens in a protected server or private local credential store.\n2. Send tokens in the Authorization header or the required protocol form. Never place them in URLs, screenshots, source control or ordinary logs.\n3. Store only necessary data and revoke access when it is no longer required. Use separate sandbox and production credentials.\n\n<a id=\"validation\"></a>\n\n## Validate authentication results\n\n1. Bind unpredictable state, nonce and PKCE verifier values to the initiating browser transaction. Accept a callback only after state validation.\n2. Use an OIDC library to verify ID-token issuer, audience, signature, expiry and nonce with the discovered keys.\n3. Treat access tokens as opaque values and perform authorization checks on the server for the exact application and current installation scope.\n\n[Web sign-in tutorial](https://open.limeai.run/docs/pkce-tutorial?locale=en)\n\n[OpenID configuration](https://open.limeai.run/docs/api?operation=identity_discovery&locale=en)\n","revision":"sha256:3000ecb6bb087b47a0c51bc9483fe01084e72591a283df0a146bd020c928c6a0"},{"id":"pkce-tutorial","group":"tutorial","category":"Development tutorials","title":"Add web sign-in with PKCE","summary":"Run a complete authorization-code transaction with state, nonce and S256 PKCE.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/pkce-tutorial?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"1. Prepare the sandbox client"},{"id":"authorize","title":"2. Start authorization"},{"id":"exchange","title":"3. Validate the callback and exchange the code"}],"markdown":"# Add web sign-in with PKCE\n\nRun a complete authorization-code transaction with state, nonce and S256 PKCE.\n\n<a id=\"prepare\"></a>\n\n## 1. Prepare the sandbox client\n\n1. Create an application, add yourself as an eligible collaborator or tester and configure openid and profile.\n2. Register a sandbox public client and one exact callback, for example http://127.0.0.1:3000/callback. Choose a confidential client if a trusted server can protect its secret.\n3. Read the issuer metadata and use its endpoints. Choose the Auth origin of the environment you are integrating.\n\n```bash\ncurl \"$ISSUER/.well-known/openid-configuration\"\n```\n\n[Register a client](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n<a id=\"authorize\"></a>\n\n## 2. Start authorization\n\nGenerate fresh unpredictable values for each transaction. Bind the verifier and nonce to the state in the initiating browser session. CLIENT_ID, REDIRECT_URI and ISSUER below are your registered values.\n\n```javascript\nconst encode = bytes => btoa(String.fromCharCode(...bytes))\n .replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\nconst random = () => encode(crypto.getRandomValues(new Uint8Array(32)));\nconst verifier = random();\nconst state = random();\nconst nonce = random();\nconst challenge = encode(new Uint8Array(await crypto.subtle.digest(\n \"SHA-256\", new TextEncoder().encode(verifier),\n)));\nsessionStorage.setItem(\"lime.oauth.\" + state, JSON.stringify({\n verifier, nonce, createdAt: Date.now(),\n}));\nconst url = new URL(\"/oauth/authorize\", ISSUER);\nurl.search = new URLSearchParams({\n response_type: \"code\", client_id: CLIENT_ID,\n redirect_uri: REDIRECT_URI, scope: \"openid profile\",\n state, nonce, code_challenge: challenge,\n code_challenge_method: \"S256\",\n});\nlocation.assign(url);\n```\n\n<a id=\"exchange\"></a>\n\n## 3. Validate the callback and exchange the code\n\n1. Reject missing, mismatched or expired state. Read and remove only the matching stored transaction; handle error+state callbacks before code exchange.\n2. POST a form-encoded request with the code, original verifier, exact callback and client ID. A confidential client uses HTTP Basic rather than sending its secret in the form.\n3. Use an OIDC library to verify the ID token, including the saved nonce. Keep access tokens private and call UserInfo with the access token.\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --data-urlencode \"grant_type=authorization_code\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"code=$CODE\" \\\n --data-urlencode \"redirect_uri=$REDIRECT_URI\" \\\n --data-urlencode \"code_verifier=$CODE_VERIFIER\"\n```\n\n[Token endpoint](https://open.limeai.run/docs/api?operation=identity_token&locale=en)\n\n[Read UserInfo](https://open.limeai.run/docs/userinfo?locale=en)\n","revision":"sha256:38755e05d1ccc03d6b5dcaefb317684dd5b378bd29602de102fa140545cdffea"},{"id":"device-tutorial","group":"tutorial","category":"Development tutorials","title":"Authorize desktop and CLI applications","summary":"Sign in on a device without a browser callback using a user code and bounded polling.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/device-tutorial?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"start","title":"1. Request a device code"},{"id":"user","title":"2. Ask the user to verify the code"},{"id":"poll","title":"3. Poll at the returned interval"}],"markdown":"# Authorize desktop and CLI applications\n\nSign in on a device without a browser callback using a user code and bounded polling.\n\n<a id=\"start\"></a>\n\n## 1. Request a device code\n\nRegister a public user client and eligible sandbox test access first. Device authorization supports public and confidential user clients, but not machine clients or PKCE parameters.\n\n```bash\ncurl --request POST \"$ISSUER/oauth/device/authorization\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"scope=openid profile offline_access\"\n```\n\n<a id=\"user\"></a>\n\n## 2. Ask the user to verify the code\n\nDevice codes expire after 600 seconds. For installation-bound requests, provide installation_id and space_id together when starting the transaction.\n\n1. Display verification_uri and user_code. Keep the secret device_code on the requesting device.\n2. The user opens the verification page, signs in and confirms the code matches their own device.\n3. The user reviews the application and scopes, then explicitly approves or denies. Opening a link never approves access automatically.\n\n<a id=\"poll\"></a>\n\n## 3. Poll at the returned interval\n\nWait at least interval seconds between attempts. Continue on authorization_pending; add five seconds after every slow_down. Stop on success, denial, expiry or user cancellation. Do not change installation context during token exchange.\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --data-urlencode \"grant_type=urn:ietf:params:oauth:grant-type:device_code\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"device_code=$DEVICE_CODE\"\n```\n\n[Use LimeCloud CLI](https://open.limeai.run/docs/cli-auth?locale=en)\n\n[Device endpoint](https://open.limeai.run/docs/api?operation=identity_device_authorization&locale=en)\n","revision":"sha256:25f3a4d2162fe028499964606b25b6fdb981dab9fd8ece212c823ab2fa3bdb96"},{"id":"webhook-tutorial","group":"tutorial","category":"Development tutorials","title":"Build an application event receiver","summary":"Handle endpoint verification, validate signatures and safely acknowledge lifecycle events.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-tutorial?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"verify-endpoint","title":"1. Implement endpoint verification"},{"id":"verify-signature","title":"2. Validate regular event signatures"},{"id":"activate-test","title":"3. Activate and test"}],"markdown":"# Build an application event receiver\n\nHandle endpoint verification, validate signatures and safely acknowledge lifecycle events.\n\n<a id=\"verify-endpoint\"></a>\n\n## 1. Implement endpoint verification\n\nExpose a public HTTPS POST endpoint. Activation sends type=endpoint_verification, application_id and a random challenge. Echo the challenge in a JSON 2xx response. This unsigned verification request must never trigger business actions.\n\n```javascript\nconst payload = JSON.parse(rawBody.toString(\"utf8\"));\nif (payload.type === \"endpoint_verification\") {\n if (payload.application_id !== EXPECTED_APPLICATION_ID ||\n typeof payload.challenge !== \"string\") {\n response.writeHead(400).end();\n return;\n }\n response.writeHead(200, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ challenge: payload.challenge }));\n return;\n}\n```\n\n<a id=\"verify-signature\"></a>\n\n## 2. Validate regular event signatures\n\nThe Node.js helper checks the signature and five-minute timestamp window. Also implement bounded raw-body reading, trusted key lookup, durable deduplication and application/schema validation in your HTTP handler.\n\n```javascript\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nfunction verify(headers, rawBody, secret) {\n const timestamp = headers[\"x-lime-timestamp\"];\n const delivery = headers[\"x-lime-delivery-id\"];\n const keyID = headers[\"x-lime-key-id\"];\n const supplied = headers[\"x-lime-signature\"];\n if (!/^\\d+$/.test(timestamp ?? \"\") ||\n Math.abs(Date.now() / 1000 - Number(timestamp)) > 300 ||\n !/^[A-Za-z0-9_]{1,64}$/.test(delivery ?? \"\") ||\n !/^[A-Za-z0-9_]{1,64}$/.test(keyID ?? \"\") ||\n !/^v1=[a-f0-9]{64}$/.test(supplied ?? \"\") ||\n !secret?.startsWith(\"whsec_\")) return false;\n const key = Buffer.from(secret.slice(6), \"base64url\");\n if (key.length !== 32) return false;\n const expected = \"v1=\" + createHmac(\"sha256\", key)\n .update(timestamp + \".\" + delivery + \".\" + keyID + \".\")\n .update(rawBody).digest(\"hex\");\n return timingSafeEqual(Buffer.from(expected), Buffer.from(supplied));\n}\n```\n\n<a id=\"activate-test\"></a>\n\n## 3. Activate and test\n\n1. Select application.updated.v1, save the endpoint URL and activate it. Store the returned key ID and secret.\n2. Modify a harmless application description to generate an event. After signature validation, check application_id and schema_version.\n3. Persist the event before returning 2xx. Deduplicate by delivery and event ID, then inspect the delivery log.\n\n[Event configuration](https://open.limeai.run/docs/webhooks?locale=en)\n\n[Signatures and key rotation](https://open.limeai.run/docs/webhook-signatures?locale=en)\n","revision":"sha256:93d008ceb44be0426b02fc487040aae3a66a20109cf342916badbf85c32d410e"},{"id":"first-release-tutorial","group":"tutorial","category":"Development tutorials","title":"Publish your first version","summary":"Move a tested application from sandbox to an independently approved production release.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/first-release-tutorial?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"ready","title":"1. Check release readiness"},{"id":"submit","title":"2. Freeze, submit and publish"},{"id":"access","title":"3. Enable the intended audience"}],"markdown":"# Publish your first version\n\nMove a tested application from sandbox to an independently approved production release.\n\n<a id=\"ready\"></a>\n\n## 1. Check release readiness\n\n1. Verify both language profiles, icon, privacy policy and terms. Complete both languages before freezing a version intended for public listing.\n2. Test exact scopes and callbacks with an eligible sandbox user. Verify token handling and at least one expected denial.\n3. If using events, confirm endpoint verification, signatures and duplicate handling.\n\n[Integration security](https://open.limeai.run/docs/security?locale=en)\n\n<a id=\"submit\"></a>\n\n## 2. Freeze, submit and publish\n\n1. Create version 1.0.0 with release notes in Version management and verify its frozen profile and configuration.\n2. Submit the version for independent review. If rejected, correct the draft and create a new version number.\n3. After approval, an owner or administrator explicitly publishes it. Refresh to confirm the current published version.\n\n<a id=\"access\"></a>\n\n## 3. Enable the intended audience\n\n1. Register and activate a production client within the published callback and scope configuration.\n2. Configure internal private access, or complete partner qualification and exact-version listing review.\n3. Test production with the intended customer and verify that an unauthorized user is refused.\n\n[Distribution](https://open.limeai.run/docs/distribution?locale=en)\n\n[Environments](https://open.limeai.run/docs/environments?locale=en)\n","revision":"sha256:bfc0b7a3b06213422d7a5aa0aa5dfce7af871dad55d3aab251fe561da8276beb"},{"id":"api-overview","group":"api","category":"Resource APIs","title":"Public API overview","summary":"Choose identity protocols or controlled resource APIs and check each operation's authentication requirements.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/api-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"host","title":"Use the Auth host"},{"id":"endpoints","title":"Identity endpoints"},{"id":"format","title":"Formats and authentication"},{"id":"management","title":"Controlled resource entry points"}],"markdown":"# Public API overview\n\nChoose identity protocols or controlled resource APIs and check each operation's authentication requirements.\n\n<a id=\"host\"></a>\n\n## Use the Auth host\n\nPublic identity endpoints use the configured Auth origin: https://auth.limeai.run for production and https://auth.limeai.local for local platform development. Use Discovery for the exact issuer, endpoints, grants and signing algorithms.\n\n```bash\ncurl \"$ISSUER/.well-known/openid-configuration\"\n```\n\n[Browse all public operations](https://open.limeai.run/docs/api?locale=en)\n\n<a id=\"endpoints\"></a>\n\n## Identity endpoints\n\n| Endpoint | Purpose |\n| --- | --- |\n| GET /.well-known/openid-configuration | Issuer and endpoint discovery. |\n| GET /.well-known/oauth-authorization-server | OAuth authorization-server metadata, including the enabled MCP scope. |\n| GET /oauth/jwks | Public signing keys. |\n| GET /oauth/authorize | Browser authorization with state, nonce and S256. |\n| POST /oauth/token | Code exchange, refresh, device polling and eligible machine tokens. |\n| POST /oauth/device/authorization | Start a device authorization. |\n| GET or POST /oauth/userinfo | Read permitted user claims. |\n| POST /oauth/revoke | Revoke a token grant. |\n| POST /oauth/introspect | A confidential client checks its own token. |\n| POST /oauth/resource/introspect | Check one API and action using dedicated resource-server credentials. |\n\n<a id=\"format\"></a>\n\n## Formats and authentication\n\nOAuth POST requests use application/x-www-form-urlencoded, not JSON. Public clients send client_id. Confidential and machine clients use client_secret_basic; client_secret_post is not supported. Form-encode each credential before constructing Basic authentication.\n\nIdentity responses use plain OAuth JSON or redirects without a management data envelope. Successful revocation returns HTTP 200 with an empty body. Resource /api/v1 responses use JSON and the management data/error envelopes; each operation's schema is authoritative.\n\n[Errors and rate limits](https://open.limeai.run/docs/errors?locale=en)\n\n<a id=\"management\"></a>\n\n## Controlled resource entry points\n\nUse an explicitly configured API Origin and a user access token from the dedicated provisioned CLI client, with the API Origin as its bound audience. These are controlled management integrations, not generic permissions for any third-party client. Local contract coverage does not claim that a production API host is deployed.\n\n| Prefix | Resource coverage |\n| --- | --- |\n| /api/v1/open | Spaces, organization membership and application development, clients, events, releases and distribution. |\n| /api/v1/account | Own profile and security state, spaces, installations, sandbox purchases and personal receipts. |\n| /api/v1/operations | Authorized application products, campaigns, orders, delivery state, finance and audit. |\n| /api/v1/admin | Assigned platform permissions, reviews, books, periods and controlled notification state. |\n\n[Resource access and recovery](https://open.limeai.run/docs/management-api?locale=en)\n\n[CLI schema discovery](https://open.limeai.run/docs/cli-schema?locale=en)\n","revision":"sha256:8282802c7c0d3ae0368bbaaab8d1d3ff90b1ca639ffd4c226aa40ed17cf06519"},{"id":"management-api","group":"api","category":"Resource APIs","title":"Controlled management API","summary":"Authorize the dedicated CLI client for explicit user-scoped development, account, operations and administration methods.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/management-api?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"client","title":"Use the dedicated client and API audience"},{"id":"access","title":"Request the minimum scopes"},{"id":"http","title":"HTTP formats and pagination"},{"id":"writes","title":"Recover a mutation"}],"markdown":"# Controlled management API\n\nAuthorize the dedicated CLI client for explicit user-scoped development, account, operations and administration methods.\n\n<a id=\"client\"></a>\n\n## Use the dedicated client and API audience\n\nThe platform operator provisions and deployment-binds a dedicated public CLI client. It has no client secret. Ordinary application clients cannot request the eight lime:{open,account,operations,admin}:{read,write} scopes. The CLI uses device authorization and explicit user consent; it never self-registers this privileged client.\n\nSet the actual API Origin separately from the Auth issuer. Its value is the token's fixed API audience, and saved login state is bound to it. A machine/client-credentials token cannot invoke these user management methods. Production availability must be verified for the target deployment.\n\n<a id=\"access\"></a>\n\n## Request the minimum scopes\n\nGET and HEAD methods require the domain's read scope; mutations require write. Neither implies the other. The required scope is listed per method in the API reference and CLI schema. The default login requests only the four identity scopes, so business access always needs an explicit scope choice.\n\nScopes bound the delegation ceiling. Every request still checks the current user, organization membership, application and environment role, resource ACL, applicable installation, strong authentication and independent review rules. An admin scope grants no platform role by itself.\n\n```bash\nlimecloud-cli config init \\\n --issuer \"$ISSUER\" --api-origin \"$API_ORIGIN\" --client-id \"$CLI_CLIENT_ID\"\nlimecloud-cli auth login \\\n --scope \"openid profile email offline_access lime:account:read\"\nlimecloud-cli account profile get\n```\n\n<a id=\"http\"></a>\n\n## HTTP formats and pagination\n\nJSON writes use Content-Type: application/json and the operation's exact request schema. Success returns {data:...}; lists return {data:{items,next_cursor}}. Errors return {error:{code,message},request_id}. Follow the current operation's responses and retain request_id for diagnosis without logging authorization headers.\n\nA cursor belongs to its original authorized query. Continue explicitly while next_cursor is present, and discard it after changing user, space, application, environment or filters. Permission is rechecked on each page. A returned page is not an atomic cross-domain snapshot or a full-collection total.\n\n```bash\ncurl --fail-with-body \\\n --header \"Authorization: Bearer $ACCESS_TOKEN\" \\\n \"$API_ORIGIN/api/v1/account/profile\"\n```\n\n[List applications](https://open.limeai.run/docs/api?operation=management_open_application_list&locale=en)\n\n[Read own profile](https://open.limeai.run/docs/api?operation=management_account_profile_get&locale=en)\n\n[Publish a product](https://open.limeai.run/docs/api?operation=management_operations_product_publish&locale=en)\n\n[Review a submission](https://open.limeai.run/docs/api?operation=management_admin_review_decide&locale=en)\n\n<a id=\"writes\"></a>\n\n## Recover a mutation\n\nUse the operation's declared revision and stable Idempotency-Key where required. A conflict means you must inspect the original operation and current resource, not invent a new key. Never replay a financial, payment, publication or access change automatically after reauthentication or a scope switch.\n\nA timeout can leave the result unknown. Preserve original user, path bindings, body and key, then recover that operation in the same scope. Unsupported production payments, subscription renewals, offline licenses, enterprise federation and full finance workflows remain explicit product work; existing resource methods do not make those workflows complete.\n\n[API errors](https://open.limeai.run/docs/errors?locale=en)\n\n[Preview with the CLI](https://open.limeai.run/docs/cli-dry-run?locale=en)\n","revision":"sha256:7402802f1615e1dc4eea8783bd48325393f91d2db81747bfd52a94327c466938"},{"id":"tokens","group":"api","category":"Identity and authorization","title":"Access, ID and refresh tokens","summary":"Use the right token for each task and serialize refresh-token rotation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/tokens?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["identity_token","identity_introspect","identity_resource_introspect"],"sections":[{"id":"types","title":"Token types"},{"id":"refresh","title":"Refresh and replace atomically"},{"id":"machine","title":"Machine tokens"},{"id":"resource-server","title":"Validate machine resource access"}],"markdown":"# Access, ID and refresh tokens\n\nUse the right token for each task and serialize refresh-token rotation.\n\n<a id=\"types\"></a>\n\n## Token types\n\n| Token | Use |\n| --- | --- |\n| access_token | Opaque bearer credential; user grants with openid can call UserInfo. |\n| id_token | RS256-signed authentication result; verify using an OIDC library, never use as an API bearer credential. |\n| refresh_token | Rotating user-grant credential returned only for eligible offline_access grants. |\n\n<a id=\"refresh\"></a>\n\n## Refresh and replace atomically\n\n1. Keep one refresh operation in flight for a grant and read the latest refresh token.\n2. After success, atomically replace tokens and compute access-token expiry from expires_in.\n3. If the result is unknown, do not replay an old refresh token. Reauthorize when needed.\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --data-urlencode \"grant_type=refresh_token\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"refresh_token=$REFRESH_TOKEN\"\n```\n\n[Token variants](https://open.limeai.run/docs/api?operation=identity_token&locale=en)\n\n<a id=\"machine\"></a>\n\n## Machine tokens\n\nRegister a machine client from the application's credentials page in Open. Production clients require activation. In Console, the customer administrator then approves that exact production client, API Audience, scopes, data and fields within the installed release's service permissions.\n\nUse HTTP Basic with client_credentials, the original client_grant_id, one exact production audience and an explicit scope subset. Each field is sent once; customer and installation context cannot be overridden. Tokens last at most five minutes and cannot outlive the approval. Revocation, credential rotation or a security-generation change invalidates the original authorization.\n\nMachine tokens contain a stable service identity and have no user identity, MFA, user consent, ID token, refresh token or UserInfo access. Management /api/v1 still requires an authorized user grant. A business token does not make a resource endpoint available: a resource owner must enforce current scope, customer data and field limits; that resource-serving path is still being implemented.\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --user \"$CLIENT_ID:$CLIENT_SECRET\" \\\n --data-urlencode \"grant_type=client_credentials\" \\\n --data-urlencode \"client_grant_id=$CLIENT_GRANT_ID\" \\\n --data-urlencode \"audience=$API_AUDIENCE\" \\\n --data-urlencode \"scope=$BUSINESS_SCOPES\"\n```\n\n<a id=\"resource-server\"></a>\n\n## Validate machine resource access\n\nA resource server uses a separately provisioned verifier ID and secret, bound to one production API and explicit actions. Consumer OAuth clients and user sessions cannot substitute for this credential. Enrollment currently requires trusted internal orchestration; self-service management is pending. Rotation needs explicit approval for the new credential generation.\n\nTake audience and action from the resource endpoint's fixed policy. Submit them with the original bearer token to /oauth/resource/introspect using the verifier's HTTP Basic credentials. Only active:true permits proceeding. An inactive result contains no claims; authentication, denial, rate-limit, storage or audit failures must also deny access.\n\nBefore querying, counting, paginating, serializing or writing, enforce the returned customer, installation, resource and field limits against your real data ownership. An empty field list grants no fields. Do not cache allowed responses. A remote check does not lock your database: use your own transactional authorization boundary and original operation recovery for writes; Lime cannot guarantee atomic revocation of work already in flight.\n\n```bash\ncurl --request POST \"$ISSUER/oauth/resource/introspect\" \\\n --user \"$RESOURCE_SERVER_ID:$RESOURCE_SERVER_SECRET\" \\\n --data-urlencode \"token=$ACCESS_TOKEN\" \\\n --data-urlencode \"audience=$API_AUDIENCE\" \\\n --data-urlencode \"action=$API_ACTION\"\n```\n\n[Resource access check parameters](https://open.limeai.run/docs/api?operation=identity_resource_introspect&locale=en)\n","revision":"sha256:8922ec83850e7284eb1fe71f0c84e34125305ed1c56a85f5c13235e046aea612"},{"id":"userinfo","group":"api","category":"Identity and authorization","title":"Read user information and revoke access","summary":"Read permitted claims with a user access token and revoke grants when no longer needed.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/userinfo?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"read","title":"Read UserInfo"},{"id":"revoke","title":"Revoke a grant"}],"markdown":"# Read user information and revoke access\n\nRead permitted claims with a user access token and revoke grants when no longer needed.\n\n<a id=\"read\"></a>\n\n## Read UserInfo\n\nUse an active user access token with openid. profile and email control optional fields. Handle omitted fields and use sub as the application-scoped user identifier; do not identify a user by display name.\n\nID tokens and machine tokens cannot call UserInfo. Installation claims appear only for a current valid installation-bound grant.\n\n```bash\ncurl \"$ISSUER/oauth/userinfo\" \\\n --header \"Authorization: Bearer $ACCESS_TOKEN\"\n```\n\n[GET UserInfo](https://open.limeai.run/docs/api?operation=identity_userinfo&locale=en)\n\n[POST UserInfo](https://open.limeai.run/docs/api?operation=identity_userinfo_post&locale=en)\n\n<a id=\"revoke\"></a>\n\n## Revoke a grant\n\nConfidential clients use HTTP Basic instead of relying on a public client ID. Successful revocation has an empty HTTP 200 body. Clear local tokens after confirmation; deleting a local file alone does not revoke server-side access.\n\n```bash\ncurl --request POST \"$ISSUER/oauth/revoke\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"token=$REFRESH_TOKEN\" \\\n --data-urlencode \"token_type_hint=refresh_token\"\n```\n\n[Revocation](https://open.limeai.run/docs/api?operation=identity_revoke&locale=en)\n\n[Introspection](https://open.limeai.run/docs/api?operation=identity_introspect&locale=en)\n","revision":"sha256:42efd2478fb5683a4c958503ef725dcc129fab0ab6c0013504ee45045b5c097a"},{"id":"cli-auth","group":"cli","category":"Command-line tools","title":"CLI login and credential lifecycle","summary":"Sign in with a public client, read UserInfo and manage rotating credentials.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-auth?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["identity_device_authorization","identity_token","identity_userinfo","identity_userinfo_post","identity_revoke"],"sections":[{"id":"login","title":"Sign in"},{"id":"resume","title":"Separate authorization from polling"},{"id":"status","title":"Inspect and refresh"},{"id":"logout","title":"Revoke and sign out"}],"markdown":"# CLI login and credential lifecycle\n\nSign in with a public client, read UserInfo and manage rotating credentials.\n\n<a id=\"login\"></a>\n\n## Sign in\n\nFor an installed production application, pass both --installation-id and --space-id. The CLI does not register a platform client or approve consent automatically.\n\nThe default login requests openid profile email offline_access. Business scopes are never added automatically. The controlled management API requires the separately provisioned public CLI client, its bound API audience, and explicit lime:open, lime:account, lime:operations or lime:admin read/write scopes. An ordinary application client cannot obtain these eight management scopes.\n\n1. Register a public user client and ensure the account has the required sandbox or production access.\n2. Run auth login, open the printed verification URL and confirm the code on your own device.\n3. Review the application and scopes in the browser and explicitly approve. The CLI polls at the server-provided interval.\n\n```bash\nlimecloud-cli auth login \\\n --client-id \"$CLIENT_ID\" --issuer \"$ISSUER\" \\\n --scope \"openid profile offline_access\"\n```\n\n<a id=\"resume\"></a>\n\n## Separate authorization from polling\n\n--no-wait saves the pending device transaction in private local storage and returns the verification URL, user code, expiry and resume command. Review and approve in your own browser, then use --resume. The resume keeps the original issuer, client, API origin, scope and installation context; it never accepts a naked device code on the command line.\n\n```bash\nlimecloud-cli auth login --no-wait\nlimecloud-cli auth login --resume\n```\n\n<a id=\"status\"></a>\n\n## Inspect and refresh\n\nauth status reads local metadata and cannot prove the server still accepts a grant. auth whoami calls UserInfo. auth refresh requires an eligible refresh token and replaces it after a serialized rotation. Unknown refresh results must never replay the old token.\n\nUnset LIMECLOUD_ACCESS_TOKEN before login, refresh or logout so stored credentials and an externally supplied token are not confused.\n\nauth scopes reports issuer-supported scopes and the local grant; it does not prove this client has those scopes enabled. auth check --scope checks the unexpired saved grant locally, without proving current server-side role or resource access. Request additional scopes through a fresh explicit login and browser consent.\n\n```bash\nlimecloud-cli auth status\nlimecloud-cli auth whoami\nlimecloud-cli auth refresh\n```\n\n<a id=\"logout\"></a>\n\n## Revoke and sign out\n\nNormal logout revokes access before deleting local credentials; a failed revocation keeps them for recovery. --local-only clears only the local credential without confirming server-side revocation. Protect the credential file and never commit it.\n\n```bash\nlimecloud-cli auth logout\nlimecloud-cli auth logout --local-only\n```\n\n[Device authorization tutorial](https://open.limeai.run/docs/device-tutorial?locale=en)\n","revision":"sha256:c0c13ec39b3641e51753878bb7d25b9646fb0c9cf06e584303adab49c42da5b3"},{"id":"cli-api","group":"cli","category":"Command-line tools","title":"Discover and call APIs with the CLI","summary":"Inspect the current public contract before sending an explicitly scoped request.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-api?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"discover","title":"Find an operation"},{"id":"typed","title":"Call a resource method"},{"id":"call","title":"Call a public operation"},{"id":"output","title":"Output and automation"}],"markdown":"# Discover and call APIs with the CLI\n\nInspect the current public contract before sending an explicitly scoped request.\n\n<a id=\"discover\"></a>\n\n## Find an operation\n\nThe CLI uses the website's public identity and controlled management contracts. Explore identity, open, account, operations and admin offline. The catalog does not imply authorization: a management call still requires the dedicated CLI grant, explicit scope and current domain permissions. Browser-session BFF paths remain separate.\n\n```bash\nlimecloud-cli api list token --json\nlimecloud-cli api list --locale zh-CN\nlimecloud-cli api schema identity_device_authorization\n```\n\n<a id=\"typed\"></a>\n\n## Call a resource method\n\nTyped service resource method commands, api call operationId, and api METHOD PATH resolve the same public contract. Raw paths must exactly match a declared operation; arbitrary URLs and BFF paths are rejected. Auth and resource API origins are configured separately.\n\n--params accepts path/query parameters and --data accepts the declared request body. Both accept a JSON object, @file or - for stdin. Business requests preserve JSON types; OAuth POST data is form-encoded. Explicit typed field flags override the corresponding JSON fields. Use --header only for contract-declared headers such as Idempotency-Key.\n\nIn a management command, --client-id may name the target business client. Use --auth-client-id to override the login client, keeping target resources distinct from authentication context.\n\nadmin review list requires --kind releases, developers or listings to select the review queue. A review scope never replaces the independent reviewer role and resource checks.\n\n```bash\nlimecloud-cli schema open.application.list\nlimecloud-cli open application list \\\n --space-id \"$SPACE_ID\" --sort created_desc\nlimecloud-cli account profile get\nlimecloud-cli admin review list --kind releases\nlimecloud-cli api GET /api/v1/account/profile\n```\n\n<a id=\"call\"></a>\n\n## Call a public operation\n\nUse --param name=value for ordinary fields and --param-env name=ENV_NAME for sensitive fields. User endpoints can use LIMECLOUD_ACCESS_TOKEN or saved credentials. Eligible confidential endpoints use LIMECLOUD_CLIENT_SECRET.\n\n```bash\nlimecloud-cli api call identity_discovery \\\n --issuer \"$ISSUER\" --json\nlimecloud-cli api call identity_userinfo \\\n --issuer \"$ISSUER\" --json\nlimecloud-cli api call identity_revoke \\\n --issuer \"$ISSUER\" \\\n --param \"client_id=$CLIENT_ID\" \\\n --param \"token_type_hint=refresh_token\" \\\n --param-env token=REFRESH_TOKEN\n```\n\n<a id=\"output\"></a>\n\n## Output and automation\n\nUse --json for structured output and check the exit status before continuing. Protocol and HTTP failures are surfaced; the CLI does not send credentials across a cross-origin redirect.\n\nToken and secret fields are redacted by default. --show-secrets explicitly reveals sensitive response fields; use it only in a protected caller and never in shared logs. --locale controls API catalog metadata, not OAuth field names.\n\n[Public endpoint fields](https://open.limeai.run/docs/api?locale=en)\n\n[Formats and scripting](https://open.limeai.run/docs/cli-output?locale=en)\n","revision":"sha256:5996e94757fc69b8cdd96eae21ece55c91aad2ccbe188b168e52b523823b1cfb"},{"id":"cli-configuration","group":"cli","category":"Command-line tools","title":"Configure the CLI and connection context","summary":"Keep public settings, private credentials and Auth/API origins explicit and isolated.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-configuration?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"initialize","title":"Initialize public settings"},{"id":"variables","title":"Environment variables and files"},{"id":"precedence","title":"Precedence and context isolation"}],"markdown":"# Configure the CLI and connection context\n\nKeep public settings, private credentials and Auth/API origins explicit and isolated.\n\n<a id=\"initialize\"></a>\n\n## Initialize public settings\n\nconfig init and config set store issuer, api_origin, client_id and scope. They do not provision a client, enable a scope or save a client secret. Managed-resource access requires the dedicated public CLI client provisioned and bound by the platform operator.\n\nSet your actual API Origin explicitly; the CLI does not infer a deployed business API host. Use HTTPS except for permitted loopback development. Changing API Origin requires a new login bound to the intended destination.\n\n```bash\nlimecloud-cli config init \\\n --issuer \"$ISSUER\" --api-origin \"$API_ORIGIN\" --client-id \"$CLI_CLIENT_ID\"\nlimecloud-cli config show\nlimecloud-cli config set scope \"openid profile email offline_access lime:open:read\"\n```\n\n<a id=\"variables\"></a>\n\n## Environment variables and files\n\n| Variable | Purpose |\n| --- | --- |\n| LIMECLOUD_ISSUER | Auth origin for protocol requests. |\n| LIMECLOUD_API_ORIGIN | Explicit resource API origin, separately bound to the login. |\n| LIMECLOUD_CLIENT_ID | Registered authentication client, not a target resource ID. |\n| LIMECLOUD_SETTINGS | Path to the public client settings file. |\n| LIMECLOUD_CONFIG | Private credential file; defaults to ~/.config/limecloud/credentials.json. |\n| LIMECLOUD_ACCESS_TOKEN | Externally managed access token; never persisted as a login. |\n| LIMECLOUD_CLIENT_SECRET | Confidential identity protocol requests only; the public management CLI client has no secret. |\n\n<a id=\"precedence\"></a>\n\n## Precedence and context isolation\n\nExplicit connection flags override environment variables, then saved public settings. A saved login supplies identity context only when issuer and client match. --auth-client-id selects the authentication client in a typed business command, where --client-id may target a resource.\n\nOne credential file holds one login context. Use separate private files for separate environments; do not copy tokens across origins. Credentials and pending device state are private files with owner-only access. Authentication writes use a lock and atomic replacement; a stale lock or uncertain refresh needs deliberate recovery.\n\n[Login and consent](https://open.limeai.run/docs/cli-auth?locale=en)\n\n[Troubleshooting](https://open.limeai.run/docs/cli-troubleshooting?locale=en)\n","revision":"sha256:800a772f15c00c94470454dbe4bdaef7459e18f7b5a9422148e15812bba7d813"},{"id":"cli-schema","group":"cli","category":"Command-line tools","title":"Discover commands and schemas","summary":"Inspect command structure, required inputs, responses, identity and scope before calling an API.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-schema?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"browse","title":"Browse offline"},{"id":"contract","title":"Read a method contract"},{"id":"evolution","title":"Check the contract version"},{"id":"write-precondition","title":"Check the action before writing"}],"markdown":"# Discover commands and schemas\n\nInspect command structure, required inputs, responses, identity and scope before calling an API.\n\n<a id=\"browse\"></a>\n\n## Browse offline\n\nBy default, schema reads the bundled public contract without network access or credentials. Start at the root, narrow to a service or resource, then inspect a method. Dotted and space-separated paths are equivalent. Command resources and methods may use snake_case; copy exact names from the schema.\n\nFor explicitly linked task guides, inspect _meta.knowledge or the concrete command's --help. Each guide has its source, language and exact revision for docs read. knowledge.current_online is false: the bundled association does not verify the target deployment or grant permission. A missing or invalid guide snapshot reports unavailable without replacing the action contract.\n\nidentity contains protocol operations. open, account, operations and admin contain the controlled resource entry points. Catalog visibility is not permission to call; unsupported planned features do not appear as working methods.\n\n```bash\nlimecloud-cli schema\nlimecloud-cli schema open\nlimecloud-cli schema open.application.list\nlimecloud-cli schema open application list\nlimecloud-cli api list --locale zh-CN\nlimecloud-cli api schema management_account_profile_get\n```\n\n<a id=\"contract\"></a>\n\n## Read a method contract\n\n| Field | Use |\n| --- | --- |\n| name / description | The exact command and its task. |\n| inputSchema | Declared inputs, required fields, types, enums and their CLI carriers. |\n| outputSchema | The public response schema, including the API's own data envelope where present. |\n| _meta.operationId / method / path | The stable operation identifier and HTTP target. |\n| _meta.required_scopes / access_tokens | Required explicit scopes and permitted calling identity. |\n| _meta.risk / doc_url / envelope_version | Read/write classification, documentation link and CLI contract-envelope version. |\n\n<a id=\"evolution\"></a>\n\n## Check the contract version\n\nUse schema METHOD --online or api schema OPERATION --online to compare a local action with the selected deployment. Set the exact issuer and API origin in your CLI settings or pass --issuer and --api-origin. Public discovery sends no token or cookie, follows no redirects and does not log in, update software, open a page or call a business action. The target deployment must include this feature; a missing endpoint is unknown, not permission denied.\n\n_meta.contract_revision identifies this action's structural contract and explicit semantic revision. Software versions and changes to unrelated methods or documentation wording do not determine this match. Metadata is valid for 60 seconds and is fetched again on each explicit check. The related knowledge stays bundled, even when the action contract is checked online.\n\nmatched means the exact public contract matched at the observation time; it grants no permission or confirmation. ok:true means the schema query succeeded, so always inspect compatibility.status. Management writes also perform the execution precondition below. Managed Skill updates, exact preparation/confirmation and cross-upgrade recovery remain planned. Preserve the original request reference; checking or updating must not replay it.\n\n```bash\nlimecloud-cli schema open.client.list --online\nlimecloud-cli api schema identity_userinfo --online\nlimecloud-cli schema open.client.list --offline\n```\n\n| compatibility.status | Meaning |\n| --- | --- |\n| not-checked | Local contract only; no online observation. |\n| matched | This exact public action contract matched; authorization is still evaluated at execution. |\n| different | The target publishes a different contract; review it without silently replacing existing inputs. |\n| absent | This action is absent from the current public catalog. |\n| unknown | Discovery was unavailable, expired or invalid; read the stable reason. |\n\n[Preview the resolved request](https://open.limeai.run/docs/cli-dry-run?locale=en)\n\n[Public API reference](https://open.limeai.run/docs/api?locale=en)\n\n<a id=\"write-precondition\"></a>\n\n## Check the action before writing\n\nEach explicit Management write validates your input, then fetches public metadata from the selected API without a token or cookie. Only a match for this exact action allows the business request. A different software version or an unrelated action change does not block it. Discovery is fetched again for every write; there is no persistent compatibility cache or automatic retry.\n\nThe CLI supplies Lime-Action-Contract from its own bundled contract; you cannot override it with a flag or header. The API checks it again at execution, after Bearer authentication and scope checks, then invokes the original domain rules. A match does not grant current permissions, strong authentication, confirmation, idempotency or independent review. --dry-run stays offline and shows the local header without preparing or confirming an operation.\n\nAPI reference curl examples and the online debugger use the contract from this site's build. The debugger forwards that revision instead of silently substituting the newest one. For your own client, send the revision of the contract you actually support; copying the server's latest hash does not make an old payload compatible.\n\nA contract rejection proves only that this request did not invoke the domain action. An earlier timed-out request may still have committed. Preserve its original key, request and scope, and use the domain's original receipt or review process. Discovery, updates, sign-in and language changes never resend it automatically. Full prepared confirmation, cross-upgrade recovery and Skill update management are not yet delivered.\n\n| Result | Next step |\n| --- | --- |\n| action_contract_different | No write sent. Review the current schema and trusted caller updates; preserve earlier unknown operations. |\n| action_contract_absent / action_contract_unknown | No write sent. Check the target, discovery source and reason; do not treat this as permission denied. |\n| 428 ACTION_CONTRACT_REQUIRED | The caller omitted the required unique revision header. Review the client contract before updating it. |\n| 409 ACTION_CONTRACT_CHANGED | The execution contract differs, including a deployment change after discovery. No automatic resend. |\n| 503 ACTION_CONTRACT_UNAVAILABLE | The server cannot locate a current compiled contract. Check discovery before a new explicit request. |\n","revision":"sha256:869a6d30379e85279e05f02bda8286490fd2be3b28376be4b9f85757a871642e"},{"id":"cli-dry-run","group":"cli","category":"Command-line tools","title":"Preview requests with dry-run","summary":"Inspect resolved methods, URLs, inputs and redacted authentication without sending a request.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-dry-run?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"preview","title":"Preview an operation"},{"id":"limits","title":"What a preview can establish"}],"markdown":"# Preview requests with dry-run\n\nInspect resolved methods, URLs, inputs and redacted authentication without sending a request.\n\n<a id=\"preview\"></a>\n\n## Preview an operation\n\n--dry-run resolves the public operation, validates its declared local input and prints the request plan without network calls or credential writes. It is available for API methods and the supported auth login, refresh, logout and scopes previews. A request preview is not a server response.\n\nThe plan shows method, URL, parameters/body and authentication placeholders. Missing API Origin may remain a placeholder during preview; configure the actual origin and obtain the proper grant before execution. Dry-run always redacts sensitive fields, even if --show-secrets is also present.\n\n```bash\nlimecloud-cli identity token exchange \\\n --data '{\"grant_type\":\"client_credentials\",\"audience\":\"example-resource\"}' --dry-run\nlimecloud-cli account order create \\\n --app-id \"$APP_ID\" --environment sandbox \\\n --header \"Idempotency-Key=$ORDER_KEY\" \\\n --data '{\"quote_id\":\"quote_example\"}' --dry-run\n```\n\n<a id=\"limits\"></a>\n\n## What a preview can establish\n\nA successful preview confirms command resolution and supported local validation. It cannot prove an application exists, a quote is current, a server accepts the token, a role is still active, strong authentication is recent enough or a payment will succeed.\n\nInspect the original scope, body, revision and idempotency header before an intentional write. Removing --dry-run changes the command into an actual call. Reuse the original key and context when recovering an unknown result; previewing does not reserve an order or a key.\n\n[Scopes and management access](https://open.limeai.run/docs/management-api?locale=en)\n\n[Input and output formats](https://open.limeai.run/docs/cli-output?locale=en)\n","revision":"sha256:788868b8a01740d52ee2306866d9abb32006527c92d534d1d29a66863b9f85c6"},{"id":"cli-output","group":"cli","category":"Command-line tools","title":"Input, output and scripting","summary":"Use structured JSON, select data fields and handle exit status without leaking credentials.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-output?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"input","title":"Provide structured input"},{"id":"formats","title":"Choose an output format"},{"id":"files","title":"Upload a PNG icon"},{"id":"envelope","title":"Handle success and failure"}],"markdown":"# Input, output and scripting\n\nUse structured JSON, select data fields and handle exit status without leaking credentials.\n\n<a id=\"input\"></a>\n\n## Provide structured input\n\n--params and --data accept JSON objects up to 1 MiB, @path or - for stdin. Business payloads preserve nested objects, arrays, booleans and integer types according to their schemas. Explicit field flags take precedence over the corresponding JSON field. Sensitive inline fields are rejected; use private files, stdin or --param-env name=ENV_NAME.\n\nKeep decimal minor-unit amounts as strings, even inside JSON. Use only declared request headers. An unknown field, unsupported enum or missing required input is a validation failure; inspect schema before retrying.\n\nFor the product example, save the product draft from Products, pricing and commercial terms as product.json, then use a stable original product key. The example keeps --dry-run enabled so it only validates and previews the request.\n\n```bash\nlimecloud-cli open application list \\\n --params '{\"spaceID\":\"space_example\",\"sort\":\"created_desc\"}'\nlimecloud-cli operations product create \\\n --app-id \"$APP_ID\" --environment sandbox \\\n --header \"Idempotency-Key=$PRODUCT_KEY\" --data @product.json --dry-run\n```\n\n[Product draft example](https://open.limeai.run/docs/products-pricing?locale=en)\n\n<a id=\"formats\"></a>\n\n## Choose an output format\n\n| Flag | Behavior |\n| --- | --- |\n| --format json / --json | Default structured envelope with ok, identity, data and meta. --json cannot conflict with another format. |\n| --format ndjson | One JSON envelope per emitted row. An object such as a paginated page remains an object. |\n| --format table | Readable columns with bounded text for terminal inspection. |\n| --format csv | Quoted CSV cells; nested values remain JSON text. Apply spreadsheet import rules before opening untrusted content. |\n| --fields id,name | Select comma-separated paths relative to CLI data. Dot paths select nested fields; they do not change server permissions. |\n\n<a id=\"files\"></a>\n\n## Upload a PNG icon\n\nThe two declared icon upload methods accept --file PATH or --file - for stdin. Provide a 256 × 256 PNG of no more than 320 KiB; the request uses image/png bytes, not a JSON/base64 wrapper. Draft edits and icon uploads still require the current application's or space's development permissions.\n\nDry-run checks the local file and prints only byte count, dimensions and SHA-256 metadata; it does not send the image. Uploading an asset does not automatically change a published version's frozen icon.\n\n```bash\nlimecloud-cli open application_icon create \\\n --space-id \"$SPACE_ID\" --file \"./icon.png\" --dry-run\nlimecloud-cli open icon_asset create \\\n --space-id \"$SPACE_ID\" --app-id \"$APP_ID\" --file \"./icon.png\" --dry-run\n```\n\n<a id=\"envelope\"></a>\n\n## Handle success and failure\n\nSuccess writes to stdout. CLI errors write {ok:false,error:{type,code,message,...}} to stderr; validation may include subtype=invalid_argument, and remote errors may include status and retry_after. Success exits with 0, validation with 2 and other failures normally with 1; SIGINT and SIGTERM exit with 130 and 143. Error envelopes do not require an identity field.\n\nManagement HTTP responses use their own data envelope; the CLI unwraps that payload into CLI data. For a paginated result, preserve items and next_cursor and request subsequent pages explicitly. The CLI does not silently aggregate the full collection.\n\nTokens and secrets are redacted by default. --show-secrets is an explicit reveal for eligible API responses, never for dry-run or local status. Avoid sharing its output. Output identity describes the caller category; it is not a fresh proof of server-side authorization.\n\n```json\n{\n \"ok\": false,\n \"error\": {\n \"type\": \"validation\",\n \"subtype\": \"invalid_argument\",\n \"code\": \"invalid_arguments\",\n \"message\": \"Required parameter: spaceID\"\n }\n}\n```\n\n[Recover errors](https://open.limeai.run/docs/cli-troubleshooting?locale=en)\n","revision":"sha256:43a90403c318a8e6eee74b9fe3cd3a99095ed980980d827773e0e1110417902f"},{"id":"cli-troubleshooting","group":"cli","category":"Command-line tools","title":"CLI diagnostics and recovery","summary":"Diagnose configuration, scope, authorization and uncertain writes without replaying sensitive operations.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-troubleshooting?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_login_diagnosis_get"],"sections":[{"id":"diagnostics","title":"Start with local diagnostics"},{"id":"login-diagnosis","title":"Inspect an application's login configuration"},{"id":"errors","title":"Recover by failure type"},{"id":"private-state","title":"Protect recoverable private state"}],"markdown":"# CLI diagnostics and recovery\n\nDiagnose configuration, scope, authorization and uncertain writes without replaying sensitive operations.\n\n<a id=\"diagnostics\"></a>\n\n## Start with local diagnostics\n\ndoctor --offline and root whoami inspect only local configuration and credential metadata. auth whoami calls remote UserInfo. auth scopes contacts Discovery; auth check uses only the unexpired saved grant. These commands answer different questions, so a local authenticated result cannot prove current resource access.\n\n```bash\nlimecloud-cli --version\nlimecloud-cli doctor --offline\nlimecloud-cli whoami\nlimecloud-cli auth check --scope \"lime:open:read\"\nlimecloud-cli auth whoami\n```\n\n<a id=\"login-diagnosis\"></a>\n\n## Inspect an application's login configuration\n\nChoose the exact space, application and environment in your current Agent or terminal. Use the read-only scope lime:open:read with your registered CLI client. diagnose login checks the current open.login_diagnosis.get contract, then makes one delegated GET for the application diagnosis. HTTP, CLI and lime_open_login_diagnose share that report; each application and client source rechecks current access. It does not sign in, refresh credentials, open a browser, change configuration or continue to another page automatically.\n\nUse open space list and open application list to choose stable IDs; do not guess an application from its name. If diagnose --help does not list this task, obtain a trusted build that includes it. The target deployment must expose current public contracts. Missing or different contracts produce a blocked report before business reads.\n\n> ok:true means the CLI report was produced. The version-2 application report keeps check_code, status, coverage and individually timed owner-query evidence. CLI contract_check and actual HTTP transport are separate. login_verified and common_snapshot remain false; a continuation is never a complete list. Client summaries omit secrets, redirect URL contents and full scope lists. Configuration observation does not replace real OIDC login, API or Webhook acceptance.\n\n```bash\nlimecloud-cli open space list\nlimecloud-cli open application list --space-id space_example\nlimecloud-cli schema open.login_diagnosis.get\nlimecloud-cli diagnose login --space-id space_example --app-id app_example --environment sandbox --format table\nlimecloud-cli diagnose login --space-id space_example --app-id app_example --environment sandbox --limit 10 --json\n```\n\n| Report status | Meaning |\n| --- | --- |\n| observed | The complete returned list contains an active client with openid and redirect URIs. A real login remains unverified. |\n| attention | The complete returned list contains no such candidate. This describes configuration, not the cause of a specific failed login. |\n| partial | Only a page was inspected, or a source is unavailable. Continue explicitly with the returned cursor and identical scope when needed. |\n| blocked | Contract verification or the application read failed. Inspect stable check/error codes; no client list was read. |\n\n[OAuth clients](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n<a id=\"errors\"></a>\n\n## Recover by failure type\n\n| Failure | Recovery |\n| --- | --- |\n| invalid_arguments | Read the exact method schema, required path/header/body fields and declared enum values. Do not retry unchanged invalid input. |\n| api_origin_required / login_required | Set the actual API Origin and dedicated public client, then obtain a login bound to them. |\n| token_expired / missing_scopes | Refresh an eligible grant or explicitly sign in with the required scopes. Read and write scopes are separate. |\n| 401 / 403 | Check token issuer/audience, current membership, role, resource scope and strong authentication. Repeated login does not grant a missing domain role. |\n| 409 / stale revision | Read the current resource and original command result. Review the new state before an intentional resubmission. |\n| Transport failure / timeout | A write may have committed. Retain the original key, body and scope and recover that operation; do not create a replacement payment or order. |\n\n<a id=\"private-state\"></a>\n\n## Protect recoverable private state\n\nA refresh marked uncertain must not reuse the old rotating token; sign in again. Normal logout preserves local credentials if remote revocation fails; --local-only clears the local record without proving remote revocation. Clear an externally managed LIMECLOUD_ACCESS_TOKEN before local credential-changing auth commands.\n\nIf a process is forcibly stopped and leaves a lock, verify the recorded process has ended before the file owner resolves it. Do not send credential or pending-state files to support. Share only redacted version, method, error code and request/source identifiers relevant to the authorized scope.\n\n[Credential lifecycle](https://open.limeai.run/docs/cli-auth?locale=en)\n\n[Request previews](https://open.limeai.run/docs/cli-dry-run?locale=en)\n","revision":"sha256:d3c03bcc1226508a00d3f516e6354dc69420e6c1c983dbfadaa5d7cc8ff00eb8"},{"id":"account-spaces","group":"guide","category":"Accounts and organizations","title":"Personal and organization spaces","summary":"Use one Lime account across products while keeping personal and organization resources in their own spaces.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/account-spaces?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"one-account","title":"One account, multiple relationships"},{"id":"switch","title":"Select and switch spaces"},{"id":"portals","title":"Choose the right workspace"}],"markdown":"# Personal and organization spaces\n\nUse one Lime account across products while keeping personal and organization resources in their own spaces.\n\n<a id=\"one-account\"></a>\n\n## One account, multiple relationships\n\nA person can be a customer, an organization member and an application developer at the same time. Console and Open use the same account and memberships. Joining an organization does not transfer personal purchases, licenses, keys or application ownership into it.\n\nThe current space determines the resource context, not the account type. A space ID is a requested scope that the server must authorize on every request; knowing its ID grants no access.\n\n<a id=\"switch\"></a>\n\n## Select and switch spaces\n\nAn in-progress command remains bound to its original user, space, application and environment. Recover an unknown result in that original scope; never replay it in the newly selected space. Complete cross-tab behavior and bulk space administration remain under development.\n\n1. Sign in and choose an active personal or organization space you can access.\n2. Check the application and environment before changing configuration, installing an application or opening an order.\n3. When switching, clear selections, cursors and sensitive details from the previous space. Ignore responses that arrive for a previous context.\n\n<a id=\"portals\"></a>\n\n## Choose the right workspace\n\n| Entry | Task |\n| --- | --- |\n| Console | Your profile, security, installed applications and purchases in an authorized customer scope. |\n| Open | Application ownership, configuration, collaborators and publication. |\n| Portal | Sales, campaigns, orders and application finance within assigned permissions. |\n| Admin | Explicit platform review, access and finance responsibilities. |\n\n[Membership and permissions](https://open.limeai.run/docs/members-permissions?locale=en)\n\n[List own spaces API](https://open.limeai.run/docs/api?operation=management_account_space_list&locale=en)\n","revision":"sha256:f9182ef60ab8fbbac6141087199d5115e73ca465c9270d1cd77966d65bc9133b"},{"id":"members-permissions","group":"guide","category":"Accounts and organizations","title":"Organization members and permissions","summary":"Invite members and separate organization, application, installation and financial responsibilities.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/members-permissions?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"invite","title":"Invite a member"},{"id":"boundaries","title":"Keep permissions separate"},{"id":"revoke","title":"Change or revoke access"}],"markdown":"# Organization members and permissions\n\nInvite members and separate organization, application, installation and financial responsibilities.\n\n<a id=\"invite\"></a>\n\n## Invite a member\n\nPending invitations can expire or be revoked. Changing an owner through an ordinary membership edit is rejected; ownership transfer requires its own supported flow.\n\n1. Open the organization space as its current owner or administrator.\n2. Create an invitation for the intended email and an administrator, developer or member role. Access-changing writes require recent strong authentication.\n3. The recipient opens the invitation and explicitly accepts while signed in to the matching verified account. Check invitation status rather than assuming that sending a link created a membership.\n\n<a id=\"boundaries\"></a>\n\n## Keep permissions separate\n\n| Relationship | What it controls |\n| --- | --- |\n| Organization membership | Current organization access and permitted member-management actions. |\n| Application collaboration | An assigned application's development and release responsibilities. |\n| Installation and OAuth consent | An application's delegated use in a space and a user's own granted scopes. |\n| Purchase and entitlement | The buyer, beneficiary and purchased features defined by the order. |\n| Finance role | Specific book, application, environment and financial actions. Application ownership grants no automatic finance authority. |\n\n<a id=\"revoke\"></a>\n\n## Change or revoke access\n\nReview the target member and organization before changing a role or removing a member. The server rechecks current authority and revokes affected space grants as part of the change; hiding a navigation item is never an authorization control.\n\nA short-lived JWT does not preserve permission after membership removal. Keep historical orders and financial facts; revoking access is not a refund or a deletion of business records. Bulk governance, complete expiry policies and enterprise federation remain in the product scope.\n\n[Application collaborators](https://open.limeai.run/docs/collaboration?locale=en)\n\n[Enterprise identity](https://open.limeai.run/docs/enterprise-identity?locale=en)\n\n[Create an invitation API](https://open.limeai.run/docs/api?operation=management_open_invitation_create&locale=en)\n","revision":"sha256:dc2972e93af835ccb5045794fe03410087875d76fdd246373c675e237933ea15"},{"id":"identity-lifecycle","group":"guide","category":"Identity and authorization","title":"Account security and lifecycle","summary":"Plan registration, verification, MFA, recovery, sessions and revocation as one integration.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/identity-lifecycle?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"canonical-auth","title":"Use the central identity service"},{"id":"factors","title":"Strong authentication and recovery"},{"id":"sessions","title":"Sessions, linking and sign-out"}],"markdown":"# Account security and lifecycle\n\nPlan registration, verification, MFA, recovery, sessions and revocation as one integration.\n\n<a id=\"canonical-auth\"></a>\n\n## Use the central identity service\n\nSend users to the registered Auth flow for sign-in, verification, MFA and account recovery. Web applications use authorization code with S256 PKCE; public desktop and terminal clients use an appropriate public-client flow. Keep the application session distinct from the central sign-in session.\n\nCurrent identity implementation includes password and email challenges, WebAuthn, TOTP, recovery and session controls. Each enabled method needs its own negative and recovery tests. External social connections, enterprise OIDC/SAML, SCIM and full lifecycle acceptance are still being completed.\n\n<a id=\"factors\"></a>\n\n## Strong authentication and recovery\n\nPasskeys are bound to the registered RP ID and permitted origin. Custom application domains redirect to canonical Auth for registration and sign-in. A virtual authenticator test does not prove compatibility with every physical authenticator.\n\nSensitive factor removal, email changes, account linking and credential rotation require recent strong authentication. Email possession alone must not bypass MFA recovery policy. Recovery codes and one-time challenges are secrets and must never enter analytics or shared logs.\n\n<a id=\"sessions\"></a>\n\n## Sessions, linking and sign-out\n\nTreat an external identity as the issuer and subject pair. Matching email addresses do not justify automatic account linking. A supported linking flow must verify both the existing account and the new identity, then audit and notify the change.\n\nSigning out of one portal clears that portal's session; central sign-out revokes associated grants. Do not promise immediate sign-out from every independent external application without a verified logout contract. Keep revocation, account disabling and deletion effects explicit, including required retention of order and financial records.\n\n[OAuth clients](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Tokens and revocation](https://open.limeai.run/docs/tokens?locale=en)\n\n[List own sessions API](https://open.limeai.run/docs/api?operation=management_account_session_list&locale=en)\n\n[List own passkeys API](https://open.limeai.run/docs/api?operation=management_account_passkey_list&locale=en)\n","revision":"sha256:f3dcd46a3924bb453be8f90a392dfc16358a1850f79c68b37c262d5700815333"},{"id":"enterprise-identity","group":"guide","category":"Accounts and organizations","title":"Enterprise SSO and provisioning","summary":"Prepare organization-bound OIDC, SAML and SCIM integration without confusing domain discovery with access.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/enterprise-identity?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"availability","title":"Integration status"},{"id":"connection","title":"Define a connection"},{"id":"provisioning","title":"Provision and revoke members"}],"markdown":"# Enterprise SSO and provisioning\n\nPrepare organization-bound OIDC, SAML and SCIM integration without confusing domain discovery with access.\n\n<a id=\"availability\"></a>\n\n## Integration status\n\nExternal enterprise OIDC, SAML 2.0 service-provider integration, verified-domain discovery, JIT and SCIM 2.0 are part of Lime's requirements. These integrations are not currently ready for production onboarding. Platform portals sharing central Lime SSO does not establish support for an external enterprise identity provider.\n\nDo not submit real enterprise tokens or production metadata to an unannounced endpoint. Available operations and required permissions will be listed in the public API reference as the corresponding contracts are delivered.\n\n<a id=\"connection\"></a>\n\n## Define a connection\n\n1. Identify the organization owner, the identity provider, allowed issuers or SAML entities, and the applications that may use this connection.\n2. Verify control of a claimed domain and configure the applicable protocol validation, credential rotation and expiry procedures.\n3. Approve explicit membership and role mapping. Domain discovery assists sign-in routing; it grants neither membership nor administrator privileges.\n\n<a id=\"provisioning\"></a>\n\n## Provision and revoke members\n\nJIT and SCIM may establish memberships only under an approved organization policy. SCIM credentials and connection administration need separate authority and audit. Provisioning must not copy personal purchases or automatically link accounts with matching email addresses.\n\nAcceptance must cover duplicate delivery, concurrent updates, disabled users, organization removal, credential rotation and provider outages. Disabling access preserves required commercial and audit facts. Until these controls are verified, keep enterprise onboarding closed.\n\n[Organization permissions](https://open.limeai.run/docs/members-permissions?locale=en)\n\n[Account lifecycle](https://open.limeai.run/docs/identity-lifecycle?locale=en)\n","revision":"sha256:b499cab204c7ef7e7dd42094fb165f3186d738171521f1abb5850986adbfbe11"},{"id":"custom-domains","group":"guide","category":"Build your application","title":"Independent applications and custom domains","summary":"Connect your independently hosted application and plan domain verification and brand-scoped access.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/custom-domains?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"independent","title":"Keep the application independent"},{"id":"hosted-domain","title":"Custom-domain status"},{"id":"brand-billing","title":"Protect brand-scoped customer information"}],"markdown":"# Independent applications and custom domains\n\nConnect your independently hosted application and plan domain verification and brand-scoped access.\n\n<a id=\"independent\"></a>\n\n## Keep the application independent\n\nLime provides identity and platform services to independently developed applications. Your application remains responsible for its code, deployment, local permissions and feature behavior. Register exact HTTPS callbacks for your own origin; do not share a confidential client secret with desktop installations.\n\nConnecting Lime does not require every free local feature to require online sign-in. Publish which functions need an account, a paid entitlement, connectivity or an offline policy.\n\n<a id=\"hosted-domain\"></a>\n\n## Custom-domain status\n\nCustom branded Console hosts and platform-hosted domain binding remain under development. Registration alone does not establish DNS ownership, issue a certificate or create a route. Production activation needs verified domain control, certificate readiness, exact application binding and isolation checks.\n\nA branded host may only narrow the authorized application and environment. It cannot widen access to another application or organization. Canonical Auth continues to own sign-in and Passkey origin; branding does not justify parent-domain cookies or exposing refresh tokens to the browser.\n\n<a id=\"brand-billing\"></a>\n\n## Protect brand-scoped customer information\n\nShow only products, orders and billing details allowed for the current brand and space. A partial view must state its coverage. If an original invoice includes other applications, do not expose its full attachment through a narrower brand host; require separately authorized platform Console access.\n\n[Register a client](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Billing documents](https://open.limeai.run/docs/billing-documents?locale=en)\n","revision":"sha256:b028b1e7f739207ac666327086e4c57ad608fa5c9641696fbb78beb1307f31e8"},{"id":"sdk-integration","group":"guide","category":"Build your application","title":"SDK and integration approach","summary":"Use standard protocol libraries and the public contract while Lime language SDKs are being completed.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/sdk-integration?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"protocols","title":"Start with the public contract"},{"id":"clients","title":"Choose a client model"},{"id":"acceptance","title":"Validate the integration"}],"markdown":"# SDK and integration approach\n\nUse standard protocol libraries and the public contract while Lime language SDKs are being completed.\n\n<a id=\"protocols\"></a>\n\n## Start with the public contract\n\nUse the API reference for supported operations, scopes, request schemas and error responses. OAuth/OIDC field names stay in their standard form. Use a maintained OAuth/OIDC library for authorization, PKCE, token validation and JWKS rotation instead of hand-written token verification.\n\nLime's workspace API client and generated types serve the portals. They are not published cross-language SDKs. Dedicated developer SDKs, broader resource integrations and application-side license consumption remain in the delivery scope; no unshipped package name or method is required by this guide.\n\n<a id=\"clients\"></a>\n\n## Choose a client model\n\n| Client | Integration |\n| --- | --- |\n| Web backend | Authorization code with S256 PKCE and an exact callback. Keep secrets and refresh tokens on the server. |\n| Desktop or terminal | A registered public client with PKCE or device authorization. Never embed a shared secret. |\n| Machine client | An explicitly registered machine identity, permitted audience and least-privilege scopes. No user impersonation. |\n\n<a id=\"acceptance\"></a>\n\n## Validate the integration\n\n1. Verify the issuer, audience, callback, state and nonce required by your chosen flow.\n2. Test cancellation, expiry, revoked permissions and scope mismatch in the sandbox; keep tokens out of URLs and shared logs.\n3. For writes, use the operation's idempotency and recovery contract. Redact diagnostics and keep the original request ID for support.\n\n[Web sign-in tutorial](https://open.limeai.run/docs/pkce-tutorial?locale=en)\n\n[CLI](https://open.limeai.run/docs/cli-overview?locale=en)\n\n[API reference](https://open.limeai.run/docs/api?locale=en)\n","revision":"sha256:d099601f85485d51f9350217a2d949bb8efe32400e22178f09a0852338ebbec6"},{"id":"products-pricing","group":"guide","category":"Commerce and entitlements","title":"Products, pricing and commercial terms","summary":"Publish bilingual product versions and calculate prices using precise currency amounts.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/products-pricing?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"catalog","title":"Prepare a product"},{"id":"money","title":"Use integer minor units"},{"id":"types","title":"Product types and availability"}],"markdown":"# Products, pricing and commercial terms\n\nPublish bilingual product versions and calculate prices using precise currency amounts.\n\n<a id=\"catalog\"></a>\n\n## Prepare a product\n\n1. In Portal, select an application and environment for which you have catalog permissions.\n2. Provide a stable product code, English and Simplified Chinese names, descriptions and commercial terms. Set the currency, price and applicable device limit.\n3. Review and publish a product version. Quotes read the published snapshot, so later draft edits do not change an existing order.\n\n<a id=\"money\"></a>\n\n## Use integer minor units\n\nAPI amount fields are decimal strings containing integer minor units, paired with an explicit currency. For a two-decimal currency, \"1999\" represents 19.99. Follow that currency's supported exponent; do not assume every currency has two decimal places or calculate money with JavaScript floating point.\n\nThe server creates the final offer and freezes the product version, price, terms and applicable campaign revision. Compare and aggregate only compatible currency amounts. Display prices in normal localized currency form instead of asking customers to enter minor units.\n\n```json\n{\n \"code\": \"desktop_license\",\n \"name\": { \"source\": \"Desktop license\", \"translations\": { \"zh-CN\": \"桌面许可证\" } },\n \"description\": { \"source\": \"Single-device access\", \"translations\": { \"zh-CN\": \"单设备使用\" } },\n \"terms\": { \"source\": \"One-time purchase terms\", \"translations\": { \"zh-CN\": \"一次性购买条款\" } },\n \"kind\": \"one_time\",\n \"interval\": \"\",\n \"currency\": \"USD\",\n \"amount\": \"1999\",\n \"device_limit\": 1\n}\n```\n\n<a id=\"types\"></a>\n\n## Product types and availability\n\nThe catalog models one-time and monthly/yearly subscription products. Current checkout supports only sandbox one-time purchases and rejects unsupported kinds. A subscription record in the catalog does not establish recurring billing or renewal support.\n\nTrials, recurring subscriptions, seat tiers, device activation, bundles and metered products remain in Lime's commercial requirements. Enable them only with their corresponding pricing, fulfillment, cancellation, refund and finance contracts.\n\n[Checkout and orders](https://open.limeai.run/docs/checkout-orders?locale=en)\n\n[Promotions and consent](https://open.limeai.run/docs/marketing-consent?locale=en)\n\n[Create a product API](https://open.limeai.run/docs/api?operation=management_operations_product_create&locale=en)\n","revision":"sha256:0d3dc317598e895d9581f583b323645e03639c8d8a782708ce83bade118fdb2e"},{"id":"checkout-orders","group":"guide","category":"Commerce and entitlements","title":"Quotes, orders, payments and refunds","summary":"Follow the sandbox purchase flow and recover uncertain results using the original order context.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/checkout-orders?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"flow","title":"Complete a sandbox purchase"},{"id":"facts","title":"Read the authoritative state"},{"id":"recovery","title":"Recover an unknown result"}],"markdown":"# Quotes, orders, payments and refunds\n\nFollow the sandbox purchase flow and recover uncertain results using the original order context.\n\n<a id=\"flow\"></a>\n\n## Complete a sandbox purchase\n\nProduction payment providers, recurring billing, partial refunds and disputes are still being completed. Sandbox payment and refund actions do not move real money.\n\n1. Select an eligible sandbox application and a published one-time product. Current checkout eligibility requires the application's development or testing access; an operator role alone is not customer eligibility.\n2. Request a server quote with product_id and an optional campaign_code. Review its frozen offer and expiry. Quotes currently expire after 15 minutes.\n3. Create the order with the quote_id and a stable Idempotency-Key. Persist the original key, request and scope before submission.\n4. Explicitly simulate payment in the sandbox, then read the original order and its entitlement. Simulate a full refund only when intended and confirm the resulting entitlement revocation.\n\n<a id=\"facts\"></a>\n\n## Read the authoritative state\n\n| State or evidence | Meaning |\n| --- | --- |\n| Quote | A time-limited frozen offer. It is not an order, payment or entitlement. |\n| Order | The buyer's accepted offer and original commercial context. |\n| Verified payment | A server-verified payment fact; a browser return or email is insufficient. |\n| Entitlement | The resulting benefit, checked independently from installation and OAuth consent. |\n| Finance posting | A separately consumed accounting fact. Delayed posting must not make the buyer pay again. |\n\n<a id=\"recovery\"></a>\n\n## Recover an unknown result\n\nA timeout does not mean the order failed. Retain the original idempotency key, quote and user/application/environment context. Read or retry the original operation according to its contract; changing the key can create a second order. The same key with a different body is a conflict.\n\nDo not replay a purchase after switching spaces or applications. Payment, refund, fulfillment and downstream delivery each have their own status. Notification or accounting failure does not undo a trusted payment or justify charging again.\n\n[Entitlements and licenses](https://open.limeai.run/docs/entitlements-licenses?locale=en)\n\n[Finance records](https://open.limeai.run/docs/finance-ledger?locale=en)\n\n[Create a quote API](https://open.limeai.run/docs/api?operation=management_account_quote_create&locale=en)\n\n[Create an order API](https://open.limeai.run/docs/api?operation=management_account_order_create&locale=en)\n","revision":"sha256:284454730bafd1c1272aa1a824f4c0e856d6a032289d9ad3ec13fce1dfba8f58"},{"id":"entitlements-licenses","group":"guide","category":"Commerce and entitlements","title":"Entitlements, licenses and devices","summary":"Map purchases to application features and keep paid access separate from sign-in and installation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/entitlements-licenses?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"entitlement","title":"Check the purchased benefit"},{"id":"license","title":"License and device integration status"},{"id":"lifecycle","title":"Plan the full lifecycle"}],"markdown":"# Entitlements, licenses and devices\n\nMap purchases to application features and keep paid access separate from sign-in and installation.\n\n<a id=\"entitlement\"></a>\n\n## Check the purchased benefit\n\nAn entitlement records the product and benefit obtained from a trusted purchase. Current sandbox orders return an entitlement with id, product_id, status, created_at and an optional revoked_at. Full sandbox refund revokes that entitlement atomically with the order change.\n\nA successful login proves identity, an installation delegates application access, and an entitlement permits a commercial feature. Evaluate all applicable checks. Installing an application is not a purchase; uninstalling it does not automatically refund an order or cancel renewal.\n\n<a id=\"license\"></a>\n\n## License and device integration status\n\nApplication-side license consumption, device activation and unbinding, seats, offline policies and revocation propagation remain in the product scope. The current order entitlement is not a completed offline license system. A product's device_limit does not by itself enforce activations on an external application.\n\nBefore enabling these features, define the beneficiary, application and feature identifiers, device/seat policy, validity, verification method and revocation behavior. Distinguish a lack of connectivity from a revoked license and publish any allowed offline grace period.\n\n<a id=\"lifecycle\"></a>\n\n## Plan the full lifecycle\n\n1. Bind fulfillment to the original paid order and make duplicate trusted events produce one benefit.\n2. Read the current authorized benefit before protected features; do not trust a client-supplied paid flag.\n3. Handle refund, expiry, cancellation, seat changes and device revocation under their own contracts, retaining original commercial evidence.\n\n[Orders and refunds](https://open.limeai.run/docs/checkout-orders?locale=en)\n\n[Installations](https://open.limeai.run/docs/installations?locale=en)\n","revision":"sha256:79d5286c3c49c7e93c5e286efe0ba6e79833bf44d5c5158c9d4a5c501614473d"},{"id":"finance-ledger","group":"guide","category":"Billing and finance","title":"Books, journals and accounting periods","summary":"Keep immutable double-entry records with explicit scope, source evidence and controlled corrections.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/finance-ledger?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"books","title":"Configure the financial scope"},{"id":"journals","title":"Post and correct a journal"},{"id":"periods","title":"Periods, balances and source delivery"}],"markdown":"# Books, journals and accounting periods\n\nKeep immutable double-entry records with explicit scope, source evidence and controlled corrections.\n\n<a id=\"books\"></a>\n\n## Configure the financial scope\n\nAn authorized finance administrator creates a book for a legal entity, environment, base currency and IANA timezone, then explicitly binds applications. The entity, currency and timezone are immutable after creation. An existing application binding cannot be silently moved to another book.\n\nPersonal spaces and customer organizations are not automatically legal entities or separate books. Sandbox books stay isolated from production. Application ownership and platform permission administration do not grant book-management or posting rights.\n\n<a id=\"journals\"></a>\n\n## Post and correct a journal\n\nPosting, reversal and period changes require their assigned financial actions and applicable recent strong authentication. Reauthentication returns to an explicit submission; it does not automatically replay a financial write.\n\n1. Select the authorized application, environment, open period and currency. Supply the original source reference and reason.\n2. Use integer minor-unit strings for each line. A journal needs at least two lines with equal debit and credit totals in the same book and currency.\n3. For manual posting, use the stable source_id as Idempotency-Key. A conflicting body for an existing source is rejected.\n4. Correct a posted journal through an appended reversal tied to the original journal. Never edit the posted lines; reversal uses the original-journal key reverse:<journalID>.\n\n<a id=\"periods\"></a>\n\n## Periods, balances and source delivery\n\nPeriod changes use the expected revision and a reason; closing requires verification evidence. Trial balance is calculated per period and currency. Balanced debits and credits prove ledger arithmetic, not that a payment provider or bank received money.\n\nSandbox payment and refund facts are delivered idempotently to Finance. Payment records a pending-settlement asset and deferred liability; refund reverses the original payment posting. This validates sandbox source accounting, not production revenue recognition. Reconciliation, complete closing, costs, allocations and revenue schedules remain under development.\n\n[Reconciliation and settlement](https://open.limeai.run/docs/reconciliation-settlement?locale=en)\n\n[Customer billing documents](https://open.limeai.run/docs/billing-documents?locale=en)\n\n[Journal list API](https://open.limeai.run/docs/api?operation=management_operations_journal_list&locale=en)\n\n[Period control API](https://open.limeai.run/docs/api?operation=management_admin_period_update&locale=en)\n","revision":"sha256:2d9203652c885c8e35f416b44759693e7ccc2aff6481be4ab94def9a326b98d7"},{"id":"billing-documents","group":"guide","category":"Billing and finance","title":"Customer billing and documents","summary":"Distinguish purchases, consumption, statements, receipts, invoices and credit notes in each customer scope.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/billing-documents?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"types","title":"Choose the correct document"},{"id":"coverage","title":"Read amounts with their coverage"},{"id":"status","title":"Current delivery and access rules"}],"markdown":"# Customer billing and documents\n\nDistinguish purchases, consumption, statements, receipts, invoices and credit notes in each customer scope.\n\n<a id=\"types\"></a>\n\n## Choose the correct document\n\n| Document | Meaning |\n| --- | --- |\n| Statement | A customer's applicable business details for a stated period and scope. |\n| Receipt | Evidence of an acknowledged payment. A notification receipt is not automatically a formal accounting or tax document. |\n| Invoice | An explicitly typed commercial or tax document from an identified issuer. Do not label every commercial invoice as a statutory tax invoice. |\n| Credit note | A correction tied to the original invoice. It does not confirm that cash has been refunded. |\n\n<a id=\"coverage\"></a>\n\n## Read amounts with their coverage\n\nCustomer billing combines authorized Commerce purchases and Finance billing facts; it creates no new wallet or independent ledger. Show period, timezone, currency, amount definition, source coverage and cutoff time. A current-page sum is not a full-list total.\n\nAn unavailable or unconnected source is unknown, not zero. Use an explicit missing value or null and label known partial amounts. Customer consumption and provider operating costs have separate definitions. Do not add currencies or count payment, consumption, refund and credit as independent copies of the same amount.\n\n<a id=\"status\"></a>\n\n## Current delivery and access rules\n\nCurrent Console supports sandbox orders, entitlements and personal in-app payment/refund receipts. Formal cross-application statements, invoice issuance, credit notes, full subscription billing and secure document exports remain in development. Do not treat a sandbox receipt as a released tax-invoicing service.\n\nPersonal documents require the buyer's access; organization documents require explicit organization billing authority. Published documents retain their original issuer, amounts, buyer details, terms and locale snapshot. A narrower brand scope cannot expose a full attachment containing other applications.\n\n[Personal and organization spaces](https://open.limeai.run/docs/account-spaces?locale=en)\n\n[Transaction notifications](https://open.limeai.run/docs/audit-notifications?locale=en)\n\n[Personal receipts API](https://open.limeai.run/docs/api?operation=management_account_receipt_list&locale=en)\n","revision":"sha256:9073a1be5a432600c1a429743e53d0cd3aca91628b0069e0a5fd4e57df2ad897"},{"id":"reconciliation-settlement","group":"guide","category":"Billing and finance","title":"Reconciliation, costs and partner settlement","summary":"Keep collection, revenue, provider settlement and bank receipt distinct before enabling real sales.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/reconciliation-settlement?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"reconcile","title":"Match independent evidence"},{"id":"costs","title":"Separate sales, cost and profit"},{"id":"partners","title":"Gate partner sales and payouts"}],"markdown":"# Reconciliation, costs and partner settlement\n\nKeep collection, revenue, provider settlement and bank receipt distinct before enabling real sales.\n\n<a id=\"reconcile\"></a>\n\n## Match independent evidence\n\nReconciliation matches orders and payments, journal entries, provider charges/refunds/fees, provider settlements and bank transactions. Each stage keeps its own source identifier, environment, currency, timestamp and matching result. A provider's successful payout status does not establish bank receipt.\n\nExternal reconciliation and production bank evidence are not currently integrated. Future controlled imports must deduplicate the original provider or bank transaction, preserve missing/conflicting evidence, and require explicit authorized adjustments. Opening a report must not execute a refund or silently alter a journal.\n\n<a id=\"costs\"></a>\n\n## Separate sales, cost and profit\n\nSales price and model list price do not establish actual cost. Record supplier, service period, original currency, application and evidence; distinguish estimates, received bills, confirmed expenses and paid amounts. Paying a bill must not record the same expense a second time.\n\nDirect costs belong to the applicable application; shared-cost allocation needs a versioned rule and an explicit unallocated remainder. Revenue recognition and cost reports are still under development. Reports must state period, timezone, currency, cutoff, calculation basis and missing sources.\n\n<a id=\"partners\"></a>\n\n## Gate partner sales and payouts\n\nPartner accrual, settlement, payouts, full closing and authorized exports are not yet delivered. These gates apply when the commercial model requires them, even before a public ecosystem opens. Listing or sign-in alone does not enable collection on behalf of a partner.\n\n1. Before the first applicable partner sale, agree the merchant model, seller, tax/invoicing responsibility, refund/dispute liability, fees, reserve and settlement terms.\n2. Freeze the agreement version and allocation with the sale. Finance derives accruals, reserves and payables from original commercial facts.\n3. Build a verifiable statement, approval, payable reservation, original payout instruction and independent result reconciliation. An unknown payout keeps its reservation until recovered; never create a second payout to resolve a timeout.\n\n[Ledger and periods](https://open.limeai.run/docs/finance-ledger?locale=en)\n","revision":"sha256:e249b95c5fbe1d4e82e36bc138d15da2b1ee5b6d6f0c276558c9f2c718af27e5"},{"id":"marketing-consent","group":"guide","category":"Marketing and operations","title":"Campaigns, consent and suppression","summary":"Apply precise campaign discounts and keep promotional contact permission separate from transactions.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/marketing-consent?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"campaigns","title":"Create and publish a campaign"},{"id":"rounding","title":"Understand integer discounts"},{"id":"consent","title":"Respect contact purpose and consent"}],"markdown":"# Campaigns, consent and suppression\n\nApply precise campaign discounts and keep promotional contact permission separate from transactions.\n\n<a id=\"campaigns\"></a>\n\n## Create and publish a campaign\n\n1. Choose the authorized Portal application and environment, then provide code, bilingual name, start/end times and percent_off_basis_points.\n2. Use UTC timestamps with the start before the end, and a discount from 1 to 9999 basis points. Create using a stable Idempotency-Key.\n3. Activate or archive with the current revision. A quote applies only eligible campaigns and freezes the applied campaign revision with its offer.\n\n<a id=\"rounding\"></a>\n\n## Understand integer discounts\n\n10,000 basis points represent 100 percent. The current discount calculation rounds down in minor units: for a 1999-minor-unit offer at 1500 basis points, the discount is 299 and the total is 1700. The server quote is authoritative; changing an active campaign does not reprice an existing order.\n\nCampaign creation, activation and archive use current permissions and transaction audit. Coupon redemption quotas, channel attribution, bundles and full campaign analysis remain under development.\n\n<a id=\"consent\"></a>\n\n## Respect contact purpose and consent\n\nMarketing consent and suppression management remain required product capabilities and are not yet delivered as an open integration. A purchase, OAuth consent, organization membership or transactional notification does not subscribe a person to promotional mail. Cross-product marketing does not authorize sharing private application data.\n\nBefore promotional delivery is enabled, record the permitted purpose, channel, source, scope and consent version; provide withdrawal and enforce suppression during delivery. Necessary payment and security notices use their own transactional purpose and must not be presented as marketing consent.\n\n[Products and pricing](https://open.limeai.run/docs/products-pricing?locale=en)\n\n[Notifications and audit](https://open.limeai.run/docs/audit-notifications?locale=en)\n\n[Preview a campaign change API](https://open.limeai.run/docs/api?operation=management_operations_campaign_preview&locale=en)\n","revision":"sha256:627c94db3fc0def62751bcea7781cb73c9b1e8614b258b29a5b0e522ec454f65"},{"id":"audit-notifications","group":"guide","category":"Marketing and operations","title":"Audit, notifications and delivery status","summary":"Trace authorized operations and independent notification delivery without exposing message contents or credentials.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/audit-notifications?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"audit","title":"Read an application audit trail"},{"id":"receipts","title":"Read personal transaction receipts"},{"id":"delivery","title":"Diagnose delivery safely"}],"markdown":"# Audit, notifications and delivery status\n\nTrace authorized operations and independent notification delivery without exposing message contents or credentials.\n\n<a id=\"audit\"></a>\n\n## Read an application audit trail\n\nPortal provides cursor-paginated audit for the authorized application and environment. Records contain id, actor_id, action, resource_type, resource_id, result, request_id and created_at. Each page rechecks current access; a cursor from another application or environment is invalid.\n\nNew Commerce and Marketing changes write the minimal audit record within their business transaction. Historical identity, access, application and finance audit remains with its original owner; the current list is not an exhaustive archive of every platform action. Historical adapters, retention policy and exports remain under development.\n\n<a id=\"receipts\"></a>\n\n## Read personal transaction receipts\n\nTrusted sandbox payment and refund facts produce personal in-app receipts through a persistent consumer. Receipt fields include source_id, application_id, environment, order_id, kind, currency, amount, occurred_at and read_at. Users can read only their own permitted receipts; the interface does not accept arbitrary recipients or message bodies.\n\nNotification and Finance independently consume the original fact. Delayed receipt delivery does not mean payment failed and must not trigger a second payment. A read receipt does not prove that email was delivered.\n\n<a id=\"delivery\"></a>\n\n## Diagnose delivery safely\n\nAuthorized Admin notification views expose controlled delivery status and timestamps. They do not expose recipient addresses, bodies, ciphertext, credentials or raw provider errors. Identity email and sandbox in-app receipts exist today; commercial email, suppression, templates, provider receipts and multiple channels are still being completed.\n\nUse the request or original source ID to correlate support evidence. Public application Webhooks have a separate verification, signing, retry and diagnostics contract; they are not a generic arbitrary-message channel.\n\n[Application Webhooks](https://open.limeai.run/docs/webhooks?locale=en)\n\n[Marketing purpose and consent](https://open.limeai.run/docs/marketing-consent?locale=en)\n\n[Application audit API](https://open.limeai.run/docs/api?operation=management_operations_audit_list&locale=en)\n","revision":"sha256:c8d2f6368b4f267f989fdcadfc2402b00fa85dcec8d81fd54968402ad8d66969"},{"id":"changelog","group":"guide","category":"Troubleshooting","title":"Platform documentation changelog","summary":"Track the developer-facing integration surface covered by this documentation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/changelog?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"current","title":"Application integration documentation"}],"markdown":"# Platform documentation changelog\n\nTrack the developer-facing integration surface covered by this documentation.\n\n<a id=\"current\"></a>\n\n## Application integration documentation\n\nThis documentation covers application creation, bilingual profiles, spaces and permissions, identity, events, publishing and installation, commerce, entitlements, marketing, audit, notifications and finance. Each integration states its current delivery status, including requirements still being completed.\n\nThe API reference and CLI share the identity and controlled management contracts. @limecloud/cli 0.3.0 is published to npm. Backend API deployment and dedicated-client activation must be verified separately; package installation does not grant a domain role, publish an application version or enable production payments.\n\n[API reference](https://open.limeai.run/docs/api?locale=en)\n\n[Start with the CLI](https://open.limeai.run/docs/cli-overview?locale=en)\n","revision":"sha256:f9be9717970fa42b6d65ba9a3726a8f83373cb1e6746af6ec3afe1ea8c56023a"},{"id":"application-concepts","group":"guide","category":"Understand the platform","title":"Application concepts","summary":"Distinguish the application, client, configuration, release and installation before connecting a product.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-concepts?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"model","title":"One application, several independent records"},{"id":"independent-axes","title":"Keep source, distribution and runtime separate"},{"id":"authorization","title":"Read authorization as a chain"}],"markdown":"# Application concepts\n\nDistinguish the application, client, configuration, release and installation before connecting a product.\n\n<a id=\"model\"></a>\n\n## One application, several independent records\n\nAn application is the stable platform identity of your software, not an executable package. Its App ID connects ownership, configuration, clients, release history and operations. Web, desktop and service components may belong to the same product without sharing one client credential.\n\n| Object | Meaning |\n| --- | --- |\n| Application | Stable product registration owned by an authorized personal or organization space. |\n| OAuth client | A separately registered caller with a type, environment, callbacks, scopes and applicable credentials. |\n| Configuration revision | A concurrency-protected edit of the current configuration. |\n| Release | A frozen application/configuration snapshot submitted for review and explicit publication. |\n| Installation | A space's approved application use, bound to a release and permitted users/scopes. |\n\n<a id=\"independent-axes\"></a>\n\n## Keep source, distribution and runtime separate\n\nOfficial, internal and partner describe application ownership and policy. Public/confidential/machine describe OAuth clients. Web/native/service describe where code runs. None of these axes implies the others: an official desktop application still needs a public client, while a partner backend can protect a confidential credential.\n\nAn application's software version, platform configuration release and product price version are separate. Publishing configuration does not distribute a desktop binary, change an existing order's price or install an application for customers.\n\n<a id=\"authorization\"></a>\n\n## Read authorization as a chain\n\nIdentity establishes who is calling. Membership and collaboration determine current duties. Scopes bound delegated API use; installation and consent constrain the customer context; entitlements allow paid features. Your integration must evaluate the applicable links instead of treating a token, an owner label or a paid flag as universal permission.\n\n[Choose an application type](https://open.limeai.run/docs/application-types?locale=en)\n\n[Choose an authorization flow](https://open.limeai.run/docs/oauth-overview?locale=en)\n\n[Membership and permission boundaries](https://open.limeai.run/docs/members-permissions?locale=en)\n","revision":"sha256:5a6e7dddb61a39be071a3c354eba03485f7dd3c18478413eaeaafc79a20f7478"},{"id":"platform-architecture","group":"guide","category":"Understand the platform","title":"Platform structure and entry points","summary":"Find the right portal and API without confusing hostnames, user roles and data ownership.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/platform-architecture?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"surfaces","title":"Choose a surface for the task"},{"id":"protocol","title":"Separate Auth and resource APIs"},{"id":"owners","title":"Keep facts with their source"}],"markdown":"# Platform structure and entry points\n\nFind the right portal and API without confusing hostnames, user roles and data ownership.\n\n<a id=\"surfaces\"></a>\n\n## Choose a surface for the task\n\n[Product entry points share platform services while keeping their authorization boundaries.](https://open.limeai.run/docs/platform-architecture?locale=en#surfaces)\n\n| Surface | Task |\n| --- | --- |\n| App | Discover published listings and start an explicit installation journey. |\n| Open | Configure an application, collaborate, test and submit releases. |\n| Auth | Sign in, complete factors and review OAuth/device consent. |\n| Console | Manage your own security, spaces, installed applications and purchases. |\n| Portal / Admin | Operate assigned applications or perform separately granted platform duties. |\n\n<a id=\"protocol\"></a>\n\n## Separate Auth and resource APIs\n\nIdentity protocol requests use the configured issuer and Discovery endpoints. Controlled resource APIs use an explicitly configured API Origin and /api/v1/open, /account, /operations or /admin. The dedicated CLI client requires a user grant, the bound API audience and explicit domain read/write scopes.\n\nBrowser portals use their own session and CSRF-protected BFF. Copying a browser BFF path into a Bearer client does not make it public. A host selects an entry; it never grants membership or access to another application's data.\n\n<a id=\"owners\"></a>\n\n## Keep facts with their source\n\nCommerce owns an order and trusted payment/refund facts. Finance records the derived ledger entry; Notification independently records delivery; Audit records authorized changes. A missing receipt or delayed journal cannot be interpreted as a failed payment. Query the original order and retain its source identifiers.\n\n[Public API entry points](https://open.limeai.run/docs/api-overview?locale=en)\n\n[Personal and organization spaces](https://open.limeai.run/docs/account-spaces?locale=en)\n\n[Independent and branded hosts](https://open.limeai.run/docs/custom-domains?locale=en)\n","revision":"sha256:067f588f83e3bae2aa74e9ef6f702a1924d45c95f5bc26a7036bb2677812e6e1"},{"id":"integration-scenarios","group":"guide","category":"Understand the platform","title":"Choose an integration scenario","summary":"Start with the feature your product needs, then add identity, lifecycle and commercial dependencies deliberately.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/integration-scenarios?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose","title":"Match a user journey to capabilities"},{"id":"incremental","title":"Adopt only the necessary dependency"},{"id":"acceptance","title":"Define a testable finish"}],"markdown":"# Choose an integration scenario\n\nStart with the feature your product needs, then add identity, lifecycle and commercial dependencies deliberately.\n\n<a id=\"choose\"></a>\n\n## Match a user journey to capabilities\n\n[Applications can adopt platform capabilities independently, subject to their prerequisites.](https://open.limeai.run/docs/integration-scenarios?locale=en#choose)\n\n| Journey | Required decisions |\n| --- | --- |\n| Add sign-in | Client type, exact callback or device flow, identity scopes and application session. |\n| Offer an organization application | Organization installation, permitted users, individual consent and current membership checks. |\n| Sell a product | Seller, terms, currency, trusted payment, benefit fulfillment, refund and applicable finance evidence. |\n| Automate platform management | Dedicated CLI client, fixed API audience, explicit scopes and current domain duties. |\n| Receive lifecycle events | HTTPS receiver, endpoint verification, signatures, durable deduplication and safe recovery. |\n\n<a id=\"incremental\"></a>\n\n## Adopt only the necessary dependency\n\nFree local features need not require online sign-in merely because a product is registered. A login integration need not create a commercial order. An installation does not automatically enroll the user in marketing. State account, network and purchase requirements at the feature where the user makes the decision.\n\nSandbox one-time checkout, orders, entitlements and their accounting/receipt consumers are available in the current implementation. Production providers, subscription renewal, device licensing and full billing remain separate delivery work. Keep the scenario in the plan without presenting a missing endpoint as working.\n\n<a id=\"acceptance\"></a>\n\n## Define a testable finish\n\n1. Record the actor, space, application, environment and feature result.\n2. Add denial, cancellation, expiry, revocation and uncertain-result recovery alongside the success path.\n3. Validate the actual external application and target deployment before claiming end-to-end availability.\n\n[Build a web application](https://open.limeai.run/docs/web-application?locale=en)\n\n[Connect a native application](https://open.limeai.run/docs/native-application?locale=en)\n\n[Launch checklist](https://open.limeai.run/docs/launch-checklist?locale=en)\n","revision":"sha256:c15675ad0d4873e3b19e003c8f13c3cd230bce1b0010f842315d271ba418b6c7"},{"id":"development-workflow","group":"guide","category":"Before development","title":"End-to-end development workflow","summary":"Move from a defined user journey to tested configuration, reviewed publication and ongoing operations.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/development-workflow?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"Define and register"},{"id":"develop","title":"Implement and test the sandbox"},{"id":"publish","title":"Freeze, review and publish"},{"id":"operate","title":"Operate the released integration"}],"markdown":"# End-to-end development workflow\n\nMove from a defined user journey to tested configuration, reviewed publication and ongoing operations.\n\n<a id=\"prepare\"></a>\n\n## Define and register\n\n1. Choose the product scenario, owning space and application source. Confirm who may develop, test, install, operate and approve the application.\n2. Create the application, complete public bilingual profile and policies, then add only the required collaborators.\n3. Select the minimum capability and client type, exact callbacks, identity scopes and appropriate test accounts.\n\n<a id=\"develop\"></a>\n\n## Implement and test the sandbox\n\nConfigure sandbox clients separately from production. Implement the complete callback/device flow and application session, then add the API or event handling required by the scenario. Use stable test resources and server-calculated prices; do not paste production credentials into a demo.\n\nTest the same operation after role removal, a stale revision, an expired code and a lost response. Keep a failed original command available for recovery. Documentation examples and previews help construct requests; they do not prove server authorization or payment success.\n\n<a id=\"publish\"></a>\n\n## Freeze, review and publish\n\n[Approval and publication are separate transitions; draft edits do not modify the frozen version.](https://open.limeai.run/docs/development-workflow?locale=en#publish)\n\n1. Finish the applicable release checks, then create a frozen version from the intended revisions.\n2. Submit the exact version for independent review. If rejected, correct the draft and submit a new frozen version rather than editing the old review.\n3. Explicitly publish the approved version, enable eligible production clients and validate the intended audience and denied audience.\n\n<a id=\"operate\"></a>\n\n## Operate the released integration\n\nMonitor configuration/release diagnostics, delivery failures and original transaction recovery. Review access and credential rotation. A future configuration change, product-price update or application binary release follows its own lifecycle; it must not rewrite a historical order or silently expand an existing installation's permission.\n\n[Create an application](https://open.limeai.run/docs/create-application?locale=en)\n\n[Verify launch readiness](https://open.limeai.run/docs/launch-checklist?locale=en)\n\n[Prepare for review](https://open.limeai.run/docs/review-guidelines?locale=en)\n","revision":"sha256:dfee14fc557a59b6276153324d59c37239edc4da879f8e8b91ca814aa5357486"},{"id":"application-capabilities","group":"guide","category":"Understand the platform","title":"Application capabilities","summary":"Understand which platform capability to configure and which product-specific behavior remains yours.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-capabilities?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"catalog","title":"Capability map"},{"id":"activate","title":"Configuration is not customer authorization"},{"id":"planned","title":"Plan remaining capabilities honestly"}],"markdown":"# Application capabilities\n\nUnderstand which platform capability to configure and which product-specific behavior remains yours.\n\n<a id=\"catalog\"></a>\n\n## Capability map\n\n| Capability | Platform responsibility | Application responsibility |\n| --- | --- | --- |\n| Identity | Standard OAuth/OIDC, device consent and account security. | Validate the flow and own application session, then enforce feature access. |\n| Lifecycle | Configuration revisions, frozen review and explicit publishing. | Build and deploy the actual software independently. |\n| Events | Subscribed application lifecycle deliveries and diagnostics. | Verify, deduplicate and process events safely. |\n| Commerce | Product/offer/order facts and supported payment/refund benefits. | Consume a supported benefit contract without inventing local paid authority. |\n\n<a id=\"activate\"></a>\n\n## Configuration is not customer authorization\n\nSelecting an application capability makes its configuration discoverable. It does not activate a production client, create a customer installation or approve user consent. A published application still needs the applicable distribution, installation, scope and current-access checks before use.\n\nSupported authentication, API and event capabilities are described by their current contracts. Lime does not provide Feishu chat bots, spreadsheets, calendars or arbitrary access to a desktop agent's files as a side effect of application registration.\n\n<a id=\"planned\"></a>\n\n## Plan remaining capabilities honestly\n\nEnterprise identity, dedicated language SDKs, custom-domain hosting, production payment providers, recurring billing, device/seat licensing and full finance workflows remain part of the product scope. Read each guide's availability before promising it to customers; a schema entry or a catalog model is not proof of a complete production journey.\n\n[SDK integration status](https://open.limeai.run/docs/sdk-integration?locale=en)\n\n[Enterprise identity](https://open.limeai.run/docs/enterprise-identity?locale=en)\n\n[Commercial capabilities](https://open.limeai.run/docs/products-pricing?locale=en)\n","revision":"sha256:7c16eae2342bbdc7bb5477107f0546e75b0a240c9f9516dc2caa3ff717b099ed"},{"id":"application-design","group":"guide","category":"Before development","title":"Design your application integration","summary":"Define user tasks, trust boundaries, permission requests and recovery before writing integration code.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-design?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"journey","title":"Describe one complete user task"},{"id":"boundaries","title":"Place the trust boundaries"},{"id":"ux","title":"Design the refusal and recovery screens"}],"markdown":"# Design your application integration\n\nDefine user tasks, trust boundaries, permission requests and recovery before writing integration code.\n\n<a id=\"journey\"></a>\n\n## Describe one complete user task\n\nStart with an observable task, such as signing in to a desktop product or installing an application for a team. Name the initiator, owning space, application, environment, expected benefit and data needed. Avoid making identity, installation, payment and marketing acceptance one indistinguishable confirmation.\n\n<a id=\"boundaries\"></a>\n\n## Place the trust boundaries\n\n| Boundary | Design decision |\n| --- | --- |\n| Browser / backend | Keep secrets and durable refresh tokens out of browser-visible configuration. |\n| Personal / organization | Select an explicit space; joining an enterprise never moves personal assets. |\n| Development / use | Separate collaborators from installation users and commercial beneficiaries. |\n| Trusted / untrusted extension | Do not load untrusted code into a session-bearing host based on a manifest alone. |\n\n<a id=\"ux\"></a>\n\n## Design the refusal and recovery screens\n\n1. Show the application, requested permission and intended space before an authorization decision.\n2. On cancellation or expiry, return to a safe task entry and allow a fresh explicit attempt.\n3. On unknown write results, show a recovery action for the original command instead of a second create/pay action.\n4. After reauthentication, require the user to review and submit the sensitive operation again.\n\n[Data protection design](https://open.limeai.run/docs/data-protection?locale=en)\n\n[Bilingual integration](https://open.limeai.run/docs/application-localization?locale=en)\n\n[Reliable commands](https://open.limeai.run/docs/api-idempotency?locale=en)\n","revision":"sha256:2816545aef74ed8ee50a3633bf50a761980044b5a788546570106d570d178d6e"},{"id":"development-environment","group":"guide","category":"Before development","title":"Prepare an integration environment","summary":"Separate the issuer, application, client and test data so sandbox evidence stays reproducible.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/development-environment?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"record","title":"Record the connection settings"},{"id":"local","title":"Local callbacks and HTTPS"},{"id":"verify","title":"Verify configuration before login"}],"markdown":"# Prepare an integration environment\n\nSeparate the issuer, application, client and test data so sandbox evidence stays reproducible.\n\n<a id=\"record\"></a>\n\n## Record the connection settings\n\n| Setting | What to verify |\n| --- | --- |\n| Issuer | Exact Auth origin and its Discovery issuer; no user-supplied arbitrary discovery URL. |\n| Client | Registered client ID, type, environment and activation status. |\n| Callback | Exact scheme, host, port, path and query if registered; no wildcard matching. |\n| API Origin | Explicit target resource origin and the dedicated CLI audience binding. |\n| Test user | Sandbox collaborator/test eligibility and appropriate organization/installation membership. |\n\n<a id=\"local\"></a>\n\n## Local callbacks and HTTPS\n\nA sandbox loopback HTTP callback may be registered where permitted. Lime still requires exact redirect matching, including the registered port; do not rely on a library's loopback-port relaxation. Production client redirects require HTTPS. A custom URI scheme is not a supported substitute for the current registered callback contract.\n\nThe platform's local multi-host environment uses explicit HTTPS hosts to exercise cookie isolation. An external application may run its own callback locally; verify its origin and issuer rather than assuming every localhost process shares one authentication context.\n\n<a id=\"verify\"></a>\n\n## Verify configuration before login\n\nUse a private credential file per environment and synthetic test identities. Never put a real client secret, token or recovery code into a screenshot, fixture or source file. Record versions and original request identifiers so a failed test can be reproduced without exposing credentials.\n\n```bash\ncurl \"$ISSUER/.well-known/openid-configuration\"\nlimecloud-cli --version\nlimecloud-cli config show\nlimecloud-cli doctor --offline\nlimecloud-cli schema identity.token.exchange\n```\n\n[Sandbox and production](https://open.limeai.run/docs/environments?locale=en)\n\n[CLI configuration](https://open.limeai.run/docs/cli-configuration?locale=en)\n\n[Callback rules](https://open.limeai.run/docs/callback-validation?locale=en)\n","revision":"sha256:49cd4b3ca5cc035206e311077e046440814bafb392f86a7cd97e7cf7f2d82b7a"},{"id":"web-application","group":"guide","category":"Build an integration","title":"Develop a web application","summary":"Connect a browser product to central sign-in while keeping callbacks, sessions and application permissions under control.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"architecture","title":"Choose browser and backend responsibilities"},{"id":"transaction","title":"Implement one authorization transaction"},{"id":"session","title":"Protect application requests"},{"id":"acceptance","title":"Test before moving to production"}],"markdown":"# Develop a web application\n\nConnect a browser product to central sign-in while keeping callbacks, sessions and application permissions under control.\n\n<a id=\"architecture\"></a>\n\n## Choose browser and backend responsibilities\n\nFor a server-rendered or backend-for-frontend application, keep the OAuth transaction, token exchange and refresh credentials on your backend. Give the browser only a protected application session. A browser-only public client cannot keep a client secret; choose that model only with a deliberate token-storage and cross-origin strategy.\n\nThe platform does not host your website when you register an application. You own the application's HTTPS origin, callback handler, application session and business API authorization. Lime supplies the configured identity and platform contracts.\n\n<a id=\"transaction\"></a>\n\n## Implement one authorization transaction\n\n1. Register the exact callback and minimum identity scopes, and add an eligible sandbox tester.\n2. Create fresh state, nonce and S256 PKCE values. Bind them to the initiating browser session and a permitted post-login destination.\n3. Validate the callback state and error path, exchange the code once, validate the ID token and establish the application's session.\n4. Clear transient authorization data and remove code/state from the visible callback URL before loading analytics or unrelated resources.\n\n<a id=\"session\"></a>\n\n## Protect application requests\n\nUse a host-scoped secure session cookie with appropriate SameSite policy and CSRF protection for application writes. The session must identify your validated user, not an unverified ID-token payload. Do not pass refresh tokens through iframe URLs, browser globals or micro-application props.\n\nRecheck business authority for the selected space, application and environment. A user who can sign in may still lack installation, enterprise membership or a paid benefit. Session expiration, central revocation and local logout need separate visible recovery.\n\n<a id=\"acceptance\"></a>\n\n## Test before moving to production\n\nCover two simultaneous login tabs, missing/mismatched state, reused code, revoked access, expired application session and a changed callback. Verify both supported languages and a narrow viewport without exposing secret fields. Use the real deployed application for acceptance; an API preview alone is insufficient.\n\n[Authorization code flow](https://open.limeai.run/docs/authorization-code-flow?locale=en)\n\n[Validate callbacks](https://open.limeai.run/docs/callback-validation?locale=en)\n\n[Validate ID tokens](https://open.limeai.run/docs/id-token-validation?locale=en)\n","revision":"sha256:573128a923f7929294db176c13d3328c674ad35abf09f00c188c67d2f1d72d0a"},{"id":"server-application","group":"guide","category":"Build an integration","title":"Develop a server integration","summary":"Separate confidential user sign-in, machine credentials and dedicated management automation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/server-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"Choose the calling identity"},{"id":"secrets","title":"Store and send credentials correctly"},{"id":"requests","title":"Build bounded resource requests"}],"markdown":"# Develop a server integration\n\nSeparate confidential user sign-in, machine credentials and dedicated management automation.\n\n<a id=\"identity\"></a>\n\n## Choose the calling identity\n\nA machine token does not call UserInfo or the current user-scoped /api/v1 management methods. Do not substitute a machine grant when a user grant expires, and do not reuse a user's refresh token as an unbounded shared service credential.\n\n| Need | Identity |\n| --- | --- |\n| Act for a signed-in user | Authorization code with PKCE, user consent and a confidential backend client where appropriate. |\n| Obtain a machine protocol token | An explicitly registered machine client with an allowed audience; no user profile identity. |\n| Automate Lime management | Dedicated public CLI user grant with explicit management scopes and current domain roles. |\n\n<a id=\"secrets\"></a>\n\n## Store and send credentials correctly\n\nInject confidential credentials through your deployment's private secret facility. OAuth POST fields use form encoding; client_secret_basic requires separately form-encoding the client ID and secret before constructing Basic authentication. Do not place the secret in the form or print headers during debugging.\n\nSerialize refresh-token rotation per grant and persist a recovery state before consuming the old credential. A response timeout may leave the old token consumed. Use a fresh explicit sign-in when the original outcome cannot be established instead of replaying the old token.\n\n<a id=\"requests\"></a>\n\n## Build bounded resource requests\n\n1. Load the exact public operation, intended origin, audience and required scope from the current contract.\n2. Send JSON only to JSON methods; keep amounts as integer strings and preserve path/resource bindings.\n3. Set timeouts, bound response sizes and refuse cross-origin credential forwarding. Recover writes with their original keys.\n4. Log stable operation and request/source IDs with redacted diagnostics, not tokens or private payloads.\n\n[Machine grant protocol](https://open.limeai.run/docs/client-credentials-flow?locale=en)\n\n[Controlled management access](https://open.limeai.run/docs/management-api?locale=en)\n\n[Retry and timeout policy](https://open.limeai.run/docs/api-retry-policy?locale=en)\n","revision":"sha256:87e3cf7ed201cbb608c1e6af5df3775ef37ae6b62ea3e5ea0db0670d859a9786"},{"id":"native-application","group":"guide","category":"Build an integration","title":"Develop a native application","summary":"Connect desktop and mobile software without embedding shared secrets or claiming unsupported host APIs.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/native-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"public-client","title":"Register a public client"},{"id":"browser","title":"Handle browser and device transitions"},{"id":"storage","title":"Protect local state and offline behavior"}],"markdown":"# Develop a native application\n\nConnect desktop and mobile software without embedding shared secrets or claiming unsupported host APIs.\n\n<a id=\"public-client\"></a>\n\n## Register a public client\n\nAn installed binary cannot protect a shared confidential secret. Register a public client and use the system browser for authentication. Device authorization is suitable when a verified browser callback cannot be provided. Keep public client IDs distinct for intended applications and environments.\n\nCurrent redirect registration accepts exact HTTPS callbacks and permitted sandbox loopback HTTP, not arbitrary native custom schemes. Do not assume that a platform supports a redirect style because an OAuth library offers it. Test the registered callback on the target operating system before choosing the flow.\n\n<a id=\"browser\"></a>\n\n## Handle browser and device transitions\n\n1. Show the application's name and explain that authentication continues in the user's browser.\n2. Keep state/nonce/verifier or secret device_code on the requesting device. Show only the verification URL and user code for device consent.\n3. Offer cancellation and expiry recovery. Stop bounded device polling on success, denial, expiry or cancellation.\n4. Establish a local account context only after verified protocol completion; opening a deep link alone is insufficient.\n\n<a id=\"storage\"></a>\n\n## Protect local state and offline behavior\n\nUse the operating system's private credential storage where available, and never place a refresh token in ordinary preferences, crash reports or synchronized logs. Serialize rotation and distinguish an expired credential from unavailable connectivity. A local-only sign-out does not prove server-side revocation.\n\nDevice activation, offline licensing, seats and revocation propagation remain under development. Current sandbox entitlements do not provide a completed offline license-verification SDK. Free local features can remain offline according to the product's published policy.\n\n[Device authorization reference](https://open.limeai.run/docs/device-authorization-flow?locale=en)\n\n[Commercial and offline policies](https://open.limeai.run/docs/entitlements-licenses?locale=en)\n\n[Client integration documentation](https://open.limeai.run/docs/client-overview?locale=en)\n","revision":"sha256:aa5818b6eb47542764bcef2b996a8a9dcaa1d624b1481278c17f31309542727f"},{"id":"oauth-overview","group":"guide","category":"Authorization flows","title":"OAuth and OpenID Connect concepts","summary":"Choose a supported grant and distinguish identity assertions, access tokens, scopes and audiences.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/oauth-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"terms","title":"The values serve different purposes"},{"id":"grants","title":"Select a supported flow"},{"id":"scopes","title":"Identity and management permission"}],"markdown":"# OAuth and OpenID Connect concepts\n\nChoose a supported grant and distinguish identity assertions, access tokens, scopes and audiences.\n\n<a id=\"terms\"></a>\n\n## The values serve different purposes\n\n| Value | Purpose |\n| --- | --- |\n| Authorization code | Short-lived, single-use credential exchanged with its original callback and verifier. |\n| Access token | Bearer credential for the permitted resource; do not treat it as an application session by inspection. |\n| ID token | Signed OIDC identity assertion verified for issuer, audience, lifetime and nonce. |\n| Refresh token | Sensitive rotating credential for eligible offline_access grants. |\n| Scope / audience | Delegated permission / intended resource. Neither replaces current domain authorization. |\n\n<a id=\"grants\"></a>\n\n## Select a supported flow\n\nUse authorization code with S256 PKCE when the user can return to an exact registered callback. Use device authorization for a desktop/terminal experience without that callback. Refresh a previously granted eligible session through rotation. Client credentials is a distinct registered machine identity, not a user login.\n\nImplicit, password grant, plain PKCE, request objects and arbitrary redirect schemes are not advertised by the current protocol. Read Discovery for the target deployment, then apply the client and application policies; a library's generic feature list does not activate server support.\n\n<a id=\"scopes\"></a>\n\n## Identity and management permission\n\nNormal user clients may request configured openid, profile, email and offline_access. The eight lime:* management scopes require the provisioned dedicated public CLI client and API audience binding. A resource read scope never implies write, and a management scope alone never grants an application or platform role.\n\n[Authorization code](https://open.limeai.run/docs/authorization-code-flow?locale=en)\n\n[Device authorization](https://open.limeai.run/docs/device-authorization-flow?locale=en)\n\n[Client credentials](https://open.limeai.run/docs/client-credentials-flow?locale=en)\n\n[Scope catalog](https://open.limeai.run/docs/scopes?locale=en)\n","revision":"sha256:0fc45f6c52074822669e39775d377698216ddf321249fa23172442f7a9d44947"},{"id":"authorization-code-flow","group":"guide","category":"Authorization flows","title":"Authorization code with S256 PKCE","summary":"Follow the exact request, callback, exchange and validation contract for user sign-in.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/authorization-code-flow?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prerequisites","title":"Prepare an eligible client"},{"id":"request","title":"Construct the browser authorization request"},{"id":"callback","title":"Validate and exchange once"},{"id":"prompt","title":"Handle authentication prompts explicitly"}],"markdown":"# Authorization code with S256 PKCE\n\nFollow the exact request, callback, exchange and validation contract for user sign-in.\n\n<a id=\"prerequisites\"></a>\n\n## Prepare an eligible client\n\nRegister a user client, an exact callback and allowed identity scopes. Sandbox users need the applicable test access; production requires a current published configuration, active client and applicable installation/access. Both public and confidential authorization-code clients use S256 PKCE.\n\n<a id=\"request\"></a>\n\n## Construct the browser authorization request\n\n[The callback code is exchanged once using the initiating transaction's verifier.](https://open.limeai.run/docs/authorization-code-flow?locale=en#request)\n\n| Parameter | Rule |\n| --- | --- |\n| response_type / response_mode | Use code; the supported response mode is query. |\n| client_id / redirect_uri | Use the exact registered client and callback, including port and path. |\n| state / nonce | Use fresh unpredictable values; current protocol requires at least 16 characters, with nonce required for openid. |\n| code_challenge / code_challenge_method | Use the base64url SHA-256 challenge and S256; retain the original verifier privately. |\n\n<a id=\"callback\"></a>\n\n## Validate and exchange once\n\nCurrent authorization codes last one minute and are single-use. A lost exchange response does not make the code reusable. Restart authorization when the outcome cannot be established, and never expose the code or verifier in diagnostic logs.\n\n1. Resolve only the initiating browser's matching unexpired state. Handle error plus state before considering any code exchange.\n2. POST grant_type=authorization_code, code, the original redirect_uri and code_verifier as a form. A public client sends client_id; a confidential client authenticates with client_secret_basic.\n3. Use a maintained OIDC library to verify the returned identity assertion against the original nonce and establish the local application session.\n\n<a id=\"prompt\"></a>\n\n## Handle authentication prompts explicitly\n\nThe current protocol accepts prompt=login, consent or none and an optional nonnegative max_age. Silent requests can return login_required or consent_required; do not turn these into an automatic approval. Return to an interactive browser journey when the user's decision is needed.\n\n[Runnable PKCE tutorial](https://open.limeai.run/docs/pkce-tutorial?locale=en)\n\n[Callback validation](https://open.limeai.run/docs/callback-validation?locale=en)\n\n[Authorization endpoint](https://open.limeai.run/docs/api?operation=identity_authorize&locale=en)\n","revision":"sha256:b7bbeb7b3fbaf7f8b0f1fb5059da4476932de70b094c7c054e6647f7b50a654b"},{"id":"callback-validation","group":"guide","category":"Authorization flows","title":"Callback registration and validation","summary":"Prevent redirect confusion, login substitution and cross-tab state mixing.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/callback-validation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"register","title":"Register one exact destination"},{"id":"transaction","title":"Bind state to the initiating transaction"},{"id":"response","title":"Process success and denial safely"}],"markdown":"# Callback registration and validation\n\nPrevent redirect confusion, login substitution and cross-tab state mixing.\n\n<a id=\"register\"></a>\n\n## Register one exact destination\n\nCompare the full registered redirect_uri, not only its origin or suffix. Scheme, host, explicit port, path and registered query are meaningful. Do not use wildcard callbacks, open redirects or a callback that forwards untrusted return_to values to another origin.\n\nProduction redirects require HTTPS. Permitted sandbox loopback HTTP still uses the exact registered port. Registering several user-client callbacks must follow the client's sector/host restrictions; do not assume multiple unrelated hosts can share one user client.\n\n<a id=\"transaction\"></a>\n\n## Bind state to the initiating transaction\n\n1. Generate a fresh high-entropy state and associate it with the original verifier, nonce, client and permitted post-login path.\n2. Store the transaction in the initiating server/browser context with a bounded lifetime; maintain separate entries for concurrent tabs.\n3. On callback, reject missing, duplicate, mismatched or expired values. Consume only the matching transaction and avoid clearing another tab's pending login.\n\n<a id=\"response\"></a>\n\n## Process success and denial safely\n\nAn error response still needs matching state. If the user denied authorization, show a safe return action without exchanging a code. If the callback contains inconsistent success/error parameters, reject it. Never create an account session just because the URL contains a code.\n\nAfter processing, remove authorization parameters from the browser-visible URL and avoid third-party resources on the callback page before cleanup. Retain only redacted error/request identifiers for diagnosis; the application's post-login destination must remain on an allowlisted route.\n\n[Authorization code reference](https://open.limeai.run/docs/authorization-code-flow?locale=en)\n\n[Diagnose a rejected callback](https://open.limeai.run/docs/api-debugging?locale=en)\n","revision":"sha256:247aae4a1bb4accdb1ce2addf45ce2daaa76b96bb5cc62d219be4f3c4af9b83d"},{"id":"client-credentials-flow","group":"guide","category":"Authorization flows","title":"Machine credentials","summary":"Authenticate an approved backend without representing an interactive user.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-credentials-flow?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"eligibility","title":"Confirm that a machine client fits"},{"id":"request","title":"Request a bounded token"},{"id":"operations","title":"Rotate and diagnose"}],"markdown":"# Machine credentials\n\nAuthenticate an approved backend without representing an interactive user.\n\n<a id=\"eligibility\"></a>\n\n## Confirm that a machine client fits\n\nUse a registered machine client only for a resource that explicitly accepts its audience and machine scopes. The client has no interactive redirect and cannot request openid, profile, email or offline_access. It does not create a human session or user consent.\n\nLime's controlled management API requires a dedicated CLI client and an authorized user. Exchanging a machine token successfully does not authorize /api/v1/open, /account, /operations or /admin. Choose the CLI user flow for those operations.\n\n<a id=\"request\"></a>\n\n## Request a bounded token\n\n1. Read the registered issuer, permitted audience and scopes from approved deployment configuration. Keep the secret in backend-only secret storage.\n2. POST the form grant_type=client_credentials with the permitted scope and audience to the discovered token endpoint. Authenticate with client_secret_basic, separately form-encoding the client ID and secret before constructing Basic credentials.\n3. Cache by issuer, client, audience and exact granted scope until shortly before expires_in. Do not treat a token for one resource as valid for another.\n\n<a id=\"operations\"></a>\n\n## Rotate and diagnose\n\nMachine grants have no refresh token. Obtain a new token when needed and serialize concurrent renewal. On invalid_client, inspect client activation and credential rotation before retrying; never fall back to a public client or place the secret in the request query. Preserve only redacted request identifiers.\n\n[Client types](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Rotate a secret](https://open.limeai.run/docs/client-secret-rotation?locale=en)\n\n[Token endpoint](https://open.limeai.run/docs/api?operation=identity_token&locale=en)\n","revision":"sha256:d947c2a3b0fd7d689fb31a82577285de02c5df889887db4b55675966af1a653d"},{"id":"refresh-token-flow","group":"guide","category":"Authorization flows","title":"Refresh and rotate user tokens","summary":"Extend an approved user grant while keeping refresh-token rotation consistent.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/refresh-token-flow?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"obtain","title":"Request offline access deliberately"},{"id":"rotate","title":"Serialize the refresh transaction"},{"id":"recover","title":"Handle a lost response"}],"markdown":"# Refresh and rotate user tokens\n\nExtend an approved user grant while keeping refresh-token rotation consistent.\n\n<a id=\"obtain\"></a>\n\n## Request offline access deliberately\n\nRequest offline_access during the original interactive authorization when the application needs continued access. The returned scopes and token response determine the actual grant; an application cannot manufacture a refresh token by adding a field locally. Store it using backend secret storage or the operating system credential store.\n\nAccess tokens currently last ten minutes and refresh grants have a bounded thirty-day lifetime. Always use the actual expires_in and server policy, and offer a new user authorization when the refresh grant expires or is revoked.\n\n<a id=\"rotate\"></a>\n\n## Serialize the refresh transaction\n\n1. Use one lock per stored grant so that concurrent requests cannot redeem the same refresh token.\n2. Send grant_type=refresh_token and the current refresh_token as a form to the discovered token endpoint, with the registered client authentication.\n3. Atomically store the new access token, replacement refresh token and expiry before allowing other requests to continue. Discard the previous refresh token after success.\n\n<a id=\"recover\"></a>\n\n## Handle a lost response\n\nA timeout may happen after the server has consumed and rotated the old token. Replaying it is unsafe and may trigger reuse protection. If the new grant cannot be recovered from your own atomic transaction, clear unusable credentials and start a new interactive authorization. Do not loop on invalid_grant.\n\nRefreshing identity does not restore removed membership, application access, installation or management duties. Resource APIs still check the current subject and context for every sensitive operation.\n\n[Revoke a grant](https://open.limeai.run/docs/token-revocation?locale=en)\n\n[CLI credential handling](https://open.limeai.run/docs/cli-auth?locale=en)\n\n[Refresh parameters](https://open.limeai.run/docs/api?operation=identity_token&locale=en)\n","revision":"sha256:939e2194797ef0acf0a689e576f774117629052e6c12bb0f3fae7b692a017863"},{"id":"token-revocation","group":"guide","category":"Authorization flows","title":"Revocation and sign-out","summary":"Distinguish clearing a local session, revoking an OAuth grant and removing resource access.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/token-revocation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"boundaries","title":"Choose the intended effect"},{"id":"revoke","title":"Call the revocation endpoint"},{"id":"session","title":"Keep the user informed"}],"markdown":"# Revocation and sign-out\n\nDistinguish clearing a local session, revoking an OAuth grant and removing resource access.\n\n<a id=\"boundaries\"></a>\n\n## Choose the intended effect\n\n| Action | Effect |\n| --- | --- |\n| Application sign-out | Invalidate your own session and remove locally stored credentials according to your policy. |\n| OAuth revocation | Ask the issuer to revoke the submitted token/grant using the registered client authentication. |\n| Membership or installation removal | Change resource authorization independently of an already issued identity assertion. |\n\n<a id=\"revoke\"></a>\n\n## Call the revocation endpoint\n\n1. Resolve the revocation_endpoint from trusted Discovery and submit the token as an encoded form, never as a URL parameter.\n2. Authenticate the same registered client and include token_type_hint only when known. Handle success according to the protocol without assuming it proves the token existed.\n3. Remove the application's local credential and close its session. Record a redacted outcome if remote revocation could not be confirmed; do not retain the secret in a debug trace.\n\n<a id=\"session\"></a>\n\n## Keep the user informed\n\nSigning out of one application does not promise that all browser sessions or other applications have been signed out. The public contract does not provide a universal RP logout endpoint. Describe the actual scope of your action and route account security or connected-app reviews to the appropriate user-center journey.\n\n[Account lifecycle](https://open.limeai.run/docs/identity-lifecycle?locale=en)\n\n[Revocation reference](https://open.limeai.run/docs/api?operation=identity_revoke&locale=en)\n","revision":"sha256:76ce8407dc2a35ff2ca5f39afda609215d9d780be43e061bf10323c867f7ebe0"},{"id":"oidc-discovery","group":"guide","category":"Authorization flows","title":"OIDC Discovery and signing keys","summary":"Resolve protocol endpoints and verify keys from a pinned issuer.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/oidc-discovery?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"issuer","title":"Trust the issuer first"},{"id":"keys","title":"Handle key rotation"},{"id":"availability","title":"Keep protocol configuration stable"}],"markdown":"# OIDC Discovery and signing keys\n\nResolve protocol endpoints and verify keys from a pinned issuer.\n\n<a id=\"issuer\"></a>\n\n## Trust the issuer first\n\nConfigure the expected issuer in deployment settings and request /.well-known/openid-configuration beneath that origin. Verify that the document's issuer matches exactly. Never perform discovery against an arbitrary URL supplied in a callback or untrusted identity token.\n\nUse the returned authorization_endpoint, token_endpoint, userinfo_endpoint, jwks_uri, revocation_endpoint and supported methods. The current signing-key path is /oauth/jwks. OAuth responses are plain protocol JSON, not the management API's data envelope.\n\n<a id=\"keys\"></a>\n\n## Handle key rotation\n\n1. Cache the trusted JWKS using appropriate HTTP caching and index keys by kid and supported algorithm.\n2. For an unknown kid, refresh the pinned JWKS once with concurrency and retry limits. Do not follow a token-supplied jku or accept an unsigned token.\n3. Reject an unresolved key or invalid signature and retain a redacted reason. A successful JWKS fetch alone does not verify claims or authorization.\n\n<a id=\"availability\"></a>\n\n## Keep protocol configuration stable\n\nA temporary Discovery failure should not silently switch to another issuer or disable signature verification. Use a bounded, known-good cache where your library supports it and fail safely after its validity. Roll out issuer changes as an explicit migration affecting subjects, callbacks and stored grants.\n\n[Validate ID Tokens](https://open.limeai.run/docs/id-token-validation?locale=en)\n\n[Discovery response](https://open.limeai.run/docs/api?operation=identity_discovery&locale=en)\n\n[JWKS](https://open.limeai.run/docs/api?operation=identity_jwks&locale=en)\n","revision":"sha256:fdeb5fcc7477f0b3319ecbba279873811367480013e126a9964d6f4e2da01a7a"},{"id":"id-token-validation","group":"guide","category":"Authorization flows","title":"Validate an ID Token","summary":"Create a local identity session only after signature, claims and transaction validation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/id-token-validation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"verify","title":"Verify with a maintained OIDC library"},{"id":"subject","title":"Store the correct identity key"},{"id":"permission","title":"Separate identity from API permission"}],"markdown":"# Validate an ID Token\n\nCreate a local identity session only after signature, claims and transaction validation.\n\n<a id=\"verify\"></a>\n\n## Verify with a maintained OIDC library\n\n1. Allow the configured RS256 algorithm and resolve the signing key from the pinned issuer's JWKS.\n2. Verify the exact iss, the registered client ID in aud, applicable azp rules and exp/iat with a small bounded clock tolerance.\n3. Match nonce to the original one-time authorization transaction, then consume that transaction. Do not accept a token copied from another browser or client.\n\n<a id=\"subject\"></a>\n\n## Store the correct identity key\n\nUse the pair (iss, sub) as the external identity key. Lime uses pairwise subjects, so subjects from different client sectors may differ. A profile name, email, employee label or an application collaborator record is not a substitute for the verified subject.\n\nIf you fetch UserInfo, require its sub to match the verified ID Token. Claims depend on actual scopes and account state. Do not automatically link an existing local account by matching email, even if a familiar address appears in a new authorization.\n\n<a id=\"permission\"></a>\n\n## Separate identity from API permission\n\nAn ID Token is intended for the client and currently has a ten-minute lifetime. It is not the Bearer credential for a resource API and does not convey current application membership or paid entitlement. Establish a bounded application session, then check resource and business permissions for each task.\n\n[Choose identity identifiers](https://open.limeai.run/docs/user-identifiers?locale=en)\n\n[UserInfo fields](https://open.limeai.run/docs/userinfo?locale=en)\n","revision":"sha256:35edadcc08071cba0f9dac0ad93620c6c2fd7adf0ba61fcce491892b75f921eb"},{"id":"device-authorization-flow","group":"guide","category":"Authorization flows","title":"Device authorization flow","summary":"Connect a terminal through a separately confirmed browser transaction.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/device-authorization-flow?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"start","title":"Start a new device transaction"},{"id":"poll","title":"Poll according to the protocol"},{"id":"phishing","title":"Prevent device-code phishing"}],"markdown":"# Device authorization flow\n\nConnect a terminal through a separately confirmed browser transaction.\n\n<a id=\"start\"></a>\n\n## Start a new device transaction\n\nRegistered public or confidential user clients may use the current device flow; machine clients may not. Request a device code using the registered client and permitted scope. PKCE is not part of this flow. If installation or space context is supplied, preserve it for the same initiating transaction.\n\n[The terminal polls while the user independently confirms the code in a browser.](https://open.limeai.run/docs/device-authorization-flow?locale=en#start)\n\n1. Display the returned verification_uri and user_code, with the application and requested permission clearly identified.\n2. Let the user open the trusted verification page themselves and compare the displayed code. Never ask them to send a password or code to support staff.\n3. Respect expires_in and the returned interval; the current device-code lifetime is ten minutes.\n\n<a id=\"poll\"></a>\n\n## Poll according to the protocol\n\n| Response | Action |\n| --- | --- |\n| authorization_pending | Wait for the current interval before the next poll. |\n| slow_down | Add five seconds to the interval for this and subsequent polls. |\n| access_denied / expired_token | Stop, explain the outcome and offer an explicit new attempt. |\n| Token response | Stop polling and securely store the returned grant once. |\n\n<a id=\"phishing\"></a>\n\n## Prevent device-code phishing\n\nA code identifies a pending authorization, not an account entitlement. The browser must show the requesting application, scopes and context before consent. Cancel a code the user did not initiate. The terminal must stop polling on cancellation, process exit or deadline; successful browser sign-in alone does not mean device consent was approved.\n\n[Runnable device tutorial](https://open.limeai.run/docs/device-tutorial?locale=en)\n\n[Device authorization endpoint](https://open.limeai.run/docs/api?operation=identity_device_authorization&locale=en)\n","revision":"sha256:fea3635c05a0387fca2ff02c08390e28c763753c44ec3d9f9d0bf9a786398f9b"},{"id":"user-identifiers","group":"guide","category":"Understand the platform","title":"User identity identifiers","summary":"Choose stable keys without copying another platform's user-ID system.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/user-identifiers?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"keys","title":"Choose by the receiving boundary"},{"id":"example","title":"Map a user across application sessions"},{"id":"obtain","title":"Obtain only permitted claims"}],"markdown":"# User identity identifiers\n\nChoose stable keys without copying another platform's user-ID system.\n\n<a id=\"keys\"></a>\n\n## Choose by the receiving boundary\n\n| Identifier | Use |\n| --- | --- |\n| OIDC (iss, sub) | External application account mapping after full ID Token validation. |\n| Platform user ID | Authorized platform management records when returned by their contract. |\n| Space or membership ID | Identify a resource context or membership record, not the human globally. |\n| Email / display name | Contact and display according to consent; not a stable primary key. |\n\n<a id=\"example\"></a>\n\n## Map a user across application sessions\n\nStore issuer, subject and your own local account ID when a user explicitly connects an account. On the next validated login from the same issuer and sector, look up that mapping. If the issuer or subject changes, treat it as a different identity until the user completes a separate secure linking journey.\n\nA desktop client and a web client need not receive the same pairwise sub. Do not join their accounts using an email match or assume an equivalent of Feishu union_id exists. Plan a user-confirmed account-linking process before supporting multiple identity sectors.\n\n<a id=\"obtain\"></a>\n\n## Obtain only permitted claims\n\n1. Request openid plus only necessary profile/email scopes during user authorization.\n2. Validate the ID Token and, when needed, call UserInfo with the access token; require matching sub.\n3. Handle absent optional claims and account changes without overwriting the stable identity mapping.\n\n[Verify identity](https://open.limeai.run/docs/id-token-validation?locale=en)\n\n[Read UserInfo](https://open.limeai.run/docs/userinfo?locale=en)\n","revision":"sha256:b35bcbe1b78e7669d08012c8b079667bcec62b31646ddc37fb374fef4f9bd13f"},{"id":"application-icons","group":"guide","category":"Manage an application","title":"Application icons and branding","summary":"Provide recognizable, accessible branding across listings and authorization screens.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-icons?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose","title":"Choose a clear identity"},{"id":"prepare","title":"Prepare and preview an image"},{"id":"accessible","title":"Keep labels independent from decoration"}],"markdown":"# Application icons and branding\n\nProvide recognizable, accessible branding across listings and authorization screens.\n\n<a id=\"choose\"></a>\n\n## Choose a clear identity\n\nUse the application's own name and mark consistently. Avoid implying platform ownership, approval or payment security through a copied Lime mark. Keep the image understandable at list and consent sizes; do not rely on tiny text inside an icon.\n\nThe current application editor supports the shared preset icon system and applicable image upload. Preset background and glyph selection remain independent. An uploaded image retains its original colors; changing a preset background must not recolor it.\n\n<a id=\"prepare\"></a>\n\n## Prepare and preview an image\n\n1. Use the file types, byte limits and dimensions shown by the current uploader; do not infer a universal upload endpoint from the UI.\n2. Check the square preview, transparency, crop and contrast on a light background before saving.\n3. Verify the public name and image in both languages and in the version intended for release.\n\n<a id=\"accessible\"></a>\n\n## Keep labels independent from decoration\n\nA decorative icon beside a visible application name should not cause the name to be read twice. A standalone interactive icon needs a localized accessible name. Do not encode application state only with a colored icon; show a textual status and recovery action where relevant.\n\n[Edit public application details](https://open.limeai.run/docs/application-profile?locale=en)\n\n[Icon design](https://open.limeai.run/docs/design-icons?locale=en)\n","revision":"sha256:157f76510ad90466fab4021045e506170c1be418d15ba53edbb732348f1ff7eb"},{"id":"client-secret-rotation","group":"guide","category":"Manage an application","title":"Rotate client secrets","summary":"Replace backend credentials without placing secrets in browsers, examples or logs.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-secret-rotation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"Inventory affected consumers"},{"id":"execute","title":"Change and verify"},{"id":"incident","title":"Respond to suspected exposure"}],"markdown":"# Rotate client secrets\n\nReplace backend credentials without placing secrets in browsers, examples or logs.\n\n<a id=\"prepare\"></a>\n\n## Inventory affected consumers\n\nOnly confidential and machine clients can protect a secret. Public desktop, browser and distributed command-line software must not embed one. Record the client, environment, active backend instances, deployment owner and rollback constraints before a rotation.\n\nUse the credential-management operations offered for the registered client. Do not promise a dual-secret grace period unless the current operation explicitly provides one. Rotation may invalidate the prior value immediately; coordinate dependent deployments accordingly.\n\n<a id=\"execute\"></a>\n\n## Change and verify\n\n1. Complete required recent authentication and confirm the exact client and environment.\n2. Write the returned secret directly to approved secret storage. Update dependent backend instances without copying it to a ticket, browser bundle or repository.\n3. Verify an authorized token exchange and confirm that stale instances have stopped using the previous value. Inspect redacted invalid_client diagnostics.\n\n<a id=\"incident\"></a>\n\n## Respond to suspected exposure\n\nTreat exposure as a credential incident: rotate or disable the client, assess affected grants and resource access, preserve audit identifiers and notify the responsible owner through your incident process. Removing the secret from a visible file is insufficient if it remains valid in history or logs.\n\n[Security configuration](https://open.limeai.run/docs/security-settings?locale=en)\n\n[Incident response](https://open.limeai.run/docs/incident-response?locale=en)\n","revision":"sha256:3f30e4714d6c3a34a1789773a371df37b31bbadac6f950ada0225fa30a02f7b2"},{"id":"event-handler-design","group":"guide","category":"Receive events","title":"Design a reliable event consumer","summary":"Acknowledge verified events durably, then process retries without duplicate effects.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/event-handler-design?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"ingress","title":"Keep ingress small"},{"id":"order","title":"Expect duplicates and delayed delivery"},{"id":"recovery","title":"Recover without a new business command"}],"markdown":"# Design a reliable event consumer\n\nAcknowledge verified events durably, then process retries without duplicate effects.\n\n<a id=\"ingress\"></a>\n\n## Keep ingress small\n\n[Verification and durable acceptance precede independent business processing.](https://open.limeai.run/docs/event-handler-design?locale=en#ingress)\n\n1. Read the exact raw body within a bounded size; verify timestamp, signature and the active signing credential before parsing business data.\n2. Persist an inbox record keyed by the stable event/delivery identity defined in the event contract. Acknowledge only after durable acceptance.\n3. Process the inbox asynchronously with a separately recorded outcome. Do not keep a network request open while performing unrelated external side effects.\n\n<a id=\"order\"></a>\n\n## Expect duplicates and delayed delivery\n\nA retry can arrive after the original business change has succeeded, and independently delivered events can arrive out of order. Deduplicate durably and apply a version/state transition check. When context is incomplete, query the authorized source record instead of assuming delivery order equals business order.\n\nFinance, notification and audit consumers need separate progress records. One consumer's success does not authorize skipping another, and a failed receipt does not undo a trusted payment. Store source identifiers for reconciliation.\n\n<a id=\"recovery\"></a>\n\n## Recover without a new business command\n\nUse bounded worker retries with jitter, then retain an actionable failed record. Redelivery or reconciliation must reprocess the same source event; it must not create a new payment, order or entitlement request. Keep replay authority limited and audited.\n\n[Verify webhook signatures](https://open.limeai.run/docs/webhook-signatures?locale=en)\n\n[Inspect delivery records](https://open.limeai.run/docs/webhook-deliveries?locale=en)\n","revision":"sha256:668af9191a913bd7b57b882d45d5926335b13542aafa421187d0db34c41f9edc"},{"id":"launch-checklist","group":"guide","category":"Launch and maintain","title":"Launch checklist","summary":"Verify the exact release, audience and recovery behavior before public use.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/launch-checklist?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"Identity and access"},{"id":"release","title":"Version and public materials"},{"id":"commerce","title":"Commercial and operational readiness"}],"markdown":"# Launch checklist\n\nVerify the exact release, audience and recovery behavior before public use.\n\n<a id=\"identity\"></a>\n\n## Identity and access\n\n1. Verify the production issuer, exact HTTPS callbacks, client activation, minimum scopes and current collaborator/test/install boundaries.\n2. Test cancellation, stale state, expired codes, refresh rotation, revoked membership and recent-authentication recovery.\n3. Confirm secrets, tokens, passwords and authorization codes are absent from browser bundles, URLs, public logs and support exports.\n\n<a id=\"release\"></a>\n\n## Version and public materials\n\n1. Review bilingual application details, icon, policies, support entry and actual supported feature status.\n2. Freeze the intended configuration, obtain independent approval and explicitly publish that frozen version.\n3. Validate both an eligible user and an ineligible user against the real target deployment and published installation path.\n\n<a id=\"commerce\"></a>\n\n## Commercial and operational readiness\n\nFor a paid journey, verify the supported environment, seller, currency, server-side quote, original idempotency key, trusted payment fact, entitlement and full-refund recovery. Current sandbox evidence does not authorize a claim that a production provider, recurring subscription or bank settlement is live.\n\nSet incident ownership, monitor rejected authorization and failed event deliveries, and retain a safe recovery runbook. A green build is one check; browser, permission and end-user acceptance remain separate.\n\n[Review requirements](https://open.limeai.run/docs/review-guidelines?locale=en)\n\n[Supported checkout](https://open.limeai.run/docs/checkout-orders?locale=en)\n\n[Incident runbook](https://open.limeai.run/docs/incident-response?locale=en)\n","revision":"sha256:00b7cfd06716bc2d301bda4bf143789b38cf82efdf4a4d84b3c089e4dc40056c"},{"id":"review-guidelines","group":"guide","category":"Launch and maintain","title":"Prepare an application review","summary":"Submit a reproducible frozen version with accurate permissions and feature claims.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/review-guidelines?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"materials","title":"Prepare reviewer evidence"},{"id":"frozen","title":"Submit the intended snapshot"},{"id":"claims","title":"Keep claims verifiable"}],"markdown":"# Prepare an application review\n\nSubmit a reproducible frozen version with accurate permissions and feature claims.\n\n<a id=\"materials\"></a>\n\n## Prepare reviewer evidence\n\n| Item | What to provide |\n| --- | --- |\n| Purpose | User task, expected audience, supported environment and feature availability. |\n| Permission | Why each scope and data field is necessary, with refusal behavior. |\n| Reproduction | Safe test entry, eligible test user and complete success/denial steps. |\n| Policies | Privacy, terms, support and applicable commercial/refund information. |\n\n<a id=\"frozen\"></a>\n\n## Submit the intended snapshot\n\nCreate a release only after verifying its application and configuration revisions. Review binds to the frozen version, so subsequent draft edits do not repair a submitted version. An independent eligible reviewer must evaluate the snapshot; self-approval is not a valid shortcut.\n\nIf rejected, read the specific reason, correct the source draft, repeat affected acceptance and create a new version. Retain the old decision for traceability. Approval alone does not publish the application or activate every production client.\n\n<a id=\"claims\"></a>\n\n## Keep claims verifiable\n\nA catalog field is not proof of a complete feature. Mark enterprise federation, hosted custom domains, dedicated SDKs and incomplete commercial workflows as construction scope where appropriate. Do not reuse Feishu's service-provider certification or legal terms as a Lime policy.\n\n[Release lifecycle](https://open.limeai.run/docs/releases?locale=en)\n\n[Publish a first release](https://open.limeai.run/docs/first-release-tutorial?locale=en)\n","revision":"sha256:c330ca85d32b9868383eb17fa80f60477e511f55e85cbec4b461a621d463b0d1"},{"id":"api-request-conventions","group":"guide","category":"Development standards","title":"Request and response conventions","summary":"Construct requests using the operation contract and parse each API family's actual envelope.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-request-conventions?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"request","title":"Keep request fields in their declared location"},{"id":"response","title":"Parse the correct response family"},{"id":"compatibility","title":"Preserve types and unknown fields"}],"markdown":"# Request and response conventions\n\nConstruct requests using the operation contract and parse each API family's actual envelope.\n\n<a id=\"request\"></a>\n\n## Keep request fields in their declared location\n\nUse HTTPS and UTF-8. Resolve the explicit API Origin, operation method and path, then encode path/query fields separately. Put a user access token in Authorization: Bearer; do not copy browser session cookies or CSRF values into a public API integration.\n\nJSON management methods use the declared Content-Type and schema. OAuth token, device, revocation and introspection operations use their documented form and client-authentication rules. JSON examples cannot be substituted for a form-encoded protocol request.\n\n<a id=\"response\"></a>\n\n## Parse the correct response family\n\n| Family | Shape |\n| --- | --- |\n| Management success | {data: ...}; cursor lists use data.items and data.next_cursor. |\n| Management failure | {error: {code, message}, request_id}; branch on stable code and HTTP status. |\n| Identity protocol | Plain OAuth/OIDC JSON and protocol errors; no management data wrapper. |\n\n<a id=\"compatibility\"></a>\n\n## Preserve types and unknown fields\n\nTreat IDs as opaque strings. Preserve integer minor-unit money strings and explicit currency; do not use floating point, infer currencies or sum different currencies. Follow the required/nullability and enum rules. Accept additive response fields, while failing safely on an unknown business state that controls a sensitive action.\n\n[Cursor pagination](https://open.limeai.run/docs/api-pagination?locale=en)\n\n[Stable errors](https://open.limeai.run/docs/errors?locale=en)\n\n[Management access contract](https://open.limeai.run/docs/management-api?locale=en)\n","revision":"sha256:da94e9bfb9049a8a49e89218c45011b0523a67c5862c596775761c407720774f"},{"id":"api-pagination","group":"guide","category":"Development standards","title":"Cursor pagination","summary":"Read list results without assuming page numbers or a permanent snapshot.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-pagination?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"iterate","title":"Follow the returned cursor"},{"id":"consistency","title":"Handle a changing collection"},{"id":"failure","title":"Resume within the documented lifetime"}],"markdown":"# Cursor pagination\n\nRead list results without assuming page numbers or a permanent snapshot.\n\n<a id=\"iterate\"></a>\n\n## Follow the returned cursor\n\n1. Read the operation's supported filters and limit; make the first request without a cursor.\n2. Consume data.items and keep data.next_cursor opaque. Pass it unchanged to the next request with the same filters and ordering.\n3. Stop when next_cursor is absent or empty. Do not manufacture a cursor from an item's ID or turn a page number into a cursor.\n\n<a id=\"consistency\"></a>\n\n## Handle a changing collection\n\nUnless an operation promises a snapshot, records can change between pages. Deduplicate by the stable resource ID and use a bounded reconciliation pass where completeness matters. A list count, when present, is not authorization for records not returned.\n\nChanging space, application, environment, filters or sort invalidates the current navigation context. Start a new first request, and keep UI loading/error state associated with the filter set that produced it so a stale response cannot replace newer results.\n\n<a id=\"failure\"></a>\n\n## Resume within the documented lifetime\n\nA cursor may expire or become invalid. Re-run the first request and reconcile already processed IDs, rather than repeatedly retrying the invalid value. Bound page counts and elapsed time for exports; partial results must be labelled if retrieval stops early.\n\n[Retry policy](https://open.limeai.run/docs/api-retry-policy?locale=en)\n\n[Pagination UI](https://open.limeai.run/docs/design-pagination?locale=en)\n","revision":"sha256:a617505886ba70588cc2aa6d7c09249af2aa17003435d2a513103810f61373df"},{"id":"api-idempotency","group":"guide","category":"Development standards","title":"Idempotency and concurrent updates","summary":"Recover an original command and reject stale edits without duplicating business effects.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-idempotency?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"keys","title":"Create one key per intended command"},{"id":"revision","title":"Use the current revision"},{"id":"unknown","title":"Recover an uncertain outcome"}],"markdown":"# Idempotency and concurrent updates\n\nRecover an original command and reject stale edits without duplicating business effects.\n\n<a id=\"keys\"></a>\n\n## Create one key per intended command\n\nFor operations requiring Idempotency-Key, create the key before the first submission and persist it with the exact intent, request body and target context. A retry of that intent uses the same key and equivalent payload. A new intent requires a new key only after the original result is resolved.\n\nIdempotency does not replace authorization or make arbitrary POST requests safe. The server still checks current actor, space, application, environment and operation-specific constraints. Reusing a key with a different body is a conflict, not a way to amend an order.\n\n<a id=\"revision\"></a>\n\n## Use the current revision\n\n1. Read the current resource and retain the revision alongside the displayed values.\n2. Send the expected revision in the operation's declared field when writing.\n3. On conflict, fetch the latest record, show material changes and let the user decide whether to submit a revised command.\n\n<a id=\"unknown\"></a>\n\n## Recover an uncertain outcome\n\nA network failure can occur after a write commits. Preserve the original key and query or retry the original command using its supported recovery path. Do not replace a timed-out create, pay or refund with a new-key request. Reauthentication also requires the user to review and explicitly resubmit the retained command.\n\n[Order recovery](https://open.limeai.run/docs/checkout-orders?locale=en)\n\n[Retry eligibility](https://open.limeai.run/docs/api-retry-policy?locale=en)\n","revision":"sha256:c2e59025ecc1175854e05dac06e7cc28b782a74b3bc1a328d64140791df405cf"},{"id":"api-retry-policy","group":"guide","category":"Development standards","title":"Rate limits, timeouts and retries","summary":"Retry only eligible failures with bounded delay and preserved write identity.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-retry-policy?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"classify","title":"Classify before retrying"},{"id":"budget","title":"Share a retry budget"},{"id":"surface","title":"Show a recoverable state"}],"markdown":"# Rate limits, timeouts and retries\n\nRetry only eligible failures with bounded delay and preserved write identity.\n\n<a id=\"classify\"></a>\n\n## Classify before retrying\n\n| Condition | Next action |\n| --- | --- |\n| Validation, permission or revision error | Correct the cause; do not loop the same rejected request. |\n| 401 / expired grant | Use the supported refresh once, or ask for authorization. Preserve the original command. |\n| 429 | Respect Retry-After when returned; otherwise use bounded backoff with jitter. |\n| Network / eligible 5xx | Retry safe reads; recover writes only under the operation's idempotency contract. |\n\n<a id=\"budget\"></a>\n\n## Share a retry budget\n\nSet a per-request deadline, maximum attempts and total elapsed-time budget. Avoid retries at every SDK, proxy and worker layer multiplying into a request storm. Serialize token refresh, limit concurrency and honor cancellation. A queued retry still belongs to the original actor and target context.\n\nDo not copy another platform's numerical quotas, reset header or error codes. Lime limits and API eligibility depend on the deployed operation contract. A rate-limit response never authorizes changing clients, accounts or spaces to bypass the restriction.\n\n<a id=\"surface\"></a>\n\n## Show a recoverable state\n\nWhen a retry budget ends, display the stable error and request identifier with a relevant retry or recovery action. Distinguish a known rejection from an unknown write result. Background retries must not silently repeat a payment or a sensitive user confirmation.\n\n[Diagnose failures](https://open.limeai.run/docs/api-debugging?locale=en)\n\n[Preserve command identity](https://open.limeai.run/docs/api-idempotency?locale=en)\n","revision":"sha256:906bcf1a7cb152c51a7e8a8bf590e93fa6b58c738651027e7b2da3adf3e5bb40"},{"id":"api-debugging","group":"guide","category":"Development standards","title":"Debug an API integration","summary":"Reproduce failures using the declared operation, redacted context and stable error identifiers.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-debugging?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"collect","title":"Collect a minimal diagnostic record"},{"id":"isolate","title":"Find the failing boundary"},{"id":"tools","title":"Use preview and live tools accurately"}],"markdown":"# Debug an API integration\n\nReproduce failures using the declared operation, redacted context and stable error identifiers.\n\n<a id=\"collect\"></a>\n\n## Collect a minimal diagnostic record\n\n| Record | Include |\n| --- | --- |\n| Target | Time with timezone, API Origin, operation ID, method and redacted path. |\n| Context | Environment, client type, applicable space/app IDs and granted scope names. |\n| Outcome | HTTP status, stable error code, request_id and whether a write result is known. |\n| Exclude | Passwords, tokens, secrets, cookies, code/verifier and sensitive personal payloads. |\n\n<a id=\"isolate\"></a>\n\n## Find the failing boundary\n\n1. Use the API reference or limecloud-cli schema to confirm the operation exists and compare required locations/types with the actual request.\n2. Check the issuer/client/audience and actual granted scopes, then current membership, role, app/environment ACL and installation.\n3. For a rejected write, inspect revision, idempotency and recent-authentication requirements before reissuing anything.\n\n<a id=\"tools\"></a>\n\n## Use preview and live tools accurately\n\nThe reference builds examples and field explanations; CLI dry-run constructs a redacted request without performing a write. Neither is a live authorization or payment test. Execute live requests only against your intended permitted environment and record the real response. Browser developer tools can inspect your own application, but Lime does not provide Feishu's remote host debugger.\n\n[Discover the CLI schema](https://open.limeai.run/docs/cli-schema?locale=en)\n\n[Preview a CLI request](https://open.limeai.run/docs/cli-dry-run?locale=en)\n\n[Error reference](https://open.limeai.run/docs/errors?locale=en)\n","revision":"sha256:ab80783d224752ae594bed553d22a6ecb0186ac37a0ada16e3fcf600523c3a3d"},{"id":"data-protection","group":"guide","category":"Development standards","title":"Protect application data","summary":"Collect the minimum data and preserve user, organization and environment boundaries.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/data-protection?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"minimize","title":"Define purpose and retention"},{"id":"isolate","title":"Enforce isolation on the server"},{"id":"storage","title":"Protect stored and diagnostic data"}],"markdown":"# Protect application data\n\nCollect the minimum data and preserve user, organization and environment boundaries.\n\n<a id=\"minimize\"></a>\n\n## Define purpose and retention\n\nFor every identity claim or resource field, record why the feature needs it, who may access it and how long it is retained. Request only the matching scope, and design a useful denied/absent-field state. Installation, commercial purchase and marketing consent remain separate decisions.\n\nData export, deletion and account-linking requests need verified ownership and defined source-domain effects. Do not invent a universal delete endpoint or automatically remove financial evidence that must be retained under an applicable policy.\n\n<a id=\"isolate\"></a>\n\n## Enforce isolation on the server\n\n1. Resolve the actor from verified identity, and explicitly bind every request to the authorized space, application and environment.\n2. Check current permission on each protected resource; a hidden navigation item is not an access control.\n3. Limit caches and background work by the same context. Discard a stale response after account or space switching.\n\n<a id=\"storage\"></a>\n\n## Protect stored and diagnostic data\n\nUse approved encrypted transport and secret storage, role-limited access and bounded logs. Redact credentials and personal payloads before support exports. A browser-readable token store increases exposure to injected script; choose a backend session where the application architecture allows it.\n\n[Security guide](https://open.limeai.run/docs/security?locale=en)\n\n[Consent boundaries](https://open.limeai.run/docs/marketing-consent?locale=en)\n\n[Respond to exposure](https://open.limeai.run/docs/incident-response?locale=en)\n","revision":"sha256:1fe77cc15fe176c3471f6a55c423a449c995894358d0dd5e3366c66b5e2b6a07"},{"id":"application-localization","group":"guide","category":"Before development","title":"Localize application configuration","summary":"Publish consistent details for registered languages without translating protocol identifiers.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-localization?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"content","title":"Prepare content for the registered languages"},{"id":"format","title":"Format data without changing value"},{"id":"publish","title":"Review every enabled language for the same release"}],"markdown":"# Localize application configuration\n\nPublish consistent details for registered languages without translating protocol identifiers.\n\n<a id=\"content\"></a>\n\n## Prepare content for the registered languages\n\nUse the shared locale registry to determine the enabled language set. English is the source, default and final fallback; English and Simplified Chinese are currently enabled. Prepare the application name, summary, help, permission explanations and relevant policies for every enabled locale. Preserve capability status, price meaning and recovery; a shorter translation must not omit a material restriction.\n\nKeep client IDs, scope names, operation IDs, JSON keys and error codes in their exact protocol form. Localize the explanation surrounding them. URL locale selection must not choose a different issuer, application owner or authorization scope.\n\n<a id=\"format\"></a>\n\n## Format data without changing value\n\n1. Use the shared locale registry and message resources. Do not hard-code the language selector as a permanent two-option implementation.\n2. Format dates with an explicit timezone and money with the recorded currency and minor-unit scale.\n3. Check interpolation, pluralization, long names, accessible labels and policy links in each supported language.\n\n<a id=\"publish\"></a>\n\n## Review every enabled language for the same release\n\nSave language variants through the configuration's supported fields, then inspect the frozen release and public entry in every enabled locale. Translating the draft after freezing does not update an already submitted version. Additional languages require the registry, complete owned resources and acceptance before they are enabled.\n\n[Application details](https://open.limeai.run/docs/application-profile?locale=en)\n\n[Design localized interfaces](https://open.limeai.run/docs/design-interface-localization?locale=en)\n","revision":"sha256:a8fae1ea63154ffe302c728595dd5a9c512b855d1b6846c8dad9a0111ca94dda"},{"id":"integration-faq","group":"guide","category":"Launch and maintain","title":"Integration questions","summary":"Find the correct recovery path for identity, permissions, events and publication.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/integration-faq?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"Identity and token questions"},{"id":"permission","title":"Permission and publication questions"},{"id":"events","title":"Delivery and tool questions"}],"markdown":"# Integration questions\n\nFind the correct recovery path for identity, permissions, events and publication.\n\n<a id=\"identity\"></a>\n\n## Identity and token questions\n\nAn invalid callback usually requires checking the exact registered URI, including loopback port, client environment and transaction state. An invalid_grant requires examining code lifetime, one-time use, PKCE or rotated refresh-token state; changing an account email does not repair a protocol transaction.\n\nUse an access token for its allowed resource and an ID Token only to establish verified client identity. A machine token cannot call the controlled management API. Lime does not use Feishu tenant_access_token, open_id or union_id error procedures.\n\n<a id=\"permission\"></a>\n\n## Permission and publication questions\n\nA granted scope does not restore a removed member or application ACL. Check the dedicated client, actual granted scopes, current role, environment and installation. A reviewed version still needs explicit publication, and publication does not install the application or purchase a product.\n\n[Permission boundaries](https://open.limeai.run/docs/members-permissions?locale=en)\n\n[Release review](https://open.limeai.run/docs/review-guidelines?locale=en)\n\n<a id=\"events\"></a>\n\n## Delivery and tool questions\n\nSignature failures often result from parsing and reserializing the body, using the wrong environment key or a timestamp mismatch. Verify the raw bytes before processing. CLI schema and dry-run work without proving live API availability; npm installation proves the package can run, while deployment/client activation and a real authorized call are separate checks.\n\n[Collect diagnostics](https://open.limeai.run/docs/api-debugging?locale=en)\n\n[CLI troubleshooting](https://open.limeai.run/docs/cli-troubleshooting?locale=en)\n","revision":"sha256:5cc805e8d2a4dd6e4cfa113996a632355df9250c43ec6df48c70748500ad4f99"},{"id":"platform-updates","group":"guide","category":"Launch and maintain","title":"Compatibility and platform changes","summary":"Assess contract changes without presenting another platform's announcements as Lime history.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/platform-updates?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"sources","title":"Use the published contract and release notes"},{"id":"migrate","title":"Validate a migration"},{"id":"cli","title":"Pin automation versions"}],"markdown":"# Compatibility and platform changes\n\nAssess contract changes without presenting another platform's announcements as Lime history.\n\n<a id=\"sources\"></a>\n\n## Use the published contract and release notes\n\nCheck the platform changelog, current OpenAPI and the installed CLI version before an upgrade. Historical Feishu API quota notices, certificates and event changes do not apply to Lime. A documentation update can explain existing behavior without implying a new deployed capability.\n\nTreat removed fields, changed required parameters, enum semantics, issuer/audience changes and new permission gates as compatibility-sensitive. Additive optional response fields should be tolerated; unknown states controlling a write need deliberate handling.\n\n<a id=\"migrate\"></a>\n\n## Validate a migration\n\n1. Compare the operations and fields your integration actually uses, including generated clients and stored payloads.\n2. Run sandbox success, denial, revocation and unknown-result recovery against the intended version.\n3. Roll out with observable errors and a documented rollback or forward-recovery path that preserves source facts.\n\n<a id=\"cli\"></a>\n\n## Pin automation versions\n\nUse an explicitly tested @limecloud/cli version in automation and review its schema after upgrading. A cached schema or a local generated client may lag the target deployment. Version alignment is necessary but does not bypass current user roles, application checks or separate production activation.\n\n[Platform changelog](https://open.limeai.run/docs/changelog?locale=en)\n\n[CLI distribution](https://open.limeai.run/docs/cli-overview?locale=en)\n","revision":"sha256:87b310aa5a80d0e7c6107d00a3df7da1173311bba780800438dd7e4085e9dfdf"},{"id":"incident-response","group":"guide","category":"Launch and maintain","title":"Stability and incident response","summary":"Contain exposure or failures while preserving authoritative facts and recoverable commands.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/incident-response?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"detect","title":"Determine scope and ownership"},{"id":"contain","title":"Contain the actual failure"},{"id":"restore","title":"Restore and verify"}],"markdown":"# Stability and incident response\n\nContain exposure or failures while preserving authoritative facts and recoverable commands.\n\n<a id=\"detect\"></a>\n\n## Determine scope and ownership\n\n1. Record the affected issuer/API origin, application, environment, time window and user-visible symptom without credentials.\n2. Separate identity, resource permission, event delivery and commercial facts; identify which source system owns the failed transition.\n3. Assign an incident owner and retain redacted request, command, order and event identifiers for correlation.\n\n<a id=\"contain\"></a>\n\n## Contain the actual failure\n\nFor credential exposure, rotate or disable the affected client and assess grants. For delivery failures, pause the affected consumer and retain its durable inbox. For payment uncertainty, recover the original order/payment command; never manufacture a successful finance entry or issue another payment to hide the failure.\n\nRate-limit, reject or temporarily disable only the affected surface when appropriate. Do not weaken authorization, skip signatures or turn off revision/idempotency checks as an incident workaround.\n\n<a id=\"restore\"></a>\n\n## Restore and verify\n\nReconcile from source records, replay only authorized original events and verify each independent consumer. Check eligible and denied users after changes. Record what happened, the confirmed impact, remediation and a reproducible regression check; avoid publishing sensitive payloads in an incident report.\n\n[Event recovery design](https://open.limeai.run/docs/event-handler-design?locale=en)\n\n[Credential rotation](https://open.limeai.run/docs/client-secret-rotation?locale=en)\n\n[Recover original commands](https://open.limeai.run/docs/api-idempotency?locale=en)\n","revision":"sha256:3e10bb2baf0b648e36440e21939b8a587ec247b850a67df9454fdd38465a8085"},{"id":"marketplace-overview","group":"guide","category":"Launch and maintain","title":"Publish an application listing","summary":"Move from a registered product to a reviewed listing and explicit customer installation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/marketplace-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"fit","title":"Confirm the distribution model"},{"id":"stages","title":"Complete the applicable steps"},{"id":"limits","title":"Keep partner policy separate"}],"markdown":"# Publish an application listing\n\nMove from a registered product to a reviewed listing and explicit customer installation.\n\n<a id=\"fit\"></a>\n\n## Confirm the distribution model\n\nAn application listing describes a released integration that customers can discover. It does not host your software, prove a commercial payment provider is active or grant every visitor access. Choose public discovery or a controlled audience according to the application's source and permitted distribution policy.\n\n[Registration, review, publication and customer installation are separate steps.](https://open.limeai.run/docs/marketplace-overview?locale=en#fit)\n\n<a id=\"stages\"></a>\n\n## Complete the applicable steps\n\n1. Confirm the responsible publisher and owning space, then register the application and accurate listing materials.\n2. Build supported identity/API/event integration and, if applicable, a tested commercial plan.\n3. Test eligible and denied users, freeze a release, submit independent review and explicitly publish the approved version.\n4. Verify the public detail, installation decision and application entry as a customer.\n\n<a id=\"limits\"></a>\n\n## Keep partner policy separate\n\nLime does not inherit Feishu's service-provider age, customer-count, deposit or certification rules. A partner application remains subject to the actual current source/distribution policy and review. Where a dedicated partner-admission workflow is not delivered, retain it as planned scope rather than inventing a self-service certification.\n\n[Publisher readiness](https://open.limeai.run/docs/partner-readiness?locale=en)\n\n[Commercial plan](https://open.limeai.run/docs/commercial-plan?locale=en)\n\n[Listing acceptance](https://open.limeai.run/docs/test-marketplace-application?locale=en)\n","revision":"sha256:8c5c8f28d6431e4b7c5929572396b146d36e329ab384c7ea79dcc816ec2bc030"},{"id":"partner-readiness","group":"guide","category":"Before development","title":"Prepare a publishing organization","summary":"Clarify ownership, support and policy responsibilities before distributing to customers.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/partner-readiness?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"owner","title":"Use the correct owning space"},{"id":"responsibility","title":"Name the operational responsibilities"},{"id":"status","title":"Check admission status"}],"markdown":"# Prepare a publishing organization\n\nClarify ownership, support and policy responsibilities before distributing to customers.\n\n<a id=\"owner\"></a>\n\n## Use the correct owning space\n\nChoose a personal or organization space that is permitted to own the intended application type. Verify current membership and the right to register/manage applications; a company email domain alone is not an organization role. Do not create a personal asset expecting an unsupported automatic ownership transfer later.\n\n<a id=\"responsibility\"></a>\n\n## Name the operational responsibilities\n\n| Responsibility | Prepare |\n| --- | --- |\n| Technical | Maintained integration, security owner, incident contact and recovery runbook. |\n| Public information | Accurate product identity, privacy/terms, support route and feature status. |\n| Commercial | Applicable seller, buyer scope, price/currency, refund and fulfillment responsibilities. |\n\n<a id=\"status\"></a>\n\n## Check admission status\n\nA dedicated partner qualification, contract-signing and deposit process is not implied by a partner source label. Use only a delivered, authorized platform process for eligibility decisions. The guide supplies readiness criteria and construction scope, not a claim of available certification or a new legal agreement.\n\n[Owning spaces](https://open.limeai.run/docs/account-spaces?locale=en)\n\n[Application sources](https://open.limeai.run/docs/application-types?locale=en)\n\n[Data responsibilities](https://open.limeai.run/docs/data-protection?locale=en)\n","revision":"sha256:2d025cdb4ccc95d73696ac3a3d458a94e6a76bf207fb85560ac6bab0fef6df16"},{"id":"create-marketplace-application","group":"guide","category":"Before development","title":"Create an application for distribution","summary":"Register a product under the intended owner before preparing its public release.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/create-marketplace-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"register","title":"Create the stable application record"},{"id":"configure","title":"Configure capabilities independently"},{"id":"check","title":"Verify the initial record"}],"markdown":"# Create an application for distribution\n\nRegister a product under the intended owner before preparing its public release.\n\n<a id=\"register\"></a>\n\n## Create the stable application record\n\n1. Open the application list in the intended space and verify that you can create the required application source.\n2. Enter the source-language name and summary, add supported translations, and choose a recognizable icon.\n3. Submit once and retain the returned App ID. If the result is unknown, recover the original create command rather than creating a second record.\n\n<a id=\"configure\"></a>\n\n## Configure capabilities independently\n\nAdd only the clients, callbacks, scopes and event subscriptions your product uses. Keep sandbox and production settings distinct. A catalog listing does not create a hosting environment or a downloadable native package, so publish those artifacts through your own supported delivery process.\n\n<a id=\"check\"></a>\n\n## Verify the initial record\n\nCheck the owner, application source, environment and current revision before further writes. Add collaborators deliberately and validate that an unrelated user cannot manage the record. Creation alone does not publish, approve a partner, install an application or grant a purchase entitlement.\n\n[Creation details](https://open.limeai.run/docs/create-application?locale=en)\n\n[Prepare listing content](https://open.limeai.run/docs/listing-content?locale=en)\n","revision":"sha256:7c2debf7c8df624effeaca4d2c5b93a03563d2e83853f6ae9e7c7387f0fdcc67"},{"id":"listing-content","group":"guide","category":"Launch and maintain","title":"Write application listing content","summary":"Explain the actual product, requirements and policies before the customer installs it.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/listing-content?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"content","title":"Describe the customer's task"},{"id":"decision","title":"Include information affecting the decision"},{"id":"preview","title":"Preview the released language variants"}],"markdown":"# Write application listing content\n\nExplain the actual product, requirements and policies before the customer installs it.\n\n<a id=\"content\"></a>\n\n## Describe the customer's task\n\nUse a concise product name and an explanation of the task it solves. Describe which platform capability is integrated, where the application runs and what a new user can complete. Screenshots and examples must show your own supported product, without fabricated customer data or unsupported feature promises.\n\n<a id=\"decision\"></a>\n\n## Include information affecting the decision\n\n| Information | Explain |\n| --- | --- |\n| Access | Account/network requirements, eligible users and installation/consent boundaries. |\n| Data | Required permission, purpose, retention and privacy/terms links. |\n| Commerce | Free/paid boundary, supported environment, currency, fulfillment and refund limits. |\n| Help | A maintained support entry and redacted diagnostic instructions. |\n\n<a id=\"preview\"></a>\n\n## Preview the released language variants\n\nStore source content separately from translations indexed by registered locale tags. Preview the listing on desktop and narrow screens, check links and long text, then freeze the intended revision. Editing the draft after submission does not update the frozen review or an existing public version.\n\n[Application profile fields](https://open.limeai.run/docs/application-profile?locale=en)\n\n[Localization](https://open.limeai.run/docs/application-localization?locale=en)\n","revision":"sha256:991e94c42a9b4ae5a7b2fef33cc99cc31d9df5e6363ee33475ee5bcee25ea627"},{"id":"commercial-plan","group":"guide","category":"Launch and maintain","title":"Prepare a commercial plan","summary":"Choose a supported product model and state the exact payment and fulfillment status.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/commercial-plan?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"define","title":"Define the product and beneficiary"},{"id":"available","title":"Use the delivered checkout scope"},{"id":"accept","title":"Test paid and recovery paths"}],"markdown":"# Prepare a commercial plan\n\nChoose a supported product model and state the exact payment and fulfillment status.\n\n<a id=\"define\"></a>\n\n## Define the product and beneficiary\n\nDecide what is sold, who the seller and buyer are, whether the beneficiary is a person or an organization, and which feature the entitlement enables. Price, currency, tax/fee treatment and refund terms need an explicit versioned offer. A paid flag in application metadata is not payment authority.\n\nProduct name, description and terms use English source content with translations indexed by registered locale tags. A marketing campaign uses the same structure for its name. New integrations use source and translations; the deprecated en and zh-CN request/response mirrors exist only for migration compatibility. The following fragment shows product content fields, not a complete creation request.\n\n```json\n{\n \"name\": {\n \"source\": \"Pro access\",\n \"translations\": {\n \"zh-CN\": \"专业版使用权\"\n }\n },\n \"description\": {\n \"source\": \"Single-user access\",\n \"translations\": {\n \"zh-CN\": \"单用户使用\"\n }\n },\n \"terms\": {\n \"source\": \"One-time purchase terms\",\n \"translations\": {\n \"zh-CN\": \"一次性购买条款\"\n }\n }\n}\n```\n\n<a id=\"available\"></a>\n\n## Use the delivered checkout scope\n\nThe current end-to-end commercial path is sandbox one-time checkout with a fifteen-minute server quote, same-key ordering, trusted test payment, entitlement and full refund. Production providers, recurring renewal, disputes and device/seat licensing are separate construction scope. Do not advertise them as activated billing modes.\n\n[The trusted payment fact drives entitlement and independent accounting/notification consumers.](https://open.limeai.run/docs/commercial-plan?locale=en#available)\n\n<a id=\"accept\"></a>\n\n## Test paid and recovery paths\n\n1. Verify price expiry, exact currency and an authorized buyer before placing the original order.\n2. Test duplicate submit and response loss using the same command key; verify one order and one trusted payment outcome.\n3. Verify entitlement, full refund and each independent receipt/ledger consumer; a journal entry is not evidence of bank settlement.\n\n[Products and pricing](https://open.limeai.run/docs/products-pricing?locale=en)\n\n[Checkout and orders](https://open.limeai.run/docs/checkout-orders?locale=en)\n\n[Entitlement status](https://open.limeai.run/docs/entitlements-licenses?locale=en)\n","revision":"sha256:1d34e3b3a299df4d396eb3950d658b22985a6ba429ea7cf099f35128f6279ece"},{"id":"build-marketplace-application","group":"guide","category":"Build an integration","title":"Build a distributable integration","summary":"Implement the customer's real journey using supported identity, events and resource contracts.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/build-marketplace-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"shape","title":"Choose the execution model"},{"id":"implement","title":"Implement one complete task"},{"id":"separate","title":"Keep deployment and publication explicit"}],"markdown":"# Build a distributable integration\n\nImplement the customer's real journey using supported identity, events and resource contracts.\n\n<a id=\"shape\"></a>\n\n## Choose the execution model\n\nYour software may run as a web application, native product or backend service. Lime registers and authorizes it; it does not provide Feishu mini-programs, chat robots or a customized desktop host. Choose the actual runtime and the corresponding public/confidential/machine client boundaries.\n\n<a id=\"implement\"></a>\n\n## Implement one complete task\n\n1. Build sign-in or device consent with full transaction validation and an application-owned session.\n2. Add only resource operations the registered client is allowed to call, and verify current space/application access.\n3. If events are needed, implement raw-body signature verification, durable deduplication and source-based recovery.\n4. Add commercial features only after the supported payment and entitlement path is complete.\n\n<a id=\"separate\"></a>\n\n## Keep deployment and publication explicit\n\nDeploy your code and platform configuration under their own release controls. A platform release freezes configuration, not an arbitrary external binary. Verify that the public entry points to the intended deployed product before submitting review; do not use an internal preview URL as a production promise.\n\n[Web application](https://open.limeai.run/docs/web-application?locale=en)\n\n[Backend service](https://open.limeai.run/docs/server-application?locale=en)\n\n[Native application](https://open.limeai.run/docs/native-application?locale=en)\n","revision":"sha256:09a22506077f7eac95b8ed19b237a563bba07c21d32f98debfccb03d8761670f"},{"id":"test-marketplace-application","group":"guide","category":"Launch and maintain","title":"Test a distributable application","summary":"Verify the same configuration with permitted, denied and recovery scenarios.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/test-marketplace-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"matrix","title":"Build a role and environment matrix"},{"id":"state","title":"Exercise failure states deliberately"},{"id":"evidence","title":"Retain reproducible evidence"}],"markdown":"# Test a distributable application\n\nVerify the same configuration with permitted, denied and recovery scenarios.\n\n<a id=\"matrix\"></a>\n\n## Build a role and environment matrix\n\n| Case | Check |\n| --- | --- |\n| Eligible tester | Can enter sandbox and complete the intended task under the expected installation. |\n| Unrelated user | Cannot read configuration, authorize restricted use or manage another application's data. |\n| Removed member | A previously issued token cannot restore current resource access. |\n| Unknown result | Recover the original command/key without duplicate writes. |\n\n<a id=\"state\"></a>\n\n## Exercise failure states deliberately\n\n1. Cancel authorization, expire a code, use a stale revision and reject a permission request.\n2. Deliver a duplicate event and lose a write response after submission; verify the same original result.\n3. Check source language and translations, desktop and narrow layouts, keyboard focus and long content.\n\n<a id=\"evidence\"></a>\n\n## Retain reproducible evidence\n\nRecord application/configuration revision, deployment, actor roles and redacted request IDs. Do not copy Feishu's automatic test-enterprise grants or numeric quotas: Lime sandbox eligibility remains governed by current application/test membership and installation policy. Successful dry-run or package installation is not live acceptance.\n\n[Configure testers](https://open.limeai.run/docs/test-users?locale=en)\n\n[Launch checklist](https://open.limeai.run/docs/launch-checklist?locale=en)\n","revision":"sha256:02ea7a5d82de9095e3e7669dbdee457729913afbc3c7a536350b57df6bf0d87b"},{"id":"publish-marketplace-application","group":"guide","category":"Launch and maintain","title":"Publish the approved application","summary":"Publish a specific approved release and verify its customer-facing entry.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/publish-marketplace-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"Confirm the release to publish"},{"id":"publish","title":"Publish explicitly"},{"id":"verify","title":"Validate customer use separately"}],"markdown":"# Publish the approved application\n\nPublish a specific approved release and verify its customer-facing entry.\n\n<a id=\"prepare\"></a>\n\n## Confirm the release to publish\n\nRead the release ID, frozen revisions, approval decision, intended distribution and client environment. Draft state is not evidence of what the approved release contains. If the desired change is absent, create and review a new release instead of assuming publication takes the latest draft.\n\n<a id=\"publish\"></a>\n\n## Publish explicitly\n\n1. Complete the current role, recent-authentication, revision and idempotency requirements for the publication command.\n2. Submit the intended release once and recover the original command if its response is lost.\n3. Confirm the published version and customer-facing application detail before enabling further distribution.\n\n<a id=\"verify\"></a>\n\n## Validate customer use separately\n\nTest discovery, explicit installation, eligible audience, individual consent and the actual application entry. Publication does not purchase a commercial product or activate arbitrary clients. If a production capability is still unprovisioned, state the limitation and keep the associated journey unavailable until verified.\n\n[Distribution rules](https://open.limeai.run/docs/distribution?locale=en)\n\n[Installation lifecycle](https://open.limeai.run/docs/installations?locale=en)\n","revision":"sha256:ae23b2a883c60a1f69afe1ba0396469351fd6a1352fd3f3bda3d42a251f269ad"},{"id":"test-users","group":"guide","category":"Manage an application","title":"Test users and spaces","summary":"Grant sandbox access deliberately without importing production data or Feishu test-tenant rules.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/test-users?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"Prepare separate test identities"},{"id":"grant","title":"Grant and remove only necessary access"},{"id":"data","title":"Keep test data contained"}],"markdown":"# Test users and spaces\n\nGrant sandbox access deliberately without importing production data or Feishu test-tenant rules.\n\n<a id=\"prepare\"></a>\n\n## Prepare separate test identities\n\nUse a designated sandbox application/client and permitted test users. Record which space, application role, tester eligibility and installation each case needs. An organization member is not automatically an application collaborator or tester; a collaborator is not automatically a customer beneficiary.\n\n<a id=\"grant\"></a>\n\n## Grant and remove only necessary access\n\n1. An eligible maintainer adds the minimal test membership using the application's actual access controls.\n2. Test both the permitted user and an unrelated or removed user against the same sandbox configuration.\n3. Remove temporary access after acceptance and verify that an old token cannot bypass the removal.\n\n<a id=\"data\"></a>\n\n## Keep test data contained\n\nUse synthetic personal and financial data. Do not copy production secrets, customer contacts or order facts into a test fixture. Lime does not promise Feishu's test-enterprise provisioning, automatic permission grants or per-enterprise user quotas; rely on the current application/environment policy.\n\n[Environment isolation](https://open.limeai.run/docs/environments?locale=en)\n\n[Application collaboration](https://open.limeai.run/docs/collaboration?locale=en)\n","revision":"sha256:027729fd6b6b8893f4ed6dfca40ccfa941e50fa4881a0459a05772f3200da569"},{"id":"application-availability","group":"guide","category":"Manage an application","title":"Application availability","summary":"Distinguish public discovery, installation eligibility and the users who may actually run an application.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-availability?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"layers","title":"Check every applicable layer"},{"id":"change","title":"Change the intended boundary"},{"id":"verify","title":"Test removal and switching"}],"markdown":"# Application availability\n\nDistinguish public discovery, installation eligibility and the users who may actually run an application.\n\n<a id=\"layers\"></a>\n\n## Check every applicable layer\n\n| Layer | Decision |\n| --- | --- |\n| Listing | Who may discover the published application's public details. |\n| Installation | Which space may install the release and approve its requested scopes. |\n| Use | Which current users are permitted by installation and individual consent. |\n| Management | Who may configure or operate the application through separately granted duties. |\n\n<a id=\"change\"></a>\n\n## Change the intended boundary\n\nRead the active installation/configuration and revision, identify the exact user or space set, and use the supported operation for that boundary. A wider public listing cannot silently expand a customer's installation scopes or turn every employee into an application user.\n\n<a id=\"verify\"></a>\n\n## Test removal and switching\n\nAfter a range or membership change, verify current access on the backend and clear context-bound UI data after space/account switching. Existing identity assertions must not restore revoked resource access. Keep any paid entitlement decision separate from the installation audience.\n\n[Installation rules](https://open.limeai.run/docs/installations?locale=en)\n\n[Membership and duties](https://open.limeai.run/docs/members-permissions?locale=en)\n","revision":"sha256:8b36efa12ffaa96d489ca3bd934b8d47b228dea8e2bdedd9206f78f6bddc4c1d"},{"id":"share-application","group":"guide","category":"Launch and maintain","title":"Share an application safely","summary":"Share a discoverable product entry without treating a link as consent or permission.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/share-application?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"link","title":"Share a stable public entry"},{"id":"consent","title":"Let the recipient decide"},{"id":"boundaries","title":"Keep deep links within the supported contract"}],"markdown":"# Share an application safely\n\nShare a discoverable product entry without treating a link as consent or permission.\n\n<a id=\"link\"></a>\n\n## Share a stable public entry\n\nShare the application's published public detail or supported installation entry. Explain the application and any account, organization or purchase requirements. Do not share an internal configuration URL as a customer entry, or include tokens, codes, secrets or private test-user identifiers in the link.\n\n<a id=\"consent\"></a>\n\n## Let the recipient decide\n\n1. On entry, show the application, target space and permission requested before any write.\n2. If authentication is needed, return to the original safe entry after sign-in, then ask the user to review the action.\n3. Allow cancellation and handle an ineligible recipient without leaking private application configuration.\n\n<a id=\"boundaries\"></a>\n\n## Keep deep links within the supported contract\n\nAn anonymous installation link must not automatically install or purchase. Validate local return routes and reject open redirects. Feishu AppLink, chat sharing, desktop menus and app badges are host-specific capabilities and are not available through a Lime registration.\n\n[Distribution](https://open.limeai.run/docs/distribution?locale=en)\n\n[Safe return destinations](https://open.limeai.run/docs/callback-validation?locale=en)\n","revision":"sha256:3753810a94ded47f998c6f86677fe9b70267676532d833c2994c1478a56488e7"},{"id":"application-logs","group":"guide","category":"Launch and maintain","title":"Application logs and diagnostics","summary":"Correlate API, event and configuration outcomes using authorized, redacted records.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-logs?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"sources","title":"Choose the record that owns the outcome"},{"id":"query","title":"Narrow the investigation"},{"id":"privacy","title":"Respect the delivered log surface"}],"markdown":"# Application logs and diagnostics\n\nCorrelate API, event and configuration outcomes using authorized, redacted records.\n\n<a id=\"sources\"></a>\n\n## Choose the record that owns the outcome\n\n| Question | Record |\n| --- | --- |\n| Why was an API request rejected? | HTTP status, stable error code and request_id from the resource API. |\n| Was an event accepted? | Delivery attempt plus the receiver's durable inbox and processing outcome. |\n| Which configuration was reviewed? | Frozen release IDs/revisions and independent review/audit records. |\n| Was an order paid? | The original order and trusted payment facts, not a UI toast or receipt alone. |\n\n<a id=\"query\"></a>\n\n## Narrow the investigation\n\n1. Record a precise time window with timezone, environment and authorized application/space context.\n2. Follow returned request/event/source identifiers rather than searching user email or raw tokens.\n3. Compare source and consumer progress, preserving the original failed command for recovery.\n\n<a id=\"privacy\"></a>\n\n## Respect the delivered log surface\n\nUse the diagnostics and audit operations actually exposed for your role. A full Feishu-style server/client log console, automatic support forwarding and fixed retention periods are not implied by this guide. Keep passwords, access/refresh tokens, secrets, authorization codes and personal request bodies out of support exports.\n\n[API diagnostics](https://open.limeai.run/docs/api-debugging?locale=en)\n\n[Delivery diagnostics](https://open.limeai.run/docs/webhook-deliveries?locale=en)\n\n[Audit and notification](https://open.limeai.run/docs/audit-notifications?locale=en)\n","revision":"sha256:369a1964f9db9020da6e10805c10f93456cbda0bbf4d6fe603341db2acb7bef9"},{"id":"application-analytics","group":"guide","category":"Launch and maintain","title":"Application operation metrics","summary":"Define useful measures without confusing discovery, installation, consent and purchase.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-analytics?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"metrics","title":"Define each metric and its source"},{"id":"collect","title":"Collect only necessary evidence"},{"id":"status","title":"Know the dashboard boundary"}],"markdown":"# Application operation metrics\n\nDefine useful measures without confusing discovery, installation, consent and purchase.\n\n<a id=\"metrics\"></a>\n\n## Define each metric and its source\n\n| Metric | Required definition |\n| --- | --- |\n| Discovery | Public detail visits, time window and deduplication; not an installed user count. |\n| Installation | Active installations by owning space and release, separate from individual consent. |\n| Activity | An authorized meaningful product task and explicit actor/timezone window. |\n| Revenue | Source orders/payments/refunds by currency; never inferred from an entitlement count. |\n\n<a id=\"collect\"></a>\n\n## Collect only necessary evidence\n\nPrefer aggregated operational evidence with documented retention and access. Do not request broad identity scopes merely to count active users. Personal and organization spaces, sandbox and production, and different currencies must not be silently combined.\n\n<a id=\"status\"></a>\n\n## Know the dashboard boundary\n\nThe complete application analytics dashboard and automated front-end telemetry remain construction scope unless a specific deployed surface states otherwise. Available configuration, order and delivery records can support narrow diagnosis, but are not a promise of Feishu's daily activity dashboards or historical data coverage.\n\n[Present metrics clearly](https://open.limeai.run/docs/design-visualization?locale=en)\n\n[Protect telemetry data](https://open.limeai.run/docs/data-protection?locale=en)\n","revision":"sha256:c9448eb4146948e0a3be6f3e55b544cd80b6a15d86822719eccd5e64c8bea560"},{"id":"user-feedback","group":"guide","category":"Launch and maintain","title":"User feedback and support","summary":"Provide a useful support entry and gather enough redacted context to resolve the task.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/user-feedback?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"entry","title":"Make support discoverable"},{"id":"form","title":"Ask for actionable information"},{"id":"status","title":"Separate support from platform automation"}],"markdown":"# User feedback and support\n\nProvide a useful support entry and gather enough redacted context to resolve the task.\n\n<a id=\"entry\"></a>\n\n## Make support discoverable\n\nMaintain the public support information associated with the application. Offer a clear route from a blocked task, preserving the relevant application and environment without sending private configuration to an unrelated channel. A recipient must be able to report cancellation, access refusal or an unknown write result.\n\n<a id=\"form\"></a>\n\n## Ask for actionable information\n\n1. Ask for the user's intended task, observed result, time with timezone and a redacted request identifier.\n2. Allow an optional sanitized screenshot and warn against including credentials or unrelated personal data at the collection point.\n3. Explain who handles the feedback, expected follow-up channel and applicable retention; do not silently enroll the user in marketing.\n\n<a id=\"status\"></a>\n\n## Separate support from platform automation\n\nA centralized feedback inbox, automatic host-client capture and one-click log transfer are not currently implied by application registration. Use a maintained application support route until such workflows are delivered. A support agent must not ask for a password, token, secret or device code to reproduce the issue.\n\n[Collect diagnostics](https://open.limeai.run/docs/application-logs?locale=en)\n\n[Escalate an incident](https://open.limeai.run/docs/incident-response?locale=en)\n","revision":"sha256:50ab305926318253fce2dc505b24509d0c6a5ac10a2013eed6b1bcc7fbf508ba"},{"id":"development-quality","group":"guide","category":"Launch and maintain","title":"Integration quality","summary":"Measure availability and safe recovery alongside the happy path.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/development-quality?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"contract","title":"Validate the contract boundary"},{"id":"quality","title":"Check user-visible quality"},{"id":"monitor","title":"Monitor what is actually deployed"}],"markdown":"# Integration quality\n\nMeasure availability and safe recovery alongside the happy path.\n\n<a id=\"contract\"></a>\n\n## Validate the contract boundary\n\nUse current schemas and required runtime context, including permission, revision and idempotency. Test an eligible user, an unrelated user and a removed user. Check that a new token cannot bypass application/environment restrictions and that a request to another app's identifier is rejected.\n\n<a id=\"quality\"></a>\n\n## Check user-visible quality\n\n1. Run the real journey in supported language variants and desktop/narrow layouts with keyboard-only navigation.\n2. Observe loading, empty, denied, expired and unknown-result states, keeping focus and the original task recoverable.\n3. Verify timeouts, duplicates, event retries and external dependency failure under bounded deadlines.\n\n<a id=\"monitor\"></a>\n\n## Monitor what is actually deployed\n\nUse request/delivery errors and source-domain recovery to detect regressions. Automated white-screen metrics, host SDK failure dashboards and full quality trend reports remain construction scope unless explicitly delivered. A test summary should identify its deployment, scenario coverage and unresolved limits, without claiming pixel-perfect or end-to-end completion from static checks.\n\n[Launch acceptance](https://open.limeai.run/docs/launch-checklist?locale=en)\n\n[Resilience](https://open.limeai.run/docs/api-retry-policy?locale=en)\n","revision":"sha256:f1e806a7ce8950f18a54cd8ec8674acd119f39d03635e5326a3f7436cd7af0ad"},{"id":"developer-tools-overview","group":"guide","category":"Development standards","title":"Developer tools","summary":"Choose the reference, published CLI and ordinary runtime tools for the task.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/developer-tools-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose","title":"Choose a tool by its purpose"},{"id":"install","title":"Use the published CLI"},{"id":"limits","title":"Avoid unsupported host tooling"}],"markdown":"# Developer tools\n\nChoose the reference, published CLI and ordinary runtime tools for the task.\n\n<a id=\"choose\"></a>\n\n## Choose a tool by its purpose\n\n| Tool | Use |\n| --- | --- |\n| API reference | Browse current operations, fields, examples and permission requirements. |\n| limecloud-cli | Install @limecloud/cli, discover schema, preview requests and execute authorized user operations. |\n| Browser developer tools | Inspect your own page, network, layout and accessibility without a proprietary host simulator. |\n| Maintained OAuth library | Implement standards-based external applications with pinned issuer and full validation. |\n\n<a id=\"install\"></a>\n\n## Use the published CLI\n\nThe package is published; command names are limecloud-cli and limecloud. Pin the version tested by automation. CLI installation and offline discovery are separate from target API deployment, dedicated-client provisioning, user grant and real permission verification.\n\n```sh\nnpm install --global @limecloud/cli@0.3.0\nlimecloud-cli --version\nlimecloud-cli schema\n```\n\n<a id=\"limits\"></a>\n\n## Avoid unsupported host tooling\n\nLime does not ship Feishu's IDE, H5 simulator, mini-program compiler, host remote debugger or automatic native packaging. Your project's normal npm tooling and local reload remain available under its own build process; they are not a new platform runtime contract.\n\n[CLI documentation](https://open.limeai.run/docs/cli-overview?locale=en)\n\n[API debugging](https://open.limeai.run/docs/api-debugging?locale=en)\n","revision":"sha256:f8e1b263d6dfc0fc5b194abf03e5a8099f74f799f43ad473b22d7e2711563b08"},{"id":"design-overview","group":"guide","category":"Application design","title":"Application design overview","summary":"Build a consistent Lime experience around a clear user task.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"audience","title":"Who this guide serves"},{"id":"design-workflow","title":"From task to implementation"},{"id":"design-feedback","title":"Research and actionable feedback"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Application design overview\n\nBuild a consistent Lime experience around a clear user task.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nStart with the actor, task, expected result and refusal/recovery states. Keep identity, installation, purchase and marketing decisions independent. Reuse the Lime visual baseline while organizing each portal around its own user's tasks.\n\nThe current shared package exports Button, Card, Notice, Empty, Loading, Modal and AppIcon. The remaining component guides describe design and accessibility requirements; they do not claim that every named component has a published @lime/ui implementation.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-overview](https://open.limeai.run/docs/design-overview?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Shared styles | Load @lime/ui/styles.css and semantic tokens before scoped product styles. |\n| Hierarchy | Name the task directly; remove decorative labels, repeated headings and explanations that do not affect a decision. |\n| Availability | Separate delivered behavior from construction scope; a disabled mock action is not a finished journey. |\n\n<a id=\"audience\"></a>\n\n## Who this guide serves\n\nDesigners and frontend engineers can use these pages to plan interface behavior, visual hierarchy and implementation acceptance. A component guide specifies the intended experience even when that component is implemented with native controls rather than an exported shared component.\n\n<a id=\"design-workflow\"></a>\n\n## From task to implementation\n\nBegin with user goals and real constraints, choose the appropriate component pattern, then review content, states, responsive layout and accessibility together. Keep public discovery, development, operations and administration organized for their own users while sharing the same design language.\n\n<a id=\"design-feedback\"></a>\n\n## Research and actionable feedback\n\nDescribe the user's task, the exact component state, the expected outcome and the observed difficulty. Include the viewport, registered language and a redacted reproduction. Feedback about an inaccessible control or missing recovery should identify the failed task, not only a preferred visual style.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nUse native semantic controls where a shared implementation is absent. A new shared component must ship styling, keyboard behavior and accessible states together. Do not install a second UI library to reproduce one screen.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Review the same user task in source language and registered translations at 1440×1000 and 390×844.\n2. Check keyboard focus, long content, denied access, unknown results and switching between micro-applications.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:ded220525a238cfc4d4bca8a801abbdcd2dbff44688b1a75349fa9fd3015f4a1"},{"id":"design-layout","group":"guide","category":"Application design","title":"Layout","summary":"Use stable navigation and task-based grouping with predictable content spacing.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-layout?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"density","title":"Information density"},{"id":"horizontal-alignment","title":"Horizontal alignment"},{"id":"vertical-alignment","title":"Vertical and optical alignment"},{"id":"form-alignment","title":"Label and field alignment"},{"id":"numeric-alignment","title":"Numeric comparison"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Layout\n\nUse stable navigation and task-based grouping with predictable content spacing.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nChoose the page structure from its task: public discovery, application management, a focused form or a long reference article. Keep the current application/space context visible when it affects every action. Do not force a public document into a dashboard grid.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-layout](https://open.limeai.run/docs/design-layout?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Desktop shell | The shared baseline uses a 64px header, 270px sidebar and 24px page padding where that shell applies. |\n| Content | Constrain reading width, align labels and group related operations; use space before adding containers. |\n| Narrow screens | Use the 16px mobile page-padding token and move navigation into a labelled dismissible surface. |\n\n<a id=\"density\"></a>\n\n## Information density\n\nUse a compact density when users compare many application, order or ledger rows and perform repeated operations. Keep labels and row actions readable. Use more space around warnings, calendar choices and consequential confirmations so the click target and the meaning remain clear.\n\nCompare the same data at the same viewport before changing density. Removing necessary information or reducing text below the shared minimum is not a density improvement.\n\n[design-detail-layout-density](https://open.limeai.run/docs/design-layout?locale=en#density)\n\n![Neutral list skeletons showing information density.](https://open.limeai.run/docs/assets/design/source-0028-001.png)\n\n![Neutral list skeletons showing information density.](https://open.limeai.run/docs/assets/design/source-0028-003.png)\n\n![Animated comparison of spacing in a dense list.](https://open.limeai.run/docs/assets/design/source-0028-005.gif)\n\n![Dense list layout with aligned checkboxes and columns.](https://open.limeai.run/docs/assets/design/source-0028-006.png)\n\n![List spacing and selected row background comparison.](https://open.limeai.run/docs/assets/design/source-0028-008.png)\n\n<a id=\"horizontal-alignment\"></a>\n\n## Horizontal alignment\n\nLeft alignment provides a stable starting edge for text. Right alignment supports numeric comparison; centering suits a short isolated value. Stretch flexible fields within their container, while keeping fixed controls at an intentional width.\n\n[design-detail-layout-alignment](https://open.limeai.run/docs/design-layout?locale=en#horizontal-alignment)\n\n<a id=\"vertical-alignment\"></a>\n\n## Vertical and optical alignment\n\nChoose top alignment for multi-line content, center alignment for a short row of controls, and bottom or stretch only when the relationship requires it. Align a small icon with the visible text rather than assuming equal bounding boxes create an equal visual center.\n\n<a id=\"form-alignment\"></a>\n\n## Label and field alignment\n\nPlace labels above fields on narrow forms and when translations can be long. A short horizontal filter may use right-aligned labels beside inputs. Keep one label edge within a group and convert to vertical layout before either the label or the field becomes cramped.\n\n<a id=\"numeric-alignment\"></a>\n\n## Numeric comparison\n\nRight-align comparable amounts and percentages and use tabular numerals. Apply consistent display precision within a column only when it matches the recorded unit and currency scale. Keep the exact value available and never round the business value merely to align a table.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep page-level actions near their object and avoid nested scrolling that hides the primary submit action. Sticky headers or sidebars must not cover anchors, focus or content. Scope micro-application layout rules to its root.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check 390px width with long titles, side navigation open and an on-screen keyboard.\n2. Confirm only intended table/code regions scroll horizontally and the page itself does not.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:e552eae04360c931cf3426d53faff05353d3d2b769804446051c31c83d66144c"},{"id":"design-motion","group":"guide","category":"Application design","title":"Motion","summary":"Use motion only to explain a state or spatial transition.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-motion?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"motion-effects","title":"Effects and state transitions"},{"id":"motion-timing","title":"Duration and easing"},{"id":"motion-handoff","title":"Animation handoff and interruption"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Motion\n\nUse motion only to explain a state or spatial transition.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nA transition may help a user understand a menu opening, a panel changing or a task becoming busy. Decorative entry sequences, bouncing badges and repeated attention effects increase distraction and are not part of the Lime baseline.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-motion](https://open.limeai.run/docs/design-motion?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Timing | Necessary transitions use 250ms ease-out under the shared rule; remove transitions that add no meaning. |\n| Reduced motion | Respect prefers-reduced-motion and preserve understandable static states. |\n| Progress | An animated spinner indicates activity, never a measured percentage or confirmed success. |\n\n<a id=\"motion-effects\"></a>\n\n## Effects and state transitions\n\nPosition explains spatial movement, scale explains emphasis, opacity explains appearance and disappearance, and color may reinforce a changed state. Choose only properties that clarify the action. Do not animate a text replacement, font weight or business result in a way that makes the meaning unstable.\n\n![Animated square demonstrating a change in position.](https://open.limeai.run/docs/assets/design/source-0029-001.gif)\n\n![Animated square demonstrating a change in scale.](https://open.limeai.run/docs/assets/design/source-0029-002.gif)\n\n![Animated square demonstrating rotation.](https://open.limeai.run/docs/assets/design/source-0029-003.gif)\n\n![Animated square demonstrating a change in opacity.](https://open.limeai.run/docs/assets/design/source-0029-004.gif)\n\n![Animated square demonstrating a color change.](https://open.limeai.run/docs/assets/design/source-0029-005.gif)\n\n<a id=\"motion-timing\"></a>\n\n## Duration and easing\n\nMotion should respond immediately and settle predictably. Lime's necessary transitions use the shared 250ms ease-out baseline; the reference's acceleration, deceleration and overshoot categories explain perception and do not add a new family of product animation constants. Avoid bounce effects on routine management actions.\n\n<a id=\"motion-handoff\"></a>\n\n## Animation handoff and interruption\n\nDocument the trigger, target, changed properties, beginning and ending states, timing and reduced-motion alternative. Test reversal, rapid repeated input and cancellation. Completion announcements follow the confirmed task state, while a static error or unknown result remains available after motion stops.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDo not move the focused control during a submission or animate a result before the server confirms it. A failed or uncertain write needs a persistent recovery state after the animation ends. Keep announcements semantic rather than repeatedly reading animation frames.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Enable reduced motion and verify that menus, loading and validation remain understandable.\n2. Test rapid open/close and cancelled requests without stranded overlays or focus.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:378d19d5be262aa0ac935cf23273d096e65baf007fa1e1808762198c95d03926"},{"id":"design-color","group":"guide","category":"Application design","title":"Color","summary":"Express hierarchy and state through shared semantic colors.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-color?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"brand-and-support","title":"Brand and supporting colors"},{"id":"functional-and-neutral","title":"Functional and neutral colors"},{"id":"alpha-composition","title":"Opacity and composed backgrounds"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Color\n\nExpress hierarchy and state through shared semantic colors.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse the shared Radix-derived Lime palette for product surfaces. Choose a token for its meaning rather than sampling an attractive color from a screenshot. Document-reference color anchors are scoped exceptions for the documentation theme and cannot spread to management pages.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-color](https://open.limeai.run/docs/design-color?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Actions | Primary/hover use Accent 9/10; links and selected surfaces use their semantic tokens. |\n| Content | Neutral 12/11 express primary/secondary text; neutral boundaries remain low contrast without hiding controls. |\n| State | Use success, warning and error semantics with text or icons; never color alone. |\n\n<a id=\"brand-and-support\"></a>\n\n## Brand and supporting colors\n\nUse the shared accent for the primary call to action, selection and links, with each semantic token preserving its role. Supporting categorical colors distinguish known groups or illustrations. A gradient belongs only to an adopted promotional or documentation surface; it must not become a new state or button system.\n\n<a id=\"functional-and-neutral\"></a>\n\n## Functional and neutral colors\n\nUse success, warning and error colors consistently and include text or an icon with the state. Neutral text, background and boundary tokens establish hierarchy without weakening readability. Placeholder and disabled content have distinct purposes; neither is a substitute for the value or an explanation of denied access.\n\n![Neutral gray scale with hexadecimal color values.](https://open.limeai.run/docs/assets/design/source-0030-006.png)\n\n<a id=\"alpha-composition\"></a>\n\n## Opacity and composed backgrounds\n\nEvaluate contrast on the composed surface, including overlays, hover layers and transparent icons. Use shared overlay and surface tokens instead of copying a percentage onto arbitrary colors. An opaque button or panel that covers content must remain opaque even when its parent background changes.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nCheck contrast against the actual composed background, including hover, disabled and focus states. Current product support is the light theme; do not claim a complete dark theme because individual tokens can change.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check text, links, focused borders and status labels on every used surface.\n2. Verify grayscale and color-vision simulation preserve the meaning of state.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:2ab16be2742c950490033341b280849b94b4dd7c695a7f9eda5e6bdf1ad9b939"},{"id":"design-icons","group":"guide","category":"Application design","title":"Icons","summary":"Use recognizable symbols and give interactive icons an accessible name.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-icons?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"principles","title":"Meaning and consistency"},{"id":"hierarchy","title":"Navigation, actions and semantics"},{"id":"geometry","title":"Grid, active area and key shapes"},{"id":"optical-balance","title":"Pixel edges and visual weight"},{"id":"stroke-and-corners","title":"Stroke, endpoints and arrows"},{"id":"overlap-and-color","title":"Overlays, cleanup and color"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Icons\n\nUse recognizable symbols and give interactive icons an accessible name.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nIcons support an action or object; they should not create a separate vocabulary users must learn. Use the existing application glyph system for app presets. Keep stroke weight, optical alignment and meaning consistent within a group.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-icons](https://open.limeai.run/docs/design-icons?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| With text | Hide redundant decorative icons from assistive technology. |\n| Icon-only action | Provide a localized accessible name and sufficient hit area; a tooltip is supplemental. |\n| Status | Pair a state symbol with text; do not use an unfamiliar glyph for a destructive command. |\n\n<a id=\"principles\"></a>\n\n## Meaning and consistency\n\nChoose a familiar symbol whose meaning matches the action, then remove details that do not improve recognition. A star for a favorite and a heart for a reaction may be different actions. Keep geometry, corner treatment and stroke consistent within the same group; expressive styling must not obscure the command.\n\n![Filled star icon.](https://open.limeai.run/docs/assets/design/source-0031-001.png)\n\n![Filled heart icon.](https://open.limeai.run/docs/assets/design/source-0031-003.png)\n\n![Simplified camera icon.](https://open.limeai.run/docs/assets/design/source-0031-005.png)\n\n![Detailed camera icon.](https://open.limeai.run/docs/assets/design/source-0031-007.png)\n\n![Simplified thumbs up icon.](https://open.limeai.run/docs/assets/design/source-0031-009.png)\n\n![Detailed thumbs up icon.](https://open.limeai.run/docs/assets/design/source-0031-011.png)\n\n![Send icon.](https://open.limeai.run/docs/assets/design/source-0031-013.png)\n\n![Up arrow icon.](https://open.limeai.run/docs/assets/design/source-0031-015.png)\n\n<a id=\"hierarchy\"></a>\n\n## Navigation, actions and semantics\n\nNavigation symbols identify destinations; toolbar symbols trigger local actions; inline status or field symbols explain content. Use a consistent family for each layer and retain text for unfamiliar destinations. Decorative field icons do not acquire a click target merely because toolbar icons are interactive.\n\n[design-detail-icons-hierarchy](https://open.limeai.run/docs/design-icons?locale=en#hierarchy)\n\n<a id=\"geometry\"></a>\n\n## Grid, active area and key shapes\n\nUse a 24×24 drawing grid as the comparison basis for a new system symbol. Leave a safety area around the active shape; circular and square symbols may need different occupied widths to appear equally large. Export at the required display size while keeping the original viewBox and aspect ratio.\n\nReuse existing shared or Lucide symbols before drawing a variant. A diagram's construction dimensions explain optical balance; they do not authorize changing every existing glyph or the shared component contract.\n\n[design-detail-icons-geometry](https://open.limeai.run/docs/design-icons?locale=en#geometry)\n\n![Filled gear icon.](https://open.limeai.run/docs/assets/design/source-0031-029.png)\n\n![Outlined gear icon.](https://open.limeai.run/docs/assets/design/source-0031-030.png)\n\n![Overlapping shape icon.](https://open.limeai.run/docs/assets/design/source-0031-031.png)\n\n![Plus icon with dotted bounding box.](https://open.limeai.run/docs/assets/design/source-0031-032.png)\n\n![Solid and dotted overlapping shapes.](https://open.limeai.run/docs/assets/design/source-0031-033.png)\n\n<a id=\"optical-balance\"></a>\n\n## Pixel edges and visual weight\n\nInspect symbols at their actual output size. Align straight edges to the pixel grid where possible, then optically adjust an asymmetric shape instead of forcing mathematical centering. Compare the new glyph beside existing horizontal and vertical groups so diagonals, circles and rectangles carry similar weight.\n\n![User icon aligned to the pixel grid.](https://open.limeai.run/docs/assets/design/source-0031-034.png)\n\n![User icon showing blurred edges from pixel misalignment.](https://open.limeai.run/docs/assets/design/source-0031-036.png)\n\n![Diagonal pencil aligned to a grid.](https://open.limeai.run/docs/assets/design/source-0031-042.png)\n\n![Vertical pencil aligned to a grid.](https://open.limeai.run/docs/assets/design/source-0031-044.png)\n\n![Horizontal pencil aligned to a grid.](https://open.limeai.run/docs/assets/design/source-0031-046.png)\n\n<a id=\"stroke-and-corners\"></a>\n\n## Stroke, endpoints and arrows\n\nPreserve the stroke and endpoint treatment of the chosen icon family. A heavier filled variant and a thin outlined variant need separate optical checks. Keep small arrow angles, corner joins and disabled slashes legible; do not flatten a complex symbol until its distinction disappears.\n\n<a id=\"overlap-and-color\"></a>\n\n## Overlays, cleanup and color\n\nPlace a small overlay consistently, preserve a visible gap between intersecting shapes and remove unused paths before export. Use semantic icon colors: status icons pair with readable text, ordinary system icons follow the surrounding content, and application marks keep the configured preset or uploaded image.\n\n![Paired color values for icon states.](https://open.limeai.run/docs/assets/design/source-0031-067.png)\n\n![Semantic success, error, warning, and information icons.](https://open.limeai.run/docs/assets/design/source-0031-069.png)\n\n![Neutral toolbar icons.](https://open.limeai.run/docs/assets/design/source-0031-070.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep a menu trigger visibly active while its menu is open, and expose expanded state when applicable. Mirror direction-sensitive symbols only when the language/layout requires it; logos and universal media symbols keep their intended form.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check names with a screen reader and align icons beside English and Chinese labels.\n2. Test missing images and high zoom without losing the action label.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:2347d657eb121ced532bf631e8a1fc81f0cc857962082db73811cee0e51e3ce7"},{"id":"design-style","group":"guide","category":"Application design","title":"Surfaces, borders and shape","summary":"Use restrained surfaces and consistent boundaries to group content.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-style?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"corner-system","title":"Corner hierarchy and nesting"},{"id":"elevation","title":"Elevation and shadow direction"},{"id":"boundaries-background","title":"Dividers, borders and backgrounds"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Surfaces, borders and shape\n\nUse restrained surfaces and consistent boundaries to group content.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nGroup information with whitespace and alignment before adding cards. A border should express a container or interaction boundary. Avoid colored decorative rails, stacked shadows and arbitrary rounded shapes on ordinary management pages.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-style](https://open.limeai.run/docs/design-style?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Border | Use the shared 0.5px border baseline and semantic divider/input tokens. |\n| Radius | Use item/control/panel/dialog tokens (4/6/8/10px) and check nested spacing. |\n| Elevation | Use little or no shadow; a floating surface needs a clear boundary and predictable dismissal. |\n\n<a id=\"corner-system\"></a>\n\n## Corner hierarchy and nesting\n\nUse the shared 4px item, 6px control, 8px panel and 10px dialog tokens according to the object's role. Review a nested container with its actual padding: an inner surface should fit the outer curve without a pinched or visibly unrelated corner. Full-round marketing buttons remain a separate, limited pattern.\n\n![Corner radius construction with a circular guide.](https://open.limeai.run/docs/assets/design/source-0032-001.png)\n\n![Corner radius construction with a circular guide.](https://open.limeai.run/docs/assets/design/source-0032-002.png)\n\n![Corner radius construction with a circular guide.](https://open.limeai.run/docs/assets/design/source-0032-003.png)\n\n![Corner radius construction with a circular guide.](https://open.limeai.run/docs/assets/design/source-0032-004.png)\n\n![Corner radius construction with a circular guide.](https://open.limeai.run/docs/assets/design/source-0032-005.png)\n\n<a id=\"elevation\"></a>\n\n## Elevation and shadow direction\n\nUse position, a restrained surface and a fine boundary before adding shadow. Floating content needs an understandable relationship to its trigger, whether it opens above, below or beside it. The source's directional shadow examples explain elevation; Lime keeps ordinary cards flat and uses only necessary, restrained floating-layer treatment.\n\n![Light source, plane, and cast shadow diagram.](https://open.limeai.run/docs/assets/design/source-0032-006.png)\n\n![Numbered cards demonstrating levels of shadow.](https://open.limeai.run/docs/assets/design/source-0032-007.png)\n\n![Numbered panels comparing levels of elevation.](https://open.limeai.run/docs/assets/design/source-0032-008.png)\n\n![Numbered panels comparing levels of elevation.](https://open.limeai.run/docs/assets/design/source-0032-009.png)\n\n![Numbered panels comparing levels of elevation.](https://open.limeai.run/docs/assets/design/source-0032-010.png)\n\n![Numbered panels comparing levels of elevation.](https://open.limeai.run/docs/assets/design/source-0032-011.png)\n\n<a id=\"boundaries-background\"></a>\n\n## Dividers, borders and backgrounds\n\nA divider separates adjacent information; a border identifies a container or control. Use the shared 0.5px boundary baseline and the appropriate divider, input or surface token. Selected, hovered, read-only and disabled backgrounds must be distinct without adding decoration or concealing content.\n\n![Dialog surface separated from the background by an overlay.](https://open.limeai.run/docs/assets/design/source-0032-018.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nFocus is a functional indicator and must remain visible beside a fine border. Keep selected, hovered, disabled and read-only states distinct; a disabled background is not sufficient to explain why an action is unavailable.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Inspect nested cards and dialogs at normal and high zoom for clipped focus rings.\n2. Verify styles remain scoped after a qiankun application switch.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:81e36d5de112ca1951110d1ebfdbd85ff9a0c21ad29192df3279e856f44ce542"},{"id":"design-typography","group":"guide","category":"Application design","title":"Typography","summary":"Build hierarchy with a small type scale and readable long content.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-typography?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"weights","title":"Regular, medium and heading weights"},{"id":"type-scale","title":"Type scale and line height"},{"id":"text-colors","title":"Text colors and exact data"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Typography\n\nBuild hierarchy with a small type scale and readable long content.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nChoose text size by information role, then use weight, space and color for secondary distinctions. Standard business pages prefer the shared 12, 14 and 18px roles, with documented page exceptions. Never reduce readable text below 12px to force a layout to fit.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-typography](https://open.limeai.run/docs/design-typography?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Headings | Use a semantic heading hierarchy and task/object names without duplicate decorative labels. |\n| Body | Provide comfortable line height and reading width; wrap ordinary prose without truncating essential terms. |\n| Data | Use monospaced code/identifiers and tabular numerals for aligned money; preserve exact underlying values. |\n\n<a id=\"weights\"></a>\n\n## Regular, medium and heading weights\n\nUse regular weight for body reading, medium for concise emphasis and stronger weight only for the intended heading hierarchy. Keep the font fallback stack capable of displaying both English and Chinese. Weight changes must not shift an adjacent control or become the only indication of selection.\n\n<a id=\"type-scale\"></a>\n\n## Type scale and line height\n\nFollow the shared page-specific scale and minimum readable size. Documentation has an explicit long-form type-scale exception; a management form does not inherit its hero headings. Match line height to the font and allow translated or enlarged text to grow without clipping.\n\n<a id=\"text-colors\"></a>\n\n## Text colors and exact data\n\nPrimary and secondary text use their neutral semantic tokens, links use the link token, and functional colors accompany a confirmed state. Use monospace for machine identifiers and tabular numerals for comparable numbers. Never make critical legal or price restrictions look like a faint placeholder.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nLong IDs and code may scroll inside their region. Names can wrap or reveal a complete accessible value, but button labels should be shortened meaningfully before truncation. Chinese word wrapping and English word boundaries need separate visual checks.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check browser text enlargement and 200% zoom without losing a submit or close action.\n2. Verify hierarchy and line breaks in source and translated content, including long URLs.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:4d8ef10b4d9cba3836191c24122be15b6381c6815bc7e5e7ac94e5ab828334fe"},{"id":"design-i18n","group":"guide","category":"Application design","title":"Multilingual design standards","summary":"Separate stable meaning, language resources and localized business data.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-i18n?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"text-expansion","title":"Reserve space for text expansion"},{"id":"horizontal-space","title":"Horizontal constraints and long labels"},{"id":"vertical-space","title":"Line height and vertical expansion"},{"id":"single-column","title":"Prefer expandable vertical layouts"},{"id":"wrapping-and-handoff","title":"Wrapping rules and design handoff"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Multilingual design standards\n\nSeparate stable meaning, language resources and localized business data.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nRead supported languages from the shared locale registry. English is the source/default/final fallback, and Simplified Chinese is currently also enabled. Adding a language requires complete resources and verification; a new selector option alone is not language support.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-i18n](https://open.limeai.run/docs/design-i18n?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| UI messages | Use stable keys in the owning i18next namespace; never use English sentences or resource IDs as translation keys. |\n| Localized content | Store source content separately from translations indexed by canonical locale code, without fixed bilingual entities. |\n| Business data | Stable status/error codes and exact money/time remain independent of their translated display. |\n\n<a id=\"text-expansion\"></a>\n\n## Reserve space for text expansion\n\nReview short labels as carefully as long paragraphs: a two-character action can become several English words. Document each region's minimum and maximum width, its neighboring gaps, and whether overflow wraps, expands or moves to another row. Do not treat one fixed expansion percentage as a guarantee.\n\n[design-detail-i18n-expansion](https://open.limeai.run/docs/design-i18n?locale=en#text-expansion)\n\n<a id=\"horizontal-space\"></a>\n\n## Horizontal constraints and long labels\n\nStart from the English source and review every registered translation using real labels. Prefer flexible containers and fewer columns. Shorten an action without losing its object or consequence before considering truncation, and keep the full accessible name when a visible label is shortened.\n\n<a id=\"vertical-space\"></a>\n\n## Line height and vertical expansion\n\nText can grow vertically after translation or browser text enlargement. Use a line height that accommodates the actual font and allow message containers to grow. Avoid fixed heights that clip Chinese punctuation, diacritics, error messages or a second line of a label.\n\n<a id=\"single-column\"></a>\n\n## Prefer expandable vertical layouts\n\nUse a vertical label/value or action list when text is long, user supplied or difficult to predict. Keep parallel columns only for short controlled values that remain comparable. At a narrow width, let the complete action move below its related content rather than squeezing several actions into small tiles.\n\n[design-detail-i18n-wrapping](https://open.limeai.run/docs/design-i18n?locale=en#single-column)\n\n<a id=\"wrapping-and-handoff\"></a>\n\n## Wrapping rules and design handoff\n\nEnglish words and Chinese text have different break opportunities. Prefer normal language-aware wrapping for prose; reserve break-anywhere for unbroken identifiers or URLs. Record the expected long-label behavior with the design, and verify it with registered resources. Testing hypothetical expansion does not enable an unregistered language.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nUse whole messages, named interpolation and native CLDR plural handling. React text stays escaped; rich text uses controlled components. Go owns its native go-i18n templates; do not add a shared format converter or change process-wide locale per request.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Validate namespace completeness, interpolation and language-specific plural categories against the registry.\n2. Verify unsupported/script-specific tags follow explicit fallback without falsely claiming a translation.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:9edd3554d7034bbdd5d2806d982a5d2d1fa1311dae474e637a1ee6669b3d7912"},{"id":"design-interface-localization","group":"guide","category":"Application design","title":"Design a localized interface","summary":"Allow content expansion and preserve user choice across surfaces.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-interface-localization?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"language-dimensions","title":"Language length and height"},{"id":"word-boundaries","title":"Word boundaries and line breaks"},{"id":"regional-meaning","title":"Language, regional formats and culture"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Design a localized interface\n\nAllow content expansion and preserve user choice across surfaces.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse flexible labels and containers instead of positioning text with a fixed English width. Chinese may fit fewer words but require a different line break; English compound names and translations can be longer. Keep action meaning consistent rather than forcing literal word order.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-interface-localization](https://open.limeai.run/docs/design-interface-localization?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Selection | Read native language names from localeOptions, without flags or a hard-coded language pair. |\n| Formatting | Use Intl for display and keep language, timezone, currency and billing period independent. |\n| Preference | Save only a user's explicit choice; ordinary request negotiation must not rewrite the account preference. |\n\n<a id=\"language-dimensions\"></a>\n\n## Language length and height\n\nA short Chinese label and its English source occupy different widths, while glyphs, punctuation and diacritics may occupy different heights. Check real strings in each registered language. A percentage observed in one example is a test prompt, not a universal sizing rule.\n\n<a id=\"word-boundaries\"></a>\n\n## Word boundaries and line breaks\n\nAllow prose to wrap at natural language boundaries. Keep English words together when possible and respect Chinese punctuation rules. A long URL or opaque identifier may break inside its own region, while an action label should be shortened meaningfully. Do not insert manual line breaks into one translation to repair every viewport.\n\n<a id=\"regional-meaning\"></a>\n\n## Language, regional formats and culture\n\nSeparate translated interface messages from date, time, currency and number formatting. Use explicit timezone and recorded currency, avoid flag-based language choices, and check symbols for an unambiguous local meaning. The current registry enables English and Simplified Chinese; design resilience does not activate another language.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nHost and micro-app instances synchronize through the shared language bridge while keeping namespace ownership. A delayed preference fetch must not overwrite a newer manual selection. On API calls, send the canonical request language and honor Content-Language without using translation text for authorization.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test long labels, plural values, dates across timezones and money without floating-point conversion.\n2. Switch languages during an error and a pending request; confirm task state and explicit preference remain consistent.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:1e683b15a3b6f36f87da20ab8cbd6710b56bea288ed66995e3446ed876e41932"},{"id":"design-visualization","group":"guide","category":"Application design","title":"Data visualization","summary":"Choose a chart that preserves the metric, units and uncertainty.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-visualization?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"palettes","title":"Categorical, sequential and state palettes"},{"id":"chart-anatomy","title":"Chart structure and legends"},{"id":"choose-chart","title":"Choose by analytical purpose"},{"id":"chart-variants","title":"Frequently used chart variants"},{"id":"chart-adaptation","title":"Labels and responsive adaptation"},{"id":"extreme-values","title":"Extreme values and empty ranges"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Data visualization\n\nChoose a chart that preserves the metric, units and uncertainty.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a chart only when comparison, distribution or change is clearer than a small table. First define source, period, timezone, aggregation and units. Do not turn a partial response or missing data into zero, and do not sum amounts across currencies.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-visualization](https://open.limeai.run/docs/design-visualization?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Chart | Bars compare categories; lines show ordered change; use proportions only for a complete shared total. |\n| Axes | Label units, scales and date boundaries. Avoid a truncated bar baseline or an unexplained second axis. |\n| Palette | Use semantic/categorical colors consistently and reinforce distinctions through labels or patterns. |\n\n<a id=\"palettes\"></a>\n\n## Categorical, sequential and state palettes\n\nUse distinct categorical colors for independent series and a lightness sequence for ordered magnitude. A diverging scale needs a meaningful center such as zero. Keep success, warning and error colors for actual status. Reinforce every color distinction with a label, line pattern or symbol and keep series identity stable after filtering.\n\n[design-detail-visualization-palette](https://open.limeai.run/docs/design-visualization?locale=en#palettes)\n\n![Monochrome bars showing a single data series.](https://open.limeai.run/docs/assets/design/source-0036-002.png)\n\n![Grouped bars using a restrained categorical palette.](https://open.limeai.run/docs/assets/design/source-0036-003.png)\n\n![Positive and negative bars against a numeric axis.](https://open.limeai.run/docs/assets/design/source-0036-007.png)\n\n![Line chart with a numeric threshold and two colored segments.](https://open.limeai.run/docs/assets/design/source-0036-008.png)\n\n<a id=\"chart-anatomy\"></a>\n\n## Chart structure and legends\n\nA rectangular chart identifies the metric, units, axes, plotted series and the time or category domain. A circular chart still needs category labels and a clear total. Place the legend where it remains visible on the current screen, avoid redundant single-series legends, and provide an equivalent table for precise or assistive reading.\n\n<a id=\"choose-chart\"></a>\n\n## Choose by analytical purpose\n\nChoose the chart after deciding what the reader must compare. A visual resemblance to a funnel or radar is insufficient: the data must have the matching order and dimensions. Keep the number of series small enough to distinguish and use a table when the purpose is exact lookup.\n\n[design-detail-visualization-chart-choice](https://open.limeai.run/docs/design-visualization?locale=en#choose-chart)\n\n| Purpose | Rule |\n| --- | --- |\n| Comparison and ranking | Bars share a zero baseline and provide room for category names. |\n| Ordered change | Lines show time or another ordered domain; gaps remain visibly missing. |\n| Part of a total | Pie, ring or percent stacks require a complete, comparable total. |\n| Flow and distribution | Funnels need ordered stages; scatter plots need two measured dimensions. |\n\n<a id=\"chart-variants\"></a>\n\n## Frequently used chart variants\n\nGrouped bars compare series within categories; stacks emphasize a total and its parts. Step lines suit discrete state changes, while a smooth curve must not imply measurements between observations. Area charts emphasize magnitude over an ordered domain, and radar charts require comparable dimension scales.\n\nA combination chart must label each scale and explain why both are necessary. Avoid ornamental gradients, 3D slices and extra series that obscure the question. An operations chart is a view of source facts, not evidence that settlement or notification delivery completed.\n\n![Scatter plot with numeric axes.](https://open.limeai.run/docs/assets/design/source-0036-034.png)\n\n![Angular area chart against numeric axes.](https://open.limeai.run/docs/assets/design/source-0036-038.png)\n\n![Smooth area chart against numeric axes.](https://open.limeai.run/docs/assets/design/source-0036-039.png)\n\n<a id=\"chart-adaptation\"></a>\n\n## Labels and responsive adaptation\n\nPreserve the plotted data first, then useful legends and axis labels; reduce decorative grid lines before removing meaning. Wrap or abbreviate a label with access to the complete value, sample ticks without changing data, and use horizontal bars for long category names. Rotation should not create unreadable or clipped labels.\n\n<a id=\"extreme-values\"></a>\n\n## Extreme values and empty ranges\n\nCheck a single point, all-equal values, zero totals, negative values, outliers and no observations. Zero is a measured value, while missing data is a separate state. Keep units and scale changes explicit and never add values from different currencies into one total.\n\n![Numeric line chart with a range-selection overview.](https://open.limeai.run/docs/assets/design/source-0036-058.png)\n\n![Dense numeric line chart with thirty data points.](https://open.limeai.run/docs/assets/design/source-0036-060.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nTooltips must be keyboard reachable and offer the same values as pointer interactions. Include a readable table or textual equivalent for core conclusions. Show loading, no data, permission denial and partial data as distinct states.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test single values, equal ranges, negative/refunded amounts, long labels and very large exact integers.\n2. Verify at narrow widths and with screen-reader access to the same metric definitions.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:a6be1d72a96a3f4ddadb7b86802be8fbdcb258180d8048de42f3bb9756bc12ee"},{"id":"design-responsive","group":"guide","category":"Application design","title":"Responsive design","summary":"Adapt the task to available space without hiding essential decisions.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-responsive?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"grid-and-spacing","title":"Content grids and spacing"},{"id":"page-layouts","title":"Full-width and constrained layouts"},{"id":"adaptation-mechanisms","title":"Wrap, stretch, scroll and collapse"},{"id":"navigation-mapping","title":"Responsive navigation"},{"id":"component-mapping","title":"Map components without changing meaning"},{"id":"form-and-data-mapping","title":"Forms, descriptions and data tables"},{"id":"home-and-signin","title":"Home and sign-in adaptations"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Responsive design\n\nAdapt the task to available space without hiding essential decisions.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nResponsive design changes arrangement, not authorization or the meaning of an operation. Start from the task's minimum information and actions, then let columns, navigation and secondary details adapt. Keep purchase, permission and unknown-result information visible at narrow widths.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-responsive](https://open.limeai.run/docs/design-responsive?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Navigation | Collapse the sidebar into a named panel; retain selected location, Escape/close and focus restoration. |\n| Forms | Stack fields and allow labels/errors to wrap; keep the main action reachable with the on-screen keyboard. |\n| Data | Choose priority columns or a scoped horizontal table region; do not shrink all text to fit. |\n\n<a id=\"grid-and-spacing\"></a>\n\n## Content grids and spacing\n\nApply the grid to the available content width after subtracting persistent navigation. Distinguish columns, gutters and outer margins; a fixed sidebar is not another content column. Keep the shared 24px desktop and 16px narrow-screen page padding where that shell applies.\n\n![Numeric spacing scale from zero to one hundred and twenty.](https://open.limeai.run/docs/assets/design/source-0037-006.png)\n\n<a id=\"page-layouts\"></a>\n\n## Full-width and constrained layouts\n\nUse flexible full-width content for dense data or working tools, and constrain reading width for focused forms and articles. One, two or three content regions should retain a clear order. Set breakpoints when the actual content no longer fits, document the chosen transition, and avoid copying device widths without testing the Lime task.\n\n![Twelve column grid split into three and nine columns.](https://open.limeai.run/docs/assets/design/source-0037-015.png)\n\n![Twelve column grid split into four and eight columns.](https://open.limeai.run/docs/assets/design/source-0037-016.png)\n\n![Three part arrangements of a twelve column grid.](https://open.limeai.run/docs/assets/design/source-0037-017.png)\n\n<a id=\"adaptation-mechanisms\"></a>\n\n## Wrap, stretch, scroll and collapse\n\nStack related modules when they no longer fit side by side. Stretch images with their aspect ratio, let text grow in height, and keep dense tables in a named horizontal scroll region. Move secondary commands into a labelled menu while retaining the primary task and necessary consequences.\n\n<a id=\"navigation-mapping\"></a>\n\n## Responsive navigation\n\nAt a wide width, show the current top-level and local navigation. As space reduces, collapse less-used items before the active location. On a narrow screen, use an explicit navigation trigger and a dismissible panel; the open panel identifies the selected page and restores focus when closed.\n\n[design-detail-responsive-navigation](https://open.limeai.run/docs/design-responsive?locale=en#navigation-mapping)\n\n![Responsive shell with top navigation and main content.](https://open.limeai.run/docs/assets/design/source-0037-027.png)\n\n![Responsive shell with side navigation and main content.](https://open.limeai.run/docs/assets/design/source-0037-028.png)\n\n![Responsive shell combining top and side navigation.](https://open.limeai.run/docs/assets/design/source-0037-029.png)\n\n<a id=\"component-mapping\"></a>\n\n## Map components without changing meaning\n\nA desktop dialog may become a wider or nearly full-height panel on a phone, and a small action menu may become a touch-friendly list. Retain the same accessible name, action order, authorization and recovery. A visual mapping is a design requirement and does not imply a new shared component has already shipped.\n\n<a id=\"form-and-data-mapping\"></a>\n\n## Forms, descriptions and data tables\n\nConvert multiple form columns into one reading sequence, keeping labels, help and errors with their input. For descriptions, calculate the grid from the containing card, not the whole screen. For tables, preserve important identifiers and amounts, allow intentional horizontal scrolling and keep row actions reachable by touch.\n\n[design-detail-responsive-form-table](https://open.limeai.run/docs/design-responsive?locale=en#form-and-data-mapping)\n\n![Form skeleton adapting between four, three, two, and one columns.](https://open.limeai.run/docs/assets/design/source-0037-080.png)\n\n![Form skeleton adapting between four, three, two, and one columns.](https://open.limeai.run/docs/assets/design/source-0037-081.png)\n\n![Form skeleton adapting between four, three, two, and one columns.](https://open.limeai.run/docs/assets/design/source-0037-082.png)\n\n![Form skeleton adapting between four, three, two, and one columns.](https://open.limeai.run/docs/assets/design/source-0037-083.png)\n\n![Table skeleton adapting from a wide to a narrow viewport.](https://open.limeai.run/docs/assets/design/source-0037-092.png)\n\n<a id=\"home-and-signin\"></a>\n\n## Home and sign-in adaptations\n\nA product home may reorder related modules or remove decorative imagery while retaining the same essential tasks. Sign-in must keep the account field, challenge, recovery and policy actions visible with the software keyboard open. Decorative panels collapse before authentication controls, and resize must not reset the transaction.\n\n![Panels changing size, visibility, and placement across grid widths.](https://open.limeai.run/docs/assets/design/source-0037-107.png)\n\n![Panels changing size, visibility, and placement across grid widths.](https://open.limeai.run/docs/assets/design/source-0037-108.png)\n\n![Panels changing size, visibility, and placement across grid widths.](https://open.limeai.run/docs/assets/design/source-0037-109.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nAvoid hover-only controls and tiny split-button targets on touch devices. A modal must fit inside the viewport with its own intentional content scrolling. Sticky/fixed elements must respect the visible viewport and not cover focused fields or a validation message.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check 1440×1000 and 390×844, landscape, 200% zoom and an open software keyboard.\n2. Test menus, dialogs, long translations, code blocks and table overflow with keyboard and touch.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:70bfb762dd724a743ade791d4207c6583d2dabf885250dc99e0c18090af48791"},{"id":"design-anchor","group":"guide","category":"Application design","title":"Anchor navigation","summary":"Navigate within one long page while preserving headings and reading position.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-anchor?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"anchor-variants","title":"Flat and hierarchical contents"},{"id":"anchor-placement","title":"Placement, overflow and sticky offset"},{"id":"anchor-step-comparison","title":"Anchors and steps"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Anchor navigation\n\nNavigate within one long page while preserving headings and reading position.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse anchors for distinct sections of the same page, such as API parameters or a development guide. Use route navigation for a different resource and a stepper for a sequential task; anchors must not imply a workflow is complete.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-anchor](https://open.limeai.run/docs/design-anchor?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Target | Give each section a stable unique ID and a meaningful semantic heading. |\n| Position | Offset scrolling for sticky headers and keep the current section understandable without color alone. |\n| Long labels | Allow wrapping or a complete accessible name instead of making anchors unreadably narrow. |\n\n<a id=\"anchor-variants\"></a>\n\n## Flat and hierarchical contents\n\nA flat contents list suits peer sections; a hierarchical list reflects actual heading levels. A position indicator can reinforce the current section but is optional. Keep every label tied to a real heading and use anchors only for the current page, not for a sequence of business states.\n\n<a id=\"anchor-placement\"></a>\n\n## Placement, overflow and sticky offset\n\nPlace the contents where it does not squeeze the reading column; when a primary sidebar already exists, a separate right-hand contents list may be clearer. Long lists scroll within the available height and long labels expose their complete meaning. Account for the fixed header when navigating to a section.\n\n<a id=\"anchor-step-comparison\"></a>\n\n## Anchors and steps\n\nScrolling a document changes the reading location, not task completion. Use a stepper for a guided sequential form and a timeline for historical events. On narrow screens, place the contents behind an explicit trigger while preserving the same section deep links.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDirect hash links and browser back/forward should reach the intended section after content loads. Do not move keyboard focus merely because the reader scrolls; an explicit anchor activation can focus the target heading where needed.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Open a deep hash URL and check heading visibility after a page refresh.\n2. Test the narrow-screen contents panel, close action and focus restoration.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:5c3678f77790351c7fe4de2fde9d26f830a80a83574870c197bead70bf590874"},{"id":"design-breadcrumb","group":"guide","category":"Application design","title":"Breadcrumbs","summary":"Show a resource's position in a stable hierarchy.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-breadcrumb?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"breadcrumb-parts","title":"Labels, separators and current position"},{"id":"breadcrumb-collapse","title":"Collapsing middle ancestors"},{"id":"breadcrumb-contexts","title":"Page and contained hierarchy"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Breadcrumbs\n\nShow a resource's position in a stable hierarchy.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse breadcrumbs where users enter a nested resource from search or a deep link and need its parents. Do not use them as browser history or as a replacement for primary navigation. Keep application and space context explicit when parent links cross a resource boundary.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-breadcrumb](https://open.limeai.run/docs/design-breadcrumb?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Parents | Use concise real hierarchy labels and valid links; never synthesize a parent the user cannot access. |\n| Current item | Mark the current page semantically and avoid an unnecessary self-link. |\n| Overflow | Collapse middle ancestors into an accessible menu while preserving a useful parent and current item. |\n\n<a id=\"breadcrumb-parts\"></a>\n\n## Labels, separators and current position\n\nEach segment names a real parent or the current resource. Separators communicate containment and remain decorative to assistive technology. Use a labelled breadcrumb navigation region and mark the current page; do not build the trail from the user's browsing history.\n\n<a id=\"breadcrumb-collapse\"></a>\n\n## Collapsing middle ancestors\n\nPreserve the current item and a useful root or immediate parent when width is constrained. Collapse middle ancestors into an accessible overflow control whose items keep their original order. Long names in the revealed list may wrap; do not make hover the only way to navigate a hidden parent.\n\n<a id=\"breadcrumb-contexts\"></a>\n\n## Page and contained hierarchy\n\nA page breadcrumb uses the page's resource hierarchy, while one inside a transfer or tree-selection panel uses that panel's navigation context. Keep each path within the authorized resource set and prevent a parent link from crossing to another space without a deliberate context change.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nBreadcrumb navigation must not discard an uncertain write or auto-submit saved changes. On parent navigation, preserve only safe filters/context. An inaccessible ancestor can be labelled without exposing its private title or creating a broken control.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check deep hierarchy, long translated names and keyboard navigation in the overflow menu.\n2. Open a direct child URL under both eligible and denied accounts.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:65de71752b70711e2b1c7c668d3fc399be22f12f5b884ebe1c335e954fcdf226"},{"id":"design-dropdown","group":"guide","category":"Application design","title":"Dropdown menus","summary":"Group related actions in a predictable, keyboard-accessible menu.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-dropdown?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"menu-variants","title":"Menu anatomy and variants"},{"id":"menu-dimensions","title":"Width, height and dynamic content"},{"id":"menu-placement","title":"Placement and collision handling"},{"id":"menu-input","title":"Pointer, keyboard and touch behavior"},{"id":"menu-comparison","title":"Menu, select, cascader and popover"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Dropdown menus\n\nGroup related actions in a predictable, keyboard-accessible menu.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nA dropdown contains commands or navigation related to its trigger; a select chooses a form value and a popover holds richer content. Use click/tap to open action menus. Prefer a direct visible action when the task has one obvious frequent command.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-dropdown](https://open.limeai.run/docs/design-dropdown?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Trigger | Give it a name, expanded state and relation to the menu; keep its active style while open. |\n| Items | Use consistent action labels, related groups and clear destructive semantics without unrelated options. |\n| Placement | Keep the menu inside the visible viewport and avoid covering its trigger or focused target. |\n\n<a id=\"menu-variants\"></a>\n\n## Menu anatomy and variants\n\nA menu has a trigger, a content surface and action items; a submenu adds a parent item and an expansion indicator. Use a short auxiliary title only when the trigger does not explain the actions. Group related actions with separators, keep dangerous commands identifiable and avoid a deep cascade for a short command list.\n\n[design-detail-dropdown-variants](https://open.limeai.run/docs/design-dropdown?locale=en#menu-variants)\n\n<a id=\"menu-dimensions\"></a>\n\n## Width, height and dynamic content\n\nLet width accommodate the longest real action in the registered languages before truncating. Bound the surface by the available viewport and scroll its content when necessary. An async menu reserves a useful stable width while loading, then distinguishes no results from failure and retains keyboard focus as items arrive.\n\n<a id=\"menu-placement\"></a>\n\n## Placement and collision handling\n\nOpen near the trigger, normally below and aligned to its leading edge. Flip to the opposite edge or above when space is insufficient, with a visible safety gap from the viewport. Submenus stay visually attached to their parent and must be reachable without crossing a gap that closes them.\n\n[design-detail-dropdown-placement](https://open.limeai.run/docs/design-dropdown?locale=en#menu-placement)\n\n<a id=\"menu-input\"></a>\n\n## Pointer, keyboard and touch behavior\n\nProvide click and keyboard opening even if hover is offered. Keep the trigger active while the menu is open; arrows move among enabled items, Escape closes the current level and returns focus, and activating a command closes the menu when its task permits. A context menu's actions must also be available through a discoverable fixed control.\n\n<a id=\"menu-comparison\"></a>\n\n## Menu, select, cascader and popover\n\nUse a menu for commands or destinations whose execution does not turn the trigger into a selected field. Use select or cascader for a value that is shown in the field. Use a popover for richer explanatory or form content rather than disguising a form as menu items.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nSupport arrow-key movement, Enter/Space activation and Escape dismissal with focus returned to the trigger. A click outside closes only when safe. Limit nested menus; on narrow screens replace deep hover-dependent cascades with a simpler labelled surface.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test viewport edges, disabled items, focus order and an empty dynamic menu.\n2. Verify a sensitive command opens its actual review/confirmation flow and executes once.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:22c5865a93e125e098d9680842df9bb112d486a85cd84a6e1489148f838fa923"},{"id":"design-navigation","group":"guide","category":"Application design","title":"Navigation menus","summary":"Organize destinations by user task and keep location visible.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-navigation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"navigation-regions","title":"Top and side navigation regions"},{"id":"navigation-hierarchy","title":"Hierarchy, expansion and related actions"},{"id":"navigation-adaptation","title":"Collapsed navigation and long labels"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Navigation menus\n\nOrganize destinations by user task and keep location visible.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nTop navigation connects major product areas; side navigation organizes the current area. A tree suits genuine nested content such as documentation. Use stable labels and groups instead of mirroring source-code modules or backend tables.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-navigation-menu](https://open.limeai.run/docs/design-navigation?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Selected route | Reflect the actual location, including deep links, with visible and semantic current state. |\n| Disclosure | Separate opening a group from visiting a destination when the node supports both. |\n| Responsive | Keep a named mobile navigation trigger and restore focus when the panel closes. |\n\n<a id=\"navigation-regions\"></a>\n\n## Top and side navigation regions\n\nTop navigation combines the brand/home link, global destinations and account or search controls. Side navigation organizes local destinations, with optional expand/collapse controls. Keep the active route visible and distinguish navigation from nearby object actions.\n\n<a id=\"navigation-hierarchy\"></a>\n\n## Hierarchy, expansion and related actions\n\nIndent real child routes consistently and expose expansion independently of selecting a destination. A tree navigation is appropriate only when the content has that hierarchy. Give each row action its own target and accessible name so it does not accidentally trigger navigation or collapse its parent.\n\n<a id=\"navigation-adaptation\"></a>\n\n## Collapsed navigation and long labels\n\nWhen collapsing a sidebar, preserve the selected context, accessible labels and a keyboard path to child destinations. Long translations may wrap or reveal a complete label. Use the shared Lime shell dimensions where applicable; the source's host-specific widths do not replace the current 64px header and 270px sidebar contract.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDo not navigate on hover or automatically change application context when expanding a category. A hidden item is not authorization: backend checks apply to direct URLs. Preserve a sensible destination after role removal without leaking a denied page's data.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test direct deep links, browser back/forward and permission changes with nested groups.\n2. Verify long translations and keyboard traversal after opening mobile navigation.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:f726cc51f404815b06f860134ff850ec20fff95739e8ae95448b91c487fb7eb2"},{"id":"design-pagination","group":"guide","category":"Application design","title":"Pagination controls","summary":"Make list navigation match the actual cursor or page contract.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-pagination?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"pagination-parts","title":"Pagination structure and variants"},{"id":"pagination-state","title":"Boundaries and changing queries"},{"id":"pagination-adaptation","title":"Narrow-screen controls and selection"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Pagination controls\n\nMake list navigation match the actual cursor or page contract.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse pagination when a bounded list is easier to scan than continuous loading. Page-number controls are appropriate only when the API supplies that model. Lime cursor lists normally provide next_cursor, so use next/load-more and a stored local cursor stack where needed.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-pagination](https://open.limeai.run/docs/design-pagination?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Controls | Disable unavailable directions and name the destination; do not fabricate a last page or total. |\n| Filters | Reset navigation when the filter, sort, space, application or environment changes. |\n| Feedback | Preserve rows or show a stable loading region, with errors tied to the requested page. |\n\n<a id=\"pagination-parts\"></a>\n\n## Pagination structure and variants\n\nA full pagination control may show the current page, previous/next actions, a page-size choice and a total when the API provides them. A compact control reduces secondary choices while keeping the current position understandable. Do not invent a total or last page for a cursor-only response.\n\n<a id=\"pagination-state\"></a>\n\n## Boundaries and changing queries\n\nDisable unavailable previous/next actions and announce the newly loaded range. Reset the cursor when filters, sort, space or application changes, and keep it bound to the same query. A failed next-page request preserves the current rows and offers a retry of that page.\n\n![Compact numeric pagination and annotated click targets.](https://open.limeai.run/docs/assets/design/source-0042-009.png)\n\n<a id=\"pagination-adaptation\"></a>\n\n## Narrow-screen controls and selection\n\nKeep essential next/previous controls large enough for touch and move optional page-size settings out of the main row when necessary. State whether selected records survive a page change, and distinguish selecting visible rows from selecting every server result.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep focus near the list heading after explicit navigation and announce the new result range where known. Do not show stale rows under a new filter label. A list fetch failure should offer retry without moving to a different cursor.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test first/last cursor, empty results, cursor expiry and filtering while a request is pending.\n2. Check button targets, translated labels and browser navigation on a narrow screen.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:e455847259bf552d09f977bbd91892ff6eee7a5255551b53c0eb62735c578d39"},{"id":"design-scrollbar","group":"guide","category":"Application design","title":"Scrolling and scrollbars","summary":"Make overflow discoverable and preserve native scrolling behavior.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-scrollbar?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"scrollbar-parts","title":"Viewport, track and thumb"},{"id":"scrollbar-position","title":"Placement, contrast and overlapping targets"},{"id":"scrollbar-behavior","title":"Scroll methods and dynamic content"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Scrolling and scrollbars\n\nMake overflow discoverable and preserve native scrolling behavior.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nPrefer one main vertical reading surface. Scoped overflow is appropriate for a wide table, code sample or bounded dialog content. Do not create an invisible scrolling area merely to preserve a fixed decorative layout.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-scroll-bar](https://open.limeai.run/docs/design-scrollbar?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Visibility | Respect operating-system scrollbar settings and keep overflow discoverable without pointer hover. |\n| Focus | Focusable scroll regions need a useful name and visible focus when not otherwise keyboard reachable. |\n| Position | Keep sticky content and scroll margins from covering targets or the final action. |\n\n<a id=\"scrollbar-parts\"></a>\n\n## Viewport, track and thumb\n\nThe viewport is the visible region, the track shows the scrollable path, and the thumb represents the visible proportion. Show no scroll affordance when nothing can scroll. Native scrollbars preserve platform preferences and keyboard behavior; avoid replacing them solely to make the track invisible.\n\n![Numbered anatomy of a scrollbar beside a neutral list skeleton.](https://open.limeai.run/docs/assets/design/source-0043-011.png)\n\n<a id=\"scrollbar-position\"></a>\n\n## Placement, contrast and overlapping targets\n\nPlace the vertical scrollbar at the region edge and the horizontal scrollbar where it remains reachable. Keep the two tracks from crossing and prevent resize handles or row actions from sharing the same hit area. A scrollbar over a colored surface still needs enough contrast in normal, hover and pressed states.\n\n![Scrollable neutral table regions identified with A, B and C.](https://open.limeai.run/docs/assets/design/source-0043-017.png)\n\n![Separated horizontal and vertical scroll tracks near a corner.](https://open.limeai.run/docs/assets/design/source-0043-018.png)\n\n![Horizontal and vertical scroll tracks meeting at a corner.](https://open.limeai.run/docs/assets/design/source-0043-019.png)\n\n<a id=\"scrollbar-behavior\"></a>\n\n## Scroll methods and dynamic content\n\nSupport wheel, touch, trackpad and keyboard scrolling where the region is focused. Preserve the reader's position when more content is appended. If drawing a custom thumb is necessary, derive its proportion from viewport/content size and its position from the remaining scroll range, accounting for its minimum target size.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nSupport wheel, touch, keyboard and native assistive behavior without intercepting every scroll event. Avoid scroll traps between a modal and the page. Preserve a user's reading position on a local expansion, while a new resource may intentionally reset it.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Reach the last row/action using keyboard and touch in nested dialog/table scenarios.\n2. Check native overlay scrollbars, increased text size and no page-wide horizontal overflow.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:4963fbcc2731d6a416d880c43499fc6fc5e15ac3db50f14dec862dfa897b3d6a"},{"id":"design-steps","group":"guide","category":"Application design","title":"Steps","summary":"Show a sequential task without confusing history, validation and completion.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-steps?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"steps-variants","title":"Horizontal, vertical and compact steps"},{"id":"steps-transitions","title":"Moving between steps and validation"},{"id":"steps-timeline","title":"Layout and timeline distinction"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Steps\n\nShow a sequential task without confusing history, validation and completion.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse steps for a short ordered process with a meaningful current stage. Use a timeline for historical events and anchors for sections. A review/publication sequence must distinguish submitted, approved and published rather than showing all as a single completed state.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-steps](https://open.limeai.run/docs/design-steps?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Stages | Use short localized action/result labels and expose the current step semantically. |\n| Navigation | Only completed/editable stages are interactive; do not make decorative steps look like links. |\n| States | Distinguish pending, current, confirmed complete and failed/blocked with text and shape. |\n\n<a id=\"steps-variants\"></a>\n\n## Horizontal, vertical and compact steps\n\nEach step contains a node, a concise task title, an optional description and a connection to its neighbors. Choose a horizontal arrangement for a short wide process, a vertical one for narrow or descriptive content, and a compact form when the process remains understandable without large nodes.\n\n<a id=\"steps-transitions\"></a>\n\n## Moving between steps and validation\n\nA Next action validates the current required input before advancing. Back preserves valid input. Clicking a node is navigation only when the product supports it; it must not mark an unperformed approval or payment as complete. Show pending, current, completed and failed states from confirmed task facts.\n\n<a id=\"steps-timeline\"></a>\n\n## Layout and timeline distinction\n\nKeep node areas aligned, allow descriptive text to grow and collapse the arrangement before titles become unreadable. A stepper guides a task; a timeline recounts past events with timestamps. Do not force many historical changes into a seven-step wizard.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nMoving forward requires actual validation, and moving back must preserve safe field values. Unknown submission results stay in a recoverable current state instead of advancing optimistically. On narrow screens use a vertical or compact representation without omitting the stage name.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test validation failure, cancellation, returning to a prior stage and restoring a direct bookmarked stage.\n2. Check long labels and ensure a stage change does not execute a business write automatically.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:8777808690c5ed78db15b110a8924526688da7411a285fd1705ed71c7d835e1c"},{"id":"design-buttons","group":"guide","category":"Application design","title":"Buttons","summary":"Choose an action hierarchy and button form that matches its effect.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-buttons?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"button-family","title":"Button families and semantics"},{"id":"button-state-model","title":"Interaction states and toggle behavior"},{"id":"button-copy-overflow","title":"Copy, icons and crowded action groups"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Buttons\n\nChoose an action hierarchy and button form that matches its effect.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nButtons execute a command; links navigate. Use one primary action within a task region, with secondary or quiet actions for alternatives. A save action must not look identical to a destructive revoke or a navigation link.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-button-overview](https://open.limeai.run/docs/design-buttons?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Label | Use a short verb plus object where needed: Save changes, Create release, Revoke access. Avoid vague OK on sensitive actions. |\n| State | Provide default, hover, focus, disabled and pending states through the shared Button implementation. |\n| Layout | Keep related actions together and shorten meaningful text before truncation; do not pack a row with equal primary actions. |\n\n<a id=\"button-family\"></a>\n\n## Button families and semantics\n\nBasic, text and icon buttons execute commands; links navigate. Split and menu buttons group related alternatives, while a toggle changes an exposed selected state. Floating and full-round forms have limited placement or marketing roles and do not replace ordinary task buttons.\n\n![Icon button examples for search, edit, and settings.](https://open.limeai.run/docs/assets/design/source-0045-004.png)\n\n![List skeleton with floating add and expand controls.](https://open.limeai.run/docs/assets/design/source-0045-005.png)\n\n<a id=\"button-state-model\"></a>\n\n## Interaction states and toggle behavior\n\nProvide default, hover, pressed, focus-visible, disabled and pending states. Distinguish a temporary pressed state from a persistent selected toggle and expose aria-pressed or expanded where appropriate. Activating a pending command must not submit another intent.\n\n<a id=\"button-copy-overflow\"></a>\n\n## Copy, icons and crowded action groups\n\nKeep Create, Add, Save and Publish distinct according to their actual result. Use recognizable leading icons, trailing menu indicators or an external-link symbol only when the meaning requires them. For long translations, shorten meaningful copy, wrap the button group or move secondary actions into More before truncating essential labels.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nUse type=button except for the intended form submit. A pending write disables duplicate submission, while its original command remains recoverable. Show why a necessary action is unavailable instead of leaving an unexplained disabled control.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Activate with keyboard and verify one command is sent under repeated clicks.\n2. Check long translations, focus visibility and denied/pending outcomes.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:d1c80996a9b421a127a2868448973f052fc441bc1cf345be970970d60fdfb90d"},{"id":"design-button-basic","group":"guide","category":"Application design","title":"Basic buttons","summary":"Use the shared primary, secondary and quiet action styles consistently.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-basic?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"button-variants","title":"Action hierarchy and variants"},{"id":"button-size","title":"Size and spacing"},{"id":"button-group","title":"Button groups and full-width actions"},{"id":"button-label-icon","title":"Labels and icon placement"},{"id":"button-surfaces","title":"State, surface and contrast"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Basic buttons\n\nUse the shared primary, secondary and quiet action styles consistently.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a filled primary button for the main task, a secondary control for a peer alternative and a quiet button for low-priority commands. A successful operation is reported in its result state; a green action button should not imply that a future request is already successful.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-button_basic](https://open.limeai.run/docs/design-button-basic?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Dimensions | Use shared 32px compact or 36px comfortable control tokens where applicable, with a consistent group height. |\n| Icon | Use an established leading action icon only when it adds meaning; retain a readable label. |\n| Width | Content width is normal; full-width actions suit a narrow focused form, not every desktop toolbar. |\n\n<a id=\"button-variants\"></a>\n\n## Action hierarchy and variants\n\nChoose the visual emphasis from the task's priority and consequence. Use one primary action in a task region, secondary buttons for alternatives and a danger treatment for a destructive command. A destructive confirmation names the exact action and object; it does not use a vague positive label.\n\nThe shared Button currently exposes primary, secondary, text and danger variants. The reference's additional visual combinations explain hierarchy; they are not extra exported Lime variant names.\n\n[design-detail-button-basic-variants](https://open.limeai.run/docs/design-button-basic?locale=en#button-variants)\n\n<a id=\"button-size\"></a>\n\n## Size and spacing\n\nUse the shared 32px control height for compact management actions and the 36px comfortable token when the task needs it. Keep neighboring controls optically aligned and provide a comfortable touch target. Special authentication or promotional sizes follow the existing page contract rather than adding ad hoc button heights.\n\n<a id=\"button-group\"></a>\n\n## Button groups and full-width actions\n\nKeep one primary button and a consistent secondary style in the same group. Flatten unnecessary visual levels before introducing a third style. A full-width button can emphasize a focused mobile or card task, but its width must not change which action is primary or push recovery out of view.\n\n[design-detail-button-basic-group](https://open.limeai.run/docs/design-button-basic?locale=en#button-group)\n\n<a id=\"button-label-icon\"></a>\n\n## Labels and icon placement\n\nUse a short, consistent verb and object. A leading icon may clarify a recognizable action; a trailing arrow indicates a menu where that pattern applies. Keep icon use consistent across a group and provide an accessible full name for an icon-only adaptation. Do not wrap an action into an ambiguous two-line fragment.\n\n<a id=\"button-surfaces\"></a>\n\n## State, surface and contrast\n\nKeep focus, disabled and pending states distinguishable. A quiet secondary button still needs a visible boundary or interaction affordance on the actual background; a button over content needs an opaque surface. Do not turn approval into a success fact by coloring its button green before the server confirms it.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep the primary task in a stable location while validation messages appear. Do not replace a failed Save with a different command under the same label. Sensitive commands still need their actual authorization, review and confirmation flow.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check single/paired actions, a long translated label and button alignment with inputs.\n2. Verify submitting, error and retry states keep the same intended command.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:49c25f2d71e8f9145a89a54c1f465f5599c776298fa7822b9e35fd1dd1e2e97d"},{"id":"design-button-split","group":"guide","category":"Application design","title":"Split and menu buttons","summary":"Separate a stable primary command from closely related alternatives.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-split?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"split-anatomy","title":"Separate action and menu targets"},{"id":"split-menu-content","title":"Related alternatives and stable main action"},{"id":"split-adaptation","title":"Long labels and touch alternatives"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Split and menu buttons\n\nSeparate a stable primary command from closely related alternatives.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a split button when one common action remains primary and a small set of related alternatives belongs in a menu. A menu button has no separate primary action. A popover containing a form is not a dropdown action menu and should not use misleading split-button affordances.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-button_splitbutton_menu](https://open.limeai.run/docs/design-button-split?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Hit regions | Keep the primary and menu trigger separate with a clear divider and independent accessible names. |\n| Items | Do not repeat the main command in the menu or replace its label after choosing an unrelated option. |\n| Touch | On narrow touch layouts use a normal primary button and a separate More action instead of a tiny split target. |\n\n<a id=\"split-anatomy\"></a>\n\n## Separate action and menu targets\n\nA split button has one stable primary command and a separate menu trigger with a visible division. A menu button has one target that opens alternatives. Do not use a dropdown arrow to open an unrelated rich popover, and give both split targets an independent accessible name.\n\n<a id=\"split-menu-content\"></a>\n\n## Related alternatives and stable main action\n\nThe menu contains related commands at a similar level and does not repeat the primary action. Selecting an alternative normally executes that command without renaming the main action. Keep the open menu's placement and focus behavior consistent with the dropdown guide.\n\n<a id=\"split-adaptation\"></a>\n\n## Long labels and touch alternatives\n\nShorten the label before truncating or wrapping it, and avoid full-width split layouts unless the task requires them. On a phone, replace the narrow split target with a separate, comfortably sized More button or action list while preserving the same primary command.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nClick opens the menu; it must not execute the primary command. Keep trigger focus and expanded state consistent. Menu alternatives use the same permission and unknown-result recovery rules as visible actions.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Verify both hit regions with pointer, keyboard and touch without accidental primary submission.\n2. Check edge placement and collapse to separate controls on narrow screens.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:7421a8bd5f16b75c2ef5a0f5b6daea58f0542cea27ba5c919ed91f9a259cd980"},{"id":"design-button-text","group":"guide","category":"Application design","title":"Text buttons","summary":"Keep secondary commands visually quiet without losing their interactive meaning.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-text?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"text-button-link","title":"Text command and navigation link"},{"id":"text-button-alignment","title":"Visible text and transparent padding"},{"id":"text-button-contrast","title":"Long labels and contrasting surfaces"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Text buttons\n\nKeep secondary commands visually quiet without losing their interactive meaning.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a text button for a low-priority command in a toolbar, row or dialog. Use a real link when navigating to a page or resource, including inline documentation references. Do not make a destructive command look like harmless body text.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-button_text](https://open.limeai.run/docs/design-button-text?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Alignment | Align the text optically with its context while preserving a usable hit area and visible focus. |\n| Label | Keep action labels short, complete and consistent; avoid wrapping a short toolbar command into several lines. |\n| Semantics | Use button for commands and anchor with a real href for navigation. |\n\n<a id=\"text-button-link\"></a>\n\n## Text command and navigation link\n\nUse a real button for a quiet command and a real link for navigation, even when both appear as text. Inline navigation follows the sentence's reading flow; an independent action keeps a sufficient hit area. An external destination may use a trailing indicator when it helps set the opening expectation.\n\n<a id=\"text-button-alignment\"></a>\n\n## Visible text and transparent padding\n\nAlign a standalone text button by its intentional interaction container; in a dense list, align its visible label with neighboring text. Account for transparent padding when spacing multiple text buttons so apparent gaps stay consistent in normal and hover states.\n\n<a id=\"text-button-contrast\"></a>\n\n## Long labels and contrasting surfaces\n\nKeep command labels short and complete; prose links may wrap naturally. On a dark tooltip or contrasting surface, choose the matching semantic text color rather than assuming the normal link color remains readable. A tooltip does not turn an otherwise inaccessible command into an accessible one.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nHover feedback is supplemental; keyboard focus must be equally clear. Do not rely on underlining only after hover to reveal an action. A quiet command still needs a pending/disabled state if it can be submitted more than once.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check inline links and standalone commands with a screen reader and keyboard.\n2. Verify long translations do not overlap adjacent row content.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:97a87e2b2727d75f4f136104a2d28aef5c2785b68ca3fe8436cea3893a2b0f3d"},{"id":"design-button-floating","group":"guide","category":"Application design","title":"Floating buttons","summary":"Offer a persistent contextual action without covering the user's work.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-floating?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"floating-purpose","title":"Primary action and navigation shortcut"},{"id":"floating-placement","title":"Position and multiple controls"},{"id":"floating-menu-label","title":"Menu behavior and readable labels"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Floating buttons\n\nOffer a persistent contextual action without covering the user's work.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a floating action only when it remains useful across a long surface, such as returning to the top. Most management commands belong beside their object or in the page action area. Floating controls must not compete with purchase, consent or form submission.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-button_float](https://open.limeai.run/docs/design-button-floating?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Placement | Place within a safe visible margin and avoid fixed chat/support, mobile navigation and software-keyboard regions. |\n| Meaning | Use a clear named action, with icon and accessible text; do not infer a global command from decoration. |\n| Menu | If it opens alternatives, expose expanded state and use a stable dismissal/focus model. |\n\n<a id=\"floating-purpose\"></a>\n\n## Primary action and navigation shortcut\n\nUse a floating action only for a task that benefits from staying reachable while content scrolls, such as a deliberate create action or return-to-top shortcut. A floating button is defined by placement and layering, while a full-round marketing button remains in ordinary content flow.\n\n![Floating add action over a neutral content skeleton.](https://open.limeai.run/docs/assets/design/source-0049-002.png)\n\n![Circular primary floating action with an add icon.](https://open.limeai.run/docs/assets/design/source-0049-004.png)\n\n![Floating return-to-top control beside content placeholders.](https://open.limeai.run/docs/assets/design/source-0049-005.png)\n\n<a id=\"floating-placement\"></a>\n\n## Position and multiple controls\n\nReserve a stable corner with safe gaps from the viewport, scrollbar and sticky footer. Stack multiple shortcuts in a predictable order and prevent them from covering the last row, primary submit or focused field. Recalculate against the visible viewport when the software keyboard opens.\n\n![Spacing between stacked floating support controls.](https://open.limeai.run/docs/assets/design/source-0049-012.png)\n\n<a id=\"floating-menu-label\"></a>\n\n## Menu behavior and readable labels\n\nA recognizable icon needs a localized accessible name and optional tooltip; an unfamiliar action needs visible text. Click opens a grouped action menu, while hover only explains it. Keep the shape stable around text and do not add chat-host message behavior to a normal Lime document page.\n\n![Hovered floating control and an adjacent support icon.](https://open.limeai.run/docs/assets/design/source-0049-014.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nShow a return-to-top action only when useful, without moving content when it appears. Respect reduced motion for scrolling. Keep any destructive or commercial command in a reviewable task context rather than a generic floating glyph.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check narrow screens, dialogs and open software keyboards for overlap.\n2. Test keyboard focus and reduced-motion scrolling.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:25c88fc9bd22912d69b18c8f9bcf64a7717a272ce0af040f8d3bfb9822f8b4e6"},{"id":"design-button-icon","group":"guide","category":"Application design","title":"Icon buttons","summary":"Make compact actions understandable without depending on a tooltip.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-icon?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"icon-button-name","title":"Recognizable symbols and names"},{"id":"icon-button-target","title":"Target size, spacing and grouping"},{"id":"icon-button-expanded","title":"Open menus and selected states"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Icon buttons\n\nMake compact actions understandable without depending on a tooltip.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse an icon button for a familiar, repeated compact action such as Close, Copy or More. Prefer text when the effect is uncommon, sensitive or ambiguous. Keep symbol style and target size consistent in a row or toolbar.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-button_icon](https://open.limeai.run/docs/design-button-icon?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Name | Provide a localized accessible name; the visual glyph is hidden from redundant reading. |\n| Target | The interactive region is larger than the glyph and remains visible on focus. |\n| Toggle/menu | Expose pressed or expanded state when the command has that behavior. |\n\n<a id=\"icon-button-name\"></a>\n\n## Recognizable symbols and names\n\nChoose a familiar command symbol and keep the same icon family within a toolbar. Every icon-only button has an accessible localized name; provide a visible label when the symbol is unclear. A decorative status icon is not a button.\n\n![A group of related icon buttons.](https://open.limeai.run/docs/assets/design/source-0050-010.png)\n\n<a id=\"icon-button-target\"></a>\n\n## Target size, spacing and grouping\n\nThe visible glyph may be small while the interaction target remains comfortably sized. Align it with adjacent controls and avoid shrinking targets to fit another command. A special outlined Add control beside avatars should follow the avatar size and keep its command name explicit.\n\n<a id=\"icon-button-expanded\"></a>\n\n## Open menus and selected states\n\nKeep a More trigger visibly active while its menu is open, even after the pointer leaves. Expose expanded state and the controlled menu, close with Escape and restore focus. A persistent toggle uses a selected state distinct from the temporary pressed state.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep a More trigger active while its menu is open. A Copy success message should be brief and confirmed by the actual clipboard result; a failed copy needs an alternative. Do not remove focused row actions as soon as the pointer leaves.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Inspect screen-reader names and keyboard traversal with no pointer hover.\n2. Check Close, More and destructive actions remain distinguishable at high zoom.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:52206834539f7e0b75e7e4ca85c5856b5768af93019eba18433c267f5b52db68"},{"id":"design-button-round","group":"guide","category":"Application design","title":"Fully rounded buttons","summary":"Use rounded actions deliberately without changing the shared management baseline.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-round?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"round-scope","title":"Marketing scope and ordinary commands"},{"id":"round-anatomy","title":"Shape and shared interaction"},{"id":"round-comparison","title":"Round, basic and floating buttons"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Fully rounded buttons\n\nUse rounded actions deliberately without changing the shared management baseline.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nA fully rounded button can suit a compact public discovery or promotional context. Ordinary forms and application management keep the standard shared control radius. Shape is visual treatment, not a new action priority or permission state.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-button_round](https://open.limeai.run/docs/design-button-round?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Consistency | Use one shape rule within an action group; do not mix pill and standard buttons without a contextual reason. |\n| Content | Keep a readable short label and the same shared height, spacing and focus requirements. |\n\n<a id=\"round-scope\"></a>\n\n## Marketing scope and ordinary commands\n\nA full-round button is reserved for an adopted promotional, product-site or content-marketing surface. Ordinary application configuration, authentication, checkout and recovery keep the established basic button form. Rounded shape alone must not imply a different permission or commercial promise.\n\n<a id=\"round-anatomy\"></a>\n\n## Shape and shared interaction\n\nThe round form changes the container shape, while the label, emphasis, focus, disabled and pending behavior follow the basic button pattern. Keep enough horizontal room for translated text and preserve the same accessible name and command semantics.\n\n<a id=\"round-comparison\"></a>\n\n## Round, basic and floating buttons\n\nChoose basic buttons for normal workflows and floating controls for a deliberate persistent location. A marketing button can be round without floating, and a floating shortcut does not become a marketing action. Maintain the same family through one user journey rather than switching shape at each screen.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDo not restyle tags or filters as rounded buttons unless they execute commands. A selected filter needs its own selection semantics. Pending and disabled behavior remains the same as a basic button.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check shape consistency, long translations and visible keyboard focus.\n2. Verify shape does not become the only distinction between a filter and an action.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:d6316f1f5cb1dc41d9690c19827c88a53bced7d9ebab59bdde054f42a70f068a"},{"id":"design-cascader","group":"guide","category":"Application design","title":"Cascading selection","summary":"Choose a value from a real hierarchy with a visible selection path.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-cascader?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"cascader-selection-modes","title":"Leaf and any-level selection"},{"id":"cascader-columns","title":"Columns, placement and deep trees"},{"id":"cascader-selected-path","title":"Selected path and clearing"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Cascading selection\n\nChoose a value from a real hierarchy with a visible selection path.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse cascading selection for a modest, known hierarchy where the path helps distinguish values. Flat options use a select; a large asynchronous tree may need a dedicated tree selector. Do not model user/space permission as a hierarchy unless the resource contract defines it.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-cascader](https://open.limeai.run/docs/design-cascader?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Selection | Define leaf-only or any-level selection and single/multiple modes before showing checkboxes. |\n| Path | Show enough ancestors to disambiguate equal names and store stable IDs rather than labels. |\n| Loading | Child loading, empty branches and failed branches are separate states. |\n\n<a id=\"cascader-selection-modes\"></a>\n\n## Leaf and any-level selection\n\nDeclare whether only leaves or any level can be selected, and whether selection is single or multiple. Keep expansion separate from selecting a value. Parent selection includes descendants only when the data contract defines that relationship; a parent resource does not automatically grant child permissions.\n\n<a id=\"cascader-columns\"></a>\n\n## Columns, placement and deep trees\n\nKeep each hierarchy column independently scrollable and wide enough for real labels. Place the panel within the viewport and flip or shift it when child columns would overflow. A deep or dynamically loaded hierarchy may be easier to use with a tree selector than many horizontal columns.\n\n<a id=\"cascader-selected-path\"></a>\n\n## Selected path and clearing\n\nShow the leaf label or full ancestor path according to the disambiguation needed, and keep a complete accessible value. In multiple selection, give each removal control an explicit target name. Clearing changes the field value; it must not immediately revoke a real installation or membership unless this is the declared committed action.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nExpanding a parent must not accidentally select it. Keep selected paths visible when a panel is reopened, and support keyboard movement/collapse. On narrow screens prefer a stacked drill-down panel instead of several columns overflowing the viewport.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test duplicate names, disabled branches and deleted selected values.\n2. Verify leaf-only and any-level modes do not imply different authorization.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:741e765e277d0f379933c685c4fc2559c665ee59c9ddb5fa3d82347ec3f70870"},{"id":"design-checkbox","group":"guide","category":"Application design","title":"Checkboxes","summary":"Select independent values and make partial selection explicit.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-checkbox?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"checkbox-group","title":"Independent choices and group labels"},{"id":"checkbox-mixed","title":"Unchecked, checked and mixed states"},{"id":"checkbox-target-layout","title":"Hit area and multiline descriptions"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Checkboxes\n\nSelect independent values and make partial selection explicit.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse checkboxes for zero or more independent selections, or for a clearly worded acknowledgement. A single mutually exclusive choice uses radios. Consent to unrelated policies must not be preselected or bundled into one checkbox.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-checkbox](https://open.limeai.run/docs/design-checkbox?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Label | Associate the full visible label with its input and make the label a usable click target. |\n| Select all | Expose mixed state and define whether it affects the current page or all filtered results. |\n| Disabled | Explain required eligibility without treating disabled options as granted permissions. |\n\n<a id=\"checkbox-group\"></a>\n\n## Independent choices and group labels\n\nUse checkboxes when zero, one or several independent choices are valid. Name the group and associate each control with its description. A checkbox normally records draft intent for later submission; use an immediate switch only when changing the setting takes effect at once.\n\n<a id=\"checkbox-mixed\"></a>\n\n## Unchecked, checked and mixed states\n\nA parent checkbox may show mixed state when only some relevant children are selected. Define the next click's behavior and the exact select-all scope. Searching or pagination must not silently change that scope or imply selection of records that were never loaded or authorized.\n\n![Checkbox states for normal, hover, pressed, focus, disabled, and error.](https://open.limeai.run/docs/assets/design/source-0053-005.png)\n\n<a id=\"checkbox-target-layout\"></a>\n\n## Hit area and multiline descriptions\n\nMake the checkbox and its label one meaningful activation region, while links or other nested actions retain separate targets. Prefer vertical options for long text, align the box with the first text line and allow the description to grow. A small visible box must not force a small touch target.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nSpace toggles the focused checkbox. Keep selection stable while rows refresh, but remove or mark resources that are no longer authorized. A bulk operation still checks every selected resource on the backend.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test unchecked, checked, mixed, disabled and long-label states by keyboard.\n2. Verify select-all behavior across filtering and cursor pagination.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:f51b3a86830e1059f95ad09b10191e76575d05002927af20af9c56cfa56bc5a3"},{"id":"design-color-picker","group":"guide","category":"Application design","title":"Color picker","summary":"Select an approved visual value without bypassing semantic theme rules.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-color-picker?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"color-picker-types","title":"Limited palette and custom color"},{"id":"color-picker-state","title":"Current color and accessible selection"},{"id":"color-picker-commit","title":"Commit, cancel and no-color behavior"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Color picker\n\nSelect an approved visual value without bypassing semantic theme rules.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nA color picker suits an application's own icon preset or a product-specific editable visual. Platform controls continue to use semantic tokens; arbitrary user colors must not replace warning/error semantics or the shared theme.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-color-picker](https://open.limeai.run/docs/design-color-picker?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Palette | Use the actual approved choices; show a visible selected mark as well as color. |\n| Value | If custom input is supported, declare its accepted format and validate it before preview/save. |\n| Contrast | Preview the actual foreground/background combination and use accessible names for swatches. |\n\n<a id=\"color-picker-types\"></a>\n\n## Limited palette and custom color\n\nUse a limited palette when the product intentionally allows a fixed set of choices, such as application preset backgrounds. Offer arbitrary RGB or other input only when the field contract supports it. Do not introduce custom interface theme colors through a content color picker.\n\n![Compact color palette with a selected swatch.](https://open.limeai.run/docs/assets/design/source-0054-003.png)\n\n<a id=\"color-picker-state\"></a>\n\n## Current color and accessible selection\n\nShow the current swatch with a visible selected marker and an accessible color name or value. Keyboard users can reach and select each available color. Hover is a preview, while the committed color remains clear; color alone cannot identify selected state.\n\n<a id=\"color-picker-commit\"></a>\n\n## Commit, cancel and no-color behavior\n\nState whether a swatch applies immediately or remains a draft until confirmation. Cancel restores the previous valid value. Provide a no-color option only when the field supports it, and validate manual values using the accepted format and opacity rules.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep color and glyph selection independent for application presets. Reset and cancel return to the previous saved value, while preview remains local until the real save succeeds. Never insert an untrusted color string into arbitrary CSS.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test keyboard selection, named swatches and selected state in grayscale.\n2. Verify uploaded images are not recolored by preset palette changes.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:105467c9a752ed76dd40ec92fe24d6b49d2cbbcb94e08beb161e49fccb667a91"},{"id":"design-date-picker","group":"guide","category":"Application design","title":"Date picker","summary":"Distinguish calendar dates, instants and ranges before choosing an input.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-date-picker?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"date-picker-modes","title":"Date, month, year and range"},{"id":"date-picker-panel","title":"Input, navigation and calendar states"},{"id":"date-picker-validation","title":"Input validation and confirmation"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Date picker\n\nDistinguish calendar dates, instants and ranges before choosing an input.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a date picker when choosing a date benefits from a calendar. A birth date or billing date may be a calendar value, while an event time is an instant with timezone rules. The API schema determines the stored representation, not the user's interface language.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-date-picker](https://open.limeai.run/docs/design-date-picker?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Input | Allow an explicit format and keyboard entry; distinguish an empty optional date from invalid input. |\n| Range | Label start/end and inclusivity, validate ordering and show unavailable dates with a reason. |\n| Timezone | A date-only YYYY-MM-DD is not converted through UTC as an instant. |\n\n<a id=\"date-picker-modes\"></a>\n\n## Date, month, year and range\n\nChoose the narrowest date unit the task needs. A single picker selects one value; a linked pair or range panel selects start and end. Date-plus-time selection also declares a timezone. A date-only value must not shift to the previous day when a user changes display timezone.\n\n<a id=\"date-picker-panel\"></a>\n\n## Input, navigation and calendar states\n\nThe trigger identifies the field and selected value, while the panel offers month/year navigation and selectable days. Today, selected date, range endpoints and disabled dates have distinct states. Provide keyboard navigation and accessible full-date names rather than only a day number.\n\n<a id=\"date-picker-validation\"></a>\n\n## Input validation and confirmation\n\nAccept documented date formats and validate order and bounds without silently changing a business deadline. If the panel has Confirm and Cancel, selections remain draft until confirmed and cancellation restores the prior value. Clearing is available only for an optional field; keep invalid input visible with a useful error.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nSupport month/year navigation and clear selected/today/focused states. Avoid fetching new results on every calendar movement; commit the intended value or range according to the task. Keep a typed valid value when a calendar closes.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test month/year boundaries, leap day, an inverted range and unavailable dates.\n2. Check source/translated formats and timezone changes without shifting a date-only value.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:a60a3b4a7102e8731ea7d9a0f4ad64cf91639033b9a585ddd5979b9a2d7abf75"},{"id":"design-form","group":"guide","category":"Application design","title":"Forms","summary":"Collect the smallest set of values needed for one clear task.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-form?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"form-types","title":"Basic, combined, grouped and stepped forms"},{"id":"form-label-layout","title":"Label placement and reading order"},{"id":"form-field-layout","title":"Columns, dependencies and repeated groups"},{"id":"form-validation","title":"Field and form validation"},{"id":"form-required-help","title":"Required fields and help text"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Forms\n\nCollect the smallest set of values needed for one clear task.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a form for a coherent write operation, grouping related fields with a clear submit outcome. A long task can use sections or steps, but must preserve validation and draft state. Keep ordinary application settings separate from high-impact credential, purchase or ownership actions.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-form](https://open.limeai.run/docs/design-form?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Fields | Use visible labels, explicit required/optional meaning and appropriate native input types/autocomplete. |\n| Help | Show necessary format/constraint information near the field, independent of a placeholder. |\n| Errors | Associate specific errors with fields and provide a focusable summary for multiple failures. |\n\n<a id=\"form-types\"></a>\n\n## Basic, combined, grouped and stepped forms\n\nUse a basic form for one short task, combine tightly related fields at the same semantic level, group a long form by subject, and split a linear process into steps only when the sequence helps. A final review step shows the intended values before submission. Moving between steps does not create a business record unless the contract explicitly says so.\n\n<a id=\"form-label-layout\"></a>\n\n## Label placement and reading order\n\nPrefer labels above fields for focused entry and long translations. Short horizontal filters may put right-aligned labels beside fields. Keep the label, required meaning, help and error programmatically associated with the input. A placeholder is supplemental and must not become the only label.\n\n[design-detail-form-layout](https://open.limeai.run/docs/design-form?locale=en#form-label-layout)\n\n<a id=\"form-field-layout\"></a>\n\n## Columns, dependencies and repeated groups\n\nOne column gives the clearest reading order; two columns suit related short fields when both remain wide enough. Stack on narrow screens before labels or validation become cramped. When one field changes the available values of another, preserve valid input and explicitly clear or mark an invalid dependent selection.\n\nRepeated groups need clear add/remove actions and stable identities. Keep a deletion scoped to its group and avoid reusing the previous row's error for a new row. Grid width belongs to the containing form or dialog, not automatically to the entire screen.\n\n![Single column form grid.](https://open.limeai.run/docs/assets/design/source-0056-026.png)\n\n![Two column form grid.](https://open.limeai.run/docs/assets/design/source-0056-027.png)\n\n![Three column form grid.](https://open.limeai.run/docs/assets/design/source-0056-028.png)\n\n![Four column form grid.](https://open.limeai.run/docs/assets/design/source-0056-029.png)\n\n<a id=\"form-validation\"></a>\n\n## Field and form validation\n\nValidate format and bounds close to the field, then validate cross-field and business rules on submission. Place a field error beside its input and a form-level failure above the relevant group or actions. After a failed submit, focus the error summary or first invalid field without erasing the user's values.\n\nBackend authorization and version checks remain authoritative. Keep the original request and idempotency key for an unknown write result; a new click must not silently create a new intent. Language changes may translate the error but do not reset the form or command.\n\n[design-detail-form-validation](https://open.limeai.run/docs/design-form?locale=en#form-validation)\n\n<a id=\"form-required-help\"></a>\n\n## Required fields and help text\n\nIdentify required fields with text or an accessible required state as well as the visual marker. Put essential format, permission or price constraints in persistent help near the field. Use an info tooltip only for optional explanation; users must not need hover to discover a requirement.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nValidate after a useful interaction or submit rather than rejecting every keystroke. Preserve user input after server rejection, fetch the latest revision on conflict and require deliberate resubmission. Pending/unknown writes retain the original command instead of resetting to a blank form.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test Enter submit, tab order, labels, field errors and a server rejection without data loss.\n2. Check narrow screens, long translations and software keyboard visibility of the active field/action.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:7ceef0f66e99fec6e593e57f65ed3b75fa25a8d12ff6f3e7b377c71a29701fd2"},{"id":"design-input","group":"guide","category":"Application design","title":"Input fields","summary":"Support precise entry with labels, constraints and recoverable validation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-input?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"input-tokens","title":"Tokenized input"},{"id":"input-variants","title":"Basic, numeric, attributed and combined inputs"},{"id":"input-icons-password","title":"Labels, icons and private values"},{"id":"input-state-multiline","title":"Editing states and long text"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Input fields\n\nSupport precise entry with labels, constraints and recoverable validation.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a text input for a short value, a textarea for long prose and a purpose-specific native input when appropriate. A placeholder gives an example but never replaces the label. An identifier, secret, URL and money field need different input and privacy behavior.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-input](https://open.limeai.run/docs/design-input?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Value | Keep IDs and exact money as strings; do not parse large minor-unit integers through Number. |\n| Password | Use appropriate autocomplete and a named reveal control, without logging or copying the secret automatically. |\n| Clear | An optional clear button is named and cannot silently submit or destroy unrelated fields. |\n\n<a id=\"input-tokens\"></a>\n\n## Tokenized input\n\nA tokenized input separates committed values from the text currently being edited. Define the delimiter, validation and duplicate policy explicitly, and keep invalid text editable with an associated explanation. A removable token has a named remove action; the field label, focus order and remaining text stay available after removal. Token entry does not imply that a new business object has been created.\n\n<a id=\"input-variants\"></a>\n\n## Basic, numeric, attributed and combined inputs\n\nUse plain text for general entry, a bounded numeric field for actual numbers, prefixes or suffixes for a fixed unit, and a combined group for related but separate values. Opaque identifiers, phone numbers and leading-zero codes remain strings. Money entry preserves the exact recorded scale and avoids floating-point conversion.\n\n<a id=\"input-icons-password\"></a>\n\n## Labels, icons and private values\n\nA persistent label identifies the field; the placeholder only supplies an example. Leading icons explain the input, trailing controls clear or reveal it and need their own names. Password visibility is an explicit choice, while paste and password-manager support remain usable. Never copy a private value into tooltip or analytics text.\n\n<a id=\"input-state-multiline\"></a>\n\n## Editing states and long text\n\nKeep focus, disabled, read-only and error states distinct. Use a textarea or expanding multiline input for long descriptions and a documented character limit. A segmented verification-code input supports paste, correction and accessible grouping; do not impose a host-specific deletion rule that prevents correcting one character.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDistinguish editable, read-only, disabled, error and pending states. Do not rewrite the user's value destructively on each keypress. For URLs and callbacks show exact-match constraints, including allowed scheme/host/port rules, before submission.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test paste, composition input, empty values, whitespace and maximum accepted length.\n2. Check screen-reader label/help/error association and browser autofill.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:df8fe86e3ce788f583c1771b3518c18930e6365af1f7c1a75bcc6845f0cc9f6d"},{"id":"design-radio","group":"guide","category":"Application design","title":"Radio buttons","summary":"Choose exactly one value from a small visible set.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-radio?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"radio-options","title":"Visible exclusive options"},{"id":"radio-button-form","title":"Basic and button-shaped radios"},{"id":"radio-layout","title":"Hit area, multiline labels and overflow"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Radio buttons\n\nChoose exactly one value from a small visible set.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse radios when users benefit from comparing a small set of mutually exclusive choices. A select suits a longer list; a switch applies an immediate binary setting. Do not label a group as multiple choice while allowing only one selection.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-radio](https://open.limeai.run/docs/design-radio?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Group | Use a fieldset/legend or equivalent named group with stable option values. |\n| Labels | Make labels clickable and include a short consequence/help when choices materially differ. |\n| Default | Choose a default only when valid; explicit consent or a high-impact choice must not be pre-approved. |\n\n<a id=\"radio-options\"></a>\n\n## Visible exclusive options\n\nUse radio buttons for one choice among a modest visible set so users can compare alternatives before selecting. Name the group, use stable values and declare whether an initial choice is required. For many options, a searchable select may be more practical.\n\n<a id=\"radio-button-form\"></a>\n\n## Basic and button-shaped radios\n\nThe basic form emphasizes labels; the button-shaped form emphasizes the alternatives themselves. Both retain one selected value and the same keyboard radio-group behavior. A selected-looking action button does not become a radio option unless the group semantics are actually provided.\n\n<a id=\"radio-layout\"></a>\n\n## Hit area, multiline labels and overflow\n\nAssociate the whole descriptive label with its radio. Prefer a vertical layout for long options and align the indicator to the first line. Button-shaped labels should remain concise; if truncated, expose the complete option name and ensure touch users can also discover it.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nArrow keys move within the group, and tab moves to/from the group. Selecting a form option should not unexpectedly submit or navigate. If a choice reveals fields, keep the resulting layout and focus predictable.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test no selection, default, disabled choice and long supporting text.\n2. Verify keyboard arrow behavior and that only the submitted value affects the server command.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:8f05df4313dbf6f77193cafe972f6477afdfd763e8457170521878090a8e4759"},{"id":"design-rating","group":"guide","category":"Application design","title":"Ratings","summary":"Collect subjective feedback with an explicit scale and purpose.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-rating?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"rating-types","title":"Star score and positive/negative feedback"},{"id":"rating-precision","title":"Steps, preview and confirmed score"},{"id":"rating-change-clear","title":"Changing and clearing a rating"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Ratings\n\nCollect subjective feedback with an explicit scale and purpose.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a rating when an ordinal opinion is useful, and a simple positive/negative choice when the question is binary. A rating is not an approval, security score or verified purchase fact. State what is being rated and how the feedback is used.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-rate](https://open.limeai.run/docs/design-rating?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Scale | Define minimum, maximum, step and verbal meaning; do not imply precise averages from an undefined scale. |\n| Control | Expose the selected value and labels to keyboard/screen-reader users; do not rely on filled stars only. |\n| Optional | Allow no answer and, where appropriate, a changed answer without collecting unrelated identity data. |\n\n<a id=\"rating-types\"></a>\n\n## Star score and positive/negative feedback\n\nUse a star scale when the task needs a measured score and a positive/negative choice for a quick binary reaction. State the scale and its meaning. Display-only ratings are not editable controls, and an absent rating is different from a zero score.\n\n<a id=\"rating-precision\"></a>\n\n## Steps, preview and confirmed score\n\nDeclare whole-step or half-step input and expose the exact current value to keyboard and assistive users. Hover may preview a score but must not overwrite the confirmed one until selection. Show the selected explanation after selection, with text allowed to wrap.\n\n<a id=\"rating-change-clear\"></a>\n\n## Changing and clearing a rating\n\nDefine whether selecting the same value again clears it or keeps it, and preserve the same rule across star and compact variants. A follow-up reason belongs to the user's current selection. Custom icons can change appearance but must keep an understandable scale and adequate target size.\n\n![Five-star rating showing three selected stars.](https://open.limeai.run/docs/assets/design/source-0059-011.png)\n\n![Rating scales with different maximum star counts.](https://open.limeai.run/docs/assets/design/source-0059-012.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nSeparate hover preview from committed value and actual server submission. Show a confirmed result only after acceptance. Do not repeatedly prompt a user who has dismissed the request, or automatically opt them into marketing.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test keyboard adjustment, no answer, a changed answer and failed submission.\n2. Check translated scale labels and color-independent selected state.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:11c702467ba5b6a4344c47da34a475a7458b8b940173b56becb43ad29a12a335"},{"id":"design-select","group":"guide","category":"Application design","title":"Select controls","summary":"Choose one or more stable values from a bounded option set.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-select?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"select-modes","title":"Single, multiple and complex options"},{"id":"select-search-create","title":"Search, clearing and creating options"},{"id":"select-keyboard-placement","title":"Keyboard, placement and long selections"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Select controls\n\nChoose one or more stable values from a bounded option set.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a select for a list too long for visible radios or checkboxes. Keep search, single/multiple modes and custom-value creation deliberate. A language selector reads registered locale options; a scope selector must use permitted scope identities rather than translated labels.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-select](https://open.limeai.run/docs/design-select?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Options | Store stable values and present clear labels, grouping only genuine related options. |\n| Search | Distinguish no matching result from an empty source, denied access and network failure. |\n| Multiple | Expose count/selected values and named removal controls without truncating all meaningful context. |\n\n<a id=\"select-modes\"></a>\n\n## Single, multiple and complex options\n\nA select edits a value shown in its trigger. Single selection usually closes after a choice; multiple selection keeps selected items identifiable and removable. Options may contain an avatar, description or status, but their accessible names must still identify the underlying choice.\n\n<a id=\"select-search-create\"></a>\n\n## Search, clearing and creating options\n\nKeep search text and existing selection independent. Distinguish loading, no match, denied options and failed lookup; an old response must not overwrite a newer query. Offer Create only when the user has a real authorized creation flow, and keep that write separate from choosing an existing value.\n\n<a id=\"select-keyboard-placement\"></a>\n\n## Keyboard, placement and long selections\n\nSupport arrows, Enter and Escape with an active option distinct from the selected value. Bound the popup to the viewport and flip it when needed. Let multiple selections grow within a useful limit or show a named remaining count; do not replace the complete selected meaning with an unexplained number.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nUse the native select when its interaction fits. A custom combobox needs keyboard navigation, labelled expanded state and focus management. Clear an optional value explicitly; if a saved option is no longer eligible, show the invalid state rather than silently selecting another.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test long lists, duplicate labels, asynchronous search and a removed selected option.\n2. Check keyboard selection, Escape, focus restoration and narrow-screen placement.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:d61a70e9e9b825153aabe266f0dee51d8ff9b7895dde4517f900a02f5eb60d9f"},{"id":"design-slider","group":"guide","category":"Application design","title":"Sliders","summary":"Adjust an approximate bounded value while preserving a precise accessible alternative.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-slider?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"slider-range","title":"Bounded values and range handles"},{"id":"slider-input","title":"Pointer, keyboard and exact input"},{"id":"slider-marks","title":"Vertical orientation and marks"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Sliders\n\nAdjust an approximate bounded value while preserving a precise accessible alternative.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a slider where relative adjustment is intuitive, such as a preview scale. Avoid sliders for exact prices, identifiers or security-critical configuration. For a range, distinguish both endpoints and define whether the bounds are inclusive.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-slider](https://open.limeai.run/docs/design-slider?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Scale | Expose minimum, maximum, step, current value and unit; non-linear scales require an explanation. |\n| Input | Provide keyboard adjustment and a precise numeric field when the value matters. |\n| Range | Give handles distinct names and prevent accidental crossing or ambiguous ordering. |\n\n<a id=\"slider-range\"></a>\n\n## Bounded values and range handles\n\nA slider works for approximate adjustment within a known range. A double-handle slider chooses an interval; clearly define whether handles can cross or swap roles and always expose the resulting minimum and maximum. A small list of discrete choices is clearer as radios than a slider.\n\n![Numbered slider anatomy with a numeric tooltip and scale.](https://open.limeai.run/docs/assets/design/source-0061-001.png)\n\n<a id=\"slider-input\"></a>\n\n## Pointer, keyboard and exact input\n\nDragging, clicking the track and keyboard steps must update the same value. Display the current value with its unit and provide an exact input when precision matters. A linked input and slider share bounds and step size without rounding away a precise business value.\n\n![Slider track and handle dimensions in pixels.](https://open.limeai.run/docs/assets/design/source-0061-002.png)\n\n![Slider synchronized with a numeric stepper.](https://open.limeai.run/docs/assets/design/source-0061-007.png)\n\n![Numeric and volume sliders with endpoint values.](https://open.limeai.run/docs/assets/design/source-0061-008.png)\n\n<a id=\"slider-marks\"></a>\n\n## Vertical orientation and marks\n\nUse vertical orientation only when it fits the physical or spatial model. Marks identify meaningful values and can offer direct selection; explain non-linear scales. Keep endpoints, the selected range and the focused handle distinguishable without color alone.\n\n![Vertical single-value and range sliders.](https://open.limeai.run/docs/assets/design/source-0061-005.png)\n\n![Slider tick marks with numeric spacing annotations.](https://open.limeai.run/docs/assets/design/source-0061-006.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDragging previews a value, while the actual save follows the task's explicit submission rule. Do not issue a protected write for every pointer movement. Keep focus on the active handle and support coarse/fine keyboard changes where appropriate.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test endpoints, small touch targets, keyboard steps and text value equivalents.\n2. Verify high zoom and reduced motion do not hide the current value.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:4056cfef3eac0d804b6ef058e3c4dea8ad0227061055db079eb99850b4635dbb"},{"id":"design-stepper","group":"guide","category":"Application design","title":"Numeric steppers","summary":"Adjust a bounded quantity with explicit units and exact integer rules.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-stepper?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"stepper-bounds","title":"Small bounded integer adjustments"},{"id":"stepper-editing","title":"Buttons, direct entry and limits"},{"id":"stepper-states","title":"Repeated input, focus and presentation"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Numeric steppers\n\nAdjust a bounded quantity with explicit units and exact integer rules.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a numeric stepper for quantities whose increment is natural, such as a product count. A stepper is not the sequential Steps component. Do not use a generic numeric parser for minor-unit money strings or opaque identifiers.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-stepper](https://open.limeai.run/docs/design-stepper?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Bounds | Declare minimum, maximum, step and unit; disable only the direction that reaches a boundary. |\n| Entry | Allow a typed value where useful and validate the accepted number format. |\n| Buttons | Name increase/decrease actions and preserve a usable target size. |\n\n<a id=\"stepper-bounds\"></a>\n\n## Small bounded integer adjustments\n\nUse a stepper for exact small count changes with a meaningful unit, such as a quantity. Define minimum, maximum and step explicitly. Opaque identifiers and large free-form numbers belong in an input; fractional currency is not a count stepper merely because its wire format uses digits.\n\n![Numbered anatomy of a numeric stepper.](https://open.limeai.run/docs/assets/design/source-0062-001.png)\n\n<a id=\"stepper-editing\"></a>\n\n## Buttons, direct entry and limits\n\nIncrease and decrease update the same value as direct entry. Disable the appropriate action at each bound and explain invalid input. Do not silently clamp a consequential amount or quantity at blur unless the task explicitly communicates that behavior; preserve the user's intent for correction.\n\n<a id=\"stepper-states\"></a>\n\n## Repeated input, focus and presentation\n\nIf press-and-hold is supported, stop repetition on release, pointer cancellation, focus loss or a bound. Expose the current numeric value and limits to assistive technology. Align the field and buttons using the shared control height and keep disabled, pending and error states distinct.\n\n![Numeric stepper dimensions and button spacing.](https://open.limeai.run/docs/assets/design/source-0062-003.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nHolding a control may repeat local adjustment but must not repeat a server purchase. The server recalculates eligibility and price when a commercial command is submitted. An unavailable quantity should produce a specific correction rather than silent clamping after payment.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test zero, maximum, invalid typed text and a server-side quantity change.\n2. Verify keyboard and touch interactions do not double-submit an order.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:48303aead0b9005243a67ad27e6d3eecb57bd8b184bf9f753b61e6c1c87fd005"},{"id":"design-switch","group":"guide","category":"Application design","title":"Switches","summary":"Change a binary setting with a clear application boundary.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-switch?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"switch-choice","title":"Switch, radio and checkbox"},{"id":"switch-commit","title":"Immediate change and form draft"},{"id":"switch-accessibility","title":"State, size and accessible meaning"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Switches\n\nChange a binary setting with a clear application boundary.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a switch for a reversible binary setting that is naturally on/off. A form boolean saved later can use a checkbox. Activating production credentials, expanding permissions or initiating payment needs the actual task flow rather than a deceptively simple toggle.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-switch](https://open.limeai.run/docs/design-switch?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Label | Name the setting consistently in both states and expose checked state semantically. |\n| Apply | Explain whether the setting applies immediately or on Save; do not mix both behaviors in one form. |\n| Pending | Prevent racing updates and show failure/rollback without pretending the requested state was confirmed. |\n\n<a id=\"switch-choice\"></a>\n\n## Switch, radio and checkbox\n\nA switch changes one binary setting, radios select one alternative from a set, and checkboxes record independent choices. Label the setting rather than only the action, so On and Off remain understandable. Do not use a switch to approve a release, transfer ownership or perform another consequential command.\n\n![Numbered anatomy of a switch control.](https://open.limeai.run/docs/assets/design/source-0063-001.png)\n\n<a id=\"switch-commit\"></a>\n\n## Immediate change and form draft\n\nState whether toggling commits immediately or edits a pending form. For immediate settings, show a pending state and restore or reconcile the last confirmed value on failure. A switch inside a form may reveal dependent fields, while the final save remains the commit boundary.\n\n<a id=\"switch-accessibility\"></a>\n\n## State, size and accessible meaning\n\nExpose switch state programmatically and support keyboard activation. Distinguish on/off, disabled and pending states beyond color. Select a size for the available space and target, not to express parent-child permission relationships.\n\n![Switch states for on, off, disabled, and loading.](https://open.limeai.run/docs/assets/design/source-0063-004.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nSpace toggles the focused switch. A pending update retains the previous confirmed value and desired value separately. If authentication expires, retain the intended change for review, then require explicit submission after reauthentication.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test on/off, disabled, pending, rejected and stale-revision states.\n2. Verify the visual state matches the server after reload and account switching.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:c31e2a87ef7c72f4554adac9867b3355263c4e09250976d3c2f0bb7465bd4560"},{"id":"design-tree-select","group":"guide","category":"Application design","title":"Tree selection","summary":"Select hierarchical resources while keeping selection and expansion independent.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tree-select?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"tree-modes","title":"Navigation, single and multiple selection"},{"id":"tree-cascade","title":"Parent-child selection rules"},{"id":"tree-search-overflow","title":"Search, current location and overflow"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Tree selection\n\nSelect hierarchical resources while keeping selection and expansion independent.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a tree selector when a genuine resource hierarchy helps find a value, especially with expandable branches. A single navigation tree opens content rather than selecting form values. Never assume selecting a parent grants access to all descendants without an explicit authorization rule.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-tree-select](https://open.limeai.run/docs/design-tree-select?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Mode | Define single/multiple, parent-child propagation and mixed state explicitly. |\n| Identity | Use stable resource IDs, display disambiguating ancestors and preserve a clear selected summary. |\n| Async | Distinguish unloaded children, empty branches, failed loading and denied branches. |\n\n<a id=\"tree-modes\"></a>\n\n## Navigation, single and multiple selection\n\nA tree can navigate a hierarchy or select values, but these are different tasks. Declare which node levels are selectable and whether the chosen value is single or multiple. Keep the expansion arrow separate from the selection target and preserve a useful ancestor path.\n\n<a id=\"tree-cascade\"></a>\n\n## Parent-child selection rules\n\nA checkbox tree may define parent selection as the set of its children, with a mixed state for a partial subset. Another tree may treat the parent as an independent value. Use the rule from the resource contract, including loaded versus unloaded descendants, and never infer permission from visual ancestry.\n\n<a id=\"tree-search-overflow\"></a>\n\n## Search, current location and overflow\n\nSearch results retain enough hierarchy to distinguish equal names. Reopening the selector reveals the selected location without losing current values. Bound popup size, allow intentional scrolling and keep long selected labels accessible; a collapsed parent must not make a hidden active descendant impossible to reach.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeyboard arrows expand/collapse and move between nodes; selection follows the declared mode. Searching must not silently select every match. Removed or unauthorized selected resources need a visible invalid state before submission.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test deep branches, same-name nodes, partial selection and unloaded descendants.\n2. Check a narrow-screen alternative without horizontal multi-column overflow.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:3d1bb6e657d4e3f0d4cf362b7b554c9c3974da3f98888d959f664a92f4c9196a"},{"id":"design-transfer","group":"guide","category":"Application design","title":"Transfer lists","summary":"Compare available and selected items before submitting a bounded assignment.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-transfer?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"transfer-panels","title":"Available and selected panels"},{"id":"transfer-search-move","title":"Selection, search, removal and ordering"},{"id":"transfer-adaptation","title":"Scrolling, wrapping and small screens"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Transfer lists\n\nCompare available and selected items before submitting a bounded assignment.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nA transfer list is useful when users need to compare a moderate set of available and selected items. For a small set use checkboxes; for a large searchable collection prefer a scoped picker. Moving a row locally is a draft choice, not an immediate permission grant.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-transfer](https://open.limeai.run/docs/design-transfer?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Panels | Name both panels, show relevant counts and give move/remove actions accessible names. |\n| Search | Clarify whether each search filters available, selected or both; preserve selections outside the filter. |\n| Order | Use drag only if order matters and offer keyboard controls for the same effect. |\n\n<a id=\"transfer-panels\"></a>\n\n## Available and selected panels\n\nThe available panel shows authorized choices, while the selected panel shows the current chosen set with explicit removal controls. Titles and counts explain each panel's scope. A tree may organize available choices, while selected items can be flattened with enough path information to remain unambiguous.\n\n<a id=\"transfer-search-move\"></a>\n\n## Selection, search, removal and ordering\n\nSearching filters the available view without clearing valid selections. A select-all control names whether it covers visible results or the complete authorized set. Removal targets one chosen item, and optional reordering needs a keyboard alternative. Clear all is deliberate and does not by itself revoke server-side membership.\n\n<a id=\"transfer-adaptation\"></a>\n\n## Scrolling, wrapping and small screens\n\nKeep panel headings and search reachable while lists scroll. Align selection controls with the first line of a multiline item and let detail text grow. If two panels no longer fit, use a deliberate stacked or staged layout with a visible selected count rather than shrinking text and targets.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nBulk movement must state whether it affects visible matches or all available items. Persist with the operation's current revision and validate every item on the server. On narrow screens use stacked panels or a single selection summary rather than shrinking both columns.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test filtered select-all, an unavailable item and duplicate names.\n2. Verify keyboard-only add/remove and state preservation after a rejected save.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:79218692e96115718178860ef8049745da9fb08c1d84f62cf966c55ba7b45772"},{"id":"design-time-picker","group":"guide","category":"Application design","title":"Time picker","summary":"Choose a time with an explicit timezone and date relationship.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-time-picker?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"time-granularity","title":"Combined and independent time choices"},{"id":"time-input-constraints","title":"Typed values, disabled times and clearing"},{"id":"time-date-range","title":"Date-time ranges and confirmation"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Time picker\n\nChoose a time with an explicit timezone and date relationship.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a time picker for a clock time whose precision matters. An appointment needs a date and timezone; a recurring local time needs explicit daylight-saving behavior. Do not infer timezone from language or silently convert a time-only value into today's instant.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-time-picker](https://open.limeai.run/docs/design-time-picker?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Format | Specify 12/24-hour display, required precision and units, with keyboard entry. |\n| Range | Define start/end inclusivity and whether a range may cross midnight. |\n| Availability | Disable invalid times with a useful reason; keep empty and invalid distinct. |\n\n<a id=\"time-granularity\"></a>\n\n## Combined and independent time choices\n\nChoose combined hour/minute options for a modest fixed interval and separate columns when finer precision is needed. Declare allowed increments and whether seconds are meaningful. Display 12-hour or 24-hour notation according to the chosen format without changing the stored instant or timezone.\n\n![Numbered anatomy of a 24-hour time picker.](https://open.limeai.run/docs/assets/design/source-0066-001.png)\n\n![Three numeric columns for hours, minutes and seconds.](https://open.limeai.run/docs/assets/design/source-0066-008.png)\n\n<a id=\"time-input-constraints\"></a>\n\n## Typed values, disabled times and clearing\n\nTyped input and panel selection share the same format and allowed range. Explain invalid or disabled times, including timezone-related gaps when a date is involved. An optional field may be cleared; do not turn an absent time into midnight or the current time without explicit task rules.\n\n![Numeric 24-hour time input and clear-control states.](https://open.limeai.run/docs/assets/design/source-0066-009.png)\n\n<a id=\"time-date-range\"></a>\n\n## Date-time ranges and confirmation\n\nWhen a task selects an interval, link start and end validation and state the timezone. A Current time shortcut is an explicit selection, not a changing default. If a confirmation footer exists, keep the draft and prior committed value distinct and make cancellation predictable.\n\n![Numeric date and time range input combinations.](https://open.limeai.run/docs/assets/design/source-0066-015.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nChanging hour/minute remains local until the intended commit point. When combined with a date, validate nonexistent or repeated local times under the selected timezone. Show a clear confirmation or correction instead of silently shifting the user's intended time.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test midnight, end-of-day, precision limits and a daylight-saving transition.\n2. Check source/translated formats, keyboard controls and narrow-screen popup placement.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:3ca51ac3359fd19bd062462d5dddad6b542353187c83bca5fbe6544de1e6de28"},{"id":"design-upload","group":"guide","category":"Application design","title":"Uploads","summary":"Show accepted files, transfer state and the difference between upload and saved configuration.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-upload?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"upload-modes","title":"File selection, drag and image walls"},{"id":"upload-file-state","title":"Per-file progress and recovery"},{"id":"upload-import-preview","title":"Import validation and safe previews"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Uploads\n\nShow accepted files, transfer state and the difference between upload and saved configuration.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse upload for a feature that has a real authorized file contract, such as an application image. A design guide does not create a generic file-storage API. Offer a normal file chooser even when drag/drop is supported.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-upload](https://open.limeai.run/docs/design-upload?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Constraints | State accepted types, count, size and applicable image dimensions before selection. |\n| State | Distinguish selected, validating, transferring, accepted, rejected and configuration-saved states. |\n| Content | Validate on the server, sanitize filenames and do not trust extension or browser MIME alone. |\n\n<a id=\"upload-modes\"></a>\n\n## File selection, drag and image walls\n\nA file-picker button is the accessible baseline; drag-and-drop is an additional path. An image wall suits a bounded image collection and keeps upload, preview and remove actions distinct. Describe accepted formats, size and quantity before selection, then validate the actual bytes on the server.\n\n<a id=\"upload-file-state\"></a>\n\n## Per-file progress and recovery\n\nShow waiting, transfer, validation, success and failure per file, with a useful reason and an authorized retry or cancel. A selected preview is not proof of upload completion. Keep the original upload identity when the contract supports recovery, and do not silently discard excess files or failed items.\n\n<a id=\"upload-import-preview\"></a>\n\n## Import validation and safe previews\n\nA structured import may require a template, validation results and an explicit final commit; uploading a file is not the import's success state. Previews use the same access policy as the source and keep filenames safely escaped. Never promise generic folders, arbitrary file storage or a native host upload manager from the design pattern alone.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nProvide cancellable transfer or a clear pending state under the actual contract. A retry must not create duplicate resources; keep the original upload identity when supported. Removing a local preview is not proof that stored content was deleted. Private previews require the same access boundary as their source.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test invalid type, over-limit size, network loss, retry and image decoding failure.\n2. Check keyboard file selection, named remove controls and no secret data in filenames/previews.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:6a531ef750b71a48b9c187c1cfc39c574cfd823298f63e6a725c20f529b78ecb"},{"id":"design-avatar","group":"guide","category":"Application design","title":"Avatars","summary":"Represent a person or application without confusing appearance with verified identity.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-avatar?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"identity-and-shape","title":"Identity, shape and content"},{"id":"sizing-and-cropping","title":"Size, safe area and cropping"},{"id":"loading-and-fallback","title":"Loading and fallback"},{"id":"attached-indicators","title":"Attached status indicators"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Avatars\n\nRepresent a person or application without confusing appearance with verified identity.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a person avatar for a user and the established AppIcon for application identity. A visible name remains the primary distinction. An image or initials are display data and cannot establish account linkage, organization membership or a verified status.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-avatar](https://open.limeai.run/docs/design-avatar?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Image | Use a consistent crop and preserve aspect ratio; handle missing or failed images with a stable fallback. |\n| Name | Avoid duplicate screen-reader text when a name is already adjacent; a standalone profile control needs a name. |\n| Badge | Explain any status badge in text and never use a decorative check as a verified claim. |\n\n<a id=\"identity-and-shape\"></a>\n\n## Identity, shape and content\n\nUse a circular portrait for a person and a clearly distinct application or organization mark for a product identity. An avatar can contain a photo, symbol or text fallback. The visible mark supports recognition; a readable name remains available wherever identity affects a decision.\n\n![Four neutral avatar background colors.](https://open.limeai.run/docs/assets/design/source-0068-006.png)\n\n![Default person avatars on different background colors.](https://open.limeai.run/docs/assets/design/source-0068-008.png)\n\n![Overlapping avatar groups at three sizes with numeric overflow.](https://open.limeai.run/docs/assets/design/source-0068-009.png)\n\n![Compact avatar groups with overflow counts and dimensions.](https://open.limeai.run/docs/assets/design/source-0068-011.png)\n\n![Avatar-group overflow with four-pixel spacing.](https://open.limeai.run/docs/assets/design/source-0068-013.png)\n\n<a id=\"sizing-and-cropping\"></a>\n\n## Size, safe area and cropping\n\nChoose the size for the role: a compact list, a detail header and an identity selector need different emphasis. Preserve a safe area around a symbol, crop a photograph deliberately and retain the original aspect ratio of an uploaded application mark. Do not enlarge a low-resolution preview into a misleading source image.\n\n<a id=\"loading-and-fallback\"></a>\n\n## Loading and fallback\n\nKeep the avatar box stable while loading and replace a failed image with an accessible fallback. Lime application icons use the shared AppIcon contract and the configured preset or uploaded original. The reference's automatic name extraction and rotating color palette describe an example system; they are not a supported Lime generation rule.\n\n<a id=\"attached-indicators\"></a>\n\n## Attached status indicators\n\nSeparate a collaboration or presence marker from an unread or update badge. Place each consistently in its own corner, leave a separating edge and announce its meaning in text. A badge must not obscure the face or imply a verified identity, online state or completed task without a real source.\n\n![Status dot placed on a placeholder and a person avatar.](https://open.limeai.run/docs/assets/design/source-0068-025.png)\n\n![Avatar badge placement with numeric notification counts.](https://open.limeai.run/docs/assets/design/source-0068-027.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nOnly show image actions such as preview or profile navigation when actually supported and authorized. Keep fallback names escaped and avoid leaking another space's cached image after switching accounts.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test missing, slow and invalid image URLs, long names and shared initials.\n2. Verify accessible names and image cache isolation after account switching.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:4ac33e1531c1591b372f35dfd09d96a13c8d781b7277bdd9420812e92a9037f8"},{"id":"design-badge","group":"guide","category":"Application design","title":"Badges","summary":"Signal a concise count or state without replacing the underlying information.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-badge?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"indicator-types","title":"Dot, count and text"},{"id":"emphasis-and-placement","title":"Emphasis and placement"},{"id":"count-and-clearing","title":"Large counts and clearing"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Badges\n\nSignal a concise count or state without replacing the underlying information.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a badge for a relevant count, a new item indicator or a small status cue near its object. It should help the current task, not create constant urgency. A local UI badge does not imply support for Feishu host application badges.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-badge](https://open.limeai.run/docs/design-badge?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Count | Define the source and unread meaning; a capped display such as 99+ needs an accessible complete meaning. |\n| Status | Use a labelled state rather than color alone; do not present an estimate as a confirmed count. |\n| Placement | Keep the badge attached to its object without covering a name, close action or focus indicator. |\n\n<a id=\"indicator-types\"></a>\n\n## Dot, count and text\n\nUse a dot to signal the existence of an update, a count for a measurable quantity and short text for a distinct status. An icon badge communicates a category only when its meaning is familiar or accompanied by an accessible label. The same number cannot ambiguously mean both unread items and all records.\n\n![Numbered anatomy of dot and numeric badges.](https://open.limeai.run/docs/assets/design/source-0069-001.png)\n\n<a id=\"emphasis-and-placement\"></a>\n\n## Emphasis and placement\n\nAttach a small badge to the relevant destination or object, align its corner consistently and prevent clipping at container edges. Reserve a strong status color for information that needs that emphasis; an informational total can use a neutral treatment. Keep the base target usable and avoid multiple competing marks on one icon.\n\n![Dot badge size comparison on neutral avatars.](https://open.limeai.run/docs/assets/design/source-0069-012.png)\n\n![Numeric badge counts and overflow ellipses.](https://open.limeai.run/docs/assets/design/source-0069-013.png)\n\n<a id=\"count-and-clearing\"></a>\n\n## Large counts and clearing\n\nA visual cap such as 99+ can preserve space, but the accessible description must explain what is counted and expose the exact count when available. Derive unread and cleared state from the real notification or task record. Hiding a badge does not complete the source task or prove that an email was delivered.\n\n![Notification dots on light and dark mail icons.](https://open.limeai.run/docs/assets/design/source-0069-018.png)\n\n![Status badges on placeholder and person avatars.](https://open.limeai.run/docs/assets/design/source-0069-019.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nUpdate counts from authoritative state rather than decrementing blindly after an uncertain operation. A notification marked read means the user's record changed; it does not prove an email was delivered or a financial task completed.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Check zero, large counts, unknown/loading values and translated descriptions.\n2. Verify the badge is understandable in grayscale and does not interrupt screen readers repeatedly.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:7a8107f8c6cbb3066f12942773700507dbeb2b7218ee2d821a5306eb05477407"},{"id":"design-card","group":"guide","category":"Application design","title":"Cards","summary":"Group one coherent object or task without adding unnecessary decoration.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-card?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"container-and-emphasis","title":"Container and emphasis"},{"id":"content-and-actions","title":"Configurable content and actions"},{"id":"click-regions","title":"Click regions and selection"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Cards\n\nGroup one coherent object or task without adding unnecessary decoration.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse the shared Card for a distinct object or task summary when it improves scanning. A long article or simple form does not need every paragraph in a card. Keep application summaries, commercial offers and release states distinguishable by their actual content.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-card](https://open.limeai.run/docs/design-card?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Structure | Use a concise object title, essential fields and a clear main destination or action. |\n| Surface | Use the shared panel radius and fine neutral border without decorative side rails or routine shadow. |\n| Interaction | Do not nest buttons inside a card-sized button/link; expose independent row actions semantically. |\n\n<a id=\"container-and-emphasis\"></a>\n\n## Container and emphasis\n\nGroup related information with a clear title and a bounded reading area. Use the shared surface, radius and thin border; Lime favors restrained shadows. A background or elevation change needs a meaningful hierarchy rather than making every card appear equally prominent.\n\n![Numbered card anatomy and a separated surface stack.](https://open.limeai.run/docs/assets/design/source-0070-001.png)\n\n![Light card surface against a neutral background.](https://open.limeai.run/docs/assets/design/source-0070-011.png)\n\n![Muted card surface on white.](https://open.limeai.run/docs/assets/design/source-0070-012.png)\n\n![Outlined card surface on white.](https://open.limeai.run/docs/assets/design/source-0070-013.png)\n\n![Outlined card surface against a neutral background.](https://open.limeai.run/docs/assets/design/source-0070-014.png)\n\n![Two card surfaces with subtle elevation.](https://open.limeai.run/docs/assets/design/source-0070-016.png)\n\n![Comparison of card borders and shadows.](https://open.limeai.run/docs/assets/design/source-0070-017.png)\n\n![Two elevated cards against a neutral background.](https://open.limeai.run/docs/assets/design/source-0070-018.png)\n\n<a id=\"content-and-actions\"></a>\n\n## Configurable content and actions\n\nChoose a stable arrangement for the title, metadata, illustration and optional actions. Put the most useful information first, keep related fields together and use consistent padding. Reused fields, tags and form controls retain their own component rules when embedded inside a card.\n\n![Card content area highlighted inside a neutral surface.](https://open.limeai.run/docs/assets/design/source-0070-023.png)\n\n<a id=\"click-regions\"></a>\n\n## Click regions and selection\n\nDecide whether the card opens a detail, selects an item or only groups content. If the whole card is a link, keep inner buttons as independent valid targets without nested links or buttons. Provide focus and selected states, and enable drag sorting only when ordering is a supported, saved business operation.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nIf a card is navigable, a real named link should be keyboard reachable. Secondary actions such as More must not also trigger card navigation. Pending/error state should belong to the actual action rather than locking unrelated cards.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test long titles, missing images, card actions and a one-column narrow layout.\n2. Check focus order and that actions on one card do not affect another object.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:0ef7272228288de4f9f6019969dc7f0c7a394114beae542e61af6e7750492385"},{"id":"design-collapse","group":"guide","category":"Application design","title":"Collapsible panels","summary":"Hide optional detail while keeping important decisions immediately available.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-collapse?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"disclosure-anatomy","title":"Disclosure anatomy and arrows"},{"id":"trigger-and-state","title":"Trigger and expansion state"},{"id":"content-and-nesting","title":"Content, nesting and critical facts"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Collapsible panels\n\nHide optional detail while keeping important decisions immediately available.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a collapsible panel for supplementary explanation, grouped settings or a long reference detail. Do not initially hide a material price, permission, irreversible consequence or unknown-result recovery behind an unlabelled disclosure.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-collapse](https://open.limeai.run/docs/design-collapse?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Header | Use a real disclosure button with expanded state and a clear relation to the panel. |\n| Mode | Choose independent panels or an accordion deliberately; avoid forcing all content closed after every action. |\n| Nesting | Limit nested disclosure levels and keep heading semantics independent from the toggle. |\n\n<a id=\"disclosure-anatomy\"></a>\n\n## Disclosure anatomy and arrows\n\nA disclosure contains a persistent heading, an expansion control and an optional content separator. Use one arrow convention consistently: a directional chevron changes orientation as content expands. A decorative status icon beside the title does not replace the control's accessible name.\n\n<a id=\"trigger-and-state\"></a>\n\n## Trigger and expansion state\n\nChoose an arrow, title or full-row trigger and make its hit area clear. Implement the trigger as a button with aria-expanded and a relationship to the controlled region. Preserve deliberate expansion state during ordinary refreshes, and distinguish one-at-a-time accordions from independently expandable sections.\n\n<a id=\"content-and-nesting\"></a>\n\n## Content, nesting and critical facts\n\nUse consistent indentation and separators for nested groups and keep nesting shallow enough to scan. Expanded content can contain its own controls, which must not toggle the parent. Keep essential prices, blocking errors and recovery actions visible when they are needed to make the current decision.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nEnter/Space toggles the panel without navigating. Preserve focused content or move focus safely before collapsing it. A deep link to content inside a closed panel should reveal the target; a validation error must not remain hidden.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test keyboard toggling, a focused child, deep anchors and errors inside a collapsed group.\n2. Check content height changes and reduced-motion behavior without losing reading position.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:7e5ac7cf9e9bcd1190fbf534387fa9e106756a60c7ff0a768ab37e3fbaba4fa3"},{"id":"design-empty","group":"guide","category":"Application design","title":"Empty states","summary":"Explain why no content appears and offer the next relevant action.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-empty?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"identify-the-state","title":"Identify the actual state"},{"id":"feedback-anatomy","title":"Feedback and next action"},{"id":"initialization","title":"First-use guidance"},{"id":"position-and-responsiveness","title":"Container placement and adaptation"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Empty states\n\nExplain why no content appears and offer the next relevant action.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse the shared Empty for a genuinely empty collection or a valid no-result view. Distinguish a new workspace, a search with no matches, denied access, loading and a failed source. A generic No data must not hide an error or pretend a feature is delivered.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-empty](https://open.limeai.run/docs/design-empty?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Message | Name the missing object or result and use a short factual reason. |\n| Action | Offer Create, Clear filters, Retry or Request access only when that action is real and allowed. |\n| Illustration | Use restrained imagery as supplemental context, not a substitute for text. |\n\n<a id=\"identify-the-state\"></a>\n\n## Identify the actual state\n\nDistinguish an actual zero-record result, no search matches, missing selection, denied access and a failed request. Each state needs its own explanation and recovery. A page under construction is not a successful query with zero records; a successful task completion is not a failure empty state.\n\n<a id=\"feedback-anatomy\"></a>\n\n## Feedback and next action\n\nUse the shared Empty component for the title, explanation and relevant action. A small illustration can explain the state, but the next action remains the visual priority. Offer a precise recovery such as clearing filters, selecting a record or retrying; only offer creation when the user can create that resource.\n\n<a id=\"initialization\"></a>\n\n## First-use guidance\n\nA first-use page may explain the capability or present the first configuration task. Keep the illustration, explanation and one primary action related to that task; use a form or categorized entry only when it performs a real setup step. Do not show a completed or enabled state before the setup has succeeded.\n\n![Neutral illustration of a person beside an envelope and a form.](https://open.limeai.run/docs/assets/design/source-0072-031.png)\n\n![Neutral illustration of a person working with code and feedback controls.](https://open.limeai.run/docs/assets/design/source-0072-032.png)\n\n![Neutral illustration of people and media controls.](https://open.limeai.run/docs/assets/design/source-0072-033.png)\n\n![Neutral illustration of a person arranging a numeric interface.](https://open.limeai.run/docs/assets/design/source-0072-034.png)\n\n![Neutral illustration of a person beside profile cards.](https://open.limeai.run/docs/assets/design/source-0072-035.png)\n\n<a id=\"position-and-responsiveness\"></a>\n\n## Container placement and adaptation\n\nCenter a compact empty state inside its own module rather than the whole viewport. Align neighboring empty modules consistently. On a wide first-use page, illustration and action may sit side by side; stack them on narrow screens, preserve safe margins and scale the illustration without shrinking the action or explanatory text.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep filters visible after no matches so users can revise them. A denied state must not leak private resource details. A construction-state page should explain its actual status rather than present an active Create button with no working path.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test first use, no matches, source failure, denied access and a newly created item appearing.\n2. Verify keyboard focus and useful action labels in registered translations.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:980886b3520a2589756b6590774cc894043ead3ac6404aa3e66490ad32dd5188"},{"id":"design-image-viewer","group":"guide","category":"Application design","title":"Image previews","summary":"Inspect images with safe source access and a clear return to the original task.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-image-viewer?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"thumbnail-and-preview","title":"Thumbnail and preview surface"},{"id":"navigation-and-actions","title":"Navigation and available actions"},{"id":"zoom-and-fitting","title":"Zoom, fitting and overflow"},{"id":"keyboard-and-dismissal","title":"Keyboard and dismissal"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Image previews\n\nInspect images with safe source access and a clear return to the original task.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a preview when a thumbnail cannot show enough detail, such as an application listing image. Image viewing does not grant access to a private original. Provide useful alternative text or surrounding context, and avoid relying on a screenshot to communicate essential terms.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-imageviewer](https://open.limeai.run/docs/design-image-viewer?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Surface | Give the preview a named dialog, close control, bounded viewport and focus management. |\n| Tools | Expose zoom/fit/previous/next only when supported, with accessible names and keyboard alternatives. |\n| Source | Keep signed/private URLs short-lived as required and do not bypass authorization through a public cache. |\n\n<a id=\"thumbnail-and-preview\"></a>\n\n## Thumbnail and preview surface\n\nKeep a thumbnail's aspect ratio, make its preview affordance clear and label any overlaid action independently. A web preview uses a bounded overlay with a visible close control. Lime does not claim the reference's native Mac or Windows image window; its generic image-fitting principles still apply.\n\n![Inline image with a numbered content callout.](https://open.limeai.run/docs/assets/design/source-0073-001.png)\n\n![Numbered image-viewer anatomy on a light surface.](https://open.limeai.run/docs/assets/design/source-0073-002.png)\n\n![Numbered image-viewer anatomy on a dark backdrop.](https://open.limeai.run/docs/assets/design/source-0073-003.png)\n\n![Square, rounded and circular image crops.](https://open.limeai.run/docs/assets/design/source-0073-006.png)\n\n![Image preview on a dark backdrop with a compact toolbar.](https://open.limeai.run/docs/assets/design/source-0073-007.png)\n\n![Image preview in a light desktop window.](https://open.limeai.run/docs/assets/design/source-0073-008.png)\n\n![Landscape image centered in a resizable preview window.](https://open.limeai.run/docs/assets/design/source-0073-023.png)\n\n![Image-viewer content area with numeric inset annotations.](https://open.limeai.run/docs/assets/design/source-0073-024.png)\n\n![Image preview with standard Windows window controls.](https://open.limeai.run/docs/assets/design/source-0073-025.png)\n\n![Image preview with standard macOS window controls.](https://open.limeai.run/docs/assets/design/source-0073-026.png)\n\n<a id=\"navigation-and-actions\"></a>\n\n## Navigation and available actions\n\nGroup previous/next navigation, count, zoom and optional source actions separately. Show a current index and total only when they are known. Fit-to-window and 1:1 have distinct labels; rotate, download or edit appears only when the implementation and the image's authorization permit that action.\n\n![Numbered navigation and zoom controls below an image.](https://open.limeai.run/docs/assets/design/source-0073-009.png)\n\n![Image-viewer toolbar interaction states without labels.](https://open.limeai.run/docs/assets/design/source-0073-014.png)\n\n![Image preview with a numeric position counter and zoom controls.](https://open.limeai.run/docs/assets/design/source-0073-015.png)\n\n![Image preview retaining a safe margin around the image.](https://open.limeai.run/docs/assets/design/source-0073-016.png)\n\n<a id=\"zoom-and-fitting\"></a>\n\n## Zoom, fitting and overflow\n\nOpen the image within the available viewport without distorting it. A small image may remain at its native size; a larger image fits one limiting edge. When zoomed beyond the viewing area, provide a usable pan or scroll path and keep controls reachable. Report the actual scale rather than treating a resized thumbnail as the original.\n\n![Reduced image preview centered on a dark backdrop.](https://open.limeai.run/docs/assets/design/source-0073-017.png)\n\n![Full-size image preview cropped by the viewport.](https://open.limeai.run/docs/assets/design/source-0073-018.png)\n\n![Image preview with an original-size control.](https://open.limeai.run/docs/assets/design/source-0073-019.png)\n\n![Zoomed image preview with a fit-to-view control.](https://open.limeai.run/docs/assets/design/source-0073-020.png)\n\n![Image-viewer safe-area dimensions for a portrait image.](https://open.limeai.run/docs/assets/design/source-0073-021.png)\n\n![Image-viewer safe-area dimensions for a square image.](https://open.limeai.run/docs/assets/design/source-0073-022.png)\n\n<a id=\"keyboard-and-dismissal\"></a>\n\n## Keyboard and dismissal\n\nSupport keyboard activation of the thumbnail, Escape to close and focus restoration to the trigger. Keep modal focus inside the overlay and give every icon-only operation a name. Arrow navigation must not conflict with focused controls. A failure to load the authorized source needs a visible fallback and a retry or close path.\n\n![Image-viewer navigation with a numeric item counter.](https://open.limeai.run/docs/assets/design/source-0073-011.png)\n\n![Light image viewer with window controls and a toolbar.](https://open.limeai.run/docs/assets/design/source-0073-012.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nEscape closes a dismissible preview and restores focus to the originating thumbnail. Panning/zooming must not trap touch or keyboard users. A failed image shows a retry or a safe description rather than an indefinitely spinning blank area.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test very wide/tall images, failed decode, expired source access and the first/last item.\n2. Verify focus trapping, restoration, narrow-screen fit and keyboard controls.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:640c822b6fba62d4a922611dcfdcf115b9405eed7ebc46442e4e6683d6e38f75"},{"id":"design-popover","group":"guide","category":"Application design","title":"Popovers","summary":"Show nearby supplemental content or a small action without losing context.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-popover?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"content-structure","title":"Title, actions and complex content"},{"id":"size-and-position","title":"Size and anchor positioning"},{"id":"trigger-and-focus","title":"Trigger, hover and focus"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Popovers\n\nShow nearby supplemental content or a small action without losing context.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a popover for richer explanation or a small local interaction. Use a tooltip for brief noninteractive help, a menu for commands and a dialog for a complex or consequential task. Do not put an entire credential or purchase workflow into a tiny hover card.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-popover](https://open.limeai.run/docs/design-popover?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Trigger | Use click/tap for interactive content and expose its relationship and expanded state. |\n| Placement | Anchor to the trigger within visible safe margins, repositioning without covering the relevant object. |\n| Content | Use a concise optional heading and bounded content; essential information remains available elsewhere. |\n\n<a id=\"content-structure\"></a>\n\n## Title, actions and complex content\n\nA popover can contain a concise heading, explanation, optional icon and actions, or an interactive form. Group the footer separately when it needs a clear boundary. Keep a small set of actions and let labels wrap before forcing a crowded row. Use a dialog when the decision needs blocking attention.\n\n<a id=\"size-and-position\"></a>\n\n## Size and anchor positioning\n\nSize the panel to its content within the viewport, use shared surface and border semantics and keep a safe margin from screen edges. Place it near the trigger, flip or shift when space is insufficient and keep an optional arrow pointing to the anchor. Constrain tall content with an internal scroll area while leaving actions reachable.\n\n![Popover alignment axes and viewport edge constraints.](https://open.limeai.run/docs/assets/design/source-0074-011.png)\n\n<a id=\"trigger-and-focus\"></a>\n\n## Trigger, hover and focus\n\nChoose hover/focus for supplementary information or click for deliberate interaction. Moving the pointer from trigger into the panel must not close it. Interactive content needs keyboard access, Escape handling and an explicit dismissal rule. A nonmodal popover allows the surrounding page to remain available; a modal surface needs the corresponding focus contract.\n\n![Loading indicator inside an anchored popover.](https://open.limeai.run/docs/assets/design/source-0074-012.png)\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nKeep pointer movement from trigger to card possible without premature dismissal. Interactive content must be keyboard reachable, Escape dismissible when safe and return focus appropriately. Loading and failure should preserve a stable panel size.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test viewport edges, trigger/card pointer transfer and keyboard entry/exit.\n2. Check asynchronous content, long translations and a narrow touch layout.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:5307316e5a818b8d1abe7437f314d328f613e52416e330731cf0bd52df1af49d"},{"id":"design-placeholder","group":"guide","category":"Application design","title":"Placeholders","summary":"Reserve stable visual space while distinguishing absence, loading and failure.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-placeholder?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"placeholder-types","title":"Failure and default imagery"},{"id":"ratio-and-content","title":"Ratio and recognizability"},{"id":"recovery-actions","title":"Recovery and replacement"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Placeholders\n\nReserve stable visual space while distinguishing absence, loading and failure.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nAn image placeholder reserves the intended asset area or represents a missing image. A skeleton shows a loading layout, and an input placeholder gives an example. These roles are different; none replaces an accessible label or error message.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-placeholder](https://open.limeai.run/docs/design-placeholder?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Geometry | Preserve the expected aspect ratio to avoid shifting nearby content after load. |\n| State | A failed asset needs a deliberate fallback, while an optional absent image may remain neutral. |\n| Accessibility | Hide purely decorative blocks and keep useful text/context available. |\n\n<a id=\"placeholder-types\"></a>\n\n## Failure and default imagery\n\nA failed-image placeholder explains that a requested resource could not load. A default-image placeholder represents a resource that has no configured image. Keep these meanings distinct so users do not try to retry a missing upload or replace an image merely because a network request failed.\n\n<a id=\"ratio-and-content\"></a>\n\n## Ratio and recognizability\n\nReserve the eventual image's aspect ratio to reduce layout movement. Use a quiet neutral symbol or illustration that cannot be mistaken for real product content. Preserve a useful accessible description, and do not repeat decorative placeholder text to a screen reader when adjacent text already explains the state.\n\n![Default and failed-image placeholders with dimensions.](https://open.limeai.run/docs/assets/design/source-0075-006.png)\n\n<a id=\"recovery-actions\"></a>\n\n## Recovery and replacement\n\nRetry reloads the same authorized source; upload or replace changes the resource and needs the corresponding permission and validation. Keep a record's name and other useful metadata available while the image is absent. A placeholder must not imply that the resource itself has been deleted.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nStop loading indicators when the source succeeds or fails. Do not replace a private blocked image with details that reveal its contents. Retry belongs to a failed load, while an upload/change image action is a separate authorized write.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test missing, delayed, denied and corrupt images with stable surrounding layout.\n2. Check placeholder text never becomes the only label of an input or interactive preview.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:afbd3e5bc1d5903f9827ca569e11edd7e8f15c409f81aa14a5f14a3480129af7"},{"id":"design-table","group":"guide","category":"Application design","title":"Tables","summary":"Compare structured records with accurate headers, alignment and scoped actions.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-table?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"table-anatomy","title":"Table structure"},{"id":"table-variants","title":"Basic, grouped, tree and numeric tables"},{"id":"table-sort-reorder","title":"Sorting and reordering"},{"id":"table-overflow","title":"Sticky headers, fixed columns and scrolling"},{"id":"table-actions-summary","title":"Row actions, bulk actions and totals"},{"id":"table-loading-density","title":"Loading states and row density"},{"id":"table-text-alignment","title":"Long values and alignment"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Tables\n\nCompare structured records with accurate headers, alignment and scoped actions.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a table when users compare repeated fields across records. A card list can suit a small object summary; prose should remain prose. Keep a useful primary identifier and the few fields needed for the current decision instead of exposing every schema field.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-table](https://open.limeai.run/docs/design-table?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Semantics | Use real table headers, scopes and a caption/name where needed; sortable headers expose current direction. |\n| Alignment | Text is aligned for scanning; money is right-aligned with tabular numerals and explicit currency. |\n| Actions | Name row actions with their object; bulk actions state the actual selected scope and authorize each resource. |\n\n<a id=\"table-anatomy\"></a>\n\n## Table structure\n\nA data table combines a title or context, relevant search/filter actions, column headers, body rows and optional pagination. Put selection at the start and row commands near the end. Name each action with its object when repeated labels would be ambiguous, and keep a bulk-action bar visible only when selection exists.\n\n<a id=\"table-variants\"></a>\n\n## Basic, grouped, tree and numeric tables\n\nUse the basic table by default. Multi-level headers describe a genuine column hierarchy; tree rows describe hierarchical records; grouped rows aggregate a shared attribute; an expandable row reveals secondary detail. Keep expansion distinct from row selection. Numeric reports may use clearer boundaries, but all cells retain the same meaning and access rules.\n\n[design-detail-table-variants](https://open.limeai.run/docs/design-table?locale=en#table-variants)\n\n![Table with grouped column headers and generic placeholder text.](https://open.limeai.run/docs/assets/design/source-0076-003.png)\n\n<a id=\"table-sort-reorder\"></a>\n\n## Sorting and reordering\n\nExpose the current sort through the header and aria-sort, and state the next sort action. Sort only by capabilities the API actually supports; sorting one loaded page does not sort the whole result set. Drag reordering requires a real persistence contract and a keyboard alternative, and must not be offered for immutable ledger history.\n\n<a id=\"table-overflow\"></a>\n\n## Sticky headers, fixed columns and scrolling\n\nChoose either page scrolling with a sticky header or a clearly bounded table scroll area. Use horizontal scrolling when column meanings cannot be compressed, and fix only the key identifier or action columns that fit. Reserve space for scrollbars and bulk actions so neither covers the last row, pagination or keyboard focus.\n\n[design-detail-table-overflow](https://open.limeai.run/docs/design-table?locale=en#table-overflow)\n\n<a id=\"table-actions-summary\"></a>\n\n## Row actions, bulk actions and totals\n\nExpose the few most frequent row commands and collect the rest in a labelled menu. A bulk bar states the actual selected scope and authorizes every item. Never imply that selecting a page selects all server results. A summary identifies whether it totals visible rows or the entire authorized query and keeps currency totals separate.\n\n<a id=\"table-loading-density\"></a>\n\n## Loading states and row density\n\nDistinguish the first load, refresh with existing data and fetching the next page. Keep existing rows readable during a nonblocking refresh, mark their pending freshness and announce completion. Use one consistent density within a module; narrow touch layouts may need a larger target without reducing text size.\n\n![Table header state matrix with checkbox and switch controls.](https://open.limeai.run/docs/assets/design/source-0076-026.png)\n\n![Highlighted interaction areas in a table header.](https://open.limeai.run/docs/assets/design/source-0076-027.png)\n\n![Highlighted interaction areas in table cells.](https://open.limeai.run/docs/assets/design/source-0076-029.png)\n\n<a id=\"table-text-alignment\"></a>\n\n## Long values and alignment\n\nAllocate widths from real data: selection and expansion controls are fixed, while names and descriptions may flex. Wrap important names or provide the full value when truncating; identifiers can use an intentional code region. Text, time and status generally align left, while comparable amounts and percentages align right with tabular numerals.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDistinguish loading, empty, no matches, denied and failed states. Changing filters or sort resets cursor navigation. On narrow screens keep priority columns or a labelled local overflow region; sticky headers/columns cannot hide focus or the last row.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test long IDs, missing values, exact large amounts, mixed currencies and keyboard sorting.\n2. Check cursor changes, bulk selection, row actions and local horizontal scrolling.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:b3eb5db037a9eda2faac1c16a9dd1aca740bcb8d16c855b28206b685cb1f6632"},{"id":"design-tabs","group":"guide","category":"Application design","title":"Tabs","summary":"Switch peer views of one context with clear selection and state preservation.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tabs?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"tab-hierarchy","title":"Line, segmented and card tabs"},{"id":"states-and-keyboard","title":"States, hit areas and keyboard"},{"id":"long-titles-and-overflow","title":"Long titles and overflow"},{"id":"add-close-and-drafts","title":"Adding, closing and drafts"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Tabs\n\nSwitch peer views of one context with clear selection and state preservation.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse tabs for peer views of one object, such as application configuration areas. Use primary navigation for different product areas and steps for a sequential process. Keep tab names stable; a tab is not a command to publish or grant permission.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-tabs](https://open.limeai.run/docs/design-tabs?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Semantics | Use tablist/tab/tabpanel for local panels; route destinations can be real links with current-page state. |\n| Selection | Show a clear selected state beyond color and keep one associated panel active. |\n| Overflow | Allow horizontal tab scrolling or a clear overflow selector without hiding the selected label. |\n\n<a id=\"tab-hierarchy\"></a>\n\n## Line, segmented and card tabs\n\nUse a primary line-tab group for peer views, a lower-emphasis segmented group for a secondary partition and card tabs only for a workspace that supports that model. Keep the hierarchy clear when several groups exist. A route link and a tab that switches an in-page panel have different navigation semantics.\n\n<a id=\"states-and-keyboard\"></a>\n\n## States, hit areas and keyboard\n\nMake the active panel unambiguous and distinguish hover, focus and disabled states. Keep a sufficient hit area around short labels. In an actual tab widget, connect tab and panel, maintain one tab stop in the tab list and support arrow-key movement without trapping focus in the panel.\n\n<a id=\"long-titles-and-overflow\"></a>\n\n## Long titles and overflow\n\nBound unusually long labels while keeping the full name accessible. Prefer a deliberate horizontal-scroll or More pattern over shrinking text. If a hidden tab becomes active, reveal its identity consistently; an overflow menu must preserve the logical order and not silently change the selected panel.\n\n<a id=\"add-close-and-drafts\"></a>\n\n## Adding, closing and drafts\n\nShow add or close controls only when the workspace supports creating and closing views. Give the close control its own name and target, choose a predictable neighboring tab after closing and preserve or explicitly resolve unsaved work. Closing a view does not delete its business resource.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nPreserve safe drafts according to the task, and do not discard an uncertain write on a view change. Keyboard behavior should match local tabs or links consistently. A direct bookmarked route must select the right view after reload.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test arrow/tab navigation, long translations and selected tabs outside the visible strip.\n2. Verify pending edits, denied views and browser back/forward behavior.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:eb634614324e8c7df10ce64421c6e4f667acffed5b900d23f25387fd79f6250c"},{"id":"design-tag","group":"guide","category":"Application design","title":"Tags","summary":"Differentiate descriptive labels, selection chips and actionable removals.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tag?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"tag-meaning","title":"Attribute, option, status and person"},{"id":"semantics-and-color","title":"Color and recorded status"},{"id":"interaction-regions","title":"Selection and removal regions"},{"id":"long-names-and-spacing","title":"Long names and wrapping"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Tags\n\nDifferentiate descriptive labels, selection chips and actionable removals.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a tag to summarize a categorical property or selected filter. A status label must describe actual current state rather than an optimistic local value. Do not turn every metadata field into a colored badge or make descriptive tags appear clickable.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-tag](https://open.limeai.run/docs/design-tag?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Meaning | Store a stable code and localize its display; authorization never compares translated labels. |\n| Color | Use restrained category/state tokens with readable text; meaning remains clear without color. |\n| Removal | An interactive remove control has a name including the tag and a keyboard path. |\n\n<a id=\"tag-meaning\"></a>\n\n## Attribute, option, status and person\n\nAttribute tags describe an object; option tags represent selected objects; status tags show a recorded state; person tags identify people. Keep these roles distinct within a group. Use concise familiar names and avoid decorative labels that add no useful classification.\n\n<a id=\"semantics-and-color\"></a>\n\n## Color and recorded status\n\nPair status color with explicit text and reuse the shared semantic palette. Selection color identifies a chosen option and must not imply success or failure. Check transparent or solid backgrounds against the actual surface. A translated label changes the presentation, while the stable status code remains the business fact.\n\n<a id=\"interaction-regions\"></a>\n\n## Selection and removal regions\n\nA read-only tag is text, not an unexplained button. A selectable tag exposes its selected state. A removable tag has a separately named remove action; clicking the person's body and removing the person must not share an ambiguous target. Respect disabled states and confirm consequential removal through the real business flow.\n\n<a id=\"long-names-and-spacing\"></a>\n\n## Long names and wrapping\n\nKeep full names accessible when visual truncation is needed, preserve the close control and allow a group to wrap with consistent row gaps. Do not nest tags to explain hierarchy. A person tag needs the person's name even when a photo is unavailable; a technical ID can remain available as supplementary identification.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nRemoving a filter changes the query, while removing a granted permission is a separate protected operation. Preserve complete accessible names for truncated long labels. After deletion, move focus to a nearby logical control instead of losing it.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test descriptive, selected, disabled and removable variants with long names.\n2. Verify stable codes and state text remain correct after language switching.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:8925a9622465d8fdfe26997a089d0ba0ff9100b8d1de40f66a6452d7fce35dfe"},{"id":"design-timeline","group":"guide","category":"Application design","title":"Timelines","summary":"Show historical events with source, time and confirmed outcomes.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-timeline?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"structure-and-order","title":"Structure and event order"},{"id":"event-evidence","title":"Event content and verification"},{"id":"spacing-and-collapsing","title":"Spacing, loading and collapsing"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Timelines\n\nShow historical events with source, time and confirmed outcomes.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a timeline for a chronological history, such as release decisions or order facts. Use steps for a future/current workflow. Independent event deliveries can arrive out of order, so sort by the relevant business timestamp and retain received time where it helps diagnosis.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-timeline](https://open.limeai.run/docs/design-timeline?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Node | Name the event, actor/source, timestamp with timezone and confirmed result. |\n| State | Distinguish requested, accepted, failed and unknown outcomes; do not merge review approval with publication. |\n| Detail | Reveal authorized source IDs and redacted diagnostics without credentials or personal payloads. |\n\n<a id=\"structure-and-order\"></a>\n\n## Structure and event order\n\nUse a one-sided or alternating layout according to space and scanning needs. A continuous timeline can show known process milestones; an event history grows as facts arrive. State whether the list is newest-first or oldest-first and keep a stable order for equal timestamps. Steps describe the task to perform; a timeline records what happened.\n\n<a id=\"event-evidence\"></a>\n\n## Event content and verification\n\nEach useful event identifies the action or result, time, actor and source when available. Format the timestamp for the user's locale and time zone while preserving the underlying instant. A verification node distinguishes passed, warning and failed checks, and explains whether the process can continue. A finance event must not imply bank arrival without that evidence.\n\n<a id=\"spacing-and-collapsing\"></a>\n\n## Spacing, loading and collapsing\n\nKeep node titles concise while allowing explanatory details to wrap. Use consistent spacing and readable connection lines. Collapsing older or secondary nodes preserves the visible event count and an expansion action. Loading more history must not change a past event into a current approval state or discard an error marker.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nCollapsing older history must preserve a clear count/range and accessible expansion. Duplicate delivery does not become a second business transition. A ledger/receipt event is linked to its source and cannot be displayed as proof of bank settlement or email delivery.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test same-time events, delayed/duplicate deliveries, missing optional actors and long history.\n2. Check timezone labels, keyboard detail expansion and narrow vertical layout.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:da46734c16258c74c0ac189e49b48c0388f96cee06c8999faa581452c6b20056"},{"id":"design-tooltip","group":"guide","category":"Application design","title":"Tooltips","summary":"Provide short supplemental help for a focused or hovered target.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tooltip?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"short-explanation","title":"Short explanations and accessible names"},{"id":"hover-focus-and-dismissal","title":"Hover, focus and dismissal"},{"id":"size-and-placement","title":"Text bounds and placement"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Tooltips\n\nProvide short supplemental help for a focused or hovered target.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a tooltip for a compact noninteractive explanation or an icon's supplemental label. Essential instructions, validation errors, prices and permission consequences remain visibly available. Links and form controls inside a floating explanation require a popover instead.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-tooltip](https://open.limeai.run/docs/design-tooltip?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Trigger | Show on focus as well as hover, with a descriptive relationship and a stable accessible action name. |\n| Placement | Keep within the viewport and avoid hiding the target or focused content. |\n| Text | Keep short complete phrases that can wrap; no sensitive values or unnecessary repeated labels. |\n\n<a id=\"short-explanation\"></a>\n\n## Short explanations and accessible names\n\nUse a tooltip for a short explanation of an operation or a noninteractive text detail. An icon button still needs an accessible name before its tooltip appears. A decorative information icon does not become an action merely because explanatory text is available. Links, form fields and complex content belong in a popover.\n\n<a id=\"hover-focus-and-dismissal\"></a>\n\n## Hover, focus and dismissal\n\nExpose the same explanation on pointer hover and keyboard focus, allow enough time to read it and let Escape dismiss it. Moving onto the tooltip must not immediately hide it. Do not rely on hover on touch screens or hide essential validation, prices or recovery instructions exclusively inside a tooltip.\n\n<a id=\"size-and-placement\"></a>\n\n## Text bounds and placement\n\nUse the shared caption size with sufficient padding and contrast, constrain long text to a readable width and allow wrapping. Anchor the tooltip near the target and flip it at viewport or container boundaries. Keep the arrow aligned with the target and avoid covering the information the user is currently inspecting.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nEscape dismisses the tooltip without moving focus. Do not require hover to understand why an action is disabled; provide an accessible visible explanation where needed. On touch screens ensure the same help is available by an appropriate alternative.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test keyboard focus, Escape, viewport corners and long translations.\n2. Verify essential task information remains understandable without the tooltip.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:2caf014e60f9d002124cc63e1c5171c5ca21f0c7abe9b978f66e6296b21f7ea3"},{"id":"design-dialog","group":"guide","category":"Application design","title":"Dialogs","summary":"Focus a bounded task or consequential decision with reliable focus management.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-dialog?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"dialog-priority","title":"Dialog, persistent notice and toast"},{"id":"dialog-anatomy","title":"Header, content and actions"},{"id":"dialog-dimensions","title":"Dimensions and content overflow"},{"id":"dialog-text-layout","title":"Long text, actions and narrow screens"},{"id":"dialog-focus-dismiss","title":"Focus, dismissal and pending work"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Dialogs\n\nFocus a bounded task or consequential decision with reliable focus management.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse the shared Modal for a focused edit or confirmation that benefits from retaining the underlying context. A long independent workflow belongs on a page. Ask for confirmation only for the high-impact action the user actually initiated, naming the object and consequences.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-dialog](https://open.limeai.run/docs/design-dialog?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Structure | Provide a semantic name, useful description, clear primary/cancel actions and bounded scrolling. |\n| Focus | Move focus intentionally on open, contain it in a modal dialog and restore the trigger after close. |\n| Pending | Use closeDisabled during submission and preserve the original command if the outcome is unknown. |\n\n<a id=\"dialog-priority\"></a>\n\n## Dialog, persistent notice and toast\n\nUse a modal dialog when the user must decide or complete a short task before returning to the page. Use a persistent notice for information that can remain alongside work, and a toast for lightweight status. A dialog must justify interrupting focus; routine success does not require a new blocking confirmation.\n\n<a id=\"dialog-anatomy\"></a>\n\n## Header, content and actions\n\nThe title identifies the task or affected object, the body contains the necessary information or short form, and the footer contains one primary action and clear alternatives. A simple confirmation explains a consequence; a custom form dialog supports a bounded edit. Avoid stacking decorative cards and shadows inside the body.\n\n[design-detail-dialog-structure](https://open.limeai.run/docs/design-dialog?locale=en#dialog-anatomy)\n\n<a id=\"dialog-dimensions\"></a>\n\n## Dimensions and content overflow\n\nChoose width from the task rather than maximizing the panel. The established application-creation dialog uses 840px on desktop; this is a task-specific size, not the width of every Modal. Bound height to the visible viewport, scroll long form content intentionally and keep the title and action region reachable.\n\n[design-detail-dialog-responsive](https://open.limeai.run/docs/design-dialog?locale=en#dialog-dimensions)\n\n<a id=\"dialog-text-layout\"></a>\n\n## Long text, actions and narrow screens\n\nLet a translated title wrap and let explanatory content grow before truncating. If action labels no longer fit in one row, arrange complete buttons vertically with a stable order. On a narrow screen preserve the object, consequence, cancel path and submit action, including when the software keyboard reduces the visible height.\n\n<a id=\"dialog-focus-dismiss\"></a>\n\n## Focus, dismissal and pending work\n\nMove focus into the dialog, keep keyboard focus within the active modal and return it to the trigger on close. The shared Modal supports Escape and backdrop dismissal when closing is allowed. During a submitted write, use closeDisabled and retain the original command; response loss needs a visible recovery path, not a discarded form.\n\nPrefer a single dialog. If a necessary second confirmation is used, only the top layer is active and focus returns to the first task after it closes. Reauthentication does not automatically replay the sensitive action.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nEscape and outside-click close only when safe under the task's rules. Re-rendering must not reset focus or erase input. For an asynchronously opened dialog, retain the original trigger through returnFocus so a temporarily disabled button does not lose restoration.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test Tab/Shift+Tab, Escape, focus restoration, failed submit and a lost response.\n2. Check long translations and software keyboard with no page-wide horizontal overflow.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:280c60edfaf392c25ae4d961df42cd17e00421a8e059ae706ae3b9efb2f70f0b"},{"id":"design-drawer","group":"guide","category":"Application design","title":"Drawers","summary":"Show contextual detail or a short task beside its source.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-drawer?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"overlay-and-push","title":"Overlay and adjacent panel"},{"id":"header-body-footer","title":"Header, body and actions"},{"id":"width-and-narrow-screens","title":"Width and narrow screens"},{"id":"focus-close-and-drafts","title":"Focus, dismissal and drafts"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Drawers\n\nShow contextual detail or a short task beside its source.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a drawer when the source list remains useful while a user inspects a record. Use a page for a long task, and a confirmation dialog for a consequential decision. An overlay drawer and a nonmodal side panel have different focus and dismissal behavior.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-drawer](https://open.limeai.run/docs/design-drawer?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Header | Show the object/task name and a named close control, with current context if required. |\n| Content | Bound content scrolling and keep the final action reachable without covering fields. |\n| Mode | Declare modal overlay or nonmodal panel semantics; do not trap focus in a nonmodal inspector. |\n\n<a id=\"overlay-and-push\"></a>\n\n## Overlay and adjacent panel\n\nUse an overlay drawer for an interrupting detail or temporary task and an adjacent panel when users must compare or control the parent content. A pushed layout keeps both areas on the same visual level. Decide modal behavior explicitly; a visually adjacent panel does not automatically need a modal backdrop.\n\n<a id=\"header-body-footer\"></a>\n\n## Header, body and actions\n\nKeep the title and close control in a stable header and place optional task actions in a stable footer. Let the body scroll independently so a long form does not hide its controls. Title, supporting information and header actions retain a clear first-line alignment; move secondary actions into a menu when space becomes scarce.\n\n<a id=\"width-and-narrow-screens\"></a>\n\n## Width and narrow screens\n\nChoose a width that preserves usable parent content on a wide screen and convert to an overlay or full-width panel when the layout can no longer support two areas. The reference's 350, 480 and 680px examples are comparison dimensions, not an exported Lime component API. Respect safe margins, long translations and the on-screen keyboard.\n\n<a id=\"focus-close-and-drafts\"></a>\n\n## Focus, dismissal and drafts\n\nA modal drawer traps focus and restores it to the trigger after closing; a nonmodal panel keeps page navigation available. Provide Escape and a named close action according to the active contract. Handle unsaved changes explicitly, and never infer that closing saved a form or replay a write after authentication without a new user action.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nRestore focus to the originating row after close, even if data refreshed. On narrow screens the drawer may become a full-width dialog while preserving the same task and return path. A pending write cannot be discarded by clicking the backdrop.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test source-row removal, keyboard close, pending submission and browser navigation.\n2. Check narrow width, long text and focus visibility near the fixed action area.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:9f26e4ab335c4657decd61896a8b4bd2792b3c71463c12f3b5b543e934f6731a"},{"id":"design-loading","group":"guide","category":"Application design","title":"Loading states","summary":"Explain bounded work without implying success or blocking unrelated tasks.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-loading?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"choose-a-loading-pattern","title":"Choose a loading pattern"},{"id":"scope-and-layout","title":"Scope, layout and images"},{"id":"completion-and-failure","title":"Completion, failure and reduced motion"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Loading states\n\nExplain bounded work without implying success or blocking unrelated tasks.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse shared Loading for an unknown-duration wait and a stable skeleton when the final layout is known. A measured progress bar is appropriate only when a real total exists. Loading is not an empty result, and a timeout must leave an actionable state.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-loading](https://open.limeai.run/docs/design-loading?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Scope | Mark only the affected region busy; do not lock the entire app for a row fetch. |\n| Stability | Reserve appropriate layout space and avoid flashing loaders for already available content. |\n| Announcement | Provide a useful localized status without continuously repeating animation frames. |\n\n<a id=\"choose-a-loading-pattern\"></a>\n\n## Choose a loading pattern\n\nUse a skeleton when the initial content structure is predictable, a small spinner for an indeterminate local operation and an illustration only when it explains a longer first-use wait. Keep one coherent loading signal per task. Preserve loaded data during a refresh instead of replacing every module with independent spinners.\n\n![Neutral avatar-and-text loading skeleton.](https://open.limeai.run/docs/assets/design/source-0083-002.png)\n\n![Centered loading indicator inside a card.](https://open.limeai.run/docs/assets/design/source-0083-032.png)\n\n<a id=\"scope-and-layout\"></a>\n\n## Scope, layout and images\n\nConstrain loading to the affected region, preserve the final dimensions and keep unaffected actions available. A blocking overlay is justified only when concurrent interaction would be unsafe or invalid. Image loading reserves its ratio and switches to a failure fallback when needed. Loading and a successful zero-result empty state must not appear together for the same query.\n\n![Loading indicators on light, solid and muted surfaces.](https://open.limeai.run/docs/assets/design/source-0083-026.png)\n\n<a id=\"completion-and-failure\"></a>\n\n## Completion, failure and reduced motion\n\nUse a textual status for screen readers, avoid repeated live announcements and respect reduced-motion settings. A slow request needs a useful explanation, cancellation when supported and a retry path after failure. Reject stale responses after a newer request or unmount, and show success only after the operation's actual completion contract is satisfied.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nIgnore stale responses after filter/account/space changes. Cancellation and deadlines stop unnecessary work. A pending write retains its key/context, and an uncertain result transitions to recovery rather than an automatic new command.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test fast/slow success, failure, cancellation, source switching and a response arriving out of order.\n2. Check reduced motion and screen-reader status with a stable focus position.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:b221985308d1ea4c7fc66ce57551958c98229d83bacd5703c00dbdd55b550cd2"},{"id":"design-notification","group":"guide","category":"Application design","title":"Notification panels","summary":"Show an asynchronous result with clear scope and a useful follow-up.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-notification?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"message-and-actions","title":"Message structure and actions"},{"id":"placement-and-timing","title":"Placement, timing and focus"},{"id":"durable-notification-record","title":"Transient display and durable records"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Notification panels\n\nShow an asynchronous result with clear scope and a useful follow-up.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a notification panel for a task result or background event that needs more context than a toast. A durable account notification has a source-owned record; a temporary front-end panel does not create such a record or guarantee external message delivery.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-notification](https://open.limeai.run/docs/design-notification?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Content | Name the task/object, confirmed outcome and relevant follow-up without exposing personal or secret payloads. |\n| Actions | Use a small set of real contextual links; sensitive actions still open their own review flow. |\n| Lifecycle | Provide dismissal and an appropriate persistent location for information that cannot safely disappear. |\n\n<a id=\"message-and-actions\"></a>\n\n## Message structure and actions\n\nA notification can contain an icon, concise title, explanatory content, close control and one or two useful actions. A simple message and a richer custom layout follow the same hierarchy. Keep the next action specific to the event; do not use a transient notification as the only place for a required decision.\n\n<a id=\"placement-and-timing\"></a>\n\n## Placement, timing and focus\n\nPlace notifications consistently within the active page without covering its critical actions. Allow longer reading time for detailed or actionable content, pause dismissal while it is being read or focused and keep close controls reachable on narrow screens. New notifications should not steal keyboard focus from the task.\n\n![Blue notification color shape on a pixel grid.](https://open.limeai.run/docs/assets/design/source-0084-013.png)\n\n![Green notification color shape on a pixel grid.](https://open.limeai.run/docs/assets/design/source-0084-014.png)\n\n![Amber notification color shape on a pixel grid.](https://open.limeai.run/docs/assets/design/source-0084-015.png)\n\n![Red notification color shape on a pixel grid.](https://open.limeai.run/docs/assets/design/source-0084-016.png)\n\n<a id=\"durable-notification-record\"></a>\n\n## Transient display and durable records\n\nA frontend notification panel is a presentation. When the event has a durable notification record, unread state, retry and delivery status come from that source. Closing the panel does not acknowledge the underlying task and does not prove email delivery. Important unresolved information remains available in the relevant record or page.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nAnnounce asynchronously without stealing focus from active input. Deduplicate repeated updates and avoid stacking unbounded panels. Marking a notification read is separate from completing its source task or confirming an email reached a recipient.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test multiple results, long names, keyboard actions and a narrow viewport.\n2. Verify read/dismiss state does not change an order, permission or payment result.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:4a7aa45528ee41610dd879b6f78b70d2b1e2501cfc1eeb54c8f01b7df43996d8"},{"id":"design-notice","group":"guide","category":"Application design","title":"Persistent notices","summary":"Keep material restrictions or recovery instructions visible near their scope.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-notice?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"semantic-types","title":"Semantics and available variants"},{"id":"site-page-and-module","title":"Site, page and module scope"},{"id":"text-actions-and-alignment","title":"Text, actions and alignment"},{"id":"dismissal-and-recovery","title":"Dismissal and unresolved conditions"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Persistent notices\n\nKeep material restrictions or recovery instructions visible near their scope.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse shared Notice for information that affects a decision, such as an environment restriction, denied capability or uncertain result. A page-wide notice applies to the page; field validation stays near the field. Avoid turning ordinary help into repeated warning banners.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-notice](https://open.limeai.run/docs/design-notice?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Meaning | Choose informational, success, warning or error semantics according to confirmed facts, with text. |\n| Placement | Place before the affected task or within its region, without decorative side rails. |\n| Recovery | Offer a specific real action and preserve the original object/command where required. |\n\n<a id=\"semantic-types\"></a>\n\n## Semantics and available variants\n\nChoose an information, success, warning or error meaning from the actual state and pair the icon and color with explicit text. The current shared Notice API exposes info, success and warning; an error example in this guideline does not add an unsupported variant. Keep the existing failure component or implement the shared contract before using a new variant.\n\n<a id=\"site-page-and-module\"></a>\n\n## Site, page and module scope\n\nA site notice belongs above the affected content, a page notice follows the page heading and a module notice sits next to its related fields. Reserve space rather than unexpectedly covering controls. Persistent nonblocking information remains visible until the condition is resolved or deliberate dismissal is appropriate.\n\n<a id=\"text-actions-and-alignment\"></a>\n\n## Text, actions and alignment\n\nExplain the condition in a concise sentence; use a title only when supporting content needs one. Keep at most a small set of actions, distinguish a command from a navigation link and move actions to another row when content wraps. Align the close control with the first text line. Centered single-line notices suit centered layouts; long or multi-line content follows the page's reading edge.\n\n<a id=\"dismissal-and-recovery\"></a>\n\n## Dismissal and unresolved conditions\n\nClosing the presentation must not erase an unresolved permission, billing or data failure. Retain the condition and recovery in its responsible page or record, and reveal it again when the user attempts the affected action. Do not treat dismissing a notice as consent to a consequential operation.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nDismiss only information the user may safely hide, and do not restore a dismissed notice on every render. An unresolved permission or unknown write condition must remain discoverable. Reauthentication returns to review of the original task instead of automatically replaying it.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test wrapped content, links/actions, dismissal and a persistent unresolved error.\n2. Check status announcement without duplicate reading on every render.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:d9c4c6f277dba8c00a0ac9a39b9afbc787e66f7bbd78cb1473bdcba86baa894e"},{"id":"design-progress","group":"guide","category":"Application design","title":"Progress indicators","summary":"Display measured completion and distinguish work accepted from work finished.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-progress?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"determinate-and-indeterminate","title":"Determinate and indeterminate progress"},{"id":"linear-and-circular","title":"Linear and circular forms"},{"id":"phases-and-recovery","title":"Phases, completion and recovery"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Progress indicators\n\nDisplay measured completion and distinguish work accepted from work finished.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a determinate progress indicator only when work has a meaningful known total. A spinner handles unknown duration. Upload bytes reaching 100% means transfer completed; server validation, processing and configuration save may still be pending.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-progress](https://open.limeai.run/docs/design-progress?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Value | Expose min/max/current or indeterminate state with a localized task label. |\n| Stages | Name transfer/processing/complete separately instead of holding a fabricated 99% indefinitely. |\n| Failure | Show confirmed failure or cancellation with a safe retry/recovery action, not a success-colored bar. |\n\n<a id=\"determinate-and-indeterminate\"></a>\n\n## Determinate and indeterminate progress\n\nUse a determinate indicator only when completed work and total work are measurable. Otherwise show indeterminate progress with a clear activity label. Do not invent a percentage from elapsed time or interpolate an unknown server operation to 99%.\n\n![Numbered anatomy of linear and circular progress.](https://open.limeai.run/docs/assets/design/source-0086-001.png)\n\n<a id=\"linear-and-circular\"></a>\n\n## Linear and circular forms\n\nA linear track suits a named upload, download or longer task; a compact circular indicator fits a small local area. Keep track, filled indicator and optional value visually distinct, use readable value text and preserve the same meaning across sizes. Color alone cannot distinguish running, successful and failed states.\n\n![Linear and circular progress with numeric percentages.](https://open.limeai.run/docs/assets/design/source-0086-002.png)\n\n![Linear progress dimensions in pixels.](https://open.limeai.run/docs/assets/design/source-0086-004.png)\n\n![Circular progress dimensions and spacing.](https://open.limeai.run/docs/assets/design/source-0086-007.png)\n\n<a id=\"phases-and-recovery\"></a>\n\n## Phases, completion and recovery\n\nDescribe separate phases when transfer and processing have different completion facts: transferring 100% of bytes does not prove server-side processing succeeded. Show the final response, keep a failed or canceled task identifiable and offer supported retry or resume. A restarted operation uses its real progress rather than retaining a stale completed value.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nThrottle announcements so assistive technology receives useful milestones rather than every small update. A cancelled or failed task retains the relevant original identity for safe recovery. Do not report financial settlement or approval progress as a percentage unless the contract actually measures it.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test zero, complete transfer with pending processing, failure and unknown total.\n2. Verify screen-reader values and reduced-motion behavior with no false success.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:511a2d0745aefff8c2e752627af3374c6c20ab6251d4490815ef9c596f659d43"},{"id":"design-toast","group":"guide","category":"Application design","title":"Temporary messages","summary":"Confirm a small completed interaction without hiding important failures.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-toast?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"When to use"},{"id":"structure","title":"Structure and rules"},{"id":"lightweight-feedback","title":"Lightweight feedback and semantics"},{"id":"duration-and-queue","title":"Reading time and queue"},{"id":"task-and-window-scope","title":"Task and window scope"},{"id":"responsive-content","title":"Responsive text and actions"},{"id":"interaction","title":"Behavior and states"},{"id":"validation","title":"Adaptation and verification"}],"markdown":"# Temporary messages\n\nConfirm a small completed interaction without hiding important failures.\n\n<a id=\"usage\"></a>\n\n## When to use\n\nUse a toast for a brief confirmed outcome such as a successful copy. A validation error belongs near the field; a consequential failure or unknown write result needs persistent recovery. Never use a disappearing toast as the only evidence of a payment or permission change.\n\n<a id=\"structure\"></a>\n\n## Structure and rules\n\n[design-component-toast](https://open.limeai.run/docs/design-toast?locale=en#structure)\n\n| Element | Rule |\n| --- | --- |\n| Content | Use a short factual result, not a second task heading or a vague success claim. |\n| Duration | Allow enough reading time, pause appropriately for interaction and keep actionable essential content elsewhere. |\n| Stacking | Deduplicate repeated messages and limit visible stack size without covering active controls. |\n\n<a id=\"lightweight-feedback\"></a>\n\n## Lightweight feedback and semantics\n\nUse a toast for a brief, nonblocking response that can be safely missed. Information, success, warning, failure and loading are semantic patterns, not a claim that Lime exports five toast APIs. Avoid a redundant toast when a simple reversible action already has an obvious immediate result. Critical errors and unknown writes need persistent recovery.\n\n<a id=\"duration-and-queue\"></a>\n\n## Reading time and queue\n\nAllow at least about four seconds for a typical short message and more time when it contains an action or long text. Pause the timeout on hover and focus. Deduplicate identical feedback and limit concurrent items so newer messages do not obscure unresolved work. A persistent loading toast ends only when its actual task completes, fails or is canceled.\n\n<a id=\"task-and-window-scope\"></a>\n\n## Task and window scope\n\nShow feedback in the browser tab where its task started, including when a dialog triggered it. Switching tabs must not move task feedback into an unrelated task. Lime web pages do not acquire the reference's operating-system, native application or mini-program toast channels; use the current web surface and its real notification contract.\n\n<a id=\"responsive-content\"></a>\n\n## Responsive text and actions\n\nBound the toast by the current viewport with side margins, let explanatory text wrap and move an action to its own row when needed. Keep icon, close control and the first line aligned. Truncation must not remove the consequence or recovery, and every icon-only dismissal needs an accessible name.\n\n<a id=\"interaction\"></a>\n\n## Behavior and states\n\nAnnounce without taking focus. A dismiss or undo control is keyboard accessible, and undo must map to a real supported reversible action. A source window closing does not authorize sending a task result to an unrelated account or tab.\n\n<a id=\"validation\"></a>\n\n## Adaptation and verification\n\n1. Test rapid repeated events, long translations, a focused control near the toast and dismissal.\n2. Verify errors and unknown results remain recoverable after the temporary message disappears.\n\n[Shared design baseline](https://open.limeai.run/docs/design-overview?locale=en)\n\n[Responsive design](https://open.limeai.run/docs/design-responsive?locale=en)\n","revision":"sha256:8440279f5ab2da3ce5c04b4ee8b91d57c8ed83b7342060adeee6b690d7db2ebe"},{"id":"identity-examples","group":"guide","category":"Understand the platform","title":"Identity across applications","summary":"Follow one person across personal, organization and client contexts without merging their permissions.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/identity-examples?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"personal","title":"A personal web application"},{"id":"organization","title":"The same person in an organization"},{"id":"clients","title":"Desktop and web clients"}],"markdown":"# Identity across applications\n\nFollow one person across personal, organization and client contexts without merging their permissions.\n\n<a id=\"personal\"></a>\n\n## A personal web application\n\nA person signs in through a registered web client. After validating the ID Token, your application maps (iss, sub) to its local account. The person's personal space may own applications or purchases, but the external identity assertion is not itself an instruction to expose those assets.\n\n[platform-architecture](https://open.limeai.run/docs/identity-examples?locale=en#personal)\n\n<a id=\"organization\"></a>\n\n## The same person in an organization\n\nThe person joins an organization and uses an installed application. Membership, installation audience, individual consent and any paid beneficiary are separate records. Leaving the organization removes its current access while preserving the person's independent personal account and assets.\n\n[Space ownership](https://open.limeai.run/docs/account-spaces?locale=en)\n\n<a id=\"clients\"></a>\n\n## Desktop and web clients\n\nA second client sector can receive a different pairwise subject for the same person. Do not correlate these values by guessing or email matching. A deliberate user-confirmed linking process is needed when your product requires a shared account across independently registered sectors.\n\n[Identifier boundaries](https://open.limeai.run/docs/user-identifiers?locale=en)\n","revision":"sha256:e6a2d152ba3bd69306fc4ce12b4a2f3420bf67db12a16130f821299ba4154c88"},{"id":"choose-identifiers","group":"guide","category":"Understand the platform","title":"Choose the correct resource identifier","summary":"Match each API field to its resource type and current authorization context.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/choose-identifiers?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"map","title":"Identify the object before choosing its ID"},{"id":"isolation","title":"Keep identifiers opaque and scoped"},{"id":"changes","title":"Handle a stale selection"}],"markdown":"# Choose the correct resource identifier\n\nMatch each API field to its resource type and current authorization context.\n\n<a id=\"map\"></a>\n\n## Identify the object before choosing its ID\n\n| Task | Identifier |\n| --- | --- |\n| External account mapping | Verified issuer plus pairwise subject. |\n| Configure a product | ApplicationID from an authorized application record. |\n| Request OAuth authorization | The registered ClientID, not ApplicationID or a Secret. |\n| Manage a member or installation | The exact record ID plus authorized owning space/application context. |\n\n<a id=\"isolation\"></a>\n\n## Keep identifiers opaque and scoped\n\nDo not parse meaning from prefixes, numeric order or display labels. A valid ID from another space or application remains unauthorized. The backend must resolve the target under the current actor and expected owner, rather than trusting a user-supplied space field.\n\n<a id=\"changes\"></a>\n\n## Handle a stale selection\n\n1. Read IDs from authorized list/detail responses and retain the exact target context.\n2. If a resource disappears or access is removed, refresh the permitted choices and ask the user to select again.\n3. Do not substitute another similar name or infer that the ID can be converted into another platform's identity.\n\n[Find identifiers](https://open.limeai.run/docs/get-identifiers?locale=en)\n","revision":"sha256:a6a2679e608ef5b9da98f909682ec42458d5a8f591d575b328bffed7106e47cb"},{"id":"get-identifiers","group":"guide","category":"Understand the platform","title":"Find user and application identifiers","summary":"Read permitted identifiers from their authoritative protocol or resource response.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/get-identifiers?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"Read the authenticated subject"},{"id":"resources","title":"Read resource IDs from authorized records"},{"id":"limits","title":"Avoid unsupported conversions"}],"markdown":"# Find user and application identifiers\n\nRead permitted identifiers from their authoritative protocol or resource response.\n\n<a id=\"identity\"></a>\n\n## Read the authenticated subject\n\n1. Complete an approved OIDC user flow with the required identity scopes.\n2. Validate the ID Token and use its exact iss/sub pair. If UserInfo is requested, require a matching sub.\n3. Handle absent profile/email claims without guessing an identity from the display name.\n\n[UserInfo response](https://open.limeai.run/docs/api?operation=identity_userinfo&locale=en)\n\n<a id=\"resources\"></a>\n\n## Read resource IDs from authorized records\n\nFind an App ID in the application's authorized detail/list. Find a Client ID in that application's registered OAuth clients. Find a space/membership/installation ID in its own permitted response. Copying a browser URL is useful only if the operation contract confirms the same identifier.\n\n<a id=\"limits\"></a>\n\n## Avoid unsupported conversions\n\nThere is no general endpoint to convert email into arbitrary users or to convert Feishu open_id/union_id into Lime identities. Request only data required by your task and never export a directory by probing identifiers. A missing field may reflect a scope or permission boundary.\n\n[Choose a field](https://open.limeai.run/docs/choose-identifiers?locale=en)\n\n[Identity claims](https://open.limeai.run/docs/userinfo?locale=en)\n","revision":"sha256:3f2d3371736fe07fd63e03a0d4c65d64252cfd3655908ae701c246ff1b0ec21d"},{"id":"web-development-workflow","group":"guide","category":"Build an integration","title":"Web integration workflow","summary":"Build a web journey from registration through server-side session and publication.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-development-workflow?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"Register the intended architecture"},{"id":"implement","title":"Implement the complete transaction"},{"id":"test","title":"Test and publish"}],"markdown":"# Web integration workflow\n\nBuild a web journey from registration through server-side session and publication.\n\n<a id=\"prepare\"></a>\n\n## Register the intended architecture\n\nChoose a backend-mediated session when the product has a server. Register a confidential user client whose secret remains on that backend; a browser-only application uses a public client without a secret. Decide the exact issuer and callbacks for each environment before adding login UI.\n\n[Configure the web client](https://open.limeai.run/docs/web-application-configuration?locale=en)\n\n<a id=\"implement\"></a>\n\n## Implement the complete transaction\n\n1. Generate state, nonce and S256 PKCE, then redirect the browser to the discovered authorization endpoint.\n2. Validate callback state and exchange the one-time code using the original callback and verifier.\n3. Validate identity, establish the application session and return only to an allowlisted local route.\n\n<a id=\"test\"></a>\n\n## Test and publish\n\nTest cancellation, an expired code, cross-tab state, absent optional claims and revoked access. Deploy your actual web code independently, then freeze/review/publish the platform configuration. The reference Node/Python tutorials show standards-based integration; they do not introduce a proprietary browser JSSDK.\n\n[Node.js tutorial](https://open.limeai.run/docs/node-web-tutorial?locale=en)\n\n[Python tutorial](https://open.limeai.run/docs/python-web-tutorial?locale=en)\n\n[Publish a web entry](https://open.limeai.run/docs/web-publication?locale=en)\n","revision":"sha256:3ebaaa53755a4fe57fe29a436d97d6c5e0ddb2fc4acc727fc9365197a22168ac"},{"id":"web-application-configuration","group":"guide","category":"Build an integration","title":"Configure a web application","summary":"Register a web entry and an OAuth callback for distinct purposes.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-application-configuration?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"entry","title":"Choose the public entry"},{"id":"register","title":"Register the environment and callback"},{"id":"verify","title":"Verify the customer entry"}],"markdown":"# Configure a web application\n\nRegister a web entry and an OAuth callback for distinct purposes.\n\n<a id=\"entry\"></a>\n\n## Choose the public entry\n\nThe entry is where a user starts the product; the OAuth callback processes a one-time protocol response. They can be different paths and must not be confused. A public entry may show a signed-out state and start login only when the task requires it.\n\n<a id=\"register\"></a>\n\n## Register the environment and callback\n\n1. Set the intended application and client environment, type and allowed identity scopes.\n2. Register an exact callback; production requires HTTPS and sandbox loopback still requires the registered port.\n3. Keep secrets on the backend and compare the returned Discovery issuer before using endpoints.\n\n[Callback rules](https://open.limeai.run/docs/callback-validation?locale=en)\n\n<a id=\"verify\"></a>\n\n## Verify the customer entry\n\nOpen the entry as a signed-out visitor and an eligible/denied signed-in user. Check that a safe return route survives authentication without replaying a write. Home-page configuration does not authorize loading untrusted remote code into a session-bearing platform host.\n\n[Host boundaries](https://open.limeai.run/docs/custom-domains?locale=en)\n","revision":"sha256:84c12a1497a52499e3049554f16cac89786f5a31756690344c76897ead725d37"},{"id":"web-publication","group":"guide","category":"Launch and maintain","title":"Publish and access a web application","summary":"Align the deployed product with a specific reviewed platform configuration.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-publication?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"deploy","title":"Deploy the real product first"},{"id":"release","title":"Publish the intended configuration"},{"id":"customer","title":"Verify the installed user journey"}],"markdown":"# Publish and access a web application\n\nAlign the deployed product with a specific reviewed platform configuration.\n\n<a id=\"deploy\"></a>\n\n## Deploy the real product first\n\nBuild and deploy your own web application using its normal delivery process. Check TLS, public entry, exact production callback, backend secret storage and error recovery. A platform release stores configuration; it does not deploy the code behind your entry URL.\n\n<a id=\"release\"></a>\n\n## Publish the intended configuration\n\n1. Freeze the entry/client/scope revisions intended for review.\n2. Complete independent review and explicitly publish the approved version.\n3. Enable only clients eligible under the actual production lifecycle and confirm the published application detail.\n\n<a id=\"customer\"></a>\n\n## Verify the installed user journey\n\nAs a customer, follow discovery, installation where required, individual consent, sign-in and the target task. Test a user outside the permitted installation audience. Neither a direct web URL nor an approved release bypasses resource permission or a separate commercial entitlement.\n\n[Publication controls](https://open.limeai.run/docs/publish-marketplace-application?locale=en)\n\n[Audience](https://open.limeai.run/docs/application-availability?locale=en)\n","revision":"sha256:7243c8bc223ce97475d6f915c3bc295ee5cceccbc0c92f6f535613352ebd25a3"},{"id":"external-links","group":"guide","category":"Build an integration","title":"External links and system browsers","summary":"Open destinations deliberately without leaking credentials or trusting a proprietary host.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/external-links?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"destination","title":"Validate the destination"},{"id":"browser","title":"Choose normal browser behavior"},{"id":"host","title":"Keep host capabilities explicit"}],"markdown":"# External links and system browsers\n\nOpen destinations deliberately without leaking credentials or trusting a proprietary host.\n\n<a id=\"destination\"></a>\n\n## Validate the destination\n\nUse HTTPS links to an expected origin. If a user-supplied URL is supported, parse and validate its scheme and allowed destination; never execute javascript: or use a suffix test that accepts lookalike hosts. Do not add a token, device code or secret to an outgoing link.\n\n<a id=\"browser\"></a>\n\n## Choose normal browser behavior\n\n1. Tell the user when a link opens a new site or application and use a real accessible link.\n2. For native sign-in, prefer the system browser and a supported registered callback/device flow.\n3. For a new browser tab, apply appropriate opener isolation and preserve a safe route back.\n\n<a id=\"host\"></a>\n\n## Keep host capabilities explicit\n\nFeishu open-browser flags and AppLink schemes are host-specific. Lime does not expose them as generic URL parameters or client APIs. A custom native URI scheme is also not a supported substitute for the current exact HTTPS/allowed sandbox callback registration.\n\n[Native integration](https://open.limeai.run/docs/native-application?locale=en)\n\n[Safe callback](https://open.limeai.run/docs/callback-validation?locale=en)\n","revision":"sha256:aac0a7f06661b9995e81fd6abac4bdb1a8fc15ded5a2c49c2f08bf225921c368"},{"id":"browser-cookies","group":"guide","category":"Build an integration","title":"Cross-origin cookies and embedding","summary":"Design login to work under browser isolation instead of depending on third-party cookies.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/browser-cookies?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"boundaries","title":"Understand origin and site boundaries"},{"id":"flow","title":"Use a top-level authorization journey"},{"id":"test","title":"Test realistic restrictions"}],"markdown":"# Cross-origin cookies and embedding\n\nDesign login to work under browser isolation instead of depending on third-party cookies.\n\n<a id=\"boundaries\"></a>\n\n## Understand origin and site boundaries\n\nA browser may block or partition third-party cookies, especially in embedded frames. CORS controls permitted cross-origin reads; it does not share a session, disable CSRF or grant a different host access. Cookies and local storage have different host/origin rules.\n\n<a id=\"flow\"></a>\n\n## Use a top-level authorization journey\n\n1. Start OAuth through the trusted top-level system/browser context with state, nonce and PKCE.\n2. Return to an exact callback and establish the application's own appropriately scoped session.\n3. Treat a blocked embedded session as a recoverable browser limitation, with a safe open-in-browser option.\n\n<a id=\"test\"></a>\n\n## Test realistic restrictions\n\nTest Safari/iOS and Chromium with third-party cookies blocked, private browsing and a fresh signed-out profile. Do not set a cookie across all platform subdomains or claim Lime's custom-domain/embedded-hosting scope is complete. iframe allow policies and postMessage origins need explicit validation if your own product uses them.\n\n[Web sessions](https://open.limeai.run/docs/web-application?locale=en)\n\n[Local cache isolation](https://open.limeai.run/docs/local-cache-isolation?locale=en)\n","revision":"sha256:c5b77b2624a8736b412ea44df99bdfca85cc8780c2769366015d9b26bb9f534b"},{"id":"mobile-login","group":"guide","category":"Authorization flows","title":"Mobile application login","summary":"Use standard browser-mediated identity while respecting current callback support.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/mobile-login?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"client","title":"Treat distributed software as public"},{"id":"choose","title":"Choose a supported completion path"},{"id":"lifecycle","title":"Handle interruption and secure storage"}],"markdown":"# Mobile application login\n\nUse standard browser-mediated identity while respecting current callback support.\n\n<a id=\"client\"></a>\n\n## Treat distributed software as public\n\nA mobile application cannot keep a compiled-in client secret private. Register an appropriate public user client and keep the issuer and client identity explicit. Lime has not shipped a dedicated iOS/Android/Harmony host SDK or automatic native packaging service.\n\n<a id=\"choose\"></a>\n\n## Choose a supported completion path\n\nUse the system browser with S256 PKCE only when the application can complete an approved exact callback under the current registration contract. Do not invent a custom URI scheme or Feishu AppLink callback. When the callback cannot be supported, use an approved device authorization journey instead.\n\n[Device authorization](https://open.limeai.run/docs/device-authorization-flow?locale=en)\n\n[Supported callbacks](https://open.limeai.run/docs/callback-validation?locale=en)\n\n<a id=\"lifecycle\"></a>\n\n## Handle interruption and secure storage\n\n1. Keep pending authorization bound to its original state and deadline across a supported app transition.\n2. Store granted credentials in the platform credential store and serialize refresh rotation.\n3. On cancellation, process death or unresolved one-time exchange, offer a fresh explicit sign-in without replaying a stale code.\n\n[Native architecture](https://open.limeai.run/docs/native-application?locale=en)\n","revision":"sha256:98c03b8d414bff92d4675e8b50c44fbba4280ff56ea27397948c9b977746b298"},{"id":"user-consent","group":"guide","category":"Authorization flows","title":"User consent and granted scopes","summary":"Ask for the least necessary permission and respect the actual grant.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/user-consent?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"request","title":"Explain the permission before requesting it"},{"id":"decision","title":"Respect refusal and partial information"},{"id":"independent","title":"Keep other decisions independent"}],"markdown":"# User consent and granted scopes\n\nAsk for the least necessary permission and respect the actual grant.\n\n<a id=\"request\"></a>\n\n## Explain the permission before requesting it\n\nName the application, feature, requested data and relevant space/installation. Request openid for identity and profile/email/offline_access only when needed. Controlled management scopes are reserved to explicitly provisioned CLI clients and cannot be self-added by a normal third-party client.\n\n<a id=\"decision\"></a>\n\n## Respect refusal and partial information\n\n1. Handle access_denied as a user decision and provide a safe return; do not loop consent until approval.\n2. Read returned scope and optional claims instead of assuming every requested value was granted.\n3. For a new feature, request any additional supported permission through a new explicit authorization.\n\n<a id=\"independent\"></a>\n\n## Keep other decisions independent\n\nOrganization installation approval, user OAuth consent, application collaboration, purchase and marketing preference serve different purposes. None implies the others. Resource permission is checked against current membership and context even after a user has consented.\n\n[Scope catalogue](https://open.limeai.run/docs/scopes?locale=en)\n\n[Audience boundary](https://open.limeai.run/docs/application-availability?locale=en)\n","revision":"sha256:2a20122c6b4ccd2a4f550766d17e843a675a932b8d9016a6e909261986179e15"},{"id":"local-cache-isolation","group":"guide","category":"Development standards","title":"Sign-out and local cache isolation","summary":"Keep cached data and pending work scoped to the account, space and application that created them.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/local-cache-isolation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"scope","title":"Partition application state"},{"id":"switch","title":"Cancel and clear on context changes"},{"id":"credentials","title":"Treat credentials separately"}],"markdown":"# Sign-out and local cache isolation\n\nKeep cached data and pending work scoped to the account, space and application that created them.\n\n<a id=\"scope\"></a>\n\n## Partition application state\n\nKey private caches by authenticated account, space, application and environment as applicable. Browser localStorage is origin-scoped, not an account boundary. A different user on the same browser must not see a prior user's cached data, drafts or pending commands.\n\n<a id=\"switch\"></a>\n\n## Cancel and clear on context changes\n\n1. On sign-out or account/space switching, cancel obsolete reads and mark their responses ineligible to update the current view.\n2. Clear private visible data and account-scoped caches according to policy; preserve only permitted non-sensitive preferences.\n3. Never replay a previous account's pending write after another account signs in.\n\n<a id=\"credentials\"></a>\n\n## Treat credentials separately\n\nUse the backend/OS credential store rather than casual localStorage for long-lived grants. Sign-out clears the application's own session, and remote grant revocation follows the supported endpoint. Lime cannot promise a Feishu host will automatically clear your independent application's origin storage.\n\n[Revocation](https://open.limeai.run/docs/token-revocation?locale=en)\n\n[Browser isolation](https://open.limeai.run/docs/browser-cookies?locale=en)\n","revision":"sha256:a6fcc152973f2c55eb98555c439fdd7bc6ce6f2fedd56a72d5376faf91b1535d"},{"id":"version-activation","group":"guide","category":"Launch and maintain","title":"When configuration changes take effect","summary":"Track draft, frozen release, publication, client activation and customer installation separately.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/version-activation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"draft","title":"Draft edits are not a published version"},{"id":"gates","title":"Evaluate the applicable gates"},{"id":"diagnose","title":"Diagnose a missing change"}],"markdown":"# When configuration changes take effect\n\nTrack draft, frozen release, publication, client activation and customer installation separately.\n\n<a id=\"draft\"></a>\n\n## Draft edits are not a published version\n\nAn editable configuration revision records current development changes. A frozen release captures specific revisions for independent review. Changing the draft after freezing cannot silently modify the reviewed snapshot or a historical public version.\n\n[application-lifecycle](https://open.limeai.run/docs/version-activation?locale=en#draft)\n\n<a id=\"gates\"></a>\n\n## Evaluate the applicable gates\n\n| Gate | Meaning |\n| --- | --- |\n| Review approval | The frozen version passed an independent decision, not automatic publication. |\n| Publication | The exact version becomes available under its distribution policy. |\n| Client activation | Production client use satisfies its lifecycle and deployment requirements. |\n| Installation/consent | Customer space and user approve the applicable release/scopes separately. |\n\n<a id=\"diagnose\"></a>\n\n## Diagnose a missing change\n\n1. Compare the draft revision, release snapshot and currently published release ID.\n2. Confirm client environment/activation and the customer's actual installation/consent.\n3. Refresh a stale read only after confirming the authoritative state; do not expand permission to make a preview work.\n\n[Release records](https://open.limeai.run/docs/releases?locale=en)\n","revision":"sha256:663c71358b756913304e6d1197496679effe093cf973aa166a3b5f162fc1948b"},{"id":"token-request-security","group":"guide","category":"Development standards","title":"Secure token requests","summary":"Use form POST and registered client authentication without leaking sensitive parameters.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/token-request-security?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"transport","title":"Use the discovered HTTPS endpoint"},{"id":"client","title":"Authenticate the registered client"},{"id":"response","title":"Protect the returned grant"}],"markdown":"# Secure token requests\n\nUse form POST and registered client authentication without leaking sensitive parameters.\n\n<a id=\"transport\"></a>\n\n## Use the discovered HTTPS endpoint\n\nRead token_endpoint from trusted Discovery. Send application/x-www-form-urlencoded POST with the grant-specific parameters. Do not put code, refresh_token, secret or an access token into GET query parameters, copied URLs or browser-visible diagnostics.\n\n<a id=\"client\"></a>\n\n## Authenticate the registered client\n\nPublic clients send their client_id without a secret. Confidential/machine clients use client_secret_basic as registered; encode client ID and secret separately before Basic construction. The current contract does not support client_secret_post. Do not retry a failed confidential client as public.\n\n<a id=\"response\"></a>\n\n## Protect the returned grant\n\n1. Parse plain OAuth JSON and actual token_type, scope and expires_in.\n2. Store credentials in backend/OS storage and exclude them from logs and support export.\n3. Respect one-time authorization codes and serial refresh rotation; unknown responses need the matching recovery flow.\n\n[Token request schema](https://open.limeai.run/docs/api?operation=identity_token&locale=en)\n\n[Refresh recovery](https://open.limeai.run/docs/refresh-token-flow?locale=en)\n","revision":"sha256:44fa4eeef77823c011a80f6d8bdbbaf0192cef5f42d155632b1ccc7361820c2b"},{"id":"token-compatibility","group":"guide","category":"Development standards","title":"Token format and compatibility","summary":"Treat bearer credentials as opaque and validate identity assertions through supported libraries.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/token-compatibility?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"opaque","title":"Do not depend on incidental formatting"},{"id":"assertion","title":"Validate ID Tokens as assertions"},{"id":"upgrade","title":"Test storage and proxy limits"}],"markdown":"# Token format and compatibility\n\nTreat bearer credentials as opaque and validate identity assertions through supported libraries.\n\n<a id=\"opaque\"></a>\n\n## Do not depend on incidental formatting\n\nDo not assume an access or refresh token has a fixed length, prefix, number of segments or decodable account ID. Store the complete value within a defensible size limit, send it unchanged through the declared header/form and exclude it from logs. A regex copied from a prior release is not a verification method.\n\n<a id=\"assertion\"></a>\n\n## Validate ID Tokens as assertions\n\nAn ID Token has a defined JWT validation procedure including signature, allowed algorithm, issuer, audience, time and transaction nonce. Merely decoding Base64 does not verify it. A resource API access token and an ID Token remain different credentials even when both happen to look like JWTs.\n\n<a id=\"upgrade\"></a>\n\n## Test storage and proxy limits\n\n1. Test the full supported token size through your header, proxy, SDK and credential store without truncation.\n2. Handle key rotation and optional response fields through the library/contract rather than fixed string parsing.\n3. Pin and review dependencies when upgrading, then rerun authorization, refresh and revocation.\n\n[ID Token validation](https://open.limeai.run/docs/id-token-validation?locale=en)\n\n[Migration checks](https://open.limeai.run/docs/platform-updates?locale=en)\n","revision":"sha256:b61d42284e68e88d0345ed14014a27364ffe02a20630a58219104446fb80efd0"},{"id":"tls-troubleshooting","group":"guide","category":"Troubleshooting","title":"HTTPS and certificate failures","summary":"Resolve transport trust before diagnosing an OAuth or API response.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/tls-troubleshooting?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# HTTPS and certificate failures\n\nResolve transport trust before diagnosing an OAuth or API response.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nA browser/CLI certificate error occurs before a trustworthy API response. Record the exact expected host and redacted error, but do not disable certificate validation to make login or a production call work. A public server certificate and a client secret solve unrelated problems.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Host and clock | Check the configured issuer/API Origin, hostname match, local time and certificate validity. |\n| Chain and proxy | Inspect trusted chain and an approved corporate proxy; do not import arbitrary roots from a failed page. |\n| Local development | Use the repository's intended local HTTPS setup or an explicitly allowed loopback callback, keeping environment boundaries. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Verify reachability to the expected host without sending credentials to an alternate origin.\n2. Have the responsible owner repair the certificate/chain or approved trust configuration, then re-run Discovery.\n3. After transport succeeds, diagnose the actual HTTP/protocol response separately.\n\n[Connection configuration](https://open.limeai.run/docs/development-environment?locale=en)\n\n[Trusted Discovery](https://open.limeai.run/docs/oidc-discovery?locale=en)\n","revision":"sha256:5d4788ece4ea38d5b02a8507a44bc25d6a487797fb7fd50695e90641644d64eb"},{"id":"credential-selection","group":"guide","category":"Troubleshooting","title":"Choose the correct token","summary":"Use each credential only for its intended recipient and grant.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/credential-selection?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Choose the correct token\n\nUse each credential only for its intended recipient and grant.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nA valid-looking token can still be the wrong credential. Determine whether the task is client sign-in, a user resource call, grant renewal or an approved machine operation. Do not try each available token until one passes.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| ID Token | Verified client identity assertion; not the resource API Bearer token. |\n| Access token | Call only its allowed audience/resource and granted scopes, with current permission checks. |\n| Refresh token | Only renew its original user grant at the token endpoint, with serialized rotation. |\n| Machine token | Only approved machine resources; cannot call the dedicated user management API. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Confirm issuer, registered client and target audience without logging the credential.\n2. Inspect actual returned scope and expiry, then select the documented flow for that resource.\n3. If the grant is wrong, obtain a new explicit authorization instead of relabelling the old token.\n\n[Token reference](https://open.limeai.run/docs/tokens?locale=en)\n\n[Management prerequisites](https://open.limeai.run/docs/management-api?locale=en)\n","revision":"sha256:92fe5954b7d8fcf656fb4c88ade95d1571354ab6b949a9777bd091bc9b4121bc"},{"id":"application-identifiers","group":"guide","category":"Troubleshooting","title":"Find App ID and Client ID","summary":"Distinguish the product record from its registered callers and credentials.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-identifiers?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Find App ID and Client ID\n\nDistinguish the product record from its registered callers and credentials.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nUsing ApplicationID as OAuth client_id leads to a registration mismatch. A product can have several environment/type-specific clients. A Secret authenticates an eligible client but is not its identifier and must not be copied into a support report.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Application | Read the stable App ID from the authorized application list/detail. |\n| Client | Read Client ID, type, environment and activation from the application's OAuth client record. |\n| Context | Verify the owning space and API Origin rather than assuming an ID from another deployment is portable. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Select the intended application under the correct account/space.\n2. Select the matching sandbox/production client and compare its exact callback and permitted scopes.\n3. Update the application configuration, then restart a fresh authorization transaction.\n\n[Object model](https://open.limeai.run/docs/application-concepts?locale=en)\n\n[Identifier sources](https://open.limeai.run/docs/get-identifiers?locale=en)\n","revision":"sha256:5b7793524f2513643ba9579df255e358d5410d3395699fdfea15dec8fbaced22"},{"id":"missing-grant","group":"guide","category":"Troubleshooting","title":"User has not granted a required scope","summary":"Explain a missing grant without repeatedly prompting or bypassing consent.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/missing-grant?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# User has not granted a required scope\n\nExplain a missing grant without repeatedly prompting or bypassing consent.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nA registered allowed scope and a requested scope do not prove the user granted it. Check the actual token response and the feature's required scope. A separate membership or application ACL failure can remain even when the OAuth scope is present.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Client eligibility | Confirm the registered client may request the scope; normal third parties cannot self-request controlled management scopes. |\n| Actual grant | Compare returned granted scope with the exact operation requirement; read/write scopes do not imply each other. |\n| Current access | Check member/role, app/environment ACL and installation separately. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Show the feature and minimum missing permission, with a clear cancel/return option.\n2. If allowed, start a new explicit user authorization for that scope and respect denial.\n3. Recheck actual grant and current resource permission before resubmitting the retained command.\n\n[Consent behavior](https://open.limeai.run/docs/user-consent?locale=en)\n\n[Scope catalogue](https://open.limeai.run/docs/scopes?locale=en)\n","revision":"sha256:56225ffd0ee9e43f66d9851b187eead1d92ef34e5c14d2c686abc174a5af0179"},{"id":"invalid-token","group":"guide","category":"Troubleshooting","title":"Invalid or expired access token","summary":"Distinguish expiry, wrong resource and revoked access without unsafe fallback.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/invalid-token?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Invalid or expired access token\n\nDistinguish expiry, wrong resource and revoked access without unsafe fallback.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nA 401 or OAuth invalid_token concerns the submitted credential, but the cause can be expiry, wrong issuer/audience or invalid grant. A 403 may instead be a current resource permission problem. Keep the exact stable code and request identifier without recording the token.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Transport | Use the complete credential in the declared Bearer header and the correct API Origin. |\n| Lifetime | Use expires_in/server policy and verify local clock; do not edit an expiry claim locally. |\n| Resource | Check audience, dedicated client and actual scope; an ID or machine token is not a substitute. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Refresh the same supported user grant once under a serialized lock, if it remains valid.\n2. On invalid_grant or unknown refresh rotation, stop replay and request a new interactive authorization.\n3. Require review of the original write after reauthentication and never retry indefinitely.\n\n[Refresh recovery](https://open.limeai.run/docs/refresh-token-flow?locale=en)\n\n[Credential types](https://open.limeai.run/docs/credential-selection?locale=en)\n","revision":"sha256:ee595c576ad5cf2fcfe19ae75c4ea185a09e2db5918b055d70cdba3ba181dfb8"},{"id":"login-troubleshooting","group":"guide","category":"Troubleshooting","title":"Sign-in and authorization-code failures","summary":"Locate the failing login stage before changing identity or permission settings.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/login-troubleshooting?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Sign-in and authorization-code failures\n\nLocate the failing login stage before changing identity or permission settings.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nSeparate opening authorization, signing in, user consent, returning to the callback, exchanging the code and validating identity. A browser sign-in success does not prove consent or code exchange completed. Preserve the redacted stage/error and original transaction deadline.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Authorize | Check client activation, exact redirect, code/query mode, supported prompt and permitted scope. |\n| Transaction | Match state, nonce and original S256 verifier; concurrent tabs need distinct transactions. |\n| Exchange | Use a form POST, registered client authentication, exact original redirect and an unexpired unused code. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Handle a user's denial or a silent login_required/consent_required with a safe interactive return.\n2. Restart a stale or unknown one-time transaction rather than replaying its code.\n3. Validate the returned ID Token completely before creating a local session.\n\n[Code flow](https://open.limeai.run/docs/authorization-code-flow?locale=en)\n\n[Callback validation](https://open.limeai.run/docs/callback-validation?locale=en)\n","revision":"sha256:da7a2057f99107a191042f38e2416c0e3ef45cf2850e9a869528d6c03a9252aa"},{"id":"credentials-faq","group":"guide","category":"Troubleshooting","title":"Credential storage and lifecycle questions","summary":"Choose where credentials live and how they expire, rotate and leave the application.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/credentials-faq?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Credential storage and lifecycle questions\n\nChoose where credentials live and how they expire, rotate and leave the application.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nCredentials follow the registered client and grant, not a global application password. A public binary cannot hide a secret, and refreshing a grant does not expand permissions or restore revoked resource access. A successful npm install does not provision a live CLI client.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Backend | Store secrets/refresh tokens in approved server secret storage, with least-privilege access. |\n| Native / CLI | Use OS credential storage and serialize token rotation; keep configuration separate from secrets. |\n| Browser | Prefer an appropriate backend session where possible and never embed a client secret. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Read actual expiry/scope from the response and do not infer validity from a decoded string.\n2. On sign-out, clear the application's own session and use revocation when intended and supported.\n3. If exposure is suspected, rotate/disable the affected credential and follow the incident process.\n\n[Rotate a secret](https://open.limeai.run/docs/client-secret-rotation?locale=en)\n\n[Revoke a grant](https://open.limeai.run/docs/token-revocation?locale=en)\n","revision":"sha256:011a837dc3e7c86d6e9d90b7203f733f18610abeb7bebe885e5a7ebc61320390"},{"id":"permissions-faq","group":"guide","category":"Troubleshooting","title":"Application permissions and data scope","summary":"Trace a permission denial through client, subject and resource boundaries.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/permissions-faq?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Application permissions and data scope\n\nTrace a permission denial through client, subject and resource boundaries.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nOAuth scope limits delegated API use but does not make every resource readable. Current member/role, app/environment ACL, installation, recent authentication and operation policy still apply. A browser menu being visible or a user being an organization owner is insufficient.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Domain | Use the correct open/account/operations/admin scope; read and write are independent. |\n| Resource | Verify the exact owning space, application, environment and target record. |\n| Sensitive action | Keep recent strong authentication and independent review where required. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Read the stable denial code and identify the failed boundary without broadening every scope.\n2. Have an eligible owner correct only the missing role/ACL/install grant through its real flow.\n3. Re-read current access and ask the user to review the original action before retrying.\n\n[Members and roles](https://open.limeai.run/docs/members-permissions?locale=en)\n\n[Management contract](https://open.limeai.run/docs/management-api?locale=en)\n","revision":"sha256:84e987c1af922e9a425f4f9c2633e0241b84c7c07ea43528ea7acd2dfae9bb36"},{"id":"webhook-troubleshooting","group":"guide","category":"Troubleshooting","title":"Event and callback failures","summary":"Separate endpoint verification, delivery acceptance and business processing.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-troubleshooting?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Event and callback failures\n\nSeparate endpoint verification, delivery acceptance and business processing.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nAn endpoint challenge, signed event delivery and an OAuth callback are different protocols. Inspect the exact failure stage and environment. HTTP acceptance is not proof that the downstream consumer or customer-facing task completed.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Reachability | Verify the configured HTTPS endpoint, certificate, bounded request handling and expected method. |\n| Signature | Use exact raw bytes, correct environment signing key and required timestamp/replay checks. |\n| Consumer | Follow stable event/source IDs through durable inbox, deduplication and processing outcome. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Fix the actual ingress or consumer error while retaining the original event.\n2. Retry/redeliver only under the supported authorized contract, not by generating another business command.\n3. Verify duplicate and out-of-order handling and inspect each independent consumer separately.\n\n[Signature verification](https://open.limeai.run/docs/webhook-signatures?locale=en)\n\n[Reliable consumers](https://open.limeai.run/docs/event-handler-design?locale=en)\n","revision":"sha256:9c8d5a80fa2ccf3bfeb23c6e9c54e08352c18d48b4b75e3856ef27695b46d3e8"},{"id":"application-troubleshooting","group":"guide","category":"Troubleshooting","title":"Application management and publication questions","summary":"Find the relevant ownership, revision and lifecycle state.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-troubleshooting?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Application management and publication questions\n\nFind the relevant ownership, revision and lifecycle state.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nA missing application may reflect the wrong owning space or removed collaboration, while a missing configuration change may reflect an old published release. Do not recreate the application or transfer ownership as a first diagnostic action.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Visibility | Check current user, owning space, collaborator role and allowed environment. |\n| Conflict | Compare current revision with the edited snapshot before overwriting another person's changes. |\n| Release | Read frozen snapshot, review decision, explicit publication and client activation separately. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Re-read the authorized record and preserve the intended unsaved values.\n2. Resolve revision differences with a deliberate new edit rather than a forced overwrite.\n3. For release issues, compare the exact version IDs and use the supported lifecycle operation.\n\n[Collaboration](https://open.limeai.run/docs/collaboration?locale=en)\n\n[Effective configuration](https://open.limeai.run/docs/version-activation?locale=en)\n","revision":"sha256:06735dccae4aa3b8992734cb72960b9a085a1f49069f73bc06684dd8ea2f3ce8"},{"id":"marketplace-troubleshooting","group":"guide","category":"Troubleshooting","title":"Listing, review and installation questions","summary":"Separate product discovery from publisher approval and customer access.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/marketplace-troubleshooting?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"Identify the failure"},{"id":"causes","title":"Check the relevant boundary"},{"id":"recovery","title":"Recover safely"}],"markdown":"# Listing, review and installation questions\n\nSeparate product discovery from publisher approval and customer access.\n\n<a id=\"symptoms\"></a>\n\n## Identify the failure\n\nA public listing does not prove a customer installed the application, and an approved release is not automatically published. An installation does not purchase a paid product. Check the exact transition before changing the public content or requesting broader permission.\n\n<a id=\"causes\"></a>\n\n## Check the relevant boundary\n\n| Check | What it establishes |\n| --- | --- |\n| Review | Inspect the frozen version and rejection reason; draft changes require a new reviewed snapshot. |\n| Distribution | Check published release, source policy, intended space and installation audience. |\n| Commerce | Read the original order/payment/entitlement and supported environment, not a listing paid flag. |\n\n<a id=\"recovery\"></a>\n\n## Recover safely\n\n1. Confirm the customer is entering the intended published application.\n2. Have an eligible space actor explicitly review installation and the user consent needed.\n3. Keep unfinished partner-admission and production billing scope labelled instead of offering a nonworking action.\n\n[Listing workflow](https://open.limeai.run/docs/marketplace-overview?locale=en)\n\n[Installation](https://open.limeai.run/docs/installations?locale=en)\n","revision":"sha256:cd96bc19d2d28b408cd1d34244369160f11a0fdad359738ec40df000fa7ea48c"},{"id":"publisher-requirements","group":"guide","category":"Launch and maintain","title":"Publisher operating requirements","summary":"Maintain accurate content, controlled access and a recoverable supported product.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/publisher-requirements?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"content","title":"Keep public claims accurate"},{"id":"access","title":"Review access and data use"},{"id":"continuity","title":"Preserve source facts during maintenance"}],"markdown":"# Publisher operating requirements\n\nMaintain accurate content, controlled access and a recoverable supported product.\n\n<a id=\"content\"></a>\n\n## Keep public claims accurate\n\nMaintain the product identity, language variants, privacy/terms and support route. Represent delivered features, environment limits and commercial terms truthfully. Do not claim Lime certification, a completed production provider or a dedicated SDK without the matching authorized release and verification.\n\n<a id=\"access\"></a>\n\n## Review access and data use\n\n1. Limit collaborators and operational roles to current duties, and remove temporary tester access after use.\n2. Keep data use within actual consent, installation and retention policy; do not monetize unrelated customer data.\n3. Rotate exposed credentials and maintain a documented incident owner and recovery path.\n\n<a id=\"continuity\"></a>\n\n## Preserve source facts during maintenance\n\nUse the reviewed lifecycle for configuration changes and source-domain recovery for payment/events. A catalogue withdrawal, software deployment or role change must not rewrite historical orders or pretend a missing external delivery succeeded. These are Lime operating guidelines, not copied Feishu agreements or a substitute for applicable legal terms.\n\n[Data protection](https://open.limeai.run/docs/data-protection?locale=en)\n\n[Incident response](https://open.limeai.run/docs/incident-response?locale=en)\n\n[Change management](https://open.limeai.run/docs/platform-updates?locale=en)\n","revision":"sha256:7823f3f739ef4c81e23eb3650c8bbb9b32c750bb74eb50c68826926aaa8e5045"},{"id":"client-overview","group":"client","category":"Client integration","title":"Client API overview","summary":"Connect web, desktop and mobile applications through standard identity protocols.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose-runtime","title":"Choose your runtime"},{"id":"capabilities","title":"Available client capabilities"},{"id":"library","title":"Choose an OIDC library"},{"id":"access","title":"Before testing"}],"markdown":"# Client API overview\n\nConnect web, desktop and mobile applications through standard identity protocols.\n\n<a id=\"choose-runtime\"></a>\n\n## Choose your runtime\n\nLime applications run on your own infrastructure or devices. Choose a client by where credentials can be protected, then register its exact callback and scopes. Web pages, native installations and backend services use separate client registrations.\n\n[Authorization crosses the system browser; application credentials stay within their trusted runtime.](https://open.limeai.run/docs/client-overview?locale=en#choose-runtime)\n\n| Runtime | Integration | Credential boundary |\n| --- | --- | --- |\n| Web application with a backend | Authorization code + S256 PKCE through the user's browser | Keep confidential-client credentials and tokens on the backend; issue an application session cookie. |\n| Browser-only application | Public client + S256 PKCE, subject to actual cross-origin endpoint policy | No shared secret; prefer a backend when tokens or callbacks cannot be protected. |\n| Desktop or mobile application | System-browser authorization with an allowed HTTPS callback, or device authorization | Public client; use the operating system's credential store. |\n| Terminal | Device authorization with the registered CLI client | Private local files and an explicit Auth/API binding |\n\n<a id=\"capabilities\"></a>\n\n## Available client capabilities\n\nDiscover OAuth/OIDC metadata, start browser authorization, exchange a code with PKCE, verify an ID token with an OIDC library, request UserInfo, refresh or revoke a grant, and use device authorization when a callback is impractical. The public API reference is the source of request fields and responses.\n\nLime currently exposes standard HTTPS protocols and the published CLI. It does not expose a client-host JavaScript bridge for camera, contacts, chat, native navigation or filesystem access. Use your platform's own web or operating-system APIs for those tasks.\n\n[Start a client integration](https://open.limeai.run/docs/client-quick-start?locale=en)\n\n[Public protocols](https://open.limeai.run/docs/api-overview?locale=en)\n\n[LimeCloud CLI](https://open.limeai.run/docs/cli-overview?locale=en)\n\n<a id=\"library\"></a>\n\n## Choose an OIDC library\n\nUse a maintained OIDC library for discovery, S256, state and nonce validation, signing-key rotation and ID-token verification. Check the chosen library's supported runtime, callback storage, client_secret_basic configuration and release policy. A library does not register clients or grant permissions for you.\n\n[SDK and integration approach](https://open.limeai.run/docs/sdk-integration?locale=en)\n\n[Node.js tutorial](https://open.limeai.run/docs/node-web-tutorial?locale=en)\n\n[Python tutorial](https://open.limeai.run/docs/python-web-tutorial?locale=en)\n\n<a id=\"access\"></a>\n\n## Before testing\n\n1. Create an application, choose sandbox and add the people who will test it.\n2. Register a public or confidential user client and the exact callback. Keep machine clients separate.\n3. Configure the needed OIDC scopes, complete an explicit user authorization and verify the callback before establishing your own session.\n\n[Register clients](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Client permissions](https://open.limeai.run/docs/client-permissions?locale=en)\n","revision":"sha256:adc68e9cd8253b1847f5c199d60f0b5f18fdd7db53b798a173dc4053c3c130c5"},{"id":"client-quick-start","group":"client","category":"Client integration","title":"Client quick start","summary":"Complete a browser sign-in and obtain a verified user profile.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-quick-start?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"1. Register the callback"},{"id":"discover","title":"2. Discover endpoints"},{"id":"transaction","title":"3. Create an authorization transaction"},{"id":"callback","title":"4. Validate the result"},{"id":"device","title":"When a callback is impractical"}],"markdown":"# Client quick start\n\nComplete a browser sign-in and obtain a verified user profile.\n\n<a id=\"prepare\"></a>\n\n## 1. Register the callback\n\nCreate a sandbox user client. For local backend development, register an exact loopback callback such as http://127.0.0.1:3000/callback. Production requires an explicitly registered HTTPS callback. Protocol, host, port, path and query must match; localhost and 127.0.0.1 are different callbacks.\n\n[Callback validation rules](https://open.limeai.run/docs/callback-validation?locale=en)\n\n<a id=\"discover\"></a>\n\n## 2. Discover endpoints\n\nConfigure a trusted Issuer. Compare the discovery issuer exactly and use the metadata returned by that trusted service. Never accept an arbitrary Issuer or token endpoint from a callback parameter.\n\n```sh\ncurl --fail --silent --show-error \\\n \"https://YOUR_AUTH_ORIGIN/.well-known/openid-configuration\"\n```\n\n[OIDC discovery](https://open.limeai.run/docs/oidc-discovery?locale=en)\n\n<a id=\"transaction\"></a>\n\n## 3. Create an authorization transaction\n\n1. Generate fresh cryptographically random state, nonce and a PKCE verifier. Derive code_challenge with SHA-256 and base64url; send only the challenge to the authorization endpoint.\n2. Bind those values, the exact callback, Issuer and Client ID to the initiating session with a short expiry. Save the transaction before redirecting.\n3. Navigate to /oauth/authorize with response_type=code, scope=openid profile, state, nonce, code_challenge and code_challenge_method=S256.\n\n[Authorization-code flow](https://open.limeai.run/docs/authorization-code-flow?locale=en)\n\n[Store the transaction safely](https://open.limeai.run/docs/client-storage?locale=en)\n\n<a id=\"callback\"></a>\n\n## 4. Validate the result\n\nUse the same initiating session to validate state before accepting either code or error. Consume the transaction once. Exchange a successful code at /oauth/token as form data with the original redirect_uri and verifier; a confidential client uses HTTP Basic. Check nonce, issuer, audience, signature and expiry through an OIDC library.\n\nFetch UserInfo with the access token, compare its sub with the verified ID-token subject and create your own application session. Remove code and state from the address bar. Present a clear retry action when the user declines or the transaction expires.\n\n[ID-token validation](https://open.limeai.run/docs/id-token-validation?locale=en)\n\n[User profile](https://open.limeai.run/docs/userinfo?locale=en)\n\n[Handle client errors](https://open.limeai.run/docs/client-errors?locale=en)\n\n<a id=\"device\"></a>\n\n## When a callback is impractical\n\nUse device authorization for terminals and constrained native applications. Show the service-provided verification URI and user code, let the user finish authorization in their own browser, and poll at the returned interval. Device authorization is a separate flow and does not send PKCE fields.\n\n[Device authorization](https://open.limeai.run/docs/device-authorization-flow?locale=en)\n\n[CLI device-login tutorial](https://open.limeai.run/docs/device-tutorial?locale=en)\n","revision":"sha256:b96687735ba793490d6ca099f1039318813398f702ff7caeb72d2fc7a27bd822"},{"id":"client-permissions","group":"client","category":"Client integration","title":"Client permissions and consent","summary":"Keep client registration, user consent, token scopes and resource authorization distinct.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-permissions?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"layers","title":"How access is evaluated"},{"id":"oidc","title":"OIDC profile scopes"},{"id":"delegation","title":"Delegated platform access"},{"id":"denied","title":"Declined, reduced and revoked access"}],"markdown":"# Client permissions and consent\n\nKeep client registration, user consent, token scopes and resource authorization distinct.\n\n<a id=\"layers\"></a>\n\n## How access is evaluated\n\n[A scope allows an entry point; each resource still checks current access.](https://open.limeai.run/docs/client-permissions?locale=en#layers)\n\n| Layer | Meaning |\n| --- | --- |\n| Client registration | The client may request only its configured scopes and permitted grants. |\n| User consent | The user reviews the application, scopes and any installation context before allowing access. |\n| Issued token | The token is bound to its client, audience, scope and lifetime; a local permission flag cannot expand it. |\n| Resource authorization | The service checks current membership, role, environment, installation and business prerequisites. |\n\n<a id=\"oidc\"></a>\n\n## OIDC profile scopes\n\n| Scope | Purpose |\n| --- | --- |\n| openid | Request an OIDC sign-in and a verified subject identifier. |\n| profile | Request the permitted profile fields, such as the display name. |\n| email | Request the permitted email fields; use sub for account identity. |\n| offline_access | Request a refresh token when the client and grant allow it; keep it in secure storage. |\n\n[Configure OAuth permissions](https://open.limeai.run/docs/scopes?locale=en)\n\n[Token types](https://open.limeai.run/docs/tokens?locale=en)\n\n<a id=\"delegation\"></a>\n\n## Delegated platform access\n\nThe dedicated platform CLI uses explicit lime:open, lime:account, lime:operations and lime:admin read/write scopes. These require a separately provisioned public CLI client with the configured API audience. Registering an ordinary application client does not enable platform management scopes, and a machine grant cannot substitute for a user's platform role.\n\n[Controlled management API](https://open.limeai.run/docs/management-api?locale=en)\n\n[CLI authorization](https://open.limeai.run/docs/cli-auth?locale=en)\n\n<a id=\"denied\"></a>\n\n## Declined, reduced and revoked access\n\n1. Treat access_denied as a completed user decision. Keep sign-in optional for unrelated local features and let the user explicitly restart it.\n2. Read the returned scope and refresh it with the stored grant; do not assume all requested scopes were granted.\n3. After a role, membership or installation changes, re-read resource authorization and honor rejection. Repeatedly requesting a broader scope does not restore a removed role.\n\n[Revoke a grant](https://open.limeai.run/docs/token-revocation?locale=en)\n\n[Recover from authorization errors](https://open.limeai.run/docs/client-errors?locale=en)\n","revision":"sha256:7cc90216ee52b15b90465e6fe1618aa5f60ef102a2b9e9b420aab04044d57432"},{"id":"client-compatibility","group":"client","category":"Runtime and security","title":"Runtime compatibility","summary":"Check protocol support, callback rules and runtime features before choosing an integration.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-compatibility?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"matrix","title":"Compatibility matrix"},{"id":"native-callbacks","title":"Native callback boundaries"},{"id":"features","title":"Detect features instead of guessing"},{"id":"cross-origin","title":"Cross-origin and cookie behavior"}],"markdown":"# Runtime compatibility\n\nCheck protocol support, callback rules and runtime features before choosing an integration.\n\n<a id=\"matrix\"></a>\n\n## Compatibility matrix\n\n| Environment | Check | Fallback |\n| --- | --- | --- |\n| Modern browser | HTTPS, secure cookies, navigation, Web Crypto and the app's supported JavaScript target | Generate PKCE and hold transactions on the application backend. |\n| Desktop/mobile | System browser, a registered HTTPS callback and secure operating-system storage | Use device authorization when no permitted callback is available. |\n| Local sandbox | An explicitly registered loopback HTTP callback, including its port | Keep a stable development port or update the exact callback. |\n| Production | An HTTPS callback and an activated client against a published version | Complete release and activation before testing production sign-in. |\n| LimeCloud CLI | Node.js 22.12 or later; @limecloud/cli 0.3.0 | Upgrade Node.js or use the documented HTTPS protocols from a supported runtime. |\n\n<a id=\"native-callbacks\"></a>\n\n## Native callback boundaries\n\nCurrent client registration requires a valid HTTPS redirect, with HTTP loopback allowed only in sandbox. Custom URI schemes and arbitrary production loopback ports are not a published callback contract. Do not assume a mobile scheme, embedded WebView login or automatic app-link handoff is supported because a generic OIDC library supports it.\n\n[Native application guide](https://open.limeai.run/docs/native-application?locale=en)\n\n[Device authorization](https://open.limeai.run/docs/device-authorization-flow?locale=en)\n\n<a id=\"features\"></a>\n\n## Detect features instead of guessing\n\nFeature detection selects the application path; it never disables PKCE or replaces secure randomness. Check your OIDC library and endpoint metadata before using optional features. Compare semantic versions numerically rather than lexicographically, and pin compatible library releases in your application lockfile.\n\n```javascript\nconst canGeneratePKCE = globalThis.isSecureContext &&\n typeof globalThis.crypto?.getRandomValues === \"function\" &&\n typeof globalThis.crypto?.subtle?.digest === \"function\";\n\nif (!canGeneratePKCE) {\n // Start sign-in through the application backend.\n location.assign(\"/login\");\n}\n```\n\n[Supported protocol metadata](https://open.limeai.run/docs/oidc-discovery?locale=en)\n\n<a id=\"cross-origin\"></a>\n\n## Cross-origin and cookie behavior\n\nA top-level authorization redirect does not require JavaScript to read another origin's response. Browser fetch calls are subject to actual CORS policy; a public client registration does not bypass it. Use an application backend when cross-origin token or UserInfo access is unavailable. Test private browsing, cookie restrictions, canceled navigation and the browser back button.\n\n[Navigation and callbacks](https://open.limeai.run/docs/client-navigation?locale=en)\n\n[Session storage](https://open.limeai.run/docs/client-storage?locale=en)\n","revision":"sha256:d4fd53c3166d5509519f707326aa948ca63d6bdb17c9de8a575f93a5fab6b6b5"},{"id":"client-errors","group":"client","category":"Runtime and security","title":"Client errors and recovery","summary":"Identify which stage failed and offer a safe, explicit recovery action.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-errors?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"stages","title":"Locate the failure"},{"id":"formats","title":"Recognize the response format"},{"id":"ui","title":"Keep retry actions safe"},{"id":"diagnostics","title":"Useful diagnostics"}],"markdown":"# Client errors and recovery\n\nIdentify which stage failed and offer a safe, explicit recovery action.\n\n<a id=\"stages\"></a>\n\n## Locate the failure\n\n| Stage | Signal | Recovery |\n| --- | --- | --- |\n| Before navigation | Missing client, invalid callback, unavailable secure randomness | Fix registration or use the application backend; never weaken PKCE. |\n| Authorization callback | error=access_denied with the expected state | Explain that access was declined and let the user start again. |\n| Callback validation | Missing/mismatched state, expired or consumed transaction | Discard the result and create a new authorization transaction. |\n| Token exchange | invalid_grant or an uncertain network result | Do not replay the code; restart sign-in. Do not retry a rotated refresh token. |\n| ID-token validation | Wrong issuer/audience/nonce, invalid signature or expiry | Reject sign-in and verify configuration and trusted signing keys. |\n| Resource request | 401, 403, 409 or 429 with a stable API error code | Check the token, current role, revision or Retry-After as appropriate. |\n\n<a id=\"formats\"></a>\n\n## Recognize the response format\n\nOAuth endpoints return standard protocol errors such as error and error_description. Platform resource endpoints return their documented error object. CLI commands add a separate envelope with ok, error.type and error.code and a nonzero exit code. These formats are different; do not test every API for a generic code=0 field.\n\n[API errors and recovery](https://open.limeai.run/docs/errors?locale=en)\n\n[CLI output](https://open.limeai.run/docs/cli-output?locale=en)\n\n<a id=\"ui\"></a>\n\n## Keep retry actions safe\n\n1. Restore the initiating page and explain whether sign-in was canceled, expired or failed. Preserve only a validated internal return path.\n2. An explicit restart creates fresh state, nonce and verifier. Closing a consent screen must not automatically submit another authorization request.\n3. A request timeout does not prove that a write or token rotation failed. Query its result using the documented recovery method before repeating it.\n\n[Request retry policy](https://open.limeai.run/docs/api-retry-policy?locale=en)\n\n<a id=\"diagnostics\"></a>\n\n## Useful diagnostics\n\nRecord the time, runtime/library version, stage, HTTP status, stable error code and request identifier when present. Redact authorization codes, tokens, cookies, client secrets, verifier and complete callback URLs. Localizing a message must not change the machine-readable error code.\n\n[Debug an integration](https://open.limeai.run/docs/api-debugging?locale=en)\n","revision":"sha256:282935c28ac0e19b554360ba247a126766634d3a5f3a15bd6f2753476e708754"},{"id":"client-navigation","group":"client","category":"Runtime and security","title":"Navigation and callbacks","summary":"Move between your application and the authorization service without losing the login transaction.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-navigation?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"browser","title":"Open the authorization page"},{"id":"return-path","title":"Validate the return destination"},{"id":"cleanup","title":"Finish the callback once"},{"id":"native","title":"Desktop and mobile navigation"}],"markdown":"# Navigation and callbacks\n\nMove between your application and the authorization service without losing the login transaction.\n\n<a id=\"browser\"></a>\n\n## Open the authorization page\n\nStart sign-in from an explicit user action and navigate the top-level browser or the native system browser to the trusted authorization endpoint. A backend redirect works even when a popup is blocked. Keep a visible cancel or return route in your own application.\n\nThe currently published integration does not require a Lime-specific window-opening SDK. A new window or a mobile app switch does not share authorization state automatically; bind the return to the original application session.\n\n[Start sign-in](https://open.limeai.run/docs/client-quick-start?locale=en)\n\n<a id=\"return-path\"></a>\n\n## Validate the return destination\n\nKeep the OAuth redirect_uri fixed to its registered callback. Store the separately validated internal return path in the authorization transaction; never let a returnTo parameter choose the OAuth callback or an external origin. The example accepts only same-origin paths, and your application may apply a stricter route allowlist.\n\n```javascript\nfunction internalReturnPath(input, applicationOrigin) {\n if (typeof input !== \"string\" || !input.startsWith(\"/\") ||\n input.startsWith(\"//\") || /[\\\\\\x00-\\x1f]/.test(input)) return \"/\";\n const target = new URL(input, applicationOrigin);\n return target.origin === applicationOrigin\n ? target.pathname + target.search + target.hash\n : \"/\";\n}\n```\n\n[Exact callback validation](https://open.limeai.run/docs/callback-validation?locale=en)\n\n<a id=\"cleanup\"></a>\n\n## Finish the callback once\n\n1. Load the initiating session and reject unknown, expired or previously used state before processing either a success or an error.\n2. Consume the transaction, perform one code exchange, validate the ID token and regenerate the application session identifier.\n3. Redirect to a clean internal URL after processing. A refresh or back navigation must not exchange the same code a second time.\n\n<a id=\"native\"></a>\n\n## Desktop and mobile navigation\n\nA native application must first choose a callback that Lime's registration contract permits. Production HTTP loopback and custom URI schemes are not published callback options. A controlled HTTPS callback must verify the transaction before any application handoff and must not place tokens in the handoff URL. When such a callback is unavailable, choose device authorization.\n\n[Compatibility rules](https://open.limeai.run/docs/client-compatibility?locale=en)\n\n[Native application guide](https://open.limeai.run/docs/native-application?locale=en)\n","revision":"sha256:1da21383fbcb969d72bef4ec4e439816875dea266f16b4481ca738cdbd6ef1da"},{"id":"client-storage","group":"client","category":"Runtime and security","title":"Sessions and credential storage","summary":"Store each value for its purpose, lifetime and trusted runtime.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-storage?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"storage","title":"Storage responsibilities"},{"id":"browser","title":"Browser storage boundaries"},{"id":"rotation","title":"Refresh and account switching"},{"id":"cli","title":"CLI credential files"}],"markdown":"# Sessions and credential storage\n\nStore each value for its purpose, lifetime and trusted runtime.\n\n<a id=\"storage\"></a>\n\n## Storage responsibilities\n\n[Short-lived authorization transactions and long-lived credentials use separate storage.](https://open.limeai.run/docs/client-storage?locale=en#storage)\n\n| Value | Where | Lifetime |\n| --- | --- | --- |\n| state, nonce, PKCE verifier | Bound to the initiating session in short-lived application storage | One transaction; consume on callback or expiry |\n| Client secret | Backend secret manager or protected runtime configuration | Rotate and revoke according to client policy |\n| Access/refresh tokens | Protected backend token store or operating-system credential store | Respect expiry and replace refresh tokens atomically |\n| Browser application session | An opaque cookie with HttpOnly, Secure and appropriate SameSite | Own inactivity/absolute expiry and explicit invalidation |\n| Harmless user preferences | Application storage scoped to its origin and account | Clear or rebind when switching accounts |\n\n<a id=\"browser\"></a>\n\n## Browser storage boundaries\n\nA signed cookie is readable by its holder; signing does not encrypt its contents. Use server-side session storage for secrets and tokens. JavaScript-readable localStorage, IndexedDB and sessionStorage are exposed to an XSS in the same origin. Do not put refresh tokens or confidential-client secrets there.\n\nFor a browser-only public client, minimize token persistence and use a maintained library's documented transaction storage. A backend session is preferable when the security requirements cannot be met in the browser. Clearing browser storage does not revoke a server-side grant.\n\n[Web application guide](https://open.limeai.run/docs/web-application?locale=en)\n\n[Token revocation](https://open.limeai.run/docs/token-revocation?locale=en)\n\n<a id=\"rotation\"></a>\n\n## Refresh and account switching\n\n1. Bind stored tokens to Issuer, Client ID, environment and intended resource audience. Select a matching context before sending any request.\n2. Serialize refresh operations. Replace the old refresh token atomically after a successful response; if the exchange result is unknown, require a new sign-in instead of replaying the old token.\n3. On account changes, invalidate application session state and cached account data. Distinguish local sign-out from revoking a grant or ending the central Auth session.\n\n[Refresh-token lifecycle](https://open.limeai.run/docs/refresh-token-flow?locale=en)\n\n<a id=\"cli\"></a>\n\n## CLI credential files\n\nLimeCloud CLI stores credentials in a current-user-owned 0600 file, uses exclusive locks and atomic replacement, and binds a saved login to Auth, Client ID and API Origin. Separate LIMECLOUD_CONFIG and LIMECLOUD_SETTINGS paths isolate environments. An externally supplied LIMECLOUD_ACCESS_TOKEN stays externally managed and is not saved by the CLI.\n\n[CLI configuration](https://open.limeai.run/docs/cli-configuration?locale=en)\n\n[CLI credentials](https://open.limeai.run/docs/cli-auth?locale=en)\n","revision":"sha256:adbeb84d1c8628a22771f9f3f479849c3b3e76b09fe13b25154720f53494fbdd"},{"id":"node-web-tutorial","group":"tutorial","category":"Development tutorials","title":"Build a web application with Node.js","summary":"Create a local backend, complete OIDC sign-in and display a verified user profile.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/node-web-tutorial?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"goal","title":"What you will build"},{"id":"prepare","title":"1. Prepare a sandbox client"},{"id":"install","title":"2. Create the local project"},{"id":"implement","title":"3. Implement sign-in and the callback"},{"id":"test","title":"4. Experience and verify"}],"markdown":"# Build a web application with Node.js\n\nCreate a local backend, complete OIDC sign-in and display a verified user profile.\n\n<a id=\"goal\"></a>\n\n## What you will build\n\nThis tutorial runs a Node.js web application with three routes: / starts the app, /login redirects to Lime, and /callback validates the result before creating an application session. The browser receives only an opaque application cookie and the permitted profile. It does not receive the client secret or tokens.\n\n[A standard OIDC flow connects your Node.js backend to Lime Auth.](https://open.limeai.run/docs/node-web-tutorial?locale=en#goal)\n\n<a id=\"prepare\"></a>\n\n## 1. Prepare a sandbox client\n\n1. Use Node.js 22.12 or later. Create an application and a confidential sandbox user client with authorization_code enabled and scopes openid profile.\n2. Register exactly http://127.0.0.1:3000/callback and keep that port fixed. Store the client secret only in the backend's protected environment.\n3. Set LIME_ISSUER to the trusted HTTPS Auth origin, LIME_CLIENT_ID and LIME_CLIENT_SECRET to the registered client, and SESSION_SECRET to an independent strong random value.\n\n[Client registration](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Callback rules](https://open.limeai.run/docs/callback-validation?locale=en)\n\n<a id=\"install\"></a>\n\n## 2. Create the local project\n\nThe libraries are third-party Express and OpenID Connect libraries. This example does not require a Lime JavaScript SDK. Keep the generated lockfile in your own project and read each dependency's supported runtime and release notes.\n\n```sh\nmkdir lime-web-node\ncd lime-web-node\nnpm init -y\nnpm install express@5 express-session@1 openid-client@6\n# Save the next example as server.mjs.\nnode server.mjs\n```\n\n<a id=\"implement\"></a>\n\n## 3. Implement sign-in and the callback\n\nDiscovery and client_secret_basic remain on the backend. Each sign-in gets a new verifier, state, nonce and five-minute transaction. The OIDC library checks the returned state, nonce, signature, issuer and audience, while UserInfo is bound to the verified sub. The transaction is removed before its single code exchange.\n\n> This local example uses express-session's MemoryStore and an HTTP loopback cookie. Before production, use shared protected session storage, HTTPS, Secure cookies, an exact production callback and an appropriate trusted-proxy configuration. The example does not retain refresh tokens.\n\n```javascript\nimport express from \"express\";\nimport session from \"express-session\";\nimport * as oidc from \"openid-client\";\n\nconst issuer = new URL(process.env.LIME_ISSUER);\nconst clientId = process.env.LIME_CLIENT_ID;\nconst redirectUri = \"http://127.0.0.1:3000/callback\";\nconst config = await oidc.discovery(\n issuer, clientId, undefined,\n oidc.ClientSecretBasic(process.env.LIME_CLIENT_SECRET),\n);\nconst app = express();\napp.use(session({\n secret: process.env.SESSION_SECRET,\n resave: false, saveUninitialized: false,\n cookie: { httpOnly: true, sameSite: \"lax\", secure: false, maxAge: 1800000 },\n}));\nconst save = req => new Promise((resolve, reject) =>\n req.session.save(error => error ? reject(error) : resolve()));\n\napp.get(\"/login\", async (req, res) => {\n const verifier = oidc.randomPKCECodeVerifier();\n const state = oidc.randomState();\n const nonce = oidc.randomNonce();\n req.session.transaction = { verifier, state, nonce, expires: Date.now() + 300000 };\n const url = oidc.buildAuthorizationUrl(config, {\n redirect_uri: redirectUri, response_type: \"code\", scope: \"openid profile\",\n code_challenge: await oidc.calculatePKCECodeChallenge(verifier),\n code_challenge_method: \"S256\", state, nonce,\n });\n await save(req);\n res.redirect(url.href);\n});\napp.get(\"/callback\", async (req, res) => {\n const tx = req.session.transaction;\n delete req.session.transaction;\n await save(req);\n if (!tx || tx.expires < Date.now()) return res.status(400).send(\"Restart sign-in\");\n const current = new URL(redirectUri);\n current.search = new URL(req.originalUrl, redirectUri).search;\n const tokens = await oidc.authorizationCodeGrant(config, current, {\n pkceCodeVerifier: tx.verifier, expectedState: tx.state, expectedNonce: tx.nonce,\n });\n const claims = tokens.claims();\n if (!claims?.sub) throw new Error(\"Missing verified subject\");\n const profile = await oidc.fetchUserInfo(config, tokens.access_token, claims.sub);\n await new Promise((resolve, reject) =>\n req.session.regenerate(error => error ? reject(error) : resolve()));\n req.session.profile = { sub: profile.sub, name: profile.name };\n await save(req);\n res.redirect(\"/\");\n});\napp.get(\"/\", (req, res) => {\n if (!req.session.profile) return res.type(\"html\").send('<a href=\"/login\">Sign in</a>');\n res.json({ profile: req.session.profile });\n});\napp.use((_error, _req, res, _next) => res.status(400).send(\"Sign-in failed; restart from /login\"));\napp.listen(3000, \"127.0.0.1\");\n\n```\n\n<a id=\"test\"></a>\n\n## 4. Experience and verify\n\n1. Open http://127.0.0.1:3000, choose Sign in, check the application and permissions, and approve in your own browser.\n2. Confirm that / shows the expected sub and permitted name. Inspect browser storage: there should be only the application session cookie, without OAuth credentials.\n3. Decline consent, alter state, wait for transaction expiry, revisit the callback, and restart the server. Each case must fail safely or start a new transaction; the same code is never replayed.\n\n[Troubleshooting](https://open.limeai.run/docs/client-errors?locale=en)\n\n[Session storage](https://open.limeai.run/docs/client-storage?locale=en)\n\n[Python tutorial](https://open.limeai.run/docs/python-web-tutorial?locale=en)\n","revision":"sha256:c73e5518c3144d237242b8b28208bfc3de7394930c59376167f99b7abce2248f"},{"id":"python-web-tutorial","group":"tutorial","category":"Development tutorials","title":"Build a web application with Python","summary":"Use Flask, Authlib and a server-side session to complete browser sign-in.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/python-web-tutorial?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"goal","title":"What you will build"},{"id":"prepare","title":"1. Register and configure"},{"id":"install","title":"2. Install the local dependencies"},{"id":"implement","title":"3. Implement the application"},{"id":"verify","title":"4. Verify the result and failure paths"}],"markdown":"# Build a web application with Python\n\nUse Flask, Authlib and a server-side session to complete browser sign-in.\n\n<a id=\"goal\"></a>\n\n## What you will build\n\nThe application redirects to Lime in a normal browser, receives an authorization code and shows verified ID-token profile claims. Authlib performs discovery, PKCE, token-endpoint authentication and ID-token verification. Flask-Session keeps authorization state and verifier in server-side storage.\n\n[The session cookie identifies protected backend state.](https://open.limeai.run/docs/python-web-tutorial?locale=en#goal)\n\n<a id=\"prepare\"></a>\n\n## 1. Register and configure\n\n1. Use Python 3.10 or later. Create a confidential sandbox user client supporting authorization_code and scopes openid profile.\n2. Register exactly http://127.0.0.1:5000/callback. Set LIME_ISSUER, LIME_CLIENT_ID, LIME_CLIENT_SECRET and a separate random SESSION_SECRET in the backend environment.\n3. Use a trusted HTTPS Issuer. Keep the private local session directory out of source control and prevent access by other users.\n\n[Client registration](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n<a id=\"install\"></a>\n\n## 2. Install the local dependencies\n\nThese are third-party dependencies, not a published Lime Python SDK. Record exact resolved versions in your application's dependency lock or requirements file before sharing the example.\n\n```sh\nmkdir lime-web-python\ncd lime-web-python\npython3 -m venv .venv\n. .venv/bin/activate\npython -m pip install 'Flask>=3.1,<4' 'Authlib>=1.6,<2' 'Flask-Session>=0.8,<1' 'cachelib>=0.13,<1' 'requests>=2.32,<3'\n# Save the next example as app.py.\npython -m flask --app app run --host 127.0.0.1 --port 5000\n```\n\n<a id=\"implement\"></a>\n\n## 3. Implement the application\n\nThe callback validates and consumes the explicit five-minute state transaction before asking Authlib to exchange the code and validate nonce and ID-token claims. A successful result clears authorization state, regenerates the application session ID and retains only a small verified profile. Failed or uncertain code exchanges require a new login.\n\n> The filesystem cache, HTTP cookie and Flask development server are local examples. Production needs protected shared session storage, HTTPS, Secure cookies, a production server and explicit proxy/host configuration. Flask's default signed cookie alone must not store verifier, secrets or tokens.\n\n```python\nimport os, secrets, time\nfrom datetime import timedelta\nfrom flask import Flask, jsonify, redirect, request, session\nfrom flask_session import Session\nfrom cachelib.file import FileSystemCache\nfrom authlib.integrations.flask_client import OAuth\n\napp = Flask(__name__)\napp.config.update(\n SECRET_KEY=os.environ[\"SESSION_SECRET\"],\n SESSION_TYPE=\"cachelib\",\n SESSION_CACHELIB=FileSystemCache(\".oidc-sessions\", threshold=500),\n SESSION_PERMANENT=False,\n PERMANENT_SESSION_LIFETIME=timedelta(minutes=30),\n SESSION_COOKIE_HTTPONLY=True,\n SESSION_COOKIE_SAMESITE=\"Lax\",\n SESSION_COOKIE_SECURE=False,\n)\nSession(app)\noauth = OAuth(app)\noauth.register(\n name=\"lime\",\n client_id=os.environ[\"LIME_CLIENT_ID\"],\n client_secret=os.environ[\"LIME_CLIENT_SECRET\"],\n server_metadata_url=os.environ[\"LIME_ISSUER\"].rstrip(\"/\") + \"/.well-known/openid-configuration\",\n client_kwargs={\n \"scope\": \"openid profile\",\n \"code_challenge_method\": \"S256\",\n \"token_endpoint_auth_method\": \"client_secret_basic\",\n },\n)\n@app.get(\"/login\")\ndef login():\n state = secrets.token_urlsafe(32)\n session[\"transaction\"] = {\"state\": state, \"expires\": time.time() + 300}\n return oauth.lime.authorize_redirect(\n \"http://127.0.0.1:5000/callback\", state=state, nonce=secrets.token_urlsafe(32)\n )\n\n@app.get(\"/callback\")\ndef callback():\n tx = session.pop(\"transaction\", None)\n state = request.args.get(\"state\", \"\")\n if not tx or tx[\"expires\"] < time.time() or not secrets.compare_digest(state, tx[\"state\"]):\n return \"Restart sign-in\", 400\n token = oauth.lime.authorize_access_token()\n claims = token.get(\"userinfo\")\n if not claims or not claims.get(\"sub\"):\n return \"Missing verified subject\", 400\n session.clear()\n session[\"profile\"] = {\"sub\": claims[\"sub\"], \"name\": claims.get(\"name\")}\n app.session_interface.regenerate(session)\n return redirect(\"/\")\n\n@app.get(\"/\")\ndef index():\n if \"profile\" not in session:\n return '<a href=\"/login\">Sign in</a>'\n return jsonify(profile=session[\"profile\"])\n\n@app.errorhandler(Exception)\ndef failed(_error):\n return \"Sign-in failed; restart from /login\", 400\n\n```\n\n<a id=\"verify\"></a>\n\n## 4. Verify the result and failure paths\n\n1. Open http://127.0.0.1:5000, sign in and confirm that the displayed subject belongs to your expected account.\n2. Test rejected consent, missing or incorrect state, a callback after five minutes, repeated callbacks and a different browser session. None may create an authenticated session.\n3. Do not log the callback URL, token object, cookies or client secret. Keep the OIDC subject as the account key and display name as optional profile data.\n\n[Client errors](https://open.limeai.run/docs/client-errors?locale=en)\n\n[Node.js tutorial](https://open.limeai.run/docs/node-web-tutorial?locale=en)\n\n[ID-token validation](https://open.limeai.run/docs/id-token-validation?locale=en)\n","revision":"sha256:9f6a5e6e6b9631a64ba7862d77a5e7caf8938f9c7e3fa09166b2029abe5c28b3"},{"id":"server-api-tutorial","group":"tutorial","category":"Development tutorials","title":"Call a platform API","summary":"Inspect a real contract, authorize a CLI user and complete a sandbox application workflow.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/server-api-tutorial?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"goal","title":"Workflow and prerequisites"},{"id":"contract","title":"1. Inspect the contract"},{"id":"authorize","title":"2. Configure and authorize"},{"id":"read","title":"3. List applications"},{"id":"write","title":"4. Preview, create and read back"},{"id":"execute","title":"Execute the confirmed request"},{"id":"recover","title":"5. Recover safely"}],"markdown":"# Call a platform API\n\nInspect a real contract, authorize a CLI user and complete a sandbox application workflow.\n\n<a id=\"goal\"></a>\n\n## Workflow and prerequisites\n\nThis example lists a workspace's applications, previews a create request and reads the created application. Use an account with the required workspace membership and creation role. A dedicated platform CLI public client must be provisioned with the corresponding API audience and delegated scopes; an ordinary application or machine client does not gain management access.\n\n[Management API boundary](https://open.limeai.run/docs/management-api?locale=en)\n\n[Install LimeCloud CLI](https://open.limeai.run/docs/cli-overview?locale=en#run)\n\n<a id=\"contract\"></a>\n\n## 1. Inspect the contract\n\nRead the method, path/query/body fields, required scopes and response shape before making a request. Identity calls use the Auth origin; platform resource calls use your explicit API origin. Resource responses are wrapped once by the CLI: list rows are data.items with data.next_cursor.\n\n```sh\nlimecloud-cli --version\nlimecloud-cli api list application\nlimecloud-cli schema open.application.list\nlimecloud-cli schema open.application.create\nlimecloud-cli schema open.application.get\n```\n\n<a id=\"authorize\"></a>\n\n## 2. Configure and authorize\n\nOpen the verification URL in your own browser, check the user code, client and scopes, and decide whether to authorize. Select the intended workspace from the returned list. The CLI never creates the client or grants a workspace role for you.\n\n```sh\nlimecloud-cli config init \\\n --issuer \"https://YOUR_AUTH_ORIGIN\" \\\n --api-origin \"https://YOUR_API_ORIGIN\" \\\n --client-id \"YOUR_REGISTERED_PUBLIC_CLI_CLIENT_ID\"\nlimecloud-cli auth login \\\n --scope \"openid profile offline_access lime:open:read lime:open:write\"\nlimecloud-cli auth check --scope \"lime:open:read lime:open:write\"\nlimecloud-cli open space list\n```\n\n[CLI authorization and storage](https://open.limeai.run/docs/cli-auth?locale=en)\n\n<a id=\"read\"></a>\n\n## 3. List applications\n\nUse the returned cursor as an opaque value and preserve the workspace, filters and sort order. A successful scope check proves only the local grant; the API still evaluates current membership and access on every page.\n\n```sh\nlimecloud-cli open application list \\\n --space-id \"YOUR_SPACE_ID\" \\\n --limit 20\n# When data.next_cursor is present, keep all other filters unchanged:\nlimecloud-cli open application list \\\n --space-id \"YOUR_SPACE_ID\" \\\n --limit 20 \\\n --cursor \"RETURNED_CURSOR\"\n```\n\n[Pagination](https://open.limeai.run/docs/api-pagination?locale=en)\n\n<a id=\"write\"></a>\n\n## 4. Preview, create and read back\n\nSave the following complete object as application.json. Check the selected workspace and request body in the preview, then explicitly run the create command without --dry-run when you intend to create the application.\n\n```json\n{\n \"name\": \"Example application\",\n \"description\": \"Application created for the API tutorial\",\n \"kind\": \"internal\",\n \"icon\": \"leaf\"\n}\n```\n\n<a id=\"execute\"></a>\n\n## Execute the confirmed request\n\nDry-run performs validation and prints a redacted request without network or state changes. The real create command is a write. Keep the returned application ID for read-back; creating an application does not publish, activate, install or purchase it.\n\n```sh\nlimecloud-cli open application create \\\n --space-id \"YOUR_SPACE_ID\" --data \"@application.json\" --dry-run\nlimecloud-cli open application create \\\n --space-id \"YOUR_SPACE_ID\" --data \"@application.json\"\nlimecloud-cli open application get \\\n --space-id \"YOUR_SPACE_ID\" --app-id \"RETURNED_APP_ID\"\n```\n\n<a id=\"recover\"></a>\n\n## 5. Recover safely\n\n| Signal | Action |\n| --- | --- |\n| 401 or expired local token | Refresh when safe, or sign in again; do not replay an uncertain refresh exchange. |\n| 403 | Check explicit scopes and the current workspace role. Repeated consent cannot restore a removed role. |\n| 409 | Reload the resource and current revision, then review the intended write. |\n| 429 | Honor Retry-After and use bounded backoff for eligible reads. |\n| Write timeout | Inspect the resource before repeating a create. Use idempotency only on methods whose schema declares it. |\n\n[Retry policy](https://open.limeai.run/docs/api-retry-policy?locale=en)\n\n[Debug requests](https://open.limeai.run/docs/api-debugging?locale=en)\n\n[CLI output](https://open.limeai.run/docs/cli-output?locale=en)\n","revision":"sha256:37d7d08a35a685e1a3d757a600045877d691b93c79b6ee3041e9c83c3bb8e7b3"},{"id":"cli-agent-overview","group":"cli","category":"LimeCloud CLI","title":"LimeCloud Agent integration overview","summary":"Lime provides three complementary capabilities for Agent users and developers: understand the task, establish authorization and execute supported operations.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-agent-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"introduction","title":"Three complementary capabilities"},{"id":"capabilities","title":"Capabilities at a glance"},{"id":"choose","title":"Choose your integration"}],"markdown":"# LimeCloud Agent integration overview\n\nLime provides three complementary capabilities for Agent users and developers: understand the task, establish authorization and execute supported operations.\n\n<a id=\"introduction\"></a>\n\n## Three complementary capabilities\n\n| Knowledge and discovery | Identity and authorization | CLI execution |\n| --- | --- | --- |\n| Read platform concepts and task guides, then discover the exact action schema. Public guides, website search and CLI knowledge reading are available. Read Markdown or structured data in your current host. | Let the user review the client and scopes through device authorization. Each actual request still checks current roles, space, application, environment and resources. | Use supported CLI methods to inspect schemas, preview requests and call authorized APIs. A separately enabled MCP resource provides space and application discovery, application details and login-client reads; complete task adaptation in individual hosts remains under verification. |\n\n[agent-knowledge-preview](https://open.limeai.run/docs/cli-agent-overview?locale=en#introduction)\n\n[agent-identity-preview](https://open.limeai.run/docs/cli-agent-overview?locale=en#introduction)\n\n[agent-cli-preview](https://open.limeai.run/docs/cli-agent-overview?locale=en#introduction)\n\n[Platform knowledge](https://open.limeai.run/docs/platform-knowledge?locale=en)\n\n[Identity and authorization](https://open.limeai.run/docs/cli-auth?locale=en)\n\n[Get started with CLI](https://open.limeai.run/docs/cli-overview?locale=en)\n\n<a id=\"capabilities\"></a>\n\n## Capabilities at a glance\n\n[Lime Agent capabilities and task paths. Illustrations distinguish available and planned capabilities.](https://open.limeai.run/docs/cli-agent-overview?locale=en#capabilities)\n\n| Capability | When to use it | Form and availability | Guide |\n| --- | --- | --- | --- |\n| Knowledge and discovery | Understand concepts, prerequisites and recovery; inspect exact method inputs before building a call. | Public guides, layered Markdown indexes, CLI search/read and local Schema available; protected playbooks and MCP knowledge access planned. | Platform knowledge navigator and Agent reading guide below. |\n| Identity and authorization | Establish the caller and explicit scopes; verify real roles and resource access for the target deployment. | OAuth device authorization and CLI auth commands; deployment registration is required. | CLI authorization guide below. |\n| CLI execution | Call supported identity, developer, customer, operations and administration methods within actual access. | CLI and formal HTTP contracts are available; login-diagnosis and member-group method candidates can be inspected and exported separately. MCP application reads require their own enabled resource and authorization. Native method installation/loading and complete host tasks remain under verification. | CLI overview and API reference below. |\n\n[Platform knowledge navigator](https://open.limeai.run/docs/platform-knowledge?locale=en)\n\n[Agent reading guide](https://open.limeai.run/docs/cli-knowledge?locale=en)\n\n[CLI authorization](https://open.limeai.run/docs/cli-auth?locale=en)\n\n[CLI overview](https://open.limeai.run/docs/cli-overview?locale=en)\n\n[API reference](https://open.limeai.run/docs/api-overview?locale=en)\n\n<a id=\"choose\"></a>\n\n## Choose your integration\n\n| Your goal | Recommended path |\n| --- | --- |\n| Use Lime from an existing AI tool | Install the CLI, ask the Agent to read the installation guide, then start with schema discovery. |\n| Build your own Agent | Run the CLI as a subprocess, use JSON contracts and enforce your host's command and approval rules. |\n| Integrate an application directly | Use the published OAuth and API contracts when you need direct HTTP calls rather than a local process. |\n\n[Get started with CLI](https://open.limeai.run/docs/cli-overview?locale=en)\n\n[Connect your Agent](https://open.limeai.run/docs/cli-agent-integration?locale=en)\n\n[API overview](https://open.limeai.run/docs/api-overview?locale=en)\n","revision":"sha256:7a97ae4d6c52c4135330395ffa7f2061f6a90cb1cfd98b0bce51cf8e7a75af8d"},{"id":"cli-overview","group":"cli","category":"LimeCloud CLI","title":"LimeCloud CLI: Let your Agent work with Lime","summary":"Discover Lime capabilities, prepare requests and carry out authorized tasks from your terminal or AI Agent.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-overview?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_group_list","management_open_group_change_prepare","management_open_group_change_get","management_open_group_change_execute","management_open_group_change_receipt","management_open_group_change_resolve","management_open_space_list","management_open_application_list","management_open_application_get","management_open_client_list","management_open_login_diagnosis_get"],"sections":[{"id":"introduction","title":"Work with Lime from your Agent"},{"id":"quick-start","title":"Quick start"},{"id":"run","title":"1. Install and configure"},{"id":"agent-install","title":"Ask your Agent to install"},{"id":"install-notes","title":"After installation"},{"id":"authorization","title":"2. Sign in when your task needs it"},{"id":"authorization-boundary","title":"What the default authorization grants"},{"id":"first-task","title":"3. Start your first Agent task"},{"id":"use-cases","title":"Agent use cases"},{"id":"case-applications","title":"Scenario 1: Find the right application API"},{"id":"case-config-preview","title":"Scenario 2: Review a configuration change"},{"id":"case-installation","title":"Scenario 3: Check an application installation"},{"id":"case-operations","title":"Scenario 4: Prepare an operations query"},{"id":"case-finance","title":"Scenario 5: Prepare a trial-balance check"},{"id":"member-group-task","title":"Prepare and confirm a member-group change"},{"id":"member-group-execute-recover","title":"Confirm once, recover by the original ID"},{"id":"optional-method-candidates","title":"Inspect an optional method before installing"},{"id":"member-group-method","title":"Use a group method with a concrete review"},{"id":"single-method-delivery","title":"Export one candidate for a separate host choice"},{"id":"capability-map","title":"LimeCloud CLI capability map"},{"id":"commands","title":"Common authentication and setup commands"},{"id":"multiple-contexts","title":"Work with multiple environments"},{"id":"faq","title":"Frequently asked questions"}],"markdown":"# LimeCloud CLI: Let your Agent work with Lime\n\nDiscover Lime capabilities, prepare requests and carry out authorized tasks from your terminal or AI Agent.\n\n<a id=\"introduction\"></a>\n\n## Work with Lime from your Agent\n\nLimeCloud CLI gives your Agent a structured way to work with Lime. It can find the right API, inspect its parameters, prepare a request and return data that a program can read.\n\nStart with the public catalog and request previews. When a task needs account or business data, sign in and use the scopes, workspace and application access granted to that client and user.\n\n<a id=\"quick-start\"></a>\n\n## Quick start\n\nUse Node.js 22.12 or later with npm/npx. This guide covers the 0.7.0 installation flow; new commands become available when that package version is released to npm.\n\n<a id=\"run\"></a>\n\n### 1. Install and configure\n\nOption 1: Install manually. Run this command in your terminal to install the CLI and follow the configuration prompts.\n\n```bash\nnpx @limecloud/cli@latest install\n```\n\n<a id=\"agent-install\"></a>\n\n## Ask your Agent to install\n\nOption 2: Let your Agent install it. Copy this request into your AI tool so it can read the installation guide and help you complete the setup.\n\n```text\nHelp me install LimeCloud CLI: https://open.limeai.run/docs/cli-installation-guide.md\n```\n\n[Read the installation guide](https://open.limeai.run/docs/cli-installation-guide?locale=en)\n\n<a id=\"install-notes\"></a>\n\n## After installation\n\nThe default install prefix is ~/.local. Use the executable directory returned by the installer to check PATH. If your terminal or Agent does not see a new PATH, start a new process after updating it; the installer does not edit shell configuration or install global Agent Skills.\n\nSetup discovers the deployment's public CLI configuration from the selected Auth service and reuses existing settings. If discovery is unavailable and no Client ID is configured, non-interactive setup returns configuration.status=pending; follow the returned config init step.\n\n<a id=\"authorization\"></a>\n\n### 2. Sign in when your task needs it\n\nCommand discovery, schema inspection and request previews work without signing in. For user identity, run the login command, open the verification link in your browser and confirm the user code, client and scopes.\n\n[cli-device-authorization](https://open.limeai.run/docs/cli-overview?locale=en#authorization)\n\n```bash\nlimecloud-cli auth login\n```\n\n<a id=\"authorization-boundary\"></a>\n\n## What the default authorization grants\n\nThe default public CLI setup requests openid profile email offline_access. Business APIs require a client allowed to request the relevant business scopes and the user's current service permissions. Installing or signing in does not grant an application, workspace or administration role.\n\n[CLI authentication](https://open.limeai.run/docs/cli-auth?locale=en)\n\n<a id=\"first-task\"></a>\n\n### 3. Start your first Agent task\n\nOpen your AI tool and describe a small task. Start by asking it to inspect a schema and show its plan before requesting business data.\n\n```text\nUse LimeCloud CLI to find the application-list command, read its schema and explain the required inputs and permissions. Do not request business data yet.\n```\n\n<a id=\"use-cases\"></a>\n\n## Agent use cases\n\nThese examples show the discovery and review flow for implemented Lime contracts. Preview commands do not send business requests, and the diagrams illustrate the steps rather than completed account activity.\n\n<a id=\"case-applications\"></a>\n\n### Scenario 1: Find the right application API\n\nDescribe what you want to inspect. The Agent can search the public catalog, read the exact input schema and prepare a request for your workspace before accessing any business data.\n\n| Your request | Agent workflow |\n| --- | --- |\n| Find the application-list API, explain the workspace and permission requirements, then show me the request without sending it. | Discover the method, inspect its schema, then preview the request. Replace YOUR_SPACE_ID with your actual workspace before running it. |\n\n### Agent workflow\n\n```bash\nlimecloud-cli schema open.application.list\nlimecloud-cli open application list --space-id \"YOUR_SPACE_ID\" --dry-run\n```\n\n[cli-case-applications](https://open.limeai.run/docs/cli-overview?locale=en#case-applications)\n\n<a id=\"case-config-preview\"></a>\n\n### Scenario 2: Review a configuration change\n\nA configuration update needs the current contract and revision. Ask the Agent to inspect the update schema and prepare a preview; review the target application, fields and concurrency requirements before approving a separate write.\n\n| Your request | Agent workflow |\n| --- | --- |\n| Help me prepare this application configuration change. Check the required fields and revision, and show the dry run for review before saving. | Read the configuration-update schema, obtain the current configuration with authorized access, and build the preview from those values. A successful preview validates the local request; it does not save or authorize it. |\n\n### Agent workflow\n\n```bash\nlimecloud-cli schema open.configuration.get\nlimecloud-cli schema open.configuration.update\n```\n\n[cli-case-config-preview](https://open.limeai.run/docs/cli-overview?locale=en#case-config-preview)\n\n<a id=\"case-installation\"></a>\n\n### Scenario 3: Check an application installation\n\n| Your request | Agent workflow |\n| --- | --- |\n| Find how to inspect applications installed in my workspace. Show the required account scope and request first; do not install or uninstall anything. | Use the account installation-list method. The workspace, account authorization and installed-application access remain separate from installing this CLI on your computer. |\n\n### Agent workflow\n\n```bash\nlimecloud-cli schema account.installation.list\nlimecloud-cli account installation list --space-id \"YOUR_SPACE_ID\" --dry-run\n```\n\n[cli-case-installation](https://open.limeai.run/docs/cli-overview?locale=en#case-installation)\n\n<a id=\"case-operations\"></a>\n\n### Scenario 4: Prepare an operations query\n\n| Your request | Agent workflow |\n| --- | --- |\n| Prepare an order-list query for the sandbox application. Check the environment and read permission, then show the request before accessing orders. | Select the operations order-list contract and explicitly bind the application and environment. The preview does not fetch orders; an actual query requires an authorized business client and the relevant service role. |\n\n### Agent workflow\n\n```bash\nlimecloud-cli schema operations.order.list\nlimecloud-cli operations order list --app-id \"YOUR_APP_ID\" --environment sandbox --dry-run\n```\n\n[cli-case-operations](https://open.limeai.run/docs/cli-overview?locale=en#case-operations)\n\n<a id=\"case-finance\"></a>\n\n### Scenario 5: Prepare a trial-balance check\n\n| Your request | Agent workflow |\n| --- | --- |\n| Prepare a read-only trial-balance query for the specified period and currency. Do not create or reverse journals. | Inspect the finance contract and preview the exact period and currency. After an authorized query, preserve the returned monetary precision and currency when producing a summary. |\n\n### Agent workflow\n\n```bash\nlimecloud-cli schema operations.trial_balance.get\nlimecloud-cli operations trial_balance get --app-id \"YOUR_APP_ID\" --environment sandbox --period \"2026-10\" --currency CNY --dry-run\n```\n\n[cli-case-finance](https://open.limeai.run/docs/cli-overview?locale=en#case-finance)\n\n<a id=\"member-group-task\"></a>\n\n## Prepare and confirm a member-group change\n\nFor one organization group, use task group to prepare a create, rename or active/inactive change, review it, then explicitly confirm execution. The current organization Owner needs recent strong authentication and a controlled client allowed to request lime:open:read and lime:open:write. This source version includes the task; availability requires a matching released CLI package and server deployment.\n\nRead the exact schema first. Choose a stable group ID for creation and expected_revision=0; for updates use the original group ID and current revision from the group list. Keep the name and reason in the user's original language. Preparing saves a five-minute immutable review artifact without changing the group. Each actor can hold at most 20 unexpired preparations in one organization.\n\n```bash\nlimecloud-cli schema open.group_change.prepare\nlimecloud-cli open group list --space-id \"YOUR_SPACE_ID\"\nlimecloud-cli task group prepare --space-id \"YOUR_SPACE_ID\" --data @change.json\nlimecloud-cli task group get --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\" --format table\n```\n\n| Review | What to check |\n| --- | --- |\n| Person and scope | Actor, organization, client, audience and environment. Client environment does not create a sandbox copy of an organization group. |\n| Exact change | Original values, frozen group ID/name/status, reason, original revision and every authorization-source change. |\n| Confirmation and recovery | Original preparation ID, expiry and preview.confirmation_digest. The digest is an exact-match confirmation value; current authority is checked again when executing. |\n\n<a id=\"member-group-execute-recover\"></a>\n\n### Confirm once, recover by the original ID\n\nAfter the user has reviewed the complete preparation, pass its ID and exact digest to execute. JSON and table output preserve the review; task commands do not accept --fields or --yes. The CLI saves a private minimal recovery reference beside the selected credential file, then records an execution attempt before sending. If the process stops after that mark, including before any request is sent, use receipt or resolve. It never automatically repeats execution.\n\nA timeout or a missing receipt does not establish that nothing was committed. Read the original receipt, or explicitly resolve the original key: the server returns its committed receipt or permanently closes it without executing or undoing a change. Expiry or an execution-contract update does not remove original recovery. Preserve the issuer, API, client and organization; re-read with get if the local reference is missing. A local attempt mark is not evidence of a server commit.\n\n```bash\nlimecloud-cli task group execute --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\" --confirm \"EXACT_CONFIRMATION_DIGEST\"\nlimecloud-cli task group receipt --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\"\nlimecloud-cli task group resolve --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\"\n```\n\n[Inspect the formal task contracts](https://open.limeai.run/docs/cli-schema?locale=en)\n\n<a id=\"optional-method-candidates\"></a>\n\n## Inspect an optional method before installing\n\nChoose one optional method for your task in the existing Agent host. limecloud-login-diagnosis guides a read-only application configuration check; limecloud-member-group guides one prepared group change and original-result recovery. Each wrapper contains only its selected method. This source includes public candidates; commands require a CLI release that contains them, and native loading still needs separate verification.\n\nList and default inspection are offline: they do not read settings or credentials, call business APIs, install methods or change host settings. Inspect shows every file, source, version, exact digest, declared action contracts, read/write effect and the procedure in your selected language. Keep the complete review before selecting a candidate.\n\nUse inspect --online to compare every required action with your selected issuer and API deployment. It reads public metadata without credentials and retains the complete candidate and digest. Review each action, target, environment and expiry: matched is only a contract observation; different, absent or unknown needs attention. An unavailable or expired catalog remains unknown. This checks the bundled candidate, not a method already loaded by your host; authorization, provenance and withdrawal remain unevaluated. No business action or update is performed.\n\n```bash\nlimecloud-cli skills list\nlimecloud-cli skills inspect limecloud-login-diagnosis --host codex\nlimecloud-cli skills inspect limecloud-login-diagnosis --host skill\nlimecloud-cli skills inspect limecloud-login-diagnosis --online --issuer https://auth.limeai.run --api-origin https://api.limeai.run\n```\n\n| Method | Effect | Task boundary |\n| --- | --- | --- |\n| limecloud-login-diagnosis | read | Read configuration and explain complete or partial findings; actual login and repairs are separate. |\n| limecloud-member-group | write | Create, rename or change one group's status with preparation, concrete approval and original-result recovery. Members, roles and bulk changes are separate. |\n\n<a id=\"member-group-method\"></a>\n\n### Use a group method with a concrete review\n\nThe method keeps organization/group selection, field correction, complete impact review, confirmation and recovery in your current conversation. Its write label is derived from the declared formal HTTP actions, not from current permissions. Inspect all six action contracts before selecting it; reading or exporting the method never prepares or executes a change.\n\nUse task group for the actual change. Review the frozen original values, full command and impact, scope, preparation ID, digest and expiry, then approve that concrete preparation. A general request, method digest or an Agent copying --confirm is not this approval. After a persisted attempt or uncertain result, retain the original context and use receipt; explicitly chosen resolve returns the committed result or permanently closes the original key without executing or undoing a change. Never replace this recovery with a new preparation or low-level API retry.\n\n```bash\nlimecloud-cli skills inspect limecloud-member-group --host codex\nlimecloud-cli skills inspect limecloud-member-group --online --issuer https://auth.limeai.run --api-origin https://api.limeai.run\n```\n\n[Review the actual member-group task](https://open.limeai.run/docs/cli-overview?locale=en#member-group-task)\n\n<a id=\"single-method-delivery\"></a>\n\n### Export one candidate for a separate host choice\n\nPass the exact digest returned for the selected wrapper and a new ordinary directory. The codex wrapper contains a portable plugin.json and this single skill; the skill wrapper contains only the method and its language procedures for supported manual import. Export refuses existing directories, symlink ancestors and Agent discovery/configuration locations, and never executes artifact scripts.\n\nExported is separate from installed, enabled and loaded in the current session. Select installation or an update through the actual host manager; that manager remains the only update owner for its plugin. A normal CLI upgrade only provides a new bundled candidate and does not replace installed methods. Integrity matching the installed CLI is not independent provenance, online withdrawal status, live compatibility or authorization. Without host evidence, current session loading remains unknown.\n\nA delivery candidate can include a release manifest, the matching CLI archive, separately packaged methods and an optional local Codex source list. The manifest distinguishes a clean Git commit from an unpublished worktree snapshot whose commit is null. Local integrity checks compare these files with each other; they do not authenticate a publisher or register, install or load a method. Accept an actual release only through its trusted channel and the host's own management flow.\n\n```bash\nlimecloud-cli skills export limecloud-login-diagnosis --host codex --output-dir ./review-candidate --digest \"EXACT_SHA256_DIGEST\"\n```\n\n<a id=\"capability-map\"></a>\n\n## LimeCloud CLI capability map\n\n| Service | Capabilities |\n| --- | --- |\n| identity | Discovery, authorization, device flow, UserInfo, keys and token protocols. |\n| open | Workspaces, applications, configuration, clients, releases, distribution, events and collaborators. |\n| account | Personal account, workspace access, application installations, orders and account security. |\n| operations | Products, marketing, orders, notifications, finance and operations audit. |\n| admin | Platform reviews, access bindings and administration audit. |\n\n[Discover commands and schemas](https://open.limeai.run/docs/cli-schema?locale=en)\n\n<a id=\"commands\"></a>\n\n## Common authentication and setup commands\n\n| Goal | Command |\n| --- | --- |\n| Install and configure | limecloud-cli install |\n| Configure an existing public client | limecloud-cli config init |\n| Sign in | limecloud-cli auth login |\n| Inspect local sign-in state | limecloud-cli auth status |\n| Check an explicitly required scope | limecloud-cli auth check --scope \"REQUIRED_SCOPE\" |\n| Check local configuration | limecloud-cli doctor --offline |\n| Sign out | limecloud-cli auth logout |\n\n<a id=\"multiple-contexts\"></a>\n\n## Work with multiple environments\n\nKeep each environment's settings and credentials together in separate files using LIMECLOUD_SETTINGS and LIMECLOUD_CONFIG. The login binds the Issuer, public client and API Origin; changing the API Origin requires the appropriate new authorization context.\n\n[Configuration and credential isolation](https://open.limeai.run/docs/cli-configuration?locale=en)\n\n<a id=\"faq\"></a>\n\n## Frequently asked questions\n\n| Question | Next step |\n| --- | --- |\n| The command is not found after installation | Check the returned bin_directory and PATH. Start a new terminal or Agent process if its environment is stale. |\n| Setup returned configuration.status=pending | Run config init with the public CLI client and origins provided by your deployment administrator. |\n| The authorization code expired | Start auth login again and confirm the new code in your browser. |\n| A business API reports missing access | Inspect required_scopes in schema and check the client's allowed scopes and your service role. The default public client only grants identity scopes. |\n| Can my Agent install and authorize automatically? | It can run setup and return a verification link. Browser consent remains a user action; non-interactive setup does not start it unless explicitly requested. |\n\n[Troubleshooting](https://open.limeai.run/docs/cli-troubleshooting?locale=en)\n\n[Connect your Agent](https://open.limeai.run/docs/cli-agent-integration?locale=en)\n","revision":"sha256:fe1f125cec1671b4cb4c07b6c33798262abfbb55d00c4a85118e52a4d81bef80"},{"id":"cli-agent-integration","group":"cli","category":"LimeCloud CLI","title":"Connect your Agent","summary":"Use structured CLI calls, or connect to an explicitly enabled MCP resource for application reads. Each path has its own authorization.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-agent-integration?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"mcp-application-reads","title":"Read applications with MCP"},{"id":"mcp-scope-selection","title":"Choose the scope before reading configuration"},{"id":"mcp-results","title":"Keep reads inside the host"},{"id":"scenarios","title":"When to use this integration"},{"id":"schema","title":"1. Discover the exact method"},{"id":"credentials","title":"2. Bind identity and credentials"},{"id":"boundaries","title":"3. Define tool boundaries"},{"id":"review","title":"4. Preview and review requests"},{"id":"subprocess","title":"5. Call the CLI from Node.js"},{"id":"results","title":"6. Handle results, errors and cancellation"}],"markdown":"# Connect your Agent\n\nUse structured CLI calls, or connect to an explicitly enabled MCP resource for application reads. Each path has its own authorization.\n\n<a id=\"mcp-application-reads\"></a>\n\n## Read applications with MCP\n\nIf your deployment operator has enabled MCP and registered a public client for your native host, connect to the canonical API origin followed by /mcp. The resource advertises its authorization server through /.well-known/oauth-protected-resource/mcp. Use the host's OAuth sign-in with S256 PKCE; both authorization and token requests must name that exact resource. A CLI access token or browser cookie cannot sign in to this resource.\n\nThis implementation supports MCP 2026-07-28 and 2025-11-25 over stateless Streamable HTTP. A host must support one of these versions and the configured callback. No dynamic registration or CIMD is advertised. Exact Codex, Claude Code and WorkBuddy host workflows remain to be verified; deployment availability and host support must be checked separately.\n\n| Tool | Input | Result and boundary |\n| --- | --- | --- |\n| lime_open_space_list | cursor? | Up to 100 spaces with current active membership. The original space-ID cursor continues the list; it does not grant membership or application access. |\n| lime_open_application_list | space_id, q?, limit?, cursor? | One authorized page in the selected space, with optional name or exact-ID search. limit is 1–50, default 20. Its cursor is bound to the user, space and search. |\n| lime_open_application_get | space_id, application_id | Current authorized application projection. The owner checks current membership and application access on every call. |\n| lime_open_client_list | space_id, application_id, environment, limit?, cursor? | One page of login-client metadata, with no secret. Requires current client-management permission. limit is 1–50, default 20; next_cursor means more data remains. |\n| lime_open_login_diagnose | space_id, application_id, environment, limit?, cursor? | The same version-2 application diagnosis used by HTTP and CLI: one bounded page, safe client summaries, individual source times and coverage. Configuration candidates do not verify login. An unreadable application is a tool error; unreadable clients produce a partial report. |\n\n<a id=\"mcp-scope-selection\"></a>\n\n## Choose the scope before reading configuration\n\n1. If the space ID is unknown, request one page of spaces and show the returned IDs and names. Reuse an explicit current choice when it is still appropriate; ask the user to choose when several spaces match.\n2. Read applications only in that selected space. Use q to narrow by name or exact ID, and show the authorized candidates. An empty result means no current match in this scope; it does not prove the entire platform has no application.\n3. Let the user choose ambiguous application results. A next_cursor marks partial coverage; fetch another page only when explicitly continuing the same selection. Do not silently inspect all spaces, choose the first result or switch the query while reusing a cursor.\n4. After choosing the application, ask for sandbox or production and call lime_open_login_diagnose for a bounded configuration report. Use the original detail and client tools when their data is needed. Present results inside the current host. Every source rechecks current access; a previous selection cannot bypass revocation.\n\n<a id=\"mcp-results\"></a>\n\n## Keep reads inside the host\n\nThe tools provide inputSchema, outputSchema, structuredContent and matching text content, so your host can present a table, detail or follow-up question. Keep continuation within the selected user's scope and unchanged query. Space discovery returns the original space-ID cursor; application and client cursors additionally bind their exact query and scope. These reads do not test an actual sign-in, repair configuration or execute the member-group task.\n\nPreserve schema_version:2, check_code, individual evidence times and coverage in the shared diagnosis. login_verified and common_snapshot are always false. A continuation remains partial even when it has no next cursor. The CLI additionally reports contract_check and actual HTTP transport; neither replaces the application's source evidence. Do not recompute or upgrade the owner's conclusion in the host.\n\nAuthorization failures may be HTTP 401/403 before a tool runs, while domain failures use isError with a stable error code and a request ID. Do not interpret a tool annotation, successful discovery or software version as access. Use the host's supported interaction first; open an actual built-in browser, then a trusted URL, only for an unsupported or unsuitable step or an explicit user choice.\n\n[CLI overview](https://open.limeai.run/docs/cli-overview?locale=en)\n\n<a id=\"scenarios\"></a>\n\n## When to use this integration\n\nUse this approach when your Agent needs to work with Lime while your host controls credential delivery, command access, approvals, timeouts and logs. The integration calls the CLI as a process; it does not require a Go plugin or a custom build of the CLI.\n\n[cli-agent-workflow](https://open.limeai.run/docs/cli-agent-integration?locale=en#scenarios)\n\n| Integration task | Lime mechanism | Host responsibility |\n| --- | --- | --- |\n| Supply credentials | auth login / LIMECLOUD_ACCESS_TOKEN | Isolate each user's session and keep tokens out of arguments and logs. |\n| Select service origins | --issuer / --api-origin | Use configured, trusted deployments and preserve login binding. |\n| Limit tool access | schema: _meta / inputSchema | Maintain an explicit command allowlist and validate structured input. |\n| Review a write | --dry-run | Obtain approval for the exact request before executing it. |\n| Observe results | --json / exit status | Record method, outcome and safe error codes; redact sensitive values. |\n| Manage process lifecycle | stdin / stdout / stderr | Bound execution time and output, and handle cancellation and unknown outcomes. |\n\n<a id=\"schema\"></a>\n\n## 1. Discover the exact method\n\nRead schema before constructing a tool call. inputSchema describes the accepted carriers and fields; outputSchema describes the response. _meta provides the method, path, origin, required_scopes and risk. These are inspection facts, not a grant of access.\n\n```bash\nlimecloud-cli api list application --json\nlimecloud-cli schema open.application.list --json\n```\n\n<a id=\"credentials\"></a>\n\n## 2. Bind identity and credentials\n\nUse device login for an interactive user's session. With --no-wait the Agent receives a verification link and user code, which it can show to that user; resume only after the user completes the browser step.\n\nA host with its own token service may provide LIMECLOUD_ACCESS_TOKEN to the child process. It must bind the correct user, origins and business context itself. External token mode does not obtain or refresh that token for the host.\n\n```bash\nlimecloud-cli auth login --no-wait --json\nlimecloud-cli auth login --resume --json\nlimecloud-cli auth status --json\n```\n\n[Authentication and scope checks](https://open.limeai.run/docs/cli-auth?locale=en)\n\n<a id=\"boundaries\"></a>\n\n## 3. Define tool boundaries\n\nExpose an explicit list of methods to your model. Validate inputs against the matching schema and construct an argument array. Do not accept an arbitrary shell command from model output.\n\nKeep the Issuer and API Origin in trusted host configuration. For multiple users or deployments, use separate settings and credential files. The server still checks scopes, workspace membership, application access, roles and any stronger authentication required by an operation.\n\n[Settings and credential storage](https://open.limeai.run/docs/cli-configuration?locale=en)\n\n<a id=\"review\"></a>\n\n## 4. Preview and review requests\n\nUse --dry-run with validated fields to inspect the exact target and request without sending it. Your host owns the approval step. If approved, execute the same method and inputs without --dry-run; preserve the resource revision and any required idempotency or confirmation fields.\n\n```bash\nlimecloud-cli open application list --space-id \"YOUR_SPACE_ID\" --dry-run --json\n```\n\n[Request previews](https://open.limeai.run/docs/cli-dry-run?locale=en)\n\n<a id=\"subprocess\"></a>\n\n## 5. Call the CLI from Node.js\n\nFor a Node.js Agent, add the CLI package to that Agent's dependencies. Resolve its JavaScript entry and call it with Node and an argument array, so the example also works without a shell or a platform-specific command shim. This example only reads an offline schema.\n\n```javascript\nimport { execFile } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { promisify } from \"node:util\";\n\nconst require = createRequire(import.meta.url);\nconst entry = require.resolve(\"@limecloud/cli/bin/limecloud-cli.mjs\");\nconst run = promisify(execFile);\nconst { stdout } = await run(process.execPath, [\n entry, \"schema\", \"open.application.list\", \"--json\",\n], { timeout: 15_000, maxBuffer: 1_048_576 });\nconst result = JSON.parse(stdout);\nif (!result.ok) throw new Error(result.error.code);\nconsole.log(result.data.inputSchema);\n```\n\n<a id=\"results\"></a>\n\n## 6. Handle results, errors and cancellation\n\nParse stdout as JSON and inspect ok, data and stable error.code. Human progress and device-authorization notices may be written to stderr. A nonzero exit or malformed output must stop the tool call; a localized message is not a programmatic error identifier.\n\nA timeout or cancellation during a write may leave its result unknown. Inspect the actual resource state before deciding whether another request is safe. Keep audit logs to necessary identifiers and outcomes; do not log access tokens, pending device codes or raw credential files.\n\n| Code | Recovery |\n| --- | --- |\n| invalid_arguments | Read schema and correct the input before retrying. |\n| login_required / token_expired | Restore the correct login context or start a new user authorization. |\n| missing_scopes | Check the client's allowed business scopes and the user's permission; do not silently broaden authorization. |\n| api_origin_required | Configure the intended business API Origin explicitly. |\n| request_failed / cancelled | Check resource state before retrying a write with an unknown outcome. |\n\n[Output contracts](https://open.limeai.run/docs/cli-output?locale=en)\n","revision":"sha256:34a41d9820e61d0e4dd7bc9f9ea89dec93fc58fd5d76793fe9d21d67309306ae"},{"id":"cli-installation-guide","group":"cli","category":"LimeCloud CLI","title":"LimeCloud CLI installation guide","summary":"A step-by-step setup guide for users and AI Agents, with browser consent kept in the user's hands.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-installation-guide?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"requirements","title":"Requirements"},{"id":"install","title":"Step 1: Install"},{"id":"configuration","title":"Step 2: Confirm deployment configuration"},{"id":"login","title":"Step 3: Complete user authorization when needed"},{"id":"verify","title":"Step 4: Verify"},{"id":"next","title":"Next steps"}],"markdown":"# LimeCloud CLI installation guide\n\nA step-by-step setup guide for users and AI Agents, with browser consent kept in the user's hands.\n\n<a id=\"requirements\"></a>\n\n## Requirements\n\nUse Node.js 22.12 or later and npm/npx. The 0.7.0 package adds the installation flow described here; check the actual npm release before expecting new commands. You do not need Go or Python for npm installation.\n\n```bash\nnode --version\nnpm --version\n```\n\n<a id=\"install\"></a>\n\n## Step 1: Install\n\nRun the installer and read its result. It installs the exact version that is running into the user prefix ~/.local, returns the executable directory and leaves shell configuration unchanged. Use --prefix to choose another directory.\n\n```bash\nnpx @limecloud/cli@latest install\n```\n\n<a id=\"configuration\"></a>\n\n## Step 2: Confirm deployment configuration\n\nBy default setup discovers public CLI metadata at https://auth.limeai.run/runtime/v1/cli. For a custom Issuer it uses that Issuer's endpoint. The response supplies an existing public Client ID, API Origin and openid profile email offline_access; existing explicit settings take priority.\n\nIf discovery is unavailable and no Client ID is available, non-interactive setup reports configuration.status=pending. Ask the deployment administrator for the public CLI Client ID and origins, then run the configuration command. Do not substitute a client secret or create a platform application automatically.\n\n```bash\nlimecloud-cli config init \\\n --issuer \"https://YOUR_AUTH_ORIGIN\" \\\n --api-origin \"https://YOUR_API_ORIGIN\" \\\n --client-id \"YOUR_REGISTERED_PUBLIC_CLI_CLIENT_ID\"\nlimecloud-cli config show\n```\n\n<a id=\"login\"></a>\n\n## Step 3: Complete user authorization when needed\n\nInteractive setup can offer login; the user must choose it. For Agent setup, start a nonblocking login, show the returned verification_uri and user_code, then let the user review and confirm in their browser. Resume after that step. Never approve browser consent on the user's behalf.\n\n[cli-device-authorization](https://open.limeai.run/docs/cli-installation-guide?locale=en#login)\n\n```bash\nlimecloud-cli auth login --no-wait --json\nlimecloud-cli auth login --resume --json\n```\n\n<a id=\"verify\"></a>\n\n## Step 4: Verify\n\nCheck the installed command, local setup and public contract separately. auth status and doctor --offline inspect local state; schema does not request business data. If PATH is not available to your current process, use the returned executable path or start a new terminal or Agent after updating PATH.\n\n```bash\nlimecloud-cli --version\nlimecloud-cli auth status\nlimecloud-cli doctor --offline\nlimecloud-cli schema open.application.list\n```\n\n<a id=\"next\"></a>\n\n## Next steps\n\nNo global Agent Skills are installed. The default identity scopes do not authorize business methods. Read the target method's schema, obtain an allowed client and the required service access, and review a dry run before making a business request.\n\n[Start your first task](https://open.limeai.run/docs/cli-overview?locale=en)\n\n[Connect your Agent](https://open.limeai.run/docs/cli-agent-integration?locale=en)\n","revision":"sha256:93473c2bd8b783b1fad53903e2e9ef22a8a8ef83add3e493d06f2490f9b25554"},{"id":"platform-knowledge","group":"guide","category":"Understand the platform","title":"Platform knowledge navigator","summary":"Understand the platform, find the right task guide and check the current contract before taking action.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/platform-knowledge?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"start","title":"Start with your question"},{"id":"map","title":"Find the right workspace"},{"id":"responsibilities","title":"Know what each source tells you"},{"id":"availability","title":"Check availability and access"}],"markdown":"# Platform knowledge navigator\n\nUnderstand the platform, find the right task guide and check the current contract before taking action.\n\n<a id=\"start\"></a>\n\n## Start with your question\n\nLime's guides explain product concepts, complete workflows and recovery steps for developers, customers and authorized operators. Read the overview, choose a task, then follow the linked guide. You can ask an Agent to explain the material in your current conversation without starting a business operation.\n\n[Platform overview](https://open.limeai.run/docs/platform-overview?locale=en)\n\n[Find a task guide](https://open.limeai.run/docs/platform-task-guides?locale=en)\n\n[Read with an Agent](https://open.limeai.run/docs/cli-knowledge?locale=en)\n\n<a id=\"map\"></a>\n\n## Find the right workspace\n\nYour role and display surface are separate. You may use an existing Agent host such as Codex, Claude Code or WorkBuddy for supported tasks; the server still checks the person, space, application, environment and resource. Holding several roles does not let one person independently approve their own submission.\n\n| Entry | Use it for |\n| --- | --- |\n| Open Platform | Read integration guides; create, configure, test and publish applications within your developer access. |\n| Application Center and User Center | Discover applications; manage permitted installations, personal authorization, purchases, access and account security. |\n| Operations Portal | Carry out assigned application operations, customer support, finance and explicitly delegated review tasks. |\n| Administration | Manage platform governance, security and role delegation; business reviews still require the appropriate independent reviewer. |\n| Authentication | Complete sign-in, device authorization, personal consent and required authentication checks. |\n\n[Workspaces](https://open.limeai.run/docs/workspaces?locale=en)\n\n[Application concepts](https://open.limeai.run/docs/application-concepts?locale=en)\n\n[Scopes and permissions](https://open.limeai.run/docs/scopes?locale=en)\n\n<a id=\"responsibilities\"></a>\n\n## Know what each source tells you\n\n| Source | What it tells you |\n| --- | --- |\n| Product guides | Concepts, relationships, prerequisites, workflows and recovery methods. |\n| Skills | How to organize a task and which guides and formal tools to consult. Reading a guide does not install a Skill. |\n| Schema and capability discovery | Supported actions, exact inputs, outputs and compatibility requirements. |\n| Authorized APIs | Current state, current permission and actual execution results. An article cannot grant access or prove an operation succeeded. |\n\n<a id=\"availability\"></a>\n\n## Check availability and access\n\nRead these guides on the website or use the CLI knowledge commands to list, search and read public material in your current host. The CLI includes an offline snapshot; --online explicitly reads a documentation deployment. Check the source and revision before continuing. MCP knowledge access and protected operations playbooks remain planned, and each business capability retains the status in its guide and current API contract.\n\nInternal operations material is separate from the public guide. Access to a playbook, its search excerpts and attachments must be authorized; knowing the procedure does not grant permission to execute it.\n","revision":"sha256:884db88f2c4da38b3beb0b663215e3bbdbb1a32396b60e8b468522dfa03cc761"},{"id":"platform-task-guides","group":"guide","category":"Understand the platform","title":"Task guides by role","summary":"Choose a goal, check its prerequisites and follow the original guide through results and recovery.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/platform-task-guides?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"developer","title":"Develop and publish an application"},{"id":"customer","title":"Install, authorize and use an application"},{"id":"operations","title":"Operate, review and investigate"},{"id":"continue","title":"Continue in your current Agent"}],"markdown":"# Task guides by role\n\nChoose a goal, check its prerequisites and follow the original guide through results and recovery.\n\n<a id=\"developer\"></a>\n\n## Develop and publish an application\n\nStart with an authorized space and the target application and environment. Application registration, OAuth clients, configuration revisions, releases, distribution and customer installation are separate records. Publishing an application does not grant every customer access or automatically approve API consumption.\n\n1. Read the application concepts and development workflow; select only the capabilities your product needs.\n2. Configure clients, scopes and any required event delivery; test against the applicable contract.\n3. Follow the guide for freezing configuration, independent review, publication and installation. Check the original result before retrying a request with an unknown outcome.\n\n[Development workflow](https://open.limeai.run/docs/development-workflow?locale=en)\n\n[OAuth clients](https://open.limeai.run/docs/oauth-clients?locale=en)\n\n[Release and review](https://open.limeai.run/docs/releases?locale=en)\n\n[Event delivery](https://open.limeai.run/docs/webhooks?locale=en)\n\n<a id=\"customer\"></a>\n\n## Install, authorize and use an application\n\nChoose your personal or authorized organization space. Installation, the customer's approval, your personal consent, purchase and entitlement are independent checks. A successful payment does not prove access is already provisioned, and installation does not grant administrator permissions.\n\n1. Read the installation and access requirements for the selected release and space.\n2. Complete any required customer approval, personal consent and commercial steps in the designated flow.\n3. If access is delayed, check the original order, payment result and entitlement with authorized tools. Keep the original reference; do not pay again to resolve an unknown result.\n\n[Application installation](https://open.limeai.run/docs/installations?locale=en)\n\n[Entitlements and licenses](https://open.limeai.run/docs/entitlements-licenses?locale=en)\n\n<a id=\"operations\"></a>\n\n## Operate, review and investigate\n\nPublic guides explain the boundaries. Detailed internal playbooks require the relevant access and are not included in these public pages. Features still being built retain the status stated in their original guide.\n\n| Task | Before taking action | Result and recovery |\n| --- | --- | --- |\n| Investigate an order or delivery | Assigned application, environment, readable fields and original operation. | Read source receipts and delivery state. Retry, refund or re-provision only through a supported, separately authorized action. |\n| Review or manage risk | Current role, precise object, independent reviewer and any required authentication. | Use the original decision and audit trail. Switching roles does not make you a second reviewer. |\n| Inspect financial accounts | Ledger access, application, period, currency and source completeness. | Distinguish payment, provisioning and accounting delay. Preserve exact amounts; do not repeat a charge to repair delayed accounting. |\n\n[Audit and notifications](https://open.limeai.run/docs/audit-notifications?locale=en)\n\n[Financial accounts](https://open.limeai.run/docs/finance-ledger?locale=en)\n\n[Incident response](https://open.limeai.run/docs/incident-response?locale=en)\n\n<a id=\"continue\"></a>\n\n## Continue in your current Agent\n\nAsk your Agent to explain the relevant guide first. For a supported task, keep inputs, validation, confirmation and results in the current host. Use an embedded browser for an unadapted or unsuitable step when available, otherwise use a trusted URL; you may also choose the original backend. Sign-in, MFA and hosted payment steps follow their own requirements. Opening a page does not prove completion.\n\n[Agent reading guide](https://open.limeai.run/docs/cli-knowledge?locale=en)\n\n[Agent integration overview](https://open.limeai.run/docs/cli-agent-overview?locale=en)\n","revision":"sha256:b4cbe40bf5b13fcd22432ede664efbb70540f34e6e7952cfed32e2cbfe76b7b7"},{"id":"cli-knowledge","group":"cli","category":"LimeCloud CLI","title":"Read platform knowledge with your Agent","summary":"Use product guides to understand a task, then inspect the current schema and authorized state before acting.","locale":"en","requested_locale":"en","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-knowledge?locale=en","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"read","title":"Read only what the task needs"},{"id":"current","title":"What you can use today"},{"id":"actions","title":"Follow an action to its task guide"},{"id":"versions","title":"Check freshness and compatibility"},{"id":"safety","title":"Keep reading and execution separate"}],"markdown":"# Read platform knowledge with your Agent\n\nUse product guides to understand a task, then inspect the current schema and authorized state before acting.\n\n<a id=\"read\"></a>\n\n## Read only what the task needs\n\n1. Start with the platform knowledge navigator and choose a role or task. Search the documentation website when you need a concept, prerequisite or recovery guide.\n2. Ask your Agent to read the relevant accessible page or provide its contents in your conversation. Explain the material using text, tables, steps and source links supported by your host.\n3. For an explanation, stop after answering the question. When you request a query or change, discover the current method schema and check the real account and resource context first.\n\n[Platform knowledge navigator](https://open.limeai.run/docs/platform-knowledge?locale=en)\n\n[Task guides by role](https://open.limeai.run/docs/platform-task-guides?locale=en)\n\n[Discover the schema](https://open.limeai.run/docs/cli-schema?locale=en)\n\n<a id=\"current\"></a>\n\n## What you can use today\n\nUse docs list, docs search and docs read to read public knowledge without signing in. Reading defaults to Markdown; --json includes structured source, language, revision and distribution metadata. List and search also support tables, CSV and NDJSON. The short docs ARTICLE form still prints a Web URL and does not open a browser. Reading does not install Agent Skills.\n\nThe public machine entry is https://open.limeai.run/llms.txt: choose a language, then a topic index and the required Markdown article. Both the website build and CLI snapshot come from the same public article registry. If your installed CLI does not list these commands in docs --help, obtain a trusted build that includes them before using the examples.\n\n> The default bundled snapshot is offline and does not prove current online capability. --online uses a trusted documentation deployment without business credentials; online keyword search matches metadata, while bundled search also matches body text. Results default to 10 and are limited to 50 per page. MCP knowledge access and protected operations playbooks remain planned.\n\n```bash\nlimecloud-cli docs list --group guide --limit 5 --format table --fields id,title\nlimecloud-cli docs search \"platform knowledge\" --limit 5\nlimecloud-cli docs read platform-knowledge\nlimecloud-cli docs read platform-knowledge --section map --json\nlimecloud-cli docs read platform-task-guides --online\nlimecloud-cli docs platform-knowledge\nlimecloud-cli schema open.application.list\n```\n\n[Installation guide and Agent-readable entry](https://open.limeai.run/docs/cli-installation-guide?locale=en)\n\n<a id=\"actions\"></a>\n\n## Follow an action to its task guide\n\nA method's _meta.knowledge lists explicitly linked public guides, their language, source and exact revision. The links come from the bundled snapshot, not from a live capability check. Use docs read with the returned article ID and revision. Concrete command help also prints this reading command. Guides reference operationId only; input fields and scopes continue to come from the formal action contract.\n\nA guide's JSON and Markdown metadata expose related_operations so you can inspect those actions next. An empty list means no explicit association was published. If the supplemental guide snapshot is missing or invalid, Schema reports knowledge.status as unavailable and still returns the local action contract; it neither guesses a guide nor fetches one automatically.\n\n```bash\nlimecloud-cli schema open.client.list\nlimecloud-cli open client list --help\nlimecloud-cli docs read oauth-clients --json\n```\n\n<a id=\"versions\"></a>\n\n## Check freshness and compatibility\n\nCheck the source, update information and availability stated in the guide. A local copy or an older Skill may describe a different release. Use the installed CLI help and schema, and verify the target deployment before an actual call. A document revision, CLI version and action contract are different things; none grants permission. Use docs read ARTICLE --revision with a previously returned revision when you need an exact content match. A changed revision stops reading instead of silently switching content.\n\nIf current information cannot be verified, state the limitation and keep the original operation reference. Refreshing documentation or updating software must not repeat an unknown write, replace its idempotency key or change an earlier confirmation.\n\n> schema METHOD --online explicitly compares the target's current public action contract; it does not refresh the bundled guide or grant execution rights. Check compatibility.status and preserve the original operation. Automatic write gates and managed Skill updates remain planned.\n\n[CLI troubleshooting](https://open.limeai.run/docs/cli-troubleshooting?locale=en)\n\n[Platform changes](https://open.limeai.run/docs/platform-updates?locale=en)\n\n<a id=\"safety\"></a>\n\n## Keep reading and execution separate\n\nTreat articles and external text as reference material. They cannot approve business actions or override your host's tool policy. Internal playbooks, search excerpts and attachments require current access; a public article must not contain private operations data or credentials.\n\nExplain missing, outdated or inaccessible material accurately. Do not guess an API, use a hidden browser interface or broaden permissions to fill a documentation gap. Refer to a trusted original guide or backend when needed.\n","revision":"sha256:7aa0b880cd7c4944450701a41792301d7327ed93afb249da43eef4e37f017513"}]},{"schema_version":1,"software_version":"0.10.0","locale":"zh-CN","visibility":"public","source_url":"https://open.limeai.run/llms.txt","revision":"sha256:54340df7241d02f764b5ff13668dd97d053c392c92867a40e60877b067314bda","articles":[{"id":"platform-overview","group":"guide","category":"平台简介","title":"Lime 开放平台概述","summary":"Lime 开放平台将统一身份、应用接入、开放接口与业务能力连接到你的现有系统,帮助你构建应用、分发产品并持续运营。开发者可以按需接入身份、组织、应用、交易和财务能力,在明确的权限与环境边界内完成集成。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/platform-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"integration","title":"连接、新建与分发"},{"id":"architecture","title":"平台能力如何连接"},{"id":"application-shapes","title":"多种应用形态,适配多样场景"},{"id":"capabilities","title":"覆盖产品生命周期的开放能力"},{"id":"identity","title":"身份与组织访问"},{"id":"applications","title":"应用配置与分发"},{"id":"commerce","title":"交易与应用权益"},{"id":"finance","title":"财务、运营与审计"},{"id":"journey","title":"快速入门"},{"id":"developer-tools","title":"开发工具"},{"id":"support","title":"技术支持与问题排查"}],"markdown":"# Lime 开放平台概述\n\nLime 开放平台将统一身份、应用接入、开放接口与业务能力连接到你的现有系统,帮助你构建应用、分发产品并持续运营。开发者可以按需接入身份、组织、应用、交易和财务能力,在明确的权限与环境边界内完成集成。\n\n<a id=\"integration\"></a>\n\n## 连接、新建与分发\n\n[integration-scenarios](https://open.limeai.run/docs/platform-overview?locale=zh-CN#integration)\n\n<a id=\"architecture\"></a>\n\n## 平台能力如何连接\n\nLime 将用户身份、空间访问权、应用配置和商业权益分别管理。网页、桌面与命令行应用通过标准协议、资源接口和签名事件接入;应用仍保留自己的运行环境与业务数据。\n\n[platform-architecture](https://open.limeai.run/docs/platform-overview?locale=zh-CN#architecture)\n\n<a id=\"application-shapes\"></a>\n\n## 多种应用形态,适配多样场景\n\n根据代码运行位置、是否能够安全保存 Client Secret 选择接入方式。应用归属和分发类型与登录客户端类型分别配置。\n\n| 应用形态 | 接入方式 | 开始接入 |\n| --- | --- | --- |\n| 网页应用 | 服务端回调或 Public 浏览器客户端通过授权码与 S256 PKCE 登录。 | 网页登录教程 |\n| 桌面与移动应用 | 使用系统浏览器与精确登记的回调,通过操作系统凭据库保护令牌。 | 原生应用接入 |\n| 命令行与设备 | 通过设备授权,将终端连接到用户在浏览器中明确批准的登录事务。 | 设备授权教程 |\n| 服务端集成 | 机器身份仅能访问允许的 Audience;管理用户资源需要本人委托授权。 | 服务端接入指南 |\n\n[应用归属与类型](https://open.limeai.run/docs/application-types?locale=zh-CN)\n\n[客户端接入参考](https://open.limeai.run/docs/client-overview?locale=zh-CN)\n\n<a id=\"capabilities\"></a>\n\n## 覆盖产品生命周期的开放能力\n\n从应用所需能力开始接入。接口参考提供每个已实现公共操作的输入、响应、委托 Scope 与 CLI 示例;服务端在每次调用中重新校验当前用户与资源访问权。\n\n<a id=\"identity\"></a>\n\n### 身份与组织访问\n\n通过 OAuth 2.0、OpenID Connect、S256 PKCE 和设备授权接入统一登录。用户可以在个人与企业空间间工作,资源仍归属原空间;会话撤销和当前成员关系会持续影响访问权。\n\n[OAuth 与 OpenID Connect](https://open.limeai.run/docs/oauth-overview?locale=zh-CN)\n\n[账号与工作空间](https://open.limeai.run/docs/account-spaces?locale=zh-CN)\n\n<a id=\"applications\"></a>\n\n### 应用配置与分发\n\n登记自建或合作应用,配置客户端、Scope、协作者与测试范围,再冻结版本并提交独立审核。显式发布与安装决定将开发配置和正式访问分开。\n\n[开发流程](https://open.limeai.run/docs/development-workflow?locale=zh-CN)\n\n[版本与发布](https://open.limeai.run/docs/releases?locale=zh-CN)\n\n[应用安装](https://open.limeai.run/docs/installations?locale=zh-CN)\n\n<a id=\"commerce\"></a>\n\n### 交易与应用权益\n\n发布商品与活动,通过服务端报价创建订单,并使用原幂等键恢复操作。沙箱付款与退款会更新权益以及持久化财务、收据来源;生产支付、订阅和完整许可证交付仍在建设中。\n\n[commerce-flow](https://open.limeai.run/docs/platform-overview?locale=zh-CN#commerce)\n\n[商品与定价](https://open.limeai.run/docs/products-pricing?locale=zh-CN)\n\n[订单与恢复](https://open.limeai.run/docs/checkout-orders?locale=zh-CN)\n\n[权益与许可证](https://open.limeai.run/docs/entitlements-licenses?locale=zh-CN)\n\n<a id=\"finance\"></a>\n\n### 财务、运营与审计\n\n受控资源接口提供当前已实现的账套、平衡分录、冲正、试算、营销、通知和审计任务。平台角色、环境、强认证与已过账事实保持原有约束,委托 Scope 不会产生财务角色。\n\n[账簿与凭证接入](https://open.limeai.run/docs/finance-ledger?locale=zh-CN)\n\n[审计与通知](https://open.limeai.run/docs/audit-notifications?locale=zh-CN)\n\n<a id=\"journey\"></a>\n\n## 快速入门\n\n1. 选择空间与应用类型,在开发者后台创建应用。\n2. 配置客户端、回调与最小 Scope,使用符合条件的测试成员在沙箱联调。\n3. 冻结需要上线的配置,提交独立审核,并显式发布已批准版本。\n\n[创建第一个应用](https://open.limeai.run/docs/create-application?locale=zh-CN)\n\n[接入网页登录](https://open.limeai.run/docs/pkce-tutorial?locale=zh-CN)\n\n[发布第一个版本](https://open.limeai.run/docs/first-release-tutorial?locale=zh-CN)\n\n<a id=\"developer-tools\"></a>\n\n## 开发工具\n\n使用接口参考查看精确字段,通过 CLI 发现 Schema、预演请求并执行已授权操作。客户端指南说明浏览器、原生与服务端的接入边界。开发工具不会绕过资源权限或近期强认证。\n\n[服务端接口参考](https://open.limeai.run/docs/api-overview?locale=zh-CN)\n\n[客户端接入](https://open.limeai.run/docs/client-overview?locale=zh-CN)\n\n[LimeCloud CLI](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n[接入诊断](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n\n<a id=\"support\"></a>\n\n## 技术支持与问题排查\n\n从错误码、操作、环境与脱敏请求标识开始排查,重试前核对客户端登记、回调、本人同意及当前资源访问权。截图与排障记录不包含令牌、Secret 或恢复码。\n\n[常见问题](https://open.limeai.run/docs/integration-faq?locale=zh-CN)\n\n[错误与恢复](https://open.limeai.run/docs/errors?locale=zh-CN)\n\n[安全检查](https://open.limeai.run/docs/security?locale=zh-CN)\n","revision":"sha256:83e906d7f28eaa24d129bb9baf7f3f22e61bd85e94148098b7179b8d01cb2118"},{"id":"application-types","group":"guide","category":"开始开发","title":"选择应用类型","summary":"了解自建、合作和官方应用,确定归属与分发方式。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-types?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"types","title":"三类应用"},{"id":"ownership","title":"归属与运行形态"}],"markdown":"# 选择应用类型\n\n了解自建、合作和官方应用,确定归属与分发方式。\n\n<a id=\"types\"></a>\n\n## 三类应用\n\n| 类型 | 适用场景 | 分发方式 |\n| --- | --- | --- |\n| 自建应用 | 工作空间为自身组织开发应用。 | 配置正式私有可用范围,不申请公开上架。 |\n| 合作应用 | 独立开发者向客户提供应用。 | 公开展示须具备开发者资格、正式版本并通过上架审核。 |\n| 官方应用 | 由 Lime 维护,创建受平台权限控制。 | 发布和分发仍须通过适用审核。 |\n\n<a id=\"ownership\"></a>\n\n## 归属与运行形态\n\n网页、桌面和 CLI 是运行形态,不是额外的应用类型。同一应用使用一个 Application ID,并分别配置沙箱和正式客户端。拥有应用不代表具备平台审核、运营或财务角色。\n\n[工作空间指南](https://open.limeai.run/docs/workspaces?locale=zh-CN)\n\n[发布指南](https://open.limeai.run/docs/releases?locale=zh-CN)\n","revision":"sha256:c64b044b310095ac1593add8847434e05bb8849fda774e595936c66396adaf47"},{"id":"workspaces","group":"guide","category":"开始开发","title":"工作空间与组织成员","summary":"明确个人和组织归属,在应用协作前完成组织成员管理。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/workspaces?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_space_list","management_open_space_create","management_open_member_list","management_account_space_list"],"sections":[{"id":"choose","title":"选择归属空间"},{"id":"members","title":"邀请组织成员"}],"markdown":"# 工作空间与组织成员\n\n明确个人和组织归属,在应用协作前完成组织成员管理。\n\n<a id=\"choose\"></a>\n\n## 选择归属空间\n\n空间选择限定当前任务范围,不会转移应用归属,也不会隐式改变登录或账务中的客户上下文。\n\n1. 登录开发者后台,在应用列表上方选择目标工作空间。\n2. 需要组织空间时,使用“创建企业空间”并填写名称。继续操作前确认具备该空间管理权限。\n3. 创建应用、邀请成员或申请开发者资格前,再次确认已选空间。\n\n[打开应用列表](https://open.limeai.run/app)\n\n<a id=\"members\"></a>\n\n## 邀请组织成员\n\n个人空间不提供组织邀请。组织成员身份本身不授予应用管理员权限,也不允许读取所有应用数据。\n\n1. 组织所有者或管理员打开成员页,向成员邮箱发出邀请。\n2. 接收人使用受邀且已验证的邮箱登录,查看原邀请并显式接受。\n3. 成员关系生效后,分别授予应用协作职责或测试资格。\n\n[应用协作](https://open.limeai.run/docs/collaboration?locale=zh-CN)\n","revision":"sha256:da1d326a410fad7fdf5c5857f2c91483b1ba1b08f3de6496c290b110e03a07a6"},{"id":"create-application","group":"guide","category":"开始开发","title":"创建应用","summary":"创建第一个应用草稿,准备接入所需配置。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/create-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"create","title":"创建草稿"},{"id":"next","title":"准备接入"}],"markdown":"# 创建应用\n\n创建第一个应用草稿,准备接入所需配置。\n\n<a id=\"create\"></a>\n\n## 创建草稿\n\n名称最多 32 个字符,简介最多 120 个字符。中文翻译须同时包含名称和简介。创建官方应用需要显式平台角色。\n\n1. 打开开发者后台,确认归属工作空间,选择自建应用或合作应用。\n2. 点击创建应用,填写英文名称和简介;可同时填写简体中文名称和简介。\n3. 选择预设图标和背景后提交一次,成功后进入应用基础信息页。\n\n[前往后台创建](https://open.limeai.run/app)\n\n<a id=\"next\"></a>\n\n## 准备接入\n\n1. 在基础信息中记录 Application ID,再单独登记登录客户端;Application ID 与 Client ID 是不同标识。\n2. 配置所需 Scope 和精确回调地址,添加测试成员,使用沙箱客户端完成首次登录。\n3. 完成联调前保持草稿状态。创建草稿不会让应用在正式环境可用。\n\n[登记登录客户端](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[配置权限](https://open.limeai.run/docs/scopes?locale=zh-CN)\n","revision":"sha256:ad83aef18836a1cf98bdeddbfddb44c360bb102661bfc8c6585d7e077b52a09f"},{"id":"application-profile","group":"guide","category":"构建应用","title":"应用资料与图标","summary":"维护双语应用资料和用户授权时看到的应用形象。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-profile?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"profile","title":"编辑基础信息"},{"id":"authorization","title":"授权页资料"}],"markdown":"# 应用资料与图标\n\n维护双语应用资料和用户授权时看到的应用形象。\n\n<a id=\"profile\"></a>\n\n## 编辑基础信息\n\n切换界面语言只改变展示,不修改存储中的源字段。移除中文翻译后,展示回退到英文。\n\n1. 打开应用的基础信息页,编辑默认英文名称和简介,并按需补充简体中文资料。\n2. 选择预设图标和背景,或使用页面提供的图片上传与裁剪功能;保存后检查预览。\n3. 若其他协作者已修改同一草稿,先刷新最新版本,再重新应用编辑。\n\n<a id=\"authorization\"></a>\n\n## 授权页资料\n\n沙箱授权读取当前草稿资料。正式授权读取已发布快照;已安装应用读取该安装绑定版本的资料。因此,修改草稿不会替换既有正式版本的展示信息。\n\n发布前配置公开 HTTPS 隐私政策和服务条款链接。申请公开上架的已发布版本须具有完整的英文与简体中文名称、简介。\n\n[发布版本](https://open.limeai.run/docs/releases?locale=zh-CN)\n","revision":"sha256:5164eee339838a0be3e23f9c0f2b62ed324cd171adebaca07f396a9d713a332b"},{"id":"collaboration","group":"guide","category":"构建应用","title":"协作者与测试成员","summary":"按配置、运营和沙箱测试任务授予最小职责。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/collaboration?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"roles","title":"应用职责"},{"id":"add","title":"添加协作者或测试成员"}],"markdown":"# 协作者与测试成员\n\n按配置、运营和沙箱测试任务授予最小职责。\n\n<a id=\"roles\"></a>\n\n## 应用职责\n\n平台审核和财务角色独立存在。应用所有者不能通过授予应用管理员角色来批准自己的版本。\n\n| 角色 | 主要操作 |\n| --- | --- |\n| 所有者 / 管理员 | 配置应用、管理协作者与客户端、发布已批准版本、管理分发。 |\n| 开发者 | 配置应用、管理测试成员、创建与提交版本、读取日志。 |\n| 运营者 | 读取应用资料与诊断日志。 |\n\n<a id=\"add\"></a>\n\n## 添加协作者或测试成员\n\n移除协作者或测试成员会撤销相应沙箱授权。不能在协作者表中移除或转移所有者。正式私有可用范围另行管理。\n\n1. 确认对方是归属空间中已生效且邮箱已验证的成员。\n2. 打开应用导航中的协作者或测试成员页,通过已验证邮箱添加成员。\n3. 需要配置时授予开发者职责,需要沙箱使用时添加测试资格;测试资格本身不提供配置权限。\n\n[环境与可用范围](https://open.limeai.run/docs/environments?locale=zh-CN)\n","revision":"sha256:de4758eaec631bbf4c91988887913be96969672541a61f07ac0308e45887cd57"},{"id":"scopes","group":"guide","category":"身份与授权","title":"配置 OAuth 权限","summary":"按身份与资源操作所需请求最小权限。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/scopes?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"catalog","title":"身份权限"},{"id":"configure","title":"配置身份权限"},{"id":"resource-scopes","title":"受控资源权限"}],"markdown":"# 配置 OAuth 权限\n\n按身份与资源操作所需请求最小权限。\n\n<a id=\"catalog\"></a>\n\n## 身份权限\n\n| Scope | 用途 |\n| --- | --- |\n| openid | 识别登录用户,是 OpenID Connect 与 UserInfo 的必要权限。 |\n| profile | 读取获准的用户姓名。 |\n| email | 在同意范围内读取邮箱与验证状态。 |\n| offline_access | 为符合条件的用户授权请求轮换刷新令牌。 |\n\n<a id=\"configure\"></a>\n\n## 配置身份权限\n\n刷新令牌可缩小原 Scope,但不能扩权。ID Token 不能作为 API 访问令牌;机器令牌不授予用户资料权限。\n\n1. 打开应用权限页,点击配置,选择所需目录条目。\n2. 登记 Scope 位于应用配置范围内的 OAuth 客户端,在授权请求中传入以空格分隔的权限子集。\n3. 读取令牌响应中的实际 scope,处理可选字段缺失;已配置权限不代表用户已同意。\n\n```text\nscope=openid profile email offline_access\n```\n\n[令牌指南](https://open.limeai.run/docs/tokens?locale=zh-CN)\n\n<a id=\"resource-scopes\"></a>\n\n## 受控资源权限\n\n专用公共 CLI 客户端经平台显式登记与部署绑定后可请求八项管理 Scope,普通应用客户端不能申请。Scope 限定委托入口,不替代当前成员、应用环境角色或强认证检查。\n\n读不推导写,写也不推导读。各所需 Scope 均须显式请求、在设备同意页检查并核对返回 scope。密码和认证器交互仍在 Auth 完成,读取账号安全状态不会暴露 Secret。\n\n| 资源 | 读取 | 写入 |\n| --- | --- | --- |\n| 开发管理 | lime:open:read | lime:open:write |\n| 本人账号 | lime:account:read | lime:account:write |\n| 应用运营 | lime:operations:read | lime:operations:write |\n| 平台管理 | lime:admin:read | lime:admin:write |\n\n[管理 API 访问](https://open.limeai.run/docs/management-api?locale=zh-CN)\n","revision":"sha256:7ec463535fc9b5ddc508ba27a5c0f324d176e0d217071b9b542417c33ed0cfc9"},{"id":"oauth-clients","group":"guide","category":"身份与授权","title":"登记登录客户端","summary":"选择公共或机密客户端,为每个环境登记精确回调。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/oauth-clients?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_client_list","management_open_client_create","management_open_client_update","management_open_client_activate","management_open_client_revoke","management_open_client_rotate_secret"],"sections":[{"id":"choose","title":"选择客户端类型"},{"id":"register","title":"登记步骤"},{"id":"credentials","title":"轮换与撤销凭据"}],"markdown":"# 登记登录客户端\n\n选择公共或机密客户端,为每个环境登记精确回调。\n\n<a id=\"choose\"></a>\n\n## 选择客户端类型\n\n后台当前可登记公共和机密用户客户端。机器客户端由独立受控流程配置,选择机密客户端不会启用 client_credentials。\n\n| 类型 | 适用场景 | 客户端认证 |\n| --- | --- | --- |\n| 公共客户端 | 桌面、CLI 等无法保护 Secret 的客户端。 | 传入 client_id,不嵌入 Secret;授权码流程要求 S256。 |\n| 机密客户端 | 可信服务端能够在浏览器之外保管凭据。 | 使用 client_secret_basic;授权码流程同时要求 S256。 |\n\n<a id=\"register\"></a>\n\n## 登记步骤\n\n沙箱接受显式登记的 HTTP 回环回调;正式环境要求 HTTPS 和符合条件的已发布配置。创建、密钥轮换及敏感变更可能要求近期多因素认证。\n\n1. 所有者或管理员打开登录客户端,选择沙箱并创建客户端。\n2. 填写名称、客户端类型、精确回调和所需 Scope;同一客户端的回调须使用一个主机名,不同主机分别创建客户端。\n3. 复制 Client ID;机密客户端须在关闭弹窗前,将仅返回一次的 Secret 保存到服务端密钥存储。\n\n<a id=\"credentials\"></a>\n\n## 轮换与撤销凭据\n\n1. 轮换前先准备让应用接收新的机密客户端 Secret。\n2. 请求超时时使用后台恢复动作和原请求上下文;重放已完成的凭据操作不会再次返回 Secret。\n3. 未保存原 Secret 时,显式发起新的轮换。撤销客户端会禁用其访问和授权,重试前应读取当前状态。\n\n[公开协议字段](https://open.limeai.run/docs/api?operation=identity_token&locale=zh-CN)\n","revision":"sha256:9c94f164d72201af8d5368fb6a0cbb08448031bed2555334c74fbfab1fce6d16"},{"id":"environments","group":"guide","category":"身份与授权","title":"沙箱、正式环境与可用范围","summary":"在同一 Application ID 下隔离凭据和授权边界。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/environments?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"compare","title":"环境差异"},{"id":"promote","title":"准备正式使用"}],"markdown":"# 沙箱、正式环境与可用范围\n\n在同一 Application ID 下隔离凭据和授权边界。\n\n<a id=\"compare\"></a>\n\n## 环境差异\n\n| 配置 | 沙箱 | 正式环境 |\n| --- | --- | --- |\n| 生效配置 | 当前草稿。 | 已发布或安装绑定的冻结版本。 |\n| 可用人员 | 符合条件的协作者与测试成员。 | 获准的自建应用私有范围,或符合条件的客户安装。 |\n| 回调地址 | 精确登记,可使用 HTTP 回环地址。 | 精确登记 HTTPS 地址。 |\n| 客户端状态 | 遵循沙箱策略。 | 版本检查通过后显式启用。 |\n\n<a id=\"promote\"></a>\n\n## 准备正式使用\n\n把用户添加为开发者不能替代正式客户可用范围;移除成员、访问资格或安装可能立即撤销关联授权。\n\n1. 完成沙箱联调,发布独立审核通过的版本,并在该正式配置范围内登记生产客户端。\n2. 显式启用待启用的正式客户端,按应用类型配置私有可用范围,或完成合作应用分发和客户安装。\n3. 使用正式 Client ID 与当前获准 Scope,不将沙箱凭据当作正式凭据。\n\n[客户安装](https://open.limeai.run/docs/installations?locale=zh-CN)\n","revision":"sha256:cf8b7446020d969e86dfec72b94968279cd28f4f8b88f7cead23ca3292f75c70"},{"id":"webhooks","group":"guide","category":"事件与回调","title":"订阅应用事件","summary":"通过已验证的 HTTPS 端点接收应用生命周期变化。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhooks?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"events","title":"可订阅事件"},{"id":"activate","title":"配置并启用"}],"markdown":"# 订阅应用事件\n\n通过已验证的 HTTPS 端点接收应用生命周期变化。\n\n<a id=\"events\"></a>\n\n## 可订阅事件\n\n这些是应用管理事件,当前消息的 environment 为 sandbox,不代表正式客户消息、购买或用户资料事件。只有端点已启用且已订阅时才会排队投递;启用端点不会补发历史事件。\n\n| 事件 | 含义 |\n| --- | --- |\n| application.created.v1 | 应用草稿已创建。 |\n| application.updated.v1 | 应用展示资料已修改。 |\n| application.configuration.updated.v1 | 草稿配置修订已变化。 |\n| application.release.published.v1 | 已批准的配置版本已发布。 |\n\n<a id=\"activate\"></a>\n\n## 配置并启用\n\n不接受私网、本机、保留 IP、携带凭据的 URL 或重定向。修改端点 URL 会使旧验证和旧代际排队任务失效。\n\n1. 准备可公开访问的 HTTPS 端点,接收 JSON POST 并支持端点验证。\n2. 在应用事件订阅页选择事件并保存 URL;仅保存 URL 不会发起请求或启用投递。\n3. 有权管理员完成近期多因素认证并点击启用,将收到的 challenge 原值放入 JSON 响应。\n4. 安全保存仅返回一次的签名 Secret,后续处理每次投递前先验签。\n\n```json\n{\"challenge\":\"<received challenge>\"}\n```\n\n[编写事件接收端](https://open.limeai.run/docs/webhook-tutorial?locale=zh-CN)\n\n[验证事件签名](https://open.limeai.run/docs/webhook-signatures?locale=zh-CN)\n","revision":"sha256:0340414b411d3e458a094ec10edf468505e68a60d5e76f1e02b83a04842cee25"},{"id":"webhook-signatures","group":"guide","category":"事件与回调","title":"Webhook 签名与密钥轮换","summary":"确认原始请求体、时间戳和投递身份后再接收事件。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-signatures?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"headers","title":"投递请求头"},{"id":"verify","title":"验签流程"},{"id":"rotate","title":"轮换签名密钥"}],"markdown":"# Webhook 签名与密钥轮换\n\n确认原始请求体、时间戳和投递身份后再接收事件。\n\n<a id=\"headers\"></a>\n\n## 投递请求头\n\n| 请求头 | 含义 |\n| --- | --- |\n| X-Lime-Event-Id | 稳定的事件标识。 |\n| X-Lime-Delivery-Id | 签名与去重使用的投递标识。 |\n| X-Lime-Timestamp | Unix 秒级时间戳。 |\n| X-Lime-Key-Id | 指定签名密钥。 |\n| X-Lime-Attempt | 当前投递尝试次数。 |\n| X-Lime-Signature | v1= 加十六进制 HMAC-SHA256。 |\n\n<a id=\"verify\"></a>\n\n## 验签流程\n\n1. 解析 JSON 前读取精确的原始请求体字节,根据 X-Lime-Key-Id 选择受信任 Secret,拒绝未知密钥。\n2. 移除 Secret 的 whsec_ 前缀,将剩余部分按 base64url 解码为 32 字节密钥。\n3. 拒绝与当前时间相差超过五分钟的时间戳,按下式计算 HMAC,并以常量时间方式比较签名。\n4. 持久化投递 ID 去重;同一事件可能具有多个投递时,还须按事件 ID 保证业务幂等。\n\n```text\nmessage = timestamp + '.' + delivery_id + '.' + key_id + '.' + raw_body\nsignature = 'v1=' + hex(HMAC-SHA256(decoded_key, message))\n```\n\n<a id=\"rotate\"></a>\n\n## 轮换签名密钥\n\n1. 在端点已启用时点击轮换密钥,并完成所需认证。\n2. 立即保存新返回的密钥 ID 与 Secret;新投递使用新 ID,在页面显示的 24 小时过渡期内保留旧密钥。\n3. 过渡到期后移除旧密钥;轮换结果未知时先回读当前密钥 ID,再决定是否显式再次轮换。\n\n[投递故障排查](https://open.limeai.run/docs/webhook-deliveries?locale=zh-CN)\n","revision":"sha256:bd3f90173fe6f583f252004d3673255ae47f4b8e9195fa745fafc761d8303521"},{"id":"webhook-deliveries","group":"guide","category":"事件与回调","title":"投递日志、重试与质量","summary":"理解投递状态,在不重复业务动作的前提下恢复失败事件。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-deliveries?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"states","title":"投递状态"},{"id":"diagnose","title":"排查失败投递"}],"markdown":"# 投递日志、重试与质量\n\n理解投递状态,在不重复业务动作的前提下恢复失败事件。\n\n<a id=\"states\"></a>\n\n## 投递状态\n\n投递次数有上限且可能重复。自动重试从约一分钟逐渐退避至一小时并加少量抖动,排队任务七天后到期;响应中的 attempts 和 max_attempts 表示当前重试预算。\n\n| 状态 | 处理方式 |\n| --- | --- |\n| queued / delivering | 等待计划投递,不重复发起业务动作。 |\n| delivered | 接收端已返回 2xx。 |\n| dead_letter | 修复接收端并检查失败原因,在允许时显式重试。 |\n| cancelled | 端点或代际已失效,应检查当前配置。 |\n\n<a id=\"diagnose\"></a>\n\n## 排查失败投递\n\n质量统计按选定时间段内创建的投递,统计读取时的状态;重试次数不会重复计为投递。默认查看七天,自定义有效时间段最长 31 天。\n\n1. 打开事件订阅的投递日志,或应用日志页,按事件类型、状态或请求标识定位记录。\n2. 检查最近 HTTP 状态、错误、尝试次数和下次投递时间,先修复 TLS、公共 DNS、验签或接收端错误。\n3. 当前有效端点中的可重试死信可显式点击重试;人工重试后接收端仍须去重。\n\n[事件接收教程](https://open.limeai.run/docs/webhook-tutorial?locale=zh-CN)\n","revision":"sha256:b7dbecf22424ec6a4572363388fecfe3607718d49417d30bb4654cc8da0c7022"},{"id":"security-settings","group":"guide","category":"构建应用","title":"安全设置与政策链接","summary":"配置精确回调、允许来源和应用安全资料。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/security-settings?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"settings","title":"应用安全配置"},{"id":"changes","title":"更新配置"}],"markdown":"# 安全设置与政策链接\n\n配置精确回调、允许来源和应用安全资料。\n\n<a id=\"settings\"></a>\n\n## 应用安全配置\n\n保存安全设置只记录配置,不会自动创建客户端、启用正式环境或授予访问权限;实际调用仍须满足各接口当前执行的规则。\n\n| 设置 | 填写要求 |\n| --- | --- |\n| redirect_uris | 最多 20 个精确回调,正式回调要求 HTTPS。 |\n| allowed_origins | 最多 20 个精确来源,不填写任意路径。 |\n| ip_allowlist | 最多 50 个合法 IP 或 CIDR 条目。 |\n| privacy_url / terms_url | 授权资料使用的公开 HTTPS 政策链接。 |\n\n<a id=\"changes\"></a>\n\n## 更新配置\n\n1. 打开安全设置,按分区编辑,或在该分区批量编辑器中每行填写一个值。\n2. 保存并回读返回配置;发生修订冲突时,刷新后再对新修订应用更改。\n3. 需要改变正式配置时,创建新的冻结版本并完成审核与发布;不能假设草稿编辑已修改安装绑定版本。\n\n[客户端回调](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[安全实践](https://open.limeai.run/docs/security?locale=zh-CN)\n","revision":"sha256:bf3358dd77fe709e6e6b0acec2d13013c75d933cdffe314ed2fd358d3ec955a3"},{"id":"releases","group":"guide","category":"发布与分发","title":"创建、审核与发布版本","summary":"冻结已测试草稿,取得独立批准并显式发布至正式环境。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/releases?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_release_list","management_open_release_create","management_open_release_get","management_open_release_submit","management_open_release_publish"],"sections":[{"id":"freeze","title":"创建不可变版本"},{"id":"review","title":"独立审核与显式发布"},{"id":"recovery","title":"恢复未知结果"}],"markdown":"# 创建、审核与发布版本\n\n冻结已测试草稿,取得独立批准并显式发布至正式环境。\n\n<a id=\"freeze\"></a>\n\n## 创建不可变版本\n\n版本会冻结当时的资料和配置,后续草稿修改不会改变该快照。原生安装包与平台配置版本各自维护生命周期。\n\n1. 完成目标应用资料、Scope、回调和事件配置的测试。\n2. 打开版本管理并创建版本,填写未使用的三段语义版本号,例如 1.0.0,并说明更改。\n3. 打开版本详情,确认冻结的应用资料和配置无误后再提交。\n\n<a id=\"review\"></a>\n\n## 独立审核与显式发布\n\n1. 提交精确冻结版本,由具有独立权限的平台审核员在管理审核中心处理。\n2. 若被拒绝,读取原因,修改草稿并创建新版本;应用所有者或提交人不能替代独立审核。\n3. 批准后,由有权所有者或管理员显式发布;仅批准不会改变当前正式发布指针。\n\n[首次发布教程](https://open.limeai.run/docs/first-release-tutorial?locale=zh-CN)\n\n[正式客户端](https://open.limeai.run/docs/environments?locale=zh-CN)\n\n<a id=\"recovery\"></a>\n\n## 恢复未知结果\n\n创建、提交或发布超时时,使用页面显示的恢复动作;后台会保留原版本请求或先读取精确目标版本。不要仅因响应丢失就创建替代版本。\n\n修订冲突、权限撤销或应用暂停均可能拒绝操作。刷新当前事实后选择允许的下一步,不重复提交过期数据。\n\n[错误与恢复](https://open.limeai.run/docs/errors?locale=zh-CN)\n","revision":"sha256:aca8495cda582fbe66cc6e7faf685c81a787d95dc7c137444d663e602a1a7acf"},{"id":"distribution","group":"guide","category":"发布与分发","title":"开发者资格与公开上架","summary":"完成资质、版本和上架审核,让合作应用可被客户发现。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/distribution?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"qualification","title":"申请开发者资格"},{"id":"listing","title":"申请公开上架"}],"markdown":"# 开发者资格与公开上架\n\n完成资质、版本和上架审核,让合作应用可被客户发现。\n\n<a id=\"qualification\"></a>\n\n## 申请开发者资格\n\n资格属于用户和空间上下文。资质批准不等于应用版本、上架或客户安装获准。\n\n1. 选择应用归属空间并打开开发者资格页。\n2. 符合条件的空间所有者或管理员填写所需资料,提交平台审核。\n3. 等待批准;若被拒绝,读取原因并显式提交修正后的申请。\n\n<a id=\"listing\"></a>\n\n## 申请公开上架\n\n不能使用历史已发布版本发起新的上架申请。自建应用配置私有可用范围,不申请公开上架。客户安装和用户同意资料权限仍是不同步骤。\n\n1. 发布目标合作或官方应用版本,确认冻结的英文与中文名称、简介完整。\n2. 打开发布与分发,核对当前已发布版本,在开发者档案获准后提交上架申请。\n3. 独立授权审核员批准或拒绝精确申请;只有当前符合条件且获准上架的已发布版本才显示在公开应用目录。\n\n[客户安装与同意](https://open.limeai.run/docs/installations?locale=zh-CN)\n","revision":"sha256:34f981783556c0fcaa46ca397c9c44b973151ed48146ab6e66c98a3f5eb37368"},{"id":"installations","group":"guide","category":"发布与分发","title":"应用安装与用户同意","summary":"将客户访问绑定到精确空间、安装和版本,分别处理授权决定。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/installations?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_account_installation_list","management_account_installation_get","management_account_installation_uninstall"],"sections":[{"id":"install","title":"安装可用应用"},{"id":"authorize","title":"在安装范围内取得用户授权"}],"markdown":"# 应用安装与用户同意\n\n将客户访问绑定到精确空间、安装和版本,分别处理授权决定。\n\n<a id=\"install\"></a>\n\n## 安装可用应用\n\n自建正式应用使用归属空间中获准的私有范围。安装不会授予开发协作职责,拥有应用也不会获得客户空间访问权。\n\n1. 客户在应用目录中打开当前已发布且上架获准的应用。\n2. 选择目标个人或组织空间,审阅精确版本和请求权限。\n3. 由有权客户显式批准安装,并将安装 ID、空间 ID 和绑定版本一起保存。\n\n<a id=\"authorize\"></a>\n\n## 在安装范围内取得用户授权\n\n使用安装绑定的正式授权时,在发起授权或设备授权时同时传入 installation_id 与 space_id。安装上下文在令牌兑换前已固定,不向 /oauth/token 传入替换安装字段。\n\n管理员批准安装不能替代每名用户对资料权限的同意。卸载会撤销关联授权,不会隐式取消商业订阅、退款或删除财务记录。\n\n[授权参数](https://open.limeai.run/docs/api?operation=identity_authorize&locale=zh-CN)\n\n[设备授权参数](https://open.limeai.run/docs/api?operation=identity_device_authorization&locale=zh-CN)\n","revision":"sha256:0a9052ad1895ef3588583184faa8e7fce9d4b0842bd6979be0770312d37eb485"},{"id":"errors","group":"guide","category":"问题排查","title":"错误、限流与恢复","summary":"重试前区分协议错误、明确拒绝与结果未知。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/errors?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"oauth","title":"OAuth 错误处理"},{"id":"console","title":"后台操作与未知结果"}],"markdown":"# 错误、限流与恢复\n\n重试前区分协议错误、明确拒绝与结果未知。\n\n<a id=\"oauth\"></a>\n\n## OAuth 错误处理\n\n协议端点返回标准 OAuth JSON,根据 error 字段判断,不依赖翻译后的说明;撤销成功可能返回空正文。\n\n| 错误 / 状态 | 恢复动作 |\n| --- | --- |\n| invalid_client / 401 | 检查客户端类型、环境、启用状态与 Basic 认证,不在日志暴露 Secret。 |\n| invalid_grant | 授权码或授权无效、过期或已使用,必要时重新发起授权。 |\n| authorization_pending | 按返回间隔继续设备轮询。 |\n| slow_down | 后续设备轮询间隔增加五秒。 |\n| access_denied / expired_token | 停止设备轮询,由用户决定是否发起新请求。 |\n| 429 / Retry-After | 等待所示时长后再重试允许重试的请求。 |\n\n<a id=\"console\"></a>\n\n## 后台操作与未知结果\n\n409 冲突通常表示配置过期、版本状态改变或请求键对应不同内容。再次操作前读取当前资源并确认允许动作。\n\n超时、响应丢失和 5xx 可能发生在变更已提交之后。使用后台恢复动作与原请求;凭据恢复不会再次返回已经披露的 Secret,丢失时须显式轮换。\n\n要求近期认证时,完成提示,返回待处理操作后显式提交。切换账号、空间或应用时,不能复用其他上下文请求。\n\n[令牌轮换规则](https://open.limeai.run/docs/tokens?locale=zh-CN)\n\n[Webhook 诊断](https://open.limeai.run/docs/webhook-deliveries?locale=zh-CN)\n","revision":"sha256:368458354cd583dfe54c38fe9aeae72575177d384ef83babb2c20d7c58e654db"},{"id":"security","group":"guide","category":"问题排查","title":"接入安全实践","summary":"保护凭据、验证认证结果,明确应用、客户和安装范围。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/security?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"credentials","title":"保护凭据"},{"id":"validation","title":"验证认证结果"}],"markdown":"# 接入安全实践\n\n保护凭据、验证认证结果,明确应用、客户和安装范围。\n\n<a id=\"credentials\"></a>\n\n## 保护凭据\n\n1. 无法保护 Secret 时使用公共客户端,将机密客户端 Secret 和刷新令牌保存在受保护服务端或私有本地凭据存储。\n2. 令牌放入 Authorization 请求头或协议规定的表单,不写入 URL、截图、版本库或普通日志。\n3. 仅保存必要资料,不再需要时撤销访问,并隔离沙箱与正式凭据。\n\n<a id=\"validation\"></a>\n\n## 验证认证结果\n\n1. 将不可预测的 state、nonce 和 PKCE verifier 绑定到发起浏览器事务,校验 state 后才接受回调。\n2. 使用 OIDC 库和发现的公钥,校验 ID Token 的 issuer、audience、签名、有效期与 nonce。\n3. 将访问令牌视为不透明值,并在服务端按精确应用与当前安装范围执行授权。\n\n[网页登录教程](https://open.limeai.run/docs/pkce-tutorial?locale=zh-CN)\n\n[OpenID 配置](https://open.limeai.run/docs/api?operation=identity_discovery&locale=zh-CN)\n","revision":"sha256:9c7d3e6b6b74f4b9eceadac86b5f0764f33f3d387420743ad4cf1505df0ad445"},{"id":"pkce-tutorial","group":"tutorial","category":"开发教程","title":"使用 PKCE 接入网页登录","summary":"使用 state、nonce 和 S256 PKCE 完成授权码接入。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/pkce-tutorial?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"1. 准备沙箱客户端"},{"id":"authorize","title":"2. 发起授权"},{"id":"exchange","title":"3. 校验回调并兑换授权码"}],"markdown":"# 使用 PKCE 接入网页登录\n\n使用 state、nonce 和 S256 PKCE 完成授权码接入。\n\n<a id=\"prepare\"></a>\n\n## 1. 准备沙箱客户端\n\n1. 创建应用,将自己添加为符合条件的协作者或测试成员,配置 openid 与 profile。\n2. 登记沙箱公共客户端与一个精确回调,例如 http://127.0.0.1:3000/callback;可信服务端能够保护 Secret 时可选择机密客户端。\n3. 读取 issuer 元数据并使用其中端点,选择所接入环境的 Auth Origin。\n\n```bash\ncurl \"$ISSUER/.well-known/openid-configuration\"\n```\n\n[登记客户端](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n<a id=\"authorize\"></a>\n\n## 2. 发起授权\n\n每个事务生成新的不可预测随机值,在发起浏览器会话中按 state 绑定 verifier 和 nonce。下例 CLIENT_ID、REDIRECT_URI 与 ISSUER 使用你已登记的配置。\n\n```javascript\nconst encode = bytes => btoa(String.fromCharCode(...bytes))\n .replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\nconst random = () => encode(crypto.getRandomValues(new Uint8Array(32)));\nconst verifier = random();\nconst state = random();\nconst nonce = random();\nconst challenge = encode(new Uint8Array(await crypto.subtle.digest(\n \"SHA-256\", new TextEncoder().encode(verifier),\n)));\nsessionStorage.setItem(\"lime.oauth.\" + state, JSON.stringify({\n verifier, nonce, createdAt: Date.now(),\n}));\nconst url = new URL(\"/oauth/authorize\", ISSUER);\nurl.search = new URLSearchParams({\n response_type: \"code\", client_id: CLIENT_ID,\n redirect_uri: REDIRECT_URI, scope: \"openid profile\",\n state, nonce, code_challenge: challenge,\n code_challenge_method: \"S256\",\n});\nlocation.assign(url);\n```\n\n<a id=\"exchange\"></a>\n\n## 3. 校验回调并兑换授权码\n\n1. 拒绝缺失、不匹配或过期的 state,只读取并移除匹配事务;先处理 error+state 回调,再兑换授权码。\n2. 通过表单编码 POST 传入 code、原 verifier、精确回调和 Client ID;机密客户端使用 HTTP Basic,不将 Secret 放入表单。\n3. 使用 OIDC 库验证 ID Token,包含已保存 nonce 的校验;保护访问令牌,并使用它调用 UserInfo。\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --data-urlencode \"grant_type=authorization_code\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"code=$CODE\" \\\n --data-urlencode \"redirect_uri=$REDIRECT_URI\" \\\n --data-urlencode \"code_verifier=$CODE_VERIFIER\"\n```\n\n[令牌端点](https://open.limeai.run/docs/api?operation=identity_token&locale=zh-CN)\n\n[读取 UserInfo](https://open.limeai.run/docs/userinfo?locale=zh-CN)\n","revision":"sha256:b4a711a7f523b9f3cca27ad495b45e5c73de968ac2c2a65bc7033dd7dc8a9fde"},{"id":"device-tutorial","group":"tutorial","category":"开发教程","title":"接入桌面与 CLI 设备授权","summary":"通过用户码和有界轮询,让设备无需浏览器回调即可登录。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/device-tutorial?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"start","title":"1. 请求设备码"},{"id":"user","title":"2. 由用户核对并确认"},{"id":"poll","title":"3. 按返回间隔轮询"}],"markdown":"# 接入桌面与 CLI 设备授权\n\n通过用户码和有界轮询,让设备无需浏览器回调即可登录。\n\n<a id=\"start\"></a>\n\n## 1. 请求设备码\n\n先登记公共用户客户端并配置符合条件的沙箱测试范围。设备授权支持公共与机密用户客户端,不支持机器客户端或 PKCE 参数。\n\n```bash\ncurl --request POST \"$ISSUER/oauth/device/authorization\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"scope=openid profile offline_access\"\n```\n\n<a id=\"user\"></a>\n\n## 2. 由用户核对并确认\n\n设备码在 600 秒后到期。安装绑定请求须在发起事务时同时提供 installation_id 与 space_id。\n\n1. 向用户显示 verification_uri 与 user_code,将作为 Secret 的 device_code 保留在发起设备。\n2. 用户打开验证页,登录后核对验证码是否与自己的设备一致。\n3. 用户检查应用与权限,显式批准或拒绝;打开链接不会自动批准。\n\n<a id=\"poll\"></a>\n\n## 3. 按返回间隔轮询\n\n每次尝试间至少等待 interval 秒。authorization_pending 时继续等待,每次 slow_down 后增加五秒;成功、拒绝、到期或用户取消时停止,不在兑换时更改安装上下文。\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --data-urlencode \"grant_type=urn:ietf:params:oauth:grant-type:device_code\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"device_code=$DEVICE_CODE\"\n```\n\n[使用 LimeCloud CLI](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n[设备授权端点](https://open.limeai.run/docs/api?operation=identity_device_authorization&locale=zh-CN)\n","revision":"sha256:3ecd48681c806ffc0283d74aad780593096ec343dd40b4e2bfb6f50e623501f4"},{"id":"webhook-tutorial","group":"tutorial","category":"开发教程","title":"搭建应用事件接收端","summary":"处理端点验证、检查签名并安全接收生命周期事件。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-tutorial?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"verify-endpoint","title":"1. 实现端点验证"},{"id":"verify-signature","title":"2. 验证常规事件签名"},{"id":"activate-test","title":"3. 启用与测试"}],"markdown":"# 搭建应用事件接收端\n\n处理端点验证、检查签名并安全接收生命周期事件。\n\n<a id=\"verify-endpoint\"></a>\n\n## 1. 实现端点验证\n\n提供公开 HTTPS POST 端点。启用时发送 type=endpoint_verification、application_id 与随机 challenge,须在 JSON 2xx 响应中回传原 challenge。此验证请求没有签名,不得触发业务动作。\n\n```javascript\nconst payload = JSON.parse(rawBody.toString(\"utf8\"));\nif (payload.type === \"endpoint_verification\") {\n if (payload.application_id !== EXPECTED_APPLICATION_ID ||\n typeof payload.challenge !== \"string\") {\n response.writeHead(400).end();\n return;\n }\n response.writeHead(200, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ challenge: payload.challenge }));\n return;\n}\n```\n\n<a id=\"verify-signature\"></a>\n\n## 2. 验证常规事件签名\n\n下方 Node.js 函数检查签名和五分钟时间窗口。HTTP 处理器还须实现有界原始体读取、可信密钥查找、持久化去重以及应用和 Schema 校验。\n\n```javascript\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nfunction verify(headers, rawBody, secret) {\n const timestamp = headers[\"x-lime-timestamp\"];\n const delivery = headers[\"x-lime-delivery-id\"];\n const keyID = headers[\"x-lime-key-id\"];\n const supplied = headers[\"x-lime-signature\"];\n if (!/^\\d+$/.test(timestamp ?? \"\") ||\n Math.abs(Date.now() / 1000 - Number(timestamp)) > 300 ||\n !/^[A-Za-z0-9_]{1,64}$/.test(delivery ?? \"\") ||\n !/^[A-Za-z0-9_]{1,64}$/.test(keyID ?? \"\") ||\n !/^v1=[a-f0-9]{64}$/.test(supplied ?? \"\") ||\n !secret?.startsWith(\"whsec_\")) return false;\n const key = Buffer.from(secret.slice(6), \"base64url\");\n if (key.length !== 32) return false;\n const expected = \"v1=\" + createHmac(\"sha256\", key)\n .update(timestamp + \".\" + delivery + \".\" + keyID + \".\")\n .update(rawBody).digest(\"hex\");\n return timingSafeEqual(Buffer.from(expected), Buffer.from(supplied));\n}\n```\n\n<a id=\"activate-test\"></a>\n\n## 3. 启用与测试\n\n1. 选择 application.updated.v1,保存并启用端点 URL,保存返回的密钥 ID 和 Secret。\n2. 修改一项普通应用简介来生成事件,验签后检查 application_id 和 schema_version。\n3. 返回 2xx 前持久化事件,按投递 ID 与事件 ID 去重,再检查投递日志。\n\n[事件配置](https://open.limeai.run/docs/webhooks?locale=zh-CN)\n\n[签名与密钥轮换](https://open.limeai.run/docs/webhook-signatures?locale=zh-CN)\n","revision":"sha256:72f0c8e747e274dba3d0c04919456a179d1405c324bc4395951f4b5a1000a76f"},{"id":"first-release-tutorial","group":"tutorial","category":"开发教程","title":"发布第一个版本","summary":"将已测试应用从沙箱推进到独立审核通过的正式版本。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/first-release-tutorial?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"ready","title":"1. 检查发布条件"},{"id":"submit","title":"2. 冻结、提交与发布"},{"id":"access","title":"3. 开放目标用户范围"}],"markdown":"# 发布第一个版本\n\n将已测试应用从沙箱推进到独立审核通过的正式版本。\n\n<a id=\"ready\"></a>\n\n## 1. 检查发布条件\n\n1. 核对双语资料、图标、隐私政策和服务条款;公开上架前须在冻结版本中补齐双语资料。\n2. 使用符合条件的沙箱用户测试精确 Scope 和回调,验证令牌处理及至少一种预期拒绝。\n3. 使用事件时,确认端点验证、签名和重复处理。\n\n[接入安全](https://open.limeai.run/docs/security?locale=zh-CN)\n\n<a id=\"submit\"></a>\n\n## 2. 冻结、提交与发布\n\n1. 在版本管理中创建 1.0.0 并填写说明,核对冻结资料与配置。\n2. 提交版本以独立审核;若拒绝,修正草稿并创建新版本号。\n3. 批准后,由所有者或管理员显式发布,再刷新确认当前正式版本。\n\n<a id=\"access\"></a>\n\n## 3. 开放目标用户范围\n\n1. 在已发布回调和 Scope 配置范围内登记并启用正式客户端。\n2. 配置自建私有范围,或完成合作开发者资质与精确版本上架审核。\n3. 使用目标客户测试正式访问,并确认无权用户被拒绝。\n\n[分发](https://open.limeai.run/docs/distribution?locale=zh-CN)\n\n[环境](https://open.limeai.run/docs/environments?locale=zh-CN)\n","revision":"sha256:49d49a751132d12d6fe36bc91db15a4baf729660ecc178b9e3ef9c7736f248e3"},{"id":"api-overview","group":"api","category":"资源 API","title":"公开 API 概述","summary":"选择身份协议或受控资源 API,并核对每项操作的认证要求。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/api-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"host","title":"使用 Auth 域名"},{"id":"endpoints","title":"身份端点"},{"id":"format","title":"格式与认证"},{"id":"management","title":"受控资源入口"}],"markdown":"# 公开 API 概述\n\n选择身份协议或受控资源 API,并核对每项操作的认证要求。\n\n<a id=\"host\"></a>\n\n## 使用 Auth 域名\n\n公开身份端点使用配置的 Auth Origin:正式地址 https://auth.limeai.run,本地平台 https://auth.limeai.local。通过 Discovery 读取精确 issuer、端点、授权类型与签名算法。\n\n```bash\ncurl \"$ISSUER/.well-known/openid-configuration\"\n```\n\n[查看全部公开操作](https://open.limeai.run/docs/api?locale=zh-CN)\n\n<a id=\"endpoints\"></a>\n\n## 身份端点\n\n| 端点 | 用途 |\n| --- | --- |\n| GET /.well-known/openid-configuration | 发现 issuer 与端点。 |\n| GET /.well-known/oauth-authorization-server | OAuth 授权服务器元数据,包含已启用的 MCP Scope。 |\n| GET /oauth/jwks | 公开签名密钥。 |\n| GET /oauth/authorize | 携带 state、nonce、S256 的浏览器授权。 |\n| POST /oauth/token | 授权码兑换、刷新、设备轮询与符合条件的机器令牌。 |\n| POST /oauth/device/authorization | 发起设备授权。 |\n| GET 或 POST /oauth/userinfo | 读取获准用户资料。 |\n| POST /oauth/revoke | 撤销令牌授权。 |\n| POST /oauth/introspect | 机密客户端检查属于本客户端的令牌。 |\n| POST /oauth/resource/introspect | 使用资源服务器专用凭据校验单个 API 与动作。 |\n\n<a id=\"format\"></a>\n\n## 格式与认证\n\nOAuth POST 请求使用 application/x-www-form-urlencoded,而非 JSON。公共客户端传 client_id;机密和机器客户端使用 client_secret_basic,不支持 client_secret_post。构建 Basic 前分别对凭据做表单编码。\n\n身份响应为标准 OAuth JSON 或重定向,不使用管理接口 data 包装。撤销成功返回空正文 HTTP 200。资源 /api/v1 使用 JSON 与管理 data、error 包装,具体以操作 Schema 为准。\n\n[错误与限流](https://open.limeai.run/docs/errors?locale=zh-CN)\n\n<a id=\"management\"></a>\n\n## 受控资源入口\n\n使用显式配置的 API Origin,以及专门登记 CLI 客户端取得的用户访问令牌,Audience 绑定该 API Origin。这些属于受控管理接入,不是任意第三方客户端可获得的通用权限。本地合同覆盖不代表生产 API 域名已经部署。\n\n| 前缀 | 资源范围 |\n| --- | --- |\n| /api/v1/open | 空间、企业成员及应用开发、客户端、事件、版本与分发。 |\n| /api/v1/account | 本人资料与安全状态、空间、安装、沙箱购买与本人收据。 |\n| /api/v1/operations | 获授权应用的商品、活动、订单、投递状态、财务与审计。 |\n| /api/v1/admin | 被授予的平台权限、审核、账套、期间与受控通知状态。 |\n\n[资源访问与恢复](https://open.limeai.run/docs/management-api?locale=zh-CN)\n\n[CLI Schema 发现](https://open.limeai.run/docs/cli-schema?locale=zh-CN)\n","revision":"sha256:7bc52aa3784c50c01c32aaf3cce81ae3e4e0d8abc17d42d4e61ea12080fff968"},{"id":"management-api","group":"api","category":"资源 API","title":"受控管理 API","summary":"通过专用 CLI 客户端授权明确用户范围的开发、账号、运营与管理方法。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/management-api?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"client","title":"使用专用客户端与 API Audience"},{"id":"access","title":"请求最小 Scope"},{"id":"http","title":"HTTP 格式与分页"},{"id":"writes","title":"恢复变更"}],"markdown":"# 受控管理 API\n\n通过专用 CLI 客户端授权明确用户范围的开发、账号、运营与管理方法。\n\n<a id=\"client\"></a>\n\n## 使用专用客户端与 API Audience\n\n平台运营方专门登记并绑定公共 CLI 客户端,该客户端没有 Secret。普通应用客户端不能申请八项 lime:{open,account,operations,admin}:{read,write} Scope。CLI 通过设备授权取得用户显式同意,不自行登记此高权限客户端。\n\n实际 API Origin 与 Auth issuer 分别配置,其值为令牌固定 API Audience,已保存登录也绑定该值。机器或 client_credentials 令牌不能调用这些用户管理方法。正式可用性须按目标部署核验。\n\n<a id=\"access\"></a>\n\n## 请求最小 Scope\n\nGET 与 HEAD 要求对应领域 read,变更要求 write,二者互不推导。各方法所需权限见 API 参考与 CLI Schema。默认登录仅请求四项身份权限,业务访问始终需要显式选择 Scope。\n\nScope 仅限定委托上限。每次请求仍核对当前用户、企业成员、应用环境角色、资源 ACL、适用安装、强认证与独立审核规则。admin Scope 本身不授予平台角色。\n\n```bash\nlimecloud-cli config init \\\n --issuer \"$ISSUER\" --api-origin \"$API_ORIGIN\" --client-id \"$CLI_CLIENT_ID\"\nlimecloud-cli auth login \\\n --scope \"openid profile email offline_access lime:account:read\"\nlimecloud-cli account profile get\n```\n\n<a id=\"http\"></a>\n\n## HTTP 格式与分页\n\nJSON 写入使用 Content-Type: application/json 与操作的精确请求 Schema。成功返回 {data:...},列表返回 {data:{items,next_cursor}},错误返回 {error:{code,message},request_id}。按当前操作响应处理,并保留 request_id 供排查,不记录认证请求头。\n\n游标属于原获授权查询。存在 next_cursor 时显式继续;用户、空间、应用、环境或筛选变化后丢弃旧游标。每页重新核权。当前页不是跨领域原子快照,也不是完整集合总额。\n\n```bash\ncurl --fail-with-body \\\n --header \"Authorization: Bearer $ACCESS_TOKEN\" \\\n \"$API_ORIGIN/api/v1/account/profile\"\n```\n\n[列出应用](https://open.limeai.run/docs/api?operation=management_open_application_list&locale=zh-CN)\n\n[读取本人资料](https://open.limeai.run/docs/api?operation=management_account_profile_get&locale=zh-CN)\n\n[发布商品](https://open.limeai.run/docs/api?operation=management_operations_product_publish&locale=zh-CN)\n\n[审核申请](https://open.limeai.run/docs/api?operation=management_admin_review_decide&locale=zh-CN)\n\n<a id=\"writes\"></a>\n\n## 恢复变更\n\n按操作要求提供 revision 与稳定 Idempotency-Key。冲突时须检查原操作与当前资源,不能随意换键。重新认证或切换范围后,不自动重放财务、付款、发布或访问变更。\n\n超时可能导致结果未知。保存原用户、路径参数、正文和键,在同一范围恢复原操作。尚未支持的生产支付、订阅续费、离线许可证、企业联合身份与完整财务流程仍是明确建设任务;已有资源方法不代表这些流程完整。\n\n[API 错误](https://open.limeai.run/docs/errors?locale=zh-CN)\n\n[使用 CLI 预览](https://open.limeai.run/docs/cli-dry-run?locale=zh-CN)\n","revision":"sha256:e8efd31d600a5e6c6e41cb5bfa15ba3acab75c47449cc7b395c241e119b3b559"},{"id":"tokens","group":"api","category":"身份与授权","title":"访问、ID 与刷新令牌","summary":"为每项任务使用正确令牌,串行执行刷新轮换。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/tokens?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["identity_token","identity_introspect","identity_resource_introspect"],"sections":[{"id":"types","title":"令牌类型"},{"id":"refresh","title":"刷新并原子替换"},{"id":"machine","title":"机器令牌"},{"id":"resource-server","title":"校验机器资源访问"}],"markdown":"# 访问、ID 与刷新令牌\n\n为每项任务使用正确令牌,串行执行刷新轮换。\n\n<a id=\"types\"></a>\n\n## 令牌类型\n\n| 令牌 | 用途 |\n| --- | --- |\n| access_token | 不透明 Bearer 凭据,包含 openid 的用户授权可访问 UserInfo。 |\n| id_token | RS256 签名的认证结果,使用 OIDC 库验证,不作为 API Bearer 凭据。 |\n| refresh_token | 用户授权的轮换凭据,仅对符合条件的 offline_access 授权返回。 |\n\n<a id=\"refresh\"></a>\n\n## 刷新并原子替换\n\n1. 同一授权只允许一个刷新请求在途,并读取最新刷新令牌。\n2. 成功后原子替换令牌,按 expires_in 计算访问令牌有效期。\n3. 结果未知时不得重放旧刷新令牌,必要时重新授权。\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --data-urlencode \"grant_type=refresh_token\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"refresh_token=$REFRESH_TOKEN\"\n```\n\n[令牌请求类型](https://open.limeai.run/docs/api?operation=identity_token&locale=zh-CN)\n\n<a id=\"machine\"></a>\n\n## 机器令牌\n\n在 Open 应用的凭证页登记机器客户端,生产客户端须激活。随后由客户管理员在 Console 中,基于已安装发布的服务权限,为精确生产 Client、API Audience、Scope、数据和字段子集创建批准。\n\n使用 HTTP Basic,提交 client_credentials、原 client_grant_id、单个精确生产 audience 和显式 scope 子集。各字段仅提交一次,不得覆盖客户或安装上下文。令牌最多五分钟,且不超过批准期限;撤销、凭据轮换或安全代次变化使原授权失效。\n\n机器令牌使用稳定服务身份,没有用户身份、MFA、用户同意、ID Token、Refresh Token 或 UserInfo 权限。管理 /api/v1 仍要求获授权的用户令牌。签发业务令牌不表示资源接口已可用:资源所属领域还须执行当前 Scope、客户数据及字段限制,该资源访问路径仍在实施。\n\n```bash\ncurl --request POST \"$ISSUER/oauth/token\" \\\n --user \"$CLIENT_ID:$CLIENT_SECRET\" \\\n --data-urlencode \"grant_type=client_credentials\" \\\n --data-urlencode \"client_grant_id=$CLIENT_GRANT_ID\" \\\n --data-urlencode \"audience=$API_AUDIENCE\" \\\n --data-urlencode \"scope=$BUSINESS_SCOPES\"\n```\n\n<a id=\"resource-server\"></a>\n\n## 校验机器资源访问\n\n资源服务器使用独立登记的校验 ID 与 Secret,绑定单个生产 API 和显式动作。消费方 OAuth Client 与用户会话不能代替该凭据。目前登记须由可信内部编排完成,自助管理尚未交付;轮换后须显式批准新的凭据代次。\n\n从资源端点的固定政策取得 audience 和 action,使用校验方 HTTP Basic 凭据,将它们与原 Bearer Token 提交至 /oauth/resource/introspect。只有 active:true 才可继续。失效结果不返回声明;认证失败、无权、限流、存储或审计故障也须拒绝访问。\n\n查询、计数、分页、序列化或写入前,须按真实数据归属落实返回的客户、安装、资源及字段限制。空字段列表不授予任何字段。不得缓存允许结果。远程校验不会锁定你的数据库:写入仍须采用本地事务授权边界和原操作恢复,Lime 无法保证已在途操作的原子撤销。\n\n```bash\ncurl --request POST \"$ISSUER/oauth/resource/introspect\" \\\n --user \"$RESOURCE_SERVER_ID:$RESOURCE_SERVER_SECRET\" \\\n --data-urlencode \"token=$ACCESS_TOKEN\" \\\n --data-urlencode \"audience=$API_AUDIENCE\" \\\n --data-urlencode \"action=$API_ACTION\"\n```\n\n[资源访问校验参数](https://open.limeai.run/docs/api?operation=identity_resource_introspect&locale=zh-CN)\n","revision":"sha256:051d5c5d889b274938f44de62b7c825cafebdfee4f0b330cd31d78fdcb6441ee"},{"id":"userinfo","group":"api","category":"身份与授权","title":"读取用户资料与撤销访问","summary":"使用用户访问令牌读取获准资料,不再需要时撤销授权。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/userinfo?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"read","title":"读取 UserInfo"},{"id":"revoke","title":"撤销授权"}],"markdown":"# 读取用户资料与撤销访问\n\n使用用户访问令牌读取获准资料,不再需要时撤销授权。\n\n<a id=\"read\"></a>\n\n## 读取 UserInfo\n\n使用包含 openid 的有效用户访问令牌,profile 与 email 控制可选字段;处理字段缺失,将 sub 用作应用范围用户标识,不通过显示姓名识别用户。\n\nID Token 和机器令牌不能调用 UserInfo;只有当前有效安装绑定授权才会返回安装声明。\n\n```bash\ncurl \"$ISSUER/oauth/userinfo\" \\\n --header \"Authorization: Bearer $ACCESS_TOKEN\"\n```\n\n[GET UserInfo](https://open.limeai.run/docs/api?operation=identity_userinfo&locale=zh-CN)\n\n[POST UserInfo](https://open.limeai.run/docs/api?operation=identity_userinfo_post&locale=zh-CN)\n\n<a id=\"revoke\"></a>\n\n## 撤销授权\n\n机密客户端使用 HTTP Basic,而非仅公共 Client ID。成功撤销返回空正文 HTTP 200;确认后清除本地令牌,仅删除本地文件不会撤销服务端访问。\n\n```bash\ncurl --request POST \"$ISSUER/oauth/revoke\" \\\n --data-urlencode \"client_id=$CLIENT_ID\" \\\n --data-urlencode \"token=$REFRESH_TOKEN\" \\\n --data-urlencode \"token_type_hint=refresh_token\"\n```\n\n[撤销](https://open.limeai.run/docs/api?operation=identity_revoke&locale=zh-CN)\n\n[内省](https://open.limeai.run/docs/api?operation=identity_introspect&locale=zh-CN)\n","revision":"sha256:9e8fb866365710c74a95e7388e1b46407a091aaa471930e1dcbd9388cf4de8d2"},{"id":"cli-auth","group":"cli","category":"命令行工具","title":"CLI 登录与凭据管理","summary":"使用公共客户端登录、读取 UserInfo 并管理轮换凭据。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-auth?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["identity_device_authorization","identity_token","identity_userinfo","identity_userinfo_post","identity_revoke"],"sections":[{"id":"login","title":"登录"},{"id":"resume","title":"分开授权与轮询"},{"id":"status","title":"检查与刷新"},{"id":"logout","title":"撤销并退出"}],"markdown":"# CLI 登录与凭据管理\n\n使用公共客户端登录、读取 UserInfo 并管理轮换凭据。\n\n<a id=\"login\"></a>\n\n## 登录\n\n已安装正式应用须同时传入 --installation-id 与 --space-id;CLI 不会自动登记平台客户端或批准同意。\n\n默认登录请求 openid profile email offline_access,不自动追加业务权限。受控管理 API 要求专门登记的公共 CLI 客户端、绑定的 API Audience 与显式 lime:open、lime:account、lime:operations 或 lime:admin 读写 Scope;普通应用客户端不能取得这八项管理权限。\n\n1. 登记公共用户客户端,确认账号具备所需沙箱或正式访问范围。\n2. 运行 auth login,打开打印的验证链接,核对自己设备上的验证码。\n3. 在浏览器检查应用与 Scope 并显式批准;CLI 按服务端间隔轮询。\n\n```bash\nlimecloud-cli auth login \\\n --client-id \"$CLIENT_ID\" --issuer \"$ISSUER\" \\\n --scope \"openid profile offline_access\"\n```\n\n<a id=\"resume\"></a>\n\n## 分开授权与轮询\n\n--no-wait 将待完成设备事务保存在本地私有文件中,返回验证链接、用户码、有效期和恢复命令。在自己的浏览器检查并批准后使用 --resume。恢复保留原 issuer、客户端、API Origin、Scope 和安装上下文,不通过命令行裸传 device code。\n\n```bash\nlimecloud-cli auth login --no-wait\nlimecloud-cli auth login --resume\n```\n\n<a id=\"status\"></a>\n\n## 检查与刷新\n\nauth status 读取本地元数据,不能证明服务端仍接受授权;auth whoami 调用 UserInfo;auth refresh 要求可用刷新令牌,并在串行轮换后替换它。刷新结果未知时不得重放旧令牌。\n\n登录、刷新或退出前清除 LIMECLOUD_ACCESS_TOKEN,避免将已存凭据与外部令牌混淆。\n\nauth scopes 展示 issuer 支持权限与本地授权,不证明此客户端已启用这些权限。auth check --scope 仅在本地检查未过期授权,不能证明服务端当前角色或资源访问。增加权限须重新显式登录并在浏览器同意。\n\n```bash\nlimecloud-cli auth status\nlimecloud-cli auth whoami\nlimecloud-cli auth refresh\n```\n\n<a id=\"logout\"></a>\n\n## 撤销并退出\n\n常规退出先撤销访问,再删除本地凭据;撤销失败会保留凭据供恢复。--local-only 只清除本地凭据,不确认服务端撤销。须保护凭据文件,不得提交到版本库。\n\n```bash\nlimecloud-cli auth logout\nlimecloud-cli auth logout --local-only\n```\n\n[设备授权教程](https://open.limeai.run/docs/device-tutorial?locale=zh-CN)\n","revision":"sha256:f62c026ca3273e67c9396fe7a218e77e1af18b4c857c342d17e9c9def9bf5cd6"},{"id":"cli-api","group":"cli","category":"命令行工具","title":"使用 CLI 发现与调用 API","summary":"发送范围明确的请求前,先查看当前公开合同。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-api?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"discover","title":"查找操作"},{"id":"typed","title":"调用资源方法"},{"id":"call","title":"调用公开操作"},{"id":"output","title":"输出与自动化"}],"markdown":"# 使用 CLI 发现与调用 API\n\n发送范围明确的请求前,先查看当前公开合同。\n\n<a id=\"discover\"></a>\n\n## 查找操作\n\nCLI 使用网站公开身份与受控管理合同,可离线发现 identity、open、account、operations 与 admin。目录可见不代表获授权:管理调用仍要求专用 CLI 授权、显式 Scope 与当前领域权限。浏览器会话 BFF 路径仍独立。\n\n```bash\nlimecloud-cli api list token --json\nlimecloud-cli api list --locale zh-CN\nlimecloud-cli api schema identity_device_authorization\n```\n\n<a id=\"typed\"></a>\n\n## 调用资源方法\n\nservice resource method 三层命令、api call operationId 与 api METHOD PATH 解析同一公开合同。原始路径须精确匹配已声明操作,拒绝任意 URL 与 BFF 路径。Auth 和资源 API Origin 分别配置。\n\n--params 接受路径与查询参数,--data 接受合同声明的正文;均可使用 JSON 对象、@file 或 - 标准输入。业务请求保留 JSON 类型,OAuth POST 数据转换为表单。显式字段 Flag 覆盖对应 JSON 字段,--header 仅允许 Idempotency-Key 等合同已声明请求头。\n\n管理命令中的 --client-id 可能表示目标业务客户端。覆盖登录客户端使用 --auth-client-id,避免混淆资源目标与认证上下文。\n\nadmin review list 必须通过 --kind releases、developers 或 listings 选择审核队列。审核 Scope 不替代独立审核角色与资源检查。\n\n```bash\nlimecloud-cli schema open.application.list\nlimecloud-cli open application list \\\n --space-id \"$SPACE_ID\" --sort created_desc\nlimecloud-cli account profile get\nlimecloud-cli admin review list --kind releases\nlimecloud-cli api GET /api/v1/account/profile\n```\n\n<a id=\"call\"></a>\n\n## 调用公开操作\n\n普通字段使用 --param name=value,敏感字段使用 --param-env name=ENV_NAME;用户接口可使用 LIMECLOUD_ACCESS_TOKEN 或已存凭据,适用机密端点使用 LIMECLOUD_CLIENT_SECRET。\n\n```bash\nlimecloud-cli api call identity_discovery \\\n --issuer \"$ISSUER\" --json\nlimecloud-cli api call identity_userinfo \\\n --issuer \"$ISSUER\" --json\nlimecloud-cli api call identity_revoke \\\n --issuer \"$ISSUER\" \\\n --param \"client_id=$CLIENT_ID\" \\\n --param \"token_type_hint=refresh_token\" \\\n --param-env token=REFRESH_TOKEN\n```\n\n<a id=\"output\"></a>\n\n## 输出与自动化\n\n使用 --json 获取结构化输出,继续自动化前检查退出状态;CLI 会呈现协议与 HTTP 失败,不跨源重定向发送凭据。\n\n令牌与 Secret 字段默认脱敏;--show-secrets 会显式显示敏感响应字段,仅用于受保护调用方,不用于共享日志。--locale 控制 API 目录元数据,不翻译 OAuth 字段名。\n\n[公开端点字段](https://open.limeai.run/docs/api?locale=zh-CN)\n\n[格式与脚本](https://open.limeai.run/docs/cli-output?locale=zh-CN)\n","revision":"sha256:29522fb9a930ddd8421a90b2b291d89c01a7a885d69ae0157d9c24196957213d"},{"id":"cli-configuration","group":"cli","category":"命令行工具","title":"配置 CLI 与连接上下文","summary":"显式隔离公共设置、私有凭据与 Auth、API Origin。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-configuration?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"initialize","title":"初始化公共设置"},{"id":"variables","title":"环境变量与文件"},{"id":"precedence","title":"优先级与上下文隔离"}],"markdown":"# 配置 CLI 与连接上下文\n\n显式隔离公共设置、私有凭据与 Auth、API Origin。\n\n<a id=\"initialize\"></a>\n\n## 初始化公共设置\n\nconfig init 与 config set 保存 issuer、api_origin、client_id 和 scope,不创建客户端、启用 Scope 或保存客户端 Secret。管理资源要求平台运营方专门登记并绑定公共 CLI 客户端。\n\n须显式填写实际 API Origin,CLI 不推测已部署业务 API 域名。除允许的回环开发外使用 HTTPS;修改 API Origin 后须重新登录,绑定目标服务。\n\n```bash\nlimecloud-cli config init \\\n --issuer \"$ISSUER\" --api-origin \"$API_ORIGIN\" --client-id \"$CLI_CLIENT_ID\"\nlimecloud-cli config show\nlimecloud-cli config set scope \"openid profile email offline_access lime:open:read\"\n```\n\n<a id=\"variables\"></a>\n\n## 环境变量与文件\n\n| 变量 | 用途 |\n| --- | --- |\n| LIMECLOUD_ISSUER | 身份协议请求的 Auth Origin。 |\n| LIMECLOUD_API_ORIGIN | 显式资源 API Origin,独立绑定登录。 |\n| LIMECLOUD_CLIENT_ID | 已登记认证客户端,不是目标资源 ID。 |\n| LIMECLOUD_SETTINGS | 公共客户端设置文件路径。 |\n| LIMECLOUD_CONFIG | 私有凭据文件,默认 ~/.config/limecloud/credentials.json。 |\n| LIMECLOUD_ACCESS_TOKEN | 外部管理的访问令牌,不保存为本地登录。 |\n| LIMECLOUD_CLIENT_SECRET | 仅用于机密身份协议请求;公共管理 CLI 客户端没有 Secret。 |\n\n<a id=\"precedence\"></a>\n\n## 优先级与上下文隔离\n\n显式连接 Flag 优先于环境变量,其次为已保存公共设置。只有 issuer 与客户端匹配时才使用已保存登录。三层业务命令中 --client-id 可能指定资源,认证客户端使用 --auth-client-id。\n\n一份凭据文件保存一个登录上下文。不同环境使用独立私有文件,不跨 Origin 复制令牌。凭据与待完成设备事务仅文件所有者可读;认证写入使用锁与原子替换。遗留锁或未知刷新结果须按恢复流程处理。\n\n[登录与同意](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n[问题排查](https://open.limeai.run/docs/cli-troubleshooting?locale=zh-CN)\n","revision":"sha256:dc25aab02f4f009f3cf7c584d3e96492a6a36ffeb34347fb121b2cdcd12d32e3"},{"id":"cli-schema","group":"cli","category":"命令行工具","title":"发现命令与 Schema","summary":"调用前查看命令结构、必填输入、响应、身份与 Scope。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-schema?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"browse","title":"离线浏览"},{"id":"contract","title":"读取方法合同"},{"id":"evolution","title":"核对合同版本"},{"id":"write-precondition","title":"写入前核对动作合同"}],"markdown":"# 发现命令与 Schema\n\n调用前查看命令结构、必填输入、响应、身份与 Scope。\n\n<a id=\"browse\"></a>\n\n## 离线浏览\n\nschema 默认读取随包公开合同,不联网或读取凭据。从根目录缩小到服务、资源,再查看方法;点分隔与空格分隔等价。资源和方法可能使用 snake_case,应复制 Schema 中的准确名称。\n\n显式关联的任务指南见 _meta.knowledge 或具体命令的 --help。每篇指南带有来源、语言与精确修订,可供 docs read 使用。knowledge.current_online 为 false:内置关联不核验目标部署,也不授予权限。指南快照缺失或无效时标为 unavailable,不替换动作合同。\n\nidentity 包含身份协议操作,open、account、operations 与 admin 包含受控资源入口。目录可见不等于可调用,规划中的未支持能力不会伪装为可用方法。\n\n```bash\nlimecloud-cli schema\nlimecloud-cli schema open\nlimecloud-cli schema open.application.list\nlimecloud-cli schema open application list\nlimecloud-cli api list --locale zh-CN\nlimecloud-cli api schema management_account_profile_get\n```\n\n<a id=\"contract\"></a>\n\n## 读取方法合同\n\n| 字段 | 用途 |\n| --- | --- |\n| name / description | 准确命令与任务说明。 |\n| inputSchema | 声明的输入、必填字段、类型、枚举与 CLI 传入方式。 |\n| outputSchema | 公开响应 Schema,包含适用 API 自身的 data 包装。 |\n| _meta.operationId / method / path | 稳定操作标识与 HTTP 目标。 |\n| _meta.required_scopes / access_tokens | 所需显式 Scope 与允许调用身份。 |\n| _meta.risk / doc_url / envelope_version | 读写分类、文档链接与 CLI 合同包装版本。 |\n\n<a id=\"evolution\"></a>\n\n## 核对合同版本\n\n使用 schema METHOD --online 或 api schema OPERATION --online 比较本地动作与所选部署。通过 CLI 配置或 --issuer、--api-origin 明确身份与 API 来源。公开发现不发送 Token/Cookie、不跟随跳转,不登录、升级、开页或调用业务。目标部署需包含该功能;入口不存在时为未知,不解释为无权。\n\n_meta.contract_revision 标识本动作的结构合同及显式语义修订。软件号、其他方法及说明文字变化不决定本次是否匹配。元数据有效期 60 秒,每次显式检查重新读取;即使动作合同在线核对,关联知识仍为内置资料。\n\nmatched 表示观察时精确公开合同相同,不产生权限或确认。ok:true 仅表示 Schema 查询成功,仍须检查 compatibility.status。Management 写入另执行下述前置校验。受管 Skill 更新、精确准备/确认及跨升级恢复仍待实现。保留原请求引用,检查或升级不能重放它。\n\n```bash\nlimecloud-cli schema open.client.list --online\nlimecloud-cli api schema identity_userinfo --online\nlimecloud-cli schema open.client.list --offline\n```\n\n| compatibility.status | 含义 |\n| --- | --- |\n| not-checked | 仅本地合同,未观察线上。 |\n| matched | 本次精确公开动作合同相同,执行时仍须核验授权。 |\n| different | 目标发布不同合同;核对差异,不静默替换原输入。 |\n| absent | 当前公开目录没有此动作。 |\n| unknown | 发现不可用、过期或无效;查看稳定原因。 |\n\n[预览解析后的请求](https://open.limeai.run/docs/cli-dry-run?locale=zh-CN)\n\n[公开 API 参考](https://open.limeai.run/docs/api?locale=zh-CN)\n\n<a id=\"write-precondition\"></a>\n\n## 写入前核对动作合同\n\n每次明确的 Management 写入先校验输入,再无 Token/Cookie 地读取所选 API 的公开元数据;只有本动作合同匹配才发送业务请求。软件号不同或无关动作变化不阻断它。每次写入重新发现,不持久缓存兼容结果或自动重试。\n\nCLI 根据随包合同自动发送 Lime-Action-Contract,不能用 Flag 或请求头覆盖。API 在正式 Bearer 认证及 Scope 检查后、执行时再次核对,再进入原领域规则。合同匹配不提供当前权限、强认证、确认、幂等或独立审核。--dry-run 保持离线,显示本地请求头不会准备或确认操作。\n\nAPI 参考的 cURL 示例与在线调试器使用本站构建时的合同。调试器转发该修订,不静默替换成最新值。自行开发调用端时,发送实际支持的合同修订;照抄服务端最新摘要不能让旧载荷变得兼容。\n\n合同拒绝只证明本次请求未调用领域动作,此前超时请求仍可能已经提交。保留原键、正文及范围,沿原领域回执或核对流程恢复。发现、更新、登录和切语言均不自动重发。完整准备确认、跨升级恢复和 Skill 更新管理尚未交付。\n\n| 结果 | 处理方式 |\n| --- | --- |\n| action_contract_different | 未发送写入。核对当前 Schema 及可信调用端更新,保留此前未知操作。 |\n| action_contract_absent / action_contract_unknown | 未发送写入。检查目标、发现来源及原因,不将其解释为无权。 |\n| 428 ACTION_CONTRACT_REQUIRED | 调用端缺少必填的唯一合同修订头,核对调用端合同后再决定更新。 |\n| 409 ACTION_CONTRACT_CHANGED | 执行时合同不同,包括发现后部署已变化;不自动重发。 |\n| 503 ACTION_CONTRACT_UNAVAILABLE | 服务端无法定位当前编译合同;明确发起新请求前检查发现。 |\n","revision":"sha256:f5378e1baadcb2c6026581087bd63039c0d56d0714bf9f566a28bf04ee60afdb"},{"id":"cli-dry-run","group":"cli","category":"命令行工具","title":"使用 dry-run 预览请求","summary":"不发送请求,查看解析后的方法、URL、输入与脱敏认证。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-dry-run?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"preview","title":"预览操作"},{"id":"limits","title":"预览能确认什么"}],"markdown":"# 使用 dry-run 预览请求\n\n不发送请求,查看解析后的方法、URL、输入与脱敏认证。\n\n<a id=\"preview\"></a>\n\n## 预览操作\n\n--dry-run 解析公开操作、验证已声明本地输入并打印请求计划,不访问网络或写入凭据。API 方法以及受支持的 auth login、refresh、logout、scopes 可预览。请求预览不是服务端响应。\n\n计划包含方法、URL、参数或正文及认证占位值。预览时未配置的 API Origin 可保留占位,实际执行前须配置真实 Origin 并取得适用授权。dry-run 始终脱敏,即使同时传入 --show-secrets。\n\n```bash\nlimecloud-cli identity token exchange \\\n --data '{\"grant_type\":\"client_credentials\",\"audience\":\"example-resource\"}' --dry-run\nlimecloud-cli account order create \\\n --app-id \"$APP_ID\" --environment sandbox \\\n --header \"Idempotency-Key=$ORDER_KEY\" \\\n --data '{\"quote_id\":\"quote_example\"}' --dry-run\n```\n\n<a id=\"limits\"></a>\n\n## 预览能确认什么\n\n预览成功确认命令解析与已支持的本地校验,不能证明应用存在、报价有效、令牌被服务端接受、角色仍有效、强认证足够新或付款会成功。\n\n实际写入前核对原范围、正文、revision 与幂等请求头。移除 --dry-run 即执行真实调用。未知结果按原键与原上下文恢复;预览不会预留订单或幂等键。\n\n[Scope 与管理访问](https://open.limeai.run/docs/management-api?locale=zh-CN)\n\n[输入输出格式](https://open.limeai.run/docs/cli-output?locale=zh-CN)\n","revision":"sha256:f9ca2a4a19935ba1f66539e39b6556a0ebd4ccf06c16daca70abcc7965d3991e"},{"id":"cli-output","group":"cli","category":"命令行工具","title":"输入、输出与脚本调用","summary":"使用结构化 JSON、选择数据字段并按退出码处理,避免泄漏凭据。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-output?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"input","title":"传入结构化输入"},{"id":"formats","title":"选择输出格式"},{"id":"files","title":"上传 PNG 图标"},{"id":"envelope","title":"处理成功与失败"}],"markdown":"# 输入、输出与脚本调用\n\n使用结构化 JSON、选择数据字段并按退出码处理,避免泄漏凭据。\n\n<a id=\"input\"></a>\n\n## 传入结构化输入\n\n--params 与 --data 接受最大 1 MiB 的 JSON 对象、@path 或 - 标准输入。业务正文按 Schema 保留嵌套对象、数组、布尔和整数类型,显式字段 Flag 优先于对应 JSON 字段。敏感字段拒绝内联,使用私有文件、标准输入或 --param-env name=ENV_NAME。\n\nJSON 中的十进制最小单位金额仍使用字符串。请求头仅使用合同声明项。未知字段、未支持枚举或缺少必填输入会校验失败,重试前查看 schema。\n\n商品示例先将《商品、定价与商业条款》中的草稿保存为 product.json,再使用稳定原商品键。示例保留 --dry-run,仅校验和预览请求。\n\n```bash\nlimecloud-cli open application list \\\n --params '{\"spaceID\":\"space_example\",\"sort\":\"created_desc\"}'\nlimecloud-cli operations product create \\\n --app-id \"$APP_ID\" --environment sandbox \\\n --header \"Idempotency-Key=$PRODUCT_KEY\" --data @product.json --dry-run\n```\n\n[商品草稿示例](https://open.limeai.run/docs/products-pricing?locale=zh-CN)\n\n<a id=\"formats\"></a>\n\n## 选择输出格式\n\n| 参数 | 行为 |\n| --- | --- |\n| --format json / --json | 默认结构化包装,包含 ok、identity、data 与 meta;--json 不能与其他格式冲突。 |\n| --format ndjson | 每个输出行使用 JSON 包装;分页页对象仍保留为对象。 |\n| --format table | 终端可读列,文本长度受限。 |\n| --format csv | CSV 单元格加引号,嵌套值保留 JSON 文本;不可信内容导入表格前按表格规则处理。 |\n| --fields id,name | 按 CLI data 选择逗号分隔路径,点路径读取嵌套字段,不改变服务端权限。 |\n\n<a id=\"files\"></a>\n\n## 上传 PNG 图标\n\n两项已声明图标上传方法接受 --file PATH 或 --file - 标准输入。须提供 256 × 256、最大 320 KiB 的 PNG,请求直接使用 image/png 字节,不套 JSON 或 Base64。草稿编辑与图标上传仍要求当前应用或空间开发权限。\n\ndry-run 检查本地文件,仅输出字节数、尺寸与 SHA-256 元数据,不发送图片。上传资源不会自动改变已发布版本冻结的图标。\n\n```bash\nlimecloud-cli open application_icon create \\\n --space-id \"$SPACE_ID\" --file \"./icon.png\" --dry-run\nlimecloud-cli open icon_asset create \\\n --space-id \"$SPACE_ID\" --app-id \"$APP_ID\" --file \"./icon.png\" --dry-run\n```\n\n<a id=\"envelope\"></a>\n\n## 处理成功与失败\n\n成功写入 stdout。CLI 错误以 {ok:false,error:{type,code,message,...}} 写入 stderr;校验可带 subtype=invalid_argument,远端错误可带 status 与 retry_after。成功退出码 0,校验失败为 2,其他失败通常为 1;SIGINT 与 SIGTERM 分别为 130 和 143。错误包装不要求 identity 字段。\n\n管理 HTTP 响应有自身 data 包装,CLI 将其内容放入 CLI data。分页结果保留 items 与 next_cursor,须显式请求后续页;CLI 不静默聚合完整集合。\n\n令牌与 Secret 默认脱敏。--show-secrets 对适用 API 响应显式揭示,不能揭示 dry-run 或本地状态中的凭据;避免共享输出。identity 描述调用方类别,不是实时服务端授权证明。\n\n```json\n{\n \"ok\": false,\n \"error\": {\n \"type\": \"validation\",\n \"subtype\": \"invalid_argument\",\n \"code\": \"invalid_arguments\",\n \"message\": \"Required parameter: spaceID\"\n }\n}\n```\n\n[错误恢复](https://open.limeai.run/docs/cli-troubleshooting?locale=zh-CN)\n","revision":"sha256:2fe6144e0f6b077ca0b0a183170d34ce146f76deadb2a4a1a0ab6e9978504463"},{"id":"cli-troubleshooting","group":"cli","category":"命令行工具","title":"CLI 诊断与恢复","summary":"排查配置、Scope、授权与未知写入,避免重放敏感操作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-troubleshooting?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_login_diagnosis_get"],"sections":[{"id":"diagnostics","title":"先检查本地状态"},{"id":"login-diagnosis","title":"诊断应用登录配置"},{"id":"errors","title":"按失败原因恢复"},{"id":"private-state","title":"保护可恢复私有状态"}],"markdown":"# CLI 诊断与恢复\n\n排查配置、Scope、授权与未知写入,避免重放敏感操作。\n\n<a id=\"diagnostics\"></a>\n\n## 先检查本地状态\n\ndoctor --offline 与根 whoami 仅检查本地配置及凭据元数据;auth whoami 调用远端 UserInfo;auth scopes 访问 Discovery,auth check 仅检查未过期本地授权。这些命令用途不同,本地已登录不能证明当前资源权限。\n\n```bash\nlimecloud-cli --version\nlimecloud-cli doctor --offline\nlimecloud-cli whoami\nlimecloud-cli auth check --scope \"lime:open:read\"\nlimecloud-cli auth whoami\n```\n\n<a id=\"login-diagnosis\"></a>\n\n## 诊断应用登录配置\n\n在当前 Agent 或终端明确选择空间、应用和环境,使用已登记 CLI 客户端及只读 Scope lime:open:read。diagnose login 先核对 open.login_diagnosis.get 当前合同,再通过一次正式委托 GET 取得应用诊断。HTTP、CLI 和 lime_open_login_diagnose 共用该报告,应用与客户端来源分别重验当前权;不登录、刷新凭据、开页、修改配置或自动翻页。\n\n通过 open space list 和 open application list 选择稳定 ID,不根据名称猜应用。若 diagnose --help 未列出此任务,先取得包含该能力的可信构建。目标部署须提供当前公开合同;合同缺失、不同或无法核对时,报告为 blocked,不读取业务资料。\n\n> ok:true 仅表示生成了 CLI 报告。v2 应用报告保留 check_code、status、coverage 和分别计时的领域查询 evidence;CLI 的 contract_check 与真实 HTTP transport 分开记录。login_verified 和 common_snapshot 始终为 false,续页不是完整列表。客户端摘要不含 Secret、回调 URL 正文或完整 Scope;配置观察不能替代真实 OIDC 登录、API 或 Webhook 验收。\n\n```bash\nlimecloud-cli open space list\nlimecloud-cli open application list --space-id space_example\nlimecloud-cli schema open.login_diagnosis.get\nlimecloud-cli diagnose login --space-id space_example --app-id app_example --environment sandbox --format table\nlimecloud-cli diagnose login --space-id space_example --app-id app_example --environment sandbox --limit 10 --json\n```\n\n| 报告状态 | 含义 |\n| --- | --- |\n| observed | 完整返回列表中观察到含 openid 和回调地址的活跃客户端,真实登录仍未验证。 |\n| attention | 完整返回列表中未观察到此类候选;这描述配置,不能确定某次登录失败的原因。 |\n| partial | 仅检查一页,或某个来源不可用。需要时携带返回的游标及相同范围显式继续。 |\n| blocked | 合同核对或应用读取失败;检查稳定检查项和错误码,未读取客户端列表。 |\n\n[OAuth 客户端](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n<a id=\"errors\"></a>\n\n## 按失败原因恢复\n\n| 失败 | 恢复方式 |\n| --- | --- |\n| invalid_arguments | 核对准确方法 Schema、必填路径、请求头、正文和枚举,不原样重试无效输入。 |\n| api_origin_required / login_required | 配置实际 API Origin 与专用公共客户端,再取得绑定它们的登录。 |\n| token_expired / missing_scopes | 刷新可用授权,或显式按所需 Scope 重新登录;读写 Scope 独立。 |\n| 401 / 403 | 核对令牌 issuer、Audience、当前成员、角色、资源范围与强认证;反复登录不会产生缺失的领域角色。 |\n| 409 / revision 过期 | 读取当前资源与原命令结果,检查新状态后再决定显式提交。 |\n| 传输故障 / 超时 | 写入可能已提交;保留原键、正文与范围并恢复原操作,不新建替代付款或订单。 |\n\n<a id=\"private-state\"></a>\n\n## 保护可恢复私有状态\n\n刷新标为未知时不得重放旧轮换令牌,应重新登录。正常退出在远端撤销失败时保留本地凭据;--local-only 仅清本地,不能证明远端已撤销。修改本地认证凭据前清除外部管理的 LIMECLOUD_ACCESS_TOKEN。\n\n进程被强制停止留下锁时,确认记录的进程已结束,再由文件所有者处理。不要向支持人员发送凭据或待完成事务文件;仅分享获授权范围内脱敏版本、方法、错误码与 request 或来源标识。\n\n[凭据生命周期](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n[请求预览](https://open.limeai.run/docs/cli-dry-run?locale=zh-CN)\n","revision":"sha256:93411c201d3c477c7be2afa6a6bbc8521ba07bf3b213c87510037c79a7a586a6"},{"id":"account-spaces","group":"guide","category":"账号与组织","title":"个人与企业空间","summary":"使用同一个 Lime 账号访问多个产品,同时隔离个人与企业资源。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/account-spaces?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"one-account","title":"一个账号,多种关系"},{"id":"switch","title":"选择与切换空间"},{"id":"portals","title":"选择合适的工作入口"}],"markdown":"# 个人与企业空间\n\n使用同一个 Lime 账号访问多个产品,同时隔离个人与企业资源。\n\n<a id=\"one-account\"></a>\n\n## 一个账号,多种关系\n\n同一个人可以同时是客户、企业成员和应用开发者。用户中心与开放平台共用账号和成员关系。加入企业不会把个人订单、许可证、密钥或应用归属迁入企业。\n\n当前空间决定资源上下文,不决定账号类型。空间 ID 只是待核验范围,服务端每次请求都须授权;知道 ID 不会获得访问权。\n\n<a id=\"switch\"></a>\n\n## 选择与切换空间\n\n执行中的命令始终绑定原用户、空间、应用和环境。结果未知时回到原范围恢复,不能在新空间重放。跨标签页完整切换与空间批量管理仍在建设中。\n\n1. 登录后选择自己有权访问的有效个人或企业空间。\n2. 修改配置、安装应用或打开订单前,核对应用与环境。\n3. 切换时清除旧空间的选择项、游标与敏感详情,不让旧上下文的迟到响应覆盖当前页面。\n\n<a id=\"portals\"></a>\n\n## 选择合适的工作入口\n\n| 入口 | 任务 |\n| --- | --- |\n| 用户中心 | 本人资料、安全、已安装应用与授权客户范围内的购买。 |\n| 开放平台 | 应用归属、配置、协作与发布。 |\n| 运营平台 | 获授权应用的销售、活动、订单与财务。 |\n| 管理平台 | 被显式授予的平台审核、权限与财务职责。 |\n\n[成员与权限](https://open.limeai.run/docs/members-permissions?locale=zh-CN)\n\n[本人空间列表 API](https://open.limeai.run/docs/api?operation=management_account_space_list&locale=zh-CN)\n","revision":"sha256:045cd2dfe4da6299e7dab4f3de70f8526fc09092d6bd7dc62004fb2ec9b3d93b"},{"id":"members-permissions","group":"guide","category":"账号与组织","title":"企业成员与权限","summary":"邀请成员,并分别管理企业、应用、安装与财务职责。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/members-permissions?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"invite","title":"邀请成员"},{"id":"boundaries","title":"区分授权边界"},{"id":"revoke","title":"变更与撤销访问"}],"markdown":"# 企业成员与权限\n\n邀请成员,并分别管理企业、应用、安装与财务职责。\n\n<a id=\"invite\"></a>\n\n## 邀请成员\n\n待接受邀请可能过期或被撤销。普通成员编辑不能变更所有者;所有权转移须使用其专门支持的流程。\n\n1. 以当前企业所有者或管理员身份进入企业空间。\n2. 按目标邮箱创建邀请,选择管理员、开发者或成员角色;访问权限变更要求近期强认证。\n3. 收件人使用匹配且已验证的账号登录,打开邀请并显式接受。通过邀请状态核验,不能把发出链接当成成员已经加入。\n\n<a id=\"boundaries\"></a>\n\n## 区分授权边界\n\n| 关系 | 控制范围 |\n| --- | --- |\n| 企业成员 | 当前企业访问与获准的成员管理动作。 |\n| 应用协作 | 指定应用的开发和发布职责。 |\n| 安装与 OAuth 同意 | 应用在空间中的委托使用,以及用户本人批准的 Scope。 |\n| 购买与权益 | 订单确定的采购方、受益方与付费功能。 |\n| 财务角色 | 指定账套、应用、环境与财务动作;应用所有者不会自动获得财务权。 |\n\n<a id=\"revoke\"></a>\n\n## 变更与撤销访问\n\n变更角色或移除成员前,核对目标成员与企业。服务端重新检查当前权限,并随变更撤销受影响的空间授权;隐藏菜单不能替代授权。\n\n短期 JWT 不会让被移除成员继续保有权限。历史订单与财务事实须保留;撤权不等于退款或删除商业记录。批量治理、完整有效期政策与企业联合身份仍在产品建设范围内。\n\n[应用协作者](https://open.limeai.run/docs/collaboration?locale=zh-CN)\n\n[企业身份接入](https://open.limeai.run/docs/enterprise-identity?locale=zh-CN)\n\n[创建邀请 API](https://open.limeai.run/docs/api?operation=management_open_invitation_create&locale=zh-CN)\n","revision":"sha256:2f0b1924ddc5c1553593b04ad55769c0522c9d655eaa4701118eb742b10a430b"},{"id":"identity-lifecycle","group":"guide","category":"身份与授权","title":"账号安全与生命周期","summary":"将注册、验证、MFA、恢复、会话与撤销作为完整接入流程。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/identity-lifecycle?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"canonical-auth","title":"使用中央身份服务"},{"id":"factors","title":"强认证与恢复"},{"id":"sessions","title":"会话、关联与退出"}],"markdown":"# 账号安全与生命周期\n\n将注册、验证、MFA、恢复、会话与撤销作为完整接入流程。\n\n<a id=\"canonical-auth\"></a>\n\n## 使用中央身份服务\n\n通过已登记的 Auth 流程完成登录、验证、MFA 与账号恢复。网页应用使用授权码与 S256 PKCE;桌面和终端应用使用适用的公共客户端流程。应用会话须与中央登录会话分开。\n\n当前身份实现覆盖密码与邮箱挑战、WebAuthn、TOTP、恢复和会话控制。每种启用方式均须验证失败与恢复。外部社交连接、企业 OIDC/SAML、SCIM 及完整生命周期验收仍在补齐。\n\n<a id=\"factors\"></a>\n\n## 强认证与恢复\n\nPasskey 绑定已登记 RP ID 与允许的 Origin。自有应用域名默认跳转中央 Auth 注册和登录。虚拟认证器测试不能证明所有实体认证器均兼容。\n\n删除敏感因子、修改邮箱、账号关联与凭据轮换要求近期强认证。仅控制邮箱不能绕过 MFA 恢复政策。恢复码与一次性挑战属于密钥材料,不能进入分析系统或共享日志。\n\n<a id=\"sessions\"></a>\n\n## 会话、关联与退出\n\n外部身份使用 issuer 与 subject 组合识别。邮箱相同不能成为自动关联账号的依据。支持的关联流程须验证现有账号与新增身份,并记录审计和通知。\n\n退出一个门户清理该门户会话;中央退出撤销关联授权。外部独立应用没有经过验证的退出合同,就不能承诺全部即时退出。撤销、停用与注销须明确各自影响,并遵守订单和财务记录的保留要求。\n\n[OAuth 客户端](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[令牌与撤销](https://open.limeai.run/docs/tokens?locale=zh-CN)\n\n[本人会话列表 API](https://open.limeai.run/docs/api?operation=management_account_session_list&locale=zh-CN)\n\n[本人 Passkey 列表 API](https://open.limeai.run/docs/api?operation=management_account_passkey_list&locale=zh-CN)\n","revision":"sha256:b563a743e3d3a6ddfffa00dbebedb10820e97a204a4be6f5702a6b3ca37e3baa"},{"id":"enterprise-identity","group":"guide","category":"账号与组织","title":"企业 SSO 与成员同步","summary":"规划绑定企业的 OIDC、SAML 与 SCIM 接入,区分域发现与实际授权。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/enterprise-identity?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"availability","title":"接入状态"},{"id":"connection","title":"确定连接范围"},{"id":"provisioning","title":"同步与停用成员"}],"markdown":"# 企业 SSO 与成员同步\n\n规划绑定企业的 OIDC、SAML 与 SCIM 接入,区分域发现与实际授权。\n\n<a id=\"availability\"></a>\n\n## 接入状态\n\n外部企业 OIDC、SAML 2.0 服务提供方接入、已验证域发现、JIT 与 SCIM 2.0 属于 Lime 产品范围,当前尚未达到正式企业接入条件。平台门户共用中央 Lime SSO,不能证明已支持外部企业身份提供方。\n\n不要向未公布的端点提交真实企业令牌或生产元数据。对应合同交付后,可用操作与所需权限会列入公开 API 参考。\n\n<a id=\"connection\"></a>\n\n## 确定连接范围\n\n1. 确定企业负责人、身份提供方、允许的 issuer 或 SAML 实体,以及可使用该连接的应用。\n2. 验证所声明域名的控制权,配置适用的协议校验、凭据轮换与有效期流程。\n3. 批准明确的成员与角色映射。域发现只辅助登录路由,不授予成员或管理员权限。\n\n<a id=\"provisioning\"></a>\n\n## 同步与停用成员\n\nJIT 与 SCIM 仅按已批准企业政策建立成员关系。SCIM 凭据与连接管理须独立授权并审计。同步不能迁移个人购买,也不能凭同邮箱自动关联账号。\n\n验收须覆盖重复投递、并发变更、用户停用、企业移除、凭据轮换与上游故障。停用访问仍须保留必要商业和审计事实。这些控制验证前,不开放企业接入。\n\n[企业权限](https://open.limeai.run/docs/members-permissions?locale=zh-CN)\n\n[账号生命周期](https://open.limeai.run/docs/identity-lifecycle?locale=zh-CN)\n","revision":"sha256:abb218f81d009ede6759d32557d756afb974d9b587ba4e30daff9b76af2e6225"},{"id":"custom-domains","group":"guide","category":"构建应用","title":"独立应用与自有域名","summary":"接入独立托管应用,并规划域名验证与品牌范围访问。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/custom-domains?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"independent","title":"独立托管应用"},{"id":"hosted-domain","title":"自有域名状态"},{"id":"brand-billing","title":"保护品牌范围客户资料"}],"markdown":"# 独立应用与自有域名\n\n接入独立托管应用,并规划域名验证与品牌范围访问。\n\n<a id=\"independent\"></a>\n\n## 独立托管应用\n\nLime 为独立开发应用提供身份与平台服务。应用继续负责代码、部署、本地权限和功能行为。为自有 Origin 登记精确 HTTPS 回调,不向桌面安装包分发机密客户端 Secret。\n\n接入 Lime 不要求所有免费本地功能强制在线登录。应公开哪些功能需要账号、付费权益、网络连接或离线政策。\n\n<a id=\"hosted-domain\"></a>\n\n## 自有域名状态\n\n品牌 Console 域名与平台托管域名绑定仍在建设中。登记应用不会自动验证 DNS、签发证书或创建路由。正式启用须验证域控制权、证书就绪、精确应用绑定与隔离。\n\n品牌 Host 只能收紧获授权应用与环境,不能扩大到其他应用或企业。中央 Auth 继续负责登录与 Passkey Origin;品牌接入不能成为共享父域 Cookie 或向浏览器暴露刷新令牌的理由。\n\n<a id=\"brand-billing\"></a>\n\n## 保护品牌范围客户资料\n\n仅展示当前品牌与空间允许的产品、订单和账务明细。部分视图须说明覆盖范围。原票据含其他应用时,品牌 Host 不能暴露完整附件;完整访问须在平台用户中心重新授权。\n\n[登记客户端](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[账单与票据](https://open.limeai.run/docs/billing-documents?locale=zh-CN)\n","revision":"sha256:c63eb4059ec311e7886734b8702b379d17dc33c6226cd63b30f87434d2f48494"},{"id":"sdk-integration","group":"guide","category":"构建应用","title":"SDK 与应用接入","summary":"通过标准协议库和公开合同接入,Lime 多语言 SDK 持续补齐。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/sdk-integration?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"protocols","title":"从公开合同开始"},{"id":"clients","title":"选择客户端模型"},{"id":"acceptance","title":"验证接入"}],"markdown":"# SDK 与应用接入\n\n通过标准协议库和公开合同接入,Lime 多语言 SDK 持续补齐。\n\n<a id=\"protocols\"></a>\n\n## 从公开合同开始\n\n从 API 参考核对支持的操作、Scope、请求 Schema 和错误响应。OAuth/OIDC 字段保留标准名称。授权、PKCE、令牌验证与 JWKS 轮换使用维护中的 OAuth/OIDC 库,不自行实现令牌验签。\n\n工作区 API Client 与生成类型服务于门户,不等于已发布的多语言 SDK。面向开发者的 SDK、更完整资源接入与应用侧许可证消费仍在交付范围内;本指南不要求使用尚未交付的包或方法。\n\n<a id=\"clients\"></a>\n\n## 选择客户端模型\n\n| 客户端 | 接入方式 |\n| --- | --- |\n| 网页后端 | 授权码与 S256 PKCE,使用精确回调;Secret 与刷新令牌保存在服务端。 |\n| 桌面或终端 | 登记公共客户端,使用 PKCE 或设备授权,不内嵌共享 Secret。 |\n| 机器客户端 | 显式登记机器身份、允许的 Audience 与最小 Scope,不冒充用户。 |\n\n<a id=\"acceptance\"></a>\n\n## 验证接入\n\n1. 核对所选流程要求的 issuer、Audience、回调、state 与 nonce。\n2. 在沙箱验证取消、过期、撤权与 Scope 不匹配;令牌不进入 URL 或共享日志。\n3. 写操作遵循对应幂等与恢复合同;诊断内容脱敏,并保留原 request ID 供排查。\n\n[网页登录教程](https://open.limeai.run/docs/pkce-tutorial?locale=zh-CN)\n\n[CLI](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n[API 参考](https://open.limeai.run/docs/api?locale=zh-CN)\n","revision":"sha256:20a8578526c2f46c3528a374507f007a8070b3a22026244e345ef90d71010511"},{"id":"products-pricing","group":"guide","category":"交易与权益","title":"商品、定价与商业条款","summary":"发布双语商品版本,使用精确币种金额计算价格。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/products-pricing?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"catalog","title":"配置商品"},{"id":"money","title":"使用整数最小货币单位"},{"id":"types","title":"商品类型与可用状态"}],"markdown":"# 商品、定价与商业条款\n\n发布双语商品版本,使用精确币种金额计算价格。\n\n<a id=\"catalog\"></a>\n\n## 配置商品\n\n1. 在运营平台选择具有商品权限的应用与环境。\n2. 填写稳定商品代码、英文与简体中文名称、介绍和商业条款,设置币种、价格与适用设备数。\n3. 检查后发布商品版本。报价读取已发布快照,后续草稿修改不会改变已有订单。\n\n<a id=\"money\"></a>\n\n## 使用整数最小货币单位\n\nAPI 金额使用十进制最小单位整数字符串,并显式携带币种。两位小数币种的 \"1999\" 表示 19.99。应按币种支持的小数位处理,不能假定所有币种均为两位或用 JavaScript 浮点计算金额。\n\n最终报价由服务端生成,冻结商品版本、价格、条款与适用活动修订。只有币种兼容的金额才能比较和汇总。界面以正常本地化货币格式展示,不要求客户手动输入最小单位。\n\n```json\n{\n \"code\": \"desktop_license\",\n \"name\": { \"source\": \"Desktop license\", \"translations\": { \"zh-CN\": \"桌面许可证\" } },\n \"description\": { \"source\": \"Single-device access\", \"translations\": { \"zh-CN\": \"单设备使用\" } },\n \"terms\": { \"source\": \"One-time purchase terms\", \"translations\": { \"zh-CN\": \"一次性购买条款\" } },\n \"kind\": \"one_time\",\n \"interval\": \"\",\n \"currency\": \"USD\",\n \"amount\": \"1999\",\n \"device_limit\": 1\n}\n```\n\n<a id=\"types\"></a>\n\n## 商品类型与可用状态\n\n商品目录建模一次性与月度、年度订阅商品。当前结账支持沙箱一次性购买,对未支持类型明确拒绝。目录中有订阅记录不代表具备周期扣款或续费能力。\n\n试用、周期订阅、席位档位、设备激活、组合包与按量商品仍属于 Lime 商业范围。须配套定价、履约、取消、退款与财务合同后再开放。\n\n[结账与订单](https://open.limeai.run/docs/checkout-orders?locale=zh-CN)\n\n[活动与同意管理](https://open.limeai.run/docs/marketing-consent?locale=zh-CN)\n\n[创建商品 API](https://open.limeai.run/docs/api?operation=management_operations_product_create&locale=zh-CN)\n","revision":"sha256:6ddefb9551bb44253890b8951775d91849f1dc3eaf6f235060360f02f09f50b9"},{"id":"checkout-orders","group":"guide","category":"交易与权益","title":"报价、订单、付款与退款","summary":"完成沙箱购买流程,并按原订单上下文恢复未知结果。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/checkout-orders?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"flow","title":"完成沙箱购买"},{"id":"facts","title":"读取可信状态"},{"id":"recovery","title":"恢复未知结果"}],"markdown":"# 报价、订单、付款与退款\n\n完成沙箱购买流程,并按原订单上下文恢复未知结果。\n\n<a id=\"flow\"></a>\n\n## 完成沙箱购买\n\n生产支付供应商、周期扣款、部分退款与争议处理仍在建设。沙箱付款与退款不会移动真实资金。\n\n1. 选择有资格访问的沙箱应用及已发布一次性商品。当前结账要求该应用的开发或测试资格,仅有运营角色不会获得客户购买资格。\n2. 使用 product_id 与可选 campaign_code 请求服务端报价,检查冻结报价与有效期;当前报价 15 分钟后过期。\n3. 用 quote_id 与稳定 Idempotency-Key 创建订单,提交前保存原键、请求与范围。\n4. 在沙箱显式模拟付款,再回读原订单及权益。需要全额退款时显式模拟,并核对权益撤销结果。\n\n<a id=\"facts\"></a>\n\n## 读取可信状态\n\n| 状态或依据 | 含义 |\n| --- | --- |\n| 报价 | 限时冻结报价,不是订单、付款或权益。 |\n| 订单 | 买方接受的报价与原商业上下文。 |\n| 可信付款 | 经服务端核验的付款事实,浏览器回跳或邮件不足以证明。 |\n| 权益 | 购买产生的受益资格,与安装和 OAuth 同意分别检查。 |\n| 财务入账 | 独立消费形成的会计事实,入账延迟不能要求客户重付。 |\n\n<a id=\"recovery\"></a>\n\n## 恢复未知结果\n\n超时不能证明下单失败。保留原幂等键、报价与用户、应用、环境上下文,按合同查询或重试原操作。换键可能创建第二张订单;同键不同正文属于冲突。\n\n切换空间或应用后不能重放购买。付款、退款、履约与下游投递分别表达状态。通知或记账失败不会抹除可信付款,也不能成为再次扣款的依据。\n\n[权益与许可证](https://open.limeai.run/docs/entitlements-licenses?locale=zh-CN)\n\n[财务记录](https://open.limeai.run/docs/finance-ledger?locale=zh-CN)\n\n[创建报价 API](https://open.limeai.run/docs/api?operation=management_account_quote_create&locale=zh-CN)\n\n[创建订单 API](https://open.limeai.run/docs/api?operation=management_account_order_create&locale=zh-CN)\n","revision":"sha256:b70db0d70d14ecd60d55acfa1501f12baff00c24e9394c6bada116d6a1474af8"},{"id":"entitlements-licenses","group":"guide","category":"交易与权益","title":"权益、许可证与设备","summary":"将购买映射到应用功能,并区分付费资格、登录与安装。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/entitlements-licenses?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"entitlement","title":"核对购买权益"},{"id":"license","title":"许可证与设备接入状态"},{"id":"lifecycle","title":"规划完整生命周期"}],"markdown":"# 权益、许可证与设备\n\n将购买映射到应用功能,并区分付费资格、登录与安装。\n\n<a id=\"entitlement\"></a>\n\n## 核对购买权益\n\n权益记录可信购买产生的商品与受益资格。当前沙箱订单返回 id、product_id、status、created_at 和可选 revoked_at;沙箱全额退款随订单变更原子撤销权益。\n\n登录证明身份,安装委托应用访问,权益允许商业功能。应分别完成适用检查。安装不等于购买,卸载也不会自动退款或取消续费。\n\n<a id=\"license\"></a>\n\n## 许可证与设备接入状态\n\n应用侧许可证消费、设备激活与解绑、席位、离线政策和撤销传播仍在产品建设范围内。当前订单权益不等于完整离线许可证系统。商品的 device_limit 本身不会在外部应用强制执行激活限制。\n\n开放前须确定受益方、应用与功能标识、设备和席位政策、有效期、验证方式及撤销行为。网络不可用与许可证已撤销须分别处理,并公开允许的离线宽限政策。\n\n<a id=\"lifecycle\"></a>\n\n## 规划完整生命周期\n\n1. 履约绑定原付款订单,重复可信事件只产生一份权益。\n2. 使用受保护功能前读取当前获授权权益,不信任客户端自行声明的已付费标记。\n3. 按各自合同处理退款、过期、取消、席位变更与设备撤销,并保留原商业依据。\n\n[订单与退款](https://open.limeai.run/docs/checkout-orders?locale=zh-CN)\n\n[安装授权](https://open.limeai.run/docs/installations?locale=zh-CN)\n","revision":"sha256:3ab96c7ac3d49bdc5d4968a271e86aefa8587fa998313ebaaff6542f3a9efdf0"},{"id":"finance-ledger","group":"guide","category":"账务与财务","title":"账套、凭证与会计期间","summary":"以明确范围、原始依据与受控更正维护不可变复式账簿。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/finance-ledger?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"books","title":"配置财务范围"},{"id":"journals","title":"过账与更正凭证"},{"id":"periods","title":"期间、试算与来源投递"}],"markdown":"# 账套、凭证与会计期间\n\n以明确范围、原始依据与受控更正维护不可变复式账簿。\n\n<a id=\"books\"></a>\n\n## 配置财务范围\n\n获授权财务管理员按经营主体、环境、本位币和 IANA 时区创建账套,再显式绑定应用。主体、币种与时区创建后不可修改;已有应用归属不能静默移到另一账套。\n\n个人空间和客户企业不会自动成为经营主体或独立账套。沙箱账套与正式账套隔离。应用所有者或平台权限管理员身份不会自动获得账套管理或过账权。\n\n<a id=\"journals\"></a>\n\n## 过账与更正凭证\n\n过账、冲正与期间变更要求对应财务动作权及适用的近期强认证。重新认证后仍须显式提交,不能自动重放财务写入。\n\n1. 选择获授权应用、环境、开放期间与币种,提供原始依据和原因。\n2. 各行金额使用最小单位整数字符串;凭证至少两行,在同账套、同币种内借贷合计相等。\n3. 手工过账使用稳定 source_id 作为 Idempotency-Key;已有来源对应不同正文时拒绝。\n4. 更正通过关联原凭证的追加冲正完成,不改写已过账分录;冲正键为 reverse:<journalID>。\n\n<a id=\"periods\"></a>\n\n## 期间、试算与来源投递\n\n期间变更提交预期 revision 与原因,关闭须提供核对依据。试算按期间与币种计算。借贷平衡仅证明账簿算术,不证明渠道或银行已到账。\n\n沙箱付款与退款事实幂等投递到财务。付款形成待结算资产与递延负债,退款冲回原付款凭证。这验证沙箱来源记账,不代表生产收入确认。对账、完整关账、成本、分摊与收入期间仍在建设中。\n\n[对账与结算](https://open.limeai.run/docs/reconciliation-settlement?locale=zh-CN)\n\n[客户账单与票据](https://open.limeai.run/docs/billing-documents?locale=zh-CN)\n\n[凭证列表 API](https://open.limeai.run/docs/api?operation=management_operations_journal_list&locale=zh-CN)\n\n[期间控制 API](https://open.limeai.run/docs/api?operation=management_admin_period_update&locale=zh-CN)\n","revision":"sha256:7284ad562774533a84a19b1785a27a743e80a4534ffd0ee9618a88a5d31ac0a3"},{"id":"billing-documents","group":"guide","category":"账务与财务","title":"客户费用、账单与票据","summary":"在客户范围内区分购买、消费、账单、收据、发票与贷项。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/billing-documents?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"types","title":"区分票据类型"},{"id":"coverage","title":"结合覆盖范围读取金额"},{"id":"status","title":"当前交付与访问规则"}],"markdown":"# 客户费用、账单与票据\n\n在客户范围内区分购买、消费、账单、收据、发票与贷项。\n\n<a id=\"types\"></a>\n\n## 区分票据类型\n\n| 票据 | 含义 |\n| --- | --- |\n| 账单 Statement | 客户在明确期间与范围内的适用业务明细。 |\n| 收据 Receipt | 已确认收款的依据;通知收据不自动等于正式会计或税务票据。 |\n| 票据 Invoice | 由确定主体开具、明确商业或税务类型的票据;不能把所有商业票据称为法定税票。 |\n| 贷项 CreditNote | 关联原票据的应收或税额更正,不证明现金退款已到账。 |\n\n<a id=\"coverage\"></a>\n\n## 结合覆盖范围读取金额\n\n客户费用中心组合获授权交易购买与财务账务事实,不新建钱包或独立账簿。须展示账期、时区、币种、金额定义、来源覆盖与截止点;当前页合计不是全量总额。\n\n来源故障或未接入表示未知,不是零。应使用明确缺失值或 null,并标明已知部分。客户消费与服务商成本口径独立;不能跨币种相加,也不能把付款、消费、退款与贷项当作同一金额的多份记录重复汇总。\n\n<a id=\"status\"></a>\n\n## 当前交付与访问规则\n\n当前用户中心提供沙箱订单、权益与本人付款、退款站内收据。正式跨应用账单、开票、贷项、完整订阅账务及私有票据导出仍在建设。不能把沙箱收据视为已上线税务开票服务。\n\n个人票据核验买方访问,企业票据核验显式企业账务权限。已发布票据保留原开具主体、金额、买方资料、条款与语言快照。较小品牌范围不能暴露包含其他应用的完整附件。\n\n[个人与企业空间](https://open.limeai.run/docs/account-spaces?locale=zh-CN)\n\n[交易通知](https://open.limeai.run/docs/audit-notifications?locale=zh-CN)\n\n[本人收据 API](https://open.limeai.run/docs/api?operation=management_account_receipt_list&locale=zh-CN)\n","revision":"sha256:0e92aed83ba72ccfa660feef34b147b5341abd267656a3be2e9676cca5ac400d"},{"id":"reconciliation-settlement","group":"guide","category":"账务与财务","title":"对账、成本与合作方结算","summary":"正式销售前,分别核验收款、收入、渠道结算与银行到账。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/reconciliation-settlement?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"reconcile","title":"核对独立依据"},{"id":"costs","title":"区分销售、成本与利润"},{"id":"partners","title":"合作方销售与出款门禁"}],"markdown":"# 对账、成本与合作方结算\n\n正式销售前,分别核验收款、收入、渠道结算与银行到账。\n\n<a id=\"reconcile\"></a>\n\n## 核对独立依据\n\n对账分别匹配订单与付款、账簿分录、渠道收退款和手续费、渠道结算及银行流水。各阶段保留独立来源标识、环境、币种、时间与匹配结果。渠道出款成功状态不能证明银行到账。\n\n当前尚未接入外部对账与生产银行依据。后续受控导入须按原渠道或银行交易防重,保留缺失和冲突依据,并通过显式获授权调整处理。读取报表不能执行退款或静默改账。\n\n<a id=\"costs\"></a>\n\n## 区分销售、成本与利润\n\n销售价与模型标价不能证明实际成本。应记录供应商、服务期间、原币、应用和依据,区分预计、已取得账单、已确认费用与已付款。支付账单不能再次确认同一笔费用。\n\n直接成本归属适用应用;公共费用分摊须保留规则版本与明确未分摊部分。收入确认与成本报表仍在建设。报表须注明期间、时区、币种、截止点、计算口径与缺失来源。\n\n<a id=\"partners\"></a>\n\n## 合作方销售与出款门禁\n\n合作方应计、结算、出款、完整关账与授权导出尚未交付。适用商业模式触发时即须满足门禁,不能因公众生态未开放而延期。展示或统一登录本身不会开通代收。\n\n1. 首次适用合作方销售前,确定商户模式、卖方、税费开票责任、退款争议责任、手续费、准备金与结算条款。\n2. 成交时冻结协议版本与分配,财务依据原商业事实形成应计、准备金与应付。\n3. 建立可核验结算单、批准、可付额占用、原出款指令与独立结果核对。出款结果未知时保留占用并恢复原指令,不能为解决超时再付一次。\n\n[账簿与期间](https://open.limeai.run/docs/finance-ledger?locale=zh-CN)\n","revision":"sha256:b73dc359be9d13f967f82caab017b4a83b9dbc9378868e32a3cfa34df1646197"},{"id":"marketing-consent","group":"guide","category":"营销与运营","title":"营销活动、同意与抑制","summary":"使用精确活动优惠,并区分营销联系许可与交易通知。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/marketing-consent?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"campaigns","title":"创建与发布活动"},{"id":"rounding","title":"理解整数优惠"},{"id":"consent","title":"遵守联系目的与同意"}],"markdown":"# 营销活动、同意与抑制\n\n使用精确活动优惠,并区分营销联系许可与交易通知。\n\n<a id=\"campaigns\"></a>\n\n## 创建与发布活动\n\n1. 在运营平台选择获授权应用与环境,填写 code、双语 name、起止时间与 percent_off_basis_points。\n2. 使用起点早于终点的 UTC 时间,优惠为 1 到 9999 个基点;创建时使用稳定 Idempotency-Key。\n3. 使用当前 revision 发布或归档;报价仅应用符合条件的活动,并随报价冻结活动修订。\n\n<a id=\"rounding\"></a>\n\n## 理解整数优惠\n\n10000 个基点表示 100%。当前优惠按最小单位向下取整:1999 最小单位的报价按 1500 基点优惠,减免 299,成交 1700。以服务端报价为准,修改活动不会重算已有订单。\n\n活动创建、发布和归档核验当前权限,并记录事务审计。优惠券核销额度、渠道归因、组合销售与完整活动分析仍在建设。\n\n<a id=\"consent\"></a>\n\n## 遵守联系目的与同意\n\n营销同意与抑制管理仍是必需产品能力,当前尚未交付开放接入。购买、OAuth 同意、企业成员关系或事务通知均不代表订阅营销邮件。跨产品营销不授权共享应用私有资料。\n\n开放营销投递前,须记录获准目的、渠道、来源、范围与同意版本,提供撤回并在投递时执行抑制。必要付款和安全通知使用各自事务目的,不能冒充营销同意。\n\n[商品与定价](https://open.limeai.run/docs/products-pricing?locale=zh-CN)\n\n[通知与审计](https://open.limeai.run/docs/audit-notifications?locale=zh-CN)\n\n[预览活动变更 API](https://open.limeai.run/docs/api?operation=management_operations_campaign_preview&locale=zh-CN)\n","revision":"sha256:c5db07ed33af9f6843b86cc5b52c1adda5d45536fa38d7fb7a07b4b0d5da0024"},{"id":"audit-notifications","group":"guide","category":"营销与运营","title":"审计、通知与投递状态","summary":"追踪获授权操作与独立通知投递,保护消息内容和凭据。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/audit-notifications?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"audit","title":"查询应用审计"},{"id":"receipts","title":"查看本人交易收据"},{"id":"delivery","title":"排查投递状态"}],"markdown":"# 审计、通知与投递状态\n\n追踪获授权操作与独立通知投递,保护消息内容和凭据。\n\n<a id=\"audit\"></a>\n\n## 查询应用审计\n\n运营平台按获授权应用与环境分页查询审计。记录包含 id、actor_id、action、resource_type、resource_id、result、request_id 与 created_at。每页重新核验当前访问,其他应用或环境的游标无效。\n\n新交易与营销变更在业务事务内写入最小审计记录。历史身份、访问、应用与财务审计仍由原领域维护,当前列表不是平台所有动作的完整归档。历史适配、保留政策与导出仍在建设。\n\n<a id=\"receipts\"></a>\n\n## 查看本人交易收据\n\n可信沙箱付款和退款事实经持久消费者生成本人站内收据。字段包括 source_id、application_id、environment、order_id、kind、currency、amount、occurred_at 与 read_at。用户仅可读取本人获准收据,接口不接受任意收件人或消息正文。\n\n通知与财务分别消费原事实。收据延迟不代表付款失败,不能触发再次付款。站内已读状态也不能证明邮件已送达。\n\n<a id=\"delivery\"></a>\n\n## 排查投递状态\n\n获授权管理平台仅展示受控投递状态与时间,不暴露收件地址、正文、密文、凭据或供应商原始错误。当前已有身份邮件和沙箱站内收据;商业邮件、抑制、模板、供应商回执与多通道仍在补齐。\n\n使用 request ID 或原来源 ID 关联排查依据。公开应用 Webhook 具有独立验证、签名、重试与诊断合同,不是任意消息发送通道。\n\n[应用 Webhook](https://open.limeai.run/docs/webhooks?locale=zh-CN)\n\n[营销目的与同意](https://open.limeai.run/docs/marketing-consent?locale=zh-CN)\n\n[应用审计 API](https://open.limeai.run/docs/api?operation=management_operations_audit_list&locale=zh-CN)\n","revision":"sha256:4cc052ba4984a70e58b4dd94fe02984a80324bba4e4c5ecfb77a20a3370084b0"},{"id":"changelog","group":"guide","category":"问题排查","title":"平台文档更新日志","summary":"查看本文档覆盖的开发者接入能力。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/changelog?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"current","title":"应用接入文档"}],"markdown":"# 平台文档更新日志\n\n查看本文档覆盖的开发者接入能力。\n\n<a id=\"current\"></a>\n\n## 应用接入文档\n\n本文档覆盖应用创建、双语资料、空间与权限、身份、事件、发布安装、交易、权益、营销、审计、通知和财务。各项接入均说明当前交付状态,并保留尚在补齐的产品要求。\n\nAPI 参考与 CLI 共用身份及受控管理合同。@limecloud/cli 0.3.0 已发布到 npm。后端 API 部署与专用客户端启用须单独核验;安装包不会授予领域角色、发布应用版本或开通生产付款。\n\n[API 参考](https://open.limeai.run/docs/api?locale=zh-CN)\n\n[开始使用 CLI](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n","revision":"sha256:faaf019c162dcd31f5a244fa4d45217d221ad9a68b0b9ecf57068016dab445fc"},{"id":"application-concepts","group":"guide","category":"认识开放平台","title":"应用基本概念","summary":"接入产品前,区分应用、客户端、配置、版本与安装。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-concepts?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"model","title":"同一应用下的独立对象"},{"id":"independent-axes","title":"区分来源、分发与运行形态"},{"id":"authorization","title":"按链路理解授权"}],"markdown":"# 应用基本概念\n\n接入产品前,区分应用、客户端、配置、版本与安装。\n\n<a id=\"model\"></a>\n\n## 同一应用下的独立对象\n\n应用是软件在平台中的稳定身份,不是可执行安装包。App ID 关联归属、配置、客户端、版本历史与运营。网页、桌面和服务组件可属于同一产品,但不应共用同一份客户端凭据。\n\n| 对象 | 含义 |\n| --- | --- |\n| 应用 | 归属获授权个人或企业空间的稳定产品登记。 |\n| OAuth 客户端 | 独立登记的调用方,具有类型、环境、回调、Scope 与适用凭据。 |\n| 配置修订 | 受并发校验保护的当前配置修改。 |\n| 应用版本 | 用于审核与显式发布的冻结应用、配置快照。 |\n| 安装 | 空间批准的应用使用,绑定版本、可用用户与 Scope。 |\n\n<a id=\"independent-axes\"></a>\n\n## 区分来源、分发与运行形态\n\n官方、自建与合作描述应用来源和政策;公共、机密与机器描述 OAuth 客户端;网页、原生与服务描述代码运行位置。这些维度互不推导:官方桌面应用仍需要公共客户端,合作应用后端可以保护机密凭据。\n\n软件版本、平台配置版本与商品价格版本分别管理。发布配置不会分发桌面安装包、改变已有订单价格,也不会替客户安装应用。\n\n<a id=\"authorization\"></a>\n\n## 按链路理解授权\n\n身份确定调用方;成员与协作决定当前职责;Scope 限定 API 委托;安装与同意约束客户上下文;权益允许付费功能。接入应逐项检查适用环节,不能把令牌、所有者标签或已付费标记视为通用权限。\n\n[选择应用类型](https://open.limeai.run/docs/application-types?locale=zh-CN)\n\n[选择授权流程](https://open.limeai.run/docs/oauth-overview?locale=zh-CN)\n\n[成员与权限边界](https://open.limeai.run/docs/members-permissions?locale=zh-CN)\n","revision":"sha256:933003036443412bc68e146d83b0381f5311a6c36957ff41a378f69d4ca7620e"},{"id":"platform-architecture","group":"guide","category":"认识开放平台","title":"平台结构与入口","summary":"选择正确门户与 API,区分域名入口、用户职责和数据归属。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/platform-architecture?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"surfaces","title":"按任务选择入口"},{"id":"protocol","title":"分开 Auth 与资源 API"},{"id":"owners","title":"按来源追溯事实"}],"markdown":"# 平台结构与入口\n\n选择正确门户与 API,区分域名入口、用户职责和数据归属。\n\n<a id=\"surfaces\"></a>\n\n## 按任务选择入口\n\n[产品入口复用平台服务,并保留各自授权边界。](https://open.limeai.run/docs/platform-architecture?locale=zh-CN#surfaces)\n\n| 入口 | 任务 |\n| --- | --- |\n| 应用中心 App | 发现已上架应用,发起显式安装流程。 |\n| 开放平台 Open | 配置应用、协作、测试与提交版本。 |\n| 统一认证 Auth | 登录、完成因子验证并检查 OAuth、设备同意。 |\n| 用户中心 Console | 管理本人安全、空间、已安装应用与购买。 |\n| 运营平台 Portal / 管理平台 Admin | 运营获授权应用,或执行独立授予的平台职责。 |\n\n<a id=\"protocol\"></a>\n\n## 分开 Auth 与资源 API\n\n身份协议请求使用配置的 issuer 与 Discovery 端点。受控资源 API 使用显式 API Origin 及 /api/v1/open、/account、/operations、/admin 入口。专用 CLI 客户端要求用户授权、绑定 API Audience 与显式领域读写 Scope。\n\n浏览器门户使用本站会话与 CSRF 保护的 BFF。将 BFF 路径复制到 Bearer 客户端不会使其成为公开接口。Host 选择入口,不授予成员关系或其他应用数据权限。\n\n<a id=\"owners\"></a>\n\n## 按来源追溯事实\n\n交易领域拥有订单与可信付款、退款事实;财务记录派生凭证,通知独立记录投递,审计记录获授权变更。收据缺失或凭证延迟不能解释成付款失败,应查询原订单并保留来源标识。\n\n[公开 API 入口](https://open.limeai.run/docs/api-overview?locale=zh-CN)\n\n[个人与企业空间](https://open.limeai.run/docs/account-spaces?locale=zh-CN)\n\n[独立应用与品牌 Host](https://open.limeai.run/docs/custom-domains?locale=zh-CN)\n","revision":"sha256:53733c4fa8d920c4df9007198abe69f1fc50333ac7fafab26b2b7ff085718ba7"},{"id":"integration-scenarios","group":"guide","category":"认识开放平台","title":"选择接入场景","summary":"从产品实际所需功能开始,逐项接入身份、生命周期与商业依赖。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/integration-scenarios?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose","title":"按用户流程选择能力"},{"id":"incremental","title":"按实际需要增加依赖"},{"id":"acceptance","title":"确定可验证终点"}],"markdown":"# 选择接入场景\n\n从产品实际所需功能开始,逐项接入身份、生命周期与商业依赖。\n\n<a id=\"choose\"></a>\n\n## 按用户流程选择能力\n\n[应用可独立采用平台能力,并满足相应前提。](https://open.limeai.run/docs/integration-scenarios?locale=zh-CN#choose)\n\n| 流程 | 需要确定 |\n| --- | --- |\n| 增加统一登录 | 客户端类型、精确回调或设备流程、身份 Scope 与应用会话。 |\n| 面向企业提供应用 | 企业安装、可用成员、个人同意与当前成员核验。 |\n| 销售商品 | 卖方、条款、币种、可信付款、权益履约、退款与适用财务依据。 |\n| 自动化平台管理 | 专用 CLI 客户端、固定 API Audience、显式 Scope 与当前领域职责。 |\n| 接收生命周期事件 | HTTPS 接收端、端点验证、签名、持久去重与安全恢复。 |\n\n<a id=\"incremental\"></a>\n\n## 按实际需要增加依赖\n\n产品登记不要求免费本地功能全部在线登录。登录接入不必先创建商业订单,安装也不会自动订阅营销。账号、联网与购买要求应在用户作决定的对应功能处说明。\n\n当前实现支持沙箱一次性结账、订单、权益及财务、收据消费者。生产供应商、订阅续费、设备许可证与完整账务仍是独立交付任务,应保留场景计划,不把缺失端点写成可用。\n\n<a id=\"acceptance\"></a>\n\n## 确定可验证终点\n\n1. 记录主体、空间、应用、环境与功能结果。\n2. 在成功流程旁补齐拒绝、取消、过期、撤权与未知结果恢复。\n3. 声明端到端可用前,验证实际外部应用与目标部署。\n\n[开发网页应用](https://open.limeai.run/docs/web-application?locale=zh-CN)\n\n[接入原生应用](https://open.limeai.run/docs/native-application?locale=zh-CN)\n\n[上线检查清单](https://open.limeai.run/docs/launch-checklist?locale=zh-CN)\n","revision":"sha256:528947f507ab157a6dd7445f3c0aa879167c1db67a918fc057104c4133121d37"},{"id":"development-workflow","group":"guide","category":"开发前准备","title":"完整开发流程","summary":"从明确用户流程进入配置、测试、审核发布与持续运营。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/development-workflow?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"确定方案与登记"},{"id":"develop","title":"开发与沙箱联调"},{"id":"publish","title":"冻结、审核与发布"},{"id":"operate","title":"运营已发布接入"}],"markdown":"# 完整开发流程\n\n从明确用户流程进入配置、测试、审核发布与持续运营。\n\n<a id=\"prepare\"></a>\n\n## 确定方案与登记\n\n1. 确定产品场景、归属空间与应用来源,分别确认开发、测试、安装、运营与审核人员。\n2. 创建应用,完善公开双语资料与政策,再添加必要协作者。\n3. 选择最小能力、客户端类型、精确回调、身份 Scope 与适用测试账号。\n\n<a id=\"develop\"></a>\n\n## 开发与沙箱联调\n\n沙箱与正式客户端分别配置。先实现完整回调、设备流程与应用会话,再接所需 API 或事件处理。采用稳定测试资源与服务端价格,不将生产凭据粘贴到演示中。\n\n验证撤权、旧 revision、过期授权码和响应丢失后的同一操作,保留失败原命令供恢复。文档样例与预览帮助构造请求,不能证明服务端授权或付款成功。\n\n<a id=\"publish\"></a>\n\n## 冻结、审核与发布\n\n[批准与发布是独立动作,草稿编辑不修改冻结版本。](https://open.limeai.run/docs/development-workflow?locale=zh-CN#publish)\n\n1. 完成适用上线检查,再按目标修订创建冻结版本。\n2. 将精确版本提交独立审核。拒绝后修订草稿并创建新冻结版本,不原地修改旧审核。\n3. 显式发布已批准版本,启用符合条件的正式客户端,并验证目标用户及无权用户。\n\n<a id=\"operate\"></a>\n\n## 运营已发布接入\n\n持续查看配置与版本诊断、投递失败及原交易恢复,复核访问和凭据轮换。后续配置变更、商品调价与软件发布按各自生命周期执行,不改写历史订单,也不静默扩张已有安装权限。\n\n[创建应用](https://open.limeai.run/docs/create-application?locale=zh-CN)\n\n[检查上线准备](https://open.limeai.run/docs/launch-checklist?locale=zh-CN)\n\n[准备审核材料](https://open.limeai.run/docs/review-guidelines?locale=zh-CN)\n","revision":"sha256:193948c1a155f2f240f5510fcd5127338533d639973f1c506ea717b5dd8723d0"},{"id":"application-capabilities","group":"guide","category":"认识开放平台","title":"应用能力","summary":"确定应配置的平台能力,以及仍由应用负责的产品行为。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-capabilities?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"catalog","title":"能力地图"},{"id":"activate","title":"配置不等于客户授权"},{"id":"planned","title":"准确规划待补能力"}],"markdown":"# 应用能力\n\n确定应配置的平台能力,以及仍由应用负责的产品行为。\n\n<a id=\"catalog\"></a>\n\n## 能力地图\n\n| 能力 | 平台职责 | 应用职责 |\n| --- | --- | --- |\n| 身份 | 标准 OAuth/OIDC、设备同意与账号安全。 | 验证流程,维护应用会话并检查功能访问。 |\n| 生命周期 | 配置修订、冻结审核与显式发布。 | 独立构建与部署实际软件。 |\n| 事件 | 已订阅应用生命周期投递与诊断。 | 验签、去重并安全处理事件。 |\n| 商业 | 商品、报价、订单事实及受支持付款退款权益。 | 消费受支持权益合同,不自行伪造已付费权限。 |\n\n<a id=\"activate\"></a>\n\n## 配置不等于客户授权\n\n选择应用能力使配置入口可发现,不会启用正式客户端、创建客户安装或批准用户同意。已发布应用仍须完成适用分发、安装、Scope 与当前访问检查。\n\n受支持认证、API 与事件能力以当前合同为准。登记应用不会附带飞书机器人、电子表格、日历或任意访问桌面 Agent 文件的能力。\n\n<a id=\"planned\"></a>\n\n## 准确规划待补能力\n\n企业身份、多语言 SDK、自有域名托管、生产支付、周期账单、设备席位许可证与完整财务流程均保留在产品范围。向客户承诺前须核对各指南的可用状态;Schema 条目或目录模型不证明生产流程完整。\n\n[SDK 接入状态](https://open.limeai.run/docs/sdk-integration?locale=zh-CN)\n\n[企业身份](https://open.limeai.run/docs/enterprise-identity?locale=zh-CN)\n\n[商业能力](https://open.limeai.run/docs/products-pricing?locale=zh-CN)\n","revision":"sha256:7f917ec9d51766ffd095a9ad663392489777fdea305eeed48232302b200d4060"},{"id":"application-design","group":"guide","category":"开发前准备","title":"设计应用接入方案","summary":"编写接入代码前,明确用户任务、信任边界、权限申请与恢复流程。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-design?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"journey","title":"描述完整用户任务"},{"id":"boundaries","title":"确定信任边界"},{"id":"ux","title":"设计拒绝与恢复界面"}],"markdown":"# 设计应用接入方案\n\n编写接入代码前,明确用户任务、信任边界、权限申请与恢复流程。\n\n<a id=\"journey\"></a>\n\n## 描述完整用户任务\n\n从可观察任务开始,例如登录桌面产品或为团队安装应用。写明发起人、归属空间、应用、环境、预期结果与所需数据,不将身份、安装、付款与营销同意混成一次无法区分的确认。\n\n<a id=\"boundaries\"></a>\n\n## 确定信任边界\n\n| 边界 | 设计决定 |\n| --- | --- |\n| 浏览器与后端 | Secret 与长期刷新令牌不放在浏览器可见配置中。 |\n| 个人与企业 | 显式选择空间,加入企业不迁移个人资产。 |\n| 开发与使用 | 协作者与安装用户、商业受益方分别管理。 |\n| 可信与不可信扩展 | 不能仅凭 manifest 将不可信代码加载进持有会话的宿主。 |\n\n<a id=\"ux\"></a>\n\n## 设计拒绝与恢复界面\n\n1. 授权决定前显示应用、请求权限与目标空间。\n2. 取消或到期后回到安全任务入口,允许用户重新显式发起。\n3. 写入结果未知时提供原命令恢复,不替换成第二次创建或付款。\n4. 重新认证后,由用户检查并再次提交敏感操作。\n\n[数据保护设计](https://open.limeai.run/docs/data-protection?locale=zh-CN)\n\n[双语接入](https://open.limeai.run/docs/application-localization?locale=zh-CN)\n\n[可靠命令](https://open.limeai.run/docs/api-idempotency?locale=zh-CN)\n","revision":"sha256:6822d397c99fc50c5f5ec7285dc16838ce5c0e3375c25b020e2159073ee32525"},{"id":"development-environment","group":"guide","category":"开发前准备","title":"准备接入环境","summary":"隔离 issuer、应用、客户端与测试数据,确保沙箱证据可复现。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/development-environment?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"record","title":"记录连接配置"},{"id":"local","title":"本地回调与 HTTPS"},{"id":"verify","title":"登录前核验配置"}],"markdown":"# 准备接入环境\n\n隔离 issuer、应用、客户端与测试数据,确保沙箱证据可复现。\n\n<a id=\"record\"></a>\n\n## 记录连接配置\n\n| 配置 | 检查内容 |\n| --- | --- |\n| Issuer | 精确 Auth Origin 与 Discovery issuer,不接受用户随意提供的发现 URL。 |\n| 客户端 | 已登记 Client ID、类型、环境与启用状态。 |\n| 回调 | 登记的精确协议、主机、端口、路径与适用查询,不使用通配匹配。 |\n| API Origin | 显式目标资源 Origin 与专用 CLI Audience 绑定。 |\n| 测试用户 | 沙箱协作或测试资格,以及适用企业、安装成员范围。 |\n\n<a id=\"local\"></a>\n\n## 本地回调与 HTTPS\n\n允许时可为沙箱登记回环 HTTP 回调。Lime 仍进行精确匹配,包括已登记端口,不能依赖库的回环端口宽松规则。正式客户端回调要求 HTTPS,当前不能用自定义 URI Scheme 代替已支持的回调合同。\n\n平台本地多 Host 环境使用显式 HTTPS 域名验证 Cookie 隔离。外部应用可在本机运行回调,但须核对自身 Origin 与 issuer,不能假定所有 localhost 进程共用认证上下文。\n\n<a id=\"verify\"></a>\n\n## 登录前核验配置\n\n每个环境使用独立私有凭据文件与合成测试身份。真实 Secret、令牌或恢复码不进入截图、夹具或源码。保留版本与原请求标识,使失败可复现而不暴露凭据。\n\n```bash\ncurl \"$ISSUER/.well-known/openid-configuration\"\nlimecloud-cli --version\nlimecloud-cli config show\nlimecloud-cli doctor --offline\nlimecloud-cli schema identity.token.exchange\n```\n\n[沙箱与正式环境](https://open.limeai.run/docs/environments?locale=zh-CN)\n\n[CLI 配置](https://open.limeai.run/docs/cli-configuration?locale=zh-CN)\n\n[回调规则](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n","revision":"sha256:b0fb53da62b10342a0670754321ff792e4a277a30607f2f8d3ebc5fea3417e82"},{"id":"web-application","group":"guide","category":"开发应用","title":"开发网页应用","summary":"为浏览器产品接入中央登录,管理回调、会话与应用权限。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"architecture","title":"划分浏览器与后端职责"},{"id":"transaction","title":"实现一次授权事务"},{"id":"session","title":"保护应用请求"},{"id":"acceptance","title":"正式启用前验证"}],"markdown":"# 开发网页应用\n\n为浏览器产品接入中央登录,管理回调、会话与应用权限。\n\n<a id=\"architecture\"></a>\n\n## 划分浏览器与后端职责\n\n服务端渲染或 BFF 应用应在后端保存 OAuth 事务、执行令牌兑换并管理刷新凭据,浏览器仅持有受保护应用会话。纯浏览器公共客户端无法保护 Secret,采用该模型前须明确令牌存储与跨源策略。\n\n登记应用不会托管你的网站。应用负责 HTTPS Origin、回调处理、应用会话及业务 API 授权,Lime 提供所配置身份与平台合同。\n\n<a id=\"transaction\"></a>\n\n## 实现一次授权事务\n\n1. 登记精确回调和最小身份 Scope,添加符合条件的沙箱测试成员。\n2. 生成新的 state、nonce 与 S256 PKCE 值,绑定发起浏览器会话及允许的登录后目的地。\n3. 验证回调 state 与错误路径,一次性兑换授权码、验证 ID Token 后建立应用会话。\n4. 清理临时授权数据,在加载分析或无关资源前移除可见回调 URL 中的 code、state。\n\n<a id=\"session\"></a>\n\n## 保护应用请求\n\n应用写入采用 Host 范围安全会话 Cookie、适用 SameSite 政策与 CSRF 保护。会话主体来自已验证用户,不能使用未验证 ID Token 载荷。刷新令牌不通过 iframe URL、浏览器全局变量或微应用 props 传递。\n\n按所选空间、应用与环境重新核验业务权。能登录的用户仍可能缺少安装、企业成员关系或付费权益。会话过期、中央撤销与本站退出须分别提供可见恢复。\n\n<a id=\"acceptance\"></a>\n\n## 正式启用前验证\n\n覆盖两个并发登录标签页、state 缺失或不匹配、授权码重用、撤权、应用会话过期与回调变更。检查双语与窄屏,并避免暴露 Secret。验收使用实际部署应用,API 预览本身不足。\n\n[授权码流程](https://open.limeai.run/docs/authorization-code-flow?locale=zh-CN)\n\n[校验回调](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n\n[验证 ID Token](https://open.limeai.run/docs/id-token-validation?locale=zh-CN)\n","revision":"sha256:1d796baf794e932905d4310ecedf7b528341c39ab3429bd79ebbe031cbb7955a"},{"id":"server-application","group":"guide","category":"开发应用","title":"开发服务端集成","summary":"区分机密用户登录、机器凭据与专用管理自动化。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/server-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"选择调用身份"},{"id":"secrets","title":"正确存储与发送凭据"},{"id":"requests","title":"构建有界资源请求"}],"markdown":"# 开发服务端集成\n\n区分机密用户登录、机器凭据与专用管理自动化。\n\n<a id=\"identity\"></a>\n\n## 选择调用身份\n\n机器令牌不能调用 UserInfo 或当前用户范围 /api/v1 管理方法。用户授权过期时不能改用机器授权代替,也不能把某用户刷新令牌当成无界共享服务凭据。\n\n| 需求 | 身份 |\n| --- | --- |\n| 代表已登录用户 | 授权码与 PKCE、用户同意及适用机密后端客户端。 |\n| 获取机器协议令牌 | 显式登记的机器客户端和允许的 Audience,不具有用户资料身份。 |\n| 自动化 Lime 管理 | 专用公共 CLI 用户授权、显式管理 Scope 与当前领域角色。 |\n\n<a id=\"secrets\"></a>\n\n## 正确存储与发送凭据\n\n机密凭据通过部署私有 Secret 设施注入。OAuth POST 字段采用表单编码;client_secret_basic 须分别表单编码 Client ID 和 Secret,再构造 Basic 认证。Secret 不放在表单中,调试不打印认证请求头。\n\n同一授权的刷新令牌轮换须串行,消费旧凭据前保存恢复状态。响应超时可能意味着旧令牌已消费;原结果无法确认时重新显式登录,不重放旧令牌。\n\n<a id=\"requests\"></a>\n\n## 构建有界资源请求\n\n1. 从当前合同读取精确操作、目标 Origin、Audience 与所需 Scope。\n2. 只对 JSON 方法发送 JSON,金额保留整数字符串,保留路径与资源绑定。\n3. 设置超时、限制响应大小并拒绝跨源转发凭据,写入按原键恢复。\n4. 记录稳定操作与 request、来源标识及脱敏诊断,不记录令牌或私有正文。\n\n[机器授权协议](https://open.limeai.run/docs/client-credentials-flow?locale=zh-CN)\n\n[受控管理访问](https://open.limeai.run/docs/management-api?locale=zh-CN)\n\n[重试与超时政策](https://open.limeai.run/docs/api-retry-policy?locale=zh-CN)\n","revision":"sha256:c660af6cbf44273d0d5064b2f3239836b2049d9bcd608c9367fcc00c4f522e28"},{"id":"native-application","group":"guide","category":"开发应用","title":"开发原生应用","summary":"为桌面与移动软件接入,避免内嵌共享 Secret 或声称未支持宿主 API。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/native-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"public-client","title":"登记公共客户端"},{"id":"browser","title":"处理浏览器与设备切换"},{"id":"storage","title":"保护本地状态与离线行为"}],"markdown":"# 开发原生应用\n\n为桌面与移动软件接入,避免内嵌共享 Secret 或声称未支持宿主 API。\n\n<a id=\"public-client\"></a>\n\n## 登记公共客户端\n\n分发安装包无法保护共享机密 Secret。应登记公共客户端,并在系统浏览器认证。无法提供受支持浏览器回调时可用设备授权。不同应用与环境的公共 Client ID 应明确区分。\n\n当前回调登记采用精确 HTTPS 与允许的沙箱回环 HTTP,不支持任意原生自定义 Scheme。OAuth 库提供某种回调方式不代表平台已支持,选择流程前须在目标操作系统测试已登记回调。\n\n<a id=\"browser\"></a>\n\n## 处理浏览器与设备切换\n\n1. 显示应用名称,并说明认证将在用户浏览器继续。\n2. 在发起设备保存 state、nonce、verifier 或私密 device_code。设备同意只展示验证链接与用户码。\n3. 提供取消与到期恢复,成功、拒绝、到期或取消时停止有界设备轮询。\n4. 仅在协议验证完成后建立本地账号上下文,打开深链本身不足。\n\n<a id=\"storage\"></a>\n\n## 保护本地状态与离线行为\n\n可用时使用操作系统私有凭据存储,不将刷新令牌写入普通偏好、崩溃报告或同步日志。轮换须串行,凭据过期与网络不可用分别处理。本地退出不能证明服务端已撤销。\n\n设备激活、离线许可证、席位与撤销传播仍在建设。当前沙箱权益不提供完整离线许可证验证 SDK。免费本地功能可按产品公开政策保持离线可用。\n\n[设备授权详解](https://open.limeai.run/docs/device-authorization-flow?locale=zh-CN)\n\n[商业与离线政策](https://open.limeai.run/docs/entitlements-licenses?locale=zh-CN)\n\n[客户端接入文档](https://open.limeai.run/docs/client-overview?locale=zh-CN)\n","revision":"sha256:79df90ab815d00a67ca3d3662734abfbf230fb3d2bdb01a9d05db86d31cbc4ac"},{"id":"oauth-overview","group":"guide","category":"授权流程","title":"OAuth 与 OpenID Connect 概念","summary":"选择受支持授权类型,区分身份声明、访问令牌、Scope 与 Audience。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/oauth-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"terms","title":"各值具有不同用途"},{"id":"grants","title":"选择受支持流程"},{"id":"scopes","title":"身份与管理权限"}],"markdown":"# OAuth 与 OpenID Connect 概念\n\n选择受支持授权类型,区分身份声明、访问令牌、Scope 与 Audience。\n\n<a id=\"terms\"></a>\n\n## 各值具有不同用途\n\n| 值 | 用途 |\n| --- | --- |\n| 授权码 | 短期一次性凭据,结合原回调与 verifier 兑换。 |\n| 访问令牌 | 访问获准资源的 Bearer 凭据,不通过解读载荷直接建立应用会话。 |\n| ID Token | 须验证 issuer、Audience、时效与 nonce 的 OIDC 签名身份声明。 |\n| 刷新令牌 | 符合条件 offline_access 授权的敏感轮换凭据。 |\n| Scope / Audience | 委托权限与目标资源,均不替代当前领域授权。 |\n\n<a id=\"grants\"></a>\n\n## 选择受支持流程\n\n用户能返回精确登记回调时使用授权码与 S256 PKCE;桌面或终端无法提供该回调时使用设备授权。既有符合条件授权可通过轮换刷新。Client Credentials 是独立登记机器身份,不是用户登录。\n\n当前协议不公布 Implicit、密码授权、plain PKCE、Request Object 或任意回调 Scheme。应读取目标部署 Discovery,并结合客户端与应用政策;库通用功能列表不能启用服务端能力。\n\n<a id=\"scopes\"></a>\n\n## 身份与管理权限\n\n普通用户客户端可请求已配置 openid、profile、email 与 offline_access。八项 lime:* 管理 Scope 要求专门登记公共 CLI 客户端与 API Audience 绑定。资源读取不推导写入,管理 Scope 本身也不产生应用或平台角色。\n\n[授权码](https://open.limeai.run/docs/authorization-code-flow?locale=zh-CN)\n\n[设备授权](https://open.limeai.run/docs/device-authorization-flow?locale=zh-CN)\n\n[机器授权](https://open.limeai.run/docs/client-credentials-flow?locale=zh-CN)\n\n[Scope 目录](https://open.limeai.run/docs/scopes?locale=zh-CN)\n","revision":"sha256:983dfad89446c8f3a0983c1fbf103a58413b710cda9cac6b8af1b2993b47dc52"},{"id":"authorization-code-flow","group":"guide","category":"授权流程","title":"授权码与 S256 PKCE","summary":"按精确请求、回调、兑换与验证合同接入用户登录。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/authorization-code-flow?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prerequisites","title":"准备有效客户端"},{"id":"request","title":"构造浏览器授权请求"},{"id":"callback","title":"校验并一次性兑换"},{"id":"prompt","title":"显式处理认证提示"}],"markdown":"# 授权码与 S256 PKCE\n\n按精确请求、回调、兑换与验证合同接入用户登录。\n\n<a id=\"prerequisites\"></a>\n\n## 准备有效客户端\n\n登记用户客户端、精确回调与允许身份 Scope。沙箱用户须具备适用测试范围;正式环境要求当前已发布配置、有效客户端及适用安装和访问范围。公共与机密授权码客户端均使用 S256 PKCE。\n\n<a id=\"request\"></a>\n\n## 构造浏览器授权请求\n\n[回调授权码结合发起事务 verifier 一次性兑换。](https://open.limeai.run/docs/authorization-code-flow?locale=zh-CN#request)\n\n| 参数 | 规则 |\n| --- | --- |\n| response_type / response_mode | 使用 code,支持的响应模式为 query。 |\n| client_id / redirect_uri | 使用精确登记客户端与回调,包括端口和路径。 |\n| state / nonce | 使用新的不可预测值;当前协议要求至少 16 字符,openid 必须带 nonce。 |\n| code_challenge / code_challenge_method | 使用 Base64url SHA-256 Challenge 与 S256,私密保留原 verifier。 |\n\n<a id=\"callback\"></a>\n\n## 校验并一次性兑换\n\n当前授权码有效期一分钟且只能消费一次。兑换响应丢失不使授权码可重用,结果无法确认时重新授权,诊断日志不能暴露 code 或 verifier。\n\n1. 只解析发起浏览器内匹配且未过期的 state;先处理 error 与 state,再考虑授权码兑换。\n2. 以表单 POST grant_type=authorization_code、code、原 redirect_uri 和 code_verifier。公共客户端传 client_id,机密客户端使用 client_secret_basic。\n3. 使用维护中的 OIDC 库按原 nonce 验证身份声明,再建立本地应用会话。\n\n<a id=\"prompt\"></a>\n\n## 显式处理认证提示\n\n当前协议接受 prompt=login、consent、none 及可选非负 max_age。静默请求可能返回 login_required 或 consent_required,不能因此自动批准;需要用户决定时回到交互浏览器流程。\n\n[可运行 PKCE 教程](https://open.limeai.run/docs/pkce-tutorial?locale=zh-CN)\n\n[回调验证](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n\n[授权端点](https://open.limeai.run/docs/api?operation=identity_authorize&locale=zh-CN)\n","revision":"sha256:0dffc4829650733f0b73a1180afb3411d2f503a9241e02a4c50b88485d574257"},{"id":"callback-validation","group":"guide","category":"授权流程","title":"回调登记与验证","summary":"防止回调混淆、登录替换与跨标签页状态串用。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/callback-validation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"register","title":"登记精确目的地"},{"id":"transaction","title":"绑定发起事务"},{"id":"response","title":"安全处理成功与拒绝"}],"markdown":"# 回调登记与验证\n\n防止回调混淆、登录替换与跨标签页状态串用。\n\n<a id=\"register\"></a>\n\n## 登记精确目的地\n\n比较完整已登记 redirect_uri,而非只比较 Origin 或后缀。协议、主机、显式端口、路径与登记查询均有意义。不使用通配回调、开放重定向,或将不可信 return_to 转发到其他 Origin 的回调。\n\n正式回调要求 HTTPS,允许的沙箱回环 HTTP 仍须精确匹配登记端口。多个用户客户端回调须符合客户端 Sector、Host 约束,不能假定无关主机可共用用户客户端。\n\n<a id=\"transaction\"></a>\n\n## 绑定发起事务\n\n1. 生成高熵 state,关联原 verifier、nonce、客户端和允许的登录后路径。\n2. 在发起服务端或浏览器上下文中限时保存事务,并发标签页保留独立条目。\n3. 回调时拒绝缺失、重复、不匹配或过期值,只消费匹配事务,不清除其他标签页待完成登录。\n\n<a id=\"response\"></a>\n\n## 安全处理成功与拒绝\n\n错误响应仍须匹配 state。用户拒绝后提供安全返回操作,不兑换授权码。成功与错误参数相互矛盾时拒绝处理,不能仅因 URL 含 code 就建立账号会话。\n\n处理后移除浏览器可见授权参数,清理前避免回调页加载第三方资源。排查仅保留脱敏错误或请求标识,登录后目的地始终限制在允许路由。\n\n[授权码参考](https://open.limeai.run/docs/authorization-code-flow?locale=zh-CN)\n\n[排查回调拒绝](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n","revision":"sha256:82308f49abcff12293fde3157ba9363a49cd371c6d42f1717dc3a45d8a57c725"},{"id":"client-credentials-flow","group":"guide","category":"授权流程","title":"机器凭据流程","summary":"使获准后端完成身份认证,不冒充交互用户。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-credentials-flow?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"eligibility","title":"确认机器客户端适用性"},{"id":"request","title":"请求受限令牌"},{"id":"operations","title":"轮换与诊断"}],"markdown":"# 机器凭据流程\n\n使获准后端完成身份认证,不冒充交互用户。\n\n<a id=\"eligibility\"></a>\n\n## 确认机器客户端适用性\n\n仅对显式接受其 Audience 和机器 Scope 的资源使用已登记机器客户端。此类客户端没有交互回调,不能请求 openid、profile、email 或 offline_access,也不会创建真人会话或用户同意。\n\nLime 受控管理 API 要求专用 CLI 客户端和获授权用户。成功兑换机器令牌不授予 /api/v1/open、/account、/operations 或 /admin 权限,这些操作应选择 CLI 用户流程。\n\n<a id=\"request\"></a>\n\n## 请求受限令牌\n\n1. 从已批准部署配置读取 issuer、允许的 Audience 与 Scope,Secret 仅保存在后端密钥存储。\n2. 向发现的 Token 端点 POST 表单 grant_type=client_credentials 及允许的 Scope、Audience。使用 client_secret_basic,构造 Basic 凭据前分别对 Client ID 和 Secret 进行表单编码。\n3. 按 issuer、客户端、Audience 与实际授予 Scope 缓存至 expires_in 前的安全余量,不将一个资源的令牌用于另一个资源。\n\n<a id=\"operations\"></a>\n\n## 轮换与诊断\n\n机器授权没有 Refresh Token,到期按需重新获取,并串行处理并发更新。遇到 invalid_client 先核对启用状态与凭据轮换,不降级公共客户端,也不把 Secret 放入请求查询;仅保留脱敏请求标识。\n\n[客户端类型](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[轮换 Secret](https://open.limeai.run/docs/client-secret-rotation?locale=zh-CN)\n\n[Token 端点](https://open.limeai.run/docs/api?operation=identity_token&locale=zh-CN)\n","revision":"sha256:0883c35b7bbba088466149f86486218643485ceb72babd3aff8ce5ce76f5c3ea"},{"id":"refresh-token-flow","group":"guide","category":"授权流程","title":"刷新与轮换用户令牌","summary":"在保持刷新令牌轮换一致的前提下延续获准用户授权。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/refresh-token-flow?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"obtain","title":"按需申请离线访问"},{"id":"rotate","title":"串行执行刷新事务"},{"id":"recover","title":"处理响应丢失"}],"markdown":"# 刷新与轮换用户令牌\n\n在保持刷新令牌轮换一致的前提下延续获准用户授权。\n\n<a id=\"obtain\"></a>\n\n## 按需申请离线访问\n\n确需持续访问时,在原交互授权中请求 offline_access。实际授权以返回 Scope 和令牌响应为准,不能在本地添加字段来生成 Refresh Token。使用后端密钥存储或操作系统凭据库保存。\n\n当前 Access Token 有效期十分钟,刷新授权具有三十天有效期边界。始终以实际 expires_in 与服务端政策为准,刷新授权到期或撤销后让用户重新授权。\n\n<a id=\"rotate\"></a>\n\n## 串行执行刷新事务\n\n1. 按已存授权加锁,防止并发请求兑换同一 Refresh Token。\n2. 按登记客户端认证方式,向发现的 Token 端点发送 grant_type=refresh_token 与当前 refresh_token 表单。\n3. 原子保存新 Access Token、替换 Refresh Token 与到期时间后再放行其他请求;成功后废弃旧 Refresh Token。\n\n<a id=\"recover\"></a>\n\n## 处理响应丢失\n\n超时可能发生在服务端已消费并轮换旧令牌之后。重放旧令牌不安全,可能触发复用保护。若无法从本地原子事务恢复新授权,应清理不可用凭据并重新交互授权,不对 invalid_grant 循环重试。\n\n刷新身份不会恢复已移除成员关系、应用权限、安装或管理职责。资源 API 仍针对每次敏感操作核对当前主体与上下文。\n\n[撤销授权](https://open.limeai.run/docs/token-revocation?locale=zh-CN)\n\n[CLI 凭据处理](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n[刷新参数](https://open.limeai.run/docs/api?operation=identity_token&locale=zh-CN)\n","revision":"sha256:56f1b7dd79d5c6773d4bdc271556830ce5d384bb6cf5076302a05babfb0dd0bf"},{"id":"token-revocation","group":"guide","category":"授权流程","title":"撤权与退出登录","summary":"区分清理本地会话、撤销 OAuth 授权与移除资源权限。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/token-revocation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"boundaries","title":"选择预期影响"},{"id":"revoke","title":"调用撤销端点"},{"id":"session","title":"说明会话范围"}],"markdown":"# 撤权与退出登录\n\n区分清理本地会话、撤销 OAuth 授权与移除资源权限。\n\n<a id=\"boundaries\"></a>\n\n## 选择预期影响\n\n| 动作 | 影响 |\n| --- | --- |\n| 应用退出 | 按本应用政策失效本地会话并移除已存凭据。 |\n| OAuth 撤权 | 按登记客户端认证方式,请求 issuer 撤销所提交令牌或授权。 |\n| 移除成员或安装 | 独立改变资源授权,不依赖已签发身份声明是否到期。 |\n\n<a id=\"revoke\"></a>\n\n## 调用撤销端点\n\n1. 从可信 Discovery 取得 revocation_endpoint,以编码表单提交 token,不放入 URL 参数。\n2. 使用同一已登记客户端认证,仅在已知时传 token_type_hint;按协议处理成功,不把成功响应理解为证明令牌曾存在。\n3. 移除应用本地凭据并关闭会话。远端撤权无法确认时记录脱敏结果,不在调试记录保留秘密。\n\n<a id=\"session\"></a>\n\n## 说明会话范围\n\n退出一个应用不代表所有浏览器会话或其他应用均已退出。当前公开合同未提供通用 RP Logout 端点,应准确说明动作范围,并将账号安全或已连接应用检查导向相应用户中心流程。\n\n[账号生命周期](https://open.limeai.run/docs/identity-lifecycle?locale=zh-CN)\n\n[撤销参考](https://open.limeai.run/docs/api?operation=identity_revoke&locale=zh-CN)\n","revision":"sha256:3b9d5c3b4a5e4d5e71395edbdb3fe3a0078c05f6ea56e050cec8d85db783d06c"},{"id":"oidc-discovery","group":"guide","category":"授权流程","title":"OIDC 发现与签名密钥","summary":"从固定 issuer 解析协议端点与验证密钥。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/oidc-discovery?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"issuer","title":"先确定可信 issuer"},{"id":"keys","title":"处理密钥轮换"},{"id":"availability","title":"保持协议配置稳定"}],"markdown":"# OIDC 发现与签名密钥\n\n从固定 issuer 解析协议端点与验证密钥。\n\n<a id=\"issuer\"></a>\n\n## 先确定可信 issuer\n\n在部署设置固定预期 issuer,并请求其 /.well-known/openid-configuration。验证文档 issuer 精确匹配,不根据回调或不可信身份令牌中的任意 URL 发起 Discovery。\n\n使用返回的 authorization_endpoint、token_endpoint、userinfo_endpoint、jwks_uri、revocation_endpoint 与支持方法。当前签名密钥路径为 /oauth/jwks;OAuth 响应是协议原生 JSON,不是管理 API 的 data 信封。\n\n<a id=\"keys\"></a>\n\n## 处理密钥轮换\n\n1. 按适用 HTTP 缓存策略保存可信 JWKS,并按 kid 与支持算法查找密钥。\n2. 遇到未知 kid,在并发与重试限制内刷新固定 JWKS 一次;不跟随令牌提供的 jku,也不接受无签名令牌。\n3. 密钥无法解析或签名无效时拒绝,并保留脱敏原因。成功获取 JWKS 不代表声明与权限已验证。\n\n<a id=\"availability\"></a>\n\n## 保持协议配置稳定\n\nDiscovery 暂时故障时,不自动切换 issuer 或关闭签名验证。库支持时使用有期限的已知正确缓存,到期后安全失败。issuer 变化应作为显式迁移,评估主体、回调与已存授权。\n\n[验证 ID Token](https://open.limeai.run/docs/id-token-validation?locale=zh-CN)\n\n[Discovery 响应](https://open.limeai.run/docs/api?operation=identity_discovery&locale=zh-CN)\n\n[JWKS](https://open.limeai.run/docs/api?operation=identity_jwks&locale=zh-CN)\n","revision":"sha256:c61ee4824b5e24cccd28346f86ae55636975e98d4fad1b81ac2aa204d60a5b71"},{"id":"id-token-validation","group":"guide","category":"授权流程","title":"验证 ID Token","summary":"完成签名、声明与事务校验后,才建立本地身份会话。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/id-token-validation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"verify","title":"使用维护中的 OIDC 库验证"},{"id":"subject","title":"保存正确身份主键"},{"id":"permission","title":"区分身份与 API 权限"}],"markdown":"# 验证 ID Token\n\n完成签名、声明与事务校验后,才建立本地身份会话。\n\n<a id=\"verify\"></a>\n\n## 使用维护中的 OIDC 库验证\n\n1. 仅允许已配置 RS256 算法,从固定 issuer 的 JWKS 解析签名密钥。\n2. 验证精确 iss、aud 中登记 Client ID、适用 azp 规则及 exp、iat,仅允许小幅且有界的时钟容差。\n3. 将 nonce 与原一次性授权事务匹配,再消费事务。不接受从其他浏览器或客户端复制的令牌。\n\n<a id=\"subject\"></a>\n\n## 保存正确身份主键\n\n以 (iss, sub) 组合作为外部身份主键。Lime 使用 Pairwise Subject,不同客户端 Sector 的 sub 可能不同。昵称、邮箱、员工标签或应用协作者记录不能替代已验证主体。\n\n若获取 UserInfo,应校验其 sub 与已验证 ID Token 一致。声明取决于实际 Scope 与账号状态;即使新授权返回熟悉邮箱,也不能仅凭邮箱匹配自动关联本地已有账号。\n\n<a id=\"permission\"></a>\n\n## 区分身份与 API 权限\n\nID Token 面向客户端,当前有效期十分钟。它不是资源 API 的 Bearer 凭据,也不表达当前应用成员关系或付费权益。建立有期限应用会话后,仍须按任务检查资源与业务权限。\n\n[选择身份标识](https://open.limeai.run/docs/user-identifiers?locale=zh-CN)\n\n[UserInfo 字段](https://open.limeai.run/docs/userinfo?locale=zh-CN)\n","revision":"sha256:736add0e977843715d29893440021be4d804e07f03c7d40c3176d04f9f59e9fa"},{"id":"device-authorization-flow","group":"guide","category":"授权流程","title":"设备授权流程","summary":"通过独立确认的浏览器事务接入终端。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/device-authorization-flow?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"start","title":"发起新的设备事务"},{"id":"poll","title":"按协议轮询"},{"id":"phishing","title":"防止设备码钓鱼"}],"markdown":"# 设备授权流程\n\n通过独立确认的浏览器事务接入终端。\n\n<a id=\"start\"></a>\n\n## 发起新的设备事务\n\n当前设备流程适用于已登记公共或机密用户客户端,不适用于机器客户端。使用登记客户端及允许 Scope 请求设备码,此流程不使用 PKCE。若携带安装或空间上下文,须保持与同一发起事务一致。\n\n[终端轮询期间,用户在浏览器独立确认验证码。](https://open.limeai.run/docs/device-authorization-flow?locale=zh-CN#start)\n\n1. 展示返回的 verification_uri 与 user_code,明确应用与请求权限。\n2. 由用户自行打开可信验证页并核对显示码,不要求向客服发送密码或验证码。\n3. 遵守 expires_in 与返回 interval;当前设备码有效期十分钟。\n\n<a id=\"poll\"></a>\n\n## 按协议轮询\n\n| 响应 | 处理 |\n| --- | --- |\n| authorization_pending | 等待当前 interval 后再轮询。 |\n| slow_down | 本次与后续轮询间隔增加五秒。 |\n| access_denied / expired_token | 停止,说明结果并允许显式重新发起。 |\n| 令牌响应 | 停止轮询,一次性安全保存返回授权。 |\n\n<a id=\"phishing\"></a>\n\n## 防止设备码钓鱼\n\n验证码标识待处理授权,不是账号权益。浏览器须在同意前展示请求应用、Scope 与上下文。用户未发起的验证码应取消;终端在取消、退出或到期后停止轮询。浏览器登录成功本身不代表设备同意已批准。\n\n[可运行设备教程](https://open.limeai.run/docs/device-tutorial?locale=zh-CN)\n\n[设备授权端点](https://open.limeai.run/docs/api?operation=identity_device_authorization&locale=zh-CN)\n","revision":"sha256:ce33244d38c2012f2d5493385a42e47fb12b58f5a03bbdfe4b75bb6d9ea44935"},{"id":"user-identifiers","group":"guide","category":"认识开放平台","title":"用户身份标识","summary":"选择稳定主键,不套用其他平台的用户 ID 体系。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/user-identifiers?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"keys","title":"按接收边界选择标识"},{"id":"example","title":"跨应用会话映射用户"},{"id":"obtain","title":"仅获取获准声明"}],"markdown":"# 用户身份标识\n\n选择稳定主键,不套用其他平台的用户 ID 体系。\n\n<a id=\"keys\"></a>\n\n## 按接收边界选择标识\n\n| 标识 | 用途 |\n| --- | --- |\n| OIDC (iss, sub) | 完整验证 ID Token 后的外部应用账号映射。 |\n| 平台用户 ID | 合同返回时用于获授权平台管理记录。 |\n| 空间或成员记录 ID | 标识资源上下文或成员记录,不作为全局真人身份。 |\n| 邮箱或显示名 | 按同意用于联系与展示,不作为稳定主键。 |\n\n<a id=\"example\"></a>\n\n## 跨应用会话映射用户\n\n用户显式连接账号时,保存 issuer、subject 与本地账号 ID。后续同 issuer、同 Sector 验证登录后查询该映射。issuer 或 subject 变化时,先视作不同身份,直到用户完成独立安全关联流程。\n\n桌面与网页客户端不保证获得相同 Pairwise sub,不能凭邮箱合并,也不能假定存在等价飞书 union_id 的标识。支持多个身份 Sector 前应设计用户确认的账号关联流程。\n\n<a id=\"obtain\"></a>\n\n## 仅获取获准声明\n\n1. 用户授权中请求 openid 及必要 profile、email Scope。\n2. 验证 ID Token,必要时用 Access Token 调用 UserInfo 并核对 sub。\n3. 处理可选声明缺失与账号资料变化,不覆盖稳定身份映射。\n\n[验证身份](https://open.limeai.run/docs/id-token-validation?locale=zh-CN)\n\n[读取 UserInfo](https://open.limeai.run/docs/userinfo?locale=zh-CN)\n","revision":"sha256:6372b7b7c6003a0d972040c1cad0ff12b24a04427217d0c74ff73f38c0f5d815"},{"id":"application-icons","group":"guide","category":"管理应用","title":"应用图标与品牌资料","summary":"为应用列表和授权界面提供可识别、可访问的品牌资料。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-icons?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose","title":"选择清晰标识"},{"id":"prepare","title":"准备与预览图片"},{"id":"accessible","title":"文字标签独立于装饰"}],"markdown":"# 应用图标与品牌资料\n\n为应用列表和授权界面提供可识别、可访问的品牌资料。\n\n<a id=\"choose\"></a>\n\n## 选择清晰标识\n\n一致使用应用自身名称与标识,不通过复制 Lime 标识暗示平台所有、已审核或支付担保。图形在列表和同意页尺寸下应可辨识,不依赖图标内部小字。\n\n当前应用编辑器支持共享预设图标及适用图片上传。预设背景与图形独立选择;上传图片保留原色,切换预设背景不应重染上传图。\n\n<a id=\"prepare\"></a>\n\n## 准备与预览图片\n\n1. 遵守当前上传器显示的类型、字节与尺寸限制,不根据界面推导通用上传 API。\n2. 保存前检查方形预览、透明度、裁剪与浅背景对比。\n3. 在两种语言与待发布版本中核对公开名称和图片。\n\n<a id=\"accessible\"></a>\n\n## 文字标签独立于装饰\n\n可见应用名旁的装饰图标不应导致名称重复朗读。独立交互图标需有本地化可访问名称;应用状态不能只靠图标颜色表示,应显示文字状态及适用恢复操作。\n\n[编辑公开应用资料](https://open.limeai.run/docs/application-profile?locale=zh-CN)\n\n[图标设计](https://open.limeai.run/docs/design-icons?locale=zh-CN)\n","revision":"sha256:ecf3aca3387dcd1157a3b673e380a7761fc6be64948e9bca22e9621183c74ec2"},{"id":"client-secret-rotation","group":"guide","category":"管理应用","title":"轮换客户端 Secret","summary":"更换后端凭据,避免秘密进入浏览器、样例与日志。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-secret-rotation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"清点受影响调用方"},{"id":"execute","title":"更换并验证"},{"id":"incident","title":"处理疑似泄露"}],"markdown":"# 轮换客户端 Secret\n\n更换后端凭据,避免秘密进入浏览器、样例与日志。\n\n<a id=\"prepare\"></a>\n\n## 清点受影响调用方\n\n只有机密与机器客户端可保护 Secret。公共桌面、浏览器与分发式命令行软件不能内嵌 Secret。轮换前记录客户端、环境、活动后端实例、部署负责人和恢复限制。\n\n使用登记客户端实际提供的凭据管理操作。除非当前操作明确支持,不承诺双 Secret 宽限期;轮换可能立即失效旧值,应据此协调依赖部署。\n\n<a id=\"execute\"></a>\n\n## 更换并验证\n\n1. 完成所需近期强认证,核对精确客户端与环境。\n2. 将返回 Secret 直接写入获准密钥存储,更新依赖后端实例,不复制到工单、浏览器包或仓库。\n3. 验证获授权令牌兑换,确认旧实例停止使用原值,并查看脱敏 invalid_client 诊断。\n\n<a id=\"incident\"></a>\n\n## 处理疑似泄露\n\n泄露按凭据事件处理:轮换或停用客户端,评估授权与资源影响,保留审计标识并按事件流程通知负责人。仅从可见文件移除不能消除仍有效的历史或日志凭据。\n\n[安全配置](https://open.limeai.run/docs/security-settings?locale=zh-CN)\n\n[事件响应](https://open.limeai.run/docs/incident-response?locale=zh-CN)\n","revision":"sha256:29cd72c7b1f3780d1d099d17dd77f6bf2c509c458fd5bd636a6d0767c3156b25"},{"id":"event-handler-design","group":"guide","category":"接收事件","title":"设计可靠事件消费者","summary":"验签后持久接收事件,再以可重试方式避免重复副作用。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/event-handler-design?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"ingress","title":"精简接收入口"},{"id":"order","title":"处理重复与延迟投递"},{"id":"recovery","title":"通过原事实恢复"}],"markdown":"# 设计可靠事件消费者\n\n验签后持久接收事件,再以可重试方式避免重复副作用。\n\n<a id=\"ingress\"></a>\n\n## 精简接收入口\n\n[验证与持久接收先于独立业务处理。](https://open.limeai.run/docs/event-handler-design?locale=zh-CN#ingress)\n\n1. 在有限大小内读取精确原始正文;解析业务数据前校验时间戳、签名与活动签名凭据。\n2. 按事件合同规定的稳定事件或投递标识保存 Inbox;持久接收后再确认。\n3. 异步处理 Inbox,并独立记录结果。不在网络请求内等待无关外部副作用。\n\n<a id=\"order\"></a>\n\n## 处理重复与延迟投递\n\n业务变更成功后仍可能收到重试,独立投递事件也可能乱序。应持久去重并校验版本或状态迁移。上下文不足时查询获授权来源记录,不假定投递顺序等于业务顺序。\n\n财务、通知与审计消费者需独立进度记录。一个消费者成功不代表另一个可跳过,收据失败也不撤销可信付款。保存来源标识以便核对。\n\n<a id=\"recovery\"></a>\n\n## 通过原事实恢复\n\n工作任务有限退避重试后保留可处理失败记录。重投或核对应重新处理同一来源事件,不能创建新付款、订单或权益请求。重放权限需受限并审计。\n\n[验证 Webhook 签名](https://open.limeai.run/docs/webhook-signatures?locale=zh-CN)\n\n[检查投递记录](https://open.limeai.run/docs/webhook-deliveries?locale=zh-CN)\n","revision":"sha256:d9fe00c55bf75947f6cfa56f0ec5450fe6deb080c540a18eb361e4b90f1128c5"},{"id":"launch-checklist","group":"guide","category":"上线与维护","title":"上线检查清单","summary":"公开使用前验证精确版本、受众与恢复行为。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/launch-checklist?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"身份与访问"},{"id":"release","title":"版本与公开资料"},{"id":"commerce","title":"商业与运营准备"}],"markdown":"# 上线检查清单\n\n公开使用前验证精确版本、受众与恢复行为。\n\n<a id=\"identity\"></a>\n\n## 身份与访问\n\n1. 验证正式 issuer、精确 HTTPS 回调、客户端启用、最小 Scope 及当前协作、测试、安装边界。\n2. 测试取消、旧 state、授权码到期、刷新轮换、成员撤权与近期认证恢复。\n3. 确认浏览器包、URL、公开日志与支持导出没有 Secret、令牌、密码或授权码。\n\n<a id=\"release\"></a>\n\n## 版本与公开资料\n\n1. 复核双语应用资料、图标、政策、支持入口与功能实际状态。\n2. 冻结目标配置,取得独立批准,再显式发布该冻结版本。\n3. 在真实目标部署与已发布安装路径分别验证有权和无权用户。\n\n<a id=\"commerce\"></a>\n\n## 商业与运营准备\n\n付费流程需核对受支持环境、卖方、币种、服务端报价、原幂等键、可信付款事实、权益与全额退款恢复。当前沙箱证据不能证明生产供应商、周期订阅或银行结算已上线。\n\n明确事件负责人,监控授权拒绝与事件投递失败,并保留安全恢复手册。构建通过只是其中一项,浏览器、权限与最终用户验收仍需独立完成。\n\n[审核要求](https://open.limeai.run/docs/review-guidelines?locale=zh-CN)\n\n[受支持结账](https://open.limeai.run/docs/checkout-orders?locale=zh-CN)\n\n[事件手册](https://open.limeai.run/docs/incident-response?locale=zh-CN)\n","revision":"sha256:5276249f4b406e168249c08e5c31283f18870d3b6a6f12c5cc59abaa5a2eebf9"},{"id":"review-guidelines","group":"guide","category":"上线与维护","title":"准备应用审核","summary":"提交可复现冻结版本,准确声明权限与功能。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/review-guidelines?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"materials","title":"准备审核依据"},{"id":"frozen","title":"提交目标快照"},{"id":"claims","title":"保持声明可验证"}],"markdown":"# 准备应用审核\n\n提交可复现冻结版本,准确声明权限与功能。\n\n<a id=\"materials\"></a>\n\n## 准备审核依据\n\n| 项目 | 提供内容 |\n| --- | --- |\n| 用途 | 用户任务、目标受众、受支持环境与功能可用状态。 |\n| 权限 | 各 Scope 与数据字段的必要理由及拒绝行为。 |\n| 复现 | 安全测试入口、合资格测试用户及完整成功、拒绝步骤。 |\n| 政策 | 隐私、条款、支持及适用商业退款信息。 |\n\n<a id=\"frozen\"></a>\n\n## 提交目标快照\n\n核对应用与配置 revision 后再创建版本。审核绑定冻结版本,后续草稿编辑不会修复已提交版本。须由独立合资格审核者评估快照,不能以自审通过代替。\n\n拒绝后读取具体理由,修正来源草稿,重做受影响验收并创建新版本。旧决定保留供追溯。批准本身不会发布应用或启用全部正式客户端。\n\n<a id=\"claims\"></a>\n\n## 保持声明可验证\n\n目录字段不能证明完整功能。企业联合身份、自有域名托管、专用 SDK 及未完成商业流程应按实际标注建设范围,不将飞书服务商认证或法律条款当作 Lime 政策。\n\n[版本生命周期](https://open.limeai.run/docs/releases?locale=zh-CN)\n\n[发布首个版本](https://open.limeai.run/docs/first-release-tutorial?locale=zh-CN)\n","revision":"sha256:e8f3f817168e90b6a6ff3966bd0fdc4d5e5f2ca0c2446e545b543cd2faeb1852"},{"id":"api-request-conventions","group":"guide","category":"开发规范","title":"请求与响应约定","summary":"按操作合同构造请求,并解析各 API 家族真实信封。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-request-conventions?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"request","title":"按声明位置传参"},{"id":"response","title":"解析正确响应家族"},{"id":"compatibility","title":"保留类型并容忍新增字段"}],"markdown":"# 请求与响应约定\n\n按操作合同构造请求,并解析各 API 家族真实信封。\n\n<a id=\"request\"></a>\n\n## 按声明位置传参\n\n使用 HTTPS 与 UTF-8。确定显式 API Origin、操作方法与路径,分别编码 Path、Query 字段。用户 Access Token 通过 Authorization: Bearer 传递,不将浏览器会话 Cookie 或 CSRF 值复制为公开 API 接入。\n\nJSON 管理方法使用声明 Content-Type 与 Schema。OAuth Token、设备、撤销与内省操作遵守各自表单和客户端认证规则,不能用 JSON 示例代替表单协议请求。\n\n<a id=\"response\"></a>\n\n## 解析正确响应家族\n\n| 家族 | 结构 |\n| --- | --- |\n| 管理成功 | {data: ...};游标列表使用 data.items、data.next_cursor。 |\n| 管理失败 | {error: {code, message}, request_id};按稳定 code 与 HTTP 状态分支。 |\n| 身份协议 | OAuth/OIDC 原生 JSON 与协议错误,没有管理 data 包装。 |\n\n<a id=\"compatibility\"></a>\n\n## 保留类型并容忍新增字段\n\nID 视作不透明字符串。金额保留整数最小货币单位字符串及明确币种,不用浮点、不推断币种、不跨币种相加。遵守必填、可空与枚举规则。容忍响应新增字段,对控制敏感动作的未知业务状态则安全失败。\n\n[游标分页](https://open.limeai.run/docs/api-pagination?locale=zh-CN)\n\n[稳定错误](https://open.limeai.run/docs/errors?locale=zh-CN)\n\n[管理访问合同](https://open.limeai.run/docs/management-api?locale=zh-CN)\n","revision":"sha256:26ee5ea8e312d5ea33ad472cbfe058b2c0f2b846339b1587d313557224e4ed98"},{"id":"api-pagination","group":"guide","category":"开发规范","title":"游标分页","summary":"读取列表结果,不假定页码或永久快照。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-pagination?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"iterate","title":"跟随返回游标"},{"id":"consistency","title":"处理变化中的集合"},{"id":"failure","title":"在合同有效期内恢复"}],"markdown":"# 游标分页\n\n读取列表结果,不假定页码或永久快照。\n\n<a id=\"iterate\"></a>\n\n## 跟随返回游标\n\n1. 读取操作支持过滤条件与 limit,首个请求不传游标。\n2. 消费 data.items,保持 data.next_cursor 不透明;下一请求原样传递,并保持过滤与排序相同。\n3. next_cursor 缺失或为空时结束,不根据条目 ID 构造游标,也不把页码转换成游标。\n\n<a id=\"consistency\"></a>\n\n## 处理变化中的集合\n\n除非操作明确承诺快照,否则翻页间记录可能变化。按稳定资源 ID 去重,完整性关键时采用有限核对。即使有总数,也不代表调用方有权获取未返回记录。\n\n切换空间、应用、环境、过滤或排序后应重置导航上下文,重新请求首页。界面加载和错误状态需关联原过滤条件,避免旧响应覆盖新结果。\n\n<a id=\"failure\"></a>\n\n## 在合同有效期内恢复\n\n游标可能过期或失效。应从首页重启并核对已处理 ID,不反复重试无效值。导出需限制页数与耗时,中途停止时明确结果不完整。\n\n[重试策略](https://open.limeai.run/docs/api-retry-policy?locale=zh-CN)\n\n[分页界面](https://open.limeai.run/docs/design-pagination?locale=zh-CN)\n","revision":"sha256:5da2b44021c0996fa6e69ccf76a9abc22810365619fc797fed3ae4d4a267e956"},{"id":"api-idempotency","group":"guide","category":"开发规范","title":"幂等与并发更新","summary":"恢复原命令并拒绝旧编辑,避免重复业务副作用。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-idempotency?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"keys","title":"每个目标命令创建一个键"},{"id":"revision","title":"使用当前 revision"},{"id":"unknown","title":"恢复未知结果"}],"markdown":"# 幂等与并发更新\n\n恢复原命令并拒绝旧编辑,避免重复业务副作用。\n\n<a id=\"keys\"></a>\n\n## 每个目标命令创建一个键\n\n对要求 Idempotency-Key 的操作,首次提交前生成键,并与精确意图、请求体和目标上下文一起保存。重试同一意图使用原键及等价载荷。仅在原结果明确后,新的意图才创建新键。\n\n幂等不替代权限,也不使任意 POST 自动安全。服务端仍检查当前主体、空间、应用、环境与操作约束。不同请求体复用原键是冲突,不能据此改订单。\n\n<a id=\"revision\"></a>\n\n## 使用当前 revision\n\n1. 读取当前资源,并将 revision 与展示值一起保留。\n2. 写入时在操作声明字段传预期 revision。\n3. 冲突后获取最新记录,展示实质变化,由用户决定是否提交修订命令。\n\n<a id=\"unknown\"></a>\n\n## 恢复未知结果\n\n网络失败可能发生在写入已提交之后。保留原键,按受支持恢复路径查询或重试原命令。不以新键请求替换超时的创建、付款或退款。重新认证后也须由用户检查并显式重提保留命令。\n\n[订单恢复](https://open.limeai.run/docs/checkout-orders?locale=zh-CN)\n\n[可重试条件](https://open.limeai.run/docs/api-retry-policy?locale=zh-CN)\n","revision":"sha256:fa36c60f7c6fb33518794d889e1fb10b9112b7410dc5d613d27ce97ec91939aa"},{"id":"api-retry-policy","group":"guide","category":"开发规范","title":"限流、超时与重试","summary":"仅对符合条件的失败有限退避重试,并保留写入身份。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-retry-policy?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"classify","title":"先分类再重试"},{"id":"budget","title":"共享重试预算"},{"id":"surface","title":"展示可恢复状态"}],"markdown":"# 限流、超时与重试\n\n仅对符合条件的失败有限退避重试,并保留写入身份。\n\n<a id=\"classify\"></a>\n\n## 先分类再重试\n\n| 情况 | 后续操作 |\n| --- | --- |\n| 参数、权限或 revision 错误 | 修正原因,不循环相同被拒请求。 |\n| 401 或授权到期 | 按受支持流程刷新一次或重新授权,保留原命令。 |\n| 429 | 返回 Retry-After 时遵守,否则采用有限随机退避。 |\n| 网络或适用 5xx | 重试安全读取;写入仅按对应幂等合同恢复。 |\n\n<a id=\"budget\"></a>\n\n## 共享重试预算\n\n设置单次截止时间、最大次数与总耗时预算。避免 SDK、代理和工作任务各层重试相乘形成请求风暴。串行刷新令牌、限制并发并响应取消。排队重试仍属于原主体与目标上下文。\n\n不复制其他平台数值配额、重置头或错误码。Lime 限制与 API 资格取决于部署操作合同,限流响应不授权通过切换客户端、账号或空间绕过。\n\n<a id=\"surface\"></a>\n\n## 展示可恢复状态\n\n重试预算耗尽后,展示稳定错误与请求标识,并提供对应重试或恢复操作。区分明确拒绝与写入结果未知;后台重试不能悄悄重复付款或敏感用户确认。\n\n[诊断失败](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n\n[保留命令身份](https://open.limeai.run/docs/api-idempotency?locale=zh-CN)\n","revision":"sha256:9834ee664426f8edd3dddf4ab3578fb8104295c185e0be6fc11cf4c65a73483e"},{"id":"api-debugging","group":"guide","category":"开发规范","title":"调试 API 接入","summary":"通过声明操作、脱敏上下文与稳定错误标识复现失败。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/api-debugging?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"collect","title":"采集最小诊断记录"},{"id":"isolate","title":"定位失败边界"},{"id":"tools","title":"准确使用预览与实调工具"}],"markdown":"# 调试 API 接入\n\n通过声明操作、脱敏上下文与稳定错误标识复现失败。\n\n<a id=\"collect\"></a>\n\n## 采集最小诊断记录\n\n| 记录 | 包含 |\n| --- | --- |\n| 目标 | 含时区时间、API Origin、操作 ID、方法与脱敏路径。 |\n| 上下文 | 环境、客户端类型、适用空间、应用 ID 与已授予 Scope 名称。 |\n| 结果 | HTTP 状态、稳定错误码、request_id 与写入结果是否明确。 |\n| 排除 | 密码、令牌、Secret、Cookie、code、verifier 与敏感个人载荷。 |\n\n<a id=\"isolate\"></a>\n\n## 定位失败边界\n\n1. 用 API 参考或 limecloud-cli schema 确认操作存在,比较必填位置、类型与实际请求。\n2. 核对 issuer、客户端、Audience 与实际已授予 Scope,再检查当前成员、角色、应用环境 ACL 与安装。\n3. 写入拒绝时先检查 revision、幂等与近期认证要求,再决定是否重发。\n\n<a id=\"tools\"></a>\n\n## 准确使用预览与实调工具\n\n参考页生成样例与字段解释;CLI dry-run 构造脱敏请求,不执行写入。两者都不是实际授权或付款测试。实际调用应仅针对预期获准环境,并记录真实响应。可用浏览器开发工具检查本应用,Lime 未提供飞书宿主远程调试器。\n\n[发现 CLI Schema](https://open.limeai.run/docs/cli-schema?locale=zh-CN)\n\n[预览 CLI 请求](https://open.limeai.run/docs/cli-dry-run?locale=zh-CN)\n\n[错误参考](https://open.limeai.run/docs/errors?locale=zh-CN)\n","revision":"sha256:b3516726332bb32edad6a17b054d67535596013619ad8faeb022003bdc3ba73d"},{"id":"data-protection","group":"guide","category":"开发规范","title":"保护应用数据","summary":"最小采集数据,保留用户、企业与环境边界。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/data-protection?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"minimize","title":"确定用途与保留期限"},{"id":"isolate","title":"在服务端落实隔离"},{"id":"storage","title":"保护存储与诊断数据"}],"markdown":"# 保护应用数据\n\n最小采集数据,保留用户、企业与环境边界。\n\n<a id=\"minimize\"></a>\n\n## 确定用途与保留期限\n\n对各身份声明或资源字段,记录功能用途、可访问人员与保留时间,只请求匹配 Scope,并设计拒绝或字段缺失状态。安装、商业购买与营销同意仍是独立决定。\n\n数据导出、删除和账号关联请求需验证归属并定义来源领域影响。不伪造通用删除端点,也不自动删除按适用政策必须保留的财务依据。\n\n<a id=\"isolate\"></a>\n\n## 在服务端落实隔离\n\n1. 从验证身份解析主体,并将各请求显式绑定获授权空间、应用和环境。\n2. 逐受保护资源检查当前权限,隐藏导航项不等于访问控制。\n3. 缓存与后台任务采用相同上下文隔离,切换账号或空间后废弃旧响应。\n\n<a id=\"storage\"></a>\n\n## 保护存储与诊断数据\n\n使用获准加密传输与密钥存储、受角色限制访问及有界日志。支持导出前脱敏凭据与个人载荷。浏览器可读令牌存储会增加脚本注入风险,架构允许时选择后端会话。\n\n[安全指南](https://open.limeai.run/docs/security?locale=zh-CN)\n\n[同意边界](https://open.limeai.run/docs/marketing-consent?locale=zh-CN)\n\n[处理泄露](https://open.limeai.run/docs/incident-response?locale=zh-CN)\n","revision":"sha256:a2726d2538408877cd50c9e972af89506f020413d862cf67b12d4fc6d246ad6e"},{"id":"application-localization","group":"guide","category":"开发前准备","title":"应用国际化配置","summary":"为登记语言发布一致资料,不翻译协议标识。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-localization?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"content","title":"准备登记语言资料"},{"id":"format","title":"格式化而不改变数值"},{"id":"publish","title":"按全部开放语言检查同一版本"}],"markdown":"# 应用国际化配置\n\n为登记语言发布一致资料,不翻译协议标识。\n\n<a id=\"content\"></a>\n\n## 准备登记语言资料\n\n通过共享语言登记确定开放语言。英文为源语言、默认及最终回退;当前开放英文与简体中文。应用名、摘要、帮助、权限解释与适用政策覆盖全部开放语言。能力状态、价格含义与恢复路径保持一致,译文简短不能省略实质限制。\n\nClient ID、Scope 名、操作 ID、JSON Key 与错误码保持精确协议形式,只本地化周边解释。URL 语言选择不能改变 issuer、应用归属或授权 Scope。\n\n<a id=\"format\"></a>\n\n## 格式化而不改变数值\n\n1. 使用共享语言登记与消息资源,不将语言选择器永久写死为两个选项。\n2. 日期格式化明确时区,金额按记录币种与最小单位精度显示。\n3. 检查各语言插值、复数、长名称、可访问标签与政策链接。\n\n<a id=\"publish\"></a>\n\n## 按全部开放语言检查同一版本\n\n通过配置支持字段保存语言资料,再以全部开放语言检查冻结版本与公开入口。冻结后翻译草稿不会更新已提交版本。新增语言须先完成登记、所属资源与验收,再对用户开放。\n\n[应用资料](https://open.limeai.run/docs/application-profile?locale=zh-CN)\n\n[设计多语言界面](https://open.limeai.run/docs/design-interface-localization?locale=zh-CN)\n","revision":"sha256:4954bc7011091eb9df51a39d10e79a91de13b02af758d662717e9cffd330acfd"},{"id":"integration-faq","group":"guide","category":"上线与维护","title":"接入常见问题","summary":"查找身份、权限、事件与发布问题的正确恢复路径。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/integration-faq?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"身份与令牌问题"},{"id":"permission","title":"权限与发布问题"},{"id":"events","title":"投递与工具问题"}],"markdown":"# 接入常见问题\n\n查找身份、权限、事件与发布问题的正确恢复路径。\n\n<a id=\"identity\"></a>\n\n## 身份与令牌问题\n\n回调无效时应核对精确登记 URI(包括回环端口)、客户端环境与事务 state。invalid_grant 应检查授权码有效期、一次性消费、PKCE 或刷新轮换状态,修改账号邮箱不能修复协议事务。\n\nAccess Token 用于获准资源,ID Token 仅用于建立验证后的客户端身份。机器令牌不能调用受控管理 API;Lime 不采用飞书 tenant_access_token、open_id 或 union_id 排障程序。\n\n<a id=\"permission\"></a>\n\n## 权限与发布问题\n\n已授予 Scope 不恢复被移除成员或应用 ACL。应检查专用客户端、实际 Scope、当前角色、环境与安装。版本审核通过仍需显式发布,发布不等于安装应用或购买商品。\n\n[权限边界](https://open.limeai.run/docs/members-permissions?locale=zh-CN)\n\n[版本审核](https://open.limeai.run/docs/review-guidelines?locale=zh-CN)\n\n<a id=\"events\"></a>\n\n## 投递与工具问题\n\n签名失败常见原因是解析后重序列化正文、使用错误环境密钥或时间戳不符,应在业务处理前验证原始字节。CLI Schema 和 dry-run 不证明实际 API 可用;npm 安装证明包可运行,部署、客户端启用及真实获准调用须另外验证。\n\n[采集诊断](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n\n[CLI 排障](https://open.limeai.run/docs/cli-troubleshooting?locale=zh-CN)\n","revision":"sha256:4891ea20de61eb842801b947de65a100867d00eb4c9c0bfe2922a8838dace482"},{"id":"platform-updates","group":"guide","category":"上线与维护","title":"兼容性与平台变更","summary":"评估合同变化,不将其他平台公告当作 Lime 历史。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/platform-updates?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"sources","title":"以已发布合同与变更记录为准"},{"id":"migrate","title":"验证迁移"},{"id":"cli","title":"固定自动化版本"}],"markdown":"# 兼容性与平台变更\n\n评估合同变化,不将其他平台公告当作 Lime 历史。\n\n<a id=\"sources\"></a>\n\n## 以已发布合同与变更记录为准\n\n升级前查看平台变更记录、当前 OpenAPI 与已安装 CLI 版本。飞书历史 API 配额、证书和事件变更不适用于 Lime。文档更新可以解释已有行为,不代表新增部署能力。\n\n字段移除、必填变化、枚举语义、issuer 或 Audience 变化与新增权限关卡均影响兼容性。应容忍可选响应字段增加,对控制写入的未知状态明确处理。\n\n<a id=\"migrate\"></a>\n\n## 验证迁移\n\n1. 比较接入实际使用操作与字段,包括生成客户端和已存载荷。\n2. 针对目标版本运行沙箱成功、拒绝、撤权与未知结果恢复。\n3. 发布时监控错误,并记录保留来源事实的回滚或向前恢复路径。\n\n<a id=\"cli\"></a>\n\n## 固定自动化版本\n\n自动化使用明确验证的 @limecloud/cli 版本,升级后复核 Schema。缓存 Schema 或本地生成客户端可能落后于目标部署。版本一致是必要条件,但不绕过当前用户角色、应用检查或正式启用。\n\n[平台变更记录](https://open.limeai.run/docs/changelog?locale=zh-CN)\n\n[CLI 分发](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n","revision":"sha256:d7069116cc759d7c28f15fcbbffb374d68553b8840e983a6fe44cdc514ac5681"},{"id":"incident-response","group":"guide","category":"上线与维护","title":"稳定性与事件响应","summary":"遏制泄露或故障,同时保留权威事实与可恢复命令。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/incident-response?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"detect","title":"确定范围与负责人"},{"id":"contain","title":"针对实际故障止损"},{"id":"restore","title":"恢复并验证"}],"markdown":"# 稳定性与事件响应\n\n遏制泄露或故障,同时保留权威事实与可恢复命令。\n\n<a id=\"detect\"></a>\n\n## 确定范围与负责人\n\n1. 记录受影响 issuer 或 API Origin、应用、环境、时间范围和用户现象,不包含凭据。\n2. 区分身份、资源权限、事件投递与商业事实,确定失败迁移的来源系统。\n3. 指定事件负责人,保留脱敏请求、命令、订单与事件标识用于关联。\n\n<a id=\"contain\"></a>\n\n## 针对实际故障止损\n\n凭据泄露时轮换或停用受影响客户端并评估授权;投递故障时暂停受影响消费者并保留持久 Inbox;付款未知时恢复原订单或付款命令,不伪造成功财务凭证,也不通过再次付款掩盖故障。\n\n适用时仅对受影响入口限流、拒绝或临时停用,不通过削弱授权、跳过签名或关闭 revision、幂等检查应急。\n\n<a id=\"restore\"></a>\n\n## 恢复并验证\n\n从来源记录核对,仅重放获授权原事件,并分别验证独立消费者。变更后检查有权和无权用户。记录事实、已确认影响、修复与可复现回归检查,事件报告不公开敏感载荷。\n\n[事件恢复设计](https://open.limeai.run/docs/event-handler-design?locale=zh-CN)\n\n[凭据轮换](https://open.limeai.run/docs/client-secret-rotation?locale=zh-CN)\n\n[恢复原命令](https://open.limeai.run/docs/api-idempotency?locale=zh-CN)\n","revision":"sha256:1b8f8d84f70f7b6d0b4576c784542805da2cf9a8a8245d1a81b079f7d32cfdc7"},{"id":"marketplace-overview","group":"guide","category":"上线与维护","title":"应用上架流程","summary":"从产品登记进入审核上架与客户显式安装。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/marketplace-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"fit","title":"确定分发方式"},{"id":"stages","title":"完成适用步骤"},{"id":"limits","title":"独立管理合作政策"}],"markdown":"# 应用上架流程\n\n从产品登记进入审核上架与客户显式安装。\n\n<a id=\"fit\"></a>\n\n## 确定分发方式\n\n应用上架展示可供发现的已发布接入,不托管软件、不证明商业支付已启用,也不授予全部访客访问权限。应根据应用来源及允许分发政策,选择公开发现或受控受众。\n\n[登记、审核、发布与客户安装相互独立。](https://open.limeai.run/docs/marketplace-overview?locale=zh-CN#fit)\n\n<a id=\"stages\"></a>\n\n## 完成适用步骤\n\n1. 确认负责发布方与归属空间,再登记应用及准确展示资料。\n2. 开发受支持身份、API、事件接入;适用时补齐已验证商业方案。\n3. 测试有权与无权用户,冻结版本、提交独立审核,再显式发布已批准版本。\n4. 以客户身份检查公开详情、安装决定与应用入口。\n\n<a id=\"limits\"></a>\n\n## 独立管理合作政策\n\nLime 不继承飞书的服务商年限、客户数、保证金或认证标准。合作应用遵守当前真实来源、分发政策与审核。专门合作方入驻流程未交付时应保留建设范围,不编造自助认证。\n\n[发布方准备](https://open.limeai.run/docs/partner-readiness?locale=zh-CN)\n\n[商业方案](https://open.limeai.run/docs/commercial-plan?locale=zh-CN)\n\n[上架验收](https://open.limeai.run/docs/test-marketplace-application?locale=zh-CN)\n","revision":"sha256:c08c83b7af3a99806af40bfdd0ad02589dd74ba20e809a96a57fc84113e8e5c2"},{"id":"partner-readiness","group":"guide","category":"开发前准备","title":"准备应用发布主体","summary":"向客户分发前明确归属、支持与政策责任。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/partner-readiness?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"owner","title":"使用正确归属空间"},{"id":"responsibility","title":"明确运营责任"},{"id":"status","title":"核对入驻状态"}],"markdown":"# 准备应用发布主体\n\n向客户分发前明确归属、支持与政策责任。\n\n<a id=\"owner\"></a>\n\n## 使用正确归属空间\n\n选择允许拥有目标应用类型的个人或企业空间,核对当前成员关系与登记、管理权限。公司邮箱域名本身不等于企业角色;不能先创建个人资产,再假定未来支持自动转移归属。\n\n<a id=\"responsibility\"></a>\n\n## 明确运营责任\n\n| 责任 | 准备内容 |\n| --- | --- |\n| 技术 | 持续维护接入、安全负责人、事件联系人与恢复手册。 |\n| 公开信息 | 准确产品身份、隐私条款、支持路径与功能状态。 |\n| 商业 | 适用卖方、买方范围、价格币种、退款与履约责任。 |\n\n<a id=\"status\"></a>\n\n## 核对入驻状态\n\n合作来源标签不代表已有专门资质认证、签约与保证金流程。资格决定只能使用已交付、获授权平台流程。本指南说明准备事项与建设范围,不宣称认证已可用,也不生成法律协议。\n\n[归属空间](https://open.limeai.run/docs/account-spaces?locale=zh-CN)\n\n[应用来源](https://open.limeai.run/docs/application-types?locale=zh-CN)\n\n[数据责任](https://open.limeai.run/docs/data-protection?locale=zh-CN)\n","revision":"sha256:92119b73e80a59b5a2e473486fa59d1a9b0249c145a519018fd5b5fe0013da8e"},{"id":"create-marketplace-application","group":"guide","category":"开发前准备","title":"创建待分发应用","summary":"在目标归属下登记产品,再准备公开版本。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/create-marketplace-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"register","title":"创建稳定应用记录"},{"id":"configure","title":"分别配置所需能力"},{"id":"check","title":"核对初始记录"}],"markdown":"# 创建待分发应用\n\n在目标归属下登记产品,再准备公开版本。\n\n<a id=\"register\"></a>\n\n## 创建稳定应用记录\n\n1. 进入目标空间应用列表,确认有权创建所需应用来源。\n2. 填写源语言名称和摘要,补齐支持语言译文,并选择可辨识图标。\n3. 提交一次并保存返回 App ID。结果未知时恢复原创建命令,不重复创建第二条记录。\n\n<a id=\"configure\"></a>\n\n## 分别配置所需能力\n\n仅添加产品需要的客户端、回调、Scope 与事件订阅。沙箱与正式设置分开。应用上架不创建托管环境或原生下载包,软件产物应通过自身受支持交付流程发布。\n\n<a id=\"check\"></a>\n\n## 核对初始记录\n\n后续写入前核对归属、应用来源、环境与当前 revision。按需添加协作者,并验证无关用户无法管理该记录。创建本身不会发布、批准合作方、安装应用或授予购买权益。\n\n[创建详情](https://open.limeai.run/docs/create-application?locale=zh-CN)\n\n[准备上架资料](https://open.limeai.run/docs/listing-content?locale=zh-CN)\n","revision":"sha256:43a1d76157529a30af3b6dbde6fd6add1ce30ebcf384d1de916688b8ed29b126"},{"id":"listing-content","group":"guide","category":"上线与维护","title":"填写应用上架资料","summary":"在客户安装前说明真实产品、前提与政策。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/listing-content?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"content","title":"说明客户任务"},{"id":"decision","title":"保留影响决定的信息"},{"id":"preview","title":"预览发布语言版本"}],"markdown":"# 填写应用上架资料\n\n在客户安装前说明真实产品、前提与政策。\n\n<a id=\"content\"></a>\n\n## 说明客户任务\n\n使用简洁产品名称,说明解决的任务、接入的平台能力、运行位置与新用户可完成结果。截图和示例应展示自身受支持产品,不包含虚构客户数据或未支持功能承诺。\n\n<a id=\"decision\"></a>\n\n## 保留影响决定的信息\n\n| 信息 | 说明 |\n| --- | --- |\n| 访问 | 账号联网要求、适用用户及安装、同意边界。 |\n| 数据 | 所需权限、用途、保留期限及隐私条款链接。 |\n| 商业 | 免费付费边界、受支持环境、币种、履约与退款限制。 |\n| 帮助 | 持续维护支持入口与脱敏诊断说明。 |\n\n<a id=\"preview\"></a>\n\n## 预览发布语言版本\n\n源资料与按登记语言标签索引的译文分开存储。以桌面和窄屏预览上架资料,检查链接与长文本,再冻结目标修订。提交后编辑草稿不会更新冻结审核或已有公开版本。\n\n[应用资料字段](https://open.limeai.run/docs/application-profile?locale=zh-CN)\n\n[国际化配置](https://open.limeai.run/docs/application-localization?locale=zh-CN)\n","revision":"sha256:e958d04a2037f932744e482ef5fa7af6ee35b1912134e0846f0f0bd4ed55bbba"},{"id":"commercial-plan","group":"guide","category":"上线与维护","title":"准备商业方案","summary":"选择受支持商品模型,明确支付与履约实际状态。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/commercial-plan?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"define","title":"定义商品与受益方"},{"id":"available","title":"使用已交付结账范围"},{"id":"accept","title":"验证付费与恢复路径"}],"markdown":"# 准备商业方案\n\n选择受支持商品模型,明确支付与履约实际状态。\n\n<a id=\"define\"></a>\n\n## 定义商品与受益方\n\n确定销售内容、卖方买方、个人或企业受益方,以及权益开放的功能。价格、币种、税费处理与退款条款需明确版本化报价。应用元数据中的付费标记不构成付款依据。\n\n商品 name、description 和 terms 使用英文 source 及按登记语言标签索引的 translations,营销活动 name 使用相同结构。新接入使用 source 与 translations;已弃用的 en、zh-CN 请求及响应镜像仅用于迁移兼容。以下片段展示商品资料字段,不是完整创建请求。\n\n```json\n{\n \"name\": {\n \"source\": \"Pro access\",\n \"translations\": {\n \"zh-CN\": \"专业版使用权\"\n }\n },\n \"description\": {\n \"source\": \"Single-user access\",\n \"translations\": {\n \"zh-CN\": \"单用户使用\"\n }\n },\n \"terms\": {\n \"source\": \"One-time purchase terms\",\n \"translations\": {\n \"zh-CN\": \"一次性购买条款\"\n }\n }\n}\n```\n\n<a id=\"available\"></a>\n\n## 使用已交付结账范围\n\n当前商业闭环为沙箱一次性结账:十五分钟服务端报价、同键下单、可信测试付款、权益及全额退款。生产供应商、周期续费、争议和设备席位许可证属独立建设范围,不能宣传为已启用计费模式。\n\n[可信付款事实驱动权益及独立财务、通知消费者。](https://open.limeai.run/docs/commercial-plan?locale=zh-CN#available)\n\n<a id=\"accept\"></a>\n\n## 验证付费与恢复路径\n\n1. 原订单提交前验证报价到期、精确币种与获授权买方。\n2. 以同一命令键测试重复提交与响应丢失,确认单一订单及可信付款结果。\n3. 验证权益、全额退款及独立收据、财务消费者,凭证不等于银行结算依据。\n\n[商品与定价](https://open.limeai.run/docs/products-pricing?locale=zh-CN)\n\n[结账与订单](https://open.limeai.run/docs/checkout-orders?locale=zh-CN)\n\n[权益状态](https://open.limeai.run/docs/entitlements-licenses?locale=zh-CN)\n","revision":"sha256:4c716a46f720e0ab45b13cce72f532e53e3364cdc3462170f8791eedb2fe05f7"},{"id":"build-marketplace-application","group":"guide","category":"开发应用","title":"开发待上架接入","summary":"使用受支持身份、事件与资源合同实现客户真实流程。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/build-marketplace-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"shape","title":"选择运行形态"},{"id":"implement","title":"实现完整任务"},{"id":"separate","title":"显式区分部署与发布"}],"markdown":"# 开发待上架接入\n\n使用受支持身份、事件与资源合同实现客户真实流程。\n\n<a id=\"shape\"></a>\n\n## 选择运行形态\n\n软件可运行于网页、原生产品或后端服务。Lime 负责登记与授权,不提供飞书小程序、聊天机器人或定制桌面宿主。应选择实际运行形态及对应公共、机密、机器客户端边界。\n\n<a id=\"implement\"></a>\n\n## 实现完整任务\n\n1. 实现包含完整事务验证的登录或设备同意及应用自身会话。\n2. 仅接入登记客户端获准调用资源操作,并检查当前空间、应用权限。\n3. 需要事件时实现原始正文验签、持久去重与来源事实恢复。\n4. 受支持付款与权益流程完整后再增加商业功能。\n\n<a id=\"separate\"></a>\n\n## 显式区分部署与发布\n\n应用代码和平台配置各按自身发布控制交付。平台版本冻结配置,不冻结任意外部二进制。提交审核前检查公开入口指向预期部署产品,不将内部预览 URL 当作正式承诺。\n\n[网页应用](https://open.limeai.run/docs/web-application?locale=zh-CN)\n\n[后端服务](https://open.limeai.run/docs/server-application?locale=zh-CN)\n\n[原生应用](https://open.limeai.run/docs/native-application?locale=zh-CN)\n","revision":"sha256:cc0267893f201c966e200f458d04ff8e0cf1b75bdc5c879ffc708cb58e12358a"},{"id":"test-marketplace-application","group":"guide","category":"上线与维护","title":"测试待上架应用","summary":"对同一配置验证有权、无权与恢复场景。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/test-marketplace-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"matrix","title":"建立角色与环境矩阵"},{"id":"state","title":"主动验证失败状态"},{"id":"evidence","title":"保留可复现依据"}],"markdown":"# 测试待上架应用\n\n对同一配置验证有权、无权与恢复场景。\n\n<a id=\"matrix\"></a>\n\n## 建立角色与环境矩阵\n\n| 场景 | 检查 |\n| --- | --- |\n| 合资格测试者 | 可进入沙箱,并在预期安装下完成目标任务。 |\n| 无关用户 | 无法读取配置、授权受限使用或管理其他应用数据。 |\n| 已移除成员 | 此前签发令牌不能恢复当前资源访问。 |\n| 未知结果 | 以原命令、原键恢复,不重复写入。 |\n\n<a id=\"state\"></a>\n\n## 主动验证失败状态\n\n1. 取消授权、令授权码到期、使用旧 revision 并拒绝权限申请。\n2. 重复投递事件并在提交后丢失写入响应,核对同一原结果。\n3. 检查源语言与译文、桌面与窄屏布局、键盘焦点与长内容。\n\n<a id=\"evidence\"></a>\n\n## 保留可复现依据\n\n记录应用配置 revision、部署、主体角色与脱敏请求 ID。不复制飞书测试企业自动授权或数量配额;Lime 沙箱资格仍遵守当前应用、测试成员与安装政策。dry-run 或包安装成功不等于实际验收。\n\n[配置测试人员](https://open.limeai.run/docs/test-users?locale=zh-CN)\n\n[上线检查](https://open.limeai.run/docs/launch-checklist?locale=zh-CN)\n","revision":"sha256:33477e7a5a3dbb11b93c3b720b1037c782ca14d6ecea97b1da53fcc7882036f5"},{"id":"publish-marketplace-application","group":"guide","category":"上线与维护","title":"发布已批准应用","summary":"发布精确已批准版本,并核对客户入口。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/publish-marketplace-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"核对待发布版本"},{"id":"publish","title":"显式发布"},{"id":"verify","title":"独立验证客户使用"}],"markdown":"# 发布已批准应用\n\n发布精确已批准版本,并核对客户入口。\n\n<a id=\"prepare\"></a>\n\n## 核对待发布版本\n\n读取版本 ID、冻结修订、批准决定、目标分发与客户端环境。草稿状态不证明已批准版本内容。若所需变更未包含,应创建并审核新版本,不假定发布自动取最新草稿。\n\n<a id=\"publish\"></a>\n\n## 显式发布\n\n1. 满足发布命令当前角色、近期认证、revision 与幂等要求。\n2. 对目标版本提交一次,响应丢失时恢复原命令。\n3. 核对已发布版本和客户应用详情,再继续分发。\n\n<a id=\"verify\"></a>\n\n## 独立验证客户使用\n\n测试发现、显式安装、可用受众、个人同意与实际应用入口。发布不会购买商业商品或启用任意客户端。正式能力尚未 provision 时应说明限制,并在验证前保持对应流程不可用。\n\n[分发规则](https://open.limeai.run/docs/distribution?locale=zh-CN)\n\n[安装生命周期](https://open.limeai.run/docs/installations?locale=zh-CN)\n","revision":"sha256:845b502b988f65bd882a860782ed24f8c6168e0b640c2f94b47916f299e0536f"},{"id":"test-users","group":"guide","category":"管理应用","title":"测试人员与空间","summary":"显式授予沙箱资格,不导入生产数据或套用飞书测试租户规则。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/test-users?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"准备独立测试身份"},{"id":"grant","title":"按需授予与移除权限"},{"id":"data","title":"隔离测试数据"}],"markdown":"# 测试人员与空间\n\n显式授予沙箱资格,不导入生产数据或套用飞书测试租户规则。\n\n<a id=\"prepare\"></a>\n\n## 准备独立测试身份\n\n使用指定沙箱应用、客户端与获准测试用户,记录各用例所需空间、应用角色、测试资格及安装。企业成员不自动成为应用协作者或测试者,协作者也不自动成为客户受益方。\n\n<a id=\"grant\"></a>\n\n## 按需授予与移除权限\n\n1. 合资格维护者使用应用实际访问控制添加最小测试成员关系。\n2. 针对相同沙箱配置验证有权用户、无关用户和已移除用户。\n3. 验收后移除临时访问,并确认旧令牌无法绕过撤权。\n\n<a id=\"data\"></a>\n\n## 隔离测试数据\n\n使用合成个人与财务数据,不将生产 Secret、客户联系方式或订单事实复制为测试夹具。Lime 不承诺飞书式测试企业创建、自动授权或每企业人员配额,应以当前应用环境政策为准。\n\n[环境隔离](https://open.limeai.run/docs/environments?locale=zh-CN)\n\n[应用协作](https://open.limeai.run/docs/collaboration?locale=zh-CN)\n","revision":"sha256:5af82004245b344cb7e3e0daca3920dc6c900d0d84dccbda7f3277de1406ebc8"},{"id":"application-availability","group":"guide","category":"管理应用","title":"应用可用范围","summary":"区分公开发现、安装资格与实际可使用应用的人群。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-availability?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"layers","title":"逐层检查适用范围"},{"id":"change","title":"修改目标边界"},{"id":"verify","title":"验证移除与切换"}],"markdown":"# 应用可用范围\n\n区分公开发现、安装资格与实际可使用应用的人群。\n\n<a id=\"layers\"></a>\n\n## 逐层检查适用范围\n\n| 层级 | 决定 |\n| --- | --- |\n| 展示 | 谁可发现已发布应用的公开资料。 |\n| 安装 | 哪些空间可安装版本并批准请求 Scope。 |\n| 使用 | 哪些当前用户符合安装范围与个人同意。 |\n| 管理 | 谁可凭独立职责配置或运营应用。 |\n\n<a id=\"change\"></a>\n\n## 修改目标边界\n\n读取活动安装、配置与 revision,明确目标用户或空间集合,并使用对应受支持操作。扩大公开展示不能悄悄扩大客户安装 Scope,也不能让全体员工自动成为应用用户。\n\n<a id=\"verify\"></a>\n\n## 验证移除与切换\n\n范围或成员变化后在后端验证当前访问,并在切换空间、账号后清理上下文数据。已有身份声明不恢复被撤销资源访问,付费权益判断与安装受众分开。\n\n[安装规则](https://open.limeai.run/docs/installations?locale=zh-CN)\n\n[成员与职责](https://open.limeai.run/docs/members-permissions?locale=zh-CN)\n","revision":"sha256:6e19efcad75bf2da3b70f4cb4db910fcc77959ee4b8068e03b304d3068c03bf6"},{"id":"share-application","group":"guide","category":"上线与维护","title":"安全分享应用","summary":"分享可发现产品入口,不将链接视为同意或权限。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/share-application?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"link","title":"分享稳定公开入口"},{"id":"consent","title":"由接收方决定"},{"id":"boundaries","title":"遵守受支持深链合同"}],"markdown":"# 安全分享应用\n\n分享可发现产品入口,不将链接视为同意或权限。\n\n<a id=\"link\"></a>\n\n## 分享稳定公开入口\n\n分享已发布应用公开详情或受支持安装入口,并说明应用及账号、企业、购买要求。不将内部配置地址作为客户入口,也不在链接放令牌、授权码、Secret 或私人测试标识。\n\n<a id=\"consent\"></a>\n\n## 由接收方决定\n\n1. 进入后先显示应用、目标空间与请求权限,再执行写入。\n2. 需要登录时,登录后回到原安全入口,再由用户检查动作。\n3. 允许取消,并在接收方无资格时避免泄露私有应用配置。\n\n<a id=\"boundaries\"></a>\n\n## 遵守受支持深链合同\n\n匿名安装链接不能自动安装或购买。验证本地返回路由并拒绝开放重定向。飞书 AppLink、聊天分享、桌面菜单和应用角标属于宿主专有能力,Lime 登记不提供这些能力。\n\n[分发](https://open.limeai.run/docs/distribution?locale=zh-CN)\n\n[安全返回目的地](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n","revision":"sha256:ead6ae9f40ce34032acf25002deb27b44880f41deac8a9d764fb2f9645af566c"},{"id":"application-logs","group":"guide","category":"上线与维护","title":"应用日志与诊断","summary":"通过获授权脱敏记录关联 API、事件与配置结果。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-logs?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"sources","title":"选择结果所属记录"},{"id":"query","title":"缩小排查范围"},{"id":"privacy","title":"以已交付日志入口为准"}],"markdown":"# 应用日志与诊断\n\n通过获授权脱敏记录关联 API、事件与配置结果。\n\n<a id=\"sources\"></a>\n\n## 选择结果所属记录\n\n| 问题 | 记录 |\n| --- | --- |\n| API 请求为何被拒? | 资源 API 的 HTTP 状态、稳定错误码与 request_id。 |\n| 事件是否接收? | 投递尝试及接收端持久 Inbox、处理结果。 |\n| 审核了哪个配置? | 冻结版本 ID、revision 与独立审核、审计记录。 |\n| 订单是否付款? | 原订单与可信付款事实,不只看 Toast 或收据。 |\n\n<a id=\"query\"></a>\n\n## 缩小排查范围\n\n1. 记录含时区精确时间范围、环境及获授权应用空间上下文。\n2. 跟随返回请求、事件与来源标识,不通过用户邮箱或原始令牌搜索。\n3. 比较来源与消费者进度,保留原失败命令用于恢复。\n\n<a id=\"privacy\"></a>\n\n## 以已交付日志入口为准\n\n使用当前角色实际可用的诊断与审计操作。本指南不代表已有完整飞书式服务端客户端日志台、自动客服转发或固定保留周期。支持导出不得包含密码、访问刷新令牌、Secret、授权码或个人请求正文。\n\n[API 诊断](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n\n[投递诊断](https://open.limeai.run/docs/webhook-deliveries?locale=zh-CN)\n\n[审计与通知](https://open.limeai.run/docs/audit-notifications?locale=zh-CN)\n","revision":"sha256:afbd794780fbc73831eae0c699f8b718425ccceaee1b6d523b5bdf90f7d6d309"},{"id":"application-analytics","group":"guide","category":"上线与维护","title":"应用运营指标","summary":"定义有用指标,区分发现、安装、同意与购买。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-analytics?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"metrics","title":"定义指标与来源"},{"id":"collect","title":"仅采集必要依据"},{"id":"status","title":"明确看板边界"}],"markdown":"# 应用运营指标\n\n定义有用指标,区分发现、安装、同意与购买。\n\n<a id=\"metrics\"></a>\n\n## 定义指标与来源\n\n| 指标 | 必要定义 |\n| --- | --- |\n| 发现 | 公开详情访问、时间范围与去重方式,不等同安装人数。 |\n| 安装 | 按归属空间与版本统计活动安装,与个人同意分开。 |\n| 活跃 | 获授权且有意义产品任务、明确主体及时区窗口。 |\n| 收入 | 按币种来源订单、付款与退款,不根据权益数推算。 |\n\n<a id=\"collect\"></a>\n\n## 仅采集必要依据\n\n优先使用记录保留及权限的聚合运营依据,不为统计活跃用户申请宽泛身份 Scope。个人企业空间、沙箱正式环境与不同币种不能悄悄合并。\n\n<a id=\"status\"></a>\n\n## 明确看板边界\n\n完整应用分析看板与自动前端遥测属于建设范围,除非具体部署入口另有说明。已有配置、订单和投递记录可支持有限诊断,不承诺飞书式每日活跃看板或历史数据覆盖。\n\n[清晰展示指标](https://open.limeai.run/docs/design-visualization?locale=zh-CN)\n\n[保护遥测数据](https://open.limeai.run/docs/data-protection?locale=zh-CN)\n","revision":"sha256:ae3215eb171d86c3d8f5bc1d6a987fe4c725e6217e4b1777943f972ba7acd4e0"},{"id":"user-feedback","group":"guide","category":"上线与维护","title":"用户反馈与支持","summary":"提供有效支持入口,收集足够脱敏上下文解决任务。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/user-feedback?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"entry","title":"使支持可发现"},{"id":"form","title":"收集可处理信息"},{"id":"status","title":"区分支持与平台自动化"}],"markdown":"# 用户反馈与支持\n\n提供有效支持入口,收集足够脱敏上下文解决任务。\n\n<a id=\"entry\"></a>\n\n## 使支持可发现\n\n维护应用关联的公开支持信息,在任务受阻处提供清晰路径,保留相关应用环境且不向无关渠道发送私有配置。用户应可报告取消、权限拒绝或未知写入结果。\n\n<a id=\"form\"></a>\n\n## 收集可处理信息\n\n1. 收集用户目标任务、实际结果、含时区时间及脱敏请求标识。\n2. 允许可选脱敏截图,在采集处说明避免包含凭据或无关个人数据。\n3. 说明处理方、后续联系渠道与适用保留政策,不悄悄加入营销订阅。\n\n<a id=\"status\"></a>\n\n## 区分支持与平台自动化\n\n登记应用不代表已有集中反馈 Inbox、宿主客户端自动采集或一键日志转移。在对应流程交付前使用持续维护的应用支持渠道,支持人员不得索取密码、令牌、Secret 或设备码复现问题。\n\n[采集诊断](https://open.limeai.run/docs/application-logs?locale=zh-CN)\n\n[升级事件](https://open.limeai.run/docs/incident-response?locale=zh-CN)\n","revision":"sha256:b243fd6f6fef47d310ea6081d03c47973f18035531a332dacf034dc1ced9a705"},{"id":"development-quality","group":"guide","category":"上线与维护","title":"接入开发质量","summary":"在成功路径之外衡量可用性与安全恢复。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/development-quality?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"contract","title":"验证合同边界"},{"id":"quality","title":"检查用户可见质量"},{"id":"monitor","title":"监控实际部署能力"}],"markdown":"# 接入开发质量\n\n在成功路径之外衡量可用性与安全恢复。\n\n<a id=\"contract\"></a>\n\n## 验证合同边界\n\n使用当前 Schema 和必要运行上下文,包括权限、revision 与幂等。测试有权、无关及已移除用户,检查新令牌不能绕过应用环境限制,访问其他应用标识的请求应被拒。\n\n<a id=\"quality\"></a>\n\n## 检查用户可见质量\n\n1. 在支持语言、桌面窄屏布局及纯键盘操作下运行真实流程。\n2. 检查加载、空态、拒绝、到期与未知结果状态,保证焦点和原任务可恢复。\n3. 在有限截止时间内验证超时、重复、事件重试与外部依赖故障。\n\n<a id=\"monitor\"></a>\n\n## 监控实际部署能力\n\n使用请求、投递错误与来源领域恢复发现回归。自动白屏指标、宿主 SDK 失败看板与完整质量趋势报告,未明确交付前均属建设范围。测试说明应列明部署、场景覆盖与未解限制,不能从静态检查推导像素级或端到端完成。\n\n[上线验收](https://open.limeai.run/docs/launch-checklist?locale=zh-CN)\n\n[可靠性](https://open.limeai.run/docs/api-retry-policy?locale=zh-CN)\n","revision":"sha256:6c354733c44d3201c367d7f0a7751c27a374615a4b8b32d27c8061ea6de19776"},{"id":"developer-tools-overview","group":"guide","category":"开发规范","title":"开发者工具","summary":"按任务选择 API 参考、已发布 CLI 与常规运行时工具。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/developer-tools-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose","title":"按用途选择工具"},{"id":"install","title":"使用已发布 CLI"},{"id":"limits","title":"避免依赖未支持宿主工具"}],"markdown":"# 开发者工具\n\n按任务选择 API 参考、已发布 CLI 与常规运行时工具。\n\n<a id=\"choose\"></a>\n\n## 按用途选择工具\n\n| 工具 | 用途 |\n| --- | --- |\n| API 参考 | 查看当前操作、字段、示例与权限要求。 |\n| limecloud-cli | 安装 @limecloud/cli,发现 Schema、预览请求并执行获授权用户操作。 |\n| 浏览器开发工具 | 检查自身页面、网络、布局与可访问性,不依赖专有宿主模拟器。 |\n| 维护中的 OAuth 库 | 使用固定 issuer 与完整校验开发标准外部应用。 |\n\n<a id=\"install\"></a>\n\n## 使用已发布 CLI\n\n该包已发布,命令为 limecloud-cli 与 limecloud。自动化固定已验证版本。CLI 安装与离线发现,分别独立于目标 API 部署、专用客户端 provision、用户授权和真实权限验证。\n\n```sh\nnpm install --global @limecloud/cli@0.3.0\nlimecloud-cli --version\nlimecloud-cli schema\n```\n\n<a id=\"limits\"></a>\n\n## 避免依赖未支持宿主工具\n\nLime 不提供飞书 IDE、H5 模拟器、小程序编译器、宿主远程调试器或自动原生出包。项目自身 npm 工具与本地热更新仍按其构建流程使用,不构成新增平台运行合同。\n\n[CLI 文档](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n[API 调试](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n","revision":"sha256:1d9d090e59ed3935d035538bbbf0acae11a0ac72edccbdb18d37810e9244588a"},{"id":"design-overview","group":"guide","category":"应用设计规范","title":"应用设计概述","summary":"围绕清晰用户任务构建一致 Lime 体验。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"audience","title":"适用人群"},{"id":"design-workflow","title":"从任务到实现"},{"id":"design-feedback","title":"用户研究与可执行反馈"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 应用设计概述\n\n围绕清晰用户任务构建一致 Lime 体验。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n先明确主体、任务、预期结果及拒绝恢复状态。身份、安装、购买与营销决定保持独立。沿用 Lime 视觉基线,同时按各门户用户任务组织内容。\n\n当前共享包导出 Button、Card、Notice、Empty、Loading、Modal 与 AppIcon。其他组件指南说明设计及可访问性要求,不代表所有命名组件已有可发布 @lime/ui 实现。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-overview](https://open.limeai.run/docs/design-overview?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 共享样式 | 先加载 @lime/ui/styles.css 与语义变量,再加载限定范围产品样式。 |\n| 层次 | 直接命名任务,删除装饰标签、重复标题和不影响决定的解释。 |\n| 状态 | 区分已交付行为与建设范围,禁用模拟动作不算已完成流程。 |\n\n<a id=\"audience\"></a>\n\n## 适用人群\n\n设计师与前端工程师可用本指南规划交互、视觉层次及实现验收。组件指南规定目标体验,即使该组件当前使用原生控件实现,而非已导出的共享组件。\n\n<a id=\"design-workflow\"></a>\n\n## 从任务到实现\n\n从用户目标与真实约束开始,选择组件模式,再一起检查内容、状态、响应式及可访问性。公开发现、开发、运营与管理按各自用户组织,同时共享同一设计语言。\n\n<a id=\"design-feedback\"></a>\n\n## 用户研究与可执行反馈\n\n反馈说明用户任务、精确组件状态、预期结果和实际困难,附视口、登记语言及脱敏复现。控件不可访问或缺少恢复时,说明失败任务,不只表达偏好的视觉风格。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n共享实现缺失时使用原生语义控件。新增共享组件需同时提供样式、键盘行为与可访问状态,不为复刻单页引入第二套 UI 库。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 以源语言与登记译文,在 1440×1000 和 390×844 检查同一任务。\n2. 检查键盘焦点、长内容、拒绝访问、未知结果及微应用切换。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:3fe12ef8e6ac8d9a5fc55c28861a2a41197df3b8fecc6c31016b9ce7a69ed779"},{"id":"design-layout","group":"guide","category":"应用设计规范","title":"布局","summary":"采用稳定导航、任务分组与可预测内容间距。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-layout?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"density","title":"信息密度"},{"id":"horizontal-alignment","title":"水平对齐"},{"id":"vertical-alignment","title":"垂直与光学对齐"},{"id":"form-alignment","title":"表单标签与字段对齐"},{"id":"numeric-alignment","title":"数值对齐"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 布局\n\n采用稳定导航、任务分组与可预测内容间距。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n按任务选择页面结构:公开发现、应用管理、聚焦表单或长篇参考。影响全部操作的应用空间上下文应可见,不将公开文档硬塞进工作台网格。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-layout](https://open.limeai.run/docs/design-layout?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 桌面框架 | 适用框架采用共享 64px 顶栏、270px 侧栏及 24px 页面内边距。 |\n| 内容 | 限制阅读宽度,对齐标签并分组相关操作;先用间距,再考虑增加容器。 |\n| 窄屏 | 使用 16px 窄屏内边距变量,将导航放入有名称且可关闭面板。 |\n\n<a id=\"density\"></a>\n\n## 信息密度\n\n用户对比大量应用、订单或账务记录并重复操作时使用紧凑密度,同时保留可读标签和行操作。警告、日历选择与重要确认需要更宽松的空间,保证热区与含义清晰。\n\n调整密度前,在相同视口比较同一组数据。删除必要信息或将文字缩至共享最小字号以下,不算提高密度。\n\n[design-detail-layout-density](https://open.limeai.run/docs/design-layout?locale=zh-CN#density)\n\n![说明信息密度的中性列表骨架。](https://open.limeai.run/docs/assets/design/source-0028-001.png)\n\n![说明信息密度的中性列表骨架。](https://open.limeai.run/docs/assets/design/source-0028-003.png)\n\n![高密度列表的间距变化动画。](https://open.limeai.run/docs/assets/design/source-0028-005.gif)\n\n![复选框与各列对齐的高密度列表布局。](https://open.limeai.run/docs/assets/design/source-0028-006.png)\n\n![列表间距与选中行背景对比。](https://open.limeai.run/docs/assets/design/source-0028-008.png)\n\n<a id=\"horizontal-alignment\"></a>\n\n## 水平对齐\n\n左对齐为文本提供稳定起点,右对齐便于比较数值,居中适合短且独立的值。弹性字段可随容器延展,固定控件保持有意设定的宽度。\n\n[design-detail-layout-alignment](https://open.limeai.run/docs/design-layout?locale=zh-CN#horizontal-alignment)\n\n<a id=\"vertical-alignment\"></a>\n\n## 垂直与光学对齐\n\n多行内容优先顶部对齐,短控件行可垂直居中;仅在关系需要时采用底部对齐或延展。小图标对齐可见文字,不能假定外接框相等就有相同视觉重心。\n\n<a id=\"form-alignment\"></a>\n\n## 表单标签与字段对齐\n\n窄表单及长译文标签放在字段上方;短横向筛选可使用右对齐标签搭配输入框。同组保持一致标签边缘,在标签或输入区域拥挤前改为上下布局。\n\n<a id=\"numeric-alignment\"></a>\n\n## 数值对齐\n\n可比较金额和百分比右对齐,使用等宽数字。同列显示精度须符合记录单位及币种精度;保留精确值,不为表格对齐而修改业务数值。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n页面动作靠近对象,避免嵌套滚动隐藏主提交。固定顶栏、侧栏不能遮挡锚点、焦点或内容;微应用布局规则限定在自身根节点。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 在 390px 宽度下检查长标题、打开侧栏及软键盘。\n2. 确认仅预期表格、代码区域横向滚动,整页不横向溢出。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:bcb5a1a031b2e37974a2e3cd8fdfcd4611abe209716561441edeea512e6d5630"},{"id":"design-motion","group":"guide","category":"应用设计规范","title":"动效","summary":"仅以动效说明状态或空间变化。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-motion?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"motion-effects","title":"效果与状态过渡"},{"id":"motion-timing","title":"时长与曲线"},{"id":"motion-handoff","title":"动效交付与中断"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 动效\n\n仅以动效说明状态或空间变化。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n过渡可帮助理解菜单打开、面板变化或任务进入处理中。装饰入场、跳动徽标与反复吸睛动效会增加干扰,不属于 Lime 基线。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-motion](https://open.limeai.run/docs/design-motion?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 时长 | 必要过渡使用共享规则的 250ms ease-out,无意义过渡应移除。 |\n| 减少动态效果 | 响应 prefers-reduced-motion,保留可理解静态状态。 |\n| 进度 | 旋转加载只说明处理中,不代表已测百分比或成功。 |\n\n<a id=\"motion-effects\"></a>\n\n## 效果与状态过渡\n\n位移解释空间变化,缩放表达强调,透明度表达出现与消失,颜色可辅助说明状态变化。仅选择有助理解动作的属性,不以文字替换、字重或业务结果动画让含义不稳定。\n\n![色块位移的动效示例。](https://open.limeai.run/docs/assets/design/source-0029-001.gif)\n\n![色块缩放的动效示例。](https://open.limeai.run/docs/assets/design/source-0029-002.gif)\n\n![色块旋转的动效示例。](https://open.limeai.run/docs/assets/design/source-0029-003.gif)\n\n![色块透明度变化的动效示例。](https://open.limeai.run/docs/assets/design/source-0029-004.gif)\n\n![色块颜色变化的动效示例。](https://open.limeai.run/docs/assets/design/source-0029-005.gif)\n\n<a id=\"motion-timing\"></a>\n\n## 时长与曲线\n\n动效应及时响应并可预测结束。Lime 必要过渡采用共享 250ms ease-out 基线;参考中的加速、减速及过冲分类用于解释感知,不新增另一套产品动效常量。普通管理动作避免弹跳效果。\n\n<a id=\"motion-handoff\"></a>\n\n## 动效交付与中断\n\n交付标明触发条件、对象、变化属性、起止状态、时长及减少动态效果方案。测试反向、快速重复输入与取消。完成播报依据已确认任务状态,动画停止后仍保留静态错误或未知结果。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n提交期间不移动焦点控件,不在服务端确认前演示成功。失败或未知写入在动效结束后仍需持久恢复状态;使用语义播报,不反复朗读动画帧。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 开启减少动态效果后,验证菜单、加载与校验仍可理解。\n2. 测试快速开关与取消请求,不遗留遮罩或焦点。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:e1904add036f13eda3fde6af0049817ca350efb40bc3c4b05d5dfd945e4e75fd"},{"id":"design-color","group":"guide","category":"应用设计规范","title":"色彩","summary":"通过共享语义色表达层次与状态。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-color?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"brand-and-support","title":"品牌色与辅助色"},{"id":"functional-and-neutral","title":"功能色与中性色"},{"id":"alpha-composition","title":"透明度与合成背景"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 色彩\n\n通过共享语义色表达层次与状态。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n产品使用共享 Radix 派生 Lime 色阶,按含义选择变量,不从截图任意取悦目颜色。文档参考色锚点仅限文档主题,不能外溢到管理页面。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-color](https://open.limeai.run/docs/design-color?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 操作 | 主要操作和悬停使用 Accent 9、10,链接与选中面使用相应语义变量。 |\n| 内容 | Neutral 12、11 表达主次文字;中性边界轻量但不能使控件不可见。 |\n| 状态 | 成功、警告与错误语义搭配文字或图形,不仅靠颜色。 |\n\n<a id=\"brand-and-support\"></a>\n\n## 品牌色与辅助色\n\n主要动作、选中和链接使用共享强调色,各语义变量保持自身职责。辅助分类色区分已知分组或插画;渐变仅用于已采纳的引导或文档表面,不形成另一套状态或按钮体系。\n\n<a id=\"functional-and-neutral\"></a>\n\n## 功能色与中性色\n\n成功、警告与错误颜色保持一致,状态同时有文字或图标。中性文字、背景和边界变量建立层次,同时保证可读性。占位符和禁用内容用途不同,均不能替代真实值或权限不足说明。\n\n![带十六进制色值的中性灰阶。](https://open.limeai.run/docs/assets/design/source-0030-006.png)\n\n<a id=\"alpha-composition\"></a>\n\n## 透明度与合成背景\n\n在最终合成背景上检查对比度,包括遮罩、悬停层及透明图标。使用共享遮罩和表面变量,不将透明度百分比任意套到颜色上。覆盖内容的不透明按钮或面板在父背景变化时仍应不透明。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n按实际合成背景检查悬停、禁用与焦点对比。当前产品支持浅色主题,不能因个别变量可变就宣称完整深色主题可用。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查各使用背景上的文字、链接、焦点边界与状态标签。\n2. 检查灰度与色觉模拟后状态含义仍可辨。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:59bad860af489819ee6362f9edb630ca56d2d7b2b5a8ab3496e1b92d66100a63"},{"id":"design-icons","group":"guide","category":"应用设计规范","title":"图标","summary":"使用可识别符号,为交互图标提供可访问名称。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-icons?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"principles","title":"图标语义与一致性"},{"id":"hierarchy","title":"导航、操作与语义层级"},{"id":"geometry","title":"栅格、活动区与关键形状"},{"id":"optical-balance","title":"像素边缘与视觉体量"},{"id":"stroke-and-corners","title":"线条、端点与箭头"},{"id":"overlap-and-color","title":"叠加、图层清理与颜色"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 图标\n\n使用可识别符号,为交互图标提供可访问名称。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n图标辅助动作或对象,不应创建用户必须另学的词汇。应用预设使用既有图形体系;同组保持线重、光学对齐与语义一致。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-icons](https://open.limeai.run/docs/design-icons?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 搭配文字 | 对辅助技术隐藏重复装饰图形。 |\n| 纯图标动作 | 提供本地化可访问名称与足够热区,文字提示仅作补充。 |\n| 状态 | 状态符号搭配文字,不用陌生图形表示破坏性命令。 |\n\n<a id=\"principles\"></a>\n\n## 图标语义与一致性\n\n先选择与动作相符的常见符号,再删除无助识别的细节。星标收藏与爱心回应可能是不同动作。同组几何、圆角和线重保持一致,情感表达不能遮蔽命令含义。\n\n![实心星形图标。](https://open.limeai.run/docs/assets/design/source-0031-001.png)\n\n![实心心形图标。](https://open.limeai.run/docs/assets/design/source-0031-003.png)\n\n![简化的相机图标。](https://open.limeai.run/docs/assets/design/source-0031-005.png)\n\n![含更多细节的相机图标。](https://open.limeai.run/docs/assets/design/source-0031-007.png)\n\n![简化的点赞图标。](https://open.limeai.run/docs/assets/design/source-0031-009.png)\n\n![含更多细节的点赞图标。](https://open.limeai.run/docs/assets/design/source-0031-011.png)\n\n![发送图标。](https://open.limeai.run/docs/assets/design/source-0031-013.png)\n\n![向上箭头图标。](https://open.limeai.run/docs/assets/design/source-0031-015.png)\n\n<a id=\"hierarchy\"></a>\n\n## 导航、操作与语义层级\n\n导航图标标识去向,工具栏图标触发局部动作,状态及字段图标解释内容。各层使用一致图形族,陌生导航保留文字。字段装饰图标不会因为工具栏图标可交互就自动获得点击行为。\n\n[design-detail-icons-hierarchy](https://open.limeai.run/docs/design-icons?locale=zh-CN#hierarchy)\n\n<a id=\"geometry\"></a>\n\n## 栅格、活动区与关键形状\n\n新增系统图形以 24×24 绘制网格作为比较基准,活动图形周围留安全区。圆形与方形可能需要不同占用宽度,才能显得同样大。按目标显示尺寸输出,同时保持原 viewBox 和比例。\n\n优先复用共享或 Lucide 图标,再考虑绘制变体。图解中的构造尺寸用于解释光学平衡,不代表要改写全部既有图形或共享组件合同。\n\n[design-detail-icons-geometry](https://open.limeai.run/docs/design-icons?locale=zh-CN#geometry)\n\n![实心齿轮图标。](https://open.limeai.run/docs/assets/design/source-0031-029.png)\n\n![描边齿轮图标。](https://open.limeai.run/docs/assets/design/source-0031-030.png)\n\n![叠加形状图标。](https://open.limeai.run/docs/assets/design/source-0031-031.png)\n\n![带点线外框的加号图标。](https://open.limeai.run/docs/assets/design/source-0031-032.png)\n\n![实心与点线叠加形状。](https://open.limeai.run/docs/assets/design/source-0031-033.png)\n\n<a id=\"optical-balance\"></a>\n\n## 像素边缘与视觉体量\n\n按实际输出尺寸检查图形;直边尽可能对齐像素网格,不对称图形通过光学校准而非强制几何居中。将新增图形放在既有横向及纵向图标组中比较,使斜线、圆形与矩形的视觉体量接近。\n\n![对齐像素网格的用户图标。](https://open.limeai.run/docs/assets/design/source-0031-034.png)\n\n![未对齐像素网格时边缘模糊的用户图标。](https://open.limeai.run/docs/assets/design/source-0031-036.png)\n\n![对齐网格的斜向铅笔。](https://open.limeai.run/docs/assets/design/source-0031-042.png)\n\n![对齐网格的纵向铅笔。](https://open.limeai.run/docs/assets/design/source-0031-044.png)\n\n![对齐网格的横向铅笔。](https://open.limeai.run/docs/assets/design/source-0031-046.png)\n\n<a id=\"stroke-and-corners\"></a>\n\n## 线条、端点与箭头\n\n保持所选图标族的线重与端点规则;较重面型和较细线型分别检查光学表现。小箭头角度、转角及禁用斜线须可辨,不因简化复杂图形而丢失区别。\n\n<a id=\"overlap-and-color\"></a>\n\n## 叠加、图层清理与颜色\n\n小型叠加标记保持一致位置,交叠图形之间留出可见间隔,输出前清理未使用路径。图标按语义着色:状态图标搭配可读文字,普通系统图标跟随周边内容,应用标识保留配置预设或上传原图。\n\n![用于图标状态的成对色阶。](https://open.limeai.run/docs/assets/design/source-0031-067.png)\n\n![成功、错误、警示和信息语义图标。](https://open.limeai.run/docs/assets/design/source-0031-069.png)\n\n![中性工具栏图标。](https://open.limeai.run/docs/assets/design/source-0031-070.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n菜单展开时触发图标保持活动态,并按需暴露展开状态。仅在语言布局要求时镜像方向相关符号,Logo 与通用媒体符号保持本义。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 使用屏幕阅读器检查名称,并核对图标在英中文本旁对齐。\n2. 测试图片缺失与高缩放,动作标签仍应可用。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:36f872ff76afaa279143bbab384ab9200c59e1f57a5a3afd387355546969129b"},{"id":"design-style","group":"guide","category":"应用设计规范","title":"样式与形状","summary":"使用克制容器与一致边界组织内容。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-style?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"corner-system","title":"圆角层次与嵌套"},{"id":"elevation","title":"层级与投影方向"},{"id":"boundaries-background","title":"分割线、描边与背景"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 样式与形状\n\n使用克制容器与一致边界组织内容。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n先用留白与对齐组织信息,再增加卡片。边框应表达容器或交互边界;普通管理页避免彩色装饰边、叠加阴影与随意圆角。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-style](https://open.limeai.run/docs/design-style?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 边框 | 采用共享 0.5px 边框基线与语义分隔、输入变量。 |\n| 圆角 | 使用条目、控件、面板、弹窗变量(4、6、8、10px),核对嵌套间距。 |\n| 层级 | 少用或不用阴影,浮层需有清晰边界与可预测退出方式。 |\n\n<a id=\"corner-system\"></a>\n\n## 圆角层次与嵌套\n\n按对象职责使用共享 4px 条目、6px 控件、8px 面板及 10px 弹窗圆角变量。结合实际内边距检查嵌套容器,内部表面应适合外部曲线,不出现挤压或明显无关圆角。全圆角营销按钮属于独立受限模式。\n\n![带圆形辅助线的圆角构造。](https://open.limeai.run/docs/assets/design/source-0032-001.png)\n\n![带圆形辅助线的圆角构造。](https://open.limeai.run/docs/assets/design/source-0032-002.png)\n\n![带圆形辅助线的圆角构造。](https://open.limeai.run/docs/assets/design/source-0032-003.png)\n\n![带圆形辅助线的圆角构造。](https://open.limeai.run/docs/assets/design/source-0032-004.png)\n\n![带圆形辅助线的圆角构造。](https://open.limeai.run/docs/assets/design/source-0032-005.png)\n\n<a id=\"elevation\"></a>\n\n## 层级与投影方向\n\n增加投影前,先以位置、克制表面及细边界区分层次。浮层无论在触发区上、下或侧方,都须与触发区关系清楚。来源的方向投影说明高程原理;Lime 普通卡片保持平面,仅对必要浮层使用克制层级。\n\n![光源、平面与投影方向示意。](https://open.limeai.run/docs/assets/design/source-0032-006.png)\n\n![不同投影层级的编号卡片。](https://open.limeai.run/docs/assets/design/source-0032-007.png)\n\n![比较不同投影层级的编号面板。](https://open.limeai.run/docs/assets/design/source-0032-008.png)\n\n![比较不同投影层级的编号面板。](https://open.limeai.run/docs/assets/design/source-0032-009.png)\n\n![比较不同投影层级的编号面板。](https://open.limeai.run/docs/assets/design/source-0032-010.png)\n\n![比较不同投影层级的编号面板。](https://open.limeai.run/docs/assets/design/source-0032-011.png)\n\n<a id=\"boundaries-background\"></a>\n\n## 分割线、描边与背景\n\n分割线分开相邻信息,描边标识容器或控件。采用共享 0.5px 边界基线与对应分隔、输入或表面变量。选中、悬停、只读及禁用背景应有区别,同时不增加装饰或遮蔽内容。\n\n![通过遮罩与背景分层的弹窗表面。](https://open.limeai.run/docs/assets/design/source-0032-018.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n焦点是功能提示,在细边框旁也须可见。选中、悬停、禁用和只读状态应可区分;禁用背景不足以说明动作不可用原因。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 以常规与高缩放检查嵌套卡片、弹窗的焦点环是否裁剪。\n2. 验证 qiankun 微应用切换后样式仍限定范围。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:c16c766f80dd63ff537f923413231d5d60fd032dabb20f8fad62af1e75da978c"},{"id":"design-typography","group":"guide","category":"应用设计规范","title":"字体与排版","summary":"以精简字号层级和可读长文建立信息层次。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-typography?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"weights","title":"常规、强调与标题字重"},{"id":"type-scale","title":"字阶与行高"},{"id":"text-colors","title":"文字颜色与精确数据"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 字体与排版\n\n以精简字号层级和可读长文建立信息层次。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n按信息角色选择字号,再用字重、间距与颜色区分次级信息。普通业务页优先共享 12、14、18px 层级,明确页面例外另行维护。不为塞入布局将可读文字缩至 12px 以下。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-typography](https://open.limeai.run/docs/design-typography?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 标题 | 使用语义标题层级与任务对象名称,不重复装饰标签。 |\n| 正文 | 保留适当行高与阅读宽度,普通正文换行,不截断必要条款。 |\n| 数据 | 代码标识使用等宽字体,对齐金额使用等宽数字,并保留底层精确值。 |\n\n<a id=\"weights\"></a>\n\n## 常规、强调与标题字重\n\n正文使用常规字重,简短强调使用中等字重,更强字重仅用于目标标题层次。字体回退栈须能显示英文与中文。字重变化不应挤动相邻控件,也不能成为选中的唯一提示。\n\n<a id=\"type-scale\"></a>\n\n## 字阶与行高\n\n遵守共享页面字阶与最小可读字号。文档具有明确长文排版例外,管理表单不继承其 Hero 标题。按字体设置行高,让译文或放大文字增高而不裁剪。\n\n<a id=\"text-colors\"></a>\n\n## 文字颜色与精确数据\n\n主次文字使用中性语义变量,链接使用链接变量,功能色搭配已确认状态。机器标识用等宽字体,可比较数字用等宽数字。重要法律或价格限制不能显示得像浅色占位符。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n长 ID 与代码可在自身区域滚动。名称可换行或提供完整可访问值;按钮标签应先有意义精简,再考虑截断。中文换行与英文单词边界需分别视觉检查。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查浏览器文字放大与 200% 缩放,不丢提交或关闭动作。\n2. 检查源文译文层次与换行,包括长 URL。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:506a1ad7a2124ecbfa8a3f5476b39831bc5015360b74cb1e52a3ab06c7bc1964"},{"id":"design-i18n","group":"guide","category":"应用设计规范","title":"多语言设计规范","summary":"分离稳定语义、语言资源与本地化业务资料。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-i18n?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"text-expansion","title":"为译文扩展预留空间"},{"id":"horizontal-space","title":"横向约束与长标签"},{"id":"vertical-space","title":"行高与纵向扩展"},{"id":"single-column","title":"优先可扩展的纵向布局"},{"id":"wrapping-and-handoff","title":"折行规则与设计交付"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 多语言设计规范\n\n分离稳定语义、语言资源与本地化业务资料。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n支持语言读取共享语言登记。英文为源语言、默认及最终回退,当前也开放简体中文。增加语言需资源完整及验收,仅新增选择项不算支持语言。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-i18n](https://open.limeai.run/docs/design-i18n?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 界面消息 | 在所属 i18next Namespace 使用稳定键,不将英文句子或资源 ID 当翻译键。 |\n| 本地化资料 | 源资料与按规范语言码索引的译文分开,不创建固定双语实体。 |\n| 业务数据 | 稳定状态错误码、精确金额时间均独立于翻译展示。 |\n\n<a id=\"text-expansion\"></a>\n\n## 为译文扩展预留空间\n\n短标签与长段落同样需要检查:两个汉字的动作可能变成多个英文单词。标明区域最小与最大宽度、相邻间距,以及溢出时换行、扩展或移至下一行的规则,不将固定扩展百分比当作保证。\n\n[design-detail-i18n-expansion](https://open.limeai.run/docs/design-i18n?locale=zh-CN#text-expansion)\n\n<a id=\"horizontal-space\"></a>\n\n## 横向约束与长标签\n\n以英文源文为基准,用真实标签检查全部登记译文。优先使用弹性容器并减少列数。考虑截断前,在不丢对象与后果的前提下精简动作;可见标签缩短时仍提供完整可访问名称。\n\n<a id=\"vertical-space\"></a>\n\n## 行高与纵向扩展\n\n翻译或浏览器放大文字后,内容也可能纵向增长。按实际字体设置行高,让消息容器随内容增高,避免固定高度裁剪中文标点、变音符号、错误提示或标签第二行。\n\n<a id=\"single-column\"></a>\n\n## 优先可扩展的纵向布局\n\n文本长、由用户填写或长度不可预测时,采用上下标签与值或纵向动作列表。并排多列仅用于短且受控、需要比较的值。窄屏让完整动作移到相关内容下方,避免挤入多个小宫格。\n\n[design-detail-i18n-wrapping](https://open.limeai.run/docs/design-i18n?locale=zh-CN#single-column)\n\n<a id=\"wrapping-and-handoff\"></a>\n\n## 折行规则与设计交付\n\n英文单词与中文文本有不同折行位置。正文优先正常语言换行,仅对连续标识或 URL 使用任意断行。随设计记录长标签行为,并用登记资源验证;测试假设扩展不代表开放未登记语言。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n使用整句消息、命名插值及原生 CLDR 复数。React 文字保持转义,富文本使用受控组件;Go 维护原生 go-i18n 模板,不新增共享格式转换器,也不逐请求修改进程全局语言。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 按登记验证 Namespace 完整性、插值及各语言复数类别。\n2. 验证未支持语言和脚本按明确回退处理,不假称已有译文。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:6447e2c0b100a245b6c3a9a371a403a022044a1fc97ab2efec3719a0c68b89b4"},{"id":"design-interface-localization","group":"guide","category":"应用设计规范","title":"设计多语言界面","summary":"容纳译文扩展,在各入口保留用户选择。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-interface-localization?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"language-dimensions","title":"语言长度与字高"},{"id":"word-boundaries","title":"词语边界与折行"},{"id":"regional-meaning","title":"语言、地区格式与文化"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 设计多语言界面\n\n容纳译文扩展,在各入口保留用户选择。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n标签和容器应弹性布局,不以固定英文宽度定位。中文与英文单词的换行不同,英文复合名及译文可能更长。保持动作含义一致,不强制逐字词序。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-interface-localization](https://open.limeai.run/docs/design-interface-localization?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 选择 | 从 localeOptions 读取语言原生名,不用国旗或写死语言对。 |\n| 格式 | 展示使用 Intl,语言、时区、币种与账期保持独立。 |\n| 偏好 | 仅保存用户显式选择,普通请求协商不改写账号偏好。 |\n\n<a id=\"language-dimensions\"></a>\n\n## 语言长度与字高\n\n简短中文标签与英文源文宽度不同,字形、标点及变音符号高度也可能不同。使用全部登记语言的真实字符串检查。单个示例中观察到的比例仅作测试提示,不是通用尺寸规则。\n\n<a id=\"word-boundaries\"></a>\n\n## 词语边界与折行\n\n正文按自然语言边界折行,尽可能保留完整英文单词并遵守中文标点规则。长 URL 或不透明标识可在自身区域断行,动作标签应有意义精简。不要靠给单一译文插入手动换行修复所有视口。\n\n<a id=\"regional-meaning\"></a>\n\n## 语言、地区格式与文化\n\n界面译文与日期、时间、币种及数字格式分开。使用明确时区与记录币种,语言选择不用国旗,并检查符号在当前语言中的含义。当前登记仅开放英文与简体中文,设计兼容能力不自动启用其他语言。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n宿主和微应用通过共享语言桥同步,同时保留 Namespace 归属。延迟偏好读取不能覆盖更新的手动选择;API 发送规范请求语言并按 Content-Language 处理展示,不用译文判断权限。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试长标签、复数、跨时区日期及无浮点转换金额。\n2. 在错误和请求进行中切换语言,确认任务状态与显式偏好一致。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:1276067121c76cf0280c8adb686a5bca8e9e32969089c24584467d7885d86508"},{"id":"design-visualization","group":"guide","category":"应用设计规范","title":"数据可视化","summary":"选择能保留指标、单位与不确定性的图表。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-visualization?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"palettes","title":"分类、顺序与功能色板"},{"id":"chart-anatomy","title":"图表构成与图例"},{"id":"choose-chart","title":"按分析目的选图"},{"id":"chart-variants","title":"高频图表与变体"},{"id":"chart-adaptation","title":"标签与响应式适配"},{"id":"extreme-values","title":"极值、零值与空范围"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 数据可视化\n\n选择能保留指标、单位与不确定性的图表。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n仅在比较、分布或变化比小表更清晰时使用图表。先定义来源、期间、时区、聚合与单位。不能把不完整响应或缺数变成零,也不能跨币种加金额。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-visualization](https://open.limeai.run/docs/design-visualization?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 图形 | 条形比较分类,折线表达有序变化;仅对完整共同总量使用占比。 |\n| 坐标 | 标明单位、量尺与日期边界,避免截断条形基线或未解释第二坐标轴。 |\n| 色板 | 一致使用语义或分类颜色,并通过标签、形状补充区分。 |\n\n<a id=\"palettes\"></a>\n\n## 分类、顺序与功能色板\n\n独立系列使用分类颜色,有序大小使用明度序列;发散色阶须有零点等明确中心。成功、警告与错误色只表达真实状态。每种颜色区别用标签、线型或符号补充,筛选后保持系列颜色身份稳定。\n\n[design-detail-visualization-palette](https://open.limeai.run/docs/design-visualization?locale=zh-CN#palettes)\n\n![表示单一数据系列的单色柱形。](https://open.limeai.run/docs/assets/design/source-0036-002.png)\n\n![使用克制分类色板的分组柱形。](https://open.limeai.run/docs/assets/design/source-0036-003.png)\n\n![数字坐标轴上的正负柱形。](https://open.limeai.run/docs/assets/design/source-0036-007.png)\n\n![带数字阈值和两种颜色线段的折线图。](https://open.limeai.run/docs/assets/design/source-0036-008.png)\n\n<a id=\"chart-anatomy\"></a>\n\n## 图表构成与图例\n\n矩形图表标明指标、单位、坐标轴、系列及时间或分类范围;圆形图表也需要分类标签与明确总量。图例放在当前屏幕可见位置,单一系列避免重复图例,并为精确读取及辅助技术提供等价表格。\n\n<a id=\"choose-chart\"></a>\n\n## 按分析目的选图\n\n先确定读者需要比较什么,再选图形。外观像漏斗或雷达不够,数据须具备对应顺序及维度。系列数量应可区分;以精确查值为目的时使用表格。\n\n[design-detail-visualization-chart-choice](https://open.limeai.run/docs/design-visualization?locale=zh-CN#choose-chart)\n\n| 用途 | 规则 |\n| --- | --- |\n| 比较与排名 | 条形共享零基线,为分类名预留空间。 |\n| 有序变化 | 折线表达时间等有序范围,缺失段保持可见。 |\n| 构成占比 | 饼图、环图及百分比堆叠需要完整且可比较总量。 |\n| 流程与分布 | 漏斗需要有序阶段,散点需要两个测量维度。 |\n\n<a id=\"chart-variants\"></a>\n\n## 高频图表与变体\n\n分组柱形比较分类内系列,堆叠强调总量及组成。阶梯折线适合离散状态变化,平滑曲线不能暗示观测点之间存在测量值。面积图强调有序范围上的量级,雷达图须采用可比较维度量尺。\n\n组合图标明各量尺并说明同时使用的原因。避免装饰渐变、立体扇区及遮蔽问题的多余系列。运营图表是来源事实的视图,不证明结算或通知送达已完成。\n\n![使用数字坐标轴的散点图。](https://open.limeai.run/docs/assets/design/source-0036-034.png)\n\n![数字坐标轴上的折线面积图。](https://open.limeai.run/docs/assets/design/source-0036-038.png)\n\n![数字坐标轴上的平滑面积图。](https://open.limeai.run/docs/assets/design/source-0036-039.png)\n\n<a id=\"chart-adaptation\"></a>\n\n## 标签与响应式适配\n\n优先保留数据图形,再保留有用图例和轴标签;先减少装饰网格线,再考虑其他元素。标签可换行或缩写但须可获完整值;刻度抽样不改变数据,长分类名可用横向条形。旋转不能造成难读或裁剪。\n\n<a id=\"extreme-values\"></a>\n\n## 极值、零值与空范围\n\n检查单点、全部相同、总量为零、负值、离群值与没有观测。零是测量值,缺数是独立状态。明确单位和量尺变化,不将不同币种相加成一个总量。\n\n![带范围选择概览的数字折线图。](https://open.limeai.run/docs/assets/design/source-0036-058.png)\n\n![包含三十个数据点的密集数字折线图。](https://open.limeai.run/docs/assets/design/source-0036-060.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n图表提示需键盘可达,并提供与指针相同数值。核心结论提供可读表格或文字替代。加载、无数据、权限拒绝与部分数据应分别展示。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试单值、相同范围、负数或退款、长标签和大精确整数。\n2. 检查窄屏及屏幕阅读器可获得同一指标定义。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:9b6a8bc642f977065844f99bb1dac5c7a4d38cd29579f195709c63f041ae31ce"},{"id":"design-responsive","group":"guide","category":"应用设计规范","title":"响应式设计","summary":"按可用空间适配任务,不隐藏必要决定。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-responsive?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"grid-and-spacing","title":"内容栅格与间距"},{"id":"page-layouts","title":"全宽与定宽布局"},{"id":"adaptation-mechanisms","title":"换行、拉伸、滚动与收起"},{"id":"navigation-mapping","title":"响应式导航"},{"id":"component-mapping","title":"映射组件而不改变含义"},{"id":"form-and-data-mapping","title":"表单、描述列表与数据表格"},{"id":"home-and-signin","title":"首页与登录适配"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 响应式设计\n\n按可用空间适配任务,不隐藏必要决定。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n响应式改变排列,不改变权限或操作含义。从任务最小信息与动作开始,再适配列、导航与次级详情。窄屏仍显示购买、权限与未知结果必要信息。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-responsive](https://open.limeai.run/docs/design-responsive?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 导航 | 侧栏收为有名称面板,保留当前位置、退出及焦点恢复。 |\n| 表单 | 字段纵向排列,标签错误可换行,软键盘下主操作仍可达。 |\n| 数据 | 选择重点列或局部横向表格区域,不缩小全部文字塞入。 |\n\n<a id=\"grid-and-spacing\"></a>\n\n## 内容栅格与间距\n\n从屏幕宽度中扣除常驻导航后,再对可用内容使用栅格。区分列、列间槽与外边距;固定侧栏不是内容列。适用框架沿用共享桌面 24px、窄屏 16px 页面内边距。\n\n![从零到一百二十的数值间距刻度。](https://open.limeai.run/docs/assets/design/source-0037-006.png)\n\n<a id=\"page-layouts\"></a>\n\n## 全宽与定宽布局\n\n密集数据和工作工具可用弹性全宽内容,聚焦表单及长文限制阅读宽度。一栏、两栏或三栏都须有清楚顺序。按实际内容无法容纳的位置设置断点,并记录变换,不未经 Lime 任务验证就照搬设备宽度。\n\n![十二列栅格中的三列与九列组合。](https://open.limeai.run/docs/assets/design/source-0037-015.png)\n\n![十二列栅格中的四列与八列组合。](https://open.limeai.run/docs/assets/design/source-0037-016.png)\n\n![十二列栅格的三段组合方式。](https://open.limeai.run/docs/assets/design/source-0037-017.png)\n\n<a id=\"adaptation-mechanisms\"></a>\n\n## 换行、拉伸、滚动与收起\n\n并排模块放不下时纵向堆叠。图片按比例缩放,文本允许增高,密集表格放在有名称的局部横向滚动区。次要命令收进有名称菜单,同时保留主任务及必要后果信息。\n\n<a id=\"navigation-mapping\"></a>\n\n## 响应式导航\n\n宽屏显示当前全局与局部导航。空间缩小时,先收起低频条目,保留当前位置。窄屏使用明确导航按钮与可关闭面板,展开后标识当前页,关闭时恢复焦点。\n\n[design-detail-responsive-navigation](https://open.limeai.run/docs/design-responsive?locale=zh-CN#navigation-mapping)\n\n![顶部导航与主体内容的响应式骨架。](https://open.limeai.run/docs/assets/design/source-0037-027.png)\n\n![侧边导航与主体内容的响应式骨架。](https://open.limeai.run/docs/assets/design/source-0037-028.png)\n\n![顶部导航、侧边导航与主体内容的组合骨架。](https://open.limeai.run/docs/assets/design/source-0037-029.png)\n\n<a id=\"component-mapping\"></a>\n\n## 映射组件而不改变含义\n\n桌面弹窗可在手机变成更宽或接近全高的面板,小型操作菜单可变为适合触控的列表。保持相同可访问名称、动作顺序、权限和恢复。视觉映射是设计要求,不代表新的共享组件已经发布。\n\n<a id=\"form-and-data-mapping\"></a>\n\n## 表单、描述列表与数据表格\n\n多列表单转为单一阅读顺序,标签、帮助及错误跟随对应输入。描述列表按所在卡片而非整个屏幕计算栅格。表格保留关键标识和金额,允许有意局部横向滚动,并让行操作可触控。\n\n[design-detail-responsive-form-table](https://open.limeai.run/docs/design-responsive?locale=zh-CN#form-and-data-mapping)\n\n![在四列、三列、双列和单列间适配的表单骨架。](https://open.limeai.run/docs/assets/design/source-0037-080.png)\n\n![在四列、三列、双列和单列间适配的表单骨架。](https://open.limeai.run/docs/assets/design/source-0037-081.png)\n\n![在四列、三列、双列和单列间适配的表单骨架。](https://open.limeai.run/docs/assets/design/source-0037-082.png)\n\n![在四列、三列、双列和单列间适配的表单骨架。](https://open.limeai.run/docs/assets/design/source-0037-083.png)\n\n![从宽视口适配到窄视口的表格骨架。](https://open.limeai.run/docs/assets/design/source-0037-092.png)\n\n<a id=\"home-and-signin\"></a>\n\n## 首页与登录适配\n\n产品首页可重排相关模块或移除装饰图,同时保留必要任务。登录页在软键盘打开时仍须显示账号、挑战、恢复和政策动作。先收起装饰面板,再调整认证控件;尺寸变化不能重置认证事务。\n\n![面板在不同栅格宽度下调整尺寸、可见性和位置。](https://open.limeai.run/docs/assets/design/source-0037-107.png)\n\n![面板在不同栅格宽度下调整尺寸、可见性和位置。](https://open.limeai.run/docs/assets/design/source-0037-108.png)\n\n![面板在不同栅格宽度下调整尺寸、可见性和位置。](https://open.limeai.run/docs/assets/design/source-0037-109.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n触控设备避免仅悬停控件和细小分裂按钮热区。弹窗应在视口内有明确内部滚动;固定元素需适应可见视口,不遮挡焦点字段或校验信息。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查 1440×1000、390×844、横屏、200% 缩放及打开软键盘。\n2. 用键盘与触控测试菜单、弹窗、长译文、代码块与表格溢出。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:c4bb964fe3f020c324d226bbefc6c404949cad2f03cf82817f651f90d6b97f00"},{"id":"design-anchor","group":"guide","category":"应用设计规范","title":"锚点","summary":"在长页面内导航,保留标题与阅读位置。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-anchor?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"anchor-variants","title":"平级与层级目录"},{"id":"anchor-placement","title":"位置、溢出与固定偏移"},{"id":"anchor-step-comparison","title":"锚点与步骤条"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 锚点\n\n在长页面内导航,保留标题与阅读位置。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n锚点用于同页独立小节,例如 API 参数或开发指南。不同资源使用路由导航,顺序任务使用步骤条;锚点不表示流程已完成。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-anchor](https://open.limeai.run/docs/design-anchor?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 目标 | 各小节使用稳定唯一 ID 与有意义语义标题。 |\n| 位置 | 滚动偏移适配固定顶栏,当前小节不只靠颜色表达。 |\n| 长标签 | 允许换行或提供完整可访问名,不压缩为难读窄列。 |\n\n<a id=\"anchor-variants\"></a>\n\n## 平级与层级目录\n\n平级目录用于同级小节,层级目录反映真实标题层级。定位线可辅助说明当前小节,但并非必需。每个标签对应真实标题,锚点仅用于当前页,不用于表达业务状态顺序。\n\n<a id=\"anchor-placement\"></a>\n\n## 位置、溢出与固定偏移\n\n目录不能挤压阅读列;已有主侧栏时,独立右侧目录可能更清楚。长目录在可用高度内滚动,长标签提供完整含义。跳转小节时扣除固定顶栏遮挡。\n\n<a id=\"anchor-step-comparison\"></a>\n\n## 锚点与步骤条\n\n滚动文档改变阅读位置,不改变任务完成状态。顺序表单使用步骤条,历史事件使用时间轴。窄屏目录可收进明确按钮,同时保留相同小节深链。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n内容加载后,Hash 深链与浏览器前进后退应到达目标小节。不因阅读滚动而移动键盘焦点;显式点击锚点时可按需聚焦目标标题。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 打开深 Hash URL,刷新后检查标题可见。\n2. 测试窄屏目录面板、关闭与焦点恢复。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:589d8d1456d2a8d525d3fe163f2ac605e249fc662f8a5977575507158d0147e1"},{"id":"design-breadcrumb","group":"guide","category":"应用设计规范","title":"面包屑","summary":"显示资源在稳定层级中的位置。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-breadcrumb?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"breadcrumb-parts","title":"标签、分隔符与当前位置"},{"id":"breadcrumb-collapse","title":"折叠中间层级"},{"id":"breadcrumb-contexts","title":"页面与容器内层级"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 面包屑\n\n显示资源在稳定层级中的位置。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n用户从搜索或深链进入嵌套资源、需要上级时使用面包屑。它不是浏览历史,也不替代主导航。上级链接涉及资源边界时,明确应用与空间上下文。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-breadcrumb](https://open.limeai.run/docs/design-breadcrumb?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 上级 | 使用简洁真实层级和有效链接,不虚构无权访问上级。 |\n| 当前项 | 语义标明当前页,避免多余自身链接。 |\n| 溢出 | 将中间上级收为可访问菜单,保留有用上级与当前项。 |\n\n<a id=\"breadcrumb-parts\"></a>\n\n## 标签、分隔符与当前位置\n\n各段命名真实上级或当前资源,分隔符表达包含关系,并对辅助技术保持装饰性质。使用有名称的面包屑导航区域并标识当前页,不从用户浏览历史构造路径。\n\n<a id=\"breadcrumb-collapse\"></a>\n\n## 折叠中间层级\n\n宽度受限时保留当前项及有用根节点或直接上级。中间层级收进可访问溢出控件,展开后保持原顺序。展开列表长名称可换行,不能仅靠悬停访问隐藏上级。\n\n<a id=\"breadcrumb-contexts\"></a>\n\n## 页面与容器内层级\n\n页面面包屑使用页面资源层级,穿梭或树选择面板内面包屑使用面板自身导航上下文。路径限定在获授权资源中,上级链接不能未经明确上下文切换进入另一空间。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n面包屑跳转不能丢弃未知写入或自动提交修改。返回上级时仅保留安全过滤与上下文;无权上级不可暴露私有标题或生成坏控件。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查深层级、长译名及溢出菜单键盘导航。\n2. 以有权与无权账号打开子级直达 URL。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:f97fbd824f3eb264d0647192fbe58abed7a5894b5beac842100f0fbeb8ef5c26"},{"id":"design-dropdown","group":"guide","category":"应用设计规范","title":"下拉菜单","summary":"在可预测、键盘可达菜单中组织相关动作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-dropdown?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"menu-variants","title":"菜单组成与类型"},{"id":"menu-dimensions","title":"宽高与动态内容"},{"id":"menu-placement","title":"位置与边界避让"},{"id":"menu-input","title":"指针、键盘与触控行为"},{"id":"menu-comparison","title":"菜单、选择器、级联选择与气泡卡片"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 下拉菜单\n\n在可预测、键盘可达菜单中组织相关动作。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n下拉菜单承载与触发器相关的命令或导航;选择器选择表单值,气泡卡片承载更丰富内容。动作菜单通过点击打开。单一明显高频命令宜直接显示。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-dropdown](https://open.limeai.run/docs/design-dropdown?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 触发器 | 提供名称、展开状态与菜单关联,展开时保留活动样式。 |\n| 条目 | 动作标签一致,相关条目分组,破坏性含义明确,不混入无关选项。 |\n| 位置 | 菜单保持在可见视口内,不遮挡触发器或焦点目标。 |\n\n<a id=\"menu-variants\"></a>\n\n## 菜单组成与类型\n\n菜单由触发区、内容容器与动作条目组成;子菜单另有父级条目及展开指示。仅在触发区不能解释动作时增加简短辅助标题。相关动作以分隔分组,危险命令须可识别,短命令列表避免深级联。\n\n[design-detail-dropdown-variants](https://open.limeai.run/docs/design-dropdown?locale=zh-CN#menu-variants)\n\n<a id=\"menu-dimensions\"></a>\n\n## 宽高与动态内容\n\n截断前先按登记语言中的真实最长动作安排宽度。菜单受可用视口约束,必要时内容内部滚动。异步菜单加载时保留稳定且可用宽度,随后区分无结果与失败,并在条目到达时保持键盘焦点。\n\n<a id=\"menu-placement\"></a>\n\n## 位置与边界避让\n\n菜单靠近触发区,通常向下展开并对齐起始边;空间不足时改对齐另一边或向上展开,与视口保留安全距离。子菜单与父条目保持视觉关联,指针移动过去时不能因空隙而关闭。\n\n[design-detail-dropdown-placement](https://open.limeai.run/docs/design-dropdown?locale=zh-CN#menu-placement)\n\n<a id=\"menu-input\"></a>\n\n## 指针、键盘与触控行为\n\n即使支持悬停,也提供点击及键盘打开。菜单展开时触发区保持活动;方向键在可用条目间移动,Escape 关闭当前层并恢复焦点,执行命令后按任务规则关闭。右键菜单中的动作也须通过可发现的固定控件访问。\n\n<a id=\"menu-comparison\"></a>\n\n## 菜单、选择器、级联选择与气泡卡片\n\n命令或去向使用菜单,执行后不把触发区变成已选字段;需要回显字段值时使用选择器或级联选择。更丰富说明及表单使用气泡卡片,不将表单伪装成菜单条目。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n支持方向键、Enter 或 Space 激活,Escape 关闭并返回触发器。仅在安全时点击外部关闭。限制嵌套菜单,窄屏将深层悬停级联替换为更简单有名称面板。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试视口边缘、禁用项、焦点顺序与动态空菜单。\n2. 验证敏感命令进入真实检查或确认流程,并只执行一次。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:dc0348fe0e4ec58cc1280c384a90af0ed747f46273de85aa2213a1f567e4c7c8"},{"id":"design-navigation","group":"guide","category":"应用设计规范","title":"导航菜单","summary":"按用户任务组织目的地,并清晰显示当前位置。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-navigation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"navigation-regions","title":"顶部与侧边导航区域"},{"id":"navigation-hierarchy","title":"层级、展开与附属动作"},{"id":"navigation-adaptation","title":"折叠导航与长标签"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 导航菜单\n\n按用户任务组织目的地,并清晰显示当前位置。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n顶栏连接主要产品区域,侧栏组织当前区域。真实嵌套内容(如文档)适合树形导航。使用稳定任务名称和分组,不照搬源码模块或后端表。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-navigation-menu](https://open.limeai.run/docs/design-navigation?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 当前路由 | 按真实位置(含深链)显示可见及语义当前状态。 |\n| 展开 | 节点兼具分组和目的地时,区分展开与跳转。 |\n| 响应式 | 保留有名称窄屏导航触发器,面板关闭后恢复焦点。 |\n\n<a id=\"navigation-regions\"></a>\n\n## 顶部与侧边导航区域\n\n顶导航组合品牌首页链接、全局去向及账号或搜索控件。侧导航组织局部去向,可带展开收起控件。保持活动路由可见,区分导航与附近对象动作。\n\n<a id=\"navigation-hierarchy\"></a>\n\n## 层级、展开与附属动作\n\n真实子路由保持一致缩进,展开行为独立于选择去向。内容确有层级时才使用树导航。各附属行操作有独立热区和可访问名称,避免误触导航或收起父级。\n\n<a id=\"navigation-adaptation\"></a>\n\n## 折叠导航与长标签\n\n折叠侧栏时保留所选上下文、可访问标签及进入子级的键盘路径。长译文可换行或提供完整标签。适用时使用 Lime 共享框架尺寸;来源宿主的宽度不替换当前 64px 顶栏和 270px 侧栏合同。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n不在悬停时跳转,也不因展开分组自动切换应用上下文。隐藏条目不等于授权,直达 URL 仍需后端检查。撤权后提供合理目的地,不泄露被拒页面数据。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试多级分组深链、前进后退与权限变化。\n2. 检查长译文和打开窄屏导航后的键盘遍历。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:1c57d08d7e337d5837c96ca65d441132faedf88760708fbba1676811d2fb31c9"},{"id":"design-pagination","group":"guide","category":"应用设计规范","title":"分页控件","summary":"使列表导航符合真实游标或页码合同。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-pagination?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"pagination-parts","title":"分页组成与类型"},{"id":"pagination-state","title":"边界与查询变化"},{"id":"pagination-adaptation","title":"窄屏控件与选择范围"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 分页控件\n\n使列表导航符合真实游标或页码合同。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n有界列表比持续加载更易浏览时使用分页。仅当 API 提供页码模型时才显示页码。Lime 游标列表通常返回 next_cursor,应使用下一页、加载更多,并按需保存本地游标栈。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-pagination](https://open.limeai.run/docs/design-pagination?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 操作 | 禁用不可用方向,命名目的地,不虚构末页或总数。 |\n| 过滤 | 过滤、排序、空间、应用或环境变化时重置导航。 |\n| 反馈 | 保留行或稳定加载区域,错误关联请求页。 |\n\n<a id=\"pagination-parts\"></a>\n\n## 分页组成与类型\n\n完整分页可显示当前页、前后翻页、每页数量,以及 API 提供的总量。紧凑分页减少次要选项,同时让当前位置清楚。游标响应不虚构总量或末页。\n\n<a id=\"pagination-state\"></a>\n\n## 边界与查询变化\n\n不可用前后翻页应禁用,加载后播报新范围。筛选、排序、空间或应用变化时重置游标,并始终绑定相同查询。下一页失败保留当前记录,提供对该页的重试。\n\n![紧凑数字分页及点击热区尺寸标注。](https://open.limeai.run/docs/assets/design/source-0042-009.png)\n\n<a id=\"pagination-adaptation\"></a>\n\n## 窄屏控件与选择范围\n\n必要前后翻页保留足够触控热区,需要时将可选每页数量设置移出主行。明确选择记录是否跨页保留,区分选中可见行与选中服务端全部结果。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n显式翻页后焦点保留在列表标题附近,已知时播报新结果范围。不在新过滤标签下显示旧行,获取失败应原游标重试。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试首尾游标、空结果、游标到期与请求中切换过滤。\n2. 检查窄屏按钮热区、译文和浏览器导航。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:ddfd6ee1bfa3a5e0b6aefda2a3ac6fcca372c931dfcbc2ffc2294ebcff67017e"},{"id":"design-scrollbar","group":"guide","category":"应用设计规范","title":"滚动与滚动条","summary":"让溢出可发现,并保留原生滚动行为。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-scrollbar?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"scrollbar-parts","title":"视窗、轨道与滑块"},{"id":"scrollbar-position","title":"位置、对比与热区冲突"},{"id":"scrollbar-behavior","title":"滚动方式与动态内容"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 滚动与滚动条\n\n让溢出可发现,并保留原生滚动行为。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n优先单一主要纵向阅读区域。宽表格、代码样例或有界弹窗内容可局部滚动。不为固定装饰布局创建不可见滚动区。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-scroll-bar](https://open.limeai.run/docs/design-scrollbar?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 可见性 | 尊重系统滚动条设置,不依赖鼠标悬停发现溢出。 |\n| 焦点 | 原本无法键盘到达的滚动区域,按需提供有意义名称与可见焦点。 |\n| 位置 | 固定内容与滚动边距不能遮挡目标或最终动作。 |\n\n<a id=\"scrollbar-parts\"></a>\n\n## 视窗、轨道与滑块\n\n视窗是可见区域,轨道表示滚动路径,滑块表示可见比例。没有可滚动内容时不显示虚假滚动提示。原生滚动条保留平台偏好及键盘行为,不能只为隐藏轨道而替换。\n\n![中性列表骨架旁的滚动条编号结构图。](https://open.limeai.run/docs/assets/design/source-0043-011.png)\n\n<a id=\"scrollbar-position\"></a>\n\n## 位置、对比与热区冲突\n\n垂直条位于区域边缘,横向条放在可达位置。两轨道避免交叉,调整尺寸把手及行操作不能共用其热区。彩色背景上的滚动条在默认、悬停及按下状态仍需足够对比。\n\n![用 A、B、C 标识的中性可滚动表格区域。](https://open.limeai.run/docs/assets/design/source-0043-017.png)\n\n![转角附近相互分离的横向与纵向滚动轨道。](https://open.limeai.run/docs/assets/design/source-0043-018.png)\n\n![在转角处相接的横向与纵向滚动轨道。](https://open.limeai.run/docs/assets/design/source-0043-019.png)\n\n<a id=\"scrollbar-behavior\"></a>\n\n## 滚动方式与动态内容\n\n区域获得焦点时支持滚轮、触控、触控板及键盘滚动。追加内容时保持阅读位置。确需自绘滑块时,按视窗与内容大小计算比例,按剩余滚动范围计算偏移,并考虑最小可操作尺寸。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n支持滚轮、触控、键盘及原生辅助行为,不拦截全部滚动事件。避免弹窗与页面之间滚动陷阱。局部展开保留阅读位置,新资源可有意重置。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 在弹窗表格嵌套场景中,用键盘与触控到达末行或末动作。\n2. 检查系统覆盖滚动条、文字放大及整页无横向溢出。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:6beef5e2f9395d181fadb351019451957e76fa7b9ec2bcac8de0ddafb71ca8f8"},{"id":"design-steps","group":"guide","category":"应用设计规范","title":"步骤条","summary":"展示顺序任务,区分历史、校验与完成。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-steps?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"steps-variants","title":"横向、纵向与简化步骤"},{"id":"steps-transitions","title":"步骤切换与校验"},{"id":"steps-timeline","title":"布局与时间轴区别"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 步骤条\n\n展示顺序任务,区分历史、校验与完成。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n短且有序、当前阶段明确的流程适合步骤条。历史事件用时间轴,小节用锚点。审核发布需分别显示已提交、已批准和已发布,不合并为一个完成态。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-steps](https://open.limeai.run/docs/design-steps?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 阶段 | 使用简洁本地化动作或结果标签,语义标明当前步骤。 |\n| 导航 | 仅已完成或可编辑阶段可交互,不让装饰步骤看似链接。 |\n| 状态 | 通过文字和形状区分待处理、当前、确认完成及失败阻塞。 |\n\n<a id=\"steps-variants\"></a>\n\n## 横向、纵向与简化步骤\n\n每步包含节点、简短任务标题、可选说明及相邻连接。短且宽的流程用横向,窄屏或说明较多用纵向,减少大节点后仍能理解流程时可用简化形式。\n\n<a id=\"steps-transitions\"></a>\n\n## 步骤切换与校验\n\n下一步在前进前校验当前必填输入,返回保留有效值。仅在产品支持时允许点击节点导航,不能将未执行审核或付款标为完成。未开始、当前、完成和失败依据已确认任务事实显示。\n\n<a id=\"steps-timeline\"></a>\n\n## 布局与时间轴区别\n\n节点区域保持对齐,说明可增高,标题难读前先调整排列。步骤条指导任务,时间轴按时间记录历史事件。不要将大量历史变更硬塞进七步向导。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n前进须实际校验,后退保留安全字段。未知提交结果应保留可恢复当前状态,不乐观前进。窄屏采用纵向或紧凑表达,不能省略阶段名称。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试校验失败、取消、返回上一步及恢复直达阶段。\n2. 检查长标签,并确认阶段切换不自动执行业务写入。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:71bcbab5ba0e4c6c4b98e28928a332fd7f00026f9e0934a96302c9ef677317d0"},{"id":"design-buttons","group":"guide","category":"应用设计规范","title":"按钮概述","summary":"选择与动作影响相符的按钮层级与形态。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-buttons?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"button-family","title":"按钮类型与语义"},{"id":"button-state-model","title":"交互状态与切换行为"},{"id":"button-copy-overflow","title":"文案、图标与拥挤操作组"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 按钮概述\n\n选择与动作影响相符的按钮层级与形态。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n按钮执行命令,链接用于导航。同一任务区域使用一个主操作,替代动作采用次要或弱化样式。保存动作不应与破坏性撤权或跳转链接完全同形。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-button-overview](https://open.limeai.run/docs/design-buttons?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 文案 | 必要时使用短动词加对象:保存修改、创建版本、撤销访问。敏感动作避免含糊的确定。 |\n| 状态 | 通过共享 Button 提供默认、悬停、焦点、禁用与处理中状态。 |\n| 布局 | 相关动作分组,先有意义精简文案再截断;不堆放同权重主要按钮。 |\n\n<a id=\"button-family\"></a>\n\n## 按钮类型与语义\n\n基础、文字及图标按钮执行命令,链接用于导航。分裂及菜单按钮组合相关替代动作,切换按钮改变显式选中状态。悬浮及全圆角形式用于受限位置或营销场景,不替代普通任务按钮。\n\n![搜索、编辑和设置的图标按钮示例。](https://open.limeai.run/docs/assets/design/source-0045-004.png)\n\n![列表骨架中的悬浮新增与展开控件。](https://open.limeai.run/docs/assets/design/source-0045-005.png)\n\n<a id=\"button-state-model\"></a>\n\n## 交互状态与切换行为\n\n提供默认、悬停、按下、键盘焦点、禁用及处理中状态。短暂按下与持久选中切换保持区别,按需暴露 aria-pressed 或 expanded。命令处理中再次激活不能提交新意图。\n\n<a id=\"button-copy-overflow\"></a>\n\n## 文案、图标与拥挤操作组\n\n按真实结果区分创建、添加、保存与发布。仅在语义需要时使用可识别前置图标、后置菜单指示或外链符号。长译文先有意义精简、按钮组换行或将次要动作收入更多,再考虑截断必要标签。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n除目标表单提交外使用 type=button。写入处理中禁用重复提交,同时保留原命令可恢复。必要操作不可用时说明原因,不只留下禁用控件。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 用键盘激活,并检查重复点击仅发送一个命令。\n2. 检查长译文、焦点可见及拒绝、处理中结果。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:2368e7b4d4d4b51d03b1dd4e8f4e9cb9581de734f7394e41e11505e119c10cd8"},{"id":"design-button-basic","group":"guide","category":"应用设计规范","title":"基础按钮","summary":"一致使用共享主要、次要与弱化动作样式。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-basic?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"button-variants","title":"动作层级与按钮类型"},{"id":"button-size","title":"尺寸与间距"},{"id":"button-group","title":"按钮组合与通栏动作"},{"id":"button-label-icon","title":"文案与图标位置"},{"id":"button-surfaces","title":"状态、背景与对比"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 基础按钮\n\n一致使用共享主要、次要与弱化动作样式。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n主任务使用实色主要按钮,同级替代用次要控件,低优先命令用弱化按钮。操作成功通过结果状态表达,绿色动作按钮不应暗示未来请求已经成功。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-button_basic](https://open.limeai.run/docs/design-button-basic?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 尺寸 | 适用时使用共享 32px 紧凑或 36px 常规控件变量,同组高度一致。 |\n| 图标 | 仅在增加含义时使用惯常前置动作图标,保留可读标签。 |\n| 宽度 | 通常按内容宽度;通栏适合窄屏聚焦表单,不适合全部桌面工具栏。 |\n\n<a id=\"button-variants\"></a>\n\n## 动作层级与按钮类型\n\n按任务优先级与后果选择视觉强调。同一任务区域一个主要动作,替代动作使用次要按钮,破坏性命令使用危险语义。破坏性确认写明精确动作及对象,不用含糊的正向文案。\n\n共享 Button 当前提供 primary、secondary、text 与 danger。参考中的其他视觉组合用于解释层级,不是 Lime 额外导出的 variant 名称。\n\n[design-detail-button-basic-variants](https://open.limeai.run/docs/design-button-basic?locale=zh-CN#button-variants)\n\n<a id=\"button-size\"></a>\n\n## 尺寸与间距\n\n紧凑管理动作采用共享 32px 控件高度,任务需要时使用 36px 常规变量。相邻控件保持光学对齐,提供可用触控热区。认证或引导特殊尺寸遵守既有页面合同,不随意新增按钮高度。\n\n<a id=\"button-group\"></a>\n\n## 按钮组合与通栏动作\n\n同组保持一个主要按钮与一致的次要样式,增加第三种样式前先减少不必要层级。通栏按钮可强调聚焦手机或卡片任务,但宽度不能改变主操作含义,也不能将恢复入口挤出视野。\n\n[design-detail-button-basic-group](https://open.limeai.run/docs/design-button-basic?locale=zh-CN#button-group)\n\n<a id=\"button-label-icon\"></a>\n\n## 文案与图标位置\n\n使用简短且一致的动词与对象。前置图标可解释可识别动作,后置箭头在对应模式中表示菜单。同组图标使用保持一致,纯图标适配提供完整可访问名称,不将动作折成含义不清的两行片段。\n\n<a id=\"button-surfaces\"></a>\n\n## 状态、背景与对比\n\n区分焦点、禁用与处理中。弱化次要按钮在实际背景上仍须有可见边界或交互提示;覆盖内容的按钮需要不透明表面。不在服务端确认前,仅因批准按钮为绿色就把操作视为成功事实。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n校验消息出现时主任务位置保持稳定,不在同一标签下把失败保存换成其他命令。敏感命令仍需实际授权、检查与确认流程。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查单个、成组动作、长译文及与输入框对齐。\n2. 验证提交、错误与重试状态保持同一目标命令。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:6eaf4e523571c5d6e26d1ea80c3e524ca35e64bbb4a4576c3ff2b421c93f7931"},{"id":"design-button-split","group":"guide","category":"应用设计规范","title":"分裂按钮与菜单按钮","summary":"将稳定主命令与紧密相关替代动作分开。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-split?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"split-anatomy","title":"主操作与菜单独立热区"},{"id":"split-menu-content","title":"相关替代动作与稳定主操作"},{"id":"split-adaptation","title":"长标签与触控替代"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 分裂按钮与菜单按钮\n\n将稳定主命令与紧密相关替代动作分开。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n常用主动作稳定、少量相关替代动作适合菜单时使用分裂按钮。菜单按钮没有独立主动作。承载表单的气泡卡片不是动作下拉菜单,不应使用误导分裂外观。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-button_splitbutton_menu](https://open.limeai.run/docs/design-button-split?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 热区 | 主动作与菜单触发区分开,以清晰分割和独立可访问名表达。 |\n| 条目 | 菜单不重复主命令,也不因选择其他选项而替换其标签。 |\n| 触控 | 窄屏触控使用普通主按钮与独立更多动作,避免细小分裂热区。 |\n\n<a id=\"split-anatomy\"></a>\n\n## 主操作与菜单独立热区\n\n分裂按钮具有稳定主命令及独立菜单触发区,并有可见分隔;菜单按钮仅有一个打开替代动作的热区。不要用下拉箭头打开无关复杂气泡卡片,分裂两区各有独立可访问名称。\n\n<a id=\"split-menu-content\"></a>\n\n## 相关替代动作与稳定主操作\n\n菜单收纳相似层级的相关命令,不重复主操作。选择替代动作通常执行该命令,不重命名主操作。展开菜单的位置与焦点行为遵循下拉菜单指南。\n\n<a id=\"split-adaptation\"></a>\n\n## 长标签与触控替代\n\n先精简标签,避免截断及内部换行;除任务需要外不使用通栏分裂布局。手机上将细小分裂热区改为独立、足够大的更多按钮或操作列表,同时保留相同主命令。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n点击菜单区只展开,不执行主命令。保持触发焦点与展开状态一致。菜单替代动作遵守与可见动作相同的权限和未知结果恢复规则。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 用指针、键盘与触控验证两个热区,不误提交主命令。\n2. 检查边缘定位与窄屏拆分控件。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:3235f629c3c54b21af5a64020c0ed4e964a2f070439d30fe7cdfc964ab02da88"},{"id":"design-button-text","group":"guide","category":"应用设计规范","title":"文字按钮","summary":"使次级命令视觉轻量,同时保留可交互含义。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-text?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"text-button-link","title":"文字命令与导航链接"},{"id":"text-button-alignment","title":"可见文字与透明内边距"},{"id":"text-button-contrast","title":"长标签与对比背景"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 文字按钮\n\n使次级命令视觉轻量,同时保留可交互含义。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n文字按钮用于工具栏、行或弹窗中的低优先命令。跳转页面或资源(包括内联文档引用)使用真实链接,不让破坏性命令看似普通正文。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-button_text](https://open.limeai.run/docs/design-button-text?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 对齐 | 文字与上下文光学对齐,同时保留可用热区与可见焦点。 |\n| 标签 | 动作标签简短完整且一致,避免短工具栏命令多行换行。 |\n| 语义 | 命令用 button,导航用带真实 href 的 anchor。 |\n\n<a id=\"text-button-link\"></a>\n\n## 文字命令与导航链接\n\n弱化命令使用真实按钮,导航使用真实链接,即使两者外观都为文字。行内导航遵循句子阅读顺序,独立动作保留足够热区。外部去向可在有助建立打开预期时使用后置指示。\n\n<a id=\"text-button-alignment\"></a>\n\n## 可见文字与透明内边距\n\n独立文字按钮按有意交互容器对齐;密集列表中,可见标签与相邻文字对齐。组合间距须考虑透明内边距,让默认与悬停状态的视觉间隔一致。\n\n<a id=\"text-button-contrast\"></a>\n\n## 长标签与对比背景\n\n命令标签保持简短完整,正文链接可自然换行。深色提示或对比背景上使用匹配文字语义色,不假定普通链接色仍可读。浮层提示不能让本来不可访问的命令自动变得可访问。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n悬停反馈只是补充,键盘焦点同样清晰。不仅在悬停后加下划线才暴露动作。可重复提交的弱化命令仍需处理中、禁用状态。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 用屏幕阅读器与键盘检查内联链接和独立命令。\n2. 验证长译文不覆盖相邻行内容。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:882292d81449b721043be42082a21546b7a340048b664a310333a9a4703fe1fe"},{"id":"design-button-floating","group":"guide","category":"应用设计规范","title":"悬浮按钮","summary":"提供持续上下文动作,不遮挡用户工作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-floating?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"floating-purpose","title":"主要动作与定位快捷入口"},{"id":"floating-placement","title":"位置与多个控件"},{"id":"floating-menu-label","title":"菜单行为与可读标签"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 悬浮按钮\n\n提供持续上下文动作,不遮挡用户工作。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n仅对长页面持续有用动作(如返回顶部)使用悬浮按钮。多数管理命令应靠近对象或页面操作区。悬浮控件不应与购买、同意或表单提交竞争。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-button_float](https://open.limeai.run/docs/design-button-floating?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 位置 | 放在可见安全边距内,避让固定支持入口、窄屏导航与软键盘。 |\n| 含义 | 使用明确有名动作、图标及可访问文字,不由装饰推导全局命令。 |\n| 菜单 | 若展开替代动作,暴露展开状态并采用稳定退出及焦点模型。 |\n\n<a id=\"floating-purpose\"></a>\n\n## 主要动作与定位快捷入口\n\n仅在任务确需随滚动保持可达时使用悬浮动作,如明确创建或返回顶部。悬浮按钮由位置及层级定义,全圆角营销按钮仍处于普通内容流。\n\n![中性内容骨架上的悬浮新增操作。](https://open.limeai.run/docs/assets/design/source-0049-002.png)\n\n![带新增图标的圆形主要悬浮操作。](https://open.limeai.run/docs/assets/design/source-0049-004.png)\n\n![内容占位区旁的悬浮返回顶部控件。](https://open.limeai.run/docs/assets/design/source-0049-005.png)\n\n<a id=\"floating-placement\"></a>\n\n## 位置与多个控件\n\n选择稳定角落,与视口、滚动条及固定底栏保留安全距离。多个快捷入口按可预测顺序排列,不能遮住末行、主提交或焦点字段。软键盘打开时按可见视口重新检查。\n\n![纵向悬浮支持控件之间的间距。](https://open.limeai.run/docs/assets/design/source-0049-012.png)\n\n<a id=\"floating-menu-label\"></a>\n\n## 菜单行为与可读标签\n\n可识别图标须有本地化可访问名称及可选提示,陌生动作需要可见文字。点击打开分组菜单,悬停仅作解释。带文字的形状保持稳定,不给普通 Lime 文档页面加入聊天宿主消息行为。\n\n![悬停状态的浮动控件及相邻支持图标。](https://open.limeai.run/docs/assets/design/source-0049-014.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n返回顶部仅在有用时显示,出现时不挤动内容。滚动尊重减少动态效果。破坏性或商业命令应处于可检查任务上下文,不用通用悬浮图形代替。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查窄屏、弹窗及软键盘打开时是否遮挡。\n2. 测试键盘焦点及减少动态效果下滚动。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:75a481668ae6cce827483a009a324694f7e90d58d631c0d0b0171b28d8675d49"},{"id":"design-button-icon","group":"guide","category":"应用设计规范","title":"图标按钮","summary":"让紧凑动作可理解,不依赖文字提示才能识别。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-icon?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"icon-button-name","title":"可识别符号与名称"},{"id":"icon-button-target","title":"热区、间距与组合"},{"id":"icon-button-expanded","title":"展开菜单与选中状态"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 图标按钮\n\n让紧凑动作可理解,不依赖文字提示才能识别。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n图标按钮适合关闭、复制、更多等熟悉重复紧凑动作。效果不常见、敏感或含糊时优先文字。同一行或工具栏符号风格与目标尺寸一致。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-button_icon](https://open.limeai.run/docs/design-button-icon?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 名称 | 提供本地化可访问名,图形避免重复朗读。 |\n| 热区 | 交互区域大于图形本身,焦点时保持可见。 |\n| 切换或菜单 | 动作具有切换或菜单行为时暴露按下、展开状态。 |\n\n<a id=\"icon-button-name\"></a>\n\n## 可识别符号与名称\n\n选择常见命令符号,同一工具栏保持同族图标。每个纯图标按钮有本地化可访问名称,符号不明确时提供可见标签。装饰状态图标不是按钮。\n\n![同组图标按钮的排列示例。](https://open.limeai.run/docs/assets/design/source-0050-010.png)\n\n<a id=\"icon-button-target\"></a>\n\n## 热区、间距与组合\n\n可见图形可以较小,交互热区仍须足够。与相邻控件对齐,不为塞入另一个命令而缩小热区。头像旁特殊轮廓添加按钮可跟随头像尺寸,同时明确命令名称。\n\n<a id=\"icon-button-expanded\"></a>\n\n## 展开菜单与选中状态\n\n更多菜单展开时,即使指针移开,触发区也保持可见活动态。暴露展开状态与受控菜单,Escape 关闭并恢复焦点。持久切换的选中态与短暂按下态分开。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n更多菜单展开时触发器保持活动。复制成功应简短且由真实剪贴板结果确认,失败需替代方式。不因指针离开立即移除已聚焦行动作。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 不悬停指针,检查屏幕阅读器名称与键盘遍历。\n2. 高缩放下检查关闭、更多与破坏性动作可区分。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:c85b348c1a2bcbc06bcfbb7ce505b9f267f65eb4f79acee8975d56ae1c08afc8"},{"id":"design-button-round","group":"guide","category":"应用设计规范","title":"全圆角按钮","summary":"按场景使用全圆角动作,不改变共享管理基线。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-button-round?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"round-scope","title":"营销范围与普通命令"},{"id":"round-anatomy","title":"形状与共享交互"},{"id":"round-comparison","title":"全圆角、基础与悬浮按钮"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 全圆角按钮\n\n按场景使用全圆角动作,不改变共享管理基线。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n全圆角按钮可用于紧凑公开发现或推广场景。普通表单和应用管理保持共享标准控件圆角。形状是视觉处理,不代表新的动作优先级或权限状态。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-button_round](https://open.limeai.run/docs/design-button-round?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 一致性 | 同组采用一致形状,无场景理由不混用胶囊与普通按钮。 |\n| 内容 | 保留可读短标签,遵守相同共享高度、间距与焦点要求。 |\n\n<a id=\"round-scope\"></a>\n\n## 营销范围与普通命令\n\n全圆角按钮限定在已采纳引导、产品官网或内容营销表面。普通应用配置、认证、结账与恢复保持既有基础按钮形态。圆角本身不表示不同权限或商业承诺。\n\n<a id=\"round-anatomy\"></a>\n\n## 形状与共享交互\n\n全圆角形式改变容器形状,文案、强调、焦点、禁用及处理中行为遵循基础按钮模式。为译文保留横向空间,维持相同可访问名称与命令语义。\n\n<a id=\"round-comparison\"></a>\n\n## 全圆角、基础与悬浮按钮\n\n普通流程选基础按钮,需要有意常驻位置时选悬浮控件。营销按钮可全圆角但不悬浮,悬浮快捷入口不自动成为营销动作。同一用户旅程保持一致按钮族,不逐页切换形状。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n不将标签或过滤项当圆角按钮,除非它们确实执行命令。已选过滤需自身选择语义,处理中与禁用行为和基础按钮相同。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查形状一致、长译文与键盘焦点可见。\n2. 确认形状不是过滤与动作的唯一区别。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:ada4a2f13babbbe924b0b74fd759beb659778a8b2de6e7aaf79ef39f8b112ef8"},{"id":"design-cascader","group":"guide","category":"应用设计规范","title":"级联选择","summary":"从真实层级选择值,并展示选择路径。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-cascader?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"cascader-selection-modes","title":"末级与任意级选择"},{"id":"cascader-columns","title":"列、位置与深层树"},{"id":"cascader-selected-path","title":"已选路径与清除"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 级联选择\n\n从真实层级选择值,并展示选择路径。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n适用于路径有助区分值、规模适中的已知层级。平面选项使用选择器,大型异步树可能需要树选择。资源合同未定义时,不将用户空间权限伪装成层级。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-cascader](https://open.limeai.run/docs/design-cascader?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 选择 | 显示复选框前明确仅叶或任意级选择及单、多选模式。 |\n| 路径 | 显示足够上级以区分同名,保存稳定 ID 而非标签。 |\n| 加载 | 子级加载、空分支与失败分支分别展示。 |\n\n<a id=\"cascader-selection-modes\"></a>\n\n## 末级与任意级选择\n\n明确仅末级或任意级可选,以及单选或多选。展开与选择值保持独立。仅当数据合同规定时,父级选择才包含子级;父资源不自动授予子级权限。\n\n<a id=\"cascader-columns\"></a>\n\n## 列、位置与深层树\n\n各层级列独立滚动,宽度可容纳真实标签。面板保持在视口内,子列溢出时翻转或平移。深层或动态加载层级可能更适合树选择,而非大量横向列。\n\n<a id=\"cascader-selected-path\"></a>\n\n## 已选路径与清除\n\n按区分需要显示末级标签或完整上级路径,并保留完整可访问值。多选移除控件说明目标名称。清除改变字段值,不直接撤销真实安装或成员,除非这就是已明确的提交动作。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n展开父级不应意外选择父级。再次打开时保留已选路径,支持键盘移动与收起。窄屏优先逐层面板,不让多列溢出视口。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试同名、禁用分支及已选值删除。\n2. 验证仅叶和任意级模式不暗示不同授权。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:787ecf2a886c759614a0bc5911d65efa31e666a100271f6cd56b078f8331983f"},{"id":"design-checkbox","group":"guide","category":"应用设计规范","title":"复选框","summary":"选择相互独立的值,并明确部分选中。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-checkbox?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"checkbox-group","title":"独立选择与分组标签"},{"id":"checkbox-mixed","title":"未选、已选与部分选中"},{"id":"checkbox-target-layout","title":"热区与多行说明"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 复选框\n\n选择相互独立的值,并明确部分选中。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n复选框适合零到多个独立选择,或表述清晰的确认。互斥单选使用单选框。不相关政策同意不能预选或合并为一个复选框。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-checkbox](https://open.limeai.run/docs/design-checkbox?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 标签 | 完整可见标签关联输入,标签可作为点击目标。 |\n| 全选 | 暴露部分选中状态,明确作用当前页还是全部过滤结果。 |\n| 禁用 | 说明必要资格,不把禁用选项视为已授予权限。 |\n\n<a id=\"checkbox-group\"></a>\n\n## 独立选择与分组标签\n\n允许零个、一个或多个独立选择时使用复选框。分组有名称,各控件关联描述。复选框通常记录待提交意图;设置立即生效时才使用即时开关。\n\n<a id=\"checkbox-mixed\"></a>\n\n## 未选、已选与部分选中\n\n父级在部分相关子项被选中时可显示部分选中态。明确下一次点击行为与全选精确范围。搜索或分页不能悄悄扩大范围,也不能暗示已选从未加载或无权记录。\n\n![复选框的常规、悬停、按下、焦点、禁用与错误状态。](https://open.limeai.run/docs/assets/design/source-0053-005.png)\n\n<a id=\"checkbox-target-layout\"></a>\n\n## 热区与多行说明\n\n复选框与标签构成完整激活区,链接等嵌套动作保留独立热区。长文本优先纵向选项,方框对齐首行文字,说明可增高。可见方框较小不代表触控热区也应较小。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\nSpace 切换聚焦复选框。刷新行时保持选择稳定,失去权限的资源需移除或标明。批量操作仍逐资源后端授权。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 用键盘测试未选、已选、部分、禁用及长标签。\n2. 验证过滤与游标翻页下全选行为。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:72c0f21992d4d38ec15e15341b5aced47ff5d08307ba5e6b7f2a4cb959d3d6f1"},{"id":"design-color-picker","group":"guide","category":"应用设计规范","title":"颜色选择器","summary":"选择获准视觉值,不绕过语义主题规则。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-color-picker?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"color-picker-types","title":"限定色板与自定义色彩"},{"id":"color-picker-state","title":"当前颜色与可访问选择"},{"id":"color-picker-commit","title":"确认、取消与无色"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 颜色选择器\n\n选择获准视觉值,不绕过语义主题规则。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n颜色选择器适合应用自身图标预设或产品特有可编辑视觉。平台控件仍使用语义变量,用户任意颜色不能替换警告、错误语义或共享主题。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-color-picker](https://open.limeai.run/docs/design-color-picker?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 色板 | 使用真实获准选项,除颜色外显示明确选中标记。 |\n| 值 | 支持自定义输入时声明格式,预览保存前校验。 |\n| 对比 | 预览真实前景背景组合,为色块提供可访问名称。 |\n\n<a id=\"color-picker-types\"></a>\n\n## 限定色板与自定义色彩\n\n产品有意允许固定选择时使用限定色板,如应用预设背景。字段合同支持时才提供任意 RGB 等输入,不通过资料选色器引入自定义界面主题色。\n\n![带选中色块的紧凑色板。](https://open.limeai.run/docs/assets/design/source-0054-003.png)\n\n<a id=\"color-picker-state\"></a>\n\n## 当前颜色与可访问选择\n\n当前色块同时有可见选中标记及可访问颜色名称或值。键盘用户可到达并选择每个可用颜色。悬停是预览,已提交颜色仍须清楚,不能仅靠颜色表示选中。\n\n<a id=\"color-picker-commit\"></a>\n\n## 确认、取消与无色\n\n明确色块是立即应用,还是确认前保留草稿。取消恢复先前有效值。字段支持时才提供无色选项,手动值按允许格式及透明度规则校验。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n应用预设中颜色与图形独立选择。重置取消返回原保存值,预览在真实保存成功前仅为本地状态。不将不可信颜色字符串插入任意 CSS。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试键盘选择、色块名称及灰度下选中态。\n2. 验证预设色板变化不会重染上传图片。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:856e7e5278e7ce5e403a4cc31d3de90070b70ec54f9bf8e849fc81cdb14bc74d"},{"id":"design-date-picker","group":"guide","category":"应用设计规范","title":"日期选择器","summary":"选择输入方式前区分日历日期、时间点与范围。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-date-picker?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"date-picker-modes","title":"日期、月份、年份与范围"},{"id":"date-picker-panel","title":"输入、导航与日历状态"},{"id":"date-picker-validation","title":"输入校验与确认"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 日期选择器\n\n选择输入方式前区分日历日期、时间点与范围。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n选择日期时日历有助理解则使用日期选择器。生日或账单日期可能是日历值,事件时间则是有时区规则的时间点。存储形式由 API Schema 决定,不由界面语言决定。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-date-picker](https://open.limeai.run/docs/design-date-picker?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 输入 | 提供明确格式和键盘输入,区分可选空日期与无效值。 |\n| 范围 | 标明起止及包含边界,校验顺序,并说明不可用日期。 |\n| 时区 | 仅日期 YYYY-MM-DD 不作为时间点经 UTC 转换。 |\n\n<a id=\"date-picker-modes\"></a>\n\n## 日期、月份、年份与范围\n\n选择任务所需最小日期单位。单选择器选择一个值,联动双字段或范围面板选择起止。日期时间选择同时明确时区。仅日期的值不能因显示时区变化变成前一天。\n\n<a id=\"date-picker-panel\"></a>\n\n## 输入、导航与日历状态\n\n触发区说明字段与已选值,面板提供月份年份导航及日期。今日、已选日期、范围端点及禁用日期状态可区分。提供键盘导航与完整日期可访问名称,不仅是日数字。\n\n<a id=\"date-picker-validation\"></a>\n\n## 输入校验与确认\n\n接受已说明日期格式,校验先后与范围,不悄悄改变业务截止时间。面板有确认取消时,选择在确认前保持草稿,取消恢复原值。仅可选字段允许清除,无效输入保留并提供可用错误。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n支持年月导航,区分已选、今天与焦点。不在每次移动日历时刷新结果,按任务提交目标日期或范围。关闭日历应保留有效已输入值。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试月年边界、闰日、反向范围及不可用日期。\n2. 检查源文译文格式及切换时区不偏移仅日期值。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:da854989e23119bbb65a080daee9f9520d19b39f60e54b1a2cff4adac3dacbaf"},{"id":"design-form","group":"guide","category":"应用设计规范","title":"表单","summary":"收集完成清晰任务所需的最少字段。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-form?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"form-types","title":"基础、组合、分组与分步表单"},{"id":"form-label-layout","title":"标签位置与阅读顺序"},{"id":"form-field-layout","title":"列、联动与重复字段组"},{"id":"form-validation","title":"字段与表单校验"},{"id":"form-required-help","title":"必填与帮助提示"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 表单\n\n收集完成清晰任务所需的最少字段。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n表单用于连贯写入,相关字段分组且提交结果清晰。长任务可分节或分步,但保留校验与草稿状态。普通应用设置与高影响凭据、购买或归属动作分开。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-form](https://open.limeai.run/docs/design-form?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 字段 | 使用可见标签、明确必填可选含义与适用原生类型、自动填充。 |\n| 帮助 | 必要格式约束靠近字段显示,不依赖占位符。 |\n| 错误 | 具体错误关联字段,多处失败提供可聚焦摘要。 |\n\n<a id=\"form-types\"></a>\n\n## 基础、组合、分组与分步表单\n\n短任务用基础表单,同语义层级的紧密字段用组合表单,长表单按主题分组,仅在线性顺序确有帮助时分步。最终确认显示目标值;切换步骤本身不创建业务记录,除非合同明确规定。\n\n<a id=\"form-label-layout\"></a>\n\n## 标签位置与阅读顺序\n\n聚焦录入及长译文优先上方标签。短横向筛选可采用右对齐标签搭配字段。标签、必填含义、帮助及错误须与输入建立程序关联,占位符仅作补充,不能成为唯一标签。\n\n[design-detail-form-layout](https://open.limeai.run/docs/design-form?locale=zh-CN#form-label-layout)\n\n<a id=\"form-field-layout\"></a>\n\n## 列、联动与重复字段组\n\n单列阅读顺序最清晰,双列适合仍有足够宽度的相关短字段。标签或校验拥挤前在窄屏堆叠。字段变化影响另一字段选项时,保留有效输入,并显式清空或标明失效的依赖选择。\n\n重复字段组须有明确增删动作及稳定身份,删除限定在目标组,不把前一行错误复用于新行。栅格宽度按所在表单或弹窗计算,不自动使用整个屏幕宽度。\n\n![单列表单栅格。](https://open.limeai.run/docs/assets/design/source-0056-026.png)\n\n![双列表单栅格。](https://open.limeai.run/docs/assets/design/source-0056-027.png)\n\n![三列表单栅格。](https://open.limeai.run/docs/assets/design/source-0056-028.png)\n\n![四列表单栅格。](https://open.limeai.run/docs/assets/design/source-0056-029.png)\n\n<a id=\"form-validation\"></a>\n\n## 字段与表单校验\n\n格式及范围在字段附近校验,跨字段和业务规则在提交时校验。字段错误靠近输入,表单级失败位于相关分组或动作上方。提交失败后聚焦错误汇总或首个无效字段,同时保留用户输入。\n\n后端权限及版本校验仍为依据。写入结果未知时保留原请求及幂等键,新点击不能悄悄创建新意图。切换语言可翻译错误,但不重置表单或命令。\n\n[design-detail-form-validation](https://open.limeai.run/docs/design-form?locale=zh-CN#form-validation)\n\n<a id=\"form-required-help\"></a>\n\n## 必填与帮助提示\n\n除视觉标记外,以文字或可访问必填状态标识必填项。必要格式、权限和价格约束放在字段附近的常驻帮助。信息提示浮层只承载可选解释,用户不能依赖悬停才发现要求。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n在有意义交互或提交后校验,不逐键拒绝。服务端拒绝后保留输入,冲突后取最新 revision 并显式重提。处理中或未知写入保留原命令,不重置为空表单。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试 Enter 提交、Tab 顺序、标签、字段错误及服务端拒绝不丢数据。\n2. 检查窄屏、长译文及软键盘下活动字段和动作可见。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:6ebaa79053f4272998c2bac1d665ed86f005fac0a78217f8dbd29a0d36f5bf85"},{"id":"design-input","group":"guide","category":"应用设计规范","title":"输入框","summary":"通过标签、约束与可恢复校验支持精确输入。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-input?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"input-tokens","title":"标签化输入"},{"id":"input-variants","title":"基础、数字、属性与组合输入"},{"id":"input-icons-password","title":"标签、图标与私密值"},{"id":"input-state-multiline","title":"编辑状态与长文本"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 输入框\n\n通过标签、约束与可恢复校验支持精确输入。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n短值使用文本输入,长文使用多行输入,适用时采用专门原生类型。占位符可给示例但不能代替标签。标识、Secret、URL 与金额需不同输入及隐私行为。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-input](https://open.limeai.run/docs/design-input?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 数值 | ID 与精确金额保留字符串,不将大最小单位整数经 Number 解析。 |\n| 密码 | 采用适用自动填充与有名称显示控件,不自动记录或复制秘密。 |\n| 清除 | 可选清除按钮有名称,不悄悄提交或清空无关字段。 |\n\n<a id=\"input-tokens\"></a>\n\n## 标签化输入\n\n标签化输入区分已确认值与正在编辑的文本。明确分隔、校验及重复规则,无效文本保留可编辑并关联说明。可删除标签具有具名移除操作,移除后字段标签、焦点顺序及剩余文本仍可用。输入标签不代表已创建新业务对象。\n\n<a id=\"input-variants\"></a>\n\n## 基础、数字、属性与组合输入\n\n普通录入用文本,真实数字用有范围数字字段,固定单位用前后缀,相关但独立值用组合组。不透明标识、电话号码及前导零代码保持字符串。金额输入保持精确记录精度,避免浮点转换。\n\n<a id=\"input-icons-password\"></a>\n\n## 标签、图标与私密值\n\n常驻标签标识字段,占位符仅给示例。前置图标解释输入,尾部清除或显示控件须有名称。密码显示由用户显式选择,同时保留粘贴和密码管理器能力。私密值不复制进提示或分析文案。\n\n<a id=\"input-state-multiline\"></a>\n\n## 编辑状态与长文本\n\n区分焦点、禁用、只读及错误。长说明用文本域或自增高多行输入,并说明字符限制。分段验证码支持粘贴、更正及可访问分组,不照搬阻止单字符更正的宿主删除规则。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n区分可编辑、只读、禁用、错误和处理中。不要逐键破坏性改写输入。URL 和回调在提交前说明精确匹配及协议、主机、端口约束。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试粘贴、输入法组合、空值、空白与最大允许长度。\n2. 检查屏幕阅读器标签、帮助、错误关联及浏览器自动填充。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:8a6eca6644814188ef5a0e768e81ac81839291a38c3589157f791611c4db24fd"},{"id":"design-radio","group":"guide","category":"应用设计规范","title":"单选框","summary":"从少量可见选项中选择唯一值。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-radio?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"radio-options","title":"可见的互斥选项"},{"id":"radio-button-form","title":"基础与按钮型单选"},{"id":"radio-layout","title":"热区、多行标签与溢出"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 单选框\n\n从少量可见选项中选择唯一值。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n少量互斥选项需并列比较时使用单选框。长列表适合选择器,即时二值设置适合开关。不把仅可选一项的组标为多选。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-radio](https://open.limeai.run/docs/design-radio?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 组 | 使用 fieldset、legend 或等价有名组及稳定选项值。 |\n| 标签 | 标签可点击,选项影响实质不同处提供简短后果说明。 |\n| 默认 | 仅在合理时设默认,显式同意或高影响选择不能预批准。 |\n\n<a id=\"radio-options\"></a>\n\n## 可见的互斥选项\n\n少量可见选项中仅选一项时使用单选框,让用户选择前可比较。分组有名称,使用稳定值,并明确是否必须有初始选择。大量选项可改用可搜索选择器。\n\n<a id=\"radio-button-form\"></a>\n\n## 基础与按钮型单选\n\n基础形式强调标签,按钮型强调选项自身。两者保持一个已选值及相同键盘单选组行为。外观像选中的动作按钮,只有具备真实分组语义时才是单选项。\n\n<a id=\"radio-layout\"></a>\n\n## 热区、多行标签与溢出\n\n完整说明标签与单选控件关联。长选项优先纵向排列,圆点对齐首行。按钮型标签保持简短,截断时提供完整选项名,并确保触控用户也能发现。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n方向键在组内移动,Tab 进入或离开组。表单选项变化不应意外提交或跳转。选择后展示额外字段时保持布局与焦点可预测。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试未选、默认、禁用项及长说明。\n2. 验证方向键行为,并确认只有提交值影响服务端命令。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:0e92b0c7c1efb2c00c80c39d6ac20ed8057801a81c66761646e616a41f3e4200"},{"id":"design-rating","group":"guide","category":"应用设计规范","title":"评分","summary":"以明确量尺和用途收集主观反馈。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-rating?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"rating-types","title":"星级评分与好评差评"},{"id":"rating-precision","title":"步长、预览与确认分数"},{"id":"rating-change-clear","title":"修改与清除评分"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 评分\n\n以明确量尺和用途收集主观反馈。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n主观有序意见适合评分,二元问题使用赞或不赞。评分不是批准、安全分或已验证购买事实。说明评价对象与反馈用途。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-rate](https://open.limeai.run/docs/design-rating?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 量尺 | 明确最小、最大、步长与文字含义,不从未定义量尺推导精确均分。 |\n| 控件 | 向键盘和屏幕阅读器暴露已选值与标签,不仅靠星形填充。 |\n| 可选 | 允许不回答,适用时允许修改,不额外收集无关身份数据。 |\n\n<a id=\"rating-types\"></a>\n\n## 星级评分与好评差评\n\n需要量化分数时用星级,需要快捷二元反馈时用好评差评。说明量尺及含义。仅展示评分不是可编辑控件,未评分也不同于零分。\n\n<a id=\"rating-precision\"></a>\n\n## 步长、预览与确认分数\n\n明确整星或半星输入,向键盘与辅助技术用户提供精确当前值。悬停可预览,但选择前不覆盖已确认评分。选择后保留对应说明,文字可换行。\n\n<a id=\"rating-change-clear\"></a>\n\n## 修改与清除评分\n\n明确再次选择同值是清除还是保持,星级及紧凑变体保持相同规则。后续理由属于用户当前选择。自定义图形可改变外观,但须保留可理解量尺及足够热区。\n\n![五颗星中选中三颗的评分。](https://open.limeai.run/docs/assets/design/source-0059-011.png)\n\n![不同最大星数的评分量表。](https://open.limeai.run/docs/assets/design/source-0059-012.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n区分悬停预览、已选值与真实提交。接收确认后再显示结果,不反复催促已关闭用户,也不自动加入营销。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试键盘调整、不回答、修改及提交失败。\n2. 检查量尺译文与不依赖颜色的选中态。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:96879d04ba23d37fc440e5cb46ff48f3f496133187dd52c39e0eb85bcf0bda4b"},{"id":"design-select","group":"guide","category":"应用设计规范","title":"选择器","summary":"从有界选项集选择一个或多个稳定值。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-select?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"select-modes","title":"单选、多选与复杂选项"},{"id":"select-search-create","title":"搜索、清除与创建选项"},{"id":"select-keyboard-placement","title":"键盘、位置与长选择"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 选择器\n\n从有界选项集选择一个或多个稳定值。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n列表过长、不适合并列单选或复选时使用选择器。搜索、单多选和自定义创建须明确。语言选择读取登记选项,Scope 选择使用允许的稳定身份,不用翻译标签。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-select](https://open.limeai.run/docs/design-select?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 选项 | 保存稳定值,展示清晰标签,仅对真正相关选项分组。 |\n| 搜索 | 区分搜索无匹配、来源为空、无权限和网络失败。 |\n| 多选 | 展示数量或已选值,移除控件有名称,不截断全部关键上下文。 |\n\n<a id=\"select-modes\"></a>\n\n## 单选、多选与复杂选项\n\n选择器编辑在触发区回显的值。单选通常选后关闭,多选保持已选项可识别和可移除。选项可包含头像、说明或状态,但可访问名称仍须识别对应选择。\n\n<a id=\"select-search-create\"></a>\n\n## 搜索、清除与创建选项\n\n搜索文字与已有选择相互独立。区分加载、无匹配、无权选项及查询失败,旧响应不能覆盖新查询。只有存在真实获授权创建流程时才显示创建,并将该写入与选择已有值分开。\n\n<a id=\"select-keyboard-placement\"></a>\n\n## 键盘、位置与长选择\n\n支持方向键、Enter 与 Escape,区分活动选项及已选值。弹层限制在视口内,需要时翻转。多选可在合理范围增高,或显示有名称的剩余数量;不能用无解释数字替代完整选择含义。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n交互适用时优先原生 select。自定义组合框需键盘导航、有名展开状态与焦点管理。可选值显式清除,已存选项失去资格时显示无效,不悄悄换成其他值。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试长列表、同名、异步搜索及已选项被移除。\n2. 检查键盘选择、Escape、焦点恢复与窄屏定位。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:5dd11dcb0214a6abc033ff83b547b3621ee9af7965ba9d949db623df2fe0381a"},{"id":"design-slider","group":"guide","category":"应用设计规范","title":"滑动输入条","summary":"调整有界近似值,并保留精确可访问替代方式。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-slider?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"slider-range","title":"有界数值与双滑块"},{"id":"slider-input","title":"指针、键盘与精确输入"},{"id":"slider-marks","title":"纵向形式与节点"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 滑动输入条\n\n调整有界近似值,并保留精确可访问替代方式。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n相对调整直观时(如预览缩放)可用滑动条。精确价格、标识或安全关键配置避免滑动条。范围需区分两端并定义是否包含边界。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-slider](https://open.limeai.run/docs/design-slider?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 量尺 | 暴露最小、最大、步长、当前值与单位,非线性量尺需解释。 |\n| 输入 | 提供键盘调整,数值重要时提供精确数字输入。 |\n| 范围 | 双滑块名称独立,防止意外交叉或顺序含糊。 |\n\n<a id=\"slider-range\"></a>\n\n## 有界数值与双滑块\n\n滑动条适合已知范围内的近似调整。双滑块选择区间,明确是否允许交叉或互换角色,始终提供最终最小与最大值。少量离散选择用单选通常比滑动条清楚。\n\n![含数字浮层与刻度的滑杆编号结构图。](https://open.limeai.run/docs/assets/design/source-0061-001.png)\n\n<a id=\"slider-input\"></a>\n\n## 指针、键盘与精确输入\n\n拖动、点击轨道及键盘步进更新同一值。当前值带单位,需要精确时提供直接输入。联动输入与滑块共享范围及步长,不将精确业务值舍入丢失。\n\n![滑杆轨道与滑块的像素尺寸。](https://open.limeai.run/docs/assets/design/source-0061-002.png)\n\n![与数字步进器同步的滑杆。](https://open.limeai.run/docs/assets/design/source-0061-007.png)\n\n![带端点数值的数字滑杆与音量滑杆。](https://open.limeai.run/docs/assets/design/source-0061-008.png)\n\n<a id=\"slider-marks\"></a>\n\n## 纵向形式与节点\n\n仅在符合物理或空间模型时使用纵向形式。节点标识有意义数值并可直接选择,非线性量尺须解释。端点、已选区间和焦点滑块不能仅靠颜色区分。\n\n![垂直单值滑杆与范围滑杆。](https://open.limeai.run/docs/assets/design/source-0061-005.png)\n\n![带数字间距标注的滑杆刻度。](https://open.limeai.run/docs/assets/design/source-0061-006.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n拖动预览数值,真实保存按任务显式提交规则执行。不逐指针移动发受保护写入。焦点保持在活动滑块,适用时支持键盘粗细调整。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试端点、触控热区、键盘步长与文字等价值。\n2. 验证高缩放和减少动态效果不隐藏当前值。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:9855ba72d93c82bc84d4404e3661052b763a449a562f0eaa9dc498726c1f6800"},{"id":"design-stepper","group":"guide","category":"应用设计规范","title":"步进器","summary":"以明确单位和精确整数规则调整有界数量。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-stepper?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"stepper-bounds","title":"小范围有界整数调整"},{"id":"stepper-editing","title":"增减、直接输入与边界"},{"id":"stepper-states","title":"重复输入、焦点与展示"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 步进器\n\n以明确单位和精确整数规则调整有界数量。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n数量有自然增量时(如商品件数)使用步进器。它不是流程步骤条。不用通用数字解析器处理最小单位金额字符串或不透明标识。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-stepper](https://open.limeai.run/docs/design-stepper?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 边界 | 声明最小、最大、步长与单位,抵达边界仅禁用对应方向。 |\n| 输入 | 有用时允许直接输入,并校验接受数字格式。 |\n| 按钮 | 增加、减少动作有名称,保留可用热区。 |\n\n<a id=\"stepper-bounds\"></a>\n\n## 小范围有界整数调整\n\n步进器用于有意义单位的精确小数量调整,如件数。明确最小、最大及步长。不透明标识和大范围自由数值使用输入框;币种小数不是因为传输格式含数字就变成数量步进器。\n\n![数字步进器的编号结构图。](https://open.limeai.run/docs/assets/design/source-0062-001.png)\n\n<a id=\"stepper-editing\"></a>\n\n## 增减、直接输入与边界\n\n增减与直接录入更新同一值,到边界时禁用对应动作并解释无效输入。除非任务明确说明,否则不在失焦时悄悄把重要金额或数量压到上下限,应保留用户意图供更正。\n\n<a id=\"stepper-states\"></a>\n\n## 重复输入、焦点与展示\n\n支持长按时,在松开、指针取消、失焦或边界处停止重复。向辅助技术暴露当前数值及范围。字段与按钮采用共享控件高度对齐,区分禁用、处理中及错误。\n\n![数字步进器尺寸及按钮间距。](https://open.limeai.run/docs/assets/design/source-0062-003.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n长按可重复本地调整,但不能重复服务端购买。商业命令提交时由服务端重新计算资格与价格。数量不可用应给具体修正,不在付款后悄悄截断。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试零、最大值、无效文字输入及服务端数量变化。\n2. 验证键盘和触控不会重复提交订单。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:4dee6a761a9c99a4526039bebc2e88b8af6fbebd8d2f920cbfe633ea4f992d7e"},{"id":"design-switch","group":"guide","category":"应用设计规范","title":"开关","summary":"以明确生效边界修改二值设置。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-switch?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"switch-choice","title":"开关、单选与复选"},{"id":"switch-commit","title":"即时生效与表单草稿"},{"id":"switch-accessibility","title":"状态、尺寸与可访问含义"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 开关\n\n以明确生效边界修改二值设置。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n可逆且自然开关的二值设置适合开关。稍后统一保存的表单布尔值可用复选框。启用正式凭据、扩权或付款需实际任务流程,不用误导简单开关替代。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-switch](https://open.limeai.run/docs/design-switch?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 标签 | 两态保持同一设置名称,语义暴露 checked。 |\n| 生效 | 说明立即生效或保存后生效,同一表单不混淆。 |\n| 处理中 | 避免竞争更新,失败时显示恢复,不假称请求状态已确认。 |\n\n<a id=\"switch-choice\"></a>\n\n## 开关、单选与复选\n\n开关改变一个二元设置,单选从集合中选一项,复选记录独立选择。标签命名设置而非仅命名动作,使开关状态始终可理解。版本批准、所有权转移等重要命令不使用开关。\n\n![开关控件的编号结构示意。](https://open.limeai.run/docs/assets/design/source-0063-001.png)\n\n<a id=\"switch-commit\"></a>\n\n## 即时生效与表单草稿\n\n明确切换是立即提交,还是编辑待保存表单。即时设置显示处理中,失败后恢复或核对最后确认值。表单内开关可控制联动字段,最终保存仍为提交边界。\n\n<a id=\"switch-accessibility\"></a>\n\n## 状态、尺寸与可访问含义\n\n以程序语义暴露开关状态并支持键盘激活。开关、禁用及处理中除颜色外也能区分。按可用空间和热区选择尺寸,不以大小表达父子权限关系。\n\n![开关的开启、关闭、禁用与加载状态。](https://open.limeai.run/docs/assets/design/source-0063-004.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\nSpace 切换聚焦开关。更新中将原确认值与目标值分开保留。认证到期时保留目标修改供检查,重新认证后显式提交。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试开、关、禁用、处理中、拒绝与旧 revision。\n2. 验证刷新及切换账号后视觉状态符合服务端。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:c6a4747c6e2b9d23b9fe676891fdc74790e48e5541476b610c551335285b3f18"},{"id":"design-tree-select","group":"guide","category":"应用设计规范","title":"树选择","summary":"选择层级资源,将选择与展开分开。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tree-select?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"tree-modes","title":"导航、单选与多选"},{"id":"tree-cascade","title":"父子选择规则"},{"id":"tree-search-overflow","title":"搜索、当前位置与溢出"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 树选择\n\n选择层级资源,将选择与展开分开。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n真实资源层级有助寻找值、特别是可展开分支时使用树选择。导航树打开内容,不是选择表单值。没有明确授权规则时不能假定选择父级授予全部后代权限。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-tree-select](https://open.limeai.run/docs/design-tree-select?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 模式 | 明确单多选、父子传播与部分选中语义。 |\n| 身份 | 使用稳定资源 ID,显示区分同名上级,并保留清晰已选摘要。 |\n| 异步 | 区分未加载子级、空分支、加载失败与无权分支。 |\n\n<a id=\"tree-modes\"></a>\n\n## 导航、单选与多选\n\n树可用于导航层级或选择值,但这是不同任务。明确哪些层级可选,以及单选或多选。展开箭头独立于选择热区,保留有用上级路径。\n\n<a id=\"tree-cascade\"></a>\n\n## 父子选择规则\n\n勾选树可把父级定义为子项集合,部分子项对应部分选中态;另一棵树也可能把父级视为独立值。按资源合同确定规则,包含已加载与未加载子项,不能从视觉祖先推导权限。\n\n<a id=\"tree-search-overflow\"></a>\n\n## 搜索、当前位置与溢出\n\n搜索结果保留足够层级以区分同名项。重新打开时揭示已选位置并保留当前值。限制弹层尺寸,允许有意滚动,让长已选标签可访问;父级收起不能使隐藏活动子项无法到达。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n方向键展开、收起并移动节点,选择遵守声明模式。搜索不能悄悄选中全部匹配项。已选资源被移除或失权后,提交前需显示无效状态。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试深分支、同名节点、部分选中与未加载后代。\n2. 检查窄屏替代方式,不出现横向多列溢出。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:36bbb0344647d3ec66f09a7b478b119a8725d4b9fb0bc46c90aeb2a65a33688a"},{"id":"design-transfer","group":"guide","category":"应用设计规范","title":"穿梭框","summary":"提交有界分配前比较可选与已选条目。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-transfer?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"transfer-panels","title":"可选区与已选区"},{"id":"transfer-search-move","title":"选择、搜索、移除与排序"},{"id":"transfer-adaptation","title":"滚动、折行与窄屏"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 穿梭框\n\n提交有界分配前比较可选与已选条目。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n需比较适量可选与已选条目时使用穿梭框。少量集合用复选框,大型可搜索集合优先受限选择器。本地移行是草稿选择,不立即授予权限。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-transfer](https://open.limeai.run/docs/design-transfer?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 面板 | 两面板有名称,显示相关数量,移动移除动作有可访问名。 |\n| 搜索 | 明确搜索作用可选、已选或两者,保留过滤外已选项。 |\n| 顺序 | 仅在顺序有意义时支持拖动,并提供等价键盘动作。 |\n\n<a id=\"transfer-panels\"></a>\n\n## 可选区与已选区\n\n可选区显示获授权选项,已选区显示当前集合及明确移除控件。标题与计数说明各区范围。可选项可按树组织,已选项可平铺,但须保留足够路径避免歧义。\n\n<a id=\"transfer-search-move\"></a>\n\n## 选择、搜索、移除与排序\n\n搜索过滤可选视图,不清除有效选择。全选说明针对可见结果还是完整获授权集合。移除针对单个已选项,可选排序须有键盘替代。清空全部是有意操作,本身不撤销服务端成员关系。\n\n<a id=\"transfer-adaptation\"></a>\n\n## 滚动、折行与窄屏\n\n列表滚动时标题及搜索保持可达。多行条目的选择控件对齐首行,详情文字可增高。两区放不下时采用有意上下或分阶段布局,并显示已选数量,不缩小文字和热区。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n批量移动明确作用可见匹配还是全部可选项。保存采用当前 revision,后端逐项校验。窄屏使用堆叠面板或单一选择摘要,不压缩双列。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试过滤全选、不可用项与同名。\n2. 验证纯键盘添加移除及保存拒绝后保留状态。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:3365a838250718489bca52043edebf661775d89f38a9a3130333fd345cad6a2b"},{"id":"design-time-picker","group":"guide","category":"应用设计规范","title":"时间选择器","summary":"以明确时区及日期关系选择时间。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-time-picker?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"time-granularity","title":"组合与独立时间选择"},{"id":"time-input-constraints","title":"输入值、禁用时间与清除"},{"id":"time-date-range","title":"日期时间范围与确认"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 时间选择器\n\n以明确时区及日期关系选择时间。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n时钟精度重要时使用时间选择器。预约需日期和时区,重复本地时间需明确夏令时行为。不根据语言推断时区,也不把仅时间值悄悄转换为今天时间点。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-time-picker](https://open.limeai.run/docs/design-time-picker?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 格式 | 明确十二或二十四小时显示、所需精度与单位,支持键盘输入。 |\n| 范围 | 定义起止包含边界及是否可跨午夜。 |\n| 可用性 | 说明不可用时间原因,区分空值与无效。 |\n\n<a id=\"time-granularity\"></a>\n\n## 组合与独立时间选择\n\n少量固定间隔可用时分组合选项,需要更精细时使用独立列。明确允许步长及秒是否有意义。按所选格式显示十二或二十四小时,不改变存储时刻或时区。\n\n![24小时时间选择器的编号结构图。](https://open.limeai.run/docs/assets/design/source-0066-001.png)\n\n![时、分、秒三列数字选项。](https://open.limeai.run/docs/assets/design/source-0066-008.png)\n\n<a id=\"time-input-constraints\"></a>\n\n## 输入值、禁用时间与清除\n\n键入及面板选择遵守相同格式和范围。解释无效或禁用时间,涉及日期时也说明时区造成的缺失时刻。可选字段允许清空,不未经明确规则就把未填时间变成零点或当前时间。\n\n![24小时数字输入及清除控件状态。](https://open.limeai.run/docs/assets/design/source-0066-009.png)\n\n<a id=\"time-date-range\"></a>\n\n## 日期时间范围与确认\n\n选择区间时联动校验起止并说明时区。此刻快捷入口是显式选择,不是不断变化的默认值。有确认底栏时,区分草稿与先前提交值,取消行为可预测。\n\n![数字日期与时间范围输入组合。](https://open.limeai.run/docs/assets/design/source-0066-015.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n调整时分在目标提交前保持本地。结合日期时,按所选时区验证不存在或重复本地时间。给明确确认或修正,不悄悄移动用户目标时间。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试午夜、日末、精度限制与夏令时变化。\n2. 检查源文译文格式、键盘控件与窄屏弹层位置。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:d51f00efea5f8731fcb85033c7a3dc5d275f6ecf357a5900ccae1bbd94741969"},{"id":"design-upload","group":"guide","category":"应用设计规范","title":"上传","summary":"说明接受文件、传输状态及上传与已保存配置的区别。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-upload?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"upload-modes","title":"选择、拖拽与图片墙"},{"id":"upload-file-state","title":"逐文件进度与恢复"},{"id":"upload-import-preview","title":"导入校验与安全预览"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 上传\n\n说明接受文件、传输状态及上传与已保存配置的区别。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n仅对有真实获授权文件合同的功能使用上传,例如应用图片。设计指南不会创建通用文件存储 API。支持拖放时仍提供普通文件选择。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-upload](https://open.limeai.run/docs/design-upload?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 约束 | 选择前说明接受类型、数量、大小与适用图片尺寸。 |\n| 状态 | 区分已选、校验、传输、已接收、已拒绝及配置已保存。 |\n| 内容 | 服务端校验并处理文件名,不仅信任扩展名或浏览器 MIME。 |\n\n<a id=\"upload-modes\"></a>\n\n## 选择、拖拽与图片墙\n\n文件选择按钮是可访问基线,拖拽是附加路径。图片墙适合有界图片集合,上传、预览及移除动作保持独立。选择前说明允许格式、大小及数量,随后服务端校验真实字节。\n\n<a id=\"upload-file-state\"></a>\n\n## 逐文件进度与恢复\n\n逐文件展示等待、传输、校验、成功及失败,并提供可用原因及获授权重试或取消。已选预览不证明上传完成。合同支持恢复时保留原上传身份,不悄悄丢弃超量文件或失败项。\n\n<a id=\"upload-import-preview\"></a>\n\n## 导入校验与安全预览\n\n结构化导入可能需要模板、校验结果及显式最终提交,上传文件不是导入成功。预览遵守与来源相同访问规则,文件名安全转义。不能仅凭设计模式就承诺通用文件夹、任意文件存储或原生宿主上传管理器。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n按真实合同提供可取消传输或明确处理中。重试不应生成重复资源,支持时保留原上传身份。移除本地预览不证明存储内容已删除;私有预览遵守来源权限。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试无效类型、超限、断网、重试与图片解码失败。\n2. 检查键盘选文件、有名移除及文件名预览不泄露秘密。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:581ddf2cb84dbf3d4fdd4e5f716fdb1bff8e8547ff82995aba3ecf7e7788515d"},{"id":"design-avatar","group":"guide","category":"应用设计规范","title":"头像","summary":"表示人员或应用,不将外观视为已验证身份。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-avatar?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"identity-and-shape","title":"对象、形状与内容"},{"id":"sizing-and-cropping","title":"尺寸、安全区与填充"},{"id":"loading-and-fallback","title":"加载与回退"},{"id":"attached-indicators","title":"附加状态标记"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 头像\n\n表示人员或应用,不将外观视为已验证身份。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n人员使用人物头像,应用使用既有 AppIcon。可见名称仍是主要区分。图片或首字母仅为展示数据,不能确定账号关联、企业成员或认证状态。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-avatar](https://open.limeai.run/docs/design-avatar?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 图片 | 采用一致裁剪并保留宽高比,缺图或失败显示稳定替代。 |\n| 名称 | 相邻已有姓名时避免屏幕阅读器重复,独立资料控件需有名称。 |\n| 附标 | 附加状态用文字说明,不以装饰对勾暗示认证。 |\n\n<a id=\"identity-and-shape\"></a>\n\n## 对象、形状与内容\n\n人物使用圆形头像,应用及组织使用有明确区别的标识。头像可包含照片、图标或文字回退。图形帮助识别,涉及对象判断时仍保留可读名称。\n\n![四种通用头像背景色。](https://open.limeai.run/docs/assets/design/source-0068-006.png)\n\n![不同背景色上的默认人物头像。](https://open.limeai.run/docs/assets/design/source-0068-008.png)\n\n![三种尺寸的重叠头像组及数字溢出计数。](https://open.limeai.run/docs/assets/design/source-0068-009.png)\n\n![带溢出计数及尺寸的紧凑头像组。](https://open.limeai.run/docs/assets/design/source-0068-011.png)\n\n![采用四像素间距的头像组溢出示例。](https://open.limeai.run/docs/assets/design/source-0068-013.png)\n\n<a id=\"sizing-and-cropping\"></a>\n\n## 尺寸、安全区与填充\n\n按用途选择尺寸,紧凑列表、详情标题与身份选择器的强调程度不同。图标四周保留安全区,照片有意裁切,上传的应用标识保持原比例。不将低清预览放大后当作原图。\n\n<a id=\"loading-and-fallback\"></a>\n\n## 加载与回退\n\n加载时保持头像区域稳定,失败时提供可访问回退。Lime 应用图标遵循共享 AppIcon 合同,使用已配置预设或上传原图。参考中的自动取字和轮换色板属于示例系统,不是 Lime 已支持的生成规则。\n\n<a id=\"attached-indicators\"></a>\n\n## 附加状态标记\n\n区分协作或在线状态标记与未读或更新徽标,各自在固定角落展示并保留分隔边缘,以文字说明含义。标记不能遮住主体,也不能在无事实源时暗示身份已验证、在线或任务完成。\n\n![头像占位图和人物头像上的状态圆点。](https://open.limeai.run/docs/assets/design/source-0068-025.png)\n\n![带数字通知计数的头像徽标位置。](https://open.limeai.run/docs/assets/design/source-0068-027.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n仅在实际支持且有权时提供预览、资料跳转等动作。替代姓名保持转义,切换账号后避免泄露其他空间缓存图片。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试缺图、慢图、无效 URL、长姓名与相同首字母。\n2. 验证可访问名称与切换账号后的图片缓存隔离。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:e5742aa36666ce04fe950067191e645bd0459451760826b0963076b61f4084d5"},{"id":"design-badge","group":"guide","category":"应用设计规范","title":"徽标","summary":"提示简短数量或状态,不替代底层信息。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-badge?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"indicator-types","title":"圆点、计数与文字"},{"id":"emphasis-and-placement","title":"提示强度与位置"},{"id":"count-and-clearing","title":"大计数与清除"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 徽标\n\n提示简短数量或状态,不替代底层信息。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n徽标用于对象附近相关数量、新项目提示或小型状态,服务当前任务,不持续制造紧迫感。本地界面徽标不代表支持飞书宿主应用角标。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-badge](https://open.limeai.run/docs/design-badge?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 数量 | 定义来源与未读含义,99+ 等封顶显示需提供完整可访问含义。 |\n| 状态 | 使用有标签状态,不只靠颜色;不把估计当确认数量。 |\n| 位置 | 附于对象且不遮挡名称、关闭动作或焦点。 |\n\n<a id=\"indicator-types\"></a>\n\n## 圆点、计数与文字\n\n圆点表示存在更新,计数用于可测数量,短文字表示明确状态。图标徽标仅在含义熟悉或有可访问名称时传递类别。同一个数字不能同时含糊表示未读数与全部记录数。\n\n![圆点徽标与数字徽标的编号结构图。](https://open.limeai.run/docs/assets/design/source-0069-001.png)\n\n<a id=\"emphasis-and-placement\"></a>\n\n## 提示强度与位置\n\n小徽标附着于相关入口或对象,角落位置一致,避免被容器裁切。仅对需要强调的信息使用强状态色,普通总量可用中性色。保持原目标可操作,避免一个图标堆叠多个竞争标记。\n\n![通用头像上的圆点徽标尺寸对比。](https://open.limeai.run/docs/assets/design/source-0069-012.png)\n\n![数字徽标计数及溢出省略符号。](https://open.limeai.run/docs/assets/design/source-0069-013.png)\n\n<a id=\"count-and-clearing\"></a>\n\n## 大计数与清除\n\n99+ 等视觉上限可节省空间,可访问说明仍须明确统计对象,并在可获得时提供完整数量。未读及已清除状态来自真实通知或任务记录;隐藏徽标不等于源任务已完成,也不证明邮件已送达。\n\n![浅色和深色邮件图标上的通知圆点。](https://open.limeai.run/docs/assets/design/source-0069-018.png)\n\n![头像占位图和人物头像上的状态徽标。](https://open.limeai.run/docs/assets/design/source-0069-019.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n数量从权威状态更新,不在未知操作后盲目减数。通知已读表示用户记录变化,不证明邮件已送达或财务任务完成。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 检查零、大数量、未知加载值及描述译文。\n2. 验证灰度下可理解,且不反复打断屏幕阅读器。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:22da6c579defc945858d4d1383265e9dbc45c2894b170afd1131da60818455ae"},{"id":"design-card","group":"guide","category":"应用设计规范","title":"卡片","summary":"组织连贯对象或任务,避免多余装饰。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-card?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"container-and-emphasis","title":"容器与层次"},{"id":"content-and-actions","title":"信息与操作配置"},{"id":"click-regions","title":"点击热区与选择"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 卡片\n\n组织连贯对象或任务,避免多余装饰。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n卡片改善扫描时,使用共享 Card 表示独立对象或任务摘要。长文或简单表单不必每段装卡。应用摘要、商业报价与版本状态通过真实内容区分。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-card](https://open.limeai.run/docs/design-card?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 结构 | 包含简洁对象标题、必要字段与清晰主目的地或动作。 |\n| 容器 | 使用共享面板圆角及细中性边框,不用装饰侧边或常规阴影。 |\n| 交互 | 不在整卡按钮链接内嵌按钮,独立行动作保持语义。 |\n\n<a id=\"container-and-emphasis\"></a>\n\n## 容器与层次\n\n通过清晰标题与有边界的阅读区域聚合同维信息。使用共享背景、圆角与细边框,Lime 克制使用阴影。背景或高程变化须表达实际层级,避免所有卡片同等突出。\n\n![卡片编号结构及分离的表面层次。](https://open.limeai.run/docs/assets/design/source-0070-001.png)\n\n![中性背景上的浅色卡片表面。](https://open.limeai.run/docs/assets/design/source-0070-011.png)\n\n![白色背景上的弱化卡片表面。](https://open.limeai.run/docs/assets/design/source-0070-012.png)\n\n![白色背景上的描边卡片。](https://open.limeai.run/docs/assets/design/source-0070-013.png)\n\n![中性背景上的描边卡片。](https://open.limeai.run/docs/assets/design/source-0070-014.png)\n\n![两张具有轻微层次的卡片。](https://open.limeai.run/docs/assets/design/source-0070-016.png)\n\n![卡片边框与阴影对比。](https://open.limeai.run/docs/assets/design/source-0070-017.png)\n\n![中性背景上的两张浮起卡片。](https://open.limeai.run/docs/assets/design/source-0070-018.png)\n\n<a id=\"content-and-actions\"></a>\n\n## 信息与操作配置\n\n为标题、元数据、插图及可选操作建立稳定布局。优先展示重要信息,相关字段相邻,内边距一致。卡片内复用的字段、标签及表单控件仍遵循各自组件规则。\n\n![在中性卡片表面中突出显示内容区域。](https://open.limeai.run/docs/assets/design/source-0070-023.png)\n\n<a id=\"click-regions\"></a>\n\n## 点击热区与选择\n\n明确卡片用于打开详情、选择条目还是仅组织信息。整卡为链接时,内部按钮保持独立有效热区,不能嵌套链接或按钮。提供焦点及选中状态;仅在排序为真实可保存业务操作时启用拖动。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n可跳转卡片应有真实有名链接供键盘到达。更多等次级动作不能同时触发整卡跳转。处理中错误属于实际动作,不锁定无关卡片。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试长标题、缺图、卡片动作与窄屏单列。\n2. 检查焦点顺序及单卡动作不影响另一对象。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:49de5865e12acc93594ee665abff97ce2eab7e18426f7a0ccdaacfe732fe0f73"},{"id":"design-collapse","group":"guide","category":"应用设计规范","title":"折叠面板","summary":"收起可选详情,必要决定信息保持可见。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-collapse?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"disclosure-anatomy","title":"折叠结构与箭头"},{"id":"trigger-and-state","title":"触发区域与展开状态"},{"id":"content-and-nesting","title":"内容、嵌套与必要信息"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 折叠面板\n\n收起可选详情,必要决定信息保持可见。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n补充说明、成组设置或长参考详情可用折叠面板。不能将实质价格、权限、不可逆后果或未知结果恢复藏在无名展开后。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-collapse](https://open.limeai.run/docs/design-collapse?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 标题 | 使用真实展开按钮,提供展开状态与面板关联。 |\n| 模式 | 明确独立折叠或手风琴模式,不在每次操作后强制全部收起。 |\n| 嵌套 | 限制嵌套层数,标题语义与切换保持清晰。 |\n\n<a id=\"disclosure-anatomy\"></a>\n\n## 折叠结构与箭头\n\n折叠项包含常驻标题、展开控件及可选内容分隔。一组内箭头规则一致,方向箭头随展开状态旋转。标题旁装饰状态图标不能替代控件的可访问名称。\n\n<a id=\"trigger-and-state\"></a>\n\n## 触发区域与展开状态\n\n可选择箭头、标题或整行触发,并明确热区。触发器使用带 aria-expanded 的按钮,与受控区域建立关系。普通刷新保留用户展开状态,区分一次仅开一项的手风琴与可独立展开的分组。\n\n<a id=\"content-and-nesting\"></a>\n\n## 内容、嵌套与必要信息\n\n嵌套分组使用一致缩进与分隔,控制层数以便浏览。展开内容中的独立控件不能意外切换父项。当前决策所需的价格、阻断错误与恢复操作不能藏在未展开内容中。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\nEnter 或 Space 展开收起,不触发跳转。收起前安全处理内部焦点。深链目标位于关闭面板内时应展开,校验错误不能持续隐藏。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试键盘切换、内部焦点、深锚点及收起组内错误。\n2. 检查高度变化及减少动态效果时不丢阅读位置。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:fa5a773d2afd2734899871e0a1f5cec6f472039d4bdad1d4fa19d74d63c18c5c"},{"id":"design-empty","group":"guide","category":"应用设计规范","title":"空状态","summary":"说明为何没有内容,并提供相关后续操作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-empty?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"identify-the-state","title":"先确认真实状态"},{"id":"feedback-anatomy","title":"反馈结构与后续动作"},{"id":"initialization","title":"首次使用引导"},{"id":"position-and-responsiveness","title":"容器定位与适配"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 空状态\n\n说明为何没有内容,并提供相关后续操作。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n集合确实为空或有效无结果时使用共享 Empty。区分新空间、搜索无匹配、无权限、加载及来源失败。通用无数据不能隐藏错误或假装功能已交付。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-empty](https://open.limeai.run/docs/design-empty?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 说明 | 命名缺失对象或结果,简短客观说明原因。 |\n| 动作 | 仅在真实可用且允许时提供创建、清除过滤、重试或申请权限。 |\n| 图示 | 克制图形仅辅助语境,不代替文字。 |\n\n<a id=\"identify-the-state\"></a>\n\n## 先确认真实状态\n\n区分真实零记录、搜索无匹配、尚未选择、权限拒绝与请求失败,每种状态提供对应说明和恢复。建设中页面不是查询成功后的零记录;任务成功完成也不是失败空态。\n\n<a id=\"feedback-anatomy\"></a>\n\n## 反馈结构与后续动作\n\n通过共享 Empty 组织标题、说明及相关操作。小插图可解释状态,后续动作仍是视觉重点。恢复应明确为清除筛选、选择记录或重试,仅在用户具备创建能力时提供创建入口。\n\n<a id=\"initialization\"></a>\n\n## 首次使用引导\n\n首次使用页面可说明能力,或提供第一个配置任务。插图、说明与主操作围绕该任务;只有执行真实配置步骤时才使用表单或分类入口。配置成功前不能展示已完成或已启用状态。\n\n![人物、信封与表单的通用插画。](https://open.limeai.run/docs/assets/design/source-0072-031.png)\n\n![人物处理代码与反馈控件的通用插画。](https://open.limeai.run/docs/assets/design/source-0072-032.png)\n\n![人物与媒体控件的通用插画。](https://open.limeai.run/docs/assets/design/source-0072-033.png)\n\n![人物整理数字界面的通用插画。](https://open.limeai.run/docs/assets/design/source-0072-034.png)\n\n![人物与资料卡片的通用插画。](https://open.limeai.run/docs/assets/design/source-0072-035.png)\n\n<a id=\"position-and-responsiveness\"></a>\n\n## 容器定位与适配\n\n紧凑空态在所属模块内居中,不以整个视口为中心。相邻空模块保持一致对齐。宽屏首次引导可图文并列,窄屏改为上下布局,保留安全边距并缩放插图,不缩小操作和说明文字。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n无匹配后保留过滤供修改。无权状态不泄露私有资源详情。建设中页面说明真实状态,不显示没有可用路径的创建按钮。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试首次使用、无匹配、来源失败、无权限及新建项出现。\n2. 验证键盘焦点和登记语言下有效动作标签。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:965a57d96f055374d3196bb8acc203bb851ace4428c1c54023d51c3d1b3d7f4a"},{"id":"design-image-viewer","group":"guide","category":"应用设计规范","title":"图片预览","summary":"在安全来源权限下查看图片,并清晰返回原任务。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-image-viewer?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"thumbnail-and-preview","title":"缩略图与预览容器"},{"id":"navigation-and-actions","title":"图片导航与可用操作"},{"id":"zoom-and-fitting","title":"缩放、适配与超出区域"},{"id":"keyboard-and-dismissal","title":"键盘操作与退出"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 图片预览\n\n在安全来源权限下查看图片,并清晰返回原任务。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n缩略图不足以展示细节时(如应用展示图)使用预览。查看图片不授予私有原图权限。提供有效替代文本或上下文,不仅靠截图传达必要条款。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-imageviewer](https://open.limeai.run/docs/design-image-viewer?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 容器 | 预览使用有名称弹窗、关闭控件、有界视口及焦点管理。 |\n| 工具 | 仅在支持时提供缩放、适配、前后图及可访问名称、键盘替代。 |\n| 来源 | 按要求保持签名私有 URL 有效期,不经公开缓存绕过权限。 |\n\n<a id=\"thumbnail-and-preview\"></a>\n\n## 缩略图与预览容器\n\n缩略图保持比例,明确可预览提示,覆盖其上的操作分别提供名称。网页预览使用有边界浮层并提供明显关闭入口。Lime 不宣称参考中的 Mac 或 Windows 原生图片窗口,通用图片适配原则仍适用。\n\n![带内容编号的行内图片。](https://open.limeai.run/docs/assets/design/source-0073-001.png)\n\n![浅色表面上的图片查看器编号结构图。](https://open.limeai.run/docs/assets/design/source-0073-002.png)\n\n![深色遮罩上的图片查看器编号结构图。](https://open.limeai.run/docs/assets/design/source-0073-003.png)\n\n![方形、圆角与圆形图片裁切。](https://open.limeai.run/docs/assets/design/source-0073-006.png)\n\n![深色遮罩中带紧凑工具栏的图片预览。](https://open.limeai.run/docs/assets/design/source-0073-007.png)\n\n![浅色桌面窗口中的图片预览。](https://open.limeai.run/docs/assets/design/source-0073-008.png)\n\n![在可调整预览窗口中居中的横向图片。](https://open.limeai.run/docs/assets/design/source-0073-023.png)\n\n![带数字内边距标注的图片查看内容区域。](https://open.limeai.run/docs/assets/design/source-0073-024.png)\n\n![使用标准 Windows 窗口控件的图片预览。](https://open.limeai.run/docs/assets/design/source-0073-025.png)\n\n![使用标准 macOS 窗口控件的图片预览。](https://open.limeai.run/docs/assets/design/source-0073-026.png)\n\n<a id=\"navigation-and-actions\"></a>\n\n## 图片导航与可用操作\n\n将上一张/下一张、计数、缩放与可选原图操作分组。仅在已知时显示当前位置与总量。适应窗口及 1:1 分别说明;旋转、下载或编辑仅在实现及图片授权允许时展示。\n\n![图片下方的导航及缩放控件编号。](https://open.limeai.run/docs/assets/design/source-0073-009.png)\n\n![不含文字标签的图片查看工具栏交互状态。](https://open.limeai.run/docs/assets/design/source-0073-014.png)\n\n![带数字位置计数及缩放控件的图片预览。](https://open.limeai.run/docs/assets/design/source-0073-015.png)\n\n![在图片四周保留安全间距的预览。](https://open.limeai.run/docs/assets/design/source-0073-016.png)\n\n<a id=\"zoom-and-fitting\"></a>\n\n## 缩放、适配与超出区域\n\n打开时在可用视口内保持图片比例。小图可按原尺寸居中,大图按受限边适配。放大超出区域时提供可用拖动或滚动路径,保持控件可达。显示实际比例,不将缩放后的缩略图当作原图。\n\n![在深色遮罩中居中的缩小图片预览。](https://open.limeai.run/docs/assets/design/source-0073-017.png)\n\n![由视口裁切的原尺寸图片预览。](https://open.limeai.run/docs/assets/design/source-0073-018.png)\n\n![带原尺寸控件的图片预览。](https://open.limeai.run/docs/assets/design/source-0073-019.png)\n\n![带适应视口控件的放大图片预览。](https://open.limeai.run/docs/assets/design/source-0073-020.png)\n\n![竖版图片查看器的安全区域尺寸。](https://open.limeai.run/docs/assets/design/source-0073-021.png)\n\n![方形图片查看器的安全区域尺寸。](https://open.limeai.run/docs/assets/design/source-0073-022.png)\n\n<a id=\"keyboard-and-dismissal\"></a>\n\n## 键盘操作与退出\n\n缩略图支持键盘打开,Escape 关闭后焦点回到触发项。模态焦点保持在浮层中,纯图标操作具有名称。方向键导航不与当前控件冲突。授权原图加载失败时提供可见回退与重试或关闭路径。\n\n![带数字项目计数的图片查看导航。](https://open.limeai.run/docs/assets/design/source-0073-011.png)\n\n![带窗口控件和工具栏的浅色图片查看器。](https://open.limeai.run/docs/assets/design/source-0073-012.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n可关闭预览通过 Escape 退出并回到原缩略图。拖动缩放不能困住触控或键盘。加载失败显示重试或安全说明,不无限旋转空白。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试超宽超高图、解码失败、来源权限到期与首末图片。\n2. 验证焦点约束恢复、窄屏适配与键盘动作。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:fae96bd0ead6765694d437925dc07ecd2b0e17f465f15d0701eb8ebf08873819"},{"id":"design-popover","group":"guide","category":"应用设计规范","title":"气泡卡片","summary":"就近显示补充内容或小型动作,保留上下文。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-popover?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"content-structure","title":"标题、操作与复杂内容"},{"id":"size-and-position","title":"尺寸与锚点定位"},{"id":"trigger-and-focus","title":"触发、悬停与焦点"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 气泡卡片\n\n就近显示补充内容或小型动作,保留上下文。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n丰富补充说明或小型局部交互可用气泡卡片。简短非交互帮助用提示,命令用菜单,复杂或高影响任务用弹窗。不将完整凭据或购买流程塞入微小悬停卡。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-popover](https://open.limeai.run/docs/design-popover?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 触发器 | 交互内容通过点击打开,并暴露关系及展开状态。 |\n| 位置 | 锚定触发器并处于可见安全边距,重定位不遮挡相关对象。 |\n| 内容 | 可选标题简洁,内容有界,必要信息另有可达位置。 |\n\n<a id=\"content-structure\"></a>\n\n## 标题、操作与复杂内容\n\n气泡卡片可包含简短标题、说明、可选图标和操作,也可承载交互表单。操作区需要明确边界时独立分组。操作数量保持少量,标签换行优先于挤压成行。需要阻断注意的决策使用对话框。\n\n<a id=\"size-and-position\"></a>\n\n## 尺寸与锚点定位\n\n面板按内容定宽并受视口限制,使用共享背景与边框语义,距屏幕边缘留安全边距。靠近触发项出现,空间不足时翻转或偏移,可选箭头仍指向锚点。高内容在内部滚动,操作保持可达。\n\n![气泡浮层的对齐轴及视口边界约束。](https://open.limeai.run/docs/assets/design/source-0074-011.png)\n\n<a id=\"trigger-and-focus\"></a>\n\n## 触发、悬停与焦点\n\n补充信息可用悬停和聚焦,主动交互使用点击。指针从触发项移入卡片不能立即关闭。交互内容提供键盘访问、Escape 及明确退出规则。非模态气泡保留周边页面可用性;模态容器须遵循相应焦点合同。\n\n![锚定气泡浮层中的加载指示。](https://open.limeai.run/docs/assets/design/source-0074-012.png)\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n指针从触发器移入卡片时不能过早消失。交互内容可键盘到达,安全时 Escape 可退出并适当恢复焦点。加载和失败保持稳定面板尺寸。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试视口边缘、指针跨触发器卡片及键盘进出。\n2. 检查异步内容、长译文及窄屏触控布局。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:08b4c39ec2353a22ea0cb4126678cf3a7b0f152db192080049837f6992890821"},{"id":"design-placeholder","group":"guide","category":"应用设计规范","title":"占位符","summary":"预留稳定视觉空间,区分缺失、加载与失败。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-placeholder?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"placeholder-types","title":"失败占位与默认图"},{"id":"ratio-and-content","title":"比例与可识别性"},{"id":"recovery-actions","title":"恢复与更换"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 占位符\n\n预留稳定视觉空间,区分缺失、加载与失败。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n图片占位保留资源位置或表示缺图,骨架展示加载布局,输入占位提供示例。三者不同,都不能代替可访问标签或错误。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-placeholder](https://open.limeai.run/docs/design-placeholder?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 形状 | 保留预期宽高比,避免加载后移动附近内容。 |\n| 状态 | 资源失败需明确替代,允许缺省图片可保持中性。 |\n| 可访问性 | 隐藏纯装饰块,并保留有用文字或上下文。 |\n\n<a id=\"placeholder-types\"></a>\n\n## 失败占位与默认图\n\n加载失败占位表示请求的图片无法加载,默认图占位表示对象尚未配置图片。两者含义须区分,避免用户对未上传图片反复重试,或因网络失败而误换原图。\n\n<a id=\"ratio-and-content\"></a>\n\n## 比例与可识别性\n\n预留最终图片比例以减少布局移动。使用安静的中性符号或插图,不能误认为真实商品内容。提供有用的可访问说明;相邻文字已解释状态时,不让读屏重复装饰占位内容。\n\n![默认与加载失败图片占位图及尺寸。](https://open.limeai.run/docs/assets/design/source-0075-006.png)\n\n<a id=\"recovery-actions\"></a>\n\n## 恢复与更换\n\n重试重新加载同一授权来源;上传或更换会改变资源,需要对应权限与校验。图片缺失时保留记录名称等有效元数据。占位不能暗示资源本身已删除。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n来源成功或失败后停止加载提示。私有图被拒时不以详情泄露内容。重试属于失败读取,上传或换图属于独立获授权写入。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试缺失、延迟、无权及损坏图片,周边布局保持稳定。\n2. 检查占位文案不成为输入或交互预览的唯一标签。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:2ffa86bdef519bc60ce2b7f4e0d402b035c6a8ce8a77084184add0ab918a5b41"},{"id":"design-table","group":"guide","category":"应用设计规范","title":"表格","summary":"通过准确表头、对齐与受限动作比较结构记录。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-table?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"table-anatomy","title":"表格组成"},{"id":"table-variants","title":"基础、分组、树形与数值表格"},{"id":"table-sort-reorder","title":"排序与调整顺序"},{"id":"table-overflow","title":"固定表头、固定列与滚动"},{"id":"table-actions-summary","title":"行操作、批量操作与总结"},{"id":"table-loading-density","title":"加载状态与行密度"},{"id":"table-text-alignment","title":"长内容与对齐"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 表格\n\n通过准确表头、对齐与受限动作比较结构记录。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n需跨记录比较重复字段时用表格。少量对象摘要可用卡片,正文保持正文。保留有效主标识及当前决定必要字段,不暴露全部 Schema 字段。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-table](https://open.limeai.run/docs/design-table?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 语义 | 使用真实表头、scope 及所需名称,排序头暴露当前方向。 |\n| 对齐 | 文字便于扫描,金额右对齐、使用等宽数字及明确币种。 |\n| 动作 | 行动作以对象命名,批量动作说明实际选择范围并逐资源授权。 |\n\n<a id=\"table-anatomy\"></a>\n\n## 表格组成\n\n数据表格由标题或上下文、相关搜索筛选、列头、数据行及可选分页组成。选择列在起始处,行命令靠近末端。重复标签可能含糊时写明动作对象,仅在有选择时显示批量操作栏。\n\n<a id=\"table-variants\"></a>\n\n## 基础、分组、树形与数值表格\n\n默认采用基础表格。多级表头表达真实列层级,树形行表达记录层级,分组行聚合同一属性,展开行展示次要详情。展开与行选择保持独立。数值报表可用更清晰边界,但单元格含义和访问规则保持一致。\n\n[design-detail-table-variants](https://open.limeai.run/docs/design-table?locale=zh-CN#table-variants)\n\n![采用通用占位文本的多级表头表格。](https://open.limeai.run/docs/assets/design/source-0076-003.png)\n\n<a id=\"table-sort-reorder\"></a>\n\n## 排序与调整顺序\n\n在表头及 aria-sort 中说明当前排序,并提示下一排序动作。仅提供 API 实际支持的排序;排序已加载一页不等于排序全部结果。拖动调整顺序须有真实持久合同和键盘替代,不用于不可变账务历史。\n\n<a id=\"table-overflow\"></a>\n\n## 固定表头、固定列与滚动\n\n选择页面滚动配合吸顶表头,或边界明确的表格内部滚动。列含义无法压缩时采用横向滚动,仅固定能容纳的关键标识或操作列。为滚动条与批量动作留空间,避免遮住末行、分页或键盘焦点。\n\n[design-detail-table-overflow](https://open.limeai.run/docs/design-table?locale=zh-CN#table-overflow)\n\n<a id=\"table-actions-summary\"></a>\n\n## 行操作、批量操作与总结\n\n外露少量高频行命令,其余收进有名称菜单。批量栏说明实际选择范围,逐项校验权限。不暗示选中一页等于选中服务端全部结果。总结说明统计可见行还是整个获授权查询,不同币种分别合计。\n\n<a id=\"table-loading-density\"></a>\n\n## 加载状态与行密度\n\n区分首屏加载、保留已有数据的刷新及获取下一页。非阻断刷新保持已有行可读,说明数据正在更新并播报完成。同一模块密度一致;窄屏触控可增大热区,不能通过缩小文字适配。\n\n![包含复选框和开关的表头状态矩阵。](https://open.limeai.run/docs/assets/design/source-0076-026.png)\n\n![表头交互热区示意。](https://open.limeai.run/docs/assets/design/source-0076-027.png)\n\n![表格单元格交互热区示意。](https://open.limeai.run/docs/assets/design/source-0076-029.png)\n\n<a id=\"table-text-alignment\"></a>\n\n## 长内容与对齐\n\n按真实数据分配列宽:选择及展开控件固定,名称说明可弹性伸缩。重要名称换行,截断时提供完整值;标识可使用有意代码区域。文字、时间及状态通常左对齐,可比较金额与百分比用等宽数字右对齐。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n区分加载、空、无匹配、无权及失败。改过滤排序重置游标导航。窄屏保留重点列或有名局部溢出区,固定表头列不能遮焦点或末行。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试长 ID、缺值、大精确金额、混合币种与键盘排序。\n2. 检查游标变化、批量选择、行动作与局部横向滚动。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:c8d066dc1083c4578d96152e5e7d3a9365b05d7035407cf4fa97cd9119bd762c"},{"id":"design-tabs","group":"guide","category":"应用设计规范","title":"标签页","summary":"在同一上下文切换同级视图,明确选择并保留状态。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tabs?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"tab-hierarchy","title":"线条、选项与卡片页签"},{"id":"states-and-keyboard","title":"状态、热区与键盘"},{"id":"long-titles-and-overflow","title":"长标题与溢出"},{"id":"add-close-and-drafts","title":"新增、关闭与草稿"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 标签页\n\n在同一上下文切换同级视图,明确选择并保留状态。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n同一对象同级视图(如应用配置区域)适合标签页。不同产品区域用主导航,顺序流程用步骤条。标签稳定,页签不是发布或授权命令。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-tabs](https://open.limeai.run/docs/design-tabs?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 语义 | 局部面板使用 tablist、tab、tabpanel;路由目的地可用真实链接与当前状态。 |\n| 选择 | 选中态不只靠颜色,并保持一个关联面板活动。 |\n| 溢出 | 允许页签横向滚动或明确溢出选择,不隐藏当前标签。 |\n\n<a id=\"tab-hierarchy\"></a>\n\n## 线条、选项与卡片页签\n\n一级线条页签切换同层视图,较弱选项页签用于次级分组,卡片页签仅用于支持该模型的工作区。多组并存时层级清晰。路由链接与页内面板切换具有不同导航语义。\n\n<a id=\"states-and-keyboard\"></a>\n\n## 状态、热区与键盘\n\n明确当前面板,区分悬停、焦点与禁用状态。短标题周围保留足够热区。实际页签控件关联 tab 与 panel,页签列表保留一个 Tab 停靠点,支持方向键移动,不能将焦点困在面板中。\n\n<a id=\"long-titles-and-overflow\"></a>\n\n## 长标题与溢出\n\n为异常长标题设置边界,并保留可访问全名。选择明确的横向滚动或“更多”模式,不缩小文字。隐藏页签被选中后持续显示其身份;溢出菜单保留逻辑顺序,不能静默改变当前面板。\n\n<a id=\"add-close-and-drafts\"></a>\n\n## 新增、关闭与草稿\n\n仅在工作区支持创建和关闭视图时展示新增及关闭。关闭控件拥有独立名称与热区,关闭后选择可预期的相邻页签,并保留或明确处理未保存内容。关闭视图不等于删除业务资源。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n按任务保留安全草稿,切换不丢未知写入。键盘行为需一致符合局部页签或链接模型。刷新直达书签路由后选择正确视图。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试方向键、Tab、长译文及选中页签位于可见区外。\n2. 验证待修改内容、无权视图与浏览器前进后退。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:6e2aa7da37dfb1537a5bc8db4ff0542bc6c584d65486c765928136949848852f"},{"id":"design-tag","group":"guide","category":"应用设计规范","title":"标签","summary":"区分描述标签、选择项与可操作移除。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tag?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"tag-meaning","title":"属性、选项、状态与人员"},{"id":"semantics-and-color","title":"颜色与真实状态"},{"id":"interaction-regions","title":"选择与移除热区"},{"id":"long-names-and-spacing","title":"长名称与排列"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 标签\n\n区分描述标签、选择项与可操作移除。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n标签用于概括分类属性或已选过滤。状态标签应描述实际当前状态,不显示乐观本地值。不将全部元数据变为彩色块,也不让描述标签看似可点。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-tag](https://open.limeai.run/docs/design-tag?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 含义 | 保存稳定代码并本地化展示,权限不比较翻译标签。 |\n| 颜色 | 使用克制分类状态变量与可读文字,无色时含义仍清楚。 |\n| 移除 | 交互移除控件名称含目标标签,并支持键盘。 |\n\n<a id=\"tag-meaning\"></a>\n\n## 属性、选项、状态与人员\n\n属性标签描述对象,选项标签代表已选对象,状态标签展示记录状态,头像标签标识人员。同组区分这些用途。使用简短熟悉名称,避免增加无用分类的装饰标签。\n\n<a id=\"semantics-and-color\"></a>\n\n## 颜色与真实状态\n\n状态色搭配明确文字,复用共享语义色板。选中颜色标识选项,不能暗示业务成功或失败。透明或实色背景按实际承载面检查。翻译标签只改变展示,稳定状态码仍是业务事实。\n\n<a id=\"interaction-regions\"></a>\n\n## 选择与移除热区\n\n只读标签是文本,不能成为无说明按钮。可选标签公开选中状态。可移除标签具有独立名称的移除操作;点击人员主体与移除人员不能共用含糊热区。遵循禁用状态,重要移除通过真实业务流程确认。\n\n<a id=\"long-names-and-spacing\"></a>\n\n## 长名称与排列\n\n视觉截断时保留可访问全名,移除控件始终可达,标签组可按一致行距换行。不要嵌套标签表达层级。头像不可用时仍展示人员名称,技术 ID 可作为补充识别信息。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n移除过滤改变查询,撤销已授予权限则是独立受保护操作。长标签截断时保留完整可访问名。删除后焦点移至附近合理控件,不丢失。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试描述、已选、禁用及可移除变体和长名称。\n2. 验证切换语言后稳定代码与状态文字正确。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:0a392845101c70acf5a7df08d851ad6907e83bf7a30ad3027bf06413b8709721"},{"id":"design-timeline","group":"guide","category":"应用设计规范","title":"时间轴","summary":"展示历史事件及来源、时间与确认结果。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-timeline?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"structure-and-order","title":"结构与事件顺序"},{"id":"event-evidence","title":"事件内容与校验"},{"id":"spacing-and-collapsing","title":"间距、加载与折叠"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 时间轴\n\n展示历史事件及来源、时间与确认结果。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n时间轴用于版本决定或订单事实等时间历史。未来或当前流程用步骤条。独立事件可能乱序,应按相关业务时间排序,诊断有用时同时保留接收时间。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-timeline](https://open.limeai.run/docs/design-timeline?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 节点 | 命名事件、主体来源、含时区时间与确认结果。 |\n| 状态 | 区分已请求、已接收、失败与未知,不合并审核批准和发布。 |\n| 详情 | 展示获授权来源 ID 与脱敏诊断,不含凭据或个人载荷。 |\n\n<a id=\"structure-and-order\"></a>\n\n## 结构与事件顺序\n\n按空间与浏览需求采用单侧或双侧结构。连续时间轴可展示预设里程碑,事件历史随事实增加。说明最新在前或最早在前,同时间戳保留稳定顺序。步骤条描述要执行的任务,时间轴记录已发生的事实。\n\n<a id=\"event-evidence\"></a>\n\n## 事件内容与校验\n\n有效事件在可获得时说明动作或结果、时间、操作者及来源。时间戳按用户语言和时区显示,保留底层时刻。校验节点区分通过、警示与失败,并说明流程能否继续。账务事件没有对应证据时不能暗示银行到账。\n\n<a id=\"spacing-and-collapsing\"></a>\n\n## 间距、加载与折叠\n\n节点标题简短,说明详情可换行。间距一致,连接线清晰。折叠旧节点或次要节点时保留数量和展开入口。加载更多历史不能将过去事件变成当前审批状态,也不能丢失错误标记。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n收起旧历史保留清晰数量范围与可访问展开。重复投递不形成第二次业务迁移。凭证收据事件链接来源,不能展示成银行结算或邮件送达证明。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试同时间事件、延迟重复投递、可选主体缺失与长历史。\n2. 检查时区标签、键盘展开详情与窄屏纵向布局。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:c67a63af48796c25d7c96493104d28218a745736fdd6e630c82d17505f633d06"},{"id":"design-tooltip","group":"guide","category":"应用设计规范","title":"文字提示","summary":"为聚焦或悬停目标提供简短补充帮助。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-tooltip?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"short-explanation","title":"简短解释与可访问名称"},{"id":"hover-focus-and-dismissal","title":"悬停、聚焦与退出"},{"id":"size-and-placement","title":"文本边界与定位"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 文字提示\n\n为聚焦或悬停目标提供简短补充帮助。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n提示适合紧凑非交互解释或图标补充标签。必要指引、校验错误、价格与权限后果保持可见。浮层解释中需要链接或表单时使用气泡卡片。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-tooltip](https://open.limeai.run/docs/design-tooltip?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 触发 | 聚焦与悬停均显示,建立描述关系,动作可访问名保持稳定。 |\n| 位置 | 保持在视口内,不遮挡目标或焦点内容。 |\n| 文字 | 使用可换行简短完整语句,不含秘密或无用重复标签。 |\n\n<a id=\"short-explanation\"></a>\n\n## 简短解释与可访问名称\n\n文字提示用于简短操作说明或不可交互详情。图标按钮在提示出现前也须具有可访问名称。装饰说明图标不会因有提示而自动成为操作。链接、表单及复杂内容使用气泡卡片。\n\n<a id=\"hover-focus-and-dismissal\"></a>\n\n## 悬停、聚焦与退出\n\n指针悬停与键盘聚焦提供同一说明,留足阅读时间,并支持 Escape 退出。指针移到提示上不能立即消失。触屏不能依赖悬停,必要校验、价格或恢复指引不能只放在提示内。\n\n<a id=\"size-and-placement\"></a>\n\n## 文本边界与定位\n\n使用共享说明字号,保留足够内边距和对比度,长文限定可读宽度并允许换行。提示靠近目标,在视口或容器边界翻转。箭头指向目标,避免遮挡用户正在查看的信息。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\nEscape 关闭提示且不移焦点。不能只有悬停才知道禁用原因,必要时提供可访问可见说明。触控设备通过合适替代方式获得相同帮助。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试键盘聚焦、Escape、视口角落与长译文。\n2. 验证没有提示时必要任务信息仍可理解。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:639e6c0d5ebe9c149b2d866987b07509e971217453b76b880e43ef65ce5a335e"},{"id":"design-dialog","group":"guide","category":"应用设计规范","title":"对话框","summary":"以可靠焦点管理承载有界任务或高影响决定。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-dialog?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"dialog-priority","title":"对话框、常驻提示与临时提示"},{"id":"dialog-anatomy","title":"标题区、内容区与操作区"},{"id":"dialog-dimensions","title":"尺寸与内容溢出"},{"id":"dialog-text-layout","title":"长文案、操作区与窄屏"},{"id":"dialog-focus-dismiss","title":"焦点、退出与处理中"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 对话框\n\n以可靠焦点管理承载有界任务或高影响决定。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n需要保留底层上下文的聚焦编辑或确认使用共享 Modal。长独立流程宜用页面。仅对用户实际发起高影响动作确认,说明对象与后果。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-dialog](https://open.limeai.run/docs/design-dialog?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 结构 | 提供语义名称、有效说明、明确主次动作及有界滚动。 |\n| 焦点 | 打开时有意设置焦点,模态内约束焦点,关闭后回到触发器。 |\n| 处理中 | 提交期间使用 closeDisabled,结果未知时保留原命令。 |\n\n<a id=\"dialog-priority\"></a>\n\n## 对话框、常驻提示与临时提示\n\n用户须先决策或完成短任务才能返回页面时使用模态对话框。可伴随工作的信息使用常驻提示,轻量状态使用临时提示。对话框须有打断焦点的必要,普通成功不需要新的阻断确认。\n\n<a id=\"dialog-anatomy\"></a>\n\n## 标题区、内容区与操作区\n\n标题标识任务或受影响对象,正文承载必要信息或短表单,操作区有一个主操作及清楚替代动作。简单确认解释后果,自定义表单弹窗支持有边界的编辑。正文避免叠加装饰卡片和阴影。\n\n[design-detail-dialog-structure](https://open.limeai.run/docs/design-dialog?locale=zh-CN#dialog-anatomy)\n\n<a id=\"dialog-dimensions\"></a>\n\n## 尺寸与内容溢出\n\n按任务选择宽度,不将面板尽量放大。既有创建应用弹窗在桌面使用 840px,这是特定任务尺寸,不是所有 Modal 的宽度。高度受可见视口约束,长表单内容有意内部滚动,标题与操作区保持可达。\n\n[design-detail-dialog-responsive](https://open.limeai.run/docs/design-dialog?locale=zh-CN#dialog-dimensions)\n\n<a id=\"dialog-text-layout\"></a>\n\n## 长文案、操作区与窄屏\n\n译文标题可换行,说明先允许增高再考虑截断。动作标签无法同排时,将完整按钮纵向排列并保持顺序。窄屏保留对象、后果、取消与提交,包括软键盘缩小可见高度时。\n\n<a id=\"dialog-focus-dismiss\"></a>\n\n## 焦点、退出与处理中\n\n打开后将焦点移入对话框,键盘焦点限制在活动模态内,关闭后返回触发控件。允许关闭时共享 Modal 支持 Escape 与遮罩退出。提交写入后使用 closeDisabled 并保留原命令;响应丢失需要可见恢复路径,不能丢弃表单。\n\n优先只打开一个对话框。确需第二次确认时,仅顶层可交互,关闭后焦点返回前一任务。重新认证不自动重放敏感动作。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n按任务规则仅在安全时允许 Escape 和点击外部退出。重渲染不重置焦点或清空输入。异步打开时通过 returnFocus 保留原触发器,避免临时禁用按钮导致恢复丢失。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试 Tab、Shift+Tab、Escape、焦点恢复、提交失败和响应丢失。\n2. 检查长译文与软键盘,整页不横向溢出。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:d268670abf0dc36a392ffa46725220763e966218934d1abb02aacbce7a83866e"},{"id":"design-drawer","group":"guide","category":"应用设计规范","title":"抽屉","summary":"在来源附近展示上下文详情或短任务。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-drawer?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"overlay-and-push","title":"覆盖与并列面板"},{"id":"header-body-footer","title":"标题区、内容区与操作区"},{"id":"width-and-narrow-screens","title":"宽度与窄屏"},{"id":"focus-close-and-drafts","title":"焦点、关闭与草稿"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 抽屉\n\n在来源附近展示上下文详情或短任务。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n检查记录时来源列表仍有用,可用抽屉。长任务使用页面,高影响决定使用确认弹窗。覆盖抽屉与非模态侧面板的焦点退出行为不同。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-drawer](https://open.limeai.run/docs/design-drawer?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 标题区 | 显示对象任务名、有名关闭及必要当前上下文。 |\n| 内容 | 限制内容滚动并使最终动作可达,不遮字段。 |\n| 模式 | 明确模态覆盖或非模态语义,非模态检查器不困住焦点。 |\n\n<a id=\"overlay-and-push\"></a>\n\n## 覆盖与并列面板\n\n临时详情或插入任务可用覆盖抽屉,需要对照或控制父内容时采用并列面板。挤压布局中两区域属于同一视觉层级。明确模态行为,视觉并列面板不自动需要模态遮罩。\n\n<a id=\"header-body-footer\"></a>\n\n## 标题区、内容区与操作区\n\n标题与关闭入口位于稳定头部,可选任务操作放在稳定底部。正文独立滚动,长表单不遮住控件。标题、辅助信息与头部操作保持清晰首行对齐,空间不足时将次要操作收入菜单。\n\n<a id=\"width-and-narrow-screens\"></a>\n\n## 宽度与窄屏\n\n宽屏选择仍能保留可用父内容的宽度,无法容纳两区域时改为覆盖或全宽面板。参考中的 350、480、680px 是对照尺寸,不是 Lime 已导出的组件 API。检查安全边距、长译文与屏幕键盘。\n\n<a id=\"focus-close-and-drafts\"></a>\n\n## 焦点、关闭与草稿\n\n模态抽屉限制焦点,关闭后回到触发项;非模态面板保留页面导航。按当前合同提供 Escape 与具名关闭操作。明确处理未保存内容,不推定关闭即保存,也不在认证后未经用户再次操作重放写入。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n关闭后焦点回到原行,数据刷新后也需合理恢复。窄屏可变为通栏弹窗,保留同一任务与返回路径。点击遮罩不能丢弃处理中写入。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试来源行移除、键盘关闭、处理中提交与浏览器导航。\n2. 检查窄屏、长文字及固定操作区附近焦点可见。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:b892c3b2815c67448ae8f32aabd4764ea17648490e252a237a2712b3102e1818"},{"id":"design-loading","group":"guide","category":"应用设计规范","title":"加载中","summary":"说明有界处理中任务,不暗示成功或阻塞无关工作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-loading?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"choose-a-loading-pattern","title":"选择加载形式"},{"id":"scope-and-layout","title":"作用范围、布局与图片"},{"id":"completion-and-failure","title":"完成、失败与减少动态"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 加载中\n\n说明有界处理中任务,不暗示成功或阻塞无关工作。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n未知时长等待使用共享 Loading,最终布局已知可用稳定骨架。仅有真实总量时采用进度条。加载不等于空结果,超时后需可处理状态。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-loading](https://open.limeai.run/docs/design-loading?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 范围 | 仅将受影响区域标为 busy,不为行读取锁全应用。 |\n| 稳定 | 预留适当布局空间,已有内容避免闪烁加载器。 |\n| 播报 | 提供有效本地化状态,不连续重复动画帧。 |\n\n<a id=\"choose-a-loading-pattern\"></a>\n\n## 选择加载形式\n\n初始内容结构可预测时用骨架屏,不确定局部操作用小型加载指示,较长首次等待仅在插图能解释任务时使用插画。同一任务保持统一信号。刷新时保留已加载数据,不将全部模块换成各自旋转图标。\n\n![通用头像与文字加载骨架。](https://open.limeai.run/docs/assets/design/source-0083-002.png)\n\n![卡片内居中的加载指示。](https://open.limeai.run/docs/assets/design/source-0083-032.png)\n\n<a id=\"scope-and-layout\"></a>\n\n## 作用范围、布局与图片\n\n加载限制在受影响区域,保留最终尺寸,其他操作继续可用。仅在同时交互会造成不安全或无效结果时使用阻断遮罩。图片加载预留比例,失败后切换对应回退。同一查询不能同时展示加载与成功零结果空态。\n\n![浅色、实色和弱化表面上的加载指示。](https://open.limeai.run/docs/assets/design/source-0083-026.png)\n\n<a id=\"completion-and-failure\"></a>\n\n## 完成、失败与减少动态\n\n为读屏提供文本状态,避免反复播报,并尊重减少动态设置。慢请求提供有用说明,支持时提供取消,失败后可重试。新请求或卸载后忽略过期响应,仅在实际完成合同满足后展示成功。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n过滤、账号或空间变化后忽略旧响应。取消与截止时间停止无用工作。写入处理中保留键与上下文,结果未知转恢复,不自动创建新命令。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试快慢成功、失败、取消、来源切换与乱序响应。\n2. 检查减少动态效果与屏幕阅读器状态,焦点稳定。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:482f6a0d389a325295edb6d573803006a20efed857cbce260c2e32fdde14f68b"},{"id":"design-notification","group":"guide","category":"应用设计规范","title":"通知提醒框","summary":"展示异步结果,明确范围与有效后续动作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-notification?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"message-and-actions","title":"消息结构与操作"},{"id":"placement-and-timing","title":"位置、时长与焦点"},{"id":"durable-notification-record","title":"临时展示与持久记录"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 通知提醒框\n\n展示异步结果,明确范围与有效后续动作。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n任务结果或后台事件需要比临时提示更多语境时使用通知框。持久账号通知由来源记录拥有,临时前端面板不创建此记录,也不保证外部消息送达。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-notification](https://open.limeai.run/docs/design-notification?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 内容 | 命名任务对象、确认结果及相关后续,不暴露个人或秘密载荷。 |\n| 动作 | 使用少量真实上下文链接,敏感动作仍进入独立检查流程。 |\n| 生命周期 | 提供关闭,并为不宜消失信息保留适当持久位置。 |\n\n<a id=\"message-and-actions\"></a>\n\n## 消息结构与操作\n\n通知可包含图标、简短标题、说明、关闭入口及一至两个有用操作。简单消息与复杂自定义内容遵循同一层级。后续操作应对应事件,必要决策不能只存在于临时通知中。\n\n<a id=\"placement-and-timing\"></a>\n\n## 位置、时长与焦点\n\n通知在当前页面保持一致位置,避免遮挡关键操作。详细或可操作内容留更长阅读时间,阅读或聚焦时暂停消失,窄屏关闭入口保持可达。新通知不应抢走任务中的键盘焦点。\n\n![像素网格中的蓝色通知色形。](https://open.limeai.run/docs/assets/design/source-0084-013.png)\n\n![像素网格中的绿色通知色形。](https://open.limeai.run/docs/assets/design/source-0084-014.png)\n\n![像素网格中的琥珀色通知色形。](https://open.limeai.run/docs/assets/design/source-0084-015.png)\n\n![像素网格中的红色通知色形。](https://open.limeai.run/docs/assets/design/source-0084-016.png)\n\n<a id=\"durable-notification-record\"></a>\n\n## 临时展示与持久记录\n\n前端通知面板属于展示。事件存在持久通知记录时,未读、重试及投递状态来自该事实源。关闭面板不代表已处理底层任务,也不证明邮件送达。重要未解决信息仍须在相关记录或页面中可查。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n异步播报不抢输入焦点。合并重复更新,避免无限堆叠。通知已读与完成来源任务、确认邮件到达分别管理。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试多结果、长名称、键盘动作及窄视口。\n2. 验证已读或关闭不改变订单、权限或付款结果。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:42822ea459bf770a10c6b13e241ac3fe2bb19ba6013c71891f3dc06fb0761d54"},{"id":"design-notice","group":"guide","category":"应用设计规范","title":"常驻提示","summary":"在适用范围附近持续显示实质限制或恢复指引。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-notice?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"semantic-types","title":"语义与可用类型"},{"id":"site-page-and-module","title":"站点、页面与模块范围"},{"id":"text-actions-and-alignment","title":"文字、操作与对齐"},{"id":"dismissal-and-recovery","title":"关闭与未解决条件"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 常驻提示\n\n在适用范围附近持续显示实质限制或恢复指引。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n影响决定的信息(环境限制、能力拒绝或未知结果)使用共享 Notice。页面级提示作用页面,字段校验靠近字段。不将普通帮助变成重复警告横幅。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-notice](https://open.limeai.run/docs/design-notice?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 含义 | 按确认事实选择信息、成功、警告或错误语义,并有文字。 |\n| 位置 | 置于受影响任务前或自身区域,不用装饰侧边。 |\n| 恢复 | 提供具体真实动作,必要时保留原对象命令。 |\n\n<a id=\"semantic-types\"></a>\n\n## 语义与可用类型\n\n按真实状态选择信息、成功、警告或错误含义,以明确文字搭配图标及颜色。当前共享 Notice API 提供 info、success、warning;指南中的错误示例不会新增未支持类型。使用既有失败组件,或先实现共享合同再调用新类型。\n\n<a id=\"site-page-and-module\"></a>\n\n## 站点、页面与模块范围\n\n站点提示位于受影响内容上方,页面提示在页面标题后,模块提示紧邻相关字段。预留空间,不意外覆盖控件。非阻断常驻信息持续展示,直到条件解决或适合由用户主动关闭。\n\n<a id=\"text-actions-and-alignment\"></a>\n\n## 文字、操作与对齐\n\n用简明整句说明条件,仅在正文需要层次时加标题。操作保持少量,区分命令与跳转链接,内容换行后可将操作独立成行。关闭入口对齐文字首行。居中单行提示适合居中布局,长文或多行内容跟随页面阅读边缘。\n\n<a id=\"dismissal-and-recovery\"></a>\n\n## 关闭与未解决条件\n\n关闭展示不能抹掉未解决的权限、账单或数据故障。相关页面或记录继续保留条件及恢复路径,用户再次执行受影响操作时重新呈现。关闭提示不能视为同意重要操作。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n仅允许关闭可安全隐藏信息,不逐渲染恢复已关闭提示。未解权限或未知写入问题仍需可发现。重新认证后回原任务检查,不自动重放。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试换行内容、链接动作、关闭及持续未解错误。\n2. 检查状态播报不逐渲染重复朗读。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:c7816157505e63803fbaada311011785cfe3cb46ad0b1d3d49705933616e3625"},{"id":"design-progress","group":"guide","category":"应用设计规范","title":"进度条","summary":"显示已测完成程度,区分已接收与已完成。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-progress?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"determinate-and-indeterminate","title":"确定与不确定进度"},{"id":"linear-and-circular","title":"线性与圆形形式"},{"id":"phases-and-recovery","title":"阶段、完成与恢复"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 进度条\n\n显示已测完成程度,区分已接收与已完成。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n仅在任务有有意义已知总量时使用确定进度。未知时长用加载器。上传字节达 100% 只代表传输结束,服务端校验、处理与配置保存可能仍进行中。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-progress](https://open.limeai.run/docs/design-progress?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 数值 | 暴露最小、最大、当前或不确定状态,配本地化任务标签。 |\n| 阶段 | 分别命名传输、处理、完成,不无限停留虚构 99%。 |\n| 失败 | 确认失败或取消后提供安全重试恢复,不显示成功色条。 |\n\n<a id=\"determinate-and-indeterminate\"></a>\n\n## 确定与不确定进度\n\n仅在已完成工作与总工作可测量时使用确定进度,否则展示不确定进度并明确当前活动。不能根据耗时编造百分比,也不能将未知服务端操作模拟推进至 99%。\n\n![条形和环形进度的编号结构图。](https://open.limeai.run/docs/assets/design/source-0086-001.png)\n\n<a id=\"linear-and-circular\"></a>\n\n## 线性与圆形形式\n\n线性轨道适合具名上传、下载或较长任务,紧凑圆形适合局部小区域。轨道、指示和可选数值层次清晰,数值可读,不同尺寸含义一致。运行、成功及失败不能仅靠颜色区分。\n\n![带数字百分比的条形与环形进度。](https://open.limeai.run/docs/assets/design/source-0086-002.png)\n\n![条形进度的像素尺寸。](https://open.limeai.run/docs/assets/design/source-0086-004.png)\n\n![环形进度的尺寸与间距。](https://open.limeai.run/docs/assets/design/source-0086-007.png)\n\n<a id=\"phases-and-recovery\"></a>\n\n## 阶段、完成与恢复\n\n传输与处理完成事实不同时分别说明阶段:字节传输 100% 不证明服务端处理成功。展示最终响应,失败或取消任务保持可识别,提供支持的重试或续传。重新执行使用真实进度,不能保留过期完成值。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n限制播报频率,仅传达有用节点,不逐微小变化播报。取消失败保留原身份安全恢复。合同未实际衡量时,不将财务结算或审核表示为百分比。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试零、传输完成但处理待完成、失败及总量未知。\n2. 验证屏幕阅读器值与减少动态效果,不误报成功。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:b15d6555fa5009521f3b9381d79db803e8ea9866cb589d7099041b4d12a90440"},{"id":"design-toast","group":"guide","category":"应用设计规范","title":"临时提示","summary":"确认小型已完成交互,不隐藏重要失败。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/design-toast?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"usage","title":"适用场景"},{"id":"structure","title":"组成与规则"},{"id":"lightweight-feedback","title":"轻量反馈与语义"},{"id":"duration-and-queue","title":"阅读时长与队列"},{"id":"task-and-window-scope","title":"任务与窗口范围"},{"id":"responsive-content","title":"响应式文字与操作"},{"id":"interaction","title":"交互与状态"},{"id":"validation","title":"适配与验收"}],"markdown":"# 临时提示\n\n确认小型已完成交互,不隐藏重要失败。\n\n<a id=\"usage\"></a>\n\n## 适用场景\n\n临时提示用于复制成功等简短确认结果。校验错误放字段附近,高影响失败或未知写入需持久恢复。不以即逝提示作为付款或权限变更唯一依据。\n\n<a id=\"structure\"></a>\n\n## 组成与规则\n\n[design-component-toast](https://open.limeai.run/docs/design-toast?locale=zh-CN#structure)\n\n| 要素 | 规则 |\n| --- | --- |\n| 内容 | 简短客观说明结果,不重复任务标题或含糊宣称成功。 |\n| 时长 | 保留足够阅读时间,交互时适当暂停,必要可操作内容另有持久位置。 |\n| 堆叠 | 重复消息去重并限制可见堆叠,不遮活动控件。 |\n\n<a id=\"lightweight-feedback\"></a>\n\n## 轻量反馈与语义\n\nToast 用于可安全错过的简短非阻断反馈。信息、成功、警告、失败与加载是语义模式,不代表 Lime 已导出五种 Toast API。简单可逆操作已有明显即时结果时,避免重复提示。关键错误及结果未知的写入需要持久恢复入口。\n\n<a id=\"duration-and-queue\"></a>\n\n## 阅读时长与队列\n\n典型短消息至少留约四秒,包含操作或长文时延长。悬停和聚焦暂停计时。相同反馈合并,限制同时显示数量,避免新消息遮住未解决任务。常驻加载提示仅随真实任务完成、失败或取消结束。\n\n<a id=\"task-and-window-scope\"></a>\n\n## 任务与窗口范围\n\n反馈属于任务启动所在浏览器标签页,包括由对话框触发的反馈。切换标签页不能将消息移到无关任务。Lime 网页不具备参考中的操作系统、原生客户端或小程序提示通道,应使用当前网页及真实通知合同。\n\n<a id=\"responsive-content\"></a>\n\n## 响应式文字与操作\n\nToast 受当前视口及两侧边距限制,说明可换行,空间不足时操作独立成行。图标、关闭入口与首行对齐。截断不能移除后果或恢复信息,纯图标关闭操作须有可访问名称。\n\n<a id=\"interaction\"></a>\n\n## 交互与状态\n\n播报不抢焦点。关闭或撤销可键盘到达,撤销对应真实支持可逆动作。来源窗口关闭不授权向无关账号或标签页发送结果。\n\n<a id=\"validation\"></a>\n\n## 适配与验收\n\n1. 测试快速重复事件、长译文、提示附近焦点控件及关闭。\n2. 验证临时消息消失后错误和未知结果仍可恢复。\n\n[共享设计基线](https://open.limeai.run/docs/design-overview?locale=zh-CN)\n\n[响应式设计](https://open.limeai.run/docs/design-responsive?locale=zh-CN)\n","revision":"sha256:a820136f6a66d12cfe298f0bdb833e0a8a12ab1d0583af7d588d6b40fc654527"},{"id":"identity-examples","group":"guide","category":"认识开放平台","title":"多应用身份示例","summary":"跟随同一人在个人、企业和客户端上下文中的身份,不合并权限。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/identity-examples?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"personal","title":"个人网页应用"},{"id":"organization","title":"同一人的企业上下文"},{"id":"clients","title":"桌面与网页客户端"}],"markdown":"# 多应用身份示例\n\n跟随同一人在个人、企业和客户端上下文中的身份,不合并权限。\n\n<a id=\"personal\"></a>\n\n## 个人网页应用\n\n用户通过登记网页客户端登录。验证 ID Token 后,应用将 (iss, sub) 映射到本地账号。个人空间可能拥有应用或购买,但外部身份声明本身不是开放这些资产的指令。\n\n[platform-architecture](https://open.limeai.run/docs/identity-examples?locale=zh-CN#personal)\n\n<a id=\"organization\"></a>\n\n## 同一人的企业上下文\n\n同一人加入企业并使用已安装应用。成员关系、安装受众、个人同意及付费受益方是独立记录。离开企业移除当前企业访问,同时保留独立个人账号资产。\n\n[空间归属](https://open.limeai.run/docs/account-spaces?locale=zh-CN)\n\n<a id=\"clients\"></a>\n\n## 桌面与网页客户端\n\n第二客户端 Sector 可为同一人返回不同 Pairwise Subject。不能猜测关联或用邮箱匹配。产品需要跨独立登记 Sector 统一账号时,应提供明确用户确认关联流程。\n\n[标识边界](https://open.limeai.run/docs/user-identifiers?locale=zh-CN)\n","revision":"sha256:40d62dfd7cb847fd4b6c6ed81db817a12f2d0c14b900a8c2e9fa41671f6f87cf"},{"id":"choose-identifiers","group":"guide","category":"认识开放平台","title":"选择正确资源标识","summary":"使各 API 字段匹配资源类型与当前授权上下文。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/choose-identifiers?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"map","title":"先确定对象,再选 ID"},{"id":"isolation","title":"标识保持不透明且有范围"},{"id":"changes","title":"处理旧选择"}],"markdown":"# 选择正确资源标识\n\n使各 API 字段匹配资源类型与当前授权上下文。\n\n<a id=\"map\"></a>\n\n## 先确定对象,再选 ID\n\n| 任务 | 标识 |\n| --- | --- |\n| 外部账号映射 | 已验证 issuer 与 Pairwise Subject。 |\n| 配置产品 | 获授权应用记录中的 ApplicationID。 |\n| 请求 OAuth 授权 | 登记 ClientID,不是 ApplicationID 或 Secret。 |\n| 管理成员或安装 | 精确记录 ID 及获授权归属空间应用上下文。 |\n\n<a id=\"isolation\"></a>\n\n## 标识保持不透明且有范围\n\n不从前缀、数字顺序或展示标签解析权限含义。来自其他空间应用的有效 ID 仍无权使用。后端须在当前主体和预期归属下解析目标,不信任用户自填空间字段。\n\n<a id=\"changes\"></a>\n\n## 处理旧选择\n\n1. 从获授权列表详情响应读取 ID,保留精确目标上下文。\n2. 资源消失或权限被移除时刷新允许选项,由用户重新选择。\n3. 不替换为相似名称,也不推断可转换为另一平台身份。\n\n[获取标识](https://open.limeai.run/docs/get-identifiers?locale=zh-CN)\n","revision":"sha256:4b73edc755877ec6fc51bb658b52770abb7e7292867c2f457669ae6a3c808862"},{"id":"get-identifiers","group":"guide","category":"认识开放平台","title":"获取用户与应用标识","summary":"从权威协议或资源响应读取获准标识。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/get-identifiers?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"identity","title":"读取已认证主体"},{"id":"resources","title":"从获授权记录读取资源 ID"},{"id":"limits","title":"避免未支持转换"}],"markdown":"# 获取用户与应用标识\n\n从权威协议或资源响应读取获准标识。\n\n<a id=\"identity\"></a>\n\n## 读取已认证主体\n\n1. 以必要身份 Scope 完成获准 OIDC 用户流程。\n2. 验证 ID Token,使用精确 iss、sub;获取 UserInfo 时要求 sub 一致。\n3. 资料邮箱声明缺失时正确处理,不从展示名猜身份。\n\n[UserInfo 响应](https://open.limeai.run/docs/api?operation=identity_userinfo&locale=zh-CN)\n\n<a id=\"resources\"></a>\n\n## 从获授权记录读取资源 ID\n\nApp ID 从获授权应用详情列表获取,Client ID 从该应用登记 OAuth 客户端获取;空间、成员、安装 ID 从各自允许响应获取。仅当操作合同确认同一标识时,复制浏览器 URL 才可作为依据。\n\n<a id=\"limits\"></a>\n\n## 避免未支持转换\n\n不存在把邮箱换成任意用户、或将飞书 open_id、union_id 换成 Lime 身份的通用端点。仅请求任务所需数据,不通过探测标识导出目录。字段缺失可能源于 Scope 或权限边界。\n\n[选择字段](https://open.limeai.run/docs/choose-identifiers?locale=zh-CN)\n\n[身份声明](https://open.limeai.run/docs/userinfo?locale=zh-CN)\n","revision":"sha256:bc790e4f1178333fdc8ba6befd6a31662ffc0695d1b5884325755494c8de3915"},{"id":"web-development-workflow","group":"guide","category":"开发应用","title":"网页应用开发流程","summary":"从登记、服务端会话直至发布构建网页流程。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-development-workflow?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"登记目标架构"},{"id":"implement","title":"实现完整事务"},{"id":"test","title":"测试与发布"}],"markdown":"# 网页应用开发流程\n\n从登记、服务端会话直至发布构建网页流程。\n\n<a id=\"prepare\"></a>\n\n## 登记目标架构\n\n产品有服务端时优先后端会话。登记机密用户客户端,Secret 仅留后端;纯浏览器应用使用不含 Secret 的公共客户端。添加登录界面前先确定各环境精确 issuer 与回调。\n\n[配置网页客户端](https://open.limeai.run/docs/web-application-configuration?locale=zh-CN)\n\n<a id=\"implement\"></a>\n\n## 实现完整事务\n\n1. 生成 state、nonce 与 S256 PKCE,将浏览器跳转至发现授权端点。\n2. 验证回调 state,使用原回调与 verifier 兑换一次性 code。\n3. 验证身份,建立应用会话,仅返回允许的本地路由。\n\n<a id=\"test\"></a>\n\n## 测试与发布\n\n测试取消、授权码到期、跨标签 state、可选声明缺失和撤权。网页代码独立部署,再冻结审核发布平台配置。Node、Python 教程展示标准接入,不引入专有浏览器 JSSDK。\n\n[Node.js 教程](https://open.limeai.run/docs/node-web-tutorial?locale=zh-CN)\n\n[Python 教程](https://open.limeai.run/docs/python-web-tutorial?locale=zh-CN)\n\n[发布网页入口](https://open.limeai.run/docs/web-publication?locale=zh-CN)\n","revision":"sha256:56f1ad46edcbcbd31c37813d9542d4ffc4225eb0129cc4f29b1ec0349019418d"},{"id":"web-application-configuration","group":"guide","category":"开发应用","title":"配置网页应用","summary":"分别为网页入口与 OAuth 回调登记用途。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-application-configuration?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"entry","title":"选择公开入口"},{"id":"register","title":"登记环境与回调"},{"id":"verify","title":"验证客户入口"}],"markdown":"# 配置网页应用\n\n分别为网页入口与 OAuth 回调登记用途。\n\n<a id=\"entry\"></a>\n\n## 选择公开入口\n\n入口是用户开始产品的位置,OAuth 回调处理一次性协议响应,两者可为不同路径,不能混淆。公开入口可展示未登录状态,仅在任务需要时发起登录。\n\n<a id=\"register\"></a>\n\n## 登记环境与回调\n\n1. 设置目标应用、客户端环境、类型及允许身份 Scope。\n2. 登记精确回调;正式要求 HTTPS,沙箱回环仍要求登记端口。\n3. Secret 仅保留后端,使用端点前比较 Discovery issuer。\n\n[回调规则](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n\n<a id=\"verify\"></a>\n\n## 验证客户入口\n\n以未登录访客及登录后有权、无权用户打开入口。检查认证后保留安全返回路由且不重放写入。主页配置不授权将不可信远程代码载入持会话平台宿主。\n\n[Host 边界](https://open.limeai.run/docs/custom-domains?locale=zh-CN)\n","revision":"sha256:b1d2915696cae5e9d7be0ddef56a3d75e433f81a701de61fb0409ee74e659674"},{"id":"web-publication","group":"guide","category":"上线与维护","title":"发布并访问网页应用","summary":"使已部署产品与精确已审核平台配置一致。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/web-publication?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"deploy","title":"先部署真实产品"},{"id":"release","title":"发布目标配置"},{"id":"customer","title":"验证安装用户流程"}],"markdown":"# 发布并访问网页应用\n\n使已部署产品与精确已审核平台配置一致。\n\n<a id=\"deploy\"></a>\n\n## 先部署真实产品\n\n按应用自身交付流程构建部署网页。检查 TLS、公开入口、精确正式回调、后端密钥存储与错误恢复。平台版本保存配置,不部署入口 URL 背后代码。\n\n<a id=\"release\"></a>\n\n## 发布目标配置\n\n1. 冻结目标入口、客户端及 Scope 修订用于审核。\n2. 完成独立审核,显式发布已批准版本。\n3. 仅按真实正式生命周期启用合资格客户端,并核对公开应用详情。\n\n<a id=\"customer\"></a>\n\n## 验证安装用户流程\n\n以客户身份完成发现、必要安装、个人同意、登录及目标任务。测试安装受众外用户。直达网页 URL 或已批准版本都不绕过资源权限或独立商业权益。\n\n[发布控制](https://open.limeai.run/docs/publish-marketplace-application?locale=zh-CN)\n\n[可用受众](https://open.limeai.run/docs/application-availability?locale=zh-CN)\n","revision":"sha256:029517cfa308c346b8b17cb4738d10dddd38d500d2682af617fc879191f3c180"},{"id":"external-links","group":"guide","category":"开发应用","title":"外部链接与系统浏览器","summary":"显式打开目的地,不泄露凭据或依赖专有宿主。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/external-links?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"destination","title":"验证目的地"},{"id":"browser","title":"使用常规浏览器行为"},{"id":"host","title":"明确宿主能力"}],"markdown":"# 外部链接与系统浏览器\n\n显式打开目的地,不泄露凭据或依赖专有宿主。\n\n<a id=\"destination\"></a>\n\n## 验证目的地\n\n使用指向预期 Origin 的 HTTPS 链接。支持用户 URL 时解析校验协议及允许目的地,不执行 javascript:,不以后缀检查接受仿冒主机。不在外链添加令牌、设备码或 Secret。\n\n<a id=\"browser\"></a>\n\n## 使用常规浏览器行为\n\n1. 链接打开新站点或应用时说明,并使用真实可访问链接。\n2. 原生登录优先系统浏览器及受支持登记回调或设备流程。\n3. 新标签按需隔离 opener,并保留安全返回路径。\n\n<a id=\"host\"></a>\n\n## 明确宿主能力\n\n飞书外部浏览器标记与 AppLink Scheme 属宿主专有能力。Lime 不将其作为通用 URL 参数或客户端 API。自定义原生 URI Scheme 也不能替代当前精确 HTTPS 或允许沙箱回调登记。\n\n[原生接入](https://open.limeai.run/docs/native-application?locale=zh-CN)\n\n[安全回调](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n","revision":"sha256:7d1be6de00599af876334d69c16dc24b65fe6e90b10d721a17e9d1306aa95e53"},{"id":"browser-cookies","group":"guide","category":"开发应用","title":"跨域 Cookie 与嵌入限制","summary":"按浏览器隔离设计登录,避免依赖第三方 Cookie。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/browser-cookies?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"boundaries","title":"理解 Origin 与站点边界"},{"id":"flow","title":"使用顶层授权流程"},{"id":"test","title":"验证真实限制"}],"markdown":"# 跨域 Cookie 与嵌入限制\n\n按浏览器隔离设计登录,避免依赖第三方 Cookie。\n\n<a id=\"boundaries\"></a>\n\n## 理解 Origin 与站点边界\n\n浏览器可能阻止或分区第三方 Cookie,嵌入框架尤其如此。CORS 控制允许跨域读取,不共享会话、不关闭 CSRF,也不授予其他 Host 访问。Cookie 与本地存储有不同主机、Origin 规则。\n\n<a id=\"flow\"></a>\n\n## 使用顶层授权流程\n\n1. 通过可信顶层系统浏览器发起带 state、nonce、PKCE 的 OAuth。\n2. 返回精确回调,建立应用自身适当范围会话。\n3. 将嵌入会话被阻止视为可恢复浏览器限制,提供安全在浏览器打开选项。\n\n<a id=\"test\"></a>\n\n## 验证真实限制\n\n测试 Safari、iOS、禁用第三方 Cookie 的 Chromium、隐私模式和全新未登录环境。不设置跨全部平台子域 Cookie,也不宣称 Lime 自有域名或嵌入托管范围已完成。自身产品使用 iframe 或 postMessage 时须明确校验策略和 Origin。\n\n[网页会话](https://open.limeai.run/docs/web-application?locale=zh-CN)\n\n[本地缓存隔离](https://open.limeai.run/docs/local-cache-isolation?locale=zh-CN)\n","revision":"sha256:e140c664ba457ee04e1b42aadb5c51e762faceb5bfd9a590911da42f66fef403"},{"id":"mobile-login","group":"guide","category":"授权流程","title":"移动应用登录","summary":"使用标准浏览器身份流程,遵守当前回调支持范围。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/mobile-login?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"client","title":"分发式软件作为公共客户端"},{"id":"choose","title":"选择受支持完成路径"},{"id":"lifecycle","title":"处理打断与安全存储"}],"markdown":"# 移动应用登录\n\n使用标准浏览器身份流程,遵守当前回调支持范围。\n\n<a id=\"client\"></a>\n\n## 分发式软件作为公共客户端\n\n移动应用无法保护编译内嵌 Client Secret。应登记适用公共用户客户端并明确 issuer 与客户端身份。Lime 尚未提供专用 iOS、Android、Harmony 宿主 SDK 或自动原生出包服务。\n\n<a id=\"choose\"></a>\n\n## 选择受支持完成路径\n\n只有应用能在当前登记合同下完成获准精确回调时,才使用系统浏览器及 S256 PKCE。不编造自定义 URI Scheme 或飞书 AppLink 回调。回调无法支持时选择获准设备授权流程。\n\n[设备授权](https://open.limeai.run/docs/device-authorization-flow?locale=zh-CN)\n\n[受支持回调](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n\n<a id=\"lifecycle\"></a>\n\n## 处理打断与安全存储\n\n1. 在支持的应用切换间将待授权绑定原 state 与截止时间。\n2. 授权凭据存入系统凭据库,并串行刷新轮换。\n3. 取消、进程终止或一次性兑换未知时,显式重新登录,不重放旧 code。\n\n[原生架构](https://open.limeai.run/docs/native-application?locale=zh-CN)\n","revision":"sha256:f2e6f1e77f5e7df7add58983270b812fb11af736fd589cd64c009e74e22f1e4e"},{"id":"user-consent","group":"guide","category":"授权流程","title":"用户同意与已授予 Scope","summary":"申请最小必要权限,遵守实际授予结果。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/user-consent?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"request","title":"申请前说明权限"},{"id":"decision","title":"尊重拒绝与部分信息"},{"id":"independent","title":"其他决定独立处理"}],"markdown":"# 用户同意与已授予 Scope\n\n申请最小必要权限,遵守实际授予结果。\n\n<a id=\"request\"></a>\n\n## 申请前说明权限\n\n说明应用、功能、请求数据与相关空间安装。身份请求 openid,仅按需请求 profile、email、offline_access。受控管理 Scope 仅限明确 provision 的 CLI 客户端,普通第三方不能自行添加。\n\n<a id=\"decision\"></a>\n\n## 尊重拒绝与部分信息\n\n1. 将 access_denied 视作用户决定,提供安全返回,不循环催批。\n2. 读取返回 Scope 与可选声明,不假定全部请求已授予。\n3. 新功能需要额外受支持权限时,通过新的显式授权申请。\n\n<a id=\"independent\"></a>\n\n## 其他决定独立处理\n\n企业安装批准、用户 OAuth 同意、应用协作、购买与营销偏好用途不同,互不推导。用户已同意后,资源权限仍按当前成员和上下文检查。\n\n[Scope 目录](https://open.limeai.run/docs/scopes?locale=zh-CN)\n\n[受众边界](https://open.limeai.run/docs/application-availability?locale=zh-CN)\n","revision":"sha256:b745cd53dc0dea67d84c941e27bf6c43ec6058621eb4372327b5fd071bc6b65f"},{"id":"local-cache-isolation","group":"guide","category":"开发规范","title":"退出与本地缓存隔离","summary":"使缓存与待处理任务限定于创建它们的账号、空间及应用。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/local-cache-isolation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"scope","title":"分区应用状态"},{"id":"switch","title":"上下文变化时取消清理"},{"id":"credentials","title":"凭据独立处理"}],"markdown":"# 退出与本地缓存隔离\n\n使缓存与待处理任务限定于创建它们的账号、空间及应用。\n\n<a id=\"scope\"></a>\n\n## 分区应用状态\n\n私有缓存按适用账号、空间、应用与环境分区。浏览器 localStorage 仅隔离 Origin,不隔离账号。同浏览器另一用户不能看见前用户缓存、草稿或待处理命令。\n\n<a id=\"switch\"></a>\n\n## 上下文变化时取消清理\n\n1. 退出或切换账号空间时,取消旧读取并阻止旧响应更新当前视图。\n2. 按政策清理私有可见数据与账号缓存,仅保留允许非敏感偏好。\n3. 另一账号登录后,绝不重放前账号待处理写入。\n\n<a id=\"credentials\"></a>\n\n## 凭据独立处理\n\n长期授权使用后端或系统凭据库,不能随意放 localStorage。退出清理自身会话,远端授权按受支持端点撤销。Lime 不承诺由飞书宿主自动清理独立应用 Origin 存储。\n\n[撤权](https://open.limeai.run/docs/token-revocation?locale=zh-CN)\n\n[浏览器隔离](https://open.limeai.run/docs/browser-cookies?locale=zh-CN)\n","revision":"sha256:d3fee05e8a7a753be806cdf6554df3b350d9e72eee32f0f6728332cdfb1d8b91"},{"id":"version-activation","group":"guide","category":"上线与维护","title":"配置变更何时生效","summary":"分别追踪草稿、冻结版本、发布、客户端启用与客户安装。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/version-activation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"draft","title":"草稿编辑不等于已发布版本"},{"id":"gates","title":"核对适用关卡"},{"id":"diagnose","title":"排查变更未出现"}],"markdown":"# 配置变更何时生效\n\n分别追踪草稿、冻结版本、发布、客户端启用与客户安装。\n\n<a id=\"draft\"></a>\n\n## 草稿编辑不等于已发布版本\n\n可编辑配置 revision 记录当前开发修改,冻结版本捕获精确修订供独立审核。冻结后改草稿不能悄悄修改已审核快照或历史公开版本。\n\n[application-lifecycle](https://open.limeai.run/docs/version-activation?locale=zh-CN#draft)\n\n<a id=\"gates\"></a>\n\n## 核对适用关卡\n\n| 关卡 | 含义 |\n| --- | --- |\n| 审核批准 | 冻结版本通过独立决定,不自动发布。 |\n| 发布 | 精确版本按分发政策可用。 |\n| 客户端启用 | 正式客户端满足生命周期及部署前提。 |\n| 安装与同意 | 客户空间和用户分别批准适用版本、Scope。 |\n\n<a id=\"diagnose\"></a>\n\n## 排查变更未出现\n\n1. 比较草稿 revision、版本快照及当前已发布版本 ID。\n2. 确认客户端环境启用及客户实际安装同意。\n3. 确认权威状态后再刷新旧读取,不为使预览可用而扩权。\n\n[版本记录](https://open.limeai.run/docs/releases?locale=zh-CN)\n","revision":"sha256:7ec895b66ac8888005928be2051dc3c58d330a36a03e40c23fbec2de58eca016"},{"id":"token-request-security","group":"guide","category":"开发规范","title":"安全令牌请求","summary":"使用表单 POST 与登记客户端认证,不泄露敏感参数。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/token-request-security?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"transport","title":"使用发现的 HTTPS 端点"},{"id":"client","title":"认证已登记客户端"},{"id":"response","title":"保护返回授权"}],"markdown":"# 安全令牌请求\n\n使用表单 POST 与登记客户端认证,不泄露敏感参数。\n\n<a id=\"transport\"></a>\n\n## 使用发现的 HTTPS 端点\n\n从可信 Discovery 读取 token_endpoint,以 application/x-www-form-urlencoded POST 发送授权类型参数。不能把 code、refresh_token、Secret 或 Access Token 放入 GET Query、复制 URL 或浏览器可见诊断。\n\n<a id=\"client\"></a>\n\n## 认证已登记客户端\n\n公共客户端发送 client_id,不带 Secret。机密机器客户端按登记使用 client_secret_basic,Basic 构造前分别编码 Client ID 和 Secret。当前合同不支持 client_secret_post,不将失败机密客户端降级公共客户端重试。\n\n<a id=\"response\"></a>\n\n## 保护返回授权\n\n1. 解析 OAuth 原生 JSON 及实际 token_type、scope、expires_in。\n2. 凭据存入后端系统存储,排除日志与支持导出。\n3. 遵守授权码一次性与刷新串行轮换,响应未知按对应流程恢复。\n\n[Token 请求 Schema](https://open.limeai.run/docs/api?operation=identity_token&locale=zh-CN)\n\n[刷新恢复](https://open.limeai.run/docs/refresh-token-flow?locale=zh-CN)\n","revision":"sha256:513d21554929dd72cd3131fb83c88354ff164e4cb909ba07f94e425ef4bc71c1"},{"id":"token-compatibility","group":"guide","category":"开发规范","title":"令牌格式与兼容性","summary":"Bearer 凭据保持不透明,身份声明通过受支持库验证。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/token-compatibility?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"opaque","title":"不依赖偶然格式"},{"id":"assertion","title":"按声明验证 ID Token"},{"id":"upgrade","title":"验证存储与代理限制"}],"markdown":"# 令牌格式与兼容性\n\nBearer 凭据保持不透明,身份声明通过受支持库验证。\n\n<a id=\"opaque\"></a>\n\n## 不依赖偶然格式\n\n不假定访问刷新令牌长度、前缀、分段数或可解码账号 ID 固定。在合理大小限制内保存完整值,按声明头表单原样发送,并排除日志。旧版本正则不是验证方法。\n\n<a id=\"assertion\"></a>\n\n## 按声明验证 ID Token\n\nID Token 按 JWT 流程验证签名、允许算法、issuer、Audience、时间与事务 nonce。仅 Base64 解码不算验证。资源 API Access Token 和 ID Token 即使均似 JWT,也仍为不同凭据。\n\n<a id=\"upgrade\"></a>\n\n## 验证存储与代理限制\n\n1. 验证完整支持令牌大小通过请求头、代理、SDK 与凭据库不截断。\n2. 通过库合同处理密钥轮换和可选响应字段,不用固定字符串解析。\n3. 升级时固定复核依赖,再运行授权、刷新与撤权。\n\n[ID Token 校验](https://open.limeai.run/docs/id-token-validation?locale=zh-CN)\n\n[迁移检查](https://open.limeai.run/docs/platform-updates?locale=zh-CN)\n","revision":"sha256:b5cec8ba7e29c84c27a25bce71fd2eeb95f4a86b95b5ecc68f9a7634b334bf8d"},{"id":"tls-troubleshooting","group":"guide","category":"问题排查","title":"HTTPS 与证书连接问题","summary":"先解决传输信任,再诊断 OAuth 或 API 响应。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/tls-troubleshooting?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# HTTPS 与证书连接问题\n\n先解决传输信任,再诊断 OAuth 或 API 响应。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n浏览器或 CLI 证书错误发生在可信 API 响应前。记录精确预期主机与脱敏错误,不关闭证书校验来完成登录或正式调用。服务器公开证书与 Client Secret 用途不同。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 主机与时钟 | 核对 issuer、API Origin、主机名匹配、本机时间及证书有效期。 |\n| 证书链与代理 | 检查信任链与获准企业代理,不从失败页面导入任意根证书。 |\n| 本地开发 | 使用仓库目标本地 HTTPS 或明确允许回环回调,保留环境边界。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 核对预期主机可达性,不向替代 Origin 发送凭据。\n2. 由负责人修复证书链或获准信任配置,再执行 Discovery。\n3. 传输成功后独立诊断真实 HTTP 或协议响应。\n\n[连接配置](https://open.limeai.run/docs/development-environment?locale=zh-CN)\n\n[可信发现](https://open.limeai.run/docs/oidc-discovery?locale=zh-CN)\n","revision":"sha256:610fd9b28bc0dd37d84f9c0a16541bcbc6e9fdd2369ba8744214e6d74ac5352d"},{"id":"credential-selection","group":"guide","category":"问题排查","title":"选择正确令牌","summary":"仅将凭据用于预期接收方与授权。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/credential-selection?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 选择正确令牌\n\n仅将凭据用于预期接收方与授权。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n看似有效令牌仍可能用错。先确定任务是客户端登录、用户资源调用、刷新授权还是获准机器操作,不逐个尝试全部令牌碰运气。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| ID Token | 已验证客户端身份声明,不是资源 API Bearer 令牌。 |\n| Access Token | 仅调用允许 Audience 资源及已授予 Scope,并检查当前权限。 |\n| Refresh Token | 仅在 Token 端点刷新原用户授权,并串行轮换。 |\n| 机器令牌 | 仅获准机器资源,不能调用专用用户管理 API。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 核对 issuer、登记客户端与目标 Audience,不记录凭据。\n2. 检查实际返回 Scope 与到期,再选择资源规定流程。\n3. 授权不符时重新显式授权,不给旧令牌换标签。\n\n[令牌参考](https://open.limeai.run/docs/tokens?locale=zh-CN)\n\n[管理前提](https://open.limeai.run/docs/management-api?locale=zh-CN)\n","revision":"sha256:b99b0d06131f19c5bb94b9780cf575650344b6ac0a29b8ecce5a1eb5c90e4bef"},{"id":"application-identifiers","group":"guide","category":"问题排查","title":"查找 App ID 与 Client ID","summary":"区分产品记录、登记调用方与凭据。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-identifiers?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 查找 App ID 与 Client ID\n\n区分产品记录、登记调用方与凭据。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n把 ApplicationID 当作 OAuth client_id 会造成登记不匹配。产品可有多个不同环境类型客户端。Secret 用于认证合资格客户端,不是标识,也不能复制到支持报告。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 应用 | 从获授权应用列表详情读取稳定 App ID。 |\n| 客户端 | 从应用 OAuth 客户端记录读取 Client ID、类型、环境与启用。 |\n| 上下文 | 核对归属空间及 API Origin,不假定其他部署 ID 可通用。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 在正确账号空间下选择目标应用。\n2. 选择匹配沙箱正式客户端,并比较精确回调和允许 Scope。\n3. 更新应用配置,再启动全新授权事务。\n\n[对象模型](https://open.limeai.run/docs/application-concepts?locale=zh-CN)\n\n[标识来源](https://open.limeai.run/docs/get-identifiers?locale=zh-CN)\n","revision":"sha256:415ea751fd44457f2526d610d191a3d73a16c262ce7e7e5582517420603a7602"},{"id":"missing-grant","group":"guide","category":"问题排查","title":"用户尚未授予必要 Scope","summary":"说明授权缺失,不重复催批或绕过同意。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/missing-grant?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 用户尚未授予必要 Scope\n\n说明授权缺失,不重复催批或绕过同意。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n登记允许 Scope 和请求 Scope 不证明用户已授予。需核对实际令牌响应与功能要求;即使 OAuth Scope 已有,仍可能存在成员或应用 ACL 拒绝。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 客户端资格 | 确认登记客户端允许请求;普通第三方不能自行申请受控管理 Scope。 |\n| 实际授权 | 比较返回已授予 Scope 与精确操作要求,读写 Scope 互不推导。 |\n| 当前权限 | 分别检查成员角色、应用环境 ACL 与安装。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 显示功能与最小缺失权限,并有明确取消返回。\n2. 允许时针对该 Scope 发起新显式用户授权,尊重拒绝。\n3. 重提保留命令前复查实际授权和当前资源权限。\n\n[同意行为](https://open.limeai.run/docs/user-consent?locale=zh-CN)\n\n[Scope 目录](https://open.limeai.run/docs/scopes?locale=zh-CN)\n","revision":"sha256:a4c3067eda5bf1c560368c9a87fef4e1c04120679ac888dc6f8a8c99358077c4"},{"id":"invalid-token","group":"guide","category":"问题排查","title":"访问令牌无效或到期","summary":"区分到期、资源不匹配与撤权,避免不安全降级。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/invalid-token?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 访问令牌无效或到期\n\n区分到期、资源不匹配与撤权,避免不安全降级。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n401 或 OAuth invalid_token 涉及提交凭据,原因可能是到期、issuer 或 Audience 错误或无效授权。403 则可能属于当前资源权限。保留稳定码与请求标识,不记录令牌。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 传输 | 完整凭据放声明 Bearer 头,并使用正确 API Origin。 |\n| 有效期 | 按 expires_in 服务端政策及本机时钟判断,不本地修改到期声明。 |\n| 资源 | 核对 Audience、专用客户端与实际 Scope,ID 或机器令牌不能替代。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 原用户授权仍有效且支持时,加串行锁刷新一次。\n2. invalid_grant 或刷新轮换未知时停止重放,重新交互授权。\n3. 重新认证后检查原写入,不无限重试。\n\n[刷新恢复](https://open.limeai.run/docs/refresh-token-flow?locale=zh-CN)\n\n[凭据类型](https://open.limeai.run/docs/credential-selection?locale=zh-CN)\n","revision":"sha256:ca58f253b0fdbbc01e54cf79cedcd83690be25cdf57e6687ac7c773b88fb76f6"},{"id":"login-troubleshooting","group":"guide","category":"问题排查","title":"登录与授权码问题","summary":"修改身份或权限设置前先定位失败登录阶段。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/login-troubleshooting?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 登录与授权码问题\n\n修改身份或权限设置前先定位失败登录阶段。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n区分打开授权、登录、用户同意、返回回调、兑换 code 与验证身份。浏览器登录成功不证明同意或兑换完成。保留脱敏阶段错误与原事务截止时间。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 授权 | 检查客户端启用、精确回调、code 与 query 模式、支持 prompt 及允许 Scope。 |\n| 事务 | 匹配 state、nonce 及原 S256 verifier,并发标签使用独立事务。 |\n| 兑换 | 使用表单 POST、登记客户端认证、精确原回调及未到期未消费 code。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 用户拒绝或静默 login_required、consent_required 时安全返回交互流程。\n2. 旧或未知一次性事务应重启,不重放 code。\n3. 完整验证返回 ID Token 后才建立本地会话。\n\n[授权码流程](https://open.limeai.run/docs/authorization-code-flow?locale=zh-CN)\n\n[回调校验](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n","revision":"sha256:183218dddefc39d486e177293c65c5567acb580dede9e85b3898719524c3f2b5"},{"id":"credentials-faq","group":"guide","category":"问题排查","title":"授权凭据常见问题","summary":"确定凭据存放、到期、轮换及离开应用的方式。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/credentials-faq?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 授权凭据常见问题\n\n确定凭据存放、到期、轮换及离开应用的方式。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n凭据属于登记客户端与授权,不是应用通用密码。公共二进制无法隐藏 Secret,刷新授权不扩权或恢复已撤销资源访问。npm 安装成功不代表实际 CLI 客户端已 provision。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 后端 | Secret 和刷新令牌放获准服务端密钥存储并最小访问。 |\n| 原生与 CLI | 使用系统凭据存储并串行轮换,配置与秘密分开。 |\n| 浏览器 | 可行时采用适当后端会话,绝不嵌入 Client Secret。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 从响应读取实际到期 Scope,不从解码字符串推断有效。\n2. 退出清理自身会话,需远端撤权且支持时调用撤权。\n3. 疑似泄露时轮换停用对应凭据并执行事件流程。\n\n[轮换 Secret](https://open.limeai.run/docs/client-secret-rotation?locale=zh-CN)\n\n[撤销授权](https://open.limeai.run/docs/token-revocation?locale=zh-CN)\n","revision":"sha256:cdb73c2d7eb1cb96e3052115bc84548f39e38fb807686dd868352f20bef439e8"},{"id":"permissions-faq","group":"guide","category":"问题排查","title":"应用权限与数据范围","summary":"沿客户端、主体与资源边界追踪权限拒绝。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/permissions-faq?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 应用权限与数据范围\n\n沿客户端、主体与资源边界追踪权限拒绝。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\nOAuth Scope 限定委托 API 使用,不代表全部资源可读。当前成员角色、应用环境 ACL、安装、近期认证与操作政策仍适用。浏览器菜单可见或用户是企业所有者均不足以替代。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 领域 | 使用正确 open、account、operations、admin Scope,读写独立。 |\n| 资源 | 核对精确归属空间、应用、环境及目标记录。 |\n| 敏感动作 | 按要求保留近期强认证及独立审核。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 读取稳定拒绝码,确定失败边界,不一律扩大 Scope。\n2. 由合资格归属方通过真实流程只修正缺失角色、ACL 或安装授权。\n3. 重新读取当前权限,重试前让用户检查原动作。\n\n[成员角色](https://open.limeai.run/docs/members-permissions?locale=zh-CN)\n\n[管理合同](https://open.limeai.run/docs/management-api?locale=zh-CN)\n","revision":"sha256:e591fe0504dcc968b168e1ab1a55042426340938eee8d99fdbbd2fbfa3ea3ac4"},{"id":"webhook-troubleshooting","group":"guide","category":"问题排查","title":"事件与回调诊断","summary":"区分端点验证、投递接收与业务处理。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/webhook-troubleshooting?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 事件与回调诊断\n\n区分端点验证、投递接收与业务处理。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n端点 Challenge、签名事件投递与 OAuth 回调属于不同协议。检查精确失败阶段与环境。HTTP 接收不证明后续消费者或客户任务已完成。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 可达性 | 验证配置 HTTPS 端点、证书、有限请求处理及预期方法。 |\n| 签名 | 使用精确原始字节、正确环境签名密钥及必要时间重放检查。 |\n| 消费者 | 沿稳定事件来源 ID 追踪持久 Inbox、去重与处理结果。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 保留原事件,修复实际接收或消费者错误。\n2. 仅按受支持获授权合同重试重投,不生成另一业务命令。\n3. 验证重复乱序,并分别检查各独立消费者。\n\n[签名验证](https://open.limeai.run/docs/webhook-signatures?locale=zh-CN)\n\n[可靠消费者](https://open.limeai.run/docs/event-handler-design?locale=zh-CN)\n","revision":"sha256:04a0baca05542db9f33584426dba86aac37df87f1fa0acf5b8065705f9f81006"},{"id":"application-troubleshooting","group":"guide","category":"问题排查","title":"应用管理与发布问题","summary":"定位相关归属、修订与生命周期状态。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/application-troubleshooting?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 应用管理与发布问题\n\n定位相关归属、修订与生命周期状态。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n应用不可见可能是归属空间不对或协作被移除,配置变更未出现可能是仍使用旧公开版本。不要首先重建应用或转移归属。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 可见性 | 检查当前用户、归属空间、协作角色与允许环境。 |\n| 冲突 | 覆盖他人修改前比较当前 revision 与编辑快照。 |\n| 版本 | 分别读取冻结快照、审核决定、显式发布及客户端启用。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 重新读取获授权记录,保留目标未保存值。\n2. 通过有意新编辑解决 revision 差异,不强制覆盖。\n3. 版本问题比较精确版本 ID,并使用受支持生命周期操作。\n\n[应用协作](https://open.limeai.run/docs/collaboration?locale=zh-CN)\n\n[配置生效](https://open.limeai.run/docs/version-activation?locale=zh-CN)\n","revision":"sha256:f2711782f13aae1eeb2fc16c1e83b87c682e0441e12bb032489033e94a5e90d9"},{"id":"marketplace-troubleshooting","group":"guide","category":"问题排查","title":"上架、审核与安装问题","summary":"区分产品发现、发布方批准与客户访问。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/marketplace-troubleshooting?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"symptoms","title":"识别问题"},{"id":"causes","title":"核对对应边界"},{"id":"recovery","title":"安全恢复"}],"markdown":"# 上架、审核与安装问题\n\n区分产品发现、发布方批准与客户访问。\n\n<a id=\"symptoms\"></a>\n\n## 识别问题\n\n公开上架不证明客户已安装,已批准版本不自动发布,安装不购买付费产品。先检查精确迁移,再修改公开内容或扩大权限。\n\n<a id=\"causes\"></a>\n\n## 核对对应边界\n\n| 检查 | 作用 |\n| --- | --- |\n| 审核 | 检查冻结版本与拒绝理由,草稿修改需新审核快照。 |\n| 分发 | 检查公开版本、来源政策、目标空间与安装受众。 |\n| 商业 | 读取原订单、付款、权益及支持环境,不只看上架付费标记。 |\n\n<a id=\"recovery\"></a>\n\n## 安全恢复\n\n1. 确认客户进入目标已发布应用。\n2. 由合资格空间主体显式检查安装及必要用户同意。\n3. 未完成合作入驻与正式计费范围明确标识,不提供不可用动作。\n\n[上架流程](https://open.limeai.run/docs/marketplace-overview?locale=zh-CN)\n\n[安装](https://open.limeai.run/docs/installations?locale=zh-CN)\n","revision":"sha256:7c33ce8fffb285759d7fcb90857d3dca686d2c419be1bb80cbc4e1e97dc64ad1"},{"id":"publisher-requirements","group":"guide","category":"上线与维护","title":"应用发布方运营要求","summary":"维护准确资料、受控访问与可恢复受支持产品。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/publisher-requirements?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"content","title":"保持公开声明准确"},{"id":"access","title":"复核访问与数据使用"},{"id":"continuity","title":"维护期间保留来源事实"}],"markdown":"# 应用发布方运营要求\n\n维护准确资料、受控访问与可恢复受支持产品。\n\n<a id=\"content\"></a>\n\n## 保持公开声明准确\n\n维护产品身份、语言版本、隐私条款与支持路径。准确说明已交付功能、环境限制及商业条款。没有对应获授权发布与验证时,不宣称 Lime 认证、正式供应商已完成或专用 SDK 可用。\n\n<a id=\"access\"></a>\n\n## 复核访问与数据使用\n\n1. 协作运营角色限定当前职责,用后移除临时测试权限。\n2. 数据使用遵守实际同意、安装和保留政策,不变现无关客户数据。\n3. 轮换泄露凭据,维护明确事件负责人及恢复路径。\n\n<a id=\"continuity\"></a>\n\n## 维护期间保留来源事实\n\n配置变更遵守审核生命周期,付款事件使用来源领域恢复。目录下架、软件部署或角色变更不能改写历史订单,也不能假装外部投递已成功。这是 Lime 运营指南,不是复制飞书协议,也不替代适用法律条款。\n\n[数据保护](https://open.limeai.run/docs/data-protection?locale=zh-CN)\n\n[事件响应](https://open.limeai.run/docs/incident-response?locale=zh-CN)\n\n[变更管理](https://open.limeai.run/docs/platform-updates?locale=zh-CN)\n","revision":"sha256:a1b655ace820caf490af54aafd18967a07735fea088baa5e074a5596b292cd04"},{"id":"client-overview","group":"client","category":"客户端接入","title":"客户端 API 概述","summary":"通过标准身份协议接入网页、桌面和移动应用。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"choose-runtime","title":"选择运行环境"},{"id":"capabilities","title":"可用客户端能力"},{"id":"library","title":"选择 OIDC 库"},{"id":"access","title":"开始测试前"}],"markdown":"# 客户端 API 概述\n\n通过标准身份协议接入网页、桌面和移动应用。\n\n<a id=\"choose-runtime\"></a>\n\n## 选择运行环境\n\nLime 应用运行在你自己的基础设施或设备上。按凭据能否安全保管选择客户端类型,再登记精确回调和 Scope。网页、原生安装包与后端服务分别登记客户端身份。\n\n[授权通过系统浏览器完成,应用凭据保留在可信运行环境内。](https://open.limeai.run/docs/client-overview?locale=zh-CN#choose-runtime)\n\n| 运行环境 | 接入方式 | 凭据边界 |\n| --- | --- | --- |\n| 带后端的网页应用 | 通过用户浏览器完成授权码与 S256 PKCE | 机密客户端凭据和令牌留在后端,浏览器使用应用会话 Cookie。 |\n| 纯浏览器应用 | 公共客户端与 S256 PKCE,并确认端点实际跨域策略 | 不分发共享 Secret;无法保护令牌或回调时采用应用后端。 |\n| 桌面或移动应用 | 通过系统浏览器和允许的 HTTPS 回调授权,或使用设备授权 | 使用公共客户端和操作系统凭据库。 |\n| 命令行 | 通过已登记的 CLI 客户端完成设备授权 | 使用私有本地文件,并绑定 Auth 与 API 来源。 |\n\n<a id=\"capabilities\"></a>\n\n## 可用客户端能力\n\n可发现 OAuth/OIDC 元数据、发起浏览器授权、通过 PKCE 兑换授权码、使用 OIDC 库验证 ID Token、读取 UserInfo、刷新或撤销授权,并在不便完成回调时使用设备授权。请求字段与响应以公开 API 参考为准。\n\nLime 当前提供标准 HTTPS 协议和已发布的 CLI;未提供摄像头、通讯录、聊天、原生导航或文件系统的宿主 JavaScript Bridge。这些任务使用所在平台的 Web 或操作系统 API。\n\n[开始客户端接入](https://open.limeai.run/docs/client-quick-start?locale=zh-CN)\n\n[公开协议](https://open.limeai.run/docs/api-overview?locale=zh-CN)\n\n[LimeCloud CLI](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n<a id=\"library\"></a>\n\n## 选择 OIDC 库\n\n使用持续维护的 OIDC 库处理发现、S256、state 与 nonce 校验、签名密钥轮换和 ID Token 验证。核对库的运行环境、回调事务存储、client_secret_basic 配置与版本维护策略。库不会替你登记客户端或授予权限。\n\n[SDK 与接入方式](https://open.limeai.run/docs/sdk-integration?locale=zh-CN)\n\n[Node.js 教程](https://open.limeai.run/docs/node-web-tutorial?locale=zh-CN)\n\n[Python 教程](https://open.limeai.run/docs/python-web-tutorial?locale=zh-CN)\n\n<a id=\"access\"></a>\n\n## 开始测试前\n\n1. 创建应用,选择沙箱环境并添加测试人员。\n2. 登记公共或机密用户客户端及精确回调,机器客户端单独管理。\n3. 配置需要的 OIDC Scope,完成显式用户授权,验证回调后再建立应用自身会话。\n\n[登记客户端](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[客户端权限](https://open.limeai.run/docs/client-permissions?locale=zh-CN)\n","revision":"sha256:5129e8bc135b11f7f19d521bf55f296ca8342fa64b3de9becedcb51579f43495"},{"id":"client-quick-start","group":"client","category":"客户端接入","title":"客户端快速开始","summary":"完成一次浏览器登录,获取经过验证的用户资料。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-quick-start?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"prepare","title":"一、登记回调"},{"id":"discover","title":"二、发现端点"},{"id":"transaction","title":"三、创建授权事务"},{"id":"callback","title":"四、验证返回结果"},{"id":"device","title":"不便完成回调时"}],"markdown":"# 客户端快速开始\n\n完成一次浏览器登录,获取经过验证的用户资料。\n\n<a id=\"prepare\"></a>\n\n## 一、登记回调\n\n创建沙箱用户客户端。本地后端开发可登记精确的回环回调,例如 http://127.0.0.1:3000/callback。正式环境要求显式登记的 HTTPS 回调。协议、主机、端口、路径和查询必须匹配;localhost 与 127.0.0.1 是不同回调。\n\n[回调验证规则](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n\n<a id=\"discover\"></a>\n\n## 二、发现端点\n\n配置可信 Issuer,精确核对发现文档中的 issuer,并使用该可信服务返回的元数据。不要从回调参数接受任意 Issuer 或令牌端点。\n\n```sh\ncurl --fail --silent --show-error \\\n \"https://YOUR_AUTH_ORIGIN/.well-known/openid-configuration\"\n```\n\n[OIDC 发现](https://open.limeai.run/docs/oidc-discovery?locale=zh-CN)\n\n<a id=\"transaction\"></a>\n\n## 三、创建授权事务\n\n1. 为每次请求生成密码学随机的 state、nonce 与 PKCE verifier。通过 SHA-256 与 base64url 派生 code_challenge,仅向授权端点发送 challenge。\n2. 将这些值、精确回调、Issuer 和 Client ID 绑定到发起会话,设置短期有效期,并在跳转前完成保存。\n3. 携带 response_type=code、scope=openid profile、state、nonce、code_challenge 和 code_challenge_method=S256,导航到 /oauth/authorize。\n\n[授权码流程](https://open.limeai.run/docs/authorization-code-flow?locale=zh-CN)\n\n[安全保存授权事务](https://open.limeai.run/docs/client-storage?locale=zh-CN)\n\n<a id=\"callback\"></a>\n\n## 四、验证返回结果\n\n在接受 code 或 error 前,使用原发起会话验证 state,并一次性消费事务。成功时向 /oauth/token 发送表单,使用原 redirect_uri 和 verifier 兑换授权码;机密客户端使用 HTTP Basic。通过 OIDC 库验证 nonce、issuer、audience、签名与有效期。\n\n使用访问令牌读取 UserInfo,将其 sub 与已验证的 ID Token 主体核对,再创建应用自身会话。从地址栏移除 code 与 state;用户拒绝或事务到期时,提供清楚的重新登录入口。\n\n[ID Token 验证](https://open.limeai.run/docs/id-token-validation?locale=zh-CN)\n\n[用户资料](https://open.limeai.run/docs/userinfo?locale=zh-CN)\n\n[处理客户端错误](https://open.limeai.run/docs/client-errors?locale=zh-CN)\n\n<a id=\"device\"></a>\n\n## 不便完成回调时\n\n终端和受限原生应用可使用设备授权。展示服务端返回的验证地址与用户码,让用户在自己的浏览器中完成授权,并按返回间隔轮询。设备授权是独立流程,不发送 PKCE 字段。\n\n[设备授权](https://open.limeai.run/docs/device-authorization-flow?locale=zh-CN)\n\n[CLI 设备登录教程](https://open.limeai.run/docs/device-tutorial?locale=zh-CN)\n","revision":"sha256:014f1297e89238f4eaf4122e985f88c75d6b764933fcfbd7882780e6bfd508df"},{"id":"client-permissions","group":"client","category":"客户端接入","title":"客户端权限与用户同意","summary":"区分客户端登记、用户同意、令牌 Scope 和资源授权。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-permissions?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"layers","title":"访问如何判定"},{"id":"oidc","title":"OIDC 资料权限"},{"id":"delegation","title":"委托平台访问"},{"id":"denied","title":"拒绝、缩减与撤销"}],"markdown":"# 客户端权限与用户同意\n\n区分客户端登记、用户同意、令牌 Scope 和资源授权。\n\n<a id=\"layers\"></a>\n\n## 访问如何判定\n\n[Scope 允许进入接口,资源仍会检查当前访问权限。](https://open.limeai.run/docs/client-permissions?locale=zh-CN#layers)\n\n| 层次 | 含义 |\n| --- | --- |\n| 客户端登记 | 客户端只能申请已配置的 Scope 与允许的授权类型。 |\n| 用户同意 | 用户先核对应用、Scope 与适用的安装上下文,再决定是否允许访问。 |\n| 已签发令牌 | 令牌绑定客户端、Audience、Scope 与有效期,本地权限标记无法扩大授权。 |\n| 资源授权 | 服务端检查当前成员关系、角色、环境、安装及业务前置条件。 |\n\n<a id=\"oidc\"></a>\n\n## OIDC 资料权限\n\n| Scope | 用途 |\n| --- | --- |\n| openid | 发起 OIDC 登录,获取可验证的主体标识。 |\n| profile | 申请允许的资料字段,例如显示名称。 |\n| email | 申请允许的邮箱字段;账号身份使用 sub。 |\n| offline_access | 在客户端及授权允许时申请刷新令牌,并安全保管。 |\n\n[配置 OAuth 权限](https://open.limeai.run/docs/scopes?locale=zh-CN)\n\n[令牌类型](https://open.limeai.run/docs/tokens?locale=zh-CN)\n\n<a id=\"delegation\"></a>\n\n## 委托平台访问\n\n专用平台 CLI 显式使用 lime:open、lime:account、lime:operations 和 lime:admin 的 read/write Scope。这些权限要求独立配置、绑定 API Audience 的公共 CLI 客户端。登记普通应用客户端不会启用平台管理 Scope,机器授权也不能替代用户的平台角色。\n\n[受控管理 API](https://open.limeai.run/docs/management-api?locale=zh-CN)\n\n[CLI 授权](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n<a id=\"denied\"></a>\n\n## 拒绝、缩减与撤销\n\n1. 将 access_denied 视为已完成的用户决定。与登录无关的本地功能保持可用,由用户显式重新发起登录。\n2. 核对返回的 scope 并更新本地授权记录,不假定请求的所有 Scope 都已授予。\n3. 角色、成员关系或安装改变后,重新核对资源授权并遵守拒绝结果。反复申请更大 Scope 无法恢复被移除的角色。\n\n[撤销授权](https://open.limeai.run/docs/token-revocation?locale=zh-CN)\n\n[授权错误恢复](https://open.limeai.run/docs/client-errors?locale=zh-CN)\n","revision":"sha256:87db0d0c93046dfd27c7c8488b9fa35989116041d3d84bc8555499cd3b2aa284"},{"id":"client-compatibility","group":"client","category":"运行环境与安全","title":"运行环境兼容","summary":"在选择接入方式前,核对协议支持、回调规则与运行环境能力。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-compatibility?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"matrix","title":"兼容性矩阵"},{"id":"native-callbacks","title":"原生回调边界"},{"id":"features","title":"检测能力,避免猜测"},{"id":"cross-origin","title":"跨域与 Cookie 行为"}],"markdown":"# 运行环境兼容\n\n在选择接入方式前,核对协议支持、回调规则与运行环境能力。\n\n<a id=\"matrix\"></a>\n\n## 兼容性矩阵\n\n| 环境 | 检查内容 | 替代方式 |\n| --- | --- | --- |\n| 现代浏览器 | HTTPS、安全 Cookie、页面导航、Web Crypto 与应用支持的 JavaScript 目标 | 在应用后端生成 PKCE 并保存事务。 |\n| 桌面与移动端 | 系统浏览器、已登记 HTTPS 回调和操作系统安全存储 | 没有允许的回调时,使用设备授权。 |\n| 本地沙箱 | 显式登记、包含端口的 HTTP 回环回调 | 保持固定开发端口,或更新精确回调。 |\n| 正式环境 | HTTPS 回调和关联已发布版本的已启用客户端 | 先完成发布和启用,再测试正式登录。 |\n| LimeCloud CLI | Node.js 22.12 或更高版本;@limecloud/cli 0.3.0 | 升级 Node.js,或在受支持的运行环境中使用公开 HTTPS 协议。 |\n\n<a id=\"native-callbacks\"></a>\n\n## 原生回调边界\n\n当前客户端登记要求有效 HTTPS 回调,HTTP 回环仅在沙箱中允许。自定义 URI Scheme 与任意正式回环端口不是已公开的回调合同。不能因通用 OIDC 库支持,就假定平台支持移动 Scheme、内嵌 WebView 登录或自动 App Link 跳转。\n\n[原生应用指南](https://open.limeai.run/docs/native-application?locale=zh-CN)\n\n[设备授权](https://open.limeai.run/docs/device-authorization-flow?locale=zh-CN)\n\n<a id=\"features\"></a>\n\n## 检测能力,避免猜测\n\n能力检测用于选择应用接入路径,不能据此关闭 PKCE 或替换安全随机数。使用可选能力前检查 OIDC 库与端点元数据。语义版本应按数字比较,并在应用锁文件中固定兼容的库版本。\n\n```javascript\nconst canGeneratePKCE = globalThis.isSecureContext &&\n typeof globalThis.crypto?.getRandomValues === \"function\" &&\n typeof globalThis.crypto?.subtle?.digest === \"function\";\n\nif (!canGeneratePKCE) {\n // Start sign-in through the application backend.\n location.assign(\"/login\");\n}\n```\n\n[支持的协议元数据](https://open.limeai.run/docs/oidc-discovery?locale=zh-CN)\n\n<a id=\"cross-origin\"></a>\n\n## 跨域与 Cookie 行为\n\n顶层授权跳转不要求 JavaScript 读取其他来源的响应。浏览器 fetch 受实际 CORS 策略约束,登记公共客户端不会绕过它。跨域令牌或 UserInfo 访问不可用时使用应用后端,并测试隐私模式、Cookie 限制、取消导航与浏览器返回。\n\n[导航与回调](https://open.limeai.run/docs/client-navigation?locale=zh-CN)\n\n[会话存储](https://open.limeai.run/docs/client-storage?locale=zh-CN)\n","revision":"sha256:796e34742f9fd441a0c727803585710984ab021be285d2c16e3c1d6e9e3177d8"},{"id":"client-errors","group":"client","category":"运行环境与安全","title":"客户端错误与恢复","summary":"确定失败阶段,提供安全、明确的恢复操作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-errors?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"stages","title":"定位失败阶段"},{"id":"formats","title":"识别响应格式"},{"id":"ui","title":"安全提供重试操作"},{"id":"diagnostics","title":"有效排查信息"}],"markdown":"# 客户端错误与恢复\n\n确定失败阶段,提供安全、明确的恢复操作。\n\n<a id=\"stages\"></a>\n\n## 定位失败阶段\n\n| 阶段 | 信号 | 恢复方式 |\n| --- | --- | --- |\n| 导航前 | 缺少客户端、回调无效或安全随机数不可用 | 修正登记配置或使用应用后端,不降低 PKCE 要求。 |\n| 授权回调 | 携带预期 state 的 error=access_denied | 说明用户已拒绝,允许用户重新发起。 |\n| 回调验证 | state 缺失或不匹配,事务已到期或已消费 | 丢弃结果,创建新的授权事务。 |\n| 令牌兑换 | invalid_grant 或结果未知的网络失败 | 不重放授权码,重新登录;不重试已经轮换的刷新令牌。 |\n| ID Token 验证 | issuer、audience、nonce 不符,签名错误或已到期 | 拒绝登录,检查配置与可信签名密钥。 |\n| 资源请求 | HTTP 401、403、409 或 429 及稳定 API 错误码 | 按情况核对令牌、当前角色、修订号或 Retry-After。 |\n\n<a id=\"formats\"></a>\n\n## 识别响应格式\n\nOAuth 端点返回 error、error_description 等标准协议错误;平台资源端点返回合同定义的错误对象;CLI 另有 ok、error.type、error.code 和非零退出码。这些格式不同,不能把所有接口统一按 code=0 判断。\n\n[API 错误与恢复](https://open.limeai.run/docs/errors?locale=zh-CN)\n\n[CLI 输出](https://open.limeai.run/docs/cli-output?locale=zh-CN)\n\n<a id=\"ui\"></a>\n\n## 安全提供重试操作\n\n1. 恢复发起页面,说明登录是被取消、到期还是失败,仅保留已验证的应用内部返回路径。\n2. 显式重新开始时生成新的 state、nonce 与 verifier,关闭同意页不应自动再次发起授权。\n3. 请求超时不证明写入或令牌轮换失败。重复执行前,先使用文档规定的方式查询结果。\n\n[请求重试策略](https://open.limeai.run/docs/api-retry-policy?locale=zh-CN)\n\n<a id=\"diagnostics\"></a>\n\n## 有效排查信息\n\n记录时间、运行环境与库版本、失败阶段、HTTP 状态、稳定错误码及可用的请求标识。隐藏授权码、令牌、Cookie、客户端 Secret、verifier 与完整回调 URL。翻译提示文案不能改变机器可读错误码。\n\n[接入调试](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n","revision":"sha256:4107b138e67ae3578f81a727a2bb144947d624c07d0d3aae97c94bd40ec6bace"},{"id":"client-navigation","group":"client","category":"运行环境与安全","title":"导航与回调","summary":"在应用与授权服务之间导航,保持登录事务绑定。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-navigation?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"browser","title":"打开授权页面"},{"id":"return-path","title":"验证返回目的地"},{"id":"cleanup","title":"一次性完成回调"},{"id":"native","title":"桌面与移动导航"}],"markdown":"# 导航与回调\n\n在应用与授权服务之间导航,保持登录事务绑定。\n\n<a id=\"browser\"></a>\n\n## 打开授权页面\n\n由用户显式操作发起登录,使用顶层浏览器或原生系统浏览器导航到可信授权端点。后端重定向在弹窗被拦截时仍可工作,应用自身应提供清楚的取消或返回入口。\n\n当前公开接入不依赖 Lime 专用开窗 SDK。新窗口或移动应用切换不会自动共享授权事务,返回结果必须绑定原应用会话。\n\n[开始登录](https://open.limeai.run/docs/client-quick-start?locale=zh-CN)\n\n<a id=\"return-path\"></a>\n\n## 验证返回目的地\n\nOAuth redirect_uri 固定为已登记回调。将单独验证过的应用内部返回路径存入授权事务,不允许 returnTo 参数选择 OAuth 回调或外部来源。示例仅接受同源路径,应用还可使用更严格的路由白名单。\n\n```javascript\nfunction internalReturnPath(input, applicationOrigin) {\n if (typeof input !== \"string\" || !input.startsWith(\"/\") ||\n input.startsWith(\"//\") || /[\\\\\\x00-\\x1f]/.test(input)) return \"/\";\n const target = new URL(input, applicationOrigin);\n return target.origin === applicationOrigin\n ? target.pathname + target.search + target.hash\n : \"/\";\n}\n```\n\n[精确回调验证](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n\n<a id=\"cleanup\"></a>\n\n## 一次性完成回调\n\n1. 加载发起会话,在处理成功或错误结果前,拒绝未知、到期或已使用的 state。\n2. 消费事务,执行一次授权码兑换,验证 ID Token,并重新生成应用会话标识。\n3. 处理后跳转到干净的应用内部 URL,刷新或返回操作不得再次兑换相同授权码。\n\n<a id=\"native\"></a>\n\n## 桌面与移动导航\n\n原生应用首先选择 Lime 登记合同允许的回调。正式 HTTP 回环和自定义 URI Scheme 不是已公开回调选项。受控 HTTPS 回调须先验证事务,再执行应用跳转,且跳转 URL 中不能放置令牌。无法提供此类回调时,选择设备授权。\n\n[兼容规则](https://open.limeai.run/docs/client-compatibility?locale=zh-CN)\n\n[原生应用指南](https://open.limeai.run/docs/native-application?locale=zh-CN)\n","revision":"sha256:f0b32dbc17aed879f1856781b646f3709838e905ce3ff5aecbce6f8fd40dc2be"},{"id":"client-storage","group":"client","category":"运行环境与安全","title":"会话与凭据存储","summary":"按用途、有效期与可信运行环境保存每种数据。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/client-storage?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"storage","title":"存储职责"},{"id":"browser","title":"浏览器存储边界"},{"id":"rotation","title":"刷新与账号切换"},{"id":"cli","title":"CLI 凭据文件"}],"markdown":"# 会话与凭据存储\n\n按用途、有效期与可信运行环境保存每种数据。\n\n<a id=\"storage\"></a>\n\n## 存储职责\n\n[短期授权事务与长期凭据分别保存。](https://open.limeai.run/docs/client-storage?locale=zh-CN#storage)\n\n| 数据 | 位置 | 生命周期 |\n| --- | --- | --- |\n| state、nonce、PKCE verifier | 保存在绑定发起会话的短期应用存储中 | 仅一次事务,回调或到期后消费 |\n| 客户端 Secret | 后端密钥管理系统或受保护的运行配置 | 按客户端策略轮换和撤销 |\n| 访问与刷新令牌 | 受保护的后端令牌库或操作系统凭据库 | 遵守有效期,原子替换轮换后的刷新令牌 |\n| 浏览器应用会话 | 使用不透明 Cookie,配置 HttpOnly、Secure 与适当的 SameSite | 独立的空闲与绝对到期规则,以及显式失效 |\n| 非敏感用户偏好 | 按应用来源和账号隔离的存储 | 切换账号时清理或重新绑定 |\n\n<a id=\"browser\"></a>\n\n## 浏览器存储边界\n\n签名 Cookie 的持有人仍能读取正文,签名不等于加密。Secret 与令牌使用服务端会话存储。相同来源的 XSS 可以读取 JavaScript 可访问的 localStorage、IndexedDB 和 sessionStorage,不能将刷新令牌或机密客户端 Secret 放在其中。\n\n纯浏览器公共客户端应尽量减少令牌持久化,使用持续维护库提供的事务存储方式。浏览器无法满足安全要求时采用后端会话。清空浏览器存储不会撤销服务端授权。\n\n[网页应用指南](https://open.limeai.run/docs/web-application?locale=zh-CN)\n\n[令牌撤销](https://open.limeai.run/docs/token-revocation?locale=zh-CN)\n\n<a id=\"rotation\"></a>\n\n## 刷新与账号切换\n\n1. 保存的令牌绑定 Issuer、Client ID、环境与目标资源 Audience,发请求前选择匹配上下文。\n2. 串行执行刷新。成功响应后原子替换旧刷新令牌;兑换结果未知时要求重新登录,不重放旧令牌。\n3. 切换账号时使应用会话与缓存账号数据失效,并区分本地退出、撤销授权和结束中央 Auth 会话。\n\n[刷新令牌生命周期](https://open.limeai.run/docs/refresh-token-flow?locale=zh-CN)\n\n<a id=\"cli\"></a>\n\n## CLI 凭据文件\n\nLimeCloud CLI 使用当前用户所有的 0600 文件保存凭据,通过排他锁和原子替换写入,保存的登录绑定 Auth、Client ID 和 API Origin。不同 LIMECLOUD_CONFIG 与 LIMECLOUD_SETTINGS 路径用于隔离环境。外部提供的 LIMECLOUD_ACCESS_TOKEN 始终由外部管理,CLI 不保存它。\n\n[CLI 配置](https://open.limeai.run/docs/cli-configuration?locale=zh-CN)\n\n[CLI 凭据管理](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n","revision":"sha256:83e22589a4ebfdf7aebec950fd9db6443e58f01d7b7cd36e5ce48501e12b3b41"},{"id":"node-web-tutorial","group":"tutorial","category":"开发教程","title":"使用 Node.js 开发网页应用","summary":"创建本地后端,完成 OIDC 登录并显示已验证的用户资料。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/node-web-tutorial?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"goal","title":"实现效果"},{"id":"prepare","title":"一、准备沙箱客户端"},{"id":"install","title":"二、创建本地项目"},{"id":"implement","title":"三、实现登录与回调"},{"id":"test","title":"四、体验与验证"}],"markdown":"# 使用 Node.js 开发网页应用\n\n创建本地后端,完成 OIDC 登录并显示已验证的用户资料。\n\n<a id=\"goal\"></a>\n\n## 实现效果\n\n本教程运行包含三条路由的 Node.js 网页应用:/ 显示首页,/login 跳转 Lime,/callback 验证结果后创建应用会话。浏览器仅接收不透明的应用 Cookie 与允许的用户资料,不接收客户端 Secret 或令牌。\n\n[通过标准 OIDC 流程连接 Node.js 后端与 Lime Auth。](https://open.limeai.run/docs/node-web-tutorial?locale=zh-CN#goal)\n\n<a id=\"prepare\"></a>\n\n## 一、准备沙箱客户端\n\n1. 使用 Node.js 22.12 或更高版本。创建应用及机密沙箱用户客户端,启用 authorization_code,配置 openid profile Scope。\n2. 精确登记 http://127.0.0.1:3000/callback,保持该端口固定。客户端 Secret 仅放在后端受保护的环境中。\n3. 将 LIME_ISSUER 设置为可信 HTTPS Auth 来源,LIME_CLIENT_ID 与 LIME_CLIENT_SECRET 设置为登记客户端,SESSION_SECRET 使用独立的高强度随机值。\n\n[客户端登记](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[回调规则](https://open.limeai.run/docs/callback-validation?locale=zh-CN)\n\n<a id=\"install\"></a>\n\n## 二、创建本地项目\n\n示例使用第三方 Express 和 OpenID Connect 库,不要求 Lime JavaScript SDK。请在自己的项目保留生成的锁文件,并核对依赖支持的运行环境与版本说明。\n\n```sh\nmkdir lime-web-node\ncd lime-web-node\nnpm init -y\nnpm install express@5 express-session@1 openid-client@6\n# Save the next example as server.mjs.\nnode server.mjs\n```\n\n<a id=\"implement\"></a>\n\n## 三、实现登录与回调\n\n发现与 client_secret_basic 留在后端。每次登录生成新的 verifier、state、nonce 与五分钟事务。OIDC 库检查返回的 state、nonce、签名、Issuer 与 Audience,UserInfo 绑定已验证的 sub。事务在单次授权码兑换前移除。\n\n> 本地示例使用 express-session 的 MemoryStore 与 HTTP 回环 Cookie。正式环境须使用共享受保护会话存储、HTTPS、Secure Cookie、精确正式回调,以及正确的可信代理配置。示例不保存刷新令牌。\n\n```javascript\nimport express from \"express\";\nimport session from \"express-session\";\nimport * as oidc from \"openid-client\";\n\nconst issuer = new URL(process.env.LIME_ISSUER);\nconst clientId = process.env.LIME_CLIENT_ID;\nconst redirectUri = \"http://127.0.0.1:3000/callback\";\nconst config = await oidc.discovery(\n issuer, clientId, undefined,\n oidc.ClientSecretBasic(process.env.LIME_CLIENT_SECRET),\n);\nconst app = express();\napp.use(session({\n secret: process.env.SESSION_SECRET,\n resave: false, saveUninitialized: false,\n cookie: { httpOnly: true, sameSite: \"lax\", secure: false, maxAge: 1800000 },\n}));\nconst save = req => new Promise((resolve, reject) =>\n req.session.save(error => error ? reject(error) : resolve()));\n\napp.get(\"/login\", async (req, res) => {\n const verifier = oidc.randomPKCECodeVerifier();\n const state = oidc.randomState();\n const nonce = oidc.randomNonce();\n req.session.transaction = { verifier, state, nonce, expires: Date.now() + 300000 };\n const url = oidc.buildAuthorizationUrl(config, {\n redirect_uri: redirectUri, response_type: \"code\", scope: \"openid profile\",\n code_challenge: await oidc.calculatePKCECodeChallenge(verifier),\n code_challenge_method: \"S256\", state, nonce,\n });\n await save(req);\n res.redirect(url.href);\n});\napp.get(\"/callback\", async (req, res) => {\n const tx = req.session.transaction;\n delete req.session.transaction;\n await save(req);\n if (!tx || tx.expires < Date.now()) return res.status(400).send(\"Restart sign-in\");\n const current = new URL(redirectUri);\n current.search = new URL(req.originalUrl, redirectUri).search;\n const tokens = await oidc.authorizationCodeGrant(config, current, {\n pkceCodeVerifier: tx.verifier, expectedState: tx.state, expectedNonce: tx.nonce,\n });\n const claims = tokens.claims();\n if (!claims?.sub) throw new Error(\"Missing verified subject\");\n const profile = await oidc.fetchUserInfo(config, tokens.access_token, claims.sub);\n await new Promise((resolve, reject) =>\n req.session.regenerate(error => error ? reject(error) : resolve()));\n req.session.profile = { sub: profile.sub, name: profile.name };\n await save(req);\n res.redirect(\"/\");\n});\napp.get(\"/\", (req, res) => {\n if (!req.session.profile) return res.type(\"html\").send('<a href=\"/login\">Sign in</a>');\n res.json({ profile: req.session.profile });\n});\napp.use((_error, _req, res, _next) => res.status(400).send(\"Sign-in failed; restart from /login\"));\napp.listen(3000, \"127.0.0.1\");\n\n```\n\n<a id=\"test\"></a>\n\n## 四、体验与验证\n\n1. 打开 http://127.0.0.1:3000,点击 Sign in,在自己的浏览器核对应用与权限后批准。\n2. 确认 / 显示预期 sub 与允许的 name。检查浏览器存储:仅有应用会话 Cookie,没有 OAuth 凭据。\n3. 分别测试拒绝同意、修改 state、等待事务到期、重访回调及重启服务。每种情况应安全失败或重新发起事务,不能重放同一授权码。\n\n[排查错误](https://open.limeai.run/docs/client-errors?locale=zh-CN)\n\n[会话存储](https://open.limeai.run/docs/client-storage?locale=zh-CN)\n\n[Python 教程](https://open.limeai.run/docs/python-web-tutorial?locale=zh-CN)\n","revision":"sha256:f27f31a062cb46e8a491f314a336fc60d94b3e019d3bc6d82182374b84b70e61"},{"id":"python-web-tutorial","group":"tutorial","category":"开发教程","title":"使用 Python 开发网页应用","summary":"使用 Flask、Authlib 与服务端会话完成浏览器登录。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/python-web-tutorial?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"goal","title":"实现效果"},{"id":"prepare","title":"一、登记与配置"},{"id":"install","title":"二、安装本地依赖"},{"id":"implement","title":"三、实现应用"},{"id":"verify","title":"四、验证结果与失败路径"}],"markdown":"# 使用 Python 开发网页应用\n\n使用 Flask、Authlib 与服务端会话完成浏览器登录。\n\n<a id=\"goal\"></a>\n\n## 实现效果\n\n应用在普通浏览器中跳转 Lime,接收授权码,并显示已验证 ID Token 中的用户资料。Authlib 处理发现、PKCE、令牌端点认证与 ID Token 验证;Flask-Session 将授权状态与 verifier 保存在服务端存储。\n\n[会话 Cookie 仅标识受保护的后端状态。](https://open.limeai.run/docs/python-web-tutorial?locale=zh-CN#goal)\n\n<a id=\"prepare\"></a>\n\n## 一、登记与配置\n\n1. 使用 Python 3.10 或更高版本。创建支持 authorization_code 与 openid profile Scope 的机密沙箱用户客户端。\n2. 精确登记 http://127.0.0.1:5000/callback。在后端环境中设置 LIME_ISSUER、LIME_CLIENT_ID、LIME_CLIENT_SECRET,以及独立随机 SESSION_SECRET。\n3. 使用可信 HTTPS Issuer。将私有本地会话目录排除版本管理,并阻止其他用户访问。\n\n[客户端登记](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n<a id=\"install\"></a>\n\n## 二、安装本地依赖\n\n以上均为第三方依赖,不代表已发布 Lime Python SDK。共享示例前,应将实际解析版本记录到应用的依赖锁或 requirements 文件。\n\n```sh\nmkdir lime-web-python\ncd lime-web-python\npython3 -m venv .venv\n. .venv/bin/activate\npython -m pip install 'Flask>=3.1,<4' 'Authlib>=1.6,<2' 'Flask-Session>=0.8,<1' 'cachelib>=0.13,<1' 'requests>=2.32,<3'\n# Save the next example as app.py.\npython -m flask --app app run --host 127.0.0.1 --port 5000\n```\n\n<a id=\"implement\"></a>\n\n## 三、实现应用\n\n回调先验证并消费显式五分钟 state 事务,再由 Authlib 兑换授权码、验证 nonce 与 ID Token 声明。成功后清除授权状态、重新生成应用会话 ID,仅保留少量已验证资料。兑换失败或结果未知时须重新登录。\n\n> 文件缓存、HTTP Cookie 与 Flask 开发服务器仅用于本地示例。正式环境须使用受保护的共享会话存储、HTTPS、Secure Cookie、正式服务器与显式代理和 Host 配置。仅使用 Flask 默认签名 Cookie 不能保存 verifier、Secret 或令牌。\n\n```python\nimport os, secrets, time\nfrom datetime import timedelta\nfrom flask import Flask, jsonify, redirect, request, session\nfrom flask_session import Session\nfrom cachelib.file import FileSystemCache\nfrom authlib.integrations.flask_client import OAuth\n\napp = Flask(__name__)\napp.config.update(\n SECRET_KEY=os.environ[\"SESSION_SECRET\"],\n SESSION_TYPE=\"cachelib\",\n SESSION_CACHELIB=FileSystemCache(\".oidc-sessions\", threshold=500),\n SESSION_PERMANENT=False,\n PERMANENT_SESSION_LIFETIME=timedelta(minutes=30),\n SESSION_COOKIE_HTTPONLY=True,\n SESSION_COOKIE_SAMESITE=\"Lax\",\n SESSION_COOKIE_SECURE=False,\n)\nSession(app)\noauth = OAuth(app)\noauth.register(\n name=\"lime\",\n client_id=os.environ[\"LIME_CLIENT_ID\"],\n client_secret=os.environ[\"LIME_CLIENT_SECRET\"],\n server_metadata_url=os.environ[\"LIME_ISSUER\"].rstrip(\"/\") + \"/.well-known/openid-configuration\",\n client_kwargs={\n \"scope\": \"openid profile\",\n \"code_challenge_method\": \"S256\",\n \"token_endpoint_auth_method\": \"client_secret_basic\",\n },\n)\n@app.get(\"/login\")\ndef login():\n state = secrets.token_urlsafe(32)\n session[\"transaction\"] = {\"state\": state, \"expires\": time.time() + 300}\n return oauth.lime.authorize_redirect(\n \"http://127.0.0.1:5000/callback\", state=state, nonce=secrets.token_urlsafe(32)\n )\n\n@app.get(\"/callback\")\ndef callback():\n tx = session.pop(\"transaction\", None)\n state = request.args.get(\"state\", \"\")\n if not tx or tx[\"expires\"] < time.time() or not secrets.compare_digest(state, tx[\"state\"]):\n return \"Restart sign-in\", 400\n token = oauth.lime.authorize_access_token()\n claims = token.get(\"userinfo\")\n if not claims or not claims.get(\"sub\"):\n return \"Missing verified subject\", 400\n session.clear()\n session[\"profile\"] = {\"sub\": claims[\"sub\"], \"name\": claims.get(\"name\")}\n app.session_interface.regenerate(session)\n return redirect(\"/\")\n\n@app.get(\"/\")\ndef index():\n if \"profile\" not in session:\n return '<a href=\"/login\">Sign in</a>'\n return jsonify(profile=session[\"profile\"])\n\n@app.errorhandler(Exception)\ndef failed(_error):\n return \"Sign-in failed; restart from /login\", 400\n\n```\n\n<a id=\"verify\"></a>\n\n## 四、验证结果与失败路径\n\n1. 打开 http://127.0.0.1:5000,完成登录,确认显示的主体属于预期账号。\n2. 测试拒绝同意、state 缺失或错误、超过五分钟回调、重复回调及不同浏览器会话,这些情况均不得创建登录会话。\n3. 不要记录完整回调 URL、令牌对象、Cookie 或客户端 Secret。以 OIDC 主体作为账号键,显示名称仅作为可选资料。\n\n[客户端错误](https://open.limeai.run/docs/client-errors?locale=zh-CN)\n\n[Node.js 教程](https://open.limeai.run/docs/node-web-tutorial?locale=zh-CN)\n\n[ID Token 验证](https://open.limeai.run/docs/id-token-validation?locale=zh-CN)\n","revision":"sha256:f1c30714c32e4b9e4c24101afe4f62e720f23356885fb8d1056d060e3f64d1d9"},{"id":"server-api-tutorial","group":"tutorial","category":"开发教程","title":"调用平台 API","summary":"检查真实合同、授权 CLI 用户,并完成沙箱应用操作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/server-api-tutorial?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"goal","title":"流程与前置条件"},{"id":"contract","title":"一、检查合同"},{"id":"authorize","title":"二、配置与授权"},{"id":"read","title":"三、读取应用列表"},{"id":"write","title":"四、预览、创建与读回"},{"id":"execute","title":"执行已核对的请求"},{"id":"recover","title":"五、安全恢复"}],"markdown":"# 调用平台 API\n\n检查真实合同、授权 CLI 用户,并完成沙箱应用操作。\n\n<a id=\"goal\"></a>\n\n## 流程与前置条件\n\n示例列出工作空间的应用、预览创建请求,并读取创建后的应用。账号须具有对应工作空间成员关系与创建角色。专用平台 CLI 公共客户端须配置对应 API Audience 与委托 Scope,普通应用或机器客户端不能因此获得管理访问。\n\n[管理 API 边界](https://open.limeai.run/docs/management-api?locale=zh-CN)\n\n[安装 LimeCloud CLI](https://open.limeai.run/docs/cli-overview?locale=zh-CN#run)\n\n<a id=\"contract\"></a>\n\n## 一、检查合同\n\n请求前先读取方法、路径、查询、请求体字段、所需 Scope 与响应结构。身份调用使用 Auth 来源,平台资源调用使用显式 API 来源。资源响应由 CLI 包装一次:列表记录位于 data.items,后续游标为 data.next_cursor。\n\n```sh\nlimecloud-cli --version\nlimecloud-cli api list application\nlimecloud-cli schema open.application.list\nlimecloud-cli schema open.application.create\nlimecloud-cli schema open.application.get\n```\n\n<a id=\"authorize\"></a>\n\n## 二、配置与授权\n\n在自己的浏览器打开验证地址,核对用户码、客户端与 Scope 后决定是否授权。从返回列表选择目标工作空间。CLI 不会替你创建客户端或授予工作空间角色。\n\n```sh\nlimecloud-cli config init \\\n --issuer \"https://YOUR_AUTH_ORIGIN\" \\\n --api-origin \"https://YOUR_API_ORIGIN\" \\\n --client-id \"YOUR_REGISTERED_PUBLIC_CLI_CLIENT_ID\"\nlimecloud-cli auth login \\\n --scope \"openid profile offline_access lime:open:read lime:open:write\"\nlimecloud-cli auth check --scope \"lime:open:read lime:open:write\"\nlimecloud-cli open space list\n```\n\n[CLI 授权与存储](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n<a id=\"read\"></a>\n\n## 三、读取应用列表\n\n将返回游标作为不透明值使用,保持工作空间、筛选条件与排序一致。Scope 检查成功仅证明本地授权记录,API 每一页仍会检查当前成员关系与访问权限。\n\n```sh\nlimecloud-cli open application list \\\n --space-id \"YOUR_SPACE_ID\" \\\n --limit 20\n# When data.next_cursor is present, keep all other filters unchanged:\nlimecloud-cli open application list \\\n --space-id \"YOUR_SPACE_ID\" \\\n --limit 20 \\\n --cursor \"RETURNED_CURSOR\"\n```\n\n[分页](https://open.limeai.run/docs/api-pagination?locale=zh-CN)\n\n<a id=\"write\"></a>\n\n## 四、预览、创建与读回\n\n将以下完整对象保存为 application.json。先在预览中核对选中的工作空间与请求体,确定要创建应用时再显式移除 --dry-run 执行创建。\n\n```json\n{\n \"name\": \"Example application\",\n \"description\": \"Application created for the API tutorial\",\n \"kind\": \"internal\",\n \"icon\": \"leaf\"\n}\n```\n\n<a id=\"execute\"></a>\n\n## 执行已核对的请求\n\nDry-run 校验输入并输出脱敏请求,不访问网络或改变状态。真实创建命令会写入数据。保留返回的应用 ID 用于读回;创建应用不会自动发布、启用、安装或购买。\n\n```sh\nlimecloud-cli open application create \\\n --space-id \"YOUR_SPACE_ID\" --data \"@application.json\" --dry-run\nlimecloud-cli open application create \\\n --space-id \"YOUR_SPACE_ID\" --data \"@application.json\"\nlimecloud-cli open application get \\\n --space-id \"YOUR_SPACE_ID\" --app-id \"RETURNED_APP_ID\"\n```\n\n<a id=\"recover\"></a>\n\n## 五、安全恢复\n\n| 信号 | 处理 |\n| --- | --- |\n| 401 或本地令牌到期 | 安全条件满足时刷新,或重新登录;不重放结果未知的刷新兑换。 |\n| 403 | 核对显式 Scope 与当前空间角色,反复同意不能恢复被移除的角色。 |\n| 409 | 重新读取资源与当前修订号,再核对要执行的写入。 |\n| 429 | 遵守 Retry-After,对适用的读取使用有上限退避。 |\n| 写入超时 | 重复创建前先检查资源;仅在 Schema 声明幂等时使用幂等能力。 |\n\n[重试策略](https://open.limeai.run/docs/api-retry-policy?locale=zh-CN)\n\n[调试请求](https://open.limeai.run/docs/api-debugging?locale=zh-CN)\n\n[CLI 输出](https://open.limeai.run/docs/cli-output?locale=zh-CN)\n","revision":"sha256:9d514a23bcbe00c69e80a171e17e0657e038ce7b57dbb47f5257477bb19aad28"},{"id":"cli-agent-overview","group":"cli","category":"LimeCloud CLI","title":"LimeCloud Agent 集成能力概述","summary":"Lime 面向 Agent 使用者和开发者提供三类可组合能力,分别帮助你理解任务、建立授权和执行受支持的操作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-agent-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"introduction","title":"三类可组合能力"},{"id":"capabilities","title":"能力一览"},{"id":"choose","title":"选择接入方式"}],"markdown":"# LimeCloud Agent 集成能力概述\n\nLime 面向 Agent 使用者和开发者提供三类可组合能力,分别帮助你理解任务、建立授权和执行受支持的操作。\n\n<a id=\"introduction\"></a>\n\n## 三类可组合能力\n\n| 知识与发现 | 身份与授权 | CLI 执行 |\n| --- | --- | --- |\n| 阅读平台概念和任务指南,再发现准确的动作 Schema。公开指南、网页搜索和 CLI 知识读取已提供,可在当前宿主阅读 Markdown 或结构化资料。 | 通过设备授权让用户核对客户端和 Scope;实际请求仍检查当前角色、空间、应用、环境及资源。 | 使用受支持 CLI 方法发现 Schema、预览请求并调用获授权 API。另行启用的 MCP 资源提供空间及应用发现、应用详情和登录客户端读取;各宿主完整任务适配仍待验证。 |\n\n[agent-knowledge-preview](https://open.limeai.run/docs/cli-agent-overview?locale=zh-CN#introduction)\n\n[agent-identity-preview](https://open.limeai.run/docs/cli-agent-overview?locale=zh-CN#introduction)\n\n[agent-cli-preview](https://open.limeai.run/docs/cli-agent-overview?locale=zh-CN#introduction)\n\n[平台知识](https://open.limeai.run/docs/platform-knowledge?locale=zh-CN)\n\n[身份与授权](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n[开始使用 CLI](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n<a id=\"capabilities\"></a>\n\n## 能力一览\n\n[Lime Agent 能力与任务路径,图中分别标明已提供及规划中的能力。](https://open.limeai.run/docs/cli-agent-overview?locale=zh-CN#capabilities)\n\n| 能力 | 什么时候使用 | 形态与可用状态 | 接入指引 |\n| --- | --- | --- | --- |\n| 知识与发现 | 了解概念、前置条件和恢复方法,构建调用前检查准确输入。 | 公开指南、分层 Markdown 索引、CLI 检索读取和本地 Schema 已提供;受限 SOP 及 MCP 知识接入规划中。 | 见下方平台知识导航与 Agent 阅读指南。 |\n| 身份与授权 | 明确调用方及 Scope,核对目标部署的实际角色和资源权限。 | OAuth 设备授权及 CLI auth 命令,目标部署须完成客户端登记。 | 见下方 CLI 授权指南。 |\n| CLI 执行 | 在实际可用范围内调用受支持的身份、开发、客户、运营及管理方法。 | CLI 及正式 HTTP 合同已提供,登录诊断及成员组方法候选可分别检查/导出;MCP 应用读取要求独立启用资源并授权。方法原生安装/加载及完整宿主任务仍待验证。 | 见下方 CLI 概览及 API 参考。 |\n\n[平台知识导航](https://open.limeai.run/docs/platform-knowledge?locale=zh-CN)\n\n[Agent 阅读指南](https://open.limeai.run/docs/cli-knowledge?locale=zh-CN)\n\n[CLI 授权](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n[CLI 概览](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n[API 参考](https://open.limeai.run/docs/api-overview?locale=zh-CN)\n\n<a id=\"choose\"></a>\n\n## 选择接入方式\n\n| 你的目标 | 接入方式 |\n| --- | --- |\n| 在已有 AI 工具中使用 Lime | 安装 CLI,让 Agent 读取安装指南,再从 Schema 发现开始。 |\n| 开发自己的 Agent | 以子进程调用 CLI,使用 JSON 合同,并执行宿主的命令范围与审批规则。 |\n| 应用直接集成 | 需要直接发起 HTTP 调用时,使用公开 OAuth 与 API 合同。 |\n\n[开始使用 CLI](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n[Agent 接入](https://open.limeai.run/docs/cli-agent-integration?locale=zh-CN)\n\n[API 概览](https://open.limeai.run/docs/api-overview?locale=zh-CN)\n","revision":"sha256:7c7c26bacbd028511421c31020a7aa16101820d7275aa8fccf27417a5063c11c"},{"id":"cli-overview","group":"cli","category":"LimeCloud CLI","title":"LimeCloud CLI:让 Agent 操作 Lime","summary":"在终端或 AI Agent 中发现 Lime 能力、准备请求,并执行获授权的任务。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-overview?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":["management_open_group_list","management_open_group_change_prepare","management_open_group_change_get","management_open_group_change_execute","management_open_group_change_receipt","management_open_group_change_resolve","management_open_space_list","management_open_application_list","management_open_application_get","management_open_client_list","management_open_login_diagnosis_get"],"sections":[{"id":"introduction","title":"通过 Agent 使用 Lime"},{"id":"quick-start","title":"快速开始"},{"id":"run","title":"1. 一键安装与配置"},{"id":"agent-install","title":"让 Agent 自动安装"},{"id":"install-notes","title":"安装完成后"},{"id":"authorization","title":"2. 按任务需要完成用户授权"},{"id":"authorization-boundary","title":"默认授权范围"},{"id":"first-task","title":"3. 开启你的第一个 Agent 任务"},{"id":"use-cases","title":"Agent 使用案例"},{"id":"case-applications","title":"场景 1:找到应用接口并准备查询"},{"id":"case-config-preview","title":"场景 2:先审阅配置变更"},{"id":"case-installation","title":"场景 3:核对应用安装上下文"},{"id":"case-operations","title":"场景 4:准备运营查询"},{"id":"case-finance","title":"场景 5:准备试算平衡核对"},{"id":"member-group-task","title":"准备并确认成员组变更"},{"id":"member-group-execute-recover","title":"确认一次,按原 ID 恢复"},{"id":"optional-method-candidates","title":"先检查一个可选方法"},{"id":"member-group-method","title":"通过成员组方法核对具体变更"},{"id":"single-method-delivery","title":"导出单项候选,再选择宿主安装"},{"id":"capability-map","title":"LimeCloud CLI 能力地图"},{"id":"commands","title":"常用认证与配置命令"},{"id":"multiple-contexts","title":"使用多个环境"},{"id":"faq","title":"常见问题"}],"markdown":"# LimeCloud CLI:让 Agent 操作 Lime\n\n在终端或 AI Agent 中发现 Lime 能力、准备请求,并执行获授权的任务。\n\n<a id=\"introduction\"></a>\n\n## 通过 Agent 使用 Lime\n\nLimeCloud CLI 为 Agent 提供结构化的 Lime 操作入口。Agent 可以找到合适的接口、检查参数、准备请求,并读取程序可处理的结果。\n\n从公开命令目录和请求预览开始。任务需要账户或业务数据时,再登录并使用该客户端与用户获准的权限、工作空间和应用可用范围。\n\n<a id=\"quick-start\"></a>\n\n## 快速开始\n\n环境需安装 Node.js 22.12 或更新版本及 npm/npx。本文介绍 0.7.0 安装流程,新增命令随对应 npm 版本发布后可用。\n\n<a id=\"run\"></a>\n\n### 1. 一键安装与配置\n\n方式一:手动安装。在终端运行以下命令,安装 CLI 并按提示完成配置。\n\n```bash\nnpx @limecloud/cli@latest install\n```\n\n<a id=\"agent-install\"></a>\n\n## 让 Agent 自动安装\n\n方式二:Agent 自动安装。将以下指令复制给你的 AI 工具,让它读取安装指南并协助完成安装。\n\n```text\n帮我安装 LimeCloud CLI:https://open.limeai.run/docs/zh-CN/cli-installation-guide.md\n```\n\n[查看安装指南](https://open.limeai.run/docs/cli-installation-guide?locale=zh-CN)\n\n<a id=\"install-notes\"></a>\n\n## 安装完成后\n\n默认安装前缀为 ~/.local。按安装结果返回的可执行目录检查 PATH;更新 PATH 后,若终端或 Agent 仍未发现命令,可重新启动该进程。安装器不改写 shell 配置,也不安装全局 Agent Skills。\n\n安装引导从所选 Auth 服务发现部署的公共 CLI 配置,并复用已有设置。发现不可用且没有 Client ID 时,非交互安装返回 configuration.status=pending,按返回指引完成 config init。\n\n<a id=\"authorization\"></a>\n\n### 2. 按任务需要完成用户授权\n\n发现命令、检查 Schema 和预览请求无需登录。需要用户身份时,运行登录命令,在浏览器打开验证链接,核对用户码、客户端和权限后确认。\n\n[cli-device-authorization](https://open.limeai.run/docs/cli-overview?locale=zh-CN#authorization)\n\n```bash\nlimecloud-cli auth login\n```\n\n<a id=\"authorization-boundary\"></a>\n\n## 默认授权范围\n\n默认公共 CLI 配置请求 openid profile email offline_access。调用业务 API 还需要客户端获准申请对应业务 Scope,以及用户当前的服务端权限。安装或登录不会授予应用、工作空间或平台管理角色。\n\n[CLI 身份授权](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n<a id=\"first-task\"></a>\n\n### 3. 开启你的第一个 Agent 任务\n\n打开 AI 工具,描述一个明确的小任务。先让它检查 Schema 并给出计划,再决定是否访问业务数据。\n\n```text\n用 LimeCloud CLI 找到应用列表命令,读取 Schema,说明必要参数和权限。先不要请求业务数据。\n```\n\n<a id=\"use-cases\"></a>\n\n## Agent 使用案例\n\n以下案例使用已实现的 Lime 合同,展示发现与审阅流程。预览命令不发送业务请求,图示表示操作步骤。\n\n<a id=\"case-applications\"></a>\n\n### 场景 1:找到应用接口并准备查询\n\n说明你要查看哪些应用,Agent 可以先搜索公开命令目录、读取准确的输入 Schema,再为你的工作空间准备查询请求。准备阶段不访问业务数据。\n\n| 用户输入提示词 | Agent 执行流程 |\n| --- | --- |\n| 找到查询应用列表的接口,说明工作空间和权限要求,再给我看请求,先不要发送。 | 发现方法、检查 Schema,再预览请求。执行前将 YOUR_SPACE_ID 换成真实工作空间。 |\n\n### Agent 执行流程\n\n```bash\nlimecloud-cli schema open.application.list\nlimecloud-cli open application list --space-id \"YOUR_SPACE_ID\" --dry-run\n```\n\n[cli-case-applications](https://open.limeai.run/docs/cli-overview?locale=zh-CN#case-applications)\n\n<a id=\"case-config-preview\"></a>\n\n### 场景 2:先审阅配置变更\n\n更新配置需要当前合同和修订号。让 Agent 先检查更新 Schema 并准备预览;确认目标应用、字段和并发要求后,再批准实际写入。\n\n| 用户输入提示词 | Agent 执行流程 |\n| --- | --- |\n| 帮我准备应用配置变更。检查必填字段和 revision,保存前先给我看 dry-run。 | 读取配置更新 Schema,获授权后取得当前配置,再使用这些值准备预览。预览成功说明本地请求通过校验,不代表已保存或已授权。 |\n\n### Agent 执行流程\n\n```bash\nlimecloud-cli schema open.configuration.get\nlimecloud-cli schema open.configuration.update\n```\n\n[cli-case-config-preview](https://open.limeai.run/docs/cli-overview?locale=zh-CN#case-config-preview)\n\n<a id=\"case-installation\"></a>\n\n### 场景 3:核对应用安装上下文\n\n| 用户输入提示词 | Agent 执行流程 |\n| --- | --- |\n| 查一下如何查看工作空间已安装的应用。先给我看账户权限和请求,不要安装或卸载应用。 | 使用账户领域的安装列表方法。工作空间、账户授权和应用安装可用范围,与把 CLI 安装到电脑上分别管理。 |\n\n### Agent 执行流程\n\n```bash\nlimecloud-cli schema account.installation.list\nlimecloud-cli account installation list --space-id \"YOUR_SPACE_ID\" --dry-run\n```\n\n[cli-case-installation](https://open.limeai.run/docs/cli-overview?locale=zh-CN#case-installation)\n\n<a id=\"case-operations\"></a>\n\n### 场景 4:准备运营查询\n\n| 用户输入提示词 | Agent 执行流程 |\n| --- | --- |\n| 准备查询 Sandbox 应用的订单列表。检查环境和只读权限,访问订单前先给我看请求。 | 选择运营订单列表合同,显式指定应用和环境。预览不拉取订单;实际查询需要获授权的业务客户端及对应服务端角色。 |\n\n### Agent 执行流程\n\n```bash\nlimecloud-cli schema operations.order.list\nlimecloud-cli operations order list --app-id \"YOUR_APP_ID\" --environment sandbox --dry-run\n```\n\n[cli-case-operations](https://open.limeai.run/docs/cli-overview?locale=zh-CN#case-operations)\n\n<a id=\"case-finance\"></a>\n\n### 场景 5:准备试算平衡核对\n\n| 用户输入提示词 | Agent 执行流程 |\n| --- | --- |\n| 按指定账期和币种准备只读的试算平衡查询,不要记账或冲正。 | 检查财务合同,预览准确的账期和币种。获授权查询后,汇总时保留返回金额的精度与币种。 |\n\n### Agent 执行流程\n\n```bash\nlimecloud-cli schema operations.trial_balance.get\nlimecloud-cli operations trial_balance get --app-id \"YOUR_APP_ID\" --environment sandbox --period \"2026-10\" --currency CNY --dry-run\n```\n\n[cli-case-finance](https://open.limeai.run/docs/cli-overview?locale=zh-CN#case-finance)\n\n<a id=\"member-group-task\"></a>\n\n## 准备并确认成员组变更\n\n对单个企业成员组,使用 task group 准备创建、改名或启用/停用,核对后再明确确认执行。当前企业 Owner 须具备近期强认证,并使用获准申请 lime:open:read 和 lime:open:write 的受控客户端。本次源码已包含该任务,实际可用仍须匹配的 CLI 发布包与服务端部署。\n\n先读取准确 Schema。创建时选择稳定组 ID,expected_revision=0;修改时使用成员组列表中的原组 ID 与当前修订。组名称和原因保留用户原文。准备只保存五分钟有效的不可变核对工件,不改变成员组。同一操作者在同一企业最多保留 20 个未过期准备。\n\n```bash\nlimecloud-cli schema open.group_change.prepare\nlimecloud-cli open group list --space-id \"YOUR_SPACE_ID\"\nlimecloud-cli task group prepare --space-id \"YOUR_SPACE_ID\" --data @change.json\nlimecloud-cli task group get --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\" --format table\n```\n\n| 核对项 | 核对内容 |\n| --- | --- |\n| 人员与范围 | 操作者、企业、客户端、Audience 与环境。Client 环境不代表企业组存在沙箱副本。 |\n| 精确变更 | 原值、冻结的组 ID/名称/状态、原因、原修订及全部授权来源变化。 |\n| 确认与恢复 | 原准备 ID、期限及 preview.confirmation_digest。摘要用于精确匹配确认;执行时仍会重新校验当前权限。 |\n\n<a id=\"member-group-execute-recover\"></a>\n\n### 确认一次,按原 ID 恢复\n\n用户核对完整准备后,将原 ID 和精确摘要传给 execute。JSON 与表格输出保留完整核对内容;任务命令不接受 --fields 或 --yes。CLI 在所选凭据文件旁保存私有最小恢复引用,并在发送前记录一次执行尝试。标记后进程中断时,即使请求尚未发出,也应使用 receipt 或 resolve,不会自动重复执行。\n\n超时或没有回执不能证明未提交。读取原回执,或显式终结原键:服务端返回已提交回执,或永久封闭原键,不执行或撤销变更。准备过期或执行合同更新不会移除原结果恢复。保留原 Issuer、API、客户端和企业;本地引用缺失时可通过 get 重新读取。客户端尝试标记不能证明服务端已提交。\n\n```bash\nlimecloud-cli task group execute --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\" --confirm \"EXACT_CONFIRMATION_DIGEST\"\nlimecloud-cli task group receipt --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\"\nlimecloud-cli task group resolve --space-id \"YOUR_SPACE_ID\" --preparation-id \"ORIGINAL_PREPARATION_ID\"\n```\n\n[检查正式任务合同](https://open.limeai.run/docs/cli-schema?locale=zh-CN)\n\n<a id=\"optional-method-candidates\"></a>\n\n## 先检查一个可选方法\n\n在已有 Agent 宿主中按任务选择一个可选方法:limecloud-login-diagnosis 组织只读应用配置检查,limecloud-member-group 组织单个成员组的准备变更和原结果恢复。每个包装只包含所选方法。本次源码包含公开候选,命令需使用包含它们的 CLI 发布包,原生加载仍须独立验证。\n\nlist 和默认 inspect 完全离线,不读取设置或凭据、不调用业务 API、不安装方法或修改宿主设置。inspect 展示全部文件、来源、版本、精确摘要、声明的动作合同、读写标识,以及所选语言的操作步骤;选择候选前保留完整核对内容。\n\n使用 inspect --online,将全部所需动作与选定的 Issuer 和 API 部署比较。它不带凭据读取公开元数据,保留完整候选与摘要。逐项核对动作、目标、环境和期限:matched 只说明观察时合同匹配,different、absent 或 unknown 需进一步核对;目录不可用或过期保持未知。检查的是随包候选,不是宿主已加载的方法;权限、来源证明和撤回仍未评估,不执行业务或更新。\n\n```bash\nlimecloud-cli skills list\nlimecloud-cli skills inspect limecloud-login-diagnosis --host codex\nlimecloud-cli skills inspect limecloud-login-diagnosis --host skill\nlimecloud-cli skills inspect limecloud-login-diagnosis --online --issuer https://auth.limeai.run --api-origin https://api.limeai.run\n```\n\n| 方法 | 动作类型 | 任务范围 |\n| --- | --- | --- |\n| limecloud-login-diagnosis | read | 读取配置并解释完整或部分结果,真实登录和修复属于独立任务。 |\n| limecloud-member-group | write | 准备、具体确认并创建、改名或调整一个组的状态,沿原操作恢复;成员、角色及批量变更属于独立任务。 |\n\n<a id=\"member-group-method\"></a>\n\n### 通过成员组方法核对具体变更\n\n该方法在当前对话内衔接企业/成员组选择、字段修正、完整影响核对、确认及恢复。write 标记由声明的正式 HTTP 动作推导,不代表当前权限。选择前检查全部六个动作合同;阅读或导出方法不会准备或执行变更。\n\n实际变更使用 task group。先核对冻结原值、完整命令及影响、范围、准备 ID、摘要和期限,再确认这份具体准备。笼统请求、方法制品摘要或 Agent 复制 --confirm 都不能替代该确认。存在持久尝试或结果未知后,保留原上下文并用 receipt 核对;显式选择 resolve 会返回原已提交结果,或永久封原键,不执行或撤销变更。不通过新准备或低层 API 重试代替原恢复。\n\n```bash\nlimecloud-cli skills inspect limecloud-member-group --host codex\nlimecloud-cli skills inspect limecloud-member-group --online --issuer https://auth.limeai.run --api-origin https://api.limeai.run\n```\n\n[核对实际成员组任务](https://open.limeai.run/docs/cli-overview?locale=zh-CN#member-group-task)\n\n<a id=\"single-method-delivery\"></a>\n\n### 导出单项候选,再选择宿主安装\n\n使用所选包装返回的精确摘要和一个新的普通目录。codex 包装包含便携 plugin.json 及该单个方法;skill 包装只含方法和语言步骤,供实际支持的宿主手动导入。导出拒绝既有目录、符号链接祖先及 Agent 发现/配置位置,不执行制品脚本。\n\n已导出、已安装、已启用和当前会话已加载分别表示不同状态。通过实际宿主管理器选择安装或更新,由它作为该插件唯一更新 Owner。普通 CLI 升级只提供新的随包候选,不替换已安装方法。完整性与已安装 CLI 一致,不代表独立来源证明、线上撤回状态、实时兼容或权限;没有宿主证据时,会话加载保持未知。\n\n交付候选可以包含发布清单、对应 CLI 归档、分别包装的方法及可选 Codex 本地来源清单。清单区分干净 Git 提交和 commit 为空的未发布工作树快照。本地完整性检查核对这些文件是否相互一致,不证明发布者身份,也不注册、安装或加载方法。实际发布仍须通过受信渠道和宿主自身的管理流程。\n\n```bash\nlimecloud-cli skills export limecloud-login-diagnosis --host codex --output-dir ./review-candidate --digest \"EXACT_SHA256_DIGEST\"\n```\n\n<a id=\"capability-map\"></a>\n\n## LimeCloud CLI 能力地图\n\n| 业务域 | 能力 |\n| --- | --- |\n| identity | 发现、授权、设备流程、UserInfo、密钥和令牌协议。 |\n| open | 工作空间、应用、配置、客户端、版本、分发、事件和协作者。 |\n| account | 个人账户、工作空间可用范围、应用安装、订单和账户安全。 |\n| operations | 商品、营销、订单、通知、财务和运营审计。 |\n| admin | 平台审核、访问绑定和管理审计。 |\n\n[发现命令与 Schema](https://open.limeai.run/docs/cli-schema?locale=zh-CN)\n\n<a id=\"commands\"></a>\n\n## 常用认证与配置命令\n\n| 操作目标 | 命令 |\n| --- | --- |\n| 安装并配置 | limecloud-cli install |\n| 配置已有公共客户端 | limecloud-cli config init |\n| 用户登录 | limecloud-cli auth login |\n| 检查本地登录状态 | limecloud-cli auth status |\n| 检查指定权限 | limecloud-cli auth check --scope \"REQUIRED_SCOPE\" |\n| 检查本地配置 | limecloud-cli doctor --offline |\n| 退出登录 | limecloud-cli auth logout |\n\n<a id=\"multiple-contexts\"></a>\n\n## 使用多个环境\n\n通过 LIMECLOUD_SETTINGS 与 LIMECLOUD_CONFIG,将每个环境的设置和凭据分别保存。登录绑定 Issuer、公共客户端和 API Origin;变更 API Origin 后需要对应的新授权上下文。\n\n[配置与凭据隔离](https://open.limeai.run/docs/cli-configuration?locale=zh-CN)\n\n<a id=\"faq\"></a>\n\n## 常见问题\n\n| 问题 | 处理方式 |\n| --- | --- |\n| 安装后找不到命令 | 检查返回的 bin_directory 与 PATH;原进程环境未更新时,启动新的终端或 Agent 进程。 |\n| 安装返回 configuration.status=pending | 使用部署管理员提供的公共 CLI 客户端与服务来源,运行 config init。 |\n| 设备授权已过期 | 重新运行 auth login,在浏览器核对新的用户码。 |\n| 业务 API 提示权限不足 | 检查 Schema 的 required_scopes、客户端可申请范围及服务端角色。默认公共客户端仅提供身份 Scope。 |\n| Agent 能否自动安装并完成授权? | Agent 可以运行安装并返回验证链接。浏览器同意由用户完成,非交互安装只有显式要求时才发起授权。 |\n\n[排查 CLI 问题](https://open.limeai.run/docs/cli-troubleshooting?locale=zh-CN)\n\n[Agent 接入](https://open.limeai.run/docs/cli-agent-integration?locale=zh-CN)\n","revision":"sha256:d1f56942633021c4a33bd92f7632ccf40eaef76c3797936447dcc5a4de7c545e"},{"id":"cli-agent-integration","group":"cli","category":"LimeCloud CLI","title":"Agent 接入","summary":"通过结构化 CLI 调用接入,或连接显式启用的 MCP 资源读取应用;各通道分别授权。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-agent-integration?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"mcp-application-reads","title":"通过 MCP 读取应用"},{"id":"mcp-scope-selection","title":"先选择范围,再读取配置"},{"id":"mcp-results","title":"在宿主内完成读取"},{"id":"scenarios","title":"适用场景"},{"id":"schema","title":"1. 发现准确方法"},{"id":"credentials","title":"2. 绑定身份与凭据"},{"id":"boundaries","title":"3. 定义工具边界"},{"id":"review","title":"4. 预览并审阅请求"},{"id":"subprocess","title":"5. 从 Node.js 调用 CLI"},{"id":"results","title":"6. 处理结果、错误与取消"}],"markdown":"# Agent 接入\n\n通过结构化 CLI 调用接入,或连接显式启用的 MCP 资源读取应用;各通道分别授权。\n\n<a id=\"mcp-application-reads\"></a>\n\n## 通过 MCP 读取应用\n\n部署维护者启用 MCP 并为原生宿主预登记公共客户端后,连接规范 API Origin 下的 /mcp。资源通过 /.well-known/oauth-protected-resource/mcp 声明授权服务器。使用宿主的 OAuth 登录与 S256 PKCE;授权及令牌请求都必须指定该准确 resource。CLI Access Token 和浏览器 Cookie 不能用于此资源。\n\n当前实现支持 MCP 2026-07-28 与 2025-11-25,采用无状态 Streamable HTTP。宿主须支持其中一个版本及登记回调;当前不声明动态注册或 CIMD。Codex、Claude Code、WorkBuddy 的实际宿主流程仍待验证,部署是否启用与宿主是否支持需分别核对。\n\n| 工具 | 输入 | 结果与边界 |\n| --- | --- | --- |\n| lime_open_space_list | cursor? | 最多100个当前有效成员空间;原空间ID游标用于继续分页,不授予成员关系或应用访问权。 |\n| lime_open_application_list | space_id, q?, limit?, cursor? | 所选空间中当前获准的一页应用,可按名称或准确ID检索;limit 为1–50,默认20,游标绑定用户、空间和检索条件。 |\n| lime_open_application_get | space_id, application_id | 当前获准的应用投影,原领域每次检查当前成员关系和应用访问权。 |\n| lime_open_client_list | space_id, application_id, environment, limit?, cursor? | 一页登录客户端资料,不返回密钥;要求当前客户端管理权限。limit 为 1–50,默认 20;next_cursor 表示仍有后续资料。 |\n| lime_open_login_diagnose | space_id, application_id, environment, limit?, cursor? | 与 HTTP、CLI 相同的 v2 应用诊断:一页有界读取、安全客户端摘要、逐来源时间和覆盖范围。配置候选不代表登录验证;应用不可读为工具错误,客户端不可读为部分报告。 |\n\n<a id=\"mcp-scope-selection\"></a>\n\n## 先选择范围,再读取配置\n\n1. 未知空间ID时先读取一页空间,展示返回的ID和名称。已有明确且适用的选择可以复用;多个空间匹配时请用户选择。\n2. 只读取所选空间中的应用,通过q按名称或准确ID缩小范围,再展示获准候选。空结果表示当前范围内没有匹配项,不代表整个平台没有应用。\n3. 应用候选有歧义时由用户选择。next_cursor表示覆盖不完整;只有明确继续当前选择时才读取后续页,不静默遍历所有空间、不默认选第一项,也不在改变查询后复用原游标。\n4. 选定应用后明确sandbox或production,调用lime_open_login_diagnose获得有界配置报告;需要原始资料时再用详情和客户端工具。结果优先在当前宿主呈现,每个来源重新检查当前权限,先前选中不代表撤权后仍可读取。\n\n<a id=\"mcp-results\"></a>\n\n## 在宿主内完成读取\n\n工具提供 inputSchema、outputSchema、structuredContent 和对应文本,宿主可呈现表格、详情或继续询问。继续分页保持当前用户、范围和查询。空间发现沿原空间ID游标;应用和客户端游标另绑定准确查询与范围。这些读取不验证实际登录、不修复配置,也不执行成员组任务。\n\n共享诊断须保留 schema_version:2、check_code、各 evidence 时间和 coverage;login_verified 与 common_snapshot 始终为 false。续页即使没有下一游标仍为 partial。CLI 另附 contract_check 和真实 HTTP transport,不能替代应用来源证据;宿主不重算或提升领域结论。\n\n工具执行前的认证失败可能返回 HTTP 401/403;领域失败使用 isError、稳定错误码和请求 ID。工具注解、发现成功或软件版本均不代表权限。优先在宿主内交互,步骤未适配、不适合或用户主动选择时,再使用实际内置浏览器,然后是可信 URL。\n\n[CLI 概览](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n<a id=\"scenarios\"></a>\n\n## 适用场景\n\n当 Agent 需要操作 Lime,而宿主需要控制凭据传递、命令范围、审批、超时和日志时,可使用本方案。接入方式是以进程调用 CLI,无需 Go 插件或重新编译 CLI。\n\n[cli-agent-workflow](https://open.limeai.run/docs/cli-agent-integration?locale=zh-CN#scenarios)\n\n| 接入任务 | Lime 接入方式 | 宿主职责 |\n| --- | --- | --- |\n| 提供凭据 | auth login / LIMECLOUD_ACCESS_TOKEN | 隔离用户会话,令牌不进入参数和日志。 |\n| 指定服务来源 | --issuer / --api-origin | 使用配置的可信部署,保持登录绑定。 |\n| 限制工具范围 | schema: _meta / inputSchema | 维护明确的命令白名单,并校验结构化输入。 |\n| 审阅写入 | --dry-run | 取得准确请求的批准后再执行。 |\n| 记录执行结果 | --json / exit status | 记录方法、结果和安全错误码,隐藏敏感值。 |\n| 管理进程生命周期 | stdin / stdout / stderr | 限制运行时间和输出,处理取消及未知结果。 |\n\n<a id=\"schema\"></a>\n\n## 1. 发现准确方法\n\n构建工具调用前先读取 Schema。inputSchema 描述参数载体和字段,outputSchema 描述响应,_meta 提供方法、路径、来源、required_scopes 和 risk。这些信息用于检查,不代表已获得权限。\n\n```bash\nlimecloud-cli api list application --json\nlimecloud-cli schema open.application.list --json\n```\n\n<a id=\"credentials\"></a>\n\n## 2. 绑定身份与凭据\n\n交互用户会话使用设备登录。通过 --no-wait,Agent 取得验证链接和用户码并交给用户;用户完成浏览器操作后再恢复。\n\n拥有自有令牌服务的宿主可以通过子进程环境变量 LIMECLOUD_ACCESS_TOKEN 提供令牌。宿主负责绑定正确用户、服务来源和业务上下文;外部令牌模式不替宿主获取或刷新该令牌。\n\n```bash\nlimecloud-cli auth login --no-wait --json\nlimecloud-cli auth login --resume --json\nlimecloud-cli auth status --json\n```\n\n[授权与权限检查](https://open.limeai.run/docs/cli-auth?locale=zh-CN)\n\n<a id=\"boundaries\"></a>\n\n## 3. 定义工具边界\n\n向模型开放明确的方法列表。按对应 Schema 校验输入,再构造参数数组,不接受模型输出的任意 shell 命令。\n\nIssuer 和 API Origin 来自可信宿主配置。多用户或多部署场景使用独立的设置与凭据文件。服务端继续检查 Scope、工作空间成员关系、应用可用范围、角色及操作要求的强认证。\n\n[设置与凭据存储](https://open.limeai.run/docs/cli-configuration?locale=zh-CN)\n\n<a id=\"review\"></a>\n\n## 4. 预览并审阅请求\n\n使用校验过的字段与 --dry-run,查看准确目标和请求而不发送。审批由宿主负责;批准后,用同一方法和输入去掉 --dry-run 执行,并保留资源修订号及所需幂等、确认字段。\n\n```bash\nlimecloud-cli open application list --space-id \"YOUR_SPACE_ID\" --dry-run --json\n```\n\n[请求预览](https://open.limeai.run/docs/cli-dry-run?locale=zh-CN)\n\n<a id=\"subprocess\"></a>\n\n## 5. 从 Node.js 调用 CLI\n\nNode.js Agent 可将 CLI 包加入自身依赖,解析 JavaScript 入口后,以 Node 和参数数组调用。此方式不依赖 shell 或平台命令垫片。以下示例只读取离线 Schema。\n\n```javascript\nimport { execFile } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { promisify } from \"node:util\";\n\nconst require = createRequire(import.meta.url);\nconst entry = require.resolve(\"@limecloud/cli/bin/limecloud-cli.mjs\");\nconst run = promisify(execFile);\nconst { stdout } = await run(process.execPath, [\n entry, \"schema\", \"open.application.list\", \"--json\",\n], { timeout: 15_000, maxBuffer: 1_048_576 });\nconst result = JSON.parse(stdout);\nif (!result.ok) throw new Error(result.error.code);\nconsole.log(result.data.inputSchema);\n```\n\n<a id=\"results\"></a>\n\n## 6. 处理结果、错误与取消\n\n将 stdout 解析为 JSON,检查 ok、data 和稳定的 error.code。进度和设备授权提示可能写入 stderr。退出码非零或输出格式异常时停止工具调用,不使用本地化消息识别程序错误。\n\n写入时超时或取消,结果可能未知。先查询真实资源状态,再决定能否安全重试。审计日志只记录必要标识与结果,不记录访问令牌、保密设备码或原始凭据文件。\n\n| 错误码 | 恢复方式 |\n| --- | --- |\n| invalid_arguments | 读取 Schema,修正输入后重试。 |\n| login_required / token_expired | 恢复正确登录上下文,或发起新的用户授权。 |\n| missing_scopes | 检查客户端可申请的业务 Scope 与用户权限,不静默扩大授权。 |\n| api_origin_required | 显式配置目标业务 API Origin。 |\n| request_failed / cancelled | 写入结果未知时,先核对资源状态再重试。 |\n\n[输出合同](https://open.limeai.run/docs/cli-output?locale=zh-CN)\n","revision":"sha256:49579d79cfb62bf65e5a614d7d04c03fbaa7c0cb0a6d0e957025d35e3f5ee041"},{"id":"cli-installation-guide","group":"cli","category":"LimeCloud CLI","title":"LimeCloud CLI 安装指南","summary":"面向用户与 AI Agent 的分步安装指南,浏览器授权由用户本人确认。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-27","source_url":"https://open.limeai.run/docs/cli-installation-guide?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"requirements","title":"环境要求"},{"id":"install","title":"第 1 步:安装"},{"id":"configuration","title":"第 2 步:确认部署配置"},{"id":"login","title":"第 3 步:按需完成用户授权"},{"id":"verify","title":"第 4 步:验证"},{"id":"next","title":"后续使用"}],"markdown":"# LimeCloud CLI 安装指南\n\n面向用户与 AI Agent 的分步安装指南,浏览器授权由用户本人确认。\n\n<a id=\"requirements\"></a>\n\n## 环境要求\n\n使用 Node.js 22.12 或更新版本及 npm/npx。本文安装流程由 0.7.0 提供,新增命令以实际 npm 发布版本为准。通过 npm 安装无需 Go 或 Python。\n\n```bash\nnode --version\nnpm --version\n```\n\n<a id=\"install\"></a>\n\n## 第 1 步:安装\n\n运行安装器并读取结果。它将本次运行的精确版本安装到用户前缀 ~/.local,返回可执行目录,不改写 shell 配置。可通过 --prefix 指定其他目录。\n\n```bash\nnpx @limecloud/cli@latest install\n```\n\n<a id=\"configuration\"></a>\n\n## 第 2 步:确认部署配置\n\n安装引导默认从 https://auth.limeai.run/runtime/v1/cli 发现公共 CLI 元数据;自定义 Issuer 时使用该服务的对应端点。响应提供已有公共 Client ID、API Origin 和 openid profile email offline_access,已有显式设置优先。\n\n发现不可用且缺少 Client ID 时,非交互安装返回 configuration.status=pending。向部署管理员取得公共 CLI Client ID 与服务来源,再运行配置命令。不要以客户端 Secret 代替,也不要自动创建平台应用。\n\n```bash\nlimecloud-cli config init \\\n --issuer \"https://YOUR_AUTH_ORIGIN\" \\\n --api-origin \"https://YOUR_API_ORIGIN\" \\\n --client-id \"YOUR_REGISTERED_PUBLIC_CLI_CLIENT_ID\"\nlimecloud-cli config show\n```\n\n<a id=\"login\"></a>\n\n## 第 3 步:按需完成用户授权\n\n交互安装可询问是否登录,由用户选择。Agent 安装时可发起非阻塞登录,把返回的 verification_uri 和 user_code 交给用户,让其在浏览器核对并确认,再继续恢复。不要替用户批准浏览器授权。\n\n[cli-device-authorization](https://open.limeai.run/docs/cli-installation-guide?locale=zh-CN#login)\n\n```bash\nlimecloud-cli auth login --no-wait --json\nlimecloud-cli auth login --resume --json\n```\n\n<a id=\"verify\"></a>\n\n## 第 4 步:验证\n\n分别核对已安装命令、本地配置和公开合同。auth status 与 doctor --offline 检查本地状态,schema 不请求业务数据。当前进程未发现 PATH 时,可使用返回的可执行路径,或更新 PATH 后启动新的终端或 Agent。\n\n```bash\nlimecloud-cli --version\nlimecloud-cli auth status\nlimecloud-cli doctor --offline\nlimecloud-cli schema open.application.list\n```\n\n<a id=\"next\"></a>\n\n## 后续使用\n\n安装不包含全局 Agent Skills。默认身份 Scope 不授予业务方法权限。读取目标方法 Schema,取得可申请对应权限的客户端及服务端可用范围,并先审阅 dry-run,再发起业务请求。\n\n[开启第一个任务](https://open.limeai.run/docs/cli-overview?locale=zh-CN)\n\n[Agent 接入](https://open.limeai.run/docs/cli-agent-integration?locale=zh-CN)\n","revision":"sha256:a2864b1d3a72373fc05aa24ac77ff593c2ba354e0fe591726de91c858db7e7a5"},{"id":"platform-knowledge","group":"guide","category":"认识开放平台","title":"平台知识导航","summary":"认识平台、找到任务指南,再按当前合同完成操作。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/platform-knowledge?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"start","title":"从你的问题开始"},{"id":"map","title":"找到对应的工作入口"},{"id":"responsibilities","title":"区分知识与当前事实"},{"id":"availability","title":"核对可用状态与访问范围"}],"markdown":"# 平台知识导航\n\n认识平台、找到任务指南,再按当前合同完成操作。\n\n<a id=\"start\"></a>\n\n## 从你的问题开始\n\nLime 的指南为开发者、客户及获准运营人员说明产品概念、完整流程和异常恢复。先看概览,再选择任务并阅读关联指南。你也可以让 Agent 在当前对话中解释资料,无需发起业务操作。\n\n[平台概述](https://open.limeai.run/docs/platform-overview?locale=zh-CN)\n\n[查找任务指南](https://open.limeai.run/docs/platform-task-guides?locale=zh-CN)\n\n[通过 Agent 阅读](https://open.limeai.run/docs/cli-knowledge?locale=zh-CN)\n\n<a id=\"map\"></a>\n\n## 找到对应的工作入口\n\n职责与显示端分别管理。你可以使用 Codex、Claude Code、WorkBuddy 等已有 Agent 宿主处理受支持任务;服务端仍检查实际人员、空间、应用、环境和资源。身兼多职不代表同一个人可以独立审核自己的提交。\n\n| 入口 | 主要任务 |\n| --- | --- |\n| 开放平台 Open | 阅读接入指南,在开发权限内创建、配置、测试和发布应用。 |\n| 应用中心 App 与用户中心 Console | 发现应用,管理获准的安装、本人授权、购买、使用范围及账号安全。 |\n| 应用运营平台 Portal | 执行获委派的应用经营、客服、财务及明确授权的审核任务。 |\n| 总控平台 Admin | 管理平台治理、安全及角色委派;业务审核仍需适当的独立审核人。 |\n| 统一认证 Auth | 完成登录、设备授权、本人同意及必要认证。 |\n\n[工作空间](https://open.limeai.run/docs/workspaces?locale=zh-CN)\n\n[应用基本概念](https://open.limeai.run/docs/application-concepts?locale=zh-CN)\n\n[Scope 与权限](https://open.limeai.run/docs/scopes?locale=zh-CN)\n\n<a id=\"responsibilities\"></a>\n\n## 区分知识与当前事实\n\n| 来源 | 解决的问题 |\n| --- | --- |\n| 产品知识 | 概念、关系、前置条件、任务流程和恢复方法。 |\n| Skills | 如何组织任务、选择指南和正式工具;阅读指南不等于安装 Skill。 |\n| Schema 与能力发现 | 受支持动作、准确输入输出和兼容要求。 |\n| 获授权的正式 API | 当前状态、当前权限和实际执行结果;文章不能授予访问权或证明操作成功。 |\n\n<a id=\"availability\"></a>\n\n## 核对可用状态与访问范围\n\n在网页阅读指南,或使用 CLI 知识命令在当前宿主列出、检索和读取公开资料。CLI 内置离线快照,--online 显式读取文档部署;继续操作前核对来源和修订。MCP 知识接入和受限运营 SOP 仍在规划,各业务能力以原指南及当前 API 合同中的状态为准。\n\n内部运营资料与公开指南分开。SOP、搜索摘要和附件均须获准读取;了解流程不等于取得执行权限。\n","revision":"sha256:53b6e4c69e06065b60dd8a8b89584e85a43cd73567c962883de36f6aa8711978"},{"id":"platform-task-guides","group":"guide","category":"认识开放平台","title":"角色任务指南","summary":"选择目标、核对前置条件,沿原指南完成任务并处理异常。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/platform-task-guides?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"developer","title":"开发并发布应用"},{"id":"customer","title":"安装、授权与使用应用"},{"id":"operations","title":"运营、审核与排查"},{"id":"continue","title":"在当前 Agent 中继续"}],"markdown":"# 角色任务指南\n\n选择目标、核对前置条件,沿原指南完成任务并处理异常。\n\n<a id=\"developer\"></a>\n\n## 开发并发布应用\n\n先明确获授权空间、目标应用和环境。应用登记、OAuth 客户端、配置修订、版本、分发及客户安装分别管理。发布应用不会授予所有客户使用权,也不会自动批准 API 消费。\n\n1. 阅读应用概念与开发流程,只选择产品需要的能力。\n2. 配置客户端、Scope 及必要事件投递,按适用合同测试。\n3. 沿指南冻结配置、独立审核、发布及安装;结果未知时先核对原操作,再决定下一步。\n\n[开发流程](https://open.limeai.run/docs/development-workflow?locale=zh-CN)\n\n[OAuth 客户端](https://open.limeai.run/docs/oauth-clients?locale=zh-CN)\n\n[版本与审核](https://open.limeai.run/docs/releases?locale=zh-CN)\n\n[事件投递](https://open.limeai.run/docs/webhooks?locale=zh-CN)\n\n<a id=\"customer\"></a>\n\n## 安装、授权与使用应用\n\n选择个人或获授权企业空间。安装、客户批准、本人同意、购买及权益分别检查。付款成功不代表已经完成开通,安装也不产生管理员权限。\n\n1. 阅读所选版本、空间的安装和使用要求。\n2. 在指定流程中完成必要的客户批准、本人同意和商业步骤。\n3. 开通延迟时,通过获授权工具核对原订单、付款结果及权益。保留原引用,不以重新付款处理未知结果。\n\n[应用安装](https://open.limeai.run/docs/installations?locale=zh-CN)\n\n[权益与许可证](https://open.limeai.run/docs/entitlements-licenses?locale=zh-CN)\n\n<a id=\"operations\"></a>\n\n## 运营、审核与排查\n\n公开指南解释职责边界;内部详细 SOP 需要对应访问资格,不包含在这些公开页面中。尚在建设的功能保留原指南中的状态说明。\n\n| 任务 | 操作前核对 | 结果与恢复 |\n| --- | --- | --- |\n| 排查订单或投递 | 负责的应用、环境、可读字段及原操作。 | 读取来源回执及投递状态;重试、退款或补发须有受支持动作并另行获授权。 |\n| 审核或风险处置 | 当前角色、精确对象、独立审核人及必要认证。 | 核对原决定和审计;切换角色不会成为第二名审核人。 |\n| 核对财务 | 账套权限、应用、账期、币种及来源完整性。 | 区分付款、发权及入账延迟,保留精确金额,不重复扣款修复入账延迟。 |\n\n[审计与通知](https://open.limeai.run/docs/audit-notifications?locale=zh-CN)\n\n[财务账务](https://open.limeai.run/docs/finance-ledger?locale=zh-CN)\n\n[事件响应](https://open.limeai.run/docs/incident-response?locale=zh-CN)\n\n<a id=\"continue\"></a>\n\n## 在当前 Agent 中继续\n\n先让 Agent 解释相关指南。受支持任务优先在当前宿主完成输入、校验、确认和结果;步骤未适配或不适合时,优先使用可用的内置浏览器,否则使用可信 URL,你也可以主动选择原后台。登录、MFA 及托管支付遵守各自要求,打开页面不代表操作完成。\n\n[Agent 阅读指南](https://open.limeai.run/docs/cli-knowledge?locale=zh-CN)\n\n[Agent 集成能力概述](https://open.limeai.run/docs/cli-agent-overview?locale=zh-CN)\n","revision":"sha256:2b5c794807c27b0b9bf0f7b4204db4be0c0a0e4e516f3dd63b6fca2ad13faf11"},{"id":"cli-knowledge","group":"cli","category":"LimeCloud CLI","title":"通过 Agent 阅读平台知识","summary":"用产品指南理解任务,操作前再检查当前 Schema 和获授权状态。","locale":"zh-CN","requested_locale":"zh-CN","fallback":false,"updated_at":"2026-10-28","source_url":"https://open.limeai.run/docs/cli-knowledge?locale=zh-CN","visibility":"public","lifecycle":"published","owner":"open-platform-documentation","applicability":"article-and-current-contract","software_version":"0.10.0","related_operations":[],"sections":[{"id":"read","title":"按任务读取知识"},{"id":"current","title":"当前可用入口"},{"id":"actions","title":"从动作找到任务指南"},{"id":"versions","title":"核对资料时效与兼容"},{"id":"safety","title":"阅读与执行分别处理"}],"markdown":"# 通过 Agent 阅读平台知识\n\n用产品指南理解任务,操作前再检查当前 Schema 和获授权状态。\n\n<a id=\"read\"></a>\n\n## 按任务读取知识\n\n1. 从平台知识导航选择角色或任务,需要概念、前置条件或恢复指南时使用文档站搜索。\n2. 让 Agent 读取可访问的相关页面,或把正文提供到当前对话;按宿主支持的文本、表格、步骤及来源链接解释。\n3. 只需解释时,回答问题即可;需要查询或变更时,先发现当前方法 Schema,并核对实际账号和资源上下文。\n\n[平台知识导航](https://open.limeai.run/docs/platform-knowledge?locale=zh-CN)\n\n[角色任务指南](https://open.limeai.run/docs/platform-task-guides?locale=zh-CN)\n\n[发现 Schema](https://open.limeai.run/docs/cli-schema?locale=zh-CN)\n\n<a id=\"current\"></a>\n\n## 当前可用入口\n\n使用 docs list、docs search、docs read 免登录读取公开知识。正文默认输出 Markdown,--json 返回来源、语言、修订与分发元信息;列表和检索另支持表格、CSV 与 NDJSON。简写 docs ARTICLE 仍输出网页 URL,不打开浏览器;阅读不安装 Agent Skills。\n\n公开机器入口为 https://open.limeai.run/llms.txt:先选择语言,再读取主题索引和所需 Markdown 文章。网页构建与 CLI 快照来自同一公开文章登记。如果已安装 CLI 的 docs --help 未列出这些命令,请先取得包含该能力的可信构建,再使用示例。\n\n> 默认内置快照为离线资料,不证明线上当前能力。--online 不携带业务凭据读取可信文档部署;在线关键词检索匹配元信息,内置检索另匹配正文。结果默认每页 10 条、最多 50 条。MCP 知识接入及受限运营 SOP 仍在规划。\n\n```bash\nlimecloud-cli docs list --group guide --limit 5 --format table --fields id,title\nlimecloud-cli docs search \"platform knowledge\" --limit 5\nlimecloud-cli docs read platform-knowledge\nlimecloud-cli docs read platform-knowledge --section map --json\nlimecloud-cli docs read platform-task-guides --online\nlimecloud-cli docs platform-knowledge\nlimecloud-cli schema open.application.list\n```\n\n[安装指南及 Agent 阅读入口](https://open.limeai.run/docs/cli-installation-guide?locale=zh-CN)\n\n<a id=\"actions\"></a>\n\n## 从动作找到任务指南\n\n方法的 _meta.knowledge 列出显式关联的公开指南及其语言、来源和精确修订。关联来自内置快照,不是线上能力检查。使用返回的文章 ID 和修订执行 docs read,具体命令帮助也会显示该读取命令。指南只引用 operationId,输入字段与 Scope 继续来自正式动作合同。\n\n指南的 JSON 与 Markdown 元信息包含 related_operations,可据此进一步检查动作。空列表表示未发布显式关联。补充指南快照缺失或无效时,Schema 将 knowledge.status 标为 unavailable 并保留本地动作合同,不猜测关联或自动联网补取。\n\n```bash\nlimecloud-cli schema open.client.list\nlimecloud-cli open client list --help\nlimecloud-cli docs read oauth-clients --json\n```\n\n<a id=\"versions\"></a>\n\n## 核对资料时效与兼容\n\n核对指南来源、更新信息和可用状态。本地副本或旧 Skill 可能描述其他版本。实际调用前读取已安装 CLI 的帮助、Schema,并核对目标部署。正文修订、CLI 版本及动作合同分别管理,均不产生权限。需要精确正文时,使用 docs read ARTICLE --revision 指定先前返回的修订;修订变化时停止读取,不静默换用正文。\n\n无法核实时说明资料局限,并保留原操作引用。刷新文档或升级软件不能重复未知写入、替换幂等键或改变先前确认。\n\n> schema METHOD --online 显式比较目标当前公开动作合同,不刷新内置指南或授予执行权限。核对 compatibility.status 并保留原操作;自动写入门禁和受管 Skill 更新仍待实现。\n\n[CLI 排错](https://open.limeai.run/docs/cli-troubleshooting?locale=zh-CN)\n\n[平台变更](https://open.limeai.run/docs/platform-updates?locale=zh-CN)\n\n<a id=\"safety\"></a>\n\n## 阅读与执行分别处理\n\n文章和外部文字是参考资料,不能批准业务动作或覆盖宿主工具策略。内部 SOP、搜索摘要和附件需要当前访问资格;公开文章不包含私有运营数据或凭据。\n\n准确说明资料缺失、过期或不可访问;不猜 API、不使用隐藏浏览器接口,也不扩大权限填补资料缺口。必要时回到可信原指南或后台。\n","revision":"sha256:cc7512cb2d67c0265dfa3bd878c1dd19ac8e82a5637af4c9493c422104015a0b"}]}]}