
    *"hjX                       U d Z ddlmZ ddlmZ ddlmZ ddlmZ  ej                         dz  Z
e
dz  Ze
d	z  Z ej                         d
z  d	z  Z ej                         dz  d	z  Z ej                         dz  d	z  Z ej                         dz  dz  d	z  ZddiZdZh dZh dZdZddddddddddddd ee      ddd d!dd"ddd#dd$dddd%i d&d'd(dd)dd*dd+dd,dd-dd.dd/dd0dd1dd2dd3d4d5dd6dd7dd8d9d:d;dd'dd<dd=d>d?	ddd@d'dAdBdCdddDd'dEdF ee
dGz        ddddHdIZdJedK<   d\dLZd]dMZddNd^dOZd_dPZd`dQZdadRZdbdcdSZdddTZ dedUZ!dfdVZ"dgdWZ#dhdXZ$ G dY dZ      Z%y[)izw
User-facing configuration store for SkillClaw.

Reads/writes ~/.skillclaw/config.yaml and bridges to SkillClawConfig.
    )annotations)Path)Any   )SkillClawConfigz
.skillclawzconfig.yamlskillsz.hermesz.codexz.claudez.configopencodecodex	responseschat>   draftdirectreview>   offpollcallback   custom )providermodel_idapi_baseapi_key0u  0.0.0.0skillclaw-model)porthostr   served_model_nameopenclawTtemplate   )enableddirretrieval_modetop_k	SkillClawfallback)app_nameapp_urlroutefallback_modelsdata_policyopenai)r#   r   urlmodelr   r#   Fbackendendpointbucketaccess_key_idsecret_access_keyregionsession_token
local_rootskill_backendsession_backendnacos_servernacos_namespace_idpublicnacos_access_tokennacos_usernamenacos_passwordnacos_labellatestr   default333333?r      )	nacos_publish_modegroup_id
user_aliasauto_pull_on_startpush_min_injectionspush_min_effectivenesssession_upload_intervalskill_reload_modeskill_reload_interval_seconds)
server_urlproxy_reload_urlreplay,  <   )r#   modeidle_after_secondspoll_interval_secondsmax_jobs_per_daymax_concurrency	127.0.0.1  dashboard.db)r#   r   r   db_pathsync_on_startinclude_sharedevolve_server_url)llmproxy	claw_typeconfigure_openclawr   
openrouterprmsharingevolve
validation	dashboarddict	_DEFAULTSc                    t        |       }|j                         D ]D  \  }}||v r6t        ||   t               r#t        |t               rt        ||   |      ||<   @|||<   F |S N)rj   items
isinstance_deep_merge)baseoverrideresultkvs        1/root/.hermes/SkillClaw/skillclaw/config_store.pyrp   rp   u   sf    $ZF  1;:fQi6:a;N#F1Iq1F1IF1I	
 M    c                    t        | t              s| S | j                         dk(  ry| j                         dk(  ry	 t        |       S # t        $ r Y nw xY w	 t        |       S # t        $ r Y | S w xY w)z:Auto-coerce string values to bool/int/float where obvious.trueTfalseF)ro   strlowerint
ValueErrorfloatvalues    rv   _coercer      sz    eS!{{}{{}5z U| Ls#   
A 	AA
A" "	A/.A/rC   c               X    |D ]$  }| j                  |      }|dvst        |      c S  |S )NNr   )getr{   )mappingrC   keyskeyr   s        rv   _first_non_emptyr      s8     C 
"u: Nrw   c                     t         j                  dd      xs d      j                         j                         }|r|S  j                  d      ryt	         fddD              ryy)Nr1   r   r8   localc              3  @   K   | ]  }j                  |        y wrm   )r   ).0r   rf   s     rv   	<genexpr>z)_infer_sharing_backend.<locals>.<genexpr>   s"       	Cs   )r2   r3   r4   r5   r6   r7   s3)r{   r   stripr|   any)rf   r1   s   ` rv   _infer_sharing_backendr      sc    '++i,2399;AACG{{< 
 j  rw   c                     ~ y)NrQ    r   s    rv   _normalize_validation_moder      s    rw   c                h    t        | xs d      j                         j                         }||v r|S |S r   )r{   r   r|   )r   allowedrC   
normalizeds       rv   _normalize_choicer      s4    U[b!'')//1J#w.:;G;rw   c                d    	 t        dt        | xs d            S # t        t        f$ r |cY S w xY w)Nr   )maxr}   	TypeErrorr~   )r   rC   s     rv   _normalize_non_negative_intr      s5    1c%*1o&&z" s    //c                p    	 t        | xs d      }t        t        |      S # t        t        f$ r d}Y #w xY w)NrE   )r}   r   r~   r   "_MIN_SKILL_RELOAD_INTERVAL_SECONDS)r   intervals     rv   _normalize_reload_intervalr      s@    u{# 18<< z" s   ! 55c                    t        | xs d      j                         j                         }|dk(  rt        S |dk(  rt        S |dk(  rt
        S |dk(  rt        S t        S )zAReturn the default local skills directory for the selected agent.r   hermesr
   clauder	   )r{   r   r|   _DEFAULT_HERMES_SKILLS_DIR_DEFAULT_CODEX_SKILLS_DIR_DEFAULT_CLAUDE_SKILLS_DIR_DEFAULT_OPENCODE_SKILLS_DIR_DEFAULT_SKILLS_DIRrb   r   s     rv   default_skills_dir_for_clawr      s`    Y_"%++-335JX))W((X))Z++rw   c                    t        | xs d      j                         j                         }t        j	                  |t
              S )z<Return the default upstream API mode for the selected agent.r   )r{   r   r|   _DEFAULT_LLM_API_MODE_BY_CLAWr   _FALLBACK_LLM_API_MODEr   s     rv   default_llm_api_mode_for_clawr      s6    Y_"%++-335J(,,Z9OPPrw   c               h   t        | xs d      j                         }t        j                         }t        |xs d      j                         j	                         }|rAt        |      j                         }|dv r||k(  rt        t        |            S t        |      S t        t        |            S )a   Normalize a configured skills dir, applying agent-native defaults.

    Existing configs that still point at the old generic default are treated as
    "unset" when an agent with a native skill directory is selected so
    SkillClaw follows that agent's own skill library by default.
    r   >   r
   r   r   r	   )r{   r   r   
expanduserr|   r   r   )
skills_dirrb   rawgeneric_defaultnormalized_clawexpandeds         rv   resolve_skills_dirr      s     jB

%
%
'C)446O)/r*00288:O
9'')GGHXgLg2?CDD8}*9566rw   c                    t        | xs d      j                         }|sy|j                  dd      d   j                         }|j	                  d      ry|S )a.  Return a safe proxy-facing model name for agent integrations.

    GPT-5-style names trigger Hermes' Responses API mode. SkillClaw does not
    want to expose the upstream model name directly because the proxy surface
    may not match the upstream protocol. Use a stable proxy model name instead.
    r   r   /r   zgpt-5)r{   r   rsplitr|   
startswith)llm_model_idr   r   s      rv   _default_served_model_namer      sV     l b
!
'
'
)C C#B'--/JW% Jrw   c                  T    e Zd ZdZefddZddZddZddZddZ	ddZ
ddZdd	Zy
)ConfigStorez$Read/write ~/.skillclaw/config.yaml.c                    || _         y rm   )config_file)selfr   s     rv   __init__zConfigStore.__init__   s
    &rw   c                6    | j                   j                         S rm   )r   exists)r   s    rv   r   zConfigStore.exists   s    &&((rw   c                B   | j                   j                         st        i t              S 	 dd l}t        | j                   dd      5 }|j                  |      xs i }d d d        t        t              S # 1 sw Y   xY w# t        $ r t        i t              cY S w xY w)Nr   rutf-8encoding)r   r   rp   rk   yamlopen	safe_load	Exception)r   r   fdatas       rv   loadzConfigStore.load  s    &&(r9--	.d&&g> /!~~a(.B/y$/// /  	.r9--	.s)   B A6B 6A?;B BBc                    dd l }| j                  j                  j                  dd       t	        | j                  dd      5 }|j                  ||dd       d d d        y # 1 sw Y   y xY w)	Nr   T)parentsexist_okwr   r   F)default_flow_styleallow_unicode)r   r   parentmkdirr   dump)r   r   r   r   s       rv   savezConfigStore.save  se    %%dT%B$""C': 	MaIIdA%tIL	M 	M 	Ms   A##A,c                    | j                         }|j                  d      D ]%  }t        |t              s y |j	                  |      }' |S )N.)r   splitro   rj   r   )r   dotpathr   rt   s       rv   r   zConfigStore.get  sF    yy{s# 	AdD)88A;D	 rw   c                    | j                         }|j                  d      }|}|d d D ]  }|j                  |i       } t        |      ||d   <   | j	                  |       y )Nr   r   )r   r   
setdefaultr   r   )r   r   r   r   r   drt   s          rv   setzConfigStore.set  sa    yy{}}S!cr 	$AQ#A	$en$r(		$rw   c                d   | j                         }|j                  di       }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }t        |j                  dd	      xs d	      }t        |      }t        |j                  d
|      xs |      }	|j                  di       }
|j                  di       }|j                  di       }|j                  di       }t	        |j                  dd            }|sd}|j                  di       }|j                  di       }|j                  di       }|j                  di       }t        |      }t        |d      }t        |d      }t        |d      }t        |d      }t        |d      }t        |d      }t        |d      }t        |d      }t        |d      }|xs |}t        |j                  dd      xs d      }|s|d k(  r|d k(  r|}|j                  dd      }t        |j                  d!d      xs |      } t        |j                  d"d      xs |xs d#      }!t        |j                  dd      xs |      }"t        |j                  d$t        t                    |%      }#t        di d&|d'|d(|d)|d*|	d+|j                  d+      xs |j                  d+d,      d-|j                  d.d/      d0|j                  d1d      d2|j                  d3d4      d5|j                  d6d      d7|j                  d8d      d9|
j                  d:d;      d<|
j                  d=d>      d?t        |
j                  dd      xs d      d@t        |
d@      xs t        |      dAt	        |j                  dBd            dC|#dDt        |j                  dEd      xs d      dF|j                  dFdG      dHt        |j                  dIdJ            dKt        |j                  dKdL      xs dL      dMt	        |j                  dBd            dN|dO| dP|!dQ|"dR|j                  d      xs dSd|d|dTt	        |j                  dBdU            dV|dW|dX|dY|dZ|d[|d\|d]|d^|d_|d`|dat        |j                  dbd      xs |j                  dcd      xs dd      det        |j                  dfd      xs |j                  dgd      xs d      dht        |j                  did      xs |j                  djd      xs d      dkt        |j                  dld      xs |j                  dmd      xs d      dnt        |j                  dod      xs |j                  dpd      xs dq      drt        |j                  dsdt      t        dt      dut        |j                  dvdw      xs dw      dxt        |j                  dyd      xs d      dzt	        |j                  d{dU            d|t        |j                  d}d~            dt        |j                  dd            dt        |j                  dd      d      dt        |j                  dd      t         d      dt#        |j                  dd            dt        |j                  dd      xs d      dt        |j                  dd      xs d      dt	        |j                  dBdU            dt%        |j                  dd            dt        |j                  dd            dt        |j                  dd            dt        |j                  dd~            dt'        dt        |j                  dd                  dt	        |j                  dBdU            dt        |j                  d=d      xs d      dt        |j                  d:d      xs d      dt        |j                  dt        t(        dz              xs t        t(        dz              dt	        |j                  dd            dt	        |j                  dd            dt        |j                  dd      xs d      S )Nr`   r   r.   r   r   r   r   rb   r    api_modera   r   rd   re   rc   Tnonerf   rg   rh   ri   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   nacosr/   r0   zgpt-5.2r$   rb   llm_providerllm_api_basellm_api_keyr   llm_api_modebedrock_region	us-east-1openrouter_app_namer)   r'   openrouter_app_urlr*   openrouter_router+   r(   openrouter_fallback_modelsr,   openrouter_data_policyr-   
proxy_portr   r   
proxy_hostr   r   proxy_api_keyr   
use_skillsr#   r   skills_public_rootpublic_rootr%   r!   skill_top_kr&   r"   max_context_tokensi N  use_prmprm_providerprm_url	prm_modelprm_api_key
model_namezQwen/Qwen3-4Bsharing_enabledFsharing_backendsharing_endpointsharing_bucketsharing_access_key_idsharing_secret_access_keysharing_regionsharing_session_tokensharing_local_rootsharing_skill_backendsharing_session_backendsharing_nacos_serversharing_nacos_namespace_idr<   namespace_idr=   sharing_nacos_access_tokenr>   access_tokensharing_nacos_usernamer?   usernamesharing_nacos_passwordr@   passwordsharing_nacos_labelrA   labelrB   sharing_nacos_publish_moderF   r   sharing_group_idrG   rC   sharing_user_aliasrH   sharing_auto_pull_on_startrI   sharing_push_min_injectionsrJ   r   sharing_push_min_effectivenessrK   rD   sharing_session_upload_intervalrL   r   r   sharing_skill_reload_moderM   r   %sharing_skill_reload_interval_secondsrN   rE   r_   rO   evolve_proxy_reload_urlrP   validation_enabledvalidation_moderT   rQ   validation_idle_after_secondsrU   rR    validation_poll_interval_secondsrV   rS   validation_max_jobs_per_dayrW   validation_max_concurrencyr   rX   dashboard_enableddashboard_hostrY   dashboard_portrZ   dashboard_db_pathr\   r[   dashboard_sync_on_startr]   dashboard_include_sharedr^   dashboard_evolve_server_urlr   )r   r   r{   r   boolr   r   r   r   r   r   r}   r   _NACOS_PUBLISH_MODESr   r   _SKILL_RELOAD_MODESr   r   r   
CONFIG_DIR)$r   r   r`   r   r   r   r   raw_claw_typedefault_api_moder   ra   r   orouterre   rc   rf   rg   rh   ri   r  r  r  r  r	  r
  r  r  r  r  effective_skill_backendr;   r   r   r  r  r   s$                                       rv   to_skillclaw_configzConfigStore.to_skillclaw_config+  s	   yy{hhub!wwz84wwz2.ggi,wwz2.DHH[*=KL8G377:/?@TDTU"%(B'((<,hhub!!$((+?"FG!"M((9b)(B'XXlB/
HH["-	09+GZ@)'8< 0/ J$4W>Q$R!)'8< 0/ J-g|D 0/ J"27<M"N"7"J?7;;~r:@bA7 :?VZa?a+Lwwz84cggeR(8L9,II	J	#'')R0?K@'JJuc"567#


  d
%d
 &d
 $	d

 &d
 &d
 77#34_AQS^8_d
 !(J Dd
  '{{9b9d
 %[[*=d
 (/{{3Db'Id
 $+;;}b#Ad
 yy/d
  yy3!d
" eii	26<"=#d
& !(;<h@Z[g@h'd
, FJJy$78-d
. "/d
0  #6::mR#@#FBG1d
2 "::&6
C3d
4 FJJw235d
6  #488,@%#H#QER7d
: D12;d
< &=d
> ?d
@  Ad
B $Cd
F wwz*=oGd
J $Kd
L  2Md
P !Y!>?Qd
R ,Sd
T .Ud
V *Wd
X #8Yd
Z '@[d
\ *]d
^ #8_d
`  2ad
b #8cd
d %<ed
f ".gd
h (+0"5d^UW9Xd\d(id
n (+0"5^^UW9X^\^(od
t $'w{{3CR'H'mGKKXbdfLg'mkm#nud
v $'w{{3CR'H'mGKKXbdfLg'mkm#nwd
x !$GKKr$B$jgkkRY[]F^$jbj kyd
z (90(;$({d
D !Z!C!PyQEd
F  #7;;|R#@#FBGGd
H (,GKK8Le,T'UId
J ),GKK8Mq,Q(RKd
L ,1=UWZ1[+\Md
N -H5q9-Od
V '8/8#'Wd
` 3M;R@3ad
f "&**\2">"D"Egd
h %(

3Er(J(Pb$Qid
j  $JNN9e$DEkd
l 7z~~fh7WXmd
n +.jnn=QSV.W*Xod
p .1@WY[1\-]qd
r ),JNN;Mq,Q(Rsd
t (+1c*..ARTU2V.W'Xud
v #9==E#BCwd
x y}}V[AP[Qyd
z y}}VT:BdC{d
| "iZ.-H)IJncR\_mRmNn}d
B %))M$NCd
D &*)--8H$*O%PEd
F ),IMM:Mr,R,XVX(YGd
 d	
rw   c                p   | j                         }|j                  di       }|j                  di       }|j                  di       }|j                  di       }|j                  di       }t        |j                  dd      xs d      }t        |j                  dt        t                    |	      }d
| d|j                  dd       d|j                  dd       d|j                  d      dk7  r|j                  dd      nd g|j                  d      dk(  rd|j                  dd       gng |j                  d      dk(  rvd|j                  di       j                  dd       d|j                  di       j                  dd      xs d d |j                  di       j                  d!d      xs d" gng d#|j                  d$i       j                  d%d&       d'|j                  d(d)       d*| d+|j                  d(d,       }	|j                  d-i       }
|j                  d.i       }|
j                  d(      r.t        |
      xs d/}t        |
j                  d0d      xs d      j                         j                         }|xs |}|	d1d2| gz  }	|r|	j                  d3|        |d4k(  r|	d5|
j                  d6d       gz  }	n)|d7v r%|	d8t        |
d9d:       d;t        |
d<d=:       gz  }	|d>k(  r|
j                  d?      xs |d>k(  r|
j                  d<      nd}|	d@| dA|
j                  dB      xs |
j                  dCdD       dE|
j                  dF      xs |
j                  dGdH       dIt        |
j                  dJdK      t        dK       dLdM|
j                  dN      xs |
j                  d6      rd4ndO gz  }	|	dP|
j                  dQdR       dS|
j                  dTd       dU|
j                  dVd,       dWt        |
j                  dXdY      dY:       dZt        |
j                  d[d\      t        d\       d]t        |
j                  d^d_             gz  }	n|	j                  d`       |	da|j                  dbd      xs dc dd|j                  ded      xs dc df|j                  d(d,       dgt        |j                  dhdi             dj|j                  dkdl       dm|j                  dndo       dp|j                  d(d,       dq|j                  drds       dt|j                  d%du       dv|j                  dwt        t         dxz               dy|j                  dzd)       d{|j                  d|d      xs dc gz  }	d}j#                  |	      S )~z6Return a human-readable summary of the current config.r`   r   re   rg   ri   rb   r    r$   r   zclaw_type:       zllm.provider:    r   ?zllm.model_id:    r   zllm.api_base:    bedrockr   u   —z(n/a)zllm.bedrock_region: r   r   rd   zopenrouter.route:    r+   r(   zopenrouter.fallback: r,   r   z(none)zopenrouter.data:     r-   allowzproxy.port:      ra   r   r   zskills.enabled:  r#   Tzskills.dir:      zprm.enabled:     Frf   rh   unknownr9   zsharing.enabled: Truezsharing.backend: zsharing.skill_backend: r   zsharing.local_root: r8   >   r   osszsharing.bucket:  r3   r   zsharing.endpoint: r2   z	(default)r   r;   zsharing.nacos_server: zsharing.nacos_namespace: r<   r  r=   zsharing.nacos_label: rA   r  rB   zsharing.nacos_publish_mode: rF   r   zWsharing.nacos_lifecycle: upload -> submit; review/publish policy is controlled by Nacoszsharing.session_backend: r:   znot configuredzsharing.group:   rG   rC   zsharing.alias:   rH   zsharing.auto_pull: rI   z!sharing.session_upload_interval: rL   r   zsharing.skill_reload_mode: rM   r   zsharing.skill_reload_interval: rN   rE   zsharing.enabled: Falsezevolve.server_url: rO   z	(not set)zevolve.proxy_reload_url: rP   zvalidation.enabled: zvalidation.mode: rT   rQ   zvalidation.idle_after: rU   rR   zvalidation.poll_interval: rV   rS   zdashboard.enabled: zdashboard.host: r   rY   zdashboard.port: rZ   zdashboard.db_path: r\   r[   zdashboard.include_shared: r^   zdashboard.evolve_server_url: r_   
)r   r   r{   r   r   r   r   r|   appendr   r   r2  r   r3  r   r   r4  join)r   r   r`   r   re   rg   ri   rb   effective_skills_dirlinesrf   rh   r1   r9   r8  r;   s                   rv   describezConfigStore.describe  sv   yy{hhub!(B'hhub!(B'HH["-	j9GZH	1JJuc"567 

  	{+
C 89:
C 89:cggj>QU^>^
E :dklm	
 77:&)3 (0@+(N'OPQ
  77:&,6	 ,DHH\2,F,J,J7T^,_+`a+DHH\2,F,J,JK\^`,a,mem+no+DHH\2,F,J,J=Z\,],hah+ij #
&  " 5 9 9&% HIJ'
(  

9d ;<=)
*   456+
,  	5 9:;-
0 ((9b)XXlB/
;;y!,W5BGOR @ FBGMMOUUWM&3&>w#'#G9- E 6}oFG'!*7;;|S+I*JK  M)'(8(TW(X'YZ()9':Wb)c(de  ''1&{{>:vZaelZlw{{:?Vru,\N;/{{#78aGKKX`<abd+GKK,F,h'++V]_gJh+ij2(5I8)TVjltuvxm/{{#45uW[[Q]E^'dtvx
 
 #GKK
I$F#GH#GKKc$B#CD%gkk2F&N%OP3.w{{;TVW/Xbcdeg-$W[[1Df%MObdjkln1-gkk:Y[].^_`b
 
E LL12!&**\2">"M+!NO'

3Er(J(Yk'Z[":>>)U#C"DE ::>>&RZ;[ \]^%jnn5I3&O%PQ(8OQS)T(UV!)--	5"A!BCy}}V[ABCy}}VT:;<!)--	3zN?Z;["\!]^(7G)N(OP+IMM:Mr,R,aVa+bc
 	
 yyrw   N)r   r   )returnr1  )rF  rj   )r   rj   )r   r{   rF  r   )r   r{   r   r   )rF  r   )rF  r{   )__name__
__module____qualname____doc__CONFIG_FILEr   r   r   r   r   r   r9  rE  r   rw   rv   r   r      s4    .+6 ')
.MS
jb rw   r   N)rq   rj   rr   rj   rF  rj   )r   r   rF  r   )r   dict[str, Any]r   r{   rC   r{   rF  r{   )rf   rL  rF  r{   )r   r   rF  r{   )r   r   r   zset[str]rC   r{   rF  r{   )r   )r   r   rC   r}   rF  r}   )r   r   rF  r}   )rb   r{   rF  r   )rb   r{   rF  r{   )r   r   rb   r{   rF  r{   )r   r{   rF  r{   )&rJ  
__future__r   pathlibr   typingr   configr   homer4  rK  r   r   r   r   r   r   r   r2  r3  r   r{   rk   __annotations__rp   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   rv   <module>rS     s   #   #TYY[<'
=( 8+ &TYY[94x? %DIIK(2X= &TYY[94x? (tyy{Y6ChN [!    4 1 %& " 	 .	 &'$	   52 	B 	"	
 	 	R 	" 	 	b 	 	2 	 	h 	b 	"  	"!" 	x#$ '# "%#$#)+5: 
 !!# zN23WT	4 Tn& JL 
<
=Q7("h  h rw   