fix(cloud): render empty skills without sandbox grant

This commit is contained in:
dadachann
2026-07-30 03:21:26 +00:00
parent 4b2a628db6
commit 8737b818b6
3 changed files with 58 additions and 2 deletions
+8 -1
View File
@@ -12,6 +12,7 @@ from urllib.parse import quote, unquote, urlparse
import httpx
from ....cloud.entitlements import EntitlementFeatureUnavailableError
from ....core import app
from ....skill.utils import parse_frontmatter
from ....utils import httpclient
@@ -119,7 +120,13 @@ class SkillService:
box_service = self._box_service()
if box_service is None:
return []
return [self._serialize_skill(skill) for skill in await box_service.list_skills(execution_context)]
try:
skills = await box_service.list_skills(execution_context)
except EntitlementFeatureUnavailableError as error:
if error.feature == 'managed_sandbox':
return []
raise
return [self._serialize_skill(skill) for skill in skills]
async def get_skill(self, context: TenantContext, skill_name: str) -> Optional[dict]:
execution_context = await self._execution_context(context)
+13 -1
View File
@@ -17,6 +17,14 @@ class EntitlementUnavailableError(RuntimeError):
self.entitlement_revision = entitlement_revision
class EntitlementFeatureUnavailableError(EntitlementUnavailableError):
"""Raised when an active entitlement explicitly omits a capability."""
def __init__(self, message: str, *, feature: str, entitlement_revision: int | None = None) -> None:
super().__init__(message, entitlement_revision=entitlement_revision)
self.feature = feature
class EntitlementSnapshot(pydantic.BaseModel):
"""Capability projection consumed by open-source Core.
@@ -82,7 +90,11 @@ class EntitlementSnapshot(pydantic.BaseModel):
def require_feature(self, feature: str) -> None:
if self.features.get(feature) is not True:
raise EntitlementUnavailableError(f'Workspace entitlement does not grant {feature}')
raise EntitlementFeatureUnavailableError(
f'Workspace entitlement does not grant {feature}',
feature=feature,
entitlement_revision=self.entitlement_revision,
)
def limit(self, name: str) -> int:
value = self.limits.get(name)