@@ -15,9 +15,10 @@ function fetchAuth<T>(url: string, options?: RequestInit): Promise<T> {
1515interface OpenClawSettingsProps {
1616 agent : any ;
1717 agentId : string ;
18+ canManage : boolean ;
1819}
1920
20- export default function OpenClawSettings ( { agent, agentId } : OpenClawSettingsProps ) {
21+ export default function OpenClawSettings ( { agent, agentId, canManage } : OpenClawSettingsProps ) {
2122 const { t, i18n } = useTranslation ( ) ;
2223 const queryClient = useQueryClient ( ) ;
2324 const navigate = useNavigate ( ) ;
@@ -34,6 +35,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
3435 const hasKey = agent ?. has_api_key || false ;
3536
3637 const handleRegenerate = async ( autoCopy = false ) => {
38+ if ( ! canManage ) return ;
3739 setRegenerating ( true ) ;
3840 try {
3941 const result = await fetchAuth < { api_key : string } > ( `/agents/${ agentId } /api-key` , { method : 'POST' } ) ;
@@ -56,6 +58,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
5658 } ;
5759
5860 const handleDelete = async ( ) => {
61+ if ( ! canManage ) return ;
5962 setDeleting ( true ) ;
6063 try {
6164 await agentApi . delete ( agentId ) ;
@@ -75,6 +78,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
7578 } ) ;
7679
7780 const handleScopeChange = async ( newScope : string ) => {
81+ if ( ! canManage || ! isOwner ) return ;
7882 try {
7983 await fetchAuth ( `/agents/${ agentId } /permissions` , {
8084 method : 'PUT' ,
@@ -89,6 +93,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
8993 } ;
9094
9195 const handleAccessLevelChange = async ( newLevel : string ) => {
96+ if ( ! canManage || ! isOwner ) return ;
9297 try {
9398 await fetchAuth ( `/agents/${ agentId } /permissions` , {
9499 method : 'PUT' ,
@@ -103,6 +108,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
103108 } ;
104109
105110 const isOwner = permData ?. is_owner ?? false ;
111+ const canEditPermissions = canManage && isOwner ;
106112 const currentScope = permData ?. scope_type === 'user' ? 'private' : ( permData ?. scope_type || 'company' ) ;
107113 const currentAccessLevel = permData ?. access_level || 'use' ;
108114
@@ -146,13 +152,13 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
146152 copiedLabel = "Copied"
147153 style = { { padding : '4px 12px' , fontSize : '12px' , whiteSpace : 'nowrap' , minWidth : '70px' , height : 'fit-content' } }
148154 />
149- < button
155+ { canManage && < button
150156 className = "btn btn-secondary"
151157 onClick = { ( ) => setShowConfirm ( true ) }
152158 style = { { padding : '4px 12px' , fontSize : '12px' , whiteSpace : 'nowrap' } }
153159 >
154160 { isChinese ? '重新生成' : 'Regenerate' }
155- </ button >
161+ </ button > }
156162 </ div >
157163 ) ;
158164 }
@@ -169,15 +175,15 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
169175 ? ( isChinese ? '旧版密钥(已加密隐藏),请重新生成以查看明文' : 'Legacy key (encrypted), please regenerate to view' )
170176 : ( isChinese ? '未生成' : 'Not generated' ) }
171177 </ div >
172- < button
178+ { canManage && < button
173179 className = "btn btn-secondary"
174180 onClick = { ( ) => setShowConfirm ( true ) }
175181 style = { { padding : '6px 16px' , fontSize : '12px' , whiteSpace : 'nowrap' } }
176182 >
177183 { isLegacyHash
178184 ? ( isChinese ? '重新生成' : 'Regenerate' )
179185 : ( isChinese ? '生成' : 'Generate' ) }
180- </ button >
186+ </ button > }
181187 </ div >
182188 ) ;
183189 } ) ( ) }
@@ -214,7 +220,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
214220 < button
215221 className = "btn btn-primary"
216222 onClick = { ( ) => handleRegenerate ( false ) }
217- disabled = { regenerating }
223+ disabled = { ! canManage || regenerating }
218224 style = { { padding : '5px 14px' , fontSize : '12px' } }
219225 >
220226 { regenerating
@@ -243,22 +249,22 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
243249 style = { {
244250 display : 'flex' , alignItems : 'center' , gap : '10px' ,
245251 padding : '12px 14px' , borderRadius : '8px' ,
246- cursor : isOwner ? 'pointer' : 'default' ,
252+ cursor : canEditPermissions ? 'pointer' : 'default' ,
247253 border : currentScope === scope
248254 ? '1px solid var(--accent-primary)'
249255 : '1px solid var(--border-subtle)' ,
250256 background : currentScope === scope
251257 ? 'rgba(99,102,241,0.06)'
252258 : 'transparent' ,
253- opacity : isOwner ? 1 : 0.7 ,
259+ opacity : canEditPermissions ? 1 : 0.7 ,
254260 transition : 'all 0.15s' ,
255261 } }
256262 >
257263 < input
258264 type = "radio"
259265 name = "perm_scope_oc"
260266 checked = { currentScope === scope }
261- disabled = { ! isOwner }
267+ disabled = { ! canEditPermissions }
262268 onChange = { ( ) => handleScopeChange ( scope ) }
263269 style = { { accentColor : 'var(--accent-primary)' } }
264270 />
@@ -281,7 +287,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
281287 </ div >
282288
283289 { /* Access Level for company scope */ }
284- { currentScope === 'company' && isOwner && (
290+ { currentScope === 'company' && canEditPermissions && (
285291 < div style = { { borderTop : '1px solid var(--border-subtle)' , paddingTop : '12px' } } >
286292 < label style = { { display : 'block' , fontSize : '13px' , fontWeight : 500 , marginBottom : '8px' } } >
287293 { t ( 'agent.settings.perm.defaultAccess' , 'Default Access Level' ) }
@@ -332,7 +338,7 @@ export default function OpenClawSettings({ agent, agentId }: OpenClawSettingsPro
332338 </ div >
333339
334340 { /* ── Danger Zone: Delete Agent ── */ }
335- { isOwner && (
341+ { canEditPermissions && (
336342 < div className = "card" style = { {
337343 marginBottom : '12px' ,
338344 border : '1px solid rgba(255,80,80,0.2)' ,
0 commit comments