ompgui 0.7.9 → 0.7.11
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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +6 -6
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +4 -4
- package/.next/required-server-files.js +2 -2
- package/.next/required-server-files.json +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/model-roles/route.js +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair.html +1 -1
- package/.next/server/app/pair.rsc +3 -3
- package/.next/server/app/pair.segments/_full.segment.rsc +3 -3
- package/.next/server/app/pair.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/pair.segments/pair/__PAGE__.segment.rsc +3 -3
- package/.next/server/app-paths-manifest.json +6 -6
- package/.next/server/chunks/3100.js +1 -1
- package/.next/server/chunks/4008.js +1 -1
- package/.next/server/chunks/8015.js +7 -7
- package/.next/server/chunks/8501.js +1 -1
- package/.next/server/chunks/933.js +1 -1
- package/.next/server/chunks/9848.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/3274.f8f023fd73e607bc.js +2 -0
- package/.next/static/chunks/4315-fad7ccd6e548e08e.js +1 -0
- package/.next/static/chunks/4996.c5525823b73ac947.js +1 -0
- package/.next/static/chunks/{6268.294dd515c545712d.js → 6268.c8711c205efe98a6.js} +3 -3
- package/.next/static/chunks/{9668.a6deba4ff5761bbb.js → 9668.6c511d3f22a0d3ad.js} +1 -1
- package/.next/static/chunks/app/{page-305a0dd341ec102d.js → page-66dfb84af2e0fea1.js} +1 -1
- package/.next/static/chunks/{webpack-76f14942c1d852d7.js → webpack-7f93c1ded461bdcd.js} +1 -1
- package/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/package.json +1 -1
- package/.next/static/chunks/3274.52c14cafa7f8a3ef.js +0 -2
- package/.next/static/chunks/4315-8575b9eecf54f2bb.js +0 -1
- package/.next/static/chunks/4996.5e04c050b0523d42.js +0 -1
- /package/.next/static/{SAMSH7hMTmFI9vfMyiguw → RCJWKG4f3VN3XnWbJ4581}/_buildManifest.js +0 -0
- /package/.next/static/{SAMSH7hMTmFI9vfMyiguw → RCJWKG4f3VN3XnWbJ4581}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=8501,exports.ids=[8501],exports.modules={34736:(a,b,c)=>{c.d(b,{A:()=>e});let d=new Uint8Array([0,97,115,109,1,0,0,0,1,48,8,96,3,127,127,127,1,127,96,3,127,127,127,0,96,2,127,127,0,96,1,127,1,127,96,3,127,127,126,1,126,96,3,126,127,127,1,126,96,2,127,126,0,96,1,127,1,126,3,11,10,0,0,2,1,3,4,5,6,1,7,5,3,1,0,1,7,85,9,3,109,101,109,2,0,5,120,120,104,51,50,0,0,6,105,110,105,116,51,50,0,2,8,117,112,100,97,116,101,51,50,0,3,8,100,105,103,101,115,116,51,50,0,4,5,120,120,104,54,52,0,5,6,105,110,105,116,54,52,0,7,8,117,112,100,97,116,101,54,52,0,8,8,100,105,103,101,115,116,54,52,0,9,10,251,22,10,242,1,1,4,127,32,0,32,1,106,33,3,32,1,65,16,79,4,127,32,3,65,16,107,33,6,32,2,65,168,136,141,161,2,106,33,3,32,2,65,137,235,208,208,7,107,33,4,32,2,65,207,140,162,142,6,106,33,5,3,64,32,3,32,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,4,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,4,32,2,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,5,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,6,32,0,65,4,106,34,0,79,13,0,11,32,2,65,12,119,32,5,65,18,119,106,32,4,65,7,119,106,32,3,65,1,119,106,5,32,2,65,177,207,217,178,1,106,11,32,1,106,32,0,32,1,65,15,113,16,1,11,146,1,0,32,1,32,2,106,33,2,3,64,32,1,65,4,106,32,2,75,69,4,64,32,0,32,1,40,2,0,65,189,220,202,149,124,108,106,65,17,119,65,175,214,211,190,2,108,33,0,32,1,65,4,106,33,1,12,1,11,11,3,64,32,1,32,2,79,69,4,64,32,0,32,1,45,0,0,65,177,207,217,178,1,108,106,65,11,119,65,177,243,221,241,121,108,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,65,15,118,115,65,247,148,175,175,120,108,34,0,65,13,118,32,0,115,65,189,220,202,149,124,108,34,0,65,16,118,32,0,115,11,63,0,32,0,65,8,106,32,1,65,168,136,141,161,2,106,54,2,0,32,0,65,12,106,32,1,65,137,235,208,208,7,107,54,2,0,32,0,65,16,106,32,1,54,2,0,32,0,65,20,106,32,1,65,207,140,162,142,6,106,54,2,0,11,195,4,1,6,127,32,1,32,2,106,33,6,32,0,65,24,106,33,4,32,0,65,40,106,40,2,0,33,3,32,0,32,0,40,2,0,32,2,106,54,2,0,32,0,65,4,106,34,5,32,5,40,2,0,32,2,65,16,79,32,0,40,2,0,65,16,79,114,114,54,2,0,32,2,32,3,106,65,16,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,40,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,16,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,40,2,0,32,4,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,12,106,34,3,32,3,40,2,0,32,4,65,4,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,16,106,34,3,32,3,40,2,0,32,4,65,8,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,20,106,34,3,32,3,40,2,0,32,4,65,12,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,40,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,32,6,65,16,107,77,4,64,32,6,65,16,107,33,8,32,0,65,8,106,40,2,0,33,2,32,0,65,12,106,40,2,0,33,3,32,0,65,16,106,40,2,0,33,5,32,0,65,20,106,40,2,0,33,7,3,64,32,2,32,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,3,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,5,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,7,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,7,32,8,32,1,65,4,106,34,1,79,13,0,11,32,0,65,8,106,32,2,54,2,0,32,0,65,12,106,32,3,54,2,0,32,0,65,16,106,32,5,54,2,0,32,0,65,20,106,32,7,54,2,0,11,32,1,32,6,73,4,64,32,4,32,1,32,6,32,1,107,34,1,252,10,0,0,32,0,65,40,106,32,1,54,2,0,11,11,97,1,1,127,32,0,65,16,106,40,2,0,33,1,32,0,65,4,106,40,2,0,4,127,32,1,65,12,119,32,0,65,20,106,40,2,0,65,18,119,106,32,0,65,12,106,40,2,0,65,7,119,106,32,0,65,8,106,40,2,0,65,1,119,106,5,32,1,65,177,207,217,178,1,106,11,32,0,40,2,0,106,32,0,65,24,106,32,0,65,40,106,40,2,0,16,1,11,255,3,2,3,126,1,127,32,0,32,1,106,33,6,32,1,65,32,79,4,126,32,6,65,32,107,33,6,32,2,66,214,235,130,238,234,253,137,245,224,0,124,33,3,32,2,66,177,169,172,193,173,184,212,166,61,125,33,4,32,2,66,249,234,208,208,231,201,161,228,225,0,124,33,5,3,64,32,3,32,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,3,32,4,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,4,32,2,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,2,32,5,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,5,32,6,32,0,65,8,106,34,0,79,13,0,11,32,2,66,12,137,32,5,66,18,137,124,32,4,66,7,137,124,32,3,66,1,137,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,2,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,2,66,197,207,217,178,241,229,186,234,39,124,11,32,1,173,124,32,0,32,1,65,31,113,16,6,11,134,2,0,32,1,32,2,106,33,2,3,64,32,2,32,1,65,8,106,79,4,64,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,32,0,133,66,27,137,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,33,0,32,1,65,8,106,33,1,12,1,11,11,32,1,65,4,106,32,2,77,4,64,32,0,32,1,53,2,0,66,135,149,175,175,152,182,222,155,158,127,126,133,66,23,137,66,207,214,211,190,210,199,171,217,66,126,66,249,243,221,241,153,246,153,171,22,124,33,0,32,1,65,4,106,33,1,11,3,64,32,1,32,2,73,4,64,32,0,32,1,49,0,0,66,197,207,217,178,241,229,186,234,39,126,133,66,11,137,66,135,149,175,175,152,182,222,155,158,127,126,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,66,33,136,133,66,207,214,211,190,210,199,171,217,66,126,34,0,32,0,66,29,136,133,66,249,243,221,241,153,246,153,171,22,126,34,0,32,0,66,32,136,133,11,77,0,32,0,65,8,106,32,1,66,214,235,130,238,234,253,137,245,224,0,124,55,3,0,32,0,65,16,106,32,1,66,177,169,172,193,173,184,212,166,61,125,55,3,0,32,0,65,24,106,32,1,55,3,0,32,0,65,32,106,32,1,66,249,234,208,208,231,201,161,228,225,0,124,55,3,0,11,244,4,2,3,127,4,126,32,1,32,2,106,33,5,32,0,65,40,106,33,4,32,0,65,200,0,106,40,2,0,33,3,32,0,32,0,41,3,0,32,2,173,124,55,3,0,32,2,32,3,106,65,32,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,200,0,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,32,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,41,3,0,32,4,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,16,106,34,3,32,3,41,3,0,32,4,65,8,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,24,106,34,3,32,3,41,3,0,32,4,65,16,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,32,106,34,3,32,3,41,3,0,32,4,65,24,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,200,0,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,65,32,106,32,5,77,4,64,32,5,65,32,107,33,2,32,0,65,8,106,41,3,0,33,6,32,0,65,16,106,41,3,0,33,7,32,0,65,24,106,41,3,0,33,8,32,0,65,32,106,41,3,0,33,9,3,64,32,6,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,6,32,7,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,7,32,8,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,8,32,9,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,9,32,2,32,1,65,8,106,34,1,79,13,0,11,32,0,65,8,106,32,6,55,3,0,32,0,65,16,106,32,7,55,3,0,32,0,65,24,106,32,8,55,3,0,32,0,65,32,106,32,9,55,3,0,11,32,1,32,5,73,4,64,32,4,32,1,32,5,32,1,107,34,1,252,10,0,0,32,0,65,200,0,106,32,1,54,2,0,11,11,188,2,1,5,126,32,0,65,24,106,41,3,0,33,1,32,0,41,3,0,34,2,66,32,90,4,126,32,0,65,8,106,41,3,0,34,3,66,1,137,32,0,65,16,106,41,3,0,34,4,66,7,137,124,32,1,66,12,137,32,0,65,32,106,41,3,0,34,5,66,18,137,124,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,1,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,1,66,197,207,217,178,241,229,186,234,39,124,11,32,2,124,32,0,65,40,106,32,2,66,31,131,167,16,6,11]);async function e(){return function(a){let{exports:{mem:b,xxh32:c,xxh64:d,init32:e,update32:f,digest32:g,init64:h,update64:i,digest64:j}}=a,k=new Uint8Array(b.buffer);function l(a,c){if(b.buffer.byteLength<a+c){let d=Math.ceil((a+c-b.buffer.byteLength)/65536);b.grow(d),k=new Uint8Array(b.buffer)}}function m(a,b,c,d,e,f){l(a);let g=new Uint8Array(a);return k.set(g),c(0,b),g.set(k.subarray(0,a)),{update(b){let c;return k.set(g),"string"==typeof b?(l(3*b.length,a),c=q.encodeInto(b,k.subarray(a)).written):(l(b.byteLength,a),k.set(b,a),c=b.byteLength),d(0,a,c),g.set(k.subarray(0,a)),this},digest:()=>(k.set(g),f(e(0)))}}function n(a){return a>>>0}let o=2n**64n-1n;function p(a){return a&o}let q=new TextEncoder,r=0,s=0n;function t(a,b=r){return l(3*a.length,0),n(c(0,q.encodeInto(a,k).written,b))}function u(a,b=s){return l(3*a.length,0),p(d(0,q.encodeInto(a,k).written,b))}return{h32:t,h32ToString:(a,b=r)=>t(a,b).toString(16).padStart(8,"0"),h32Raw:(a,b=r)=>(l(a.byteLength,0),k.set(a),n(c(0,a.byteLength,b))),create32:(a=r)=>m(48,a,e,f,g,n),h64:u,h64ToString:(a,b=s)=>u(a,b).toString(16).padStart(16,"0"),h64Raw:(a,b=s)=>(l(a.byteLength,0),k.set(a),p(d(0,a.byteLength,b))),create64:(a=s)=>m(88,a,h,i,j,p)}}((await WebAssembly.instantiate(d)).instance)}},58112:(a,b,c)=>{c.d(b,{D:()=>f});var d=c(55511),e=c(29021);function f(a,b){let c=`${a}.tmp-${(0,d.randomUUID)()}`,f=(0,e.openSync)(c,"wx",384);try{try{(0,e.writeFileSync)(f,b,"utf8")}finally{(0,e.closeSync)(f)}(0,e.renameSync)(c,a)}finally{try{(0,e.unlinkSync)(c)}catch(a){if(!(a instanceof Error&&"code"in a&&"ENOENT"===a.code))throw a}}}},62761:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{k6:()=>q,th:()=>r});var e=c(73024),f=c(76760),g=c(58500),h=c(56219),i=c(34736),j=a([h]);h=(j.then?(await j)():j)[0];let s=BigInt("0x4f4d502d4c4f434b"),t=BigInt("0x50492d46494c454c"),u=(0,i.A)();async function k(a){let{h64:b}=await u,c=b(a,s).toString(16).padStart(16,"0"),d=b(a,t).toString(16).padStart(16,"0");return`omp-file-lock-${c}${d}`}function l(a,b){return Error(`${a} failed with native error ${b}`)}async function m(a){let b=function(){let a=[...{arm:["/lib/arm-linux-gnueabihf/libc.so.6","/usr/lib/arm-linux-gnueabihf/libc.so.6","/lib/libc.musl-armhf.so.1"],arm64:["/lib/aarch64-linux-gnu/libc.so.6","/usr/lib/aarch64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-aarch64.so.1"],ia32:["/lib/i386-linux-gnu/libc.so.6","/usr/lib/i386-linux-gnu/libc.so.6","/lib32/libc.so.6","/lib/libc.musl-i386.so.1"],loong64:["/lib/loongarch64-linux-gnu/libc.so.6","/usr/lib/loongarch64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-loongarch64.so.1"],riscv64:["/lib/riscv64-linux-gnu/libc.so.6","/usr/lib/riscv64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-riscv64.so.1"],x64:["/lib/x86_64-linux-gnu/libc.so.6","/usr/lib/x86_64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-x86_64.so.1"]}[process.arch]??[],"/lib/libc.so.6","/usr/lib/libc.so.6"].find(e.existsSync);if(!a)throw Error(`Native OMP file locks do not support Linux ${process.arch} without a trusted libc path`);return h.default.load(a)}(),c=b.func("int socket(int domain, int type, int protocol)"),d=b.func("int bind(int socket, const void *address, uint32_t address_len)"),f=b.func("int close(int fd)"),g=await k(a),i=Buffer.from(g,"utf8"),j=Buffer.alloc(3+i.length);return j.writeUInt16LE(1,0),i.copy(j,3),()=>{let a=c(1,524290,0);if(a<0)throw l("socket",h.default.errno());if(0===d(a,j,j.length))return{release(){if(0!==f(a))throw l("close",h.default.errno())}};let b=h.default.errno();if(0!==f(a))throw l("close",h.default.errno());if(b===h.default.os.errno.EADDRINUSE)return null;throw l("bind",b)}}async function n(a){let b=h.default.load("kernel32.dll"),c=b.func("void __stdcall SetLastError(uint32_t code)"),d=b.func("void * __stdcall CreateMutexW(void *attributes, int initial_owner, str16 name)"),e=b.func("uint32_t __stdcall GetLastError(void)"),f=b.func("int __stdcall CloseHandle(void *handle)"),g=`Global\\${await k(a)}`;return()=>{c(0);let a=d(null,0,g),b=e();if(null===a)throw l("CreateMutexW",b);if(183===b){if(0===f(a))throw l("CloseHandle",e());return null}return{release(){if(0===f(a))throw l("CloseHandle",e())}}}}async function o(a){if("linux"===process.platform)return m(a);if("darwin"===process.platform){let b,c,d,e;return c=(b=h.default.load("/usr/lib/libSystem.B.dylib")).func("int open(const char *path, int flags, ...)"),d=b.func("int flock(int fd, int operation)"),e=b.func("int close(int fd)"),()=>{let b=c(a,0x1000202,"uint",384);if(b<0)throw l("open",h.default.errno());if(0===d(b,6))return{release(){if(0!==e(b))throw l("close",h.default.errno())}};let f=h.default.errno();if(0!==e(b))throw l("close",h.default.errno());if(f===h.default.os.errno.EWOULDBLOCK||f===h.default.os.errno.EAGAIN)return null;throw l("flock",f)}}if("win32"===process.platform)return n(a);throw Error(`Native OMP file locks do not support ${process.platform}`)}async function p(a,b,c){let d=`${f.resolve(a)}.lock`,e=await o(d);for(let a=0;a<c.attempts;a+=1){let d=e();if(d)try{return await b()}finally{d.release()}a+1<c.attempts&&await c.sleep(c.retryDelayMs)}throw Error(`Failed to acquire lock for ${a} after ${c.attempts} attempts`)}function q(a){let b,c=f.resolve(a);try{b=(0,e.lstatSync)(c).isSymbolicLink()}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code)return c;throw a}return b?(0,e.realpathSync)(c):c}function r(a,b){return p(a,b,{attempts:50,retryDelayMs:100,sleep:g.setTimeout})}d()}catch(a){d(a)}})},80547:(a,b,c)=>{c.d(b,{B7:()=>i,Nw:()=>d.Nw,mc:()=>h,uK:()=>g.uK,wz:()=>d.wz});var d=c(25252),e=c(82536),f=c(78573),g=c(58864);async function h(){let a=Date.now(),b=globalThis.__piAllowedRootsCache;if(b&&b.expiresAt>a)return b.roots;let c=await (0,f.dQ)(),e=new Set;for(let a of c)a.cwd&&e.add((0,d.Nw)(a.cwd)),a.projectRoot&&e.add((0,d.Nw)(a.projectRoot));for(let a of(0,d.HM)())e.add(a);return globalThis.__piAllowedRootsCache={roots:e,expiresAt:a+5e3},e}function i(a,b){return(0,e.xk)(a,b)}},88016:(a,b,c)=>{c.d(b,{K:()=>d});let d=[{path:"defaultThinkingLevel",category:"models",group:"Thinking",label:{en:"Thinking Level",ko:"사고 수준"},description:{en:"Reasoning depth for thinking-capable models",ko:"사고 지원 모델의 추론 깊이"},kind:"enum",scope:"both",defaultValue:"high",choices:["minimal","low","medium","high","xhigh","max","auto"]},{path:"externalThinking",category:"models",group:"Thinking",label:{en:"External Thinking",ko:"외부 사고"},description:{en:"Private scratchpad; not shown to user. Disables supported GPT, Claude, and Gemini reasoning",ko:"사용자에게 표시되지 않는 비공개 메모장입니다. 지원되는 GPT, Claude, Gemini 추론을 비활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"model.loopGuard.checkAssistantContent",category:"models",group:"Thinking",label:{en:"Loop Guard Scan Prose",ko:"루프 가드 본문 검사"},description:{en:"Apply loop guard to assistant prose messages in addition to thinking logs",ko:"사고 로그뿐 아니라 어시스턴트 본문 메시지에도 루프 가드를 적용합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when model.loopGuard.enabled is on.",ko:"model.loopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"model.loopGuard.enabled",category:"models",group:"Thinking",label:{en:"Loop Guard",ko:"루프 가드"},description:{en:"Enable automatic stream loop detection for model reasoning and prose",ko:"모델의 추론 및 본문에서 스트림 루프를 자동 감지합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"model.loopGuard.toolCallReminder",category:"models",group:"Thinking",label:{en:"Loop Guard Tool-Call Reminder",ko:"루프 가드 도구 호출 알림"},description:{en:"When a Gemini reasoning stream emits many consecutive planning headers without calling a tool, interrupt it and inject a reminder to issue a tool call (requires Loop Guard)",ko:"Gemini 추론 스트림이 도구 호출 없이 연속된 계획 헤더를 많이 생성하면 중단하고 도구 호출 알림을 삽입합니다(Loop Guard 필요)."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when model.loopGuard.enabled is on.",ko:"model.loopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"model.toolCallLoopGuard.enabled",category:"models",group:"Thinking",label:{en:"Tool-Call Loop Guard",ko:"도구 호출 루프 가드"},description:{en:"Detect consecutive identical tool calls across turns and inject a corrective steer",ko:"턴 간에 연속으로 동일한 도구가 호출되면 감지하여 수정 지시를 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"model.toolCallLoopGuard.exemptTools",category:"models",group:"Thinking",label:{en:"Tool-Call Loop Exempt Tools",ko:"도구 호출 루프 제외 도구"},description:{en:"Tool names that may repeat consecutively without triggering the cross-turn loop guard",ko:"턴 간 루프 가드를 트리거하지 않고 연속으로 반복할 수 있는 도구 이름입니다."},kind:"array",scope:"both",defaultValue:["hub"],items:"string",appliesTo:{en:"Applies when model.toolCallLoopGuard.enabled is on.",ko:"model.toolCallLoopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"model.toolCallLoopGuard.threshold",category:"models",group:"Thinking",label:{en:"Tool-Call Loop Threshold",ko:"도구 호출 루프 임계값"},description:{en:"Consecutive identical tool calls required before the corrective steer is injected",ko:"수정 지시를 삽입하기 전까지 허용할 연속된 동일 도구 호출 횟수입니다."},kind:"number",scope:"both",defaultValue:5,integer:!0,appliesTo:{en:"Applies when model.toolCallLoopGuard.enabled is on.",ko:"model.toolCallLoopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"omitThinking",category:"models",group:"Thinking",label:{en:"Omit Thinking summaries",ko:"사고 요약 생략"},description:{en:"Instruct upstream providers to completely omit thinking summaries from responses (where supported)",ko:"지원되는 경우 업스트림 제공자가 응답에서 사고 요약을 완전히 생략하도록 지시합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"providers.autoThinkingMaxEffort",category:"models",group:"Thinking",label:{en:"Auto Thinking Ceiling",ko:"자동 사고 상한"},description:{en:"Highest effort the `auto` classifier may resolve. `xhigh` keeps the classifier one tier below the top, so only an explicit `ultrathink` reaches `max`; `max` lets a turn the classifier judges exceptional bill the top tier on models that expose it.",ko:"`auto` 분류기가 선택할 수 있는 최대 노력 수준입니다. `xhigh`는 분류기를 최상위보다 한 단계 아래로 제한하므로 명시적인 `ultrathink`만 `max`에 도달합니다. `max`는 분류기가 예외적이라고 판단한 턴에 해당 단계를 지원하는 모델의 최상위 요금을 적용할 수 있게 합니다."},kind:"enum",scope:"both",defaultValue:"xhigh",choices:["xhigh","max"],appliesTo:{en:"Applies when defaultThinkingLevel is auto.",ko:"defaultThinkingLevel이 auto인 경우 적용됩니다."}},{path:"disabledProviders",category:"models",group:"Disabled Providers",label:{en:"Disabled Providers",ko:"비활성화된 제공자"},description:{en:"Providers that are disabled.",ko:"비활성화된 제공자 목록입니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"enabledProviders",category:"models",group:"Enabled Providers",label:{en:"Enabled Providers",ko:"활성화된 제공자"},description:{en:"Providers that are enabled.",ko:"활성화된 제공자 목록입니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"enabledModels",category:"models",group:"Enabled Models",label:{en:"Enabled Models",ko:"활성화된 모델"},description:{en:"Models that are enabled.",ko:"활성화된 모델 목록입니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"extendedContext",category:"models",group:"General",label:{en:"Extended Context",ko:"확장 컨텍스트"},description:{en:"Use larger context windows where supported; may incur premium pricing. Off keeps default or standard-pricing windows",ko:"지원되는 경우 더 큰 컨텍스트 창을 사용합니다. 프리미엄 요금이 부과될 수 있습니다. 끄면 기본 또는 표준 요금 컨텍스트 창을 유지합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"images.autoResize",category:"models",group:"Images",label:{en:"Auto-Resize Images",ko:"이미지 자동 크기 조정"},description:{en:"Resize large images to 2000x2000 max for better model compatibility",ko:"모델 호환성을 높이기 위해 큰 이미지의 최대 크기를 2000x2000으로 조정합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"images.blockImages",category:"models",group:"Images",label:{en:"Block Images",ko:"이미지 차단"},description:{en:"Prevent images from being sent to LLM providers",ko:"이미지가 LLM 제공자에게 전송되지 않도록 합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"images.urls.credentials",category:"models",group:"Images",label:{en:"Credentials",ko:"자격 증명"},description:{en:"Write-only map from image URL backend ids to backend credential name/value objects.",ko:"이미지 URL 백엔드 ID를 해당 백엔드의 자격 증명 이름/값 객체에 매핑하는 쓰기 전용 설정입니다."},kind:"object",scope:"global",recordValues:"json",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.urls.options",category:"models",group:"Images",label:{en:"Options",ko:"옵션"},description:{en:"Maps each image URL backend id to that backend's structured option object.",ko:"각 이미지 URL 백엔드 ID를 해당 백엔드의 구조화된 옵션 객체에 매핑합니다."},kind:"object",scope:"global",defaultValue:{},recordValues:"json",admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.describeForTextModels",category:"models",group:"Vision",label:{en:"Describe Images for Text Models",ko:"텍스트 모델용 이미지 설명"},description:{en:"When an image is attached to a model without vision support, save it under local:// and inject a description from a vision-capable model instead of dropping it",ko:"비전 미지원 모델에 이미지가 첨부되면 이미지를 삭제하는 대신 local:// 아래에 저장하고 비전 지원 모델이 생성한 설명을 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"images.urls.backends",category:"models",group:"Vision",label:{en:"Image URL Backends",ko:"이미지 URL 백엔드"},description:{en:"Ordered destinations tried when publishing images for provider access",ko:"제공자 접근을 위해 이미지를 게시할 때 순서대로 시도할 대상입니다."},kind:"array",scope:"global",defaultValue:["provider-files","tailscale","cloudflared","litterbox"],choices:["imgur","imageshack","flickr","chevereto","vgyme","dropbox","ftp","onedrive","google-drive","puush","box","amazon-s3","google-cloud-storage","azure-storage","backblaze-b2","owncloud","mediafire","sendspace","localhostr","lambda","pomf","uguu","seafile","s-ul","lobfile","transfer-sh","plik","shared-folder","catbox","litterbox","0x0","tmpfiles","discord","provider-files","direct","cloudflared","ngrok","tailscale","ssh","command","localhost-run","pinggy","devtunnel","zrok","bore","named-cloudflared","r2","tigris","minio","garage"],items:"string",admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.urls.bindHost",category:"models",group:"Vision",label:{en:"Image URL Bind Host",ko:"이미지 URL 바인드 호스트"},description:{en:"Host the blob server binds to; loopback for tunnels, 0.0.0.0 for direct serving",ko:"블롭 서버가 바인딩할 호스트입니다. 터널에는 loopback, 직접 제공에는 0.0.0.0을 사용합니다."},kind:"string",scope:"global",defaultValue:"127.0.0.1",admin:!0,confirmation:!0,appliesTo:{en:"Applies to locally hosted direct and tunnel image URL backends.",ko:"로컬에서 호스팅되는 direct 및 터널 이미지 URL 백엔드에 적용됩니다."}},{path:"images.urls.command",category:"models",group:"Vision",label:{en:"Image Upload Command",ko:"이미지 업로드 명령"},description:{en:"Argv template for the command backend; {file} is the image path, {mime}/{ext} optional. The last URL printed on stdout is used (e.g. pasta -b -f {file})",ko:"명령 백엔드용 Argv 템플릿입니다. {file}은 이미지 경로이며 {mime}/{ext}는 선택 사항입니다. stdout에 출력된 마지막 URL을 사용합니다(예: pasta -b -f {file})."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when the command image URL backend is selected.",ko:"command 이미지 URL 백엔드를 선택한 경우 적용됩니다."}},{path:"images.urls.enabled",category:"models",group:"Vision",label:{en:"Serve Images as URLs",ko:"이미지를 URL로 제공"},description:{en:"Publish outgoing images through the configured backend chain and send URL-fetching providers short URLs instead of inline base64. Falls back to inline automatically when every backend or a provider fetch fails",ko:"설정된 백엔드 체인을 통해 발신 이미지를 게시하고, URL을 가져올 수 있는 제공자에게 inline base64 대신 짧은 URL을 전송합니다. 모든 백엔드 또는 제공자의 가져오기가 실패하면 자동으로 inline 방식으로 대체합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"images.urls.publicBaseUrl",category:"models",group:"Vision",label:{en:"Image URL Public Base",ko:"이미지 URL 공개 베이스"},description:{en:"Externally reachable base URL fronting the blob server (required for ssh, optional for direct)",ko:"블롭 서버 앞단에서 외부 접근이 가능한 베이스 URL입니다(ssh에는 필수, 직접 제공에는 선택 사항)."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Required by the ssh backend and optional for the direct backend.",ko:"ssh 백엔드에는 필수이며 direct 백엔드에는 선택 사항입니다."}},{path:"images.urls.sshRemotePort",category:"models",group:"Vision",label:{en:"Image URL SSH Remote Port",ko:"이미지 URL SSH 원격 포트"},description:{en:"Remote listen port of the ssh reverse forward that your web server proxies to",ko:"웹 서버가 프록시하는 ssh 역방향 포워딩의 원격 수신 포트입니다."},kind:"number",scope:"global",defaultValue:8787,integer:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when the ssh image URL backend is selected.",ko:"ssh 이미지 URL 백엔드를 선택한 경우 적용됩니다."}},{path:"images.urls.sshTarget",category:"models",group:"Vision",label:{en:"Image URL SSH Target",ko:"이미지 URL SSH 대상"},description:{en:"user@host destination for the ssh reverse forward",ko:"ssh 역방향 포워딩의 user@host 대상입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when the ssh image URL backend is selected.",ko:"ssh 이미지 URL 백엔드를 선택한 경우 적용됩니다."}},{path:"images.urls.ttlHours",category:"models",group:"Vision",label:{en:"Image URL Lifetime (hours)",ko:"이미지 URL 수명(hours)"},description:{en:"Serving window for locally hosted image URLs, measured from the last time a conversation sent them; resuming a conversation re-arms the window at the same link. 0 keeps links alive while the broker runs",ko:"로컬 호스팅 이미지 URL의 제공 기간으로, 대화에서 마지막으로 전송한 시점부터 측정합니다. 대화를 재개하면 같은 링크의 제공 기간이 다시 시작됩니다. 0이면 브로커가 실행되는 동안 링크를 유지합니다."},kind:"number",scope:"both",defaultValue:72,admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.questionTimeoutMs",category:"models",group:"Execution",label:{en:"Image Question Timeout",ko:"이미지 질문 제한 시간"},description:{en:"Per-request timeout for the vision-model call behind read's ?q= image questions, in milliseconds. A stalled provider fails fast with a timeout error instead of blocking until manual abort. Set to 0 to disable the timeout.",ko:"read의 ?q= 이미지 질문에 사용되는 비전 모델 호출의 요청별 제한 시간(ms)입니다. 제공자가 응답하지 않으면 수동 중단까지 차단하는 대신 제한 시간 오류로 빠르게 실패합니다. 제한 시간을 비활성화하려면 0으로 설정하세요."},kind:"number",scope:"both",defaultValue:3e5,integer:!0},{path:"includeModelInPrompt",category:"models",group:"Prompt",label:{en:"Include Model in Prompt",ko:"프롬프트에 모델 포함"},description:{en:"Surface the active model identifier in the system prompt so the agent knows which model it is",ko:"에이전트가 사용 중인 모델을 알 수 있도록 활성 모델 식별자를 시스템 프롬프트에 표시합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"inlineToolDescriptors",category:"models",group:"Prompt",label:{en:"Inline Tool Descriptors",ko:"인라인 도구 설명자"},description:{en:"Render full tool descriptors in the system prompt and strip top-level/nested descriptions from provider tool schemas so descriptor text is sent once. Auto enables this for Gemini models and disables it otherwise",ko:"전체 도구 설명자를 시스템 프롬프트에 렌더링하고 제공자 도구 스키마의 최상위 및 중첩 설명을 제거하여 설명자 텍스트가 한 번만 전송되게 합니다. Gemini 모델에는 자동으로 활성화되고 그 외 모델에는 비활성화됩니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","on","off"]},{path:"modelRoleStorage",category:"models",group:"Prompt",label:{en:"Model Role Storage",ko:"모델 역할 저장 위치"},description:{en:"Where model selector role assignments are saved",ko:"모델 선택기의 역할 할당을 저장할 위치입니다."},kind:"enum",scope:"both",defaultValue:"global",choices:["global","project"]},{path:"minP",category:"models",group:"Sampling",label:{en:"Min P",ko:"최소 P"},description:{en:"Minimum probability threshold (0-1, -1 = provider default)",ko:"최소 확률 임계값(0-1, -1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1,min:-1,max:1,step:.01},{path:"presencePenalty",category:"models",group:"Sampling",label:{en:"Presence Penalty",ko:"존재 페널티"},description:{en:"Penalty for introducing already-present tokens (-1 = provider default)",ko:"이미 존재하는 토큰을 도입할 때 적용하는 페널티입니다(-1 = 제공자 기본값)."},kind:"number",scope:"both",defaultValue:-1,integer:!1},{path:"repetitionPenalty",category:"models",group:"Sampling",label:{en:"Repetition Penalty",ko:"반복 페널티"},description:{en:"Penalty for repeated tokens (-1 = provider default)",ko:"반복 토큰에 적용할 페널티(-1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1},{path:"temperature",category:"models",group:"Sampling",label:{en:"Temperature",ko:"온도"},description:{en:"Sampling temperature (0 = deterministic, 1 = creative, -1 = provider default)",ko:"샘플링 온도(0 = 결정적, 1 = 창의적, -1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1},{path:"textVerbosity",category:"models",group:"Sampling",label:{en:"Text Verbosity",ko:"텍스트 상세도"},description:{en:"OpenAI Responses and Codex response verbosity (low, medium, or high)",ko:"OpenAI Responses 및 Codex 응답 상세도(low, medium 또는 high)"},kind:"enum",scope:"both",defaultValue:"medium",choices:["low","medium","high"]},{path:"tier.advisor",category:"models",group:"Sampling",label:{en:"Service Tier \xe2\x80\x94 Advisor",ko:"서비스 티어 — Advisor"},description:{en:"Service Tier for the advisor model. None = standard processing; Inherit = match the main agent's live per-family tiers; pick a value to apply it to the advisor model's family.",ko:"advisor 모델의 Service Tier입니다. None = 표준 처리, Inherit = 기본 에이전트의 실시간 제품군별 티어와 일치. 값을 선택하면 advisor 모델의 제품군에 적용됩니다."},kind:"enum",scope:"both",defaultValue:"none",choices:["inherit","none","auto","default","flex","scale","priority"],appliesTo:{en:"Applies to advisor provider models.",ko:"advisor 제공자 모델에 적용됩니다."}},{path:"tier.anthropic",category:"models",group:"Sampling",label:{en:"Service Tier \xe2\x80\x94 Anthropic",ko:"서비스 티어 — Anthropic"},description:{en:'Processing tier for Claude requests. `priority` realizes fast mode (`speed: "fast"`) on supported direct Anthropic models; ignored on Bedrock/Vertex Claude and via OpenRouter.',ko:'Claude 요청의 처리 티어입니다. `priority`는 지원되는 Anthropic 직접 연결 모델에서 빠른 모드(`speed: "fast"`)를 사용합니다. Bedrock/Vertex Claude 및 OpenRouter를 통한 요청에서는 무시됩니다.'},kind:"enum",scope:"both",defaultValue:"none",choices:["none","priority"],appliesTo:{en:"Applies to anthropic provider models.",ko:"anthropic 제공자 모델에 적용됩니다."}},{path:"tier.google",category:"models",group:"Sampling",label:{en:"Service Tier \xe2\x80\x94 Google",ko:"서비스 티어 — Google"},description:{en:"Processing tier for Gemini (Google AI Studio + Vertex) requests, and Google-family models routed via OpenRouter (none = omit). Sent as the top-level `serviceTier` field.",ko:"Gemini(Google AI Studio + Vertex) 요청 및 OpenRouter를 통해 라우팅되는 Google 제품군 모델의 처리 티어입니다(none = 생략). 최상위 `serviceTier` 필드로 전송됩니다."},kind:"enum",scope:"both",defaultValue:"none",choices:["none","flex","priority"],appliesTo:{en:"Applies to google provider models.",ko:"google 제공자 모델에 적용됩니다."}},{path:"tier.openai",category:"models",group:"Sampling",label:{en:"Service Tier \xe2\x80\x94 OpenAI",ko:"서비스 티어 — OpenAI"},description:{en:"Processing tier for OpenAI / OpenAI-Codex requests, and OpenAI-family models routed via OpenRouter (none = omit). Sent as `service_tier`.",ko:"OpenAI / OpenAI-Codex 요청 및 OpenRouter를 통해 라우팅되는 OpenAI 제품군 모델의 처리 티어입니다(none = 생략). `service_tier`로 전송됩니다."},kind:"enum",scope:"both",defaultValue:"none",choices:["none","auto","default","flex","scale","priority"],appliesTo:{en:"Applies to openai provider models.",ko:"openai 제공자 모델에 적용됩니다."}},{path:"tier.subagent",category:"models",group:"Sampling",label:{en:"Service Tier \xe2\x80\x94 Subagent",ko:"서비스 티어 — 서브에이전트"},description:{en:"Service Tier for spawned task/eval subagents. Inherit = match the main agent's live per-family tiers (tracks /fast); pick a value to apply it to whichever family the subagent's model belongs to.",ko:"생성된 task/eval 서브에이전트의 Service Tier입니다. Inherit = 기본 에이전트의 실시간 제품군별 티어와 일치(/fast 추적). 값을 선택하면 서브에이전트 모델이 속한 제품군에 적용됩니다."},kind:"enum",scope:"both",defaultValue:"inherit",choices:["inherit","none","auto","default","flex","scale","priority"],appliesTo:{en:"Applies to subagent provider models.",ko:"subagent 제공자 모델에 적용됩니다."}},{path:"topK",category:"models",group:"Sampling",label:{en:"Top K",ko:"Top K"},description:{en:"Sample from top-K tokens (-1 = provider default)",ko:"상위 K개 토큰에서 샘플링(-1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!0},{path:"topP",category:"models",group:"Sampling",label:{en:"Top P",ko:"Top P"},description:{en:"Nucleus sampling cutoff (0-1, -1 = provider default)",ko:"핵 샘플링 임계값(0-1, -1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1,min:-1,max:1,step:.01},{path:"modelProviderOrder",category:"models",group:"Model Provider Order",label:{en:"Model Provider Order",ko:"모델 제공자 순서"},description:{en:"Sets the ordered list of model providers.",ko:"모델 제공자의 순서 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"modelRoles",category:"models",group:"Model Roles",label:{en:"Model Roles",ko:"모델 역할"},description:{en:"Maps each model role name to a model selector.",ko:"각 모델 역할 이름을 모델 선택자에 매핑합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"model-role"},{path:"modelTags",category:"models",group:"Model Tags",label:{en:"Model Tags",ko:"모델 태그"},description:{en:"Maps each tag id to an object with a required name and optional color and hidden flag.",ko:"각 태그 ID를 필수 name과 선택적 color 및 hidden 플래그가 있는 객체에 매핑합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"json"},{path:"providers.fetch",category:"models",group:"Services",label:{en:"Fetch Provider",ko:"Fetch 제공자"},description:{en:"Reader backend priority for the fetch/read URL tool",ko:"fetch/read URL 도구의 리더 백엔드 우선순위입니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","native","trafilatura","lynx","parallel","firecrawl","jina"],appliesTo:{en:"Applies to URL reads performed by the fetch/read tool.",ko:"fetch/read 도구가 수행하는 URL 읽기에 적용됩니다."}},{path:"providers.imageOrder",category:"models",group:"Services",label:{en:"Image Provider Order",ko:"이미지 제공자 순서"},description:{en:"Prioritized providers for image generation; unlisted providers follow the active session provider and the built-in order",ko:"이미지 생성 제공자의 우선순위입니다. 목록에 없는 제공자는 활성 세션 제공자와 기본 제공 순서를 따릅니다."},kind:"array",scope:"both",defaultValue:[],items:"string",appliesTo:{en:"Applies to image generation provider fallback order.",ko:"이미지 생성 제공자의 대체 순서에 적용됩니다."},choices:["openai","openai-codex","antigravity","xai","gemini","openrouter","deepinfra"]},{path:"providers.maxInFlightRequests",category:"models",group:"Services",label:{en:"Max In-Flight Requests",ko:"최대 동시 처리 요청 수"},description:{en:'Maximum concurrent LLM requests per provider id (for example "openai" or "anthropic"), shared across local OMP processes with this config root. Omitted providers are unlimited.',ko:'제공자 id별 최대 동시 LLM 요청 수입니다(예: "openai" 또는 "anthropic"). 이 구성 루트를 사용하는 로컬 OMP 프로세스 간에 공유됩니다. 생략된 제공자는 무제한입니다.'},kind:"object",scope:"both",defaultValue:{},recordValues:"json",appliesTo:{en:"Applies to the matching model provider or provider feature.",ko:"해당 모델 제공자 또는 제공자 기능에 적용됩니다."}},{path:"providers.webSearchExclude",category:"models",group:"Services",label:{en:"Excluded Web Search Providers",ko:"제외할 웹 검색 제공자"},description:{en:"Providers that web_search should never use, even as fallbacks",ko:"대체 제공자로도 web_search에서 사용하지 않을 제공자입니다."},kind:"array",scope:"both",defaultValue:[],items:"string",appliesTo:{en:"Applies to web search provider selection.",ko:"웹 검색 제공자 선택에 적용됩니다."},choices:["perplexity","gemini","anthropic","codex","xai","zai","exa","tinyfish","jina","kagi","tavily","firecrawl","brave","kimi","parallel","synthetic","searxng","startpage","duckduckgo","ecosia","google","mojeek","public"]},{path:"providers.webSearchOrder",category:"models",group:"Services",label:{en:"Web Search Provider Order",ko:"웹 검색 제공자 순서"},description:{en:"Prioritized providers for the web_search tool; unlisted providers retain their default order afterward",ko:"web_search 도구의 제공자 우선순위입니다. 목록에 없는 제공자는 이후에도 기본 순서를 유지합니다."},kind:"array",scope:"both",defaultValue:[],items:"string",appliesTo:{en:"Applies to web search provider fallback order.",ko:"웹 검색 제공자의 대체 순서에 적용됩니다."},choices:["perplexity","gemini","anthropic","codex","xai","zai","exa","tinyfish","jina","kagi","tavily","firecrawl","brave","kimi","parallel","synthetic","searxng","startpage","duckduckgo","ecosia","google","mojeek","public"]},{path:"providers.webSearchTimeoutSeconds",category:"models",group:"Services",label:{en:"Web Search Timeout",ko:"웹 검색 시간 초과"},description:{en:"Hard timeout for each provider's search transport before web_search advances to the next fallback, in seconds (maximum 300)",ko:"web_search가 다음 대체 제공자로 넘어가기 전까지 각 제공자의 검색 전송에 적용할 강제 시간 제한(초)입니다(최대 300)."},kind:"number",scope:"both",defaultValue:60,max:300,appliesTo:{en:"Applies to each web search provider attempt.",ko:"각 웹 검색 제공자 시도에 적용됩니다."}},{path:"providers.streamFirstEventTimeoutSeconds",category:"models",group:"Timeouts",label:{en:"Stream First Event Timeout",ko:"스트림 첫 이벤트 시간 초과"},description:{en:"Seconds to wait for the first model stream event; -1 uses provider/env defaults, 0 disables the watchdog",ko:"첫 모델 스트림 이벤트를 기다릴 시간(초)입니다. -1은 제공자/env 기본값을 사용하고, 0은 감시 기능을 비활성화합니다."},kind:"number",scope:"both",defaultValue:-1,appliesTo:{en:"Applies to the matching model provider or provider feature.",ko:"해당 모델 제공자 또는 제공자 기능에 적용됩니다."}},{path:"providers.streamIdleTimeoutSeconds",category:"models",group:"Timeouts",label:{en:"Stream Idle Timeout",ko:"스트림 유휴 시간 초과"},description:{en:"Seconds a model stream may stay silent between events; -1 uses provider/env defaults, 0 disables the watchdog",ko:"모델 스트림이 이벤트 사이에 응답 없이 유지될 수 있는 시간(초)입니다. -1은 제공자/env 기본값을 사용하고, 0은 감시 기능을 비활성화합니다."},kind:"number",scope:"both",defaultValue:-1,appliesTo:{en:"Applies to the matching model provider or provider feature.",ko:"해당 모델 제공자 또는 제공자 기능에 적용됩니다."}},{path:"thinkingBudgets.high",category:"models",group:"Thinking Budgets",label:{en:"High",ko:"높음"},description:{en:"Token budget for the high thinking level.",ko:"high 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:16384,integer:!0},{path:"thinkingBudgets.low",category:"models",group:"Thinking Budgets",label:{en:"Low",ko:"낮음"},description:{en:"Token budget for the low thinking level.",ko:"low 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:2048,integer:!0},{path:"thinkingBudgets.max",category:"models",group:"Thinking Budgets",label:{en:"Max",ko:"최대"},description:{en:"Token budget for the maximum thinking level.",ko:"maximum 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:32768,integer:!0},{path:"thinkingBudgets.medium",category:"models",group:"Thinking Budgets",label:{en:"Medium",ko:"중간"},description:{en:"Token budget for the medium thinking level.",ko:"medium 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:8192,integer:!0},{path:"thinkingBudgets.minimal",category:"models",group:"Thinking Budgets",label:{en:"Minimal",ko:"최소"},description:{en:"Token budget for the minimal thinking level.",ko:"minimal 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:1024,integer:!0},{path:"thinkingBudgets.xhigh",category:"models",group:"Thinking Budgets",label:{en:"Xhigh",ko:"매우 높음"},description:{en:"Token budget for the xhigh thinking level.",ko:"xhigh 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:32768,integer:!0},{path:"autolearn.autoContinue",category:"intelligence",group:"Auto-Learn",label:{en:"Auto-run capture at stop",ko:"중지 시 캡처 자동 실행"},description:{en:"When on, auto-run one private capture turn at stop (uses extra tokens). When off, only standing auto-learn guidance remains.",ko:"켜면 중지 시 비공개 캡처 턴을 한 번 자동 실행합니다(추가 토큰 사용). 끄면 상시 자동 학습 지침만 유지됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"autolearn.enabled",category:"intelligence",group:"Auto-Learn",label:{en:"Auto-Learn (experimental)",ko:"자동 학습(실험적)"},description:{en:"After the agent stops, nudge it to capture lessons to memory and create/enhance isolated managed skills",ko:"에이전트가 중지된 후 학습 내용을 메모리에 기록하고 격리된 관리형 스킬을 생성하거나 개선하도록 유도합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"autolearn.minToolCalls",category:"intelligence",group:"Autolearn",label:{en:"Min Tool Calls",ko:"최소 도구 호출 수"},description:{en:"Minimum number of tool calls for automatic learning.",ko:"자동 학습을 위한 최소 도구 호출 횟수입니다."},kind:"number",scope:"both",defaultValue:5,integer:!0},{path:"compaction.asyncEnabled",category:"intelligence",group:"Compaction",label:{en:"Async Compaction",ko:"비동기 압축"},description:{en:"Speculatively summarize in the background as context nears the compaction threshold, then splice the ready result in when the threshold is crossed",ko:"컨텍스트가 압축 임곗값에 가까워지면 백그라운드에서 미리 요약하고, 임곗값을 넘을 때 준비된 결과를 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.autoContinue",category:"intelligence",group:"Compaction",label:{en:"Auto Continue",ko:"자동 계속"},description:{en:"Whether to continue automatically after compaction.",ko:"압축 후 자동으로 계속할지 여부입니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.dropUseless",category:"intelligence",group:"Compaction",label:{en:"Elide Uneventful Results",ko:"무의미한 결과 생략"},description:{en:"Prune tool results flagged contextually useless (no matches, timed-out waits) once consumed (cache-aware)",ko:"컨텍스트상 불필요하다고 표시된 도구 결과(일치 항목 없음, 대기 시간 초과)를 사용 후 제거합니다(캐시 인식)."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.enabled",category:"intelligence",group:"Compaction",label:{en:"Auto-Compact",ko:"자동 압축"},description:{en:"Automatically compact context when it gets too large",ko:"컨텍스트가 너무 커지면 자동으로 압축합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"compaction.experimentalContextManagement",category:"intelligence",group:"Compaction",label:{en:"Notes-backed context windows (experimental)",ko:"메모 기반 컨텍스트 창(실험적)"},description:{en:"Keep persistent notes and searchable raw history across context windows. Restart to update available tools.",ko:"컨텍스트 창이 바뀌어도 영구 메모와 검색 가능한 원시 기록을 유지합니다. 사용 가능한 도구를 업데이트하려면 다시 시작하세요."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.handoffSaveToDisk",category:"intelligence",group:"Compaction",label:{en:"Save Handoff Docs",ko:"인계 문서 저장"},description:{en:"Save generated handoff documents to markdown files for the auto-handoff flow",ko:"자동 인계 흐름에서 생성된 인계 문서를 Markdown 파일로 저장합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.idleEnabled",category:"intelligence",group:"Compaction",label:{en:"Idle Compaction",ko:"유휴 압축"},description:{en:"Compact context while idle when token count exceeds threshold",ko:"토큰 수가 임곗값을 초과하면 유휴 상태에서 컨텍스트를 압축합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.idleThresholdTokens",category:"intelligence",group:"Compaction",label:{en:"Idle Compaction Threshold",ko:"유휴 압축 임곗값"},description:{en:"Token count above which idle compaction triggers",ko:"유휴 압축을 시작할 토큰 수 임곗값입니다."},kind:"number",scope:"both",defaultValue:2e5,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.idleTimeoutSeconds",category:"intelligence",group:"Compaction",label:{en:"Idle Compaction Delay",ko:"유휴 압축 지연 시간"},description:{en:"Seconds to wait while idle before compacting",ko:"압축 전 유휴 상태로 대기할 시간(초)입니다."},kind:"number",scope:"both",defaultValue:300,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.keepRecentTokens",category:"intelligence",group:"Compaction",label:{en:"Keep Recent Tokens",ko:"최근 토큰 유지"},description:{en:"Number of recent tokens to keep during compaction.",ko:"압축 중 유지할 최근 토큰 수입니다."},kind:"number",scope:"both",defaultValue:2e4,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.methodOrder",category:"intelligence",group:"Compaction",label:{en:"Compaction Method Order",ko:"압축 방식 순서"},description:{en:"Preferred fallback order for automatic context maintenance; unavailable or failed methods advance to the next choice",ko:"자동 컨텍스트 유지 관리의 선호 대체 순서입니다. 사용할 수 없거나 실패한 방식은 건너뛰고 다음 방식을 사용합니다."},kind:"array",scope:"both",defaultValue:["remote","snapcompact","handoff","shake","soft"],choices:["remote","snapcompact","handoff","soft","shake"],items:"string",appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.midTurnEnabled",category:"intelligence",group:"Compaction",label:{en:"Mid-Turn Compaction",ko:"턴 도중 압축"},description:{en:"Check thresholds at safe mid-turn tool-loop boundaries before the next provider request",ko:"다음 제공자 요청 전에 안전한 턴 도중 도구 루프 경계에서 임곗값을 확인합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.remoteEndpoint",category:"intelligence",group:"Compaction",label:{en:"Remote Endpoint",ko:"원격 엔드포인트"},description:{en:"Remote endpoint used for compaction. The active model credential is sent to this endpoint.",ko:"압축에 사용하는 원격 엔드포인트입니다. 활성 모델의 자격 증명이 이 엔드포인트로 전송됩니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when compaction.methodOrder includes remote.",ko:"compaction.methodOrder에 remote가 포함된 경우 적용됩니다."}},{path:"compaction.remoteStreamingV2Enabled",category:"intelligence",group:"Compaction",label:{en:"Remote Compaction V2",ko:"원격 압축 V2"},description:{en:"Use Responses streaming compaction for compatible remote compaction models",ko:"호환되는 원격 압축 모델에 Responses 스트리밍 압축 사용"},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when compaction.methodOrder includes remote.",ko:"compaction.methodOrder에 remote가 포함된 경우 적용됩니다."}},{path:"compaction.reserveTokens",category:"intelligence",group:"Compaction",label:{en:"Reserve Tokens",ko:"예약 토큰"},description:{en:"Number of tokens to reserve during compaction.",ko:"압축 중 예약할 토큰 수입니다."},kind:"number",scope:"both",integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.supersedeReads",category:"intelligence",group:"Compaction",label:{en:"Supersede Stale Reads",ko:"오래된 읽기 대체"},description:{en:"Prune older read results when the same file is read again (cache-aware, runs every turn)",ko:"같은 파일을 다시 읽을 때 이전 읽기 결과를 제거합니다(캐시 인식, 매 턴 실행)."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.thresholdPercent",category:"intelligence",group:"Compaction",label:{en:"Compaction Threshold",ko:"압축 임계값"},description:{en:"Percent threshold for context maintenance; set to Default to use legacy reserve-based behavior",ko:"컨텍스트 유지를 위한 백분율 임계값입니다. 기존 예약 기반 동작을 사용하려면 Default로 설정하세요."},kind:"number",scope:"both",defaultValue:-1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.thresholdTokens",category:"intelligence",group:"Compaction",label:{en:"Compaction Token Limit",ko:"압축 토큰 한도"},description:{en:"Fixed token limit for context maintenance; overrides percentage if set",ko:"컨텍스트 유지를 위한 고정 토큰 한도입니다. 설정하면 백분율보다 우선합니다."},kind:"number",scope:"both",defaultValue:-1,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.v2RetainedMessageBudget",category:"intelligence",group:"Compaction",label:{en:"V2 Retained Message Budget",ko:"V2 보존 메시지 예산"},description:{en:"Retained message budget for compaction version 2.",ko:"압축 버전 2의 보존 메시지 예산입니다."},kind:"number",scope:"both",defaultValue:64e3,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"contextPromotion.enabled",category:"intelligence",group:"General",label:{en:"Auto-Promote Context",ko:"컨텍스트 자동 확장"},description:{en:"Promote to a larger-context model on context overflow instead of compacting",ko:"컨텍스트가 초과되면 압축 대신 더 큰 컨텍스트 모델로 전환합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"memory.backend",category:"intelligence",group:"General",label:{en:"Memory Backend",ko:"메모리 백엔드"},description:{en:"Off, local summary pipeline, Mnemopi SQLite, Hindsight remote memory, or Sharpshooter",ko:"끄기, 로컬 요약 파이프라인, Mnemopi SQLite, Hindsight 원격 메모리 또는 Sharpshooter"},kind:"enum",scope:"both",defaultValue:"off",choices:["off","local","hindsight","mnemopi","sharpshooter"]},{path:"goal.continuationModes",category:"intelligence",group:"Modes",label:{en:"Goal Continuation Modes",ko:"목표 계속 모드"},description:{en:"Run modes where active goals may auto-continue between turns",ko:"활성 목표가 턴 사이에 자동으로 계속될 수 있는 실행 모드"},kind:"array",scope:"both",defaultValue:["interactive"],items:"string"},{path:"goal.enabled",category:"intelligence",group:"Modes",label:{en:"Goal Mode",ko:"목표 모드"},description:{en:"Enable per-session goal mode and the hidden goal tool",ko:"세션별 목표 모드와 숨겨진 goal 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"hindsight.apiToken",category:"intelligence",group:"Hindsight",label:{en:"Hindsight API Token",ko:"Hindsight API 토큰"},description:{en:"Bearer token for authenticated Hindsight servers",ko:"인증된 Hindsight 서버용 Bearer 토큰"},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.apiUrl",category:"intelligence",group:"Hindsight",label:{en:"Hindsight API URL",ko:"Hindsight API URL"},description:{en:"Hindsight server URL (Cloud or self-hosted)",ko:"Hindsight 서버 URL(Cloud 또는 자체 호스팅)"},kind:"string",scope:"global",defaultValue:"http://localhost:8888",admin:!0,confirmation:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.autoRecall",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Auto Recall",ko:"Hindsight 자동 회상"},description:{en:"Recall memories on the first turn of each session",ko:"각 세션의 첫 번째 턴에 메모리를 회상합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.autoRetain",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Auto Retain",ko:"Hindsight 자동 보존"},description:{en:"Retain transcript every N turns and at session boundaries",ko:"N턴마다 그리고 세션 경계에서 대화 기록을 보존합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.bankId",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Bank ID",ko:"Hindsight Bank ID"},description:{en:"Memory bank identifier (default: project name)",ko:"메모리 bank 식별자(기본값: 프로젝트 이름)"},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.bankIdPrefix",category:"intelligence",group:"Hindsight",label:{en:"Bank ID Prefix",ko:"Bank ID 접두사"},description:{en:"Prefix for Hindsight bank IDs.",ko:"Hindsight 뱅크 ID의 접두사입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.bankMission",category:"intelligence",group:"Hindsight",label:{en:"Bank Mission",ko:"Bank 미션"},description:{en:"Mission configured for the Hindsight bank.",ko:"Hindsight 뱅크에 구성된 미션입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.mentalModelAutoSeed",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Mental Model Auto-Seed",ko:"Hindsight 멘탈 모델 자동 시드"},description:{en:"At session start, create any built-in mental models (project-conventions, project-decisions, user-preferences) that do not yet exist on the bank.",ko:"세션 시작 시 bank에 아직 없는 기본 제공 멘탈 모델(project-conventions, project-decisions, user-preferences)을 생성합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.mentalModelMaxRenderChars",category:"intelligence",group:"Hindsight",label:{en:"Mental Model Max Render Chars",ko:"멘탈 모델 최대 렌더링 문자 수"},description:{en:"Maximum number of characters for rendering the mental model.",ko:"멘탈 모델 렌더링의 최대 문자 수입니다."},kind:"number",scope:"both",defaultValue:16e3,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.mentalModelRefreshIntervalMs",category:"intelligence",group:"Hindsight",label:{en:"Mental Model Refresh Interval Ms",ko:"멘탈 모델 새로 고침 간격 Ms"},description:{en:"Mental model refresh interval in milliseconds.",ko:"멘탈 모델 새로 고침 간격(밀리초)입니다."},kind:"number",scope:"both",defaultValue:3e5,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.mentalModelsEnabled",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Mental Models",ko:"Hindsight 멘탈 모델"},description:{en:"Read curated reflect summaries (mental models) into developer instructions at boot. Loads existing models on the bank — does not write. Pair with hindsight.mentalModelAutoSeed to also auto-create the built-in seed set.",ko:"부팅 시 선별된 reflect 요약(멘탈 모델)을 개발자 지침에 불러옵니다. bank의 기존 모델만 로드하며 쓰지는 않습니다. 기본 제공 시드 세트도 자동 생성하려면 hindsight.mentalModelAutoSeed와 함께 사용하세요."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallBudget",category:"intelligence",group:"Hindsight",label:{en:"Recall Budget",ko:"회상 예산"},description:{en:"Budget level selected for recall.",ko:"회상에 선택된 예산 수준입니다."},kind:"enum",scope:"both",defaultValue:"mid",choices:["low","mid","high"],appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallContextTurns",category:"intelligence",group:"Hindsight",label:{en:"Recall Context Turns",ko:"회상 컨텍스트 턴"},description:{en:"Number of context turns used for recall.",ko:"회상에 사용하는 컨텍스트 턴 수입니다."},kind:"number",scope:"both",defaultValue:1,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallMaxQueryChars",category:"intelligence",group:"Hindsight",label:{en:"Recall Max Query Chars",ko:"회상 쿼리 최대 문자 수"},description:{en:"Maximum number of characters in a recall query.",ko:"회상 쿼리의 최대 문자 수입니다."},kind:"number",scope:"both",defaultValue:800,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallMaxTokens",category:"intelligence",group:"Hindsight",label:{en:"Recall Max Tokens",ko:"회상 최대 토큰 수"},description:{en:"Maximum number of tokens for recall.",ko:"회상의 최대 토큰 수입니다."},kind:"number",scope:"both",defaultValue:1024,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Recall Timeout Ms",ko:"회상 제한 시간(Ms)"},description:{en:"Recall timeout in milliseconds.",ko:"회상 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:3e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallTypes",category:"intelligence",group:"Hindsight",label:{en:"Recall Types",ko:"회상 유형"},description:{en:"Types of information included in recall.",ko:"회상에 포함할 정보 유형입니다."},kind:"array",scope:"both",defaultValue:["world","experience"],items:"string",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.reflectTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Reflect Timeout Ms",ko:"성찰 제한 시간(Ms)"},description:{en:"Reflection timeout in milliseconds.",ko:"성찰 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:12e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.requestTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Request Timeout Ms",ko:"요청 제한 시간(Ms)"},description:{en:"Hindsight request timeout in milliseconds.",ko:"Hindsight 요청 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:3e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainContext",category:"intelligence",group:"Hindsight",label:{en:"Retain Context",ko:"컨텍스트 보존"},description:{en:"Context value used for retention.",ko:"보존에 사용하는 컨텍스트 값입니다."},kind:"string",scope:"both",defaultValue:"omp",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainEveryNTurns",category:"intelligence",group:"Hindsight",label:{en:"Retain Every Nturns",ko:"N턴마다 보존"},description:{en:"Number of turns between retention operations.",ko:"보존 작업 사이의 턴 수입니다."},kind:"number",scope:"both",defaultValue:3,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainMission",category:"intelligence",group:"Hindsight",label:{en:"Retain Mission",ko:"미션 보존"},description:{en:"Mission used for retention.",ko:"보존에 사용하는 미션입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainMode",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Retain Mode",ko:"Hindsight 보존 모드"},description:{en:"full-session = upsert one document per session, last-turn = chunked",ko:"full-session = 세션당 문서 하나를 upsert, last-turn = 청크 단위"},kind:"enum",scope:"both",defaultValue:"full-session",choices:["full-session","last-turn"],appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainOverlapTurns",category:"intelligence",group:"Hindsight",label:{en:"Retain Overlap Turns",ko:"보존 중첩 턴"},description:{en:"Number of overlapping turns retained between retention operations.",ko:"보존 작업 간에 유지할 중첩 턴 수입니다."},kind:"number",scope:"both",defaultValue:2,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Retain Timeout Ms",ko:"보존 제한 시간(Ms)"},description:{en:"Retention timeout in milliseconds.",ko:"보존 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:6e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.scoping",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Scoping",ko:"Hindsight 범위"},description:{en:"global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = shared bank with project tags so global + project memories merge on recall",ko:"global = 하나의 공유 뱅크, per-project = cwd별 격리된 뱅크, per-project-tagged = 프로젝트 태그가 있는 공유 뱅크로, 회상 시 전역 메모리와 프로젝트 메모리를 병합"},kind:"enum",scope:"both",defaultValue:"per-project-tagged",choices:["global","per-project","per-project-tagged"],appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"mnemopi.autoRecall",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Auto Recall",ko:"Mnemopi 자동 회상"},description:{en:"Recall local memories into the first turn of each session",ko:"각 세션의 첫 번째 턴에 로컬 메모리를 회상합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.autoRetain",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Auto Retain",ko:"Mnemopi 자동 보존"},description:{en:"Retain completed conversation turns into local Mnemopi memory",ko:"완료된 대화 턴을 로컬 Mnemopi 메모리에 보존합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.bank",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Bank",ko:"Mnemopi 뱅크"},description:{en:"Optional shared bank base name. Per-project modes derive project-local banks from it.",ko:"선택 사항인 공유 뱅크 기본 이름입니다. 프로젝트별 모드는 이 이름에서 프로젝트 로컬 뱅크를 파생합니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.dbPath",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi DB Path",ko:"Mnemopi DB 경로"},description:{en:"Optional SQLite DB path. Defaults to the agent memories directory.",ko:"선택 사항인 SQLite DB 경로입니다. 기본값은 에이전트 메모리 디렉터리입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.embeddingApiKey",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Embedding API Key",ko:"Mnemopi 임베딩 API 키"},description:{en:"Optional embedding API key passed to Mnemopi",ko:"Mnemopi에 전달할 선택 사항인 임베딩 API 키입니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when Mnemopi embeddings use an authenticated API.",ko:"Mnemopi 임베딩이 인증된 API를 사용할 때 적용됩니다."}},{path:"mnemopi.embeddingApiUrl",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Embedding API URL",ko:"Mnemopi 임베딩 API URL"},description:{en:"Optional OpenAI-compatible embedding endpoint passed to Mnemopi",ko:"Mnemopi에 전달할 선택 사항인 OpenAI 호환 임베딩 엔드포인트입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when Mnemopi uses a remote embedding endpoint.",ko:"Mnemopi가 원격 임베딩 엔드포인트를 사용할 때 적용됩니다."}},{path:"mnemopi.embeddingModel",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Embedding Model",ko:"Mnemopi 임베딩 모델"},description:{en:"Advanced: explicit embedding model id that overrides the variant. Leave empty to use mnemopi.embeddingVariant.",ko:"고급: variant를 재정의할 명시적 임베딩 모델 id입니다. mnemopi.embeddingVariant를 사용하려면 비워 두세요."},kind:"string",scope:"both",appliesTo:{en:"Applies when Mnemopi embeddings are enabled.",ko:"Mnemopi 임베딩이 활성화된 경우 적용됩니다."}},{path:"mnemopi.embeddingVariant",category:"intelligence",group:"Mnemopi",label:{en:"Embedding variant",ko:"임베딩 변형"},description:{en:"Local embedding model family. en = stronger English model; multilingual = cross-language model. Changing this rebuilds existing memory embeddings on next start.",ko:"로컬 임베딩 모델 계열입니다. en = 더 강력한 영어 모델, multilingual = 언어 간 모델입니다. 변경하면 다음 시작 시 기존 메모리 임베딩을 재구축합니다."},kind:"enum",scope:"both",defaultValue:"en",choices:["en","multilingual"],appliesTo:{en:"Applies when Mnemopi embeddings are enabled.",ko:"Mnemopi 임베딩이 활성화된 경우 적용됩니다."}},{path:"mnemopi.enhancedRecall",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Enhanced Recall",ko:"Mnemopi 향상된 회상"},description:{en:"Enable the tiered query result cache for repeated and similar recall queries",ko:"반복되거나 유사한 회상 쿼리에 계층형 쿼리 결과 캐시를 사용합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.injectionTokenLimit",category:"intelligence",group:"Mnemopi",label:{en:"Injection Token Limit",ko:"삽입 토큰 한도"},description:{en:"Token limit for Mnemopi injection.",ko:"Mnemopi 주입의 토큰 제한입니다."},kind:"number",scope:"both",defaultValue:5e3,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.llmApiKey",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM API Key",ko:"Mnemopi LLM API 키"},description:{en:"Optional LLM API key for Mnemopi remote mode",ko:"Mnemopi 원격 모드용 선택적 LLM API 키입니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when mnemopi.llmMode uses an authenticated remote model.",ko:"mnemopi.llmMode가 인증된 원격 모델을 사용할 때 적용됩니다."}},{path:"mnemopi.llmBaseUrl",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM Base URL",ko:"Mnemopi LLM 기본 URL"},description:{en:"Optional OpenAI-compatible LLM endpoint for Mnemopi remote mode",ko:"Mnemopi 원격 모드용 선택적 OpenAI 호환 LLM 엔드포인트입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when mnemopi.llmMode is remote.",ko:"mnemopi.llmMode가 remote인 경우 적용됩니다."}},{path:"mnemopi.llmMode",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM Mode",ko:"Mnemopi LLM 모드"},description:{en:"Use no LLM, the online tiny model (the TINY role from /models, else @smol), or a remote OpenAI-compatible endpoint",ko:"LLM을 사용하지 않거나, 온라인 소형 모델(/models의 TINY 역할, 없으면 @smol) 또는 원격 OpenAI 호환 엔드포인트를 사용합니다."},kind:"enum",scope:"both",defaultValue:"smol",choices:["none","smol","remote"],appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.llmModel",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM Model",ko:"Mnemopi LLM 모델"},description:{en:"Optional LLM model name for Mnemopi remote mode",ko:"Mnemopi 원격 모드용 선택적 LLM 모델 이름입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies when Mnemopi LLM enrichment is enabled.",ko:"Mnemopi LLM 보강이 활성화된 경우 적용됩니다."}},{path:"mnemopi.noEmbeddings",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Disable Embeddings",ko:"Mnemopi 임베딩 비활성화"},description:{en:"Force deterministic FTS-only recall instead of vector embeddings",ko:"벡터 임베딩 대신 결정론적 FTS 전용 회상을 강제합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.polyphonicRecall",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Polyphonic Recall",ko:"Mnemopi 다중 회상"},description:{en:"Enable 4-voice recall (vector, graph, fact, temporal) fused with reciprocal rank fusion",ko:"상호 순위 융합으로 결합된 4개 보이스 회상(벡터, 그래프, 사실, 시간)을 사용합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.proactiveLinking",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Proactive Linking",ko:"Mnemopi 선제적 연결"},description:{en:"Ingest new memories into the episodic graph as they are stored, linking them to related entities and memories",ko:"새 메모리를 저장할 때 에피소드 그래프에 수집하여 관련 엔터티 및 메모리와 연결합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.recallContextTurns",category:"intelligence",group:"Mnemopi",label:{en:"Recall Context Turns",ko:"회상 컨텍스트 턴 수"},description:{en:"Number of context turns used for Mnemopi recall.",ko:"Mnemopi 회상에 사용하는 컨텍스트 턴 수입니다."},kind:"number",scope:"both",defaultValue:3,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.recallLimit",category:"intelligence",group:"Mnemopi",label:{en:"Recall Limit",ko:"회상 한도"},description:{en:"Limit on the number of Mnemopi recall results.",ko:"Mnemopi 회상 결과 수의 제한입니다."},kind:"number",scope:"both",defaultValue:8,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.recallMaxQueryChars",category:"intelligence",group:"Mnemopi",label:{en:"Recall Max Query Chars",ko:"회상 쿼리 최대 문자 수"},description:{en:"Maximum number of characters in a Mnemopi recall query.",ko:"Mnemopi 회상 쿼리의 최대 문자 수입니다."},kind:"number",scope:"both",defaultValue:4e3,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.retainEveryNTurns",category:"intelligence",group:"Mnemopi",label:{en:"Retain Every Nturns",ko:"N턴마다 보존"},description:{en:"Sets the Mnemopi retention interval in turns.",ko:"Mnemopi 유지 간격을 턴 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:4,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.scoping",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Scoping",ko:"Mnemopi 범위 지정"},description:{en:"global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = project-local writes plus global recall visibility",ko:"global = 하나의 공유 뱅크, per-project = cwd별로 격리된 뱅크, per-project-tagged = 프로젝트 로컬 쓰기 및 전역 회상 가시성입니다."},kind:"enum",scope:"both",defaultValue:"per-project",choices:["global","per-project","per-project-tagged"],appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"sharpshooter.injectionTokenLimit",category:"intelligence",group:"Sharpshooter",label:{en:"Injection Token Limit",ko:"주입 토큰 한도"},description:{en:"Sets the Sharpshooter injection limit in tokens.",ko:"Sharpshooter 삽입 한도를 토큰 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:15e3,integer:!0,appliesTo:{en:"Applies to memory.backend = sharpshooter.",ko:"memory.backend = sharpshooter에 적용됩니다."}},{path:"sharpshooter.intervalMinutes",category:"intelligence",group:"Sharpshooter",label:{en:"Interval Minutes",ko:"간격(분)"},description:{en:"Sets the Sharpshooter interval in minutes.",ko:"Sharpshooter 간격을 분 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:5,appliesTo:{en:"Applies to memory.backend = sharpshooter.",ko:"memory.backend = sharpshooter에 적용됩니다."}},{path:"sharpshooter.model",category:"intelligence",group:"Sharpshooter",label:{en:"Sharpshooter Model",ko:"Sharpshooter 모델"},description:{en:"Model selector for extraction/consolidation, empty = smol role",ko:"추출/통합용 모델 선택자입니다. 비어 있으면 smol 역할을 사용합니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = sharpshooter.",ko:"memory.backend = sharpshooter에 적용됩니다."}},{path:"advisor.enabled",category:"agents",group:"Advisor",label:{en:"Enable Advisor",ko:"Advisor 활성화"},description:{en:"Pair a second model (assigned to the 'advisor' role) that passively reviews each turn and injects notes.",ko:"'advisor' 역할에 할당된 두 번째 모델을 연결해 각 턴을 수동으로 검토하고 메모를 추가합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"advisor.immuneTurns",category:"agents",group:"Advisor",label:{en:"Advisor Immune Turns",ko:"Advisor 중단 면제 턴"},description:{en:"After an advisor concern or blocker interrupts, route further concerns/blockers non-interruptingly for this many primary turns.",ko:"Advisor의 우려 사항이나 차단 요소로 중단된 후, 지정한 기본 턴 수 동안 추가 우려 사항과 차단 요소를 중단 없이 전달합니다."},kind:"number",scope:"both",defaultValue:3,integer:!0,appliesTo:{en:"Applies to advisor.enabled.",ko:"advisor.enabled에 적용됩니다."}},{path:"advisor.maxNotesPerUpdate",category:"agents",group:"Advisor",label:{en:"Advisor Max Notes Per Update",ko:"Advisor 업데이트당 최대 메모 수"},description:{en:"Maximum non-blocker advice notes accepted per advisor prompt update (1–32; UI offers 1–5 quick picks). Blockers are exempt.",ko:"Advisor 프롬프트 업데이트당 허용할 비차단 조언 메모의 최대 개수입니다(1–32; UI에서는 1–5 빠른 선택 제공). 차단 요소는 제외됩니다."},kind:"number",scope:"both",defaultValue:4,integer:!0,min:1,max:32,step:1,appliesTo:{en:"Applies to advisor.enabled.",ko:"advisor.enabled에 적용됩니다."}},{path:"advisor.syncBacklog",category:"agents",group:"Advisor",label:{en:"Advisor Sync Backlog",ko:"Advisor 동기화 지연 턴"},description:{en:"Pause the main agent for up to 30 seconds if the advisor falls behind by this many turns. Off disables catch-up delays.",ko:"Advisor가 지정한 턴 수만큼 뒤처지면 기본 에이전트를 최대 30초 동안 일시 중지합니다. Off로 설정하면 따라잡기 지연이 비활성화됩니다."},kind:"enum",scope:"both",defaultValue:"off",choices:["off","1","3","5"],appliesTo:{en:"Applies to advisor.enabled.",ko:"advisor.enabled에 적용됩니다."}},{path:"branchSummary.enabled",category:"agents",group:"General",label:{en:"Branch Summaries",ko:"브랜치 요약"},description:{en:"Prompt to summarize when leaving a branch",ko:"브랜치를 떠날 때 요약하도록 요청합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"followUpMode",category:"agents",group:"Input",label:{en:"Follow-Up Mode",ko:"후속 모드"},description:{en:"How to drain follow-up messages after a turn completes",ko:"턴 완료 후 후속 메시지를 처리하는 방식"},kind:"enum",scope:"both",defaultValue:"one-at-a-time",choices:["all","one-at-a-time"]},{path:"interruptMode",category:"agents",group:"Input",label:{en:"Interrupt Mode",ko:"중단 모드"},description:{en:"When steering messages interrupt tool execution",ko:"지시 메시지가 도구 실행을 중단하는 방식을 설정합니다."},kind:"enum",scope:"both",defaultValue:"immediate",choices:["immediate","wait"]},{path:"steeringMode",category:"agents",group:"Input",label:{en:"Steering Mode",ko:"조정 모드"},description:{en:"How to process queued messages while agent is working",ko:"에이전트가 작업 중일 때 대기열의 메시지를 처리하는 방식을 설정합니다."},kind:"enum",scope:"both",defaultValue:"one-at-a-time",choices:["all","one-at-a-time"]},{path:"includeWorkspaceTree",category:"agents",group:"Prompt",label:{en:"Include Workspace Tree",ko:"워크스페이스 트리 포함"},description:{en:"Render the workspace directory tree in the system prompt. WARNING: This can bust prompt caching across sessions when files are modified.",ko:"시스템 프롬프트에 워크스페이스 디렉터리 트리를 렌더링합니다. 경고: 파일이 수정되면 세션 간 프롬프트 캐싱이 무효화될 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"personality",category:"agents",group:"Prompt",label:{en:"Personality",ko:"성격"},description:{en:"Communication style rendered into the system prompt's personality block",ko:"시스템 프롬프트의 성격 블록에 반영되는 커뮤니케이션 스타일입니다."},kind:"enum",scope:"both",defaultValue:"default",choices:["default","friendly","pragmatic","none"]},{path:"prewalk.enabled",category:"agents",group:"Prewalk",label:{en:"Enable Prewalk",ko:"Prewalk 사용"},description:{en:"Start on the active model, then switch to a fast/cheap model (default the 'smol' role) at the first edit/write after the plan nudge's todo list exists — the strong model plans, commits the todos, and starts the implementation before handing off. Overridable per session with --prewalk / --no-prewalk.",ko:"활성 모델로 시작한 후 계획 유도의 할 일 목록이 생성된 뒤 처음 편집하거나 쓸 때 빠르고 저렴한 모델(기본값은 'smol' 역할)로 전환합니다. 강력한 모델이 계획하고 할 일을 확정한 후 구현을 시작하고 인계합니다. 세션별로 --prewalk / --no-prewalk를 사용해 재정의할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.agentAdvisor",category:"agents",group:"Task",label:{en:"Agent Advisor",ko:"에이전트 어드바이저"},description:{en:"Per-agent advisor overrides: use 'on', 'off', or an advisor model selector for each agent name.",ko:"에이전트 이름별 어드바이저 재정의입니다. 각 값에 'on', 'off' 또는 어드바이저 모델 선택자를 사용합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"boolean-string",appliesTo:{en:"Applies per named task agent.",ko:"이름이 지정된 task 에이전트별로 적용됩니다."}},{path:"task.agentModelOverrides",category:"agents",group:"Task",label:{en:"Agent Model Overrides",ko:"에이전트 모델 재정의"},description:{en:"Configures task agent model overrides.",ko:"작업 에이전트의 모델 재정의를 구성합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"string-or-string-array",appliesTo:{en:"Applies per named task agent; each value is one model selector or an ordered selector list.",ko:"이름이 지정된 task 에이전트별로 적용되며 각 값은 하나의 모델 선택자 또는 순서가 있는 선택자 목록입니다."}},{path:"task.agentPrewalk",category:"agents",group:"Task",label:{en:"Agent Prewalk",ko:"에이전트 사전 탐색"},description:{en:"Per-agent prewalk overrides: use 'on', 'off', or a handoff model selector for each agent name.",ko:"에이전트 이름별 prewalk 재정의입니다. 각 값에 'on', 'off' 또는 인계할 모델 선택자를 사용합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"boolean-string",appliesTo:{en:"Applies per named task agent.",ko:"이름이 지정된 task 에이전트별로 적용됩니다."}},{path:"task.disabledAgents",category:"agents",group:"Task",label:{en:"Disabled Agents",ko:"비활성화된 에이전트"},description:{en:"Sets the list of disabled task agents.",ko:"비활성화할 작업 에이전트 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"task.agentIdleTtlMs",category:"agents",group:"Subagents",label:{en:"Agent Idle TTL",ko:"에이전트 유휴 TTL"},description:{en:"How long an idle subagent stays live in memory before being parked to disk (ms). Parked agents are revived automatically when messaged or resumed. 0 keeps idle agents live until exit.",ko:"유휴 하위 에이전트를 디스크에 보관하기 전에 메모리에서 활성 상태로 유지할 시간(ms)입니다. 보관된 에이전트는 메시지를 받거나 재개될 때 자동으로 복원됩니다. 0은 종료할 때까지 유휴 에이전트를 활성 상태로 유지합니다."},kind:"number",scope:"both",defaultValue:42e4,integer:!0},{path:"task.batch",category:"agents",group:"Subagents",label:{en:"Batch Task Calls",ko:"작업 호출 일괄 처리"},description:{en:"Switch the task tool to its batch shape: one call carries { context, tasks[] } — one subagent per item, with an optional per-item agent (defaulting to the session spawn-policy agent), per-item isolation, and a required shared context prepended to every assignment. With async.enabled=true, each spawn runs as an independent background agent with the normal idle/parked lifecycle; otherwise the call blocks for merged results. Disable to restore the flat single-spawn schema.",ko:"task 도구를 일괄 처리 형식으로 전환합니다. 한 번의 호출에 { context, tasks[] }를 전달하며, 항목마다 하나의 하위 에이전트와 선택적 agent를 지정할 수 있습니다. agent의 기본값은 세션 생성 정책의 에이전트이며, 항목별 격리와 모든 할당 앞에 추가되는 필수 공유 컨텍스트가 적용됩니다. async.enabled=true이면 각 생성 작업이 일반적인 유휴/보관 수명 주기를 따르는 독립 백그라운드 에이전트로 실행됩니다. 그렇지 않으면 병합된 결과가 나올 때까지 호출이 차단됩니다. 비활성화하면 평면형 단일 생성 스키마로 복원됩니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"task.eager",category:"agents",group:"Subagents",label:{en:"Prefer Task Delegation",ko:"작업 위임 우선"},description:{en:"How strongly to push delegating work to subagents",ko:"하위 에이전트에 작업을 위임하도록 유도할 강도를 설정합니다."},kind:"enum",scope:"both",defaultValue:"default",choices:["default","preferred","always"]},{path:"task.enableEffort",category:"agents",group:"Subagents",label:{en:"Per-Task Effort",ko:"작업별 노력 수준"},description:{en:"Expose the optional effort parameter on task spawns, allowing callers to override each subagent's thinking level",ko:"작업 생성 시 선택적 effort 매개변수를 노출하여 호출자가 각 하위 에이전트의 사고 수준을 재정의할 수 있도록 합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.enableLsp",category:"agents",group:"Subagents",label:{en:"LSP in Subagents",ko:"하위 에이전트에서 LSP 사용"},description:{en:"Allow subagents spawned via the task tool to use the lsp tool. Off by default to keep subagents cheap; enable when LSP-aware delegation is worth the extra tokens.",ko:"task 도구로 생성된 하위 에이전트가 lsp 도구를 사용할 수 있도록 합니다. 하위 에이전트의 비용을 낮추기 위해 기본적으로 꺼져 있습니다. 추가 토큰을 사용하더라도 LSP 기반 위임이 유용할 때 활성화하세요."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.maxConcurrency",category:"agents",group:"Subagents",label:{en:"Max Concurrent Tasks",ko:"최대 동시 작업 수"},description:{en:"Maximum number of subagents running concurrently; 0 means unlimited.",ko:"동시에 실행할 수 있는 최대 하위 에이전트 수입니다. 0은 무제한을 의미합니다."},kind:"number",scope:"both",defaultValue:32,integer:!0,min:0,step:1},{path:"task.maxEffort",category:"agents",group:"Subagents",label:{en:"Maximum Per-Spawn Effort",ko:"생성당 최대 작업량"},description:{en:"Maximum reasoning effort allowed for the task tool's per-spawn effort hint. Lower values prevent callers from escalating subagents above this ceiling; the default preserves the model's full range.",ko:"task 도구의 생성당 작업량 힌트에 허용되는 최대 추론 작업량입니다. 값을 낮추면 호출자가 서브에이전트의 작업량을 이 한도보다 높일 수 없습니다. 기본값은 모델의 전체 범위를 유지합니다."},kind:"enum",scope:"both",defaultValue:"max",choices:["minimal","low","medium","high","xhigh","max"]},{path:"task.maxRecursionDepth",category:"agents",group:"Subagents",label:{en:"Max Task Recursion",ko:"최대 작업 재귀 깊이"},description:{en:"How many levels deep subagents can spawn their own subagents",ko:"서브에이전트가 자체 서브에이전트를 생성할 수 있는 최대 단계 수"},kind:"number",scope:"both",defaultValue:2,integer:!0},{path:"task.maxRuntimeMs",category:"agents",group:"Subagents",label:{en:"Max Subagent Runtime",ko:"최대 서브에이전트 실행 시간"},description:{en:"Hard wall-clock limit per subagent (ms). 0 disables it. Defense-in-depth against provider-side stream hangs that escape the inference-layer watchdog; triggers a normal subagent abort with a 'timed out' reason.",ko:"서브에이전트당 엄격한 실제 시간 제한(ms)입니다. 0이면 비활성화됩니다. 추론 계층 감시를 벗어난 제공자 측 스트림 중단에 대비한 심층 방어 기능이며, 'timed out' 사유로 서브에이전트를 정상 중단합니다."},kind:"number",scope:"both",defaultValue:0,integer:!0},{path:"task.prewalk",category:"agents",group:"Subagents",label:{en:"Generic Task Prewalk",ko:"일반 작업 사전 실행"},description:{en:"Arm prewalk for the bundled generic `task` subagent: it starts on its resolved model, plans and begins the implementation, then hands off to the 'smol' role at its first edit/write. Per-agent overrides (task.agentPrewalk, configured from the /agents hub) and user agent `prewalk` frontmatter apply regardless of this toggle.",ko:"번들 generic `task` 서브에이전트의 사전 실행을 준비합니다. 확인된 모델에서 시작해 계획을 세우고 구현을 시작한 뒤, 처음 편집/쓰기를 수행할 때 'smol' 역할로 넘깁니다. 에이전트별 재정의(task.agentPrewalk, /agents 허브에서 구성)와 사용자 에이전트의 `prewalk` frontmatter는 이 설정과 관계없이 적용됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.softRequestBudget",category:"agents",group:"Subagents",label:{en:"Soft Subagent Request Budget",ko:"서브에이전트 소프트 요청 예산"},description:{en:"Soft per-subagent request budget (assistant requests per run). Crossing it injects a wrap-up steering notice (see task.softRequestBudgetNotice); at 1.5x the budget the run is force-stopped and the agent must yield its partial findings. 0 disables the guard. Bundled scout/sonic agents cap out at a lower built-in budget, so a value below that cap still applies to them.",ko:"서브에이전트별 소프트 요청 예산(실행당 어시스턴트 요청 수)입니다. 초과하면 마무리를 유도하는 안내가 삽입됩니다(task.softRequestBudgetNotice 참조). 예산의 1.5x에 도달하면 실행이 강제 중지되고 에이전트는 부분 결과를 제출해야 합니다. 0이면 보호 기능이 비활성화됩니다. 번들 scout/sonic 에이전트에는 더 낮은 기본 제공 한도가 있으므로, 이 한도보다 낮은 값도 해당 에이전트에 적용됩니다."},kind:"number",scope:"both",defaultValue:200,integer:!0},{path:"task.softRequestBudgetNotice",category:"agents",group:"Subagents",label:{en:"Soft Request Budget Notice",ko:"소프트 요청 예산 알림"},description:{en:"Inject one steering notice when a subagent crosses its soft request budget, asking it to wrap up before the 1.5x forced-yield stop.",ko:"서브에이전트가 소프트 요청 예산을 초과하면 1.5x 강제 제출 중지 전에 마무리하도록 유도하는 안내를 한 번 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"task.isolation.apply",category:"agents",group:"Isolation",label:{en:"Apply Isolated Changes",ko:"격리된 변경 사항 적용"},description:{en:"Automatically apply successful isolated task changes to the parent checkout; disable to retain patch or branch artifacts",ko:"성공한 격리 작업의 변경 사항을 상위 체크아웃에 자동 적용합니다. 비활성화하면 패치 또는 브랜치 아티팩트를 유지합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"task.isolation.commits",category:"agents",group:"Isolation",label:{en:"Isolation Commit Style",ko:"격리 커밋 스타일"},description:{en:"Commit message style for nested repo changes (generic or AI-generated)",ko:"중첩 저장소 변경 사항의 커밋 메시지 스타일(generic 또는 AI-generated)"},kind:"enum",scope:"both",defaultValue:"generic",choices:["generic","ai"]},{path:"task.isolation.enabled",category:"agents",group:"Isolation",label:{en:"Isolate Subagents",ko:"서브에이전트 격리"},description:{en:"Run subagents in an isolated copy of the checkout and integrate their changes afterwards",ko:"체크아웃의 격리된 복사본에서 서브에이전트를 실행한 후 변경 사항을 통합합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.isolation.merge",category:"agents",group:"Isolation",label:{en:"Isolation Merge Strategy",ko:"격리 병합 전략"},description:{en:"How isolated task changes are integrated (patch apply or branch merge)",ko:"격리 작업의 변경 사항을 통합하는 방식(패치 적용 또는 브랜치 병합)"},kind:"enum",scope:"both",defaultValue:"patch",choices:["patch","branch"]},{path:"todo.eager",category:"agents",group:"Todos",label:{en:"Create Todos Automatically",ko:"할 일 자동 생성"},description:{en:"How strongly to push automatic todo-list creation after the first message",ko:"첫 메시지 후 할 일 목록 자동 생성을 얼마나 강하게 유도할지 설정합니다."},kind:"enum",scope:"both",defaultValue:"default",choices:["default","preferred","always"]},{path:"todo.reminders",category:"agents",group:"Todos",label:{en:"Todo Reminders",ko:"할 일 알림"},description:{en:"Remind the agent to complete todos before stopping",ko:"에이전트가 중지하기 전에 할 일을 완료하도록 알립니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"todo.remindersMax",category:"agents",group:"Todos",label:{en:"Todo Reminder Limit",ko:"할 일 알림 한도"},description:{en:"Maximum number of todo reminders before giving up",ko:"포기하기 전까지 표시할 최대 할 일 알림 수"},kind:"number",scope:"both",defaultValue:3,integer:!0},{path:"todo.enabled",category:"agents",group:"Available Tools",label:{en:"Todos",ko:"할 일"},description:{en:"Enable the todo tool for task tracking",ko:"작업 추적을 위한 todo 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"ask.enabled",category:"tools",group:"Available Tools",label:{en:"Ask",ko:"질문"},description:{en:"Enable the ask tool for interactive user questions",ko:"대화형 사용자 질문을 위한 ask 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"astEdit.enabled",category:"tools",group:"Available Tools",label:{en:"AST Edit",ko:"AST 편집"},description:{en:"Enable the ast_edit tool for structural AST rewrites",ko:"구조적 AST 재작성을 위한 ast_edit 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"astGrep.enabled",category:"tools",group:"Available Tools",label:{en:"AST Grep",ko:"AST 검색"},description:{en:"Enable the ast_grep tool for structural AST search",ko:"구조적 AST 검색을 위한 ast_grep 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"browser.enabled",category:"tools",group:"Available Tools",label:{en:"Browser",ko:"브라우저"},description:{en:"Enable the browser eval prelude for scripted Chromium automation (Puppeteer)",ko:"스크립트 기반 Chromium 자동화(Puppeteer)를 위한 브라우저 eval 프렐류드를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"computer.enabled",category:"tools",group:"Available Tools",label:{en:"Computer",ko:"컴퓨터"},description:{en:"Enable the scriptable host-desktop eval prelude (screenshots, input, accessibility)",ko:"스크립팅 가능한 호스트 데스크톱 eval 프렐류드(스크린샷, 입력, 접근성)를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"debug.enabled",category:"tools",group:"Available Tools",label:{en:"Debug",ko:"디버그"},description:{en:"Enable the debug tool for DAP-based debugging",ko:"DAP 기반 디버깅용 디버그 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"fetch.enabled",category:"tools",group:"Available Tools",label:{en:"Read URLs",ko:"URL 읽기"},description:{en:"Allow the read tool to fetch and process URLs",ko:"read 도구가 URL을 가져와 처리하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"generate_image.enabled",category:"tools",group:"Available Tools",label:{en:"Generate Image",ko:"이미지 생성"},description:{en:"Enable the generate_image tool (text-to-image generation and editing). Exposed as an xd:// device when tools.xdev is on.",ko:"generate_image 도구(텍스트 기반 이미지 생성 및 편집)를 활성화합니다. tools.xdev가 켜져 있으면 xd:// 장치로 노출됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"github.enabled",category:"tools",group:"Available Tools",label:{en:"GitHub CLI",ko:"GitHub CLI"},description:{en:"Enable the github tool (op-based dispatch for repository, issue, pull request, diff, search, checkout, push, and Actions watch workflows)",ko:"github 도구를 활성화합니다(저장소, 이슈, 풀 리퀘스트, diff, 검색, checkout, push 및 Actions watch 워크플로를 위한 작업 기반 디스패치)."},kind:"boolean",scope:"both",defaultValue:!1},{path:"glob.enabled",category:"tools",group:"Available Tools",label:{en:"Glob",ko:"Glob"},description:{en:"Enable the glob tool for glob-based file lookup",ko:"glob 기반 파일 검색용 glob 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"grep.enabled",category:"tools",group:"Available Tools",label:{en:"Grep",ko:"Grep"},description:{en:"Enable the grep tool for regex content search",ko:"정규식 콘텐츠 검색용 grep 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"async.enabled",category:"tools",group:"Execution",label:{en:"Async Execution",ko:"비동기 실행"},description:{en:"Enable async bash commands and background task execution",ko:"비동기 bash 명령과 백그라운드 작업 실행을 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.abortOnFabricatedResult",category:"tools",group:"Execution",label:{en:"Abort On Fabricated Tool Result",ko:"조작된 도구 결과 감지 시 중단"},description:{en:"With in-band tool calls, stop the model immediately when it starts hallucinating a tool result mid-turn. Disable to let the model finish generating and discard the fabricated continuation instead.",ko:"인밴드 도구 호출에서 모델이 응답 도중 도구 결과를 환각하기 시작하면 즉시 중지합니다. 비활성화하면 모델이 생성을 마칠 때까지 기다린 후 조작된 후속 내용을 폐기합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.intentTracing",category:"tools",group:"Execution",label:{en:"Intent Tracing",ko:"의도 추적"},description:{en:"Ask the agent to describe the intent of each tool call before executing it",ko:"각 도구 호출을 실행하기 전에 에이전트가 호출 의도를 설명하도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.maxTimeout",category:"tools",group:"Execution",label:{en:"Max Tool Timeout",ko:"최대 도구 시간 제한"},description:{en:"Maximum timeout in seconds the agent can set for any tool (0 = no limit)",ko:"에이전트가 도구에 설정할 수 있는 최대 시간 제한(초)(0 = 제한 없음)"},kind:"number",scope:"both",defaultValue:0,integer:!0},{path:"async.maxJobs",category:"tools",group:"Async",label:{en:"Max Jobs",ko:"최대 작업 수"},description:{en:"Maximum number of asynchronous jobs.",ko:"비동기 작업의 최대 개수입니다."},kind:"number",scope:"both",defaultValue:100,integer:!0},{path:"bash.allowCompoundCommands",category:"tools",group:"Bash",label:{en:"Allow Compound Commands",ko:"복합 명령 허용"},description:{en:"Evaluate literal && chains per command; unmatched commands use normal bash approval policy and mode",ko:"리터럴 && 체인을 명령별로 평가합니다. 일치하지 않는 명령에는 일반 bash 승인 정책과 모드를 적용합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.autoBackground.enabled",category:"tools",group:"Bash",label:{en:"Bash Auto-Background",ko:"Bash 자동 백그라운드 실행"},description:{en:"Automatically background long-running bash commands and deliver the result later",ko:"오래 실행되는 bash 명령을 자동으로 백그라운드에서 실행하고 결과를 나중에 전달합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.autoBackground.thresholdMs",category:"tools",group:"Bash",label:{en:"Threshold Ms",ko:"임곗값(ms)"},description:{en:"Threshold in milliseconds for automatically backgrounding Bash execution.",ko:"Bash 실행을 자동으로 백그라운드 처리하기 위한 임계값(밀리초)입니다."},kind:"number",scope:"both",defaultValue:6e4,integer:!0,admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.direnv",category:"tools",group:"Bash",label:{en:"direnv Auto-Load",ko:"direnv 자동 로드"},description:{en:"Auto-load a repo's direnv/devenv `.envrc` into the bash session so devenv tools and env vars are present without manual `direnv exec`. Honors direnv's allow list: an `.envrc` you haven't `direnv allow`ed is never executed",ko:"저장소의 direnv/devenv `.envrc`를 bash 세션에 자동으로 로드하여 수동 `direnv exec` 없이 devenv 도구와 환경 변수를 사용합니다. direnv 허용 목록을 따르므로 `direnv allow`하지 않은 `.envrc`는 실행되지 않습니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","off"],admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.direnvLoadTimeoutMs",category:"tools",group:"Bash",label:{en:"direnv Load Timeout (ms)",ko:"direnv 로드 제한 시간(ms)"},description:{en:"Max wait for the first `direnv export` (a cold devenv shell can be slow); on timeout the session runs without the direnv env",ko:"첫 `direnv export`를 기다리는 최대 시간입니다(초기 devenv 셸은 느릴 수 있음). 시간 초과 시 direnv 환경 없이 세션을 실행합니다."},kind:"number",scope:"both",defaultValue:3e4,integer:!0,admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.enabled",category:"tools",group:"Bash",label:{en:"Bash",ko:"Bash"},description:{en:"Enable the bash tool for shell command execution",ko:"셸 명령 실행을 위한 bash 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"bash.patterns",category:"tools",group:"Bash",label:{en:"Bash Approval Patterns",ko:"Bash 승인 패턴"},description:{en:"Ordered bash command approval rules. Each item has match and approval fields; only '*' wildcards are supported.",ko:"순서대로 적용되는 bash 명령 승인 규칙입니다. 각 항목에는 match와 approval 필드가 있으며, '*' 와일드카드만 지원됩니다."},kind:"array",scope:"both",defaultValue:[],items:"object",admin:!0,confirmation:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bashInterceptor.enabled",category:"tools",group:"Bash",label:{en:"Bash Interceptor",ko:"Bash 인터셉터"},description:{en:"Block shell commands that have dedicated tools",ko:"전용 도구가 있는 셸 명령을 차단합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"shellMinimizer.enabled",category:"tools",group:"Bash",label:{en:"Shell Minimizer",ko:"셸 출력 최소화"},description:{en:"Compress verbose shell output (git, npm, cargo, etc.) before returning it to the agent",ko:"에이전트에 반환하기 전에 상세한 셸 출력(git, npm, cargo 등)을 압축합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0},{path:"shellMinimizer.sourceOutlineLevel",category:"tools",group:"Bash",label:{en:"Shell Minimizer Source Outline",ko:"셸 최소화 소스 개요"},description:{en:"Source outline mode for cat/read of source files: default or aggressive",ko:"소스 파일을 cat/read할 때 사용할 소스 개요 모드: default 또는 aggressive"},kind:"enum",scope:"both",defaultValue:"default",choices:["default","aggressive"],admin:!0},{path:"bashInterceptor.patterns",category:"tools",group:"Bash Interceptor",label:{en:"Patterns",ko:"패턴"},description:{en:"Patterns used by the Bash interceptor, with the corresponding tool and message for each pattern.",ko:"Bash 인터셉터가 사용하는 패턴과 각 패턴에 대응하는 도구 및 메시지입니다."},kind:"array",scope:"both",defaultValue:[{pattern:"^\\s*(cat|head|tail|less|more)\\s+",tool:"read",message:"Use the `read` tool instead of cat/head/tail. It provides better context and handles binary files."},{pattern:"^\\s*(grep|rg|ripgrep|ag|ack)\\s+",tool:"grep",message:"Use the `grep` tool instead of grep/rg. It respects .gitignore and provides structured output."},{pattern:"^\\s*(find|fd|locate)\\s+.*(-name|-iname|-type|--type|-glob)",tool:"glob",message:"Use the `glob` tool instead of find/fd. It respects .gitignore and is faster for glob patterns."},{pattern:"^\\s*sed\\s+(-i|--in-place)",tool:"edit",message:"Use the `edit` tool instead of sed -i. It provides diff preview and fuzzy matching."},{pattern:"^\\s*perl\\s+.*-[pn]?i",tool:"edit",message:"Use the `edit` tool instead of perl -i. It provides diff preview and fuzzy matching."},{pattern:"^\\s*awk\\s+.*-i\\s+inplace",tool:"edit",message:"Use the `edit` tool instead of awk -i inplace. It provides diff preview and fuzzy matching."},{pattern:"^\\s*(echo|printf|cat\\s*<<)\\s+(?:(?:[^\"'>]|\"[^\"]*\"|'[^']*')|(?<!\\|)>{1,2}\\|?\\s*(?:\"/dev/(?:null|tty|stdout|stderr)\"|'/dev/(?:null|tty|stdout|stderr)'|/dev/(?:null|tty|stdout|stderr))(?:[\\s;&|]|$))*(?<!\\|)>{1,2}\\|?\\s*(?!(?:\"/dev/(?:null|tty|stdout|stderr)\"|'/dev/(?:null|tty|stdout|stderr)'|/dev/(?:null|tty|stdout|stderr))(?:[\\s;&|]|$))[$\\w./~\"'-]",tool:"write",message:"Use the `write` tool instead of echo/cat redirection. It handles encoding and provides confirmation."},{pattern:"^\\s*nohup\\s+|(?<!&)\\&\\s*$",tool:"hub",message:'Use the `hub` tool (`op:"start"`) instead of nohup or background shell syntax so the process stays observable and managed.'},{pattern:"^\\s*(?:(?:bun|npm|pnpm|yarn)\\s+(?:run\\s+)?(?:dev|start)(?:\\s|$)|(?:vite|next\\s+dev|nuxt\\s+dev|nodemon|lldb|gdb|tail\\s+-f)(?:\\s|$)|docker\\s+compose\\s+up(?!.*(?:\\s-d(?:\\s|$)|--detach))(?:\\s|$))",tool:"hub",message:'Use the `hub` tool (`op:"start"`) for services, watchers, and debuggers so other omp instances can observe and control them.'},{pattern:"^\\s*(?:(?:bun|npm|pnpm|yarn)\\s+(?:run\\s+)?\\S+|cargo\\s+watch|watchexec|pytest|vitest|jest|tsc)(?:.|\\n)*(?:--watch|-w)(?:\\s|$)",tool:"hub",message:'Use the `hub` tool (`op:"start"`) for watch mode so its output, input, and lifecycle stay managed.'}],items:"object",admin:!0,confirmation:!0},{path:"browser.cdpUrl",category:"tools",group:"Grep & Browser",label:{en:"Browser CDP URL",ko:"브라우저 CDP URL"},description:{en:"Default HTTP CDP discovery endpoint (for example http://127.0.0.1:9222) to attach to instead of launching a browser. Explicit app.cdp_url or app.path on the tool call take precedence.",ko:"브라우저를 실행하는 대신 연결할 기본 HTTP CDP 검색 엔드포인트입니다(예: http://127.0.0.1:9222). 도구 호출에 명시된 app.cdp_url 또는 app.path가 우선합니다."},kind:"string",scope:"both",admin:!0,confirmation:!0,appliesTo:{en:"Applies when Browser Relay is off; attaches to the configured CDP host instead of launching Chromium.",ko:"브라우저 릴레이가 꺼져 있을 때 적용되며 Chromium을 실행하는 대신 설정된 CDP 호스트에 연결합니다."}},{path:"browser.freezeOnTurnEnd",category:"tools",group:"Grep & Browser",label:{en:"Freeze Browser Tabs On Turn End",ko:"턴 종료 시 브라우저 탭 정지"},description:{en:"Freeze OMP-owned headless browser tabs when a turn settles so animated pages stop burning CPU/GPU while idle. Tabs unfreeze automatically on next use; pass persist:true on open to opt a tab out.",ko:"턴이 완료되면 OMP 소유의 헤드리스 브라우저 탭을 정지하여 유휴 상태에서 애니메이션 페이지가 CPU/GPU를 소모하지 않게 합니다. 다음 사용 시 자동으로 재개되며, open에 persist:true를 전달하면 해당 탭을 제외할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,appliesTo:{en:"Applies only to OMP-launched headless browser tabs.",ko:"OMP가 실행한 헤드리스 브라우저 탭에만 적용됩니다."}},{path:"browser.headless",category:"tools",group:"Grep & Browser",label:{en:"Headless Browser",ko:"헤드리스 브라우저"},description:{en:"Launch browser in headless mode (disable to show browser UI)",ko:"브라우저를 헤드리스 모드로 실행합니다(브라우저 UI를 표시하려면 비활성화)."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies only when OMP launches Chromium itself.",ko:"OMP가 Chromium을 직접 실행할 때만 적용됩니다."}},{path:"browser.idleCloseSec",category:"tools",group:"Grep & Browser",label:{en:"Browser Idle Close Timeout",ko:"브라우저 유휴 종료 시간"},description:{en:"Close OMP-owned headless browser tabs idle longer than this many seconds (0 = never; session dispose still reaps). Applies only to OMP-launched headless tabs, never relay/CDP/spawned browsers or other sessions' tabs.",ko:"지정한 초보다 오래 유휴 상태인 OMP 소유의 헤드리스 브라우저 탭을 닫습니다(0 = 닫지 않음, 세션 폐기 시에는 정리됨). OMP가 실행한 헤드리스 탭에만 적용되며 relay/CDP/별도 생성 브라우저나 다른 세션의 탭에는 적용되지 않습니다."},kind:"number",scope:"both",defaultValue:1800,admin:!0,appliesTo:{en:"Applies only to OMP-launched headless browser tabs.",ko:"OMP가 실행한 헤드리스 브라우저 탭에만 적용됩니다."}},{path:"browser.relay",category:"tools",group:"Grep & Browser",label:{en:"Browser Relay",ko:"브라우저 릴레이"},description:{en:"Drive your own Chrome tabs through the omp browser relay. Install the extension once (`omp browser-relay install`); the relay server auto-starts when the browser prelude needs it. Takes precedence over Browser CDP URL; set PI_BROWSER_RELAY=0 or PI_BROWSER_RELAY=1 to override.",ko:"omp 브라우저 릴레이를 통해 사용자의 Chrome 탭을 제어합니다. 확장 프로그램을 한 번 설치하세요(`omp browser-relay install`). 브라우저 프렐류드에서 필요할 때 릴레이 서버가 자동으로 시작됩니다. 브라우저 CDP URL보다 우선하며, PI_BROWSER_RELAY=0 또는 PI_BROWSER_RELAY=1로 재정의할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0,appliesTo:{en:"Applies to browser automation and takes precedence over Browser CDP URL.",ko:"브라우저 자동화에 적용되며 브라우저 CDP URL보다 우선합니다."}},{path:"browser.relayUrl",category:"tools",group:"Grep & Browser",label:{en:"Browser Relay URL",ko:"브라우저 릴레이 URL"},description:{en:"omp browser relay endpoint (default http://127.0.0.1:9224).",ko:"omp 브라우저 릴레이 엔드포인트입니다(기본값 http://127.0.0.1:9224)."},kind:"string",scope:"both",admin:!0,confirmation:!0,appliesTo:{en:"Applies when Browser Relay is enabled.",ko:"브라우저 릴레이가 활성화된 경우 적용됩니다."}},{path:"browser.screenshotDir",category:"tools",group:"Grep & Browser",label:{en:"Screenshot Directory",ko:"스크린샷 디렉터리"},description:{en:"Directory to save screenshots. If unset, screenshots go to a temp file. Supports ~. Examples: ~/Downloads, ~/Desktop, /sdcard/Download (Android)",ko:"스크린샷을 저장할 디렉터리입니다. 설정하지 않으면 임시 파일에 저장됩니다. ~를 지원합니다. 예: ~/Downloads, ~/Desktop, /sdcard/Download (Android)"},kind:"string",scope:"both",admin:!0,appliesTo:{en:"Applies to browser.enabled.",ko:"browser.enabled에 적용됩니다."}},{path:"computer.display",category:"tools",group:"Computer",label:{en:"Computer Display",ko:"컴퓨터 디스플레이"},description:{en:"Composite all displays or select a native display id",ko:"모든 디스플레이를 합성하거나 네이티브 디스플레이 id를 선택합니다."},kind:"string",scope:"both",defaultValue:"all",admin:!0,confirmation:!0,appliesTo:{en:"Applies to computer.enabled.",ko:"computer.enabled에 적용됩니다."}},{path:"computer.maxHeight",category:"tools",group:"Computer",label:{en:"Computer Screenshot Height",ko:"컴퓨터 스크린샷 높이"},description:{en:"Maximum composite screenshot height in pixels",ko:"합성 스크린샷의 최대 높이(픽셀)"},kind:"number",scope:"both",defaultValue:2400,integer:!0,admin:!0,appliesTo:{en:"Applies to computer.enabled.",ko:"computer.enabled에 적용됩니다."}},{path:"computer.maxWidth",category:"tools",group:"Computer",label:{en:"Computer Screenshot Width",ko:"컴퓨터 스크린샷 너비"},description:{en:"Maximum composite screenshot width in pixels",ko:"합성 스크린샷의 최대 너비(픽셀)"},kind:"number",scope:"both",defaultValue:3840,integer:!0,admin:!0,appliesTo:{en:"Applies to computer.enabled.",ko:"computer.enabled에 적용됩니다."}},{path:"edit.autoRepair.enabled",category:"tools",group:"Editing",label:{en:"Auto-Repair Parse Regressions",ko:"구문 분석 오류 자동 복구"},description:{en:"When an edit breaks a file's AST parse, ask the smol model to fix the broken region (validated by re-parse; falls back to a warning)",ko:"편집으로 파일의 AST 구문 분석이 깨지면 smol 모델에 손상된 영역의 수정을 요청합니다(재분석으로 검증하며, 실패 시 경고로 대체)."},kind:"boolean",scope:"both",defaultValue:!1},{path:"edit.blockAutoGenerated",category:"tools",group:"Editing",label:{en:"Block Auto-Generated Files",ko:"자동 생성 파일 차단"},description:{en:"Prevent editing of files that appear to be auto-generated (protoc, sqlc, swagger, etc.)",ko:"자동 생성된 것으로 보이는 파일(protoc, sqlc, swagger 등)의 편집을 방지합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"edit.enforceSeenLines",category:"tools",group:"Editing",label:{en:"Enforce Seen-Line Guard",ko:"확인된 줄 보호 적용"},description:{en:"Reject edits anchored on lines a prior read/search never displayed in full",ko:"이전 읽기/검색에서 전체가 표시되지 않은 줄을 기준으로 한 편집을 거부합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"edit.fuzzyMatch",category:"tools",group:"Editing",label:{en:"Fuzzy Match",ko:"퍼지 일치"},description:{en:"Accept high-confidence fuzzy matches for whitespace differences",ko:"공백 차이에 대해 신뢰도가 높은 퍼지 일치를 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"edit.fuzzyThreshold",category:"tools",group:"Editing",label:{en:"Fuzzy Match Threshold",ko:"퍼지 일치 임계값"},description:{en:"Similarity threshold (0-1) for accepting fuzzy matches",ko:"퍼지 일치를 허용할 유사도 임계값(0-1)"},kind:"number",scope:"both",defaultValue:.95,integer:!1,min:0,max:1,step:.01},{path:"edit.mode",category:"tools",group:"Editing",label:{en:"Edit Mode",ko:"편집 모드"},description:{en:"Select the edit tool variant (replace, patch, hashline, or apply_patch)",ko:"편집 도구 변형을 선택합니다(replace, patch, hashline 또는 apply_patch)."},kind:"enum",scope:"both",defaultValue:"hashline",choices:["apply_patch","hashline","patch","replace","sloppy"]},{path:"eval.autoBackground.enabled",category:"tools",group:"Eval & Runtimes",label:{en:"Eval Auto-Background",ko:"Eval 자동 백그라운드"},description:{en:"Automatically background long-running eval cells and deliver the result later",ko:"오래 실행되는 eval 셀을 자동으로 백그라운드로 전환하고 결과를 나중에 전달합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"eval.js",category:"tools",group:"Eval & Runtimes",label:{en:"JavaScript Eval Backend",ko:"JavaScript Eval 백엔드"},description:{en:"Allow the eval tool to dispatch JavaScript cells to the in-process runtime",ko:"eval 도구가 JavaScript 셀을 인프로세스 런타임으로 전달하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"eval.py",category:"tools",group:"Eval & Runtimes",label:{en:"Python Eval Backend",ko:"Python Eval 백엔드"},description:{en:"Allow the eval tool to dispatch Python cells to the IPython kernel",ko:"eval 도구가 Python 셀을 IPython 커널로 전달하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"eval.tools.enabled",category:"tools",group:"Eval & Runtimes",label:{en:"Eval-Defined Tools",ko:"Eval 정의 도구"},description:{en:"Let eval cells define tools (@tool in Python, tool(fn) in JS) that task, agent(), and workpool() subagents can call",ko:"eval 셀이 task, agent(), workpool() 하위 에이전트에서 호출할 수 있는 도구(Python의 @tool, JS의 tool(fn))를 정의하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"eval.workpool.freshAgents",category:"tools",group:"Eval & Runtimes",label:{en:"Fresh Workpool Agents",ko:"새 Workpool 에이전트"},description:{en:"Spawn a new subagent for every workpool item instead of reusing workers or batching queued items",ko:"워커를 재사용하거나 대기 항목을 일괄 처리하는 대신 각 workpool 항목마다 새 하위 에이전트를 생성합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"python.interpreter",category:"tools",group:"Eval & Runtimes",label:{en:"Python Interpreter",ko:"Python 인터프리터"},description:{en:"Optional path to an exact Python executable. When set, automatic Python runtime discovery is skipped.",ko:"정확한 Python 실행 파일의 선택적 경로입니다. 설정하면 Python 런타임 자동 검색을 건너뜁니다."},kind:"string",scope:"both",defaultValue:"",admin:!0,confirmation:!0},{path:"python.kernelMode",category:"tools",group:"Eval & Runtimes",label:{en:"Python Kernel Mode",ko:"Python 커널 모드"},description:{en:"Keep the IPython kernel alive across eval calls or start fresh each time",ko:"eval 호출 간에 IPython 커널을 유지하거나 매번 새로 시작합니다."},kind:"enum",scope:"both",defaultValue:"session",choices:["session","per-call"]},{path:"eval.autoBackground.thresholdMs",category:"tools",group:"Eval",label:{en:"Threshold Ms",ko:"임계값 Ms"},description:{en:"Threshold in milliseconds for automatically backgrounding evaluation.",ko:"평가를 자동으로 백그라운드 처리하기 위한 임계값(밀리초)입니다."},kind:"number",scope:"both",defaultValue:6e4,integer:!0,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"exa.enabled",category:"tools",group:"Services",label:{en:"Exa",ko:"Exa"},description:{en:"Enable the Exa web search provider",ko:"Exa 웹 검색 제공자를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"exa.searchDelayMs",category:"tools",group:"Services",label:{en:"Exa Search Delay",ko:"Exa 검색 지연"},description:{en:"Minimum delay between Exa web search requests in milliseconds; set 0 to disable pacing",ko:"Exa 웹 검색 요청 사이의 최소 지연 시간(밀리초)입니다. 속도 제한을 비활성화하려면 0으로 설정하세요."},kind:"number",scope:"both",defaultValue:1e3,integer:!0},{path:"searxng.endpoint",category:"tools",group:"Services",label:{en:"SearXNG Endpoint",ko:"SearXNG 엔드포인트"},description:{en:"Base URL of a self-hosted SearXNG instance used for web search",ko:"웹 검색에 사용할 자체 호스팅 SearXNG 인스턴스의 기본 URL입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0},{path:"lsp.diagnosticsDeduplicate",category:"tools",group:"LSP",label:{en:"Deduplicate Diagnostics",ko:"진단 중복 제거"},description:{en:"Suppress post-edit LSP diagnostics already shown for a file; only surface new or changed ones",ko:"파일에 대해 이미 표시된 편집 후 LSP 진단을 숨기고 새 항목이나 변경된 항목만 표시합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.diagnosticsOnEdit",category:"tools",group:"LSP",label:{en:"Diagnostics on Edit",ko:"편집 시 진단"},description:{en:"Return LSP diagnostics after editing code files",ko:"코드 파일을 편집한 후 LSP 진단을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"lsp.diagnosticsOnWrite",category:"tools",group:"LSP",label:{en:"Diagnostics on Write",ko:"쓰기 시 진단"},description:{en:"Return LSP diagnostics after writing code files",ko:"코드 파일을 쓴 후 LSP 진단을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.enabled",category:"tools",group:"LSP",label:{en:"LSP",ko:"LSP"},description:{en:"Enable the lsp tool for code intelligence (definitions, references, diagnostics, rename)",ko:"코드 인텔리전스(정의, 참조, 진단, 이름 변경)를 위한 lsp 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.formatOnWrite",category:"tools",group:"LSP",label:{en:"Format on Write",ko:"쓰기 시 포맷"},description:{en:"Automatically format code files using LSP after writing",ko:"코드 파일을 쓴 후 LSP를 사용해 자동으로 포맷합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"lsp.lazy",category:"tools",group:"LSP",label:{en:"Lazy LSP Startup",ko:"지연 LSP 시작"},description:{en:"Start language servers on first use (lsp tool or editing a matching file type) instead of at session startup",ko:"세션 시작 시가 아니라 처음 사용할 때(lsp 도구 사용 또는 일치하는 파일 형식 편집 시) 언어 서버를 시작합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.shared",category:"tools",group:"LSP",label:{en:"Shared Language Servers",ko:"공유 언어 서버"},description:{en:"Share one language server per project across omp instances via the daemon broker (falls back to private servers when unavailable)",ko:"데몬 브로커를 통해 여러 omp 인스턴스가 프로젝트당 하나의 언어 서버를 공유합니다(사용할 수 없으면 전용 서버로 대체)."},kind:"boolean",scope:"both",defaultValue:!0},{path:"read.defaultLimit",category:"tools",group:"Reading",label:{en:"Default Read Limit",ko:"기본 읽기 한도"},description:{en:"Default number of lines returned when agent calls read without a limit",ko:"에이전트가 한도를 지정하지 않고 read를 호출할 때 반환할 기본 줄 수입니다."},kind:"number",scope:"both",defaultValue:300,integer:!0},{path:"read.summarize.enabled",category:"tools",group:"Read Summaries",label:{en:"Read Summaries",ko:"읽기 요약"},description:{en:"Return structural code summaries when read is called without an explicit selector",ko:"명시적인 선택자 없이 read를 호출하면 구조화된 코드 요약을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"read.summarize.minBodyLines",category:"tools",group:"Read Summaries",label:{en:"Read Summary Body Lines",ko:"읽기 요약 본문 줄 수"},description:{en:"Minimum multiline body or literal length before read summaries collapse it",ko:"읽기 요약에서 여러 줄 본문 또는 리터럴을 접기 위한 최소 길이입니다."},kind:"number",scope:"both",defaultValue:4,integer:!0},{path:"read.summarize.minCommentLines",category:"tools",group:"Read Summaries",label:{en:"Read Summary Comment Lines",ko:"읽기 요약 주석 줄 수"},description:{en:"Minimum multiline block comment length before read summaries collapse it",ko:"읽기 요약에서 여러 줄 블록 주석을 접기 위한 최소 길이입니다."},kind:"number",scope:"both",defaultValue:6,integer:!0},{path:"read.summarize.minTotalLines",category:"tools",group:"Read Summaries",label:{en:"Read Summary Minimum File Length",ko:"읽기 요약 최소 파일 길이"},description:{en:"Files with fewer total lines are read verbatim instead of structurally summarized",ko:"전체 줄 수가 이 값보다 적은 파일은 구조적으로 요약하지 않고 원문 그대로 읽습니다."},kind:"number",scope:"both",defaultValue:100,integer:!0},{path:"read.summarize.prose",category:"tools",group:"Read Summaries",label:{en:"Prose Summaries",ko:"본문 요약"},description:{en:"Return structural summaries for Markdown and plain text reads",ko:"Markdown 및 일반 텍스트를 읽을 때 구조화된 요약을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"read.summarize.unfoldLimit",category:"tools",group:"Read Summaries",label:{en:"Read Summary Unfold Ceiling",ko:"읽기 요약 펼치기 상한"},description:{en:"Hard ceiling on summary size while BFS-unfolding. An unfold whose revealed lines would exceed this is skipped (that span stays folded) and unfolding continues with the remaining spans.",ko:"BFS 방식으로 펼칠 때의 요약 크기 상한입니다. 펼쳐서 표시되는 줄이 이 값을 초과하면 해당 범위는 접힌 상태로 건너뛰고 나머지 범위를 계속 펼칩니다."},kind:"number",scope:"both",defaultValue:100,integer:!0},{path:"read.summarize.unfoldUntil",category:"tools",group:"Read Summaries",label:{en:"Read Summary Unfold Target",ko:"읽기 요약 펼치기 목표"},description:{en:"BFS-unfold elidable spans until the summary is at least this many visible lines. 0 keeps only the outermost elisions.",ko:"요약의 표시 줄 수가 최소한 이 값에 도달할 때까지 생략 가능한 범위를 BFS 방식으로 펼칩니다. 0은 가장 바깥쪽 생략만 유지합니다."},kind:"number",scope:"both",defaultValue:50,integer:!0},{path:"searxng.basicPassword",category:"tools",group:"Searxng",label:{en:"Basic Password",ko:"기본 인증 비밀번호"},description:{en:"Configures the password credential for SearXNG basic authentication.",ko:"SearXNG 기본 인증의 비밀번호 자격 증명을 구성합니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0},{path:"searxng.basicUsername",category:"tools",group:"Searxng",label:{en:"Basic Username",ko:"기본 인증 사용자 이름"},description:{en:"Configures the username credential for SearXNG basic authentication.",ko:"SearXNG 기본 인증의 사용자 이름 자격 증명을 구성합니다."},kind:"string",scope:"both"},{path:"searxng.categories",category:"tools",group:"Searxng",label:{en:"Categories",ko:"카테고리"},description:{en:"Sets the SearXNG search categories.",ko:"SearXNG 검색 카테고리를 설정합니다."},kind:"string",scope:"both"},{path:"searxng.engines",category:"tools",group:"Searxng",label:{en:"Engines",ko:"검색 엔진"},description:{en:"Sets the SearXNG search engines.",ko:"SearXNG 검색 엔진을 설정합니다."},kind:"string",scope:"both"},{path:"searxng.language",category:"tools",group:"Searxng",label:{en:"Language",ko:"언어"},description:{en:"Sets the SearXNG search language.",ko:"SearXNG 검색 언어를 설정합니다."},kind:"string",scope:"both"},{path:"searxng.safesearch",category:"tools",group:"Searxng",label:{en:"Safe Search",ko:"안전 검색"},description:{en:"SearXNG safe-search level: 0 is off, 1 is moderate, and 2 is strict.",ko:"SearXNG 안전 검색 수준입니다. 0은 끄기, 1은 보통, 2는 엄격입니다."},kind:"number",scope:"both",integer:!0,min:0,max:2,step:1},{path:"searxng.token",category:"tools",group:"Searxng",label:{en:"Token",ko:"토큰"},description:{en:"Configures the SearXNG token credential.",ko:"SearXNG 토큰 자격 증명을 구성합니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0},{path:"shellMinimizer.except",category:"tools",group:"Shell Minimizer",label:{en:"Except",ko:"제외 항목"},description:{en:"Sets the shell minimizer exception list.",ko:"셸 최소화 도구의 예외 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string",admin:!0},{path:"shellMinimizer.maxCaptureBytes",category:"tools",group:"Shell Minimizer",label:{en:"Max Capture Bytes",ko:"최대 캡처 바이트"},description:{en:"Sets the maximum shell minimizer capture size in bytes.",ko:"셸 최소화 도구의 최대 캡처 크기를 바이트 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:4194304,integer:!0,admin:!0},{path:"shellMinimizer.only",category:"tools",group:"Shell Minimizer",label:{en:"Only",ko:"적용 대상"},description:{en:"Sets the shell minimizer inclusion-only list.",ko:"셸 최소화 도구의 전용 포함 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string",admin:!0},{path:"skills.customDirectories",category:"tools",group:"Skills",label:{en:"Custom Directories",ko:"사용자 지정 디렉터리"},description:{en:"Sets the custom skill directories.",ko:"사용자 지정 스킬 디렉터리를 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"skills.enableAgentsProject",category:"tools",group:"Skills",label:{en:"Enable Agents Project",ko:"Agents 프로젝트 활성화"},description:{en:"Enables the Agents project skill source.",ko:"Agents 프로젝트 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enableAgentsUser",category:"tools",group:"Skills",label:{en:"Enable Agents User",ko:"Agents 사용자 활성화"},description:{en:"Enables the Agents user skill source.",ko:"Agents 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enableClaudeProject",category:"tools",group:"Skills",label:{en:"Enable Claude Project",ko:"Claude 프로젝트 활성화"},description:{en:"Enables the Claude project skill source.",ko:"Claude 프로젝트 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enableClaudeUser",category:"tools",group:"Skills",label:{en:"Enable Claude User",ko:"Claude 사용자 활성화"},description:{en:"Enables the Claude user skill source.",ko:"Claude 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"skills.enableCodexUser",category:"tools",group:"Skills",label:{en:"Enable Codex User",ko:"Codex 사용자 활성화"},description:{en:"Enables the Codex user skill source.",ko:"Codex 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"skills.enablePiProject",category:"tools",group:"Skills",label:{en:"Enable Pi Project",ko:"Pi 프로젝트 활성화"},description:{en:"Enables the Pi project skill source.",ko:"Pi 프로젝트 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enablePiUser",category:"tools",group:"Skills",label:{en:"Enable Pi User",ko:"Pi 사용자 활성화"},description:{en:"Enables the Pi user skill source.",ko:"Pi 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enabled",category:"tools",group:"Skills",label:{en:"Enabled",ko:"활성화"},description:{en:"Enables skill support.",ko:"스킬 지원을 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.ignoredSkills",category:"tools",group:"Skills",label:{en:"Ignored Skills",ko:"무시할 스킬"},description:{en:"Sets the list of ignored skills.",ko:"무시할 스킬 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"skills.includeSkills",category:"tools",group:"Skills",label:{en:"Include Skills",ko:"포함할 스킬"},description:{en:"Sets the list of included skills.",ko:"포함할 스킬 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"skills.enableSkillCommands",category:"tools",group:"Commands & Skills",label:{en:"Skill Commands",ko:"스킬 명령어"},description:{en:"Register skills as /skill:name commands",ko:"스킬을 /skill:name 명령어로 등록합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.approval",category:"tools",group:"Approvals",label:{en:"Tool Approval Policies",ko:"도구 승인 정책"},description:{en:"Per-tool approval policies. Set to 'allow' to auto-approve, 'prompt' to require confirmation, or 'deny' to block. Overrides are honored in every approval mode.",ko:"도구별 승인 정책입니다. 자동 승인하려면 'allow', 확인을 요구하려면 'prompt', 차단하려면 'deny'로 설정합니다. 재정의는 모든 승인 모드에서 적용됩니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"approval",admin:!0,confirmation:!0},{path:"tools.approvalMode",category:"tools",group:"Approvals",label:{en:"Tool Approval",ko:"도구 승인"},description:{en:"Default approval behavior for tool calls. 'Always ask' auto-approves read-only tools only. 'Write' auto-approves read and workspace-write tools. 'Yolo' auto-approves all tiers; user policy may still prompt or block.",ko:"도구 호출의 기본 승인 동작입니다. 'Always ask'는 읽기 전용 도구만 자동 승인합니다. 'Write'는 읽기 및 워크스페이스 쓰기 도구를 자동 승인합니다. 'Yolo'는 모든 티어를 자동 승인하지만 사용자 정책에 따라 확인하거나 차단할 수 있습니다."},kind:"enum",scope:"both",defaultValue:"yolo",choices:["always-ask","write","yolo"],admin:!0,confirmation:!0},{path:"tools.artifactHeadBytes",category:"tools",group:"Output Limits",label:{en:"Artifact Head Size (KB)",ko:"아티팩트 앞부분 크기(KB)"},description:{en:"Amount of head content kept inline alongside the tail when output spills to artifact (middle elision). 0 disables — keep tail only.",ko:"출력이 아티팩트로 넘쳐 저장될 때 끝부분과 함께 인라인으로 유지할 앞부분 콘텐츠의 양입니다(중간 생략). 0이면 비활성화되어 끝부분만 유지합니다."},kind:"number",scope:"both",defaultValue:20,integer:!0},{path:"tools.artifactSpillThreshold",category:"tools",group:"Output Limits",label:{en:"Artifact Spill Threshold (KB)",ko:"아티팩트 분리 저장 임계값(KB)"},description:{en:"Tool output above this size is saved as an artifact; tail is kept inline",ko:"이 크기를 초과하는 도구 출력은 아티팩트로 저장하고 끝부분은 인라인으로 유지합니다."},kind:"number",scope:"both",defaultValue:50,integer:!0},{path:"tools.artifactTailBytes",category:"tools",group:"Output Limits",label:{en:"Artifact Tail Size (KB)",ko:"아티팩트 끝부분 크기(KB)"},description:{en:"Amount of tail content kept inline when output spills to artifact",ko:"출력이 아티팩트로 넘쳐 저장될 때 인라인으로 유지할 끝부분 콘텐츠의 양"},kind:"number",scope:"both",defaultValue:20,integer:!0},{path:"tools.format",category:"tools",group:"Experimental",label:{en:"Tool Calling Mode",ko:"도구 호출 모드"},description:{en:"Controls how tools are exposed to the model. Auto uses provider-native tool calls unless the selected model is marked as not supporting them, then falls back to the GLM owned dialect. Native forces provider-native tools; the other values force the named owned dialect. Applies on session start.",ko:"도구가 모델에 제공되는 방식을 제어합니다. Auto는 선택한 모델이 지원하지 않는 것으로 표시되지 않는 한 제공자 네이티브 도구 호출을 사용하며, 지원하지 않으면 GLM 자체 관리 방언으로 대체합니다. Native는 제공자 네이티브 도구를 강제하고, 다른 값은 해당 이름의 자체 관리 방언을 강제합니다. 세션 시작 시 적용됩니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","native","glm","hermes","kimi","xml","anthropic","deepseek","harmony","qwen3","gemini","gemma","minimax"]},{path:"tools.xdev",category:"tools",group:"Discovery & MCP",label:{en:"xd:// Tools",ko:"xd:// 도구"},description:{en:"Mount rarely-used (discoverable) tools under xd:// device URLs driven via read/write instead of shipping their schemas on every request. Sessions whose explicit tool list grants read but omits write mount devices through a device-only write transport (filesystem writes stay rejected). Disable to expose every enabled tool top-level.",ko:"자주 사용하지 않는 검색 가능 도구를 요청마다 스키마로 전송하는 대신 read/write로 구동되는 xd:// 장치 URL 아래에 마운트합니다. 명시적 도구 목록에서 read는 허용하지만 write는 제외한 세션은 장치 전용 쓰기 전송을 통해 장치를 마운트합니다(파일 시스템 쓰기는 계속 거부됨). 비활성화하면 활성화된 모든 도구를 최상위에 노출합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.xdevDocs",category:"tools",group:"Discovery & MCP",label:{en:"xd:// Prompt Docs",ko:"xd:// 프롬프트 문서"},description:{en:"Choose which mounted-device docs and schemas are inlined in the system prompt. Built-ins keeps core tools inline while MCP and extension tools stay on-demand.",ko:"시스템 프롬프트에 인라인으로 포함할 마운트된 장치 문서와 스키마를 선택합니다. Built-ins는 핵심 도구를 인라인으로 유지하고 MCP 및 확장 도구는 필요할 때만 제공합니다."},kind:"enum",scope:"both",defaultValue:"builtins",choices:["inline","builtins","catalog"]},{path:"tools.xdevInlineDevices",category:"tools",group:"Discovery & MCP",label:{en:"xd:// Inline Devices",ko:"xd:// 인라인 장치"},description:{en:"When xd:// Prompt Docs is Built-ins Only, inline dynamic devices whose names match these glob patterns (for example mcp__context_mode_*). Catalog Only ignores this setting.",ko:"xd:// Prompt Docs가 Built-ins Only일 때 이름이 이 glob 패턴과 일치하는 동적 장치를 인라인으로 포함합니다(예: mcp__context_mode_*). Catalog Only에서는 이 설정을 무시합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"ttsr.builtinRules",category:"tools",group:"Rules (TTSR)",label:{en:"Built-in Rules",ko:"기본 제공 규칙"},description:{en:"Load the default rules shipped with the agent (override individually with ttsr.disabledRules)",ko:"에이전트와 함께 제공되는 기본 규칙을 불러옵니다(ttsr.disabledRules로 개별 재정의)."},kind:"boolean",scope:"both",defaultValue:!0},{path:"ttsr.contextMode",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Context Mode",ko:"TTSR 컨텍스트 모드"},description:{en:"What to do with partial output when TTSR triggers",ko:"TTSR이 트리거될 때 부분 출력을 처리하는 방식"},kind:"enum",scope:"both",defaultValue:"discard",choices:["discard","keep"]},{path:"ttsr.disabledRules",category:"tools",group:"Rules (TTSR)",label:{en:"Disabled Rules",ko:"비활성화된 규칙"},description:{en:"Rule names to ignore entirely (applies to bundled defaults and your own rules)",ko:"완전히 무시할 규칙 이름(번들 기본 규칙과 사용자 규칙에 적용)"},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"ttsr.enabled",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR",ko:"TTSR"},description:{en:"Interrupt the agent mid-stream when output matches rule patterns (Time-Traveling Stream Rules)",ko:"출력이 규칙 패턴과 일치하면 스트리밍 도중 에이전트를 중단합니다(Time-Traveling Stream Rules)."},kind:"boolean",scope:"both",defaultValue:!0},{path:"ttsr.interruptMode",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Interrupt Mode",ko:"TTSR 중단 모드"},description:{en:"When to interrupt mid-stream vs inject warning after completion",ko:"스트리밍 도중 중단할 시점과 완료 후 경고를 삽입할 시점을 설정합니다."},kind:"enum",scope:"both",defaultValue:"always",choices:["never","prose-only","tool-only","always"]},{path:"ttsr.repeatGap",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Repeat Gap",ko:"TTSR 반복 간격"},description:{en:"Messages before a rule can trigger again",ko:"규칙이 다시 트리거되기 전에 필요한 메시지 수"},kind:"number",scope:"both",defaultValue:10,integer:!0},{path:"ttsr.repeatMode",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Repeat Mode",ko:"TTSR 반복 모드"},description:{en:"How rules can repeat: once per session or after a message gap",ko:"규칙 반복 방식: 세션당 한 번 또는 메시지 간격 후 반복"},kind:"enum",scope:"both",defaultValue:"once",choices:["once","after-gap"]},{path:"checkpoint.enabled",category:"safety",group:"Available Tools",label:{en:"Checkpoint/Rewind",ko:"체크포인트/되돌리기"},description:{en:"Enable the checkpoint and rewind tools for context checkpointing",ko:"컨텍스트 체크포인트를 위한 checkpoint 및 rewind 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"security.enabled",category:"safety",group:"Available Tools",label:{en:"Security",ko:"보안"},description:{en:"Enable OMP-native security scan planning, execution, and the read-only security:// resource namespace",ko:"OMP 네이티브 보안 검사의 계획 및 실행과 읽기 전용 security:// 리소스 네임스페이스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"codexResets.autoRedeem",category:"safety",group:"Services",label:{en:"Codex Auto-Redeem Saved Resets",ko:"저장된 Codex 리셋 자동 사용"},description:{en:"Spend saved Codex rate-limit resets automatically: restore an account blocked by an exhausted 5h or weekly window when a turn is stuck and no other account can take over, and salvage credits that are about to expire. unset asks before the first spend, yes spends without prompting, and no disables both checks.",ko:"저장된 Codex 사용량 제한 리셋을 자동으로 사용합니다. 턴이 멈추고 대신 사용할 계정이 없을 때 소진된 5h 또는 주간 제한으로 차단된 계정을 복원하고, 곧 만료될 크레딧을 회수합니다. unset은 처음 사용하기 전에 확인하고, yes는 확인 없이 사용하며, no는 두 검사를 모두 비활성화합니다."},kind:"enum",scope:"both",defaultValue:"unset",choices:["unset","yes","no"],admin:!0,confirmation:!0},{path:"codexResets.keepCredits",category:"safety",group:"Services",label:{en:"Codex Auto-Redeem Reserve",ko:"Codex 자동 사용 예비량"},description:{en:"Never auto-spend below this many saved resets (0 = the last credit may be spent automatically). Credits about to expire are exempt — a reserved credit that expires preserves nothing.",ko:"저장된 리셋이 지정한 개수 미만이 되도록 자동 사용하지 않습니다(0 = 마지막 크레딧도 자동 사용 가능). 곧 만료될 크레딧은 예외입니다. 만료되는 크레딧을 남겨 두어도 보존되지 않습니다."},kind:"number",scope:"both",defaultValue:0,integer:!0},{path:"codexResets.minBlockedMinutes",category:"safety",group:"Services",label:{en:"Codex Auto-Redeem Min Block",ko:"Codex 자동 사용 최소 차단 시간"},description:{en:"Only auto-redeem when the natural unblock — the latest reset among the exhausted 5h/weekly windows — is at least this many minutes away (don't spend a scarce credit to save a short wait). Raise it (e.g. 360) to ignore 5h-only blocks.",ko:"자연 해제 시점, 즉 소진된 5h/주간 제한 중 가장 늦은 리셋까지 지정한 분 이상 남은 경우에만 자동 사용합니다(짧은 대기 시간을 줄이려고 희소한 크레딧을 쓰지 않음). 5h 제한만 발생한 경우를 무시하려면 값을 높이세요(예: 360)."},kind:"number",scope:"both",defaultValue:60},{path:"codexResets.salvageHorizonHours",category:"safety",group:"Services",label:{en:"Codex Reset Salvage Horizon",ko:"Codex 리셋 회수 기한"},description:{en:"Spend a saved Codex reset automatically when it would otherwise expire within this many hours and either chat window (5h or weekly) has meaningful usage to restore (0 disables expiry salvage).",ko:"저장된 Codex 리셋이 지정한 시간 내에 만료될 예정이고 두 채팅 제한(5h 또는 주간) 중 하나에 복원할 만한 사용량이 있으면 자동으로 사용합니다(0은 만료 회수 비활성화)."},kind:"number",scope:"both",defaultValue:12},{path:"isolation.backend",category:"safety",group:"Isolation",label:{en:"Isolation Backend",ko:"격리 백엔드"},description:{en:"Backend used for subagent isolation and worktree cloning",ko:"하위 에이전트 격리 및 worktree 복제에 사용할 백엔드입니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","apfs","btrfs","zfs","reflink","overlayfs","projfs","block-clone","rcopy"],admin:!0,confirmation:!0},{path:"worktree.base",category:"safety",group:"Isolation",label:{en:"Worktree Base Directory",ko:"Worktree 기본 디렉터리"},description:{en:"Base directory for agent-managed worktrees — task-isolation copies, `github` PR checkouts, and `omp worktree` cleanup all live here. Unset uses ~/.omp/wt. Must be an absolute or ~-relative path; relative paths are ignored. The OMP_WORKTREE_DIR env var overrides this.",ko:"에이전트가 관리하는 worktree의 기본 디렉터리입니다. 작업 격리 복사본, `github` PR 체크아웃 및 `omp worktree` 정리가 모두 여기에 저장됩니다. 설정하지 않으면 ~/.omp/wt를 사용합니다. 절대 경로 또는 ~ 기준 경로여야 하며 상대 경로는 무시됩니다. OMP_WORKTREE_DIR 환경 변수가 이 설정을 재정의합니다."},kind:"string",scope:"both",admin:!0,confirmation:!0},{path:"worktree.clone",category:"safety",group:"Isolation",label:{en:"Clone Checkout into Worktrees",ko:"체크아웃을 Worktree로 복제"},description:{en:"New worktrees from `github pr_checkout` and `git worktree add` in bash start as a copy-on-write clone of the current checkout so ignored build artifacts (node_modules, target) carry over; falls back to a plain checkout when the filesystem cannot clone",ko:"bash의 `github pr_checkout` 및 `git worktree add`로 만드는 새 worktree를 현재 체크아웃의 copy-on-write 복제본으로 시작하여 무시된 빌드 아티팩트(node_modules, target)를 이어받습니다. 파일 시스템에서 복제할 수 없으면 일반 체크아웃으로 대체합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"retry.baseDelayMs",category:"safety",group:"Retry",label:{en:"Base Delay Ms",ko:"기본 지연 시간(ms)"},description:{en:"Sets the base retry delay in milliseconds.",ko:"재시도의 기본 지연 시간을 밀리초 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:500,integer:!0},{path:"retry.enabled",category:"safety",group:"Retry",label:{en:"Enabled",ko:"활성화"},description:{en:"Enables retry handling.",ko:"재시도 처리를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"retry.fallbackChains",category:"safety",group:"Retry & Fallback",label:{en:"Retry Fallback Chains",ko:"재시도 대체 체인"},description:{en:'JSON object mapping model roles, model selectors ("provider/model-id"), or provider wildcards ("provider/*") to ordered fallback selectors, e.g. {"default":["openai/gpt-4o-mini"],"google-antigravity/*":["google/*","google-vertex/*"]}. Model-oriented keys apply whenever that model/provider is active, regardless of role; a "provider/*" entry keeps the failing model\'s id and swaps the provider. An id-prefixed wildcard ("openrouter/google/*") re-prefixes the failing model\'s bare id (google-antigravity/gemini-x -> openrouter/google/gemini-x) and, used as a key, matches only that provider\'s ids under the prefix.',ko:'모델 역할, 모델 선택자("provider/model-id") 또는 제공자 와일드카드("provider/*")를 순서가 지정된 대체 선택자에 매핑하는 JSON 객체입니다. 예: {"default":["openai/gpt-4o-mini"],"google-antigravity/*":["google/*","google-vertex/*"]}. 모델 중심 키는 역할과 관계없이 해당 모델/제공자가 활성 상태일 때 적용됩니다. "provider/*" 항목은 실패한 모델의 id를 유지하면서 제공자만 바꿉니다. id 접두사 와일드카드("openrouter/google/*")는 실패한 모델의 접두사 없는 id에 새 접두사를 붙이며(google-antigravity/gemini-x -> openrouter/google/gemini-x), 키로 사용하면 해당 제공자에서 접두사 아래의 id만 일치시킵니다.'},kind:"object",scope:"both",defaultValue:{},recordValues:"string-array"},{path:"retry.fallbackRevertPolicy",category:"safety",group:"Retry & Fallback",label:{en:"Fallback Revert Policy",ko:"대체 모델 복귀 정책"},description:{en:"When to return to the primary model after a fallback",ko:"대체 모델 사용 후 기본 모델로 돌아갈 시점을 설정합니다."},kind:"enum",scope:"both",defaultValue:"cooldown-expiry",choices:["cooldown-expiry","never"]},{path:"retry.maxDelayMs",category:"safety",group:"Retry & Fallback",label:{en:"Max Retry Delay",ko:"최대 재시도 지연 시간"},description:{en:"Maximum wait between retries, in ms. When the provider asks us to wait longer than this and no credential or model fallback succeeds, the request fails fast instead of sleeping (e.g. 3-hour Anthropic rate-limit windows). 0 disables the ceiling — to let the session auto-resume through provider-stated quota resets.",ko:"재시도 사이의 최대 대기 시간(ms)입니다. 제공자가 이보다 긴 대기를 요청하고 자격 증명이나 모델 대체가 성공하지 않으면, 대기하지 않고 요청이 즉시 실패합니다(예: Anthropic의 3-hour 사용량 제한 구간). 0은 상한을 비활성화하여 제공자가 명시한 할당량 초기화 후 세션이 자동으로 재개되도록 합니다."},kind:"number",scope:"both",defaultValue:3e5,integer:!0},{path:"retry.maxRetries",category:"safety",group:"Retry & Fallback",label:{en:"Retry Attempts",ko:"재시도 횟수"},description:{en:"Maximum retry attempts on API errors",ko:"API 오류 발생 시 최대 재시도 횟수입니다."},kind:"number",scope:"both",defaultValue:10,integer:!0},{path:"retry.modelFallback",category:"safety",group:"Retry & Fallback",label:{en:"Retry Model Fallback",ko:"재시도 시 모델 대체"},description:{en:"Allow retry recovery to switch to configured fallback models",ko:"재시도 복구 중 설정된 대체 모델로 전환할 수 있도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"retry.usageAwareFallback",category:"safety",group:"Retry & Fallback",label:{en:"Usage-Aware Fallback",ko:"사용량 기반 대체"},description:{en:"Use reliable coding-plan quota reports to prefer same-provider accounts, then configured fallback models, before a hard usage limit. Ordinary configured API keys are excluded.",ko:"신뢰할 수 있는 코딩 플랜 할당량 보고서를 사용하여 엄격한 사용량 한도에 도달하기 전에 동일 제공자의 계정을 우선한 다음 설정된 대체 모델을 사용합니다. 일반적으로 설정된 API 키는 제외됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"retry.usageReservePct",category:"safety",group:"Retry & Fallback",label:{en:"Reserve Margin",ko:"예비 여유율"},description:{en:"Treat a coding-plan model as near its limit below this remaining percentage. Unknown or unmapped usage keeps the primary model.",ko:"코딩 플랜 모델의 남은 비율이 이 값 미만이면 한도에 가까운 것으로 간주합니다. 사용량을 알 수 없거나 매핑되지 않은 경우 기본 모델을 유지합니다."},kind:"number",scope:"both",defaultValue:10},{path:"retry.usageReservePolicy",category:"safety",group:"Retry & Fallback",label:{en:"Reserve Policy",ko:"예비 여유 정책"},description:{en:"What to do when every same-provider coding-plan account is inside the reserve margin.",ko:"동일 제공자의 모든 코딩 플랜 계정이 예비 여유 범위에 있을 때 수행할 작업입니다."},kind:"enum",scope:"both",defaultValue:"confirm",choices:["confirm","auto","fail-closed"]},{path:"retry.waitForUsageReset",category:"safety",group:"Retry & Fallback",label:{en:"Wait For Usage Reset",ko:"사용량 초기화 대기"},description:{en:"When a provider reports usage-limit exhaustion with a reset time (5-hour or weekly quota windows on any provider), sleep until the reset instead of failing fast past retry.maxDelayMs. Waits are abortable (Esc) but also hold subagents, so leave off for unattended runs.",ko:"제공자가 초기화 시간과 함께 사용량 한도 소진을 보고하면(모든 제공자의 5-hour 또는 주간 할당량 구간), retry.maxDelayMs를 초과하여 즉시 실패하는 대신 초기화될 때까지 대기합니다. 대기는 중단할 수 있지만(Esc) 하위 에이전트도 대기시키므로 무인 실행에서는 비활성화하세요."},kind:"boolean",scope:"both",defaultValue:!1},{path:"secrets.enabled",category:"safety",group:"Privacy",label:{en:"Hide Secrets",ko:"비밀 정보 숨기기"},description:{en:"Obfuscate configured secrets and redact credential-shaped tokens before sending to AI providers",ko:"설정된 비밀 정보를 난독화하고 자격 증명 형태의 토큰을 AI 제공자에게 보내기 전에 가립니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"auth.broker.token",category:"system",group:"Auth",label:{en:"Token",ko:"토큰"},description:{en:"Authentication token configured for the broker.",ko:"브로커에 구성된 인증 토큰입니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when auth.broker.url points to a broker that requires a token.",ko:"auth.broker.url이 토큰이 필요한 브로커를 가리킬 때 적용됩니다."}},{path:"auth.broker.url",category:"system",group:"Auth",label:{en:"URL",ko:"URL"},description:{en:"URL of the authentication broker.",ko:"인증 브로커의 URL입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0},{path:"commands.enableClaudeProject",category:"system",group:"Commands & Skills",label:{en:"Claude Project Commands",ko:"Claude 프로젝트 명령"},description:{en:"Load commands from .claude/commands/",ko:".claude/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"commands.enableClaudeUser",category:"system",group:"Commands & Skills",label:{en:"Claude User Commands",ko:"Claude 사용자 명령"},description:{en:"Load commands from ~/.claude/commands/",ko:"~/.claude/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"commands.enableOpencodeProject",category:"system",group:"Commands & Skills",label:{en:"OpenCode Project Commands",ko:"OpenCode 프로젝트 명령"},description:{en:"Load commands from .opencode/commands/",ko:".opencode/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"commands.enableOpencodeUser",category:"system",group:"Commands & Skills",label:{en:"OpenCode User Commands",ko:"OpenCode 사용자 명령"},description:{en:"Load commands from ~/.config/opencode/commands/",ko:"~/.config/opencode/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"features.unexpectedStopDetection",category:"system",group:"Agent",label:{en:"Unexpected Stops",ko:"예기치 않은 중단"},description:{en:"Automatically recover when the assistant stops without a visible message. Smart also classifies text-only stops with a small model.",ko:"어시스턴트가 표시되는 메시지 없이 중단되면 자동으로 복구합니다. Smart는 소형 모델로 텍스트만 있는 중단도 분류합니다."},kind:"enum",scope:"both",defaultValue:"mechanical",choices:["none","mechanical","smart"]},{path:"gc.coldArchiveAfterDays",category:"system",group:"Gc",label:{en:"Cold Archive After Days",ko:"콜드 아카이브 전환 일수"},description:{en:"Number of days after which items are cold-archived.",ko:"항목을 콜드 아카이브하기까지의 일수입니다."},kind:"number",scope:"both",defaultValue:30,integer:!0},{path:"gc.retainNewestGlobal",category:"system",group:"Gc",label:{en:"Retain Newest Global",ko:"전체 최신 항목 보존"},description:{en:"Number of newest items to retain globally.",ko:"전역적으로 유지할 최신 항목 수입니다."},kind:"number",scope:"both",defaultValue:20,integer:!0},{path:"gc.retainNewestPerCwd",category:"system",group:"Gc",label:{en:"Retain Newest Per Cwd",ko:"Cwd별 최신 항목 보존"},description:{en:"Number of newest items to retain per current working directory.",ko:"현재 작업 디렉터리별로 유지할 최신 항목 수입니다."},kind:"number",scope:"both",defaultValue:10,integer:!0},{path:"launch.enabled",category:"system",group:"Available Tools",label:{en:"Launch",ko:"Launch"},description:{en:"Enable the launch tool for supervising shared long-running project processes",ko:"공유 장기 실행 프로젝트 프로세스를 감독하는 launch 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"vault.enabled",category:"system",group:"Available Tools",label:{en:"Obsidian Vault",ko:"Obsidian Vault"},description:{en:"Enable the vault:// internal URL for reading and editing Obsidian vault content via the Obsidian CLI. When disabled, vault:// resolution is refused and the vault:// entry is omitted from the system prompt.",ko:"Obsidian CLI를 통해 Obsidian vault 콘텐츠를 읽고 편집할 수 있도록 vault:// 내부 URL을 활성화합니다. 비활성화하면 vault:// 해석이 거부되고 시스템 프롬프트에서 vault:// 항목이 제외됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"web_search.enabled",category:"system",group:"Available Tools",label:{en:"Web Search",ko:"웹 검색"},description:{en:"Enable the web_search tool for live web results",ko:"실시간 웹 결과를 위한 web_search 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"mcp.enableProjectConfig",category:"system",group:"Discovery & MCP",label:{en:"MCP Project Config",ko:"MCP 프로젝트 설정"},description:{en:"Load .mcp.json/mcp.json from project root",ko:"프로젝트 루트에서 .mcp.json/mcp.json을 불러옵니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"mcp.notificationDebounceMs",category:"system",group:"Discovery & MCP",label:{en:"MCP Notification Debounce",ko:"MCP 알림 디바운스"},description:{en:"Debounce window in milliseconds for MCP resource updates before injecting them into the conversation",ko:"MCP 리소스 업데이트를 대화에 삽입하기 전 적용할 디바운스 시간(ms)입니다."},kind:"number",scope:"both",defaultValue:500,integer:!0},{path:"mcp.notifications",category:"system",group:"Discovery & MCP",label:{en:"MCP Update Injection",ko:"MCP 업데이트 삽입"},description:{en:"Inject MCP resource updates into the agent conversation",ko:"MCP 리소스 업데이트를 에이전트 대화에 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"plan.autosave",category:"system",group:"Plan",label:{en:"Autosave",ko:"자동 저장"},description:{en:"Automatically save approved plans to disk when plan mode completes",ko:"계획 모드가 완료되면 승인된 계획을 디스크에 자동 저장합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"plan.autosaveDir",category:"system",group:"Plan",label:{en:"Autosave Dir",ko:"자동 저장 디렉터리"},description:{en:"Directory for autosaved plans. Supports ~, absolute, and cwd-relative paths. Empty uses <project>/.omp/plans/.",ko:"자동 저장된 계획의 디렉터리입니다. ~, 절대 경로 및 cwd 기준 상대 경로를 지원합니다. 비워 두면 <project>/.omp/plans/를 사용합니다."},kind:"string",scope:"both",admin:!0},{path:"plan.defaultOnStartup",category:"system",group:"Modes",label:{en:"Start in Plan Mode",ko:"계획 모드로 시작"},description:{en:"Automatically enter plan mode at the start of every new session",ko:"새 세션을 시작할 때마다 자동으로 계획 모드에 진입합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"plan.enabled",category:"system",group:"Modes",label:{en:"Plan Mode",ko:"계획 모드"},description:{en:"Enable plan mode for read-only exploration and planning before execution",ko:"실행 전에 읽기 전용 탐색과 계획을 위한 계획 모드를 사용합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"power.sleepPrevention",category:"system",group:"Power",label:{en:"Sleep Prevention",ko:"절전 방지"},description:{en:"Prevent the system sleeping during active sessions. Each level is cumulative — it adds the flags of all lower levels.",ko:"활성 세션 중 시스템이 절전 모드로 전환되지 않도록 합니다. 각 단계는 누적되며 모든 하위 단계의 플래그가 추가됩니다."},kind:"enum",scope:"both",defaultValue:"idle",choices:["off","idle","display","system"],admin:!0,confirmation:!0},{path:"readLineNumbers",category:"system",group:"Reading",label:{en:"Line Numbers",ko:"줄 번호"},description:{en:"Prepend line numbers to read tool output by default",ko:"기본적으로 read 도구 출력 앞에 줄 번호를 추가합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"shellPath",category:"system",group:"Shell Path",label:{en:"Shell Path",ko:"셸 경로"},description:{en:"Sets the shell executable path.",ko:"셸 실행 파일 경로를 설정합니다."},kind:"string",scope:"both",admin:!0,confirmation:!0},{path:"skillful",category:"system",group:"Prompt",label:{en:"List Skills in Prompt",ko:"프롬프트에 스킬 목록 표시"},description:{en:"List available skills in the system prompt; disable to save context and toggle per-session with /skillful",ko:"시스템 프롬프트에 사용 가능한 스킬을 나열합니다. 컨텍스트를 절약하려면 비활성화하고 세션별로 /skillful을 사용해 전환할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"workspace.additionalDirectories",category:"system",group:"General",label:{en:"Additional Workspace Dirs",ko:"추가 워크스페이스 디렉터리"},description:{en:"Extra workspace directories added to every session as additional roots (multi-root workspace). Managed live via /add-dir and /remove-dir. Paths resolve relative to cwd; absolute paths recommended. The agent is told these roots exist and can read/grep/glob them.",ko:"모든 세션에 추가 루트로 포함할 워크스페이스 디렉터리입니다(다중 루트 워크스페이스). /add-dir 및 /remove-dir로 실시간 관리합니다. 경로는 cwd를 기준으로 해석되며 절대 경로를 권장합니다. 에이전트는 이러한 루트의 존재를 안내받고 read/grep/glob할 수 있습니다."},kind:"array",scope:"both",defaultValue:[],items:"string",admin:!0,confirmation:!0}]},88501:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Ee:()=>N,Le:()=>O,rk:()=>J,tB:()=>K});var e=c(29021),f=c(33873),g=c(63294),h=c(80547),i=c(82536),j=c(20565),k=c(88016),l=c(58112),m=c(62761),n=c(85887),o=a([m]);m=(o.then?(await o)():o)[0];class O extends Error{constructor(a,b,c=[]){super(b),this.name="NativeSettingsError",this.code=a,this.issues=c}}let P=new Set(["__proto__","prototype","constructor"]),Q=new Map(k.K.map(a=>[a.path,a])),R={"advisor.immuneTurns":[0,20],"advisor.maxNotesPerUpdate":[1,32],"autolearn.minToolCalls":[0,100],"compaction.keepRecentTokens":[1e3,1e6],"mcp.notificationDebounceMs":[0,6e4],"providers.webSearchTimeoutSeconds":[0,300],"retry.maxRetries":[0,20],"retry.usageReservePct":[0,100]};function p(a){let b=a.split(".");if(!b.length||b.some(a=>!a||P.has(a)))throw new O("invalid_path","Settings path is invalid",[{path:a,message:"Invalid settings path"}]);return b}function q(a,b){let c=a,d=[];for(let a of p(b)){if(d.push(a),!(0,j.u4)(c))return{present:!1,malformedAt:d.slice(0,-1).join(".")||a};if(!Object.prototype.hasOwnProperty.call(c,a))return{present:!1};c=c[a]}return{present:!0,value:c}}function r(a,b,c){let d=p(b),e=a;for(let a of d.slice(0,-1)){let b=e[a];(0,j.u4)(b)||(e[a]={}),e=e[a]}e[d.at(-1)]=c}function s(a){if(Array.isArray(a))return a.map(s);if((0,j.u4)(a)){let b={};for(let[c,d]of Object.entries(a))P.has(c)||(b[c]=s(d));return b}return a}function t(a,b,c=0,d={entries:0}){let e;if(c>8)throw Error("is nested too deeply");if(null!==a&&"boolean"!=typeof a){if("string"==typeof a){if(a.length>16384)throw Error("must be at most 16384 characters");return}if("number"==typeof a){if(!Number.isFinite(a))throw Error("must be finite");return}if(Array.isArray(a)){if(a.length>256)throw Error("must contain at most 256 items");for(let e of a)t(e,b,c+1,d);return}if(!(0,j.u4)(a))throw Error("must contain JSON values only");for(let[e,f]of Object.entries(a)){if(d.entries+=1,d.entries>512)throw Error("must contain at most 512 entries");if(!e||e.length>256||P.has(e))throw Error("contains an invalid key");t(f,b,c+1,d)}try{e=JSON.stringify(a)}catch{throw Error("must be JSON serializable")}if(Buffer.byteLength(e,"utf8")>131072)throw Error("must be at most 131072 bytes")}}function u(a,b,c,d){let e=`${a.path}.${b}`;switch(a.recordValues){case"string":if("string"!=typeof c||!c.trim()||c.length>16384)throw Error(`${e} must be a non-empty string`);return c;case"model-role":if(null===c&&"project"===d)return null;if("string"==typeof c){if(!c.trim()||c.length>16384)throw Error(`${e} must be a non-empty model selector`);return c}if(!Array.isArray(c)||0===c.length||c.length>256||c.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${e} must be a non-empty model selector or selector array`);return[...c];case"boolean-string":if("string"!=typeof c||!c.trim()||c.length>16384)throw Error(`${e} must be an on/off selector or model pattern`);return c;case"string-array":if(!Array.isArray(c)||c.length>256||c.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${e} must be a bounded string array`);return[...c];case"string-or-string-array":if("string"==typeof c){if(!c.trim()||c.length>16384)throw Error(`${e} must be a non-empty string or string array`);return c}if(!Array.isArray(c)||c.length>256||c.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${e} must be a non-empty string or bounded string array`);return[...c];case"approval":if("string"!=typeof c||!["allow","prompt","deny"].includes(c))throw Error(`${e} must be an allowed approval policy`);return c;default:return t(c,e),s(c)}}function v(a,b,c=!1){if("string"!=typeof a||!c&&!a.trim()||a.length>16384)throw Error(`${b} must be a bounded string`);return a}function w(a,b,c){let d=a.path,e=function(a,b){let c=a.path;if("modelTags"===c){if(!(0,j.u4)(b))throw Error(`${c} must be an object`);let a={};for(let[d,e]of Object.entries(b)){if(P.has(d)||!(0,j.u4)(e))throw Error(`${c}.${d} must be a model tag object`);let b=new Set(["name","color","hidden"]);if(Object.keys(e).some(a=>!b.has(a)))throw Error(`${c}.${d} contains an unknown field`);let f={name:v(e.name,`${c}.${d}.name`)};if(void 0!==e.color&&(f.color=v(e.color,`${c}.${d}.color`)),void 0!==e.hidden){if("boolean"!=typeof e.hidden)throw Error(`${c}.${d}.hidden must be a boolean`);f.hidden=e.hidden}a[d]=f}return t(a,c),a}if("providers.maxInFlightRequests"===c){if(!(0,j.u4)(b))throw Error(`${c} must be an object`);let a={};for(let[d,e]of Object.entries(b)){if(P.has(d)||"number"!=typeof e||!Number.isFinite(e)||e<=0||e>Number.MAX_SAFE_INTEGER)throw Error(`${c}.${d} must be a positive finite number`);a[d]=Math.max(1,Math.floor(e))}return a}if("images.urls.options"===c||"images.urls.credentials"===c){if(!(0,j.u4)(b))throw Error(`${c} must be an object`);let a={};for(let[d,e]of Object.entries(b)){if(P.has(d)||!(0,j.u4)(e))throw Error(`${c}.${d} must be an object`);let b={};for(let[a,f]of Object.entries(e)){if(P.has(a))throw Error(`${c}.${d} contains an invalid key`);"images.urls.credentials"===c?b[a]=v(f,`${c}.${d}.${a}`):(t(f,`${c}.${d}.${a}`),b[a]=s(f))}a[d]=b}return t(a,c),a}if("bash.patterns"===c){if(!Array.isArray(b)||b.length>256)throw Error(`${c} must be a bounded array`);return b.map((a,b)=>{if(!(0,j.u4)(a)||Object.keys(a).some(a=>!["match","approval"].includes(a)))throw Error(`${c}.${b} must contain only match and approval`);let d=v(a.match,`${c}.${b}.match`);if("allow"!==a.approval&&"prompt"!==a.approval&&"deny"!==a.approval)throw Error(`${c}.${b}.approval is invalid`);return{match:d,approval:a.approval}})}if("bashInterceptor.patterns"===c){if(!Array.isArray(b)||b.length>256)throw Error(`${c} must be a bounded array`);return b.map((a,b)=>{if(!(0,j.u4)(a)||Object.keys(a).some(a=>!["pattern","flags","tool","message","allowSubcommands"].includes(a)))throw Error(`${c}.${b} contains an unknown field`);let d={pattern:v(a.pattern,`${c}.${b}.pattern`),tool:v(a.tool,`${c}.${b}.tool`),message:v(a.message,`${c}.${b}.message`,!0)};void 0!==a.flags&&(d.flags=v(a.flags,`${c}.${b}.flags`,!0));try{new RegExp(d.pattern,d.flags)}catch{throw Error(`${c}.${b} must contain a valid regular expression`)}if(void 0!==a.allowSubcommands){if(!Array.isArray(a.allowSubcommands)||a.allowSubcommands.length>256||a.allowSubcommands.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${c}.${b}.allowSubcommands must be a bounded string array`);d.allowSubcommands=[...a.allowSubcommands]}return d})}}(a,b);if(void 0!==e)return e;switch(a.kind){case"boolean":if("boolean"!=typeof b)throw Error(`${d} must be a boolean`);return b;case"number":if("number"!=typeof b||!Number.isFinite(b)||Math.abs(b)>Number.MAX_SAFE_INTEGER)throw Error(`${d} must be a bounded finite number`);if(a.integer&&!Number.isSafeInteger(b))throw Error(`${d} must be a safe integer`);let f=R[d],g=a.min??f?.[0],h=a.max??f?.[1];if(void 0!==g&&b<g)throw Error(`${d} must be at least ${g}`);if(void 0!==h&&b>h)throw Error(`${d} must be at most ${h}`);return b;case"string":if("string"!=typeof b)throw Error(`${d} must be a string`);if(b.length>16384)throw Error(`${d} must be at most 16384 characters`);return b;case"enum":if("string"!=typeof b||!a.choices?.includes(b))throw Error(`${d} must be one of the allowed values`);return b;case"array":{if(!Array.isArray(b))throw Error(`${d} must be an array`);if(b.length>256)throw Error(`${d} must contain at most 256 items`);let c=[];for(let e of b)if("string"===a.items){if("string"!=typeof e||!e.trim()||e.length>16384)throw Error(`${d} must contain non-empty strings`);if(a.choices?.length&&!a.choices.includes(e))throw Error(`${d} contains an unsupported value`);c.push(e)}else if("number"===a.items){if("number"!=typeof e||!Number.isFinite(e))throw Error(`${d} must contain finite numbers`);c.push(e)}else t(e,d),c.push(s(e));return c}case"object":{if(!(0,j.u4)(b))throw Error(`${d} must be an object`);let e=Object.entries(b);if(e.length>512)throw Error(`${d} must contain at most 512 entries`);let f={};for(let[b,g]of e){if(!b||b.length>256||P.has(b))throw Error(`${d} contains an invalid key`);f[b]=u(a,b,g,c)}return t(f,d),f}}}function x(a){let b=(0,j.u4)(a.compaction)?a.compaction:void 0,c=b?.methodOrder??a["compaction.methodOrder"];if(Array.isArray(c))return c;let d=b?.strategy??a["compaction.strategy"],e=b?.remoteEnabled??a["compaction.remoteEnabled"],f=!1!==e;switch("shake-summary"===d?"shake":d){case"context-full":return f?["remote","soft"]:["soft"];case"handoff":return f?["handoff","remote","soft"]:["handoff","soft"];case"shake":return f?["shake","remote","soft"]:["shake","soft"];case"snapcompact":return f?["snapcompact","remote","soft"]:["snapcompact","soft"];case"off":return[];default:if(!1===e)return["snapcompact","handoff","shake","soft"];return}}function y(a,b){let c=q(a,b);if(c.present){if(("task.agentAdvisor"===b||"task.agentPrewalk"===b)&&(0,j.u4)(c.value)){let d={};for(let[a,b]of Object.entries(c.value))d[a]="boolean"==typeof b?b?"on":"off":b;if("task.agentAdvisor"===b&&!Object.prototype.hasOwnProperty.call(d,"task")){let b=(0,j.u4)(a.advisor)?a.advisor:void 0,c=b&&Object.prototype.hasOwnProperty.call(b,"subagents")?b.subagents:a["advisor.subagents"];"boolean"==typeof c&&(d.task=c?"on":"off")}return{present:!0,value:d}}return c}if("compaction.methodOrder"===b){let b=x(a);return void 0===b?c:{present:!0,value:b}}if("task.agentAdvisor"===b){let b=(0,j.u4)(a.advisor)?a.advisor:void 0,c=b&&Object.prototype.hasOwnProperty.call(b,"subagents")?b.subagents:a["advisor.subagents"];if("boolean"==typeof c)return{present:!0,value:{task:c?"on":"off"}}}return c}let S=new Set(["enabledModels","disabledProviders","enabledProviders"]);function z(a,b,c="global"){let d={},e=new Set(b?.map(a=>a.path)??[]),f=!1;for(let g of k.K){if(g.secret)continue;let h=y(a,g.path);if(h.malformedAt){b&&!e.has(h.malformedAt)&&(e.add(h.malformedAt),b.push({path:h.malformedAt,message:"Stored settings section is not an object and was omitted"}));continue}if(h.present)try{if(S.has(g.path)){let a=function(a){if(!Array.isArray(a)||a.length>256)throw Error("must be a bounded array");t(a,"registry");let b=[],c=!1;for(let d of a)if("string"==typeof d&&d.trim()&&d.length<=16384)b.push(d);else if((0,j.u4)(d))c=!0;else throw Error("must contain strings or path-scoped rules");return{value:b,hasScopedEntries:c}}(h.value);f||=a.hasScopedEntries,r(d,g.path,a.value)}else if("modelRoles"===g.path&&(0,j.u4)(h.value)){let a={};for(let[d,f]of Object.entries(h.value))try{a[d]=u(g,d,f,c)}catch{let a=`${g.path}.${d}`;b&&!e.has(a)&&(e.add(a),b.push({path:a,message:"Stored model role is invalid and was omitted"}))}r(d,g.path,a)}else r(d,g.path,w(g,h.value,c))}catch{b&&!e.has(g.path)&&(e.add(g.path),b.push({path:g.path,message:"Stored value is invalid or outside editor bounds and was omitted"}))}}return f&&(d.registryHasScopedEntries=!0),d}function A(a){let b=(0,g.Tp)((0,e.existsSync)(a)?(0,e.readFileSync)(a,"utf8"):"");if(b.errors.length)throw new O("invalid_yaml","Settings file is not valid YAML",[{path:"$",message:"Invalid YAML syntax"}]);let c=b.toJS();if(null!==c&&!(0,j.u4)(c))throw new O("invalid_yaml","Settings file must contain a YAML mapping",[{path:"$",message:"Expected a mapping"}]);return{path:a,doc:b,raw:(0,j.u4)(c)?c:{}}}function B(){return{path:(0,n.pA)(),scope:"global"}}async function C(a){let b,c;if("string"!=typeof a||!a.trim()||a.length>4096||a.includes("\0"))throw new O("invalid_scope","An existing authorized cwd is required for project settings",[{path:"cwd",message:"Invalid project cwd"}]);try{if(b=(0,e.realpathSync)(a),!(0,e.statSync)(b).isDirectory())throw Error("not a directory")}catch{throw new O("invalid_scope","An existing authorized cwd is required for project settings",[{path:"cwd",message:"Project cwd does not exist"}])}let d=await (0,h.mc)();if(!(0,h.B7)(b,d))throw new O("forbidden_scope","Project settings path is not authorized",[{path:"cwd",message:"Project cwd is outside allowed roots"}]);let g=(0,f.join)(b,".omp","config.yml");try{c=(0,i.SW)(g)}catch{throw new O("forbidden_scope","Project settings path cannot be resolved safely",[{path:"cwd",message:"Project settings path is unsafe"}])}if(!(0,i.o4)(c,new Set([b])))throw new O("forbidden_scope","Project settings path escapes the authorized workspace",[{path:"cwd",message:"Project settings symlink escapes the workspace"}]);return{path:c,scope:"project",cwd:b}}async function D(a,b){let c=a??"global";if("global"===c)return B();if("project"===c)return C(b);throw new O("invalid_scope","scope must be global or project",[{path:"scope",message:"Unsupported settings scope"}])}function E(a){let b={};for(let c of k.K){if(!c.secret)continue;let d=q(a,c.path);b[c.path]=d.present&&null!==d.value&&""!==d.value}return b}function F(a,b){let c=new Set;for(let d=1;d<=b.length;d+=1){let e=a.getIn(b.slice(0,d),!0);!(0,g.Vj)(e)&&"object"==typeof e&&null!==e&&"anchor"in e&&"string"==typeof e.anchor&&c.add(e.anchor)}0!==c.size&&(0,g.YR)(a,{Alias(d,e){if(!c.has(e.source))return;let f=e.resolve(a);if(!f)throw new O("invalid_yaml","Settings alias cannot be resolved",[{path:b.join("."),message:"Unresolved YAML alias"}]);let g=a.createNode(s(f.toJS(a)));return g.comment=e.comment,g.commentBefore=e.commentBefore,g.spaceBefore=e.spaceBefore,g}})}function G(a,b,c){let d=a.getIn(b,!0);if(!(0,g.Vj)(d))return;let e=a.toJS(),f=(0,j.u4)(e)?q(e,b.join(".")):{present:!1};if(!f.present||!(0,j.u4)(f.value))throw new O("invalid_yaml","Settings alias does not resolve to a mapping",[{path:c,message:"Aliased settings sections must resolve to mappings"}]);let h=f.value;try{t(h,c)}catch{throw new O("invalid_yaml","Aliased settings section cannot be materialized safely",[{path:c,message:"Aliased section contains unsafe or unbounded data"}])}a.setIn(b,a.createNode(s(h)))}function H(a,b,c){let d=p(b);F(a,d);for(let c=1;c<d.length;c+=1){let e=d.slice(0,c);G(a,e,b);let f=a.getIn(e,!0);void 0===f||(0,g.jh)(f)||a.setIn(e,{})}a.setIn(d,c)}function I(a,b){let c=p(b);F(a,c);for(let d=1;d<c.length;d+=1){let e=c.slice(0,d);G(a,e,b);let f=a.getIn(e,!0);if(void 0===f)return;if(!(0,g.jh)(f))return void a.deleteIn(e)}a.deleteIn(c)}function J(){let a=B(),b=A(a.path);return{path:a.path,settings:z(b.raw)}}async function K(a,b){let c=await D(a,b),d=A(B().path),e=[],f=z(d.raw,e,"global");if("global"===c.scope)return{path:c.path,scope:"global",settings:f,effectiveSettings:s(f),catalog:k.K,secretStatus:E(d.raw),...e.length?{issues:e}:{}};let g=A(c.path),h=z(g.raw,e,"project");return{path:c.path,scope:"project",cwd:c.cwd,settings:h,effectiveSettings:function(a,b){let c=s(a);for(let a of k.K){if(a.secret)continue;let d=q(b,a.path);if(!d.present)continue;let e=q(c,a.path),f=d.value;"modelRoles"===a.path&&(0,j.u4)(f)&&(f=Object.fromEntries(Object.entries(f).filter(([,a])=>null!==a))),r(c,a.path,e.present?function a(b,c){if(!(0,j.u4)(b)||!(0,j.u4)(c))return s(c);let d=s(b);for(let[b,e]of Object.entries(c))d[b]=(0,j.u4)(d[b])&&(0,j.u4)(e)?a(d[b],e):s(e);return d}(e.value,f):s(f))}return b.registryHasScopedEntries&&(c.registryHasScopedEntries=!0),c}(f,h),catalog:k.K,secretStatus:E(d.raw),...e.length?{issues:e}:{}}}function L(a,b){if(!Array.isArray(a)||a.length>k.K.length||a.some(a=>"string"!=typeof a))throw new O("invalid_update",`${b} must be an array of settings paths`,[{path:b,message:"Expected a bounded string array"}]);return[...new Set(a)]}function M(a,b){if(Object.is(a,b))return!0;if(Array.isArray(a)||Array.isArray(b))return Array.isArray(a)&&Array.isArray(b)&&a.length===b.length&&a.every((a,c)=>M(a,b[c]));if(!(0,j.u4)(a)||!(0,j.u4)(b))return!1;let c=Object.keys(a).sort(),d=Object.keys(b).sort();return c.length===d.length&&c.every((c,e)=>c===d[e]&&M(a[c],b[c]))}async function N(a){var b;if(!(0,j.u4)(a))throw new O("invalid_update","Settings update must be an object",[{path:"$",message:"Expected an object"}]);let c={...b=await D(a.scope,a.cwd),path:(0,m.k6)(b.path)},d=void 0===a.settings?{}:function(a,b="global"){if(!(0,j.u4)(a))throw new O("invalid_settings","settings must be an object",[{path:"settings",message:"Expected an object"}]);try{t(a,"settings")}catch(a){throw new O("invalid_settings","Settings object is malformed",[{path:"settings",message:a instanceof Error?a.message:"Malformed settings object"}])}let c={},d=[],e=new Set;for(let f of k.K){let g=q(a,f.path);if(g.malformedAt&&!e.has(g.malformedAt)){e.add(g.malformedAt),d.push({path:g.malformedAt,message:"Expected an object"});continue}if(g.present){if(f.secret){d.push({path:f.path,message:"Secret fields must use the write-only secrets object"});continue}if("project"===b&&"both"!==f.scope){d.push({path:f.path,message:"This setting is global-only"});continue}try{r(c,f.path,w(f,g.value,b))}catch(a){d.push({path:f.path,message:a instanceof Error?a.message:"Invalid value"})}}}if(d.length)throw new O("invalid_settings","One or more settings are invalid",d);return c}(a.settings,c.scope),h=void 0===a.reset?[]:L(a.reset,"reset"),i=new Set(void 0===a.confirm?[]:L(a.confirm,"confirm")),n=[];for(let a of h){let b=Q.get(a);!b||b.secret?n.push({path:a,message:"Unknown or secret reset path"}):"project"===c.scope&&"both"!==b.scope&&n.push({path:a,message:"This setting is global-only"})}let o=a.secrets;void 0===o||(0,j.u4)(o)||n.push({path:"secrets",message:"Expected an object keyed by secret path"});let p={};if((0,j.u4)(o))for(let[a,b]of(Object.keys(o).length>256&&n.push({path:"secrets",message:"Must contain at most 256 entries"}),Object.entries(o))){let d=Q.get(a);if(!d?.secret){n.push({path:a,message:"Unknown secret path"});continue}if("project"===c.scope&&"both"!==d.scope){n.push({path:a,message:"This secret is global-only"});continue}if(null===b){p[a]=null;continue}if("string"!=typeof b||!b.length||b.length>131072){n.push({path:a,message:"Secret replacement must be a non-empty bounded string or null"});continue}try{let e="object"===d.kind?JSON.parse(b):b;p[a]=w(d,e,c.scope)}catch{n.push({path:a,message:"Secret replacement has an invalid format"})}}if(n.length)throw new O("invalid_update","Settings update is invalid",n);let s=new Set(h);for(let a of k.K)q(d,a.path).present&&s.add(a.path);for(let a of Object.keys(p))s.add(a);(0,e.mkdirSync)((0,f.dirname)(c.path),{recursive:!0});let u=await (0,m.th)(c.path,async()=>{let a=A(c.path);var b=a.raw;let m=[];for(let a of s){if(!S.has(a))continue;let c=q(b,a);c.present&&Array.isArray(c.value)&&c.value.some(j.u4)&&m.push({path:a,message:"Path-scoped registry rules are read-only in this editor"})}if(m.length)throw new O("scoped_registry_read_only","Path-scoped registry rules cannot be replaced by this editor",m);for(let b of s){let c=Q.get(b);if(!c?.confirmation)continue;let e=y(a.raw,b),f=q(d,b),g=h.includes(b)?void 0:c.secret?p[b]:f.value;(e.present?M(e.value,g):void 0===e.malformedAt&&null==g)||i.has(b)||n.push({path:b,message:"Explicit confirmation is required"})}if(n.length)throw new O("confirmation_required","Explicit confirmation is required for risky settings",n);return!function(a,b,c,d,h=A(a.path)){let{doc:i,raw:m}=h;if(null===i.contents)i.contents=i.createNode({});else if(!(0,g.jh)(i.contents))throw new O("invalid_yaml","Settings file must contain a YAML mapping",[{path:"$",message:"Expected a mapping"}]);for(let a of(!function(a,b){if(!q(b,"compaction.methodOrder").present){let c=x(b);void 0!==c&&H(a,"compaction.methodOrder",c)}let c=q(b,"task.agentAdvisor"),d=y(b,"task.agentAdvisor");d.present&&!M(c.value,d.value)&&H(a,"task.agentAdvisor",d.value);let e=q(b,"task.agentPrewalk");if(e.present&&(0,j.u4)(e.value)){let b={},c=!1;for(let[a,d]of Object.entries(e.value))b[a]="boolean"==typeof d?d?"on":"off":d,c||="boolean"==typeof d;c&&H(a,"task.agentPrewalk",b)}let f=(0,j.u4)(b.compaction)?b.compaction:void 0;f&&Object.prototype.hasOwnProperty.call(f,"strategy")&&I(a,"compaction.strategy"),f&&Object.prototype.hasOwnProperty.call(f,"remoteEnabled")&&I(a,"compaction.remoteEnabled"),a.delete("compaction.strategy"),a.delete("compaction.remoteEnabled"),a.delete("compaction.methodOrder");let g=(0,j.u4)(b.advisor)?b.advisor:void 0;g&&Object.prototype.hasOwnProperty.call(g,"subagents")&&I(a,"advisor.subagents"),a.delete("advisor.subagents")}(i,m),k.K)){let c=q(b,a.path);c.present&&H(i,a.path,c.value)}for(let a of c)I(i,a);for(let[a,b]of Object.entries(d))null===b?I(i,a):H(i,a,b);(0,e.mkdirSync)((0,f.dirname)(a.path),{recursive:!0}),(0,l.D)(a.path,i.toString())}(c,d,h,p,a),K(c.scope,c.cwd)}),v=["enabledModels","enabledProviders","disabledProviders","modelProviderOrder"].some(a=>s.has(a));return{snapshot:u,registryInvalidated:v}}d()}catch(a){d(a)}})}};
|
|
1
|
+
"use strict";exports.id=8501,exports.ids=[8501],exports.modules={34736:(a,b,c)=>{c.d(b,{A:()=>e});let d=new Uint8Array([0,97,115,109,1,0,0,0,1,48,8,96,3,127,127,127,1,127,96,3,127,127,127,0,96,2,127,127,0,96,1,127,1,127,96,3,127,127,126,1,126,96,3,126,127,127,1,126,96,2,127,126,0,96,1,127,1,126,3,11,10,0,0,2,1,3,4,5,6,1,7,5,3,1,0,1,7,85,9,3,109,101,109,2,0,5,120,120,104,51,50,0,0,6,105,110,105,116,51,50,0,2,8,117,112,100,97,116,101,51,50,0,3,8,100,105,103,101,115,116,51,50,0,4,5,120,120,104,54,52,0,5,6,105,110,105,116,54,52,0,7,8,117,112,100,97,116,101,54,52,0,8,8,100,105,103,101,115,116,54,52,0,9,10,251,22,10,242,1,1,4,127,32,0,32,1,106,33,3,32,1,65,16,79,4,127,32,3,65,16,107,33,6,32,2,65,168,136,141,161,2,106,33,3,32,2,65,137,235,208,208,7,107,33,4,32,2,65,207,140,162,142,6,106,33,5,3,64,32,3,32,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,4,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,4,32,2,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,5,32,0,65,4,106,34,0,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,6,32,0,65,4,106,34,0,79,13,0,11,32,2,65,12,119,32,5,65,18,119,106,32,4,65,7,119,106,32,3,65,1,119,106,5,32,2,65,177,207,217,178,1,106,11,32,1,106,32,0,32,1,65,15,113,16,1,11,146,1,0,32,1,32,2,106,33,2,3,64,32,1,65,4,106,32,2,75,69,4,64,32,0,32,1,40,2,0,65,189,220,202,149,124,108,106,65,17,119,65,175,214,211,190,2,108,33,0,32,1,65,4,106,33,1,12,1,11,11,3,64,32,1,32,2,79,69,4,64,32,0,32,1,45,0,0,65,177,207,217,178,1,108,106,65,11,119,65,177,243,221,241,121,108,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,65,15,118,115,65,247,148,175,175,120,108,34,0,65,13,118,32,0,115,65,189,220,202,149,124,108,34,0,65,16,118,32,0,115,11,63,0,32,0,65,8,106,32,1,65,168,136,141,161,2,106,54,2,0,32,0,65,12,106,32,1,65,137,235,208,208,7,107,54,2,0,32,0,65,16,106,32,1,54,2,0,32,0,65,20,106,32,1,65,207,140,162,142,6,106,54,2,0,11,195,4,1,6,127,32,1,32,2,106,33,6,32,0,65,24,106,33,4,32,0,65,40,106,40,2,0,33,3,32,0,32,0,40,2,0,32,2,106,54,2,0,32,0,65,4,106,34,5,32,5,40,2,0,32,2,65,16,79,32,0,40,2,0,65,16,79,114,114,54,2,0,32,2,32,3,106,65,16,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,40,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,16,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,40,2,0,32,4,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,12,106,34,3,32,3,40,2,0,32,4,65,4,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,16,106,34,3,32,3,40,2,0,32,4,65,8,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,20,106,34,3,32,3,40,2,0,32,4,65,12,106,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,54,2,0,32,0,65,40,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,32,6,65,16,107,77,4,64,32,6,65,16,107,33,8,32,0,65,8,106,40,2,0,33,2,32,0,65,12,106,40,2,0,33,3,32,0,65,16,106,40,2,0,33,5,32,0,65,20,106,40,2,0,33,7,3,64,32,2,32,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,2,32,3,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,3,32,5,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,5,32,7,32,1,65,4,106,34,1,40,2,0,65,247,148,175,175,120,108,106,65,13,119,65,177,243,221,241,121,108,33,7,32,8,32,1,65,4,106,34,1,79,13,0,11,32,0,65,8,106,32,2,54,2,0,32,0,65,12,106,32,3,54,2,0,32,0,65,16,106,32,5,54,2,0,32,0,65,20,106,32,7,54,2,0,11,32,1,32,6,73,4,64,32,4,32,1,32,6,32,1,107,34,1,252,10,0,0,32,0,65,40,106,32,1,54,2,0,11,11,97,1,1,127,32,0,65,16,106,40,2,0,33,1,32,0,65,4,106,40,2,0,4,127,32,1,65,12,119,32,0,65,20,106,40,2,0,65,18,119,106,32,0,65,12,106,40,2,0,65,7,119,106,32,0,65,8,106,40,2,0,65,1,119,106,5,32,1,65,177,207,217,178,1,106,11,32,0,40,2,0,106,32,0,65,24,106,32,0,65,40,106,40,2,0,16,1,11,255,3,2,3,126,1,127,32,0,32,1,106,33,6,32,1,65,32,79,4,126,32,6,65,32,107,33,6,32,2,66,214,235,130,238,234,253,137,245,224,0,124,33,3,32,2,66,177,169,172,193,173,184,212,166,61,125,33,4,32,2,66,249,234,208,208,231,201,161,228,225,0,124,33,5,3,64,32,3,32,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,3,32,4,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,4,32,2,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,2,32,5,32,0,65,8,106,34,0,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,5,32,6,32,0,65,8,106,34,0,79,13,0,11,32,2,66,12,137,32,5,66,18,137,124,32,4,66,7,137,124,32,3,66,1,137,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,2,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,2,66,197,207,217,178,241,229,186,234,39,124,11,32,1,173,124,32,0,32,1,65,31,113,16,6,11,134,2,0,32,1,32,2,106,33,2,3,64,32,2,32,1,65,8,106,79,4,64,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,32,0,133,66,27,137,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,33,0,32,1,65,8,106,33,1,12,1,11,11,32,1,65,4,106,32,2,77,4,64,32,0,32,1,53,2,0,66,135,149,175,175,152,182,222,155,158,127,126,133,66,23,137,66,207,214,211,190,210,199,171,217,66,126,66,249,243,221,241,153,246,153,171,22,124,33,0,32,1,65,4,106,33,1,11,3,64,32,1,32,2,73,4,64,32,0,32,1,49,0,0,66,197,207,217,178,241,229,186,234,39,126,133,66,11,137,66,135,149,175,175,152,182,222,155,158,127,126,33,0,32,1,65,1,106,33,1,12,1,11,11,32,0,32,0,66,33,136,133,66,207,214,211,190,210,199,171,217,66,126,34,0,32,0,66,29,136,133,66,249,243,221,241,153,246,153,171,22,126,34,0,32,0,66,32,136,133,11,77,0,32,0,65,8,106,32,1,66,214,235,130,238,234,253,137,245,224,0,124,55,3,0,32,0,65,16,106,32,1,66,177,169,172,193,173,184,212,166,61,125,55,3,0,32,0,65,24,106,32,1,55,3,0,32,0,65,32,106,32,1,66,249,234,208,208,231,201,161,228,225,0,124,55,3,0,11,244,4,2,3,127,4,126,32,1,32,2,106,33,5,32,0,65,40,106,33,4,32,0,65,200,0,106,40,2,0,33,3,32,0,32,0,41,3,0,32,2,173,124,55,3,0,32,2,32,3,106,65,32,73,4,64,32,3,32,4,106,32,1,32,2,252,10,0,0,32,0,65,200,0,106,32,2,32,3,106,54,2,0,15,11,32,3,4,64,32,3,32,4,106,32,1,65,32,32,3,107,34,2,252,10,0,0,32,0,65,8,106,34,3,32,3,41,3,0,32,4,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,16,106,34,3,32,3,41,3,0,32,4,65,8,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,24,106,34,3,32,3,41,3,0,32,4,65,16,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,32,106,34,3,32,3,41,3,0,32,4,65,24,106,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,55,3,0,32,0,65,200,0,106,65,0,54,2,0,32,1,32,2,106,33,1,11,32,1,65,32,106,32,5,77,4,64,32,5,65,32,107,33,2,32,0,65,8,106,41,3,0,33,6,32,0,65,16,106,41,3,0,33,7,32,0,65,24,106,41,3,0,33,8,32,0,65,32,106,41,3,0,33,9,3,64,32,6,32,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,6,32,7,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,7,32,8,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,8,32,9,32,1,65,8,106,34,1,41,3,0,66,207,214,211,190,210,199,171,217,66,126,124,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,33,9,32,2,32,1,65,8,106,34,1,79,13,0,11,32,0,65,8,106,32,6,55,3,0,32,0,65,16,106,32,7,55,3,0,32,0,65,24,106,32,8,55,3,0,32,0,65,32,106,32,9,55,3,0,11,32,1,32,5,73,4,64,32,4,32,1,32,5,32,1,107,34,1,252,10,0,0,32,0,65,200,0,106,32,1,54,2,0,11,11,188,2,1,5,126,32,0,65,24,106,41,3,0,33,1,32,0,41,3,0,34,2,66,32,90,4,126,32,0,65,8,106,41,3,0,34,3,66,1,137,32,0,65,16,106,41,3,0,34,4,66,7,137,124,32,1,66,12,137,32,0,65,32,106,41,3,0,34,5,66,18,137,124,124,32,3,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,4,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,1,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,32,5,66,207,214,211,190,210,199,171,217,66,126,66,31,137,66,135,149,175,175,152,182,222,155,158,127,126,133,66,135,149,175,175,152,182,222,155,158,127,126,66,157,163,181,234,131,177,141,138,250,0,125,5,32,1,66,197,207,217,178,241,229,186,234,39,124,11,32,2,124,32,0,65,40,106,32,2,66,31,131,167,16,6,11]);async function e(){return function(a){let{exports:{mem:b,xxh32:c,xxh64:d,init32:e,update32:f,digest32:g,init64:h,update64:i,digest64:j}}=a,k=new Uint8Array(b.buffer);function l(a,c){if(b.buffer.byteLength<a+c){let d=Math.ceil((a+c-b.buffer.byteLength)/65536);b.grow(d),k=new Uint8Array(b.buffer)}}function m(a,b,c,d,e,f){l(a);let g=new Uint8Array(a);return k.set(g),c(0,b),g.set(k.subarray(0,a)),{update(b){let c;return k.set(g),"string"==typeof b?(l(3*b.length,a),c=q.encodeInto(b,k.subarray(a)).written):(l(b.byteLength,a),k.set(b,a),c=b.byteLength),d(0,a,c),g.set(k.subarray(0,a)),this},digest:()=>(k.set(g),f(e(0)))}}function n(a){return a>>>0}let o=2n**64n-1n;function p(a){return a&o}let q=new TextEncoder,r=0,s=0n;function t(a,b=r){return l(3*a.length,0),n(c(0,q.encodeInto(a,k).written,b))}function u(a,b=s){return l(3*a.length,0),p(d(0,q.encodeInto(a,k).written,b))}return{h32:t,h32ToString:(a,b=r)=>t(a,b).toString(16).padStart(8,"0"),h32Raw:(a,b=r)=>(l(a.byteLength,0),k.set(a),n(c(0,a.byteLength,b))),create32:(a=r)=>m(48,a,e,f,g,n),h64:u,h64ToString:(a,b=s)=>u(a,b).toString(16).padStart(16,"0"),h64Raw:(a,b=s)=>(l(a.byteLength,0),k.set(a),p(d(0,a.byteLength,b))),create64:(a=s)=>m(88,a,h,i,j,p)}}((await WebAssembly.instantiate(d)).instance)}},58112:(a,b,c)=>{c.d(b,{D:()=>f});var d=c(55511),e=c(29021);function f(a,b){let c=`${a}.tmp-${(0,d.randomUUID)()}`,f=(0,e.openSync)(c,"wx",384);try{try{(0,e.writeFileSync)(f,b,"utf8")}finally{(0,e.closeSync)(f)}(0,e.renameSync)(c,a)}finally{try{(0,e.unlinkSync)(c)}catch(a){if(!(a instanceof Error&&"code"in a&&"ENOENT"===a.code))throw a}}}},62761:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{k6:()=>q,th:()=>r});var e=c(73024),f=c(76760),g=c(58500),h=c(56219),i=c(34736),j=a([h]);h=(j.then?(await j)():j)[0];let s=BigInt("0x4f4d502d4c4f434b"),t=BigInt("0x50492d46494c454c"),u=(0,i.A)();async function k(a){let{h64:b}=await u,c=b(a,s).toString(16).padStart(16,"0"),d=b(a,t).toString(16).padStart(16,"0");return`omp-file-lock-${c}${d}`}function l(a,b){return Error(`${a} failed with native error ${b}`)}async function m(a){let b=function(){let a=[...{arm:["/lib/arm-linux-gnueabihf/libc.so.6","/usr/lib/arm-linux-gnueabihf/libc.so.6","/lib/libc.musl-armhf.so.1"],arm64:["/lib/aarch64-linux-gnu/libc.so.6","/usr/lib/aarch64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-aarch64.so.1"],ia32:["/lib/i386-linux-gnu/libc.so.6","/usr/lib/i386-linux-gnu/libc.so.6","/lib32/libc.so.6","/lib/libc.musl-i386.so.1"],loong64:["/lib/loongarch64-linux-gnu/libc.so.6","/usr/lib/loongarch64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-loongarch64.so.1"],riscv64:["/lib/riscv64-linux-gnu/libc.so.6","/usr/lib/riscv64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-riscv64.so.1"],x64:["/lib/x86_64-linux-gnu/libc.so.6","/usr/lib/x86_64-linux-gnu/libc.so.6","/lib64/libc.so.6","/lib/libc.musl-x86_64.so.1"]}[process.arch]??[],"/lib/libc.so.6","/usr/lib/libc.so.6"].find(e.existsSync);if(!a)throw Error(`Native OMP file locks do not support Linux ${process.arch} without a trusted libc path`);return h.default.load(a)}(),c=b.func("int socket(int domain, int type, int protocol)"),d=b.func("int bind(int socket, const void *address, uint32_t address_len)"),f=b.func("int close(int fd)"),g=await k(a),i=Buffer.from(g,"utf8"),j=Buffer.alloc(3+i.length);return j.writeUInt16LE(1,0),i.copy(j,3),()=>{let a=c(1,524290,0);if(a<0)throw l("socket",h.default.errno());if(0===d(a,j,j.length))return{release(){if(0!==f(a))throw l("close",h.default.errno())}};let b=h.default.errno();if(0!==f(a))throw l("close",h.default.errno());if(b===h.default.os.errno.EADDRINUSE)return null;throw l("bind",b)}}async function n(a){let b=h.default.load("kernel32.dll"),c=b.func("void __stdcall SetLastError(uint32_t code)"),d=b.func("void * __stdcall CreateMutexW(void *attributes, int initial_owner, str16 name)"),e=b.func("uint32_t __stdcall GetLastError(void)"),f=b.func("int __stdcall CloseHandle(void *handle)"),g=`Global\\${await k(a)}`;return()=>{c(0);let a=d(null,0,g),b=e();if(null===a)throw l("CreateMutexW",b);if(183===b){if(0===f(a))throw l("CloseHandle",e());return null}return{release(){if(0===f(a))throw l("CloseHandle",e())}}}}async function o(a){if("linux"===process.platform)return m(a);if("darwin"===process.platform){let b,c,d,e;return c=(b=h.default.load("/usr/lib/libSystem.B.dylib")).func("int open(const char *path, int flags, ...)"),d=b.func("int flock(int fd, int operation)"),e=b.func("int close(int fd)"),()=>{let b=c(a,0x1000202,"uint",384);if(b<0)throw l("open",h.default.errno());if(0===d(b,6))return{release(){if(0!==e(b))throw l("close",h.default.errno())}};let f=h.default.errno();if(0!==e(b))throw l("close",h.default.errno());if(f===h.default.os.errno.EWOULDBLOCK||f===h.default.os.errno.EAGAIN)return null;throw l("flock",f)}}if("win32"===process.platform)return n(a);throw Error(`Native OMP file locks do not support ${process.platform}`)}async function p(a,b,c){let d=`${f.resolve(a)}.lock`,e=await o(d);for(let a=0;a<c.attempts;a+=1){let d=e();if(d)try{return await b()}finally{d.release()}a+1<c.attempts&&await c.sleep(c.retryDelayMs)}throw Error(`Failed to acquire lock for ${a} after ${c.attempts} attempts`)}function q(a){let b,c=f.resolve(a);try{b=(0,e.lstatSync)(c).isSymbolicLink()}catch(a){if(a instanceof Error&&"code"in a&&"ENOENT"===a.code)return c;throw a}return b?(0,e.realpathSync)(c):c}function r(a,b){return p(a,b,{attempts:50,retryDelayMs:100,sleep:g.setTimeout})}d()}catch(a){d(a)}})},80547:(a,b,c)=>{c.d(b,{B7:()=>i,Nw:()=>d.Nw,mc:()=>h,uK:()=>g.uK,wz:()=>d.wz});var d=c(25252),e=c(82536),f=c(78573),g=c(58864);async function h(){let a=Date.now(),b=globalThis.__piAllowedRootsCache;if(b&&b.expiresAt>a)return b.roots;let c=await (0,f.dQ)(),e=new Set;for(let a of c)a.cwd&&e.add((0,d.Nw)(a.cwd)),a.projectRoot&&e.add((0,d.Nw)(a.projectRoot));for(let a of(0,d.HM)())e.add(a);return globalThis.__piAllowedRootsCache={roots:e,expiresAt:a+5e3},e}function i(a,b){return(0,e.xk)(a,b)}},88016:(a,b,c)=>{c.d(b,{K:()=>d});let d=[{path:"defaultThinkingLevel",category:"models",group:"Thinking",label:{en:"Thinking Level",ko:"사고 수준"},description:{en:"Reasoning depth for thinking-capable models",ko:"사고 지원 모델의 추론 깊이"},kind:"enum",scope:"both",defaultValue:"high",choices:["minimal","low","medium","high","xhigh","max","auto"]},{path:"externalThinking",category:"models",group:"Thinking",label:{en:"External Thinking",ko:"외부 사고"},description:{en:"Private scratchpad; not shown to user. Disables supported GPT, Claude, and Gemini reasoning",ko:"사용자에게 표시되지 않는 비공개 메모장입니다. 지원되는 GPT, Claude, Gemini 추론을 비활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"model.loopGuard.checkAssistantContent",category:"models",group:"Thinking",label:{en:"Loop Guard Scan Prose",ko:"루프 가드 본문 검사"},description:{en:"Apply loop guard to assistant prose messages in addition to thinking logs",ko:"사고 로그뿐 아니라 어시스턴트 본문 메시지에도 루프 가드를 적용합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when model.loopGuard.enabled is on.",ko:"model.loopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"model.loopGuard.enabled",category:"models",group:"Thinking",label:{en:"Loop Guard",ko:"루프 가드"},description:{en:"Enable automatic stream loop detection for model reasoning and prose",ko:"모델의 추론 및 본문에서 스트림 루프를 자동 감지합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"model.loopGuard.toolCallReminder",category:"models",group:"Thinking",label:{en:"Loop Guard Tool-Call Reminder",ko:"루프 가드 도구 호출 알림"},description:{en:"When a Gemini reasoning stream emits many consecutive planning headers without calling a tool, interrupt it and inject a reminder to issue a tool call (requires Loop Guard)",ko:"Gemini 추론 스트림이 도구 호출 없이 연속된 계획 헤더를 많이 생성하면 중단하고 도구 호출 알림을 삽입합니다(Loop Guard 필요)."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when model.loopGuard.enabled is on.",ko:"model.loopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"model.toolCallLoopGuard.enabled",category:"models",group:"Thinking",label:{en:"Tool-Call Loop Guard",ko:"도구 호출 루프 가드"},description:{en:"Detect consecutive identical tool calls across turns and inject a corrective steer",ko:"턴 간에 연속으로 동일한 도구가 호출되면 감지하여 수정 지시를 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"model.toolCallLoopGuard.exemptTools",category:"models",group:"Thinking",label:{en:"Tool-Call Loop Exempt Tools",ko:"도구 호출 루프 제외 도구"},description:{en:"Tool names that may repeat consecutively without triggering the cross-turn loop guard",ko:"턴 간 루프 가드를 트리거하지 않고 연속으로 반복할 수 있는 도구 이름입니다."},kind:"array",scope:"both",defaultValue:["wait"],items:"string",appliesTo:{en:"Applies when model.toolCallLoopGuard.enabled is on.",ko:"model.toolCallLoopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"model.toolCallLoopGuard.threshold",category:"models",group:"Thinking",label:{en:"Tool-Call Loop Threshold",ko:"도구 호출 루프 임계값"},description:{en:"Consecutive identical tool calls required before the corrective steer is injected",ko:"수정 지시를 삽입하기 전까지 허용할 연속된 동일 도구 호출 횟수입니다."},kind:"number",scope:"both",defaultValue:5,integer:!0,appliesTo:{en:"Applies when model.toolCallLoopGuard.enabled is on.",ko:"model.toolCallLoopGuard.enabled가 켜진 경우 적용됩니다."}},{path:"omitThinking",category:"models",group:"Thinking",label:{en:"Omit Thinking summaries",ko:"사고 요약 생략"},description:{en:"Instruct upstream providers to completely omit thinking summaries from responses (where supported)",ko:"지원되는 경우 업스트림 제공자가 응답에서 사고 요약을 완전히 생략하도록 지시합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"providers.autoThinkingMaxEffort",category:"models",group:"Thinking",label:{en:"Auto Thinking Ceiling",ko:"자동 사고 상한"},description:{en:"Highest effort the `auto` classifier may resolve. `xhigh` keeps the classifier one tier below the top, so only an explicit `ultrathink` reaches `max`; `max` lets a turn the classifier judges exceptional bill the top tier on models that expose it.",ko:"`auto` 분류기가 선택할 수 있는 최대 노력 수준입니다. `xhigh`는 분류기를 최상위보다 한 단계 아래로 제한하므로 명시적인 `ultrathink`만 `max`에 도달합니다. `max`는 분류기가 예외적이라고 판단한 턴에 해당 단계를 지원하는 모델의 최상위 요금을 적용할 수 있게 합니다."},kind:"enum",scope:"both",defaultValue:"xhigh",choices:["xhigh","max"],appliesTo:{en:"Applies when defaultThinkingLevel is auto.",ko:"defaultThinkingLevel이 auto인 경우 적용됩니다."}},{path:"disabledProviders",category:"models",group:"Disabled Providers",label:{en:"Disabled Providers",ko:"비활성화된 제공자"},description:{en:"Providers that are disabled.",ko:"비활성화된 제공자 목록입니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"enabledProviders",category:"models",group:"Enabled Providers",label:{en:"Enabled Providers",ko:"활성화된 제공자"},description:{en:"Providers that are enabled.",ko:"활성화된 제공자 목록입니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"enabledModels",category:"models",group:"Enabled Models",label:{en:"Enabled Models",ko:"활성화된 모델"},description:{en:"Models that are enabled.",ko:"활성화된 모델 목록입니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"extendedContext",category:"models",group:"General",label:{en:"Extended Context",ko:"확장 컨텍스트"},description:{en:"Use larger context windows where supported; may incur premium pricing. Off keeps default or standard-pricing windows",ko:"지원되는 경우 더 큰 컨텍스트 창을 사용합니다. 프리미엄 요금이 부과될 수 있습니다. 끄면 기본 또는 표준 요금 컨텍스트 창을 유지합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"images.autoResize",category:"models",group:"Images",label:{en:"Auto-Resize Images",ko:"이미지 자동 크기 조정"},description:{en:"Resize large images to 2000x2000 max for better model compatibility",ko:"모델 호환성을 높이기 위해 큰 이미지의 최대 크기를 2000x2000으로 조정합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"images.blockImages",category:"models",group:"Images",label:{en:"Block Images",ko:"이미지 차단"},description:{en:"Prevent images from being sent to LLM providers",ko:"이미지가 LLM 제공자에게 전송되지 않도록 합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"images.urls.credentials",category:"models",group:"Images",label:{en:"Credentials",ko:"자격 증명"},description:{en:"Write-only map from image URL backend ids to backend credential name/value objects.",ko:"이미지 URL 백엔드 ID를 해당 백엔드의 자격 증명 이름/값 객체에 매핑하는 쓰기 전용 설정입니다."},kind:"object",scope:"global",recordValues:"json",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.urls.options",category:"models",group:"Images",label:{en:"Options",ko:"옵션"},description:{en:"Maps each image URL backend id to that backend's structured option object.",ko:"각 이미지 URL 백엔드 ID를 해당 백엔드의 구조화된 옵션 객체에 매핑합니다."},kind:"object",scope:"global",defaultValue:{},recordValues:"json",admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.describeForTextModels",category:"models",group:"Vision",label:{en:"Describe Images for Text Models",ko:"텍스트 모델용 이미지 설명"},description:{en:"When an image is attached to a model without vision support, save it under local:// and inject a description from a vision-capable model instead of dropping it",ko:"비전 미지원 모델에 이미지가 첨부되면 이미지를 삭제하는 대신 local:// 아래에 저장하고 비전 지원 모델이 생성한 설명을 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"images.urls.backends",category:"models",group:"Vision",label:{en:"Image URL Backends",ko:"이미지 URL 백엔드"},description:{en:"Ordered destinations tried when publishing images for provider access",ko:"제공자 접근을 위해 이미지를 게시할 때 순서대로 시도할 대상입니다."},kind:"array",scope:"global",defaultValue:["provider-files","tailscale","cloudflared","litterbox"],choices:["imgur","imageshack","flickr","chevereto","vgyme","dropbox","ftp","onedrive","google-drive","puush","box","amazon-s3","google-cloud-storage","azure-storage","backblaze-b2","owncloud","mediafire","sendspace","localhostr","lambda","pomf","uguu","seafile","s-ul","lobfile","transfer-sh","plik","shared-folder","catbox","litterbox","0x0","tmpfiles","discord","provider-files","direct","cloudflared","ngrok","tailscale","ssh","command","localhost-run","pinggy","devtunnel","zrok","bore","named-cloudflared","r2","tigris","minio","garage"],items:"string",admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.urls.bindHost",category:"models",group:"Vision",label:{en:"Image URL Bind Host",ko:"이미지 URL 바인드 호스트"},description:{en:"Host the blob server binds to; loopback for tunnels, 0.0.0.0 for direct serving",ko:"블롭 서버가 바인딩할 호스트입니다. 터널에는 loopback, 직접 제공에는 0.0.0.0을 사용합니다."},kind:"string",scope:"global",defaultValue:"127.0.0.1",admin:!0,confirmation:!0,appliesTo:{en:"Applies to locally hosted direct and tunnel image URL backends.",ko:"로컬에서 호스팅되는 direct 및 터널 이미지 URL 백엔드에 적용됩니다."}},{path:"images.urls.command",category:"models",group:"Vision",label:{en:"Image Upload Command",ko:"이미지 업로드 명령"},description:{en:"Argv template for the command backend; {file} is the image path, {mime}/{ext} optional. The last URL printed on stdout is used (e.g. pasta -b -f {file})",ko:"명령 백엔드용 Argv 템플릿입니다. {file}은 이미지 경로이며 {mime}/{ext}는 선택 사항입니다. stdout에 출력된 마지막 URL을 사용합니다(예: pasta -b -f {file})."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when the command image URL backend is selected.",ko:"command 이미지 URL 백엔드를 선택한 경우 적용됩니다."}},{path:"images.urls.enabled",category:"models",group:"Vision",label:{en:"Serve Images as URLs",ko:"이미지를 URL로 제공"},description:{en:"Publish outgoing images through the configured backend chain and send URL-fetching providers short URLs instead of inline base64. Falls back to inline automatically when every backend or a provider fetch fails",ko:"설정된 백엔드 체인을 통해 발신 이미지를 게시하고, URL을 가져올 수 있는 제공자에게 inline base64 대신 짧은 URL을 전송합니다. 모든 백엔드 또는 제공자의 가져오기가 실패하면 자동으로 inline 방식으로 대체합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"images.urls.publicBaseUrl",category:"models",group:"Vision",label:{en:"Image URL Public Base",ko:"이미지 URL 공개 베이스"},description:{en:"Externally reachable base URL fronting the blob server (required for ssh, optional for direct)",ko:"블롭 서버 앞단에서 외부 접근이 가능한 베이스 URL입니다(ssh에는 필수, 직접 제공에는 선택 사항)."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Required by the ssh backend and optional for the direct backend.",ko:"ssh 백엔드에는 필수이며 direct 백엔드에는 선택 사항입니다."}},{path:"images.urls.sshRemotePort",category:"models",group:"Vision",label:{en:"Image URL SSH Remote Port",ko:"이미지 URL SSH 원격 포트"},description:{en:"Remote listen port of the ssh reverse forward that your web server proxies to",ko:"웹 서버가 프록시하는 ssh 역방향 포워딩의 원격 수신 포트입니다."},kind:"number",scope:"global",defaultValue:8787,integer:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when the ssh image URL backend is selected.",ko:"ssh 이미지 URL 백엔드를 선택한 경우 적용됩니다."}},{path:"images.urls.sshTarget",category:"models",group:"Vision",label:{en:"Image URL SSH Target",ko:"이미지 URL SSH 대상"},description:{en:"user@host destination for the ssh reverse forward",ko:"ssh 역방향 포워딩의 user@host 대상입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when the ssh image URL backend is selected.",ko:"ssh 이미지 URL 백엔드를 선택한 경우 적용됩니다."}},{path:"images.urls.ttlHours",category:"models",group:"Vision",label:{en:"Image URL Lifetime (hours)",ko:"이미지 URL 수명(hours)"},description:{en:"Serving window for locally hosted image URLs, measured from the last time a conversation sent them; resuming a conversation re-arms the window at the same link. 0 keeps links alive while the broker runs",ko:"로컬 호스팅 이미지 URL의 제공 기간으로, 대화에서 마지막으로 전송한 시점부터 측정합니다. 대화를 재개하면 같은 링크의 제공 기간이 다시 시작됩니다. 0이면 브로커가 실행되는 동안 링크를 유지합니다."},kind:"number",scope:"both",defaultValue:72,admin:!0,confirmation:!0,appliesTo:{en:"Applies to images.urls.enabled.",ko:"images.urls.enabled에 적용됩니다."}},{path:"images.questionTimeoutMs",category:"models",group:"Execution",label:{en:"Image Question Timeout",ko:"이미지 질문 제한 시간"},description:{en:"Per-request timeout for the vision-model call behind read's ?q= image questions, in milliseconds. A stalled provider fails fast with a timeout error instead of blocking until manual abort. Set to 0 to disable the timeout.",ko:"read의 ?q= 이미지 질문에 사용되는 비전 모델 호출의 요청별 제한 시간(ms)입니다. 제공자가 응답하지 않으면 수동 중단까지 차단하는 대신 제한 시간 오류로 빠르게 실패합니다. 제한 시간을 비활성화하려면 0으로 설정하세요."},kind:"number",scope:"both",defaultValue:3e5,integer:!0},{path:"includeModelInPrompt",category:"models",group:"Prompt",label:{en:"Include Model in Prompt",ko:"프롬프트에 모델 포함"},description:{en:"Surface the active model identifier in the system prompt so the agent knows which model it is",ko:"에이전트가 사용 중인 모델을 알 수 있도록 활성 모델 식별자를 시스템 프롬프트에 표시합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"inlineToolDescriptors",category:"models",group:"Prompt",label:{en:"Inline Tool Descriptors",ko:"인라인 도구 설명자"},description:{en:"Render full tool descriptors in the system prompt and strip top-level/nested descriptions from provider tool schemas so descriptor text is sent once. Auto enables this for Gemini models and disables it otherwise",ko:"전체 도구 설명자를 시스템 프롬프트에 렌더링하고 제공자 도구 스키마의 최상위 및 중첩 설명을 제거하여 설명자 텍스트가 한 번만 전송되게 합니다. Gemini 모델에는 자동으로 활성화되고 그 외 모델에는 비활성화됩니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","on","off"]},{path:"modelRoleStorage",category:"models",group:"Prompt",label:{en:"Model Role Storage",ko:"모델 역할 저장 위치"},description:{en:"Where model selector role assignments are saved",ko:"모델 선택기의 역할 할당을 저장할 위치입니다."},kind:"enum",scope:"both",defaultValue:"global",choices:["global","project"]},{path:"minP",category:"models",group:"Sampling",label:{en:"Min P",ko:"최소 P"},description:{en:"Minimum probability threshold (0-1, -1 = provider default)",ko:"최소 확률 임계값(0-1, -1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1,min:-1,max:1,step:.01},{path:"presencePenalty",category:"models",group:"Sampling",label:{en:"Presence Penalty",ko:"존재 페널티"},description:{en:"Penalty for introducing already-present tokens (-1 = provider default)",ko:"이미 존재하는 토큰을 도입할 때 적용하는 페널티입니다(-1 = 제공자 기본값)."},kind:"number",scope:"both",defaultValue:-1,integer:!1},{path:"repetitionPenalty",category:"models",group:"Sampling",label:{en:"Repetition Penalty",ko:"반복 페널티"},description:{en:"Penalty for repeated tokens (-1 = provider default)",ko:"반복 토큰에 적용할 페널티(-1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1},{path:"temperature",category:"models",group:"Sampling",label:{en:"Temperature",ko:"온도"},description:{en:"Sampling temperature (0 = deterministic, 1 = creative, -1 = provider default)",ko:"샘플링 온도(0 = 결정적, 1 = 창의적, -1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1},{path:"textVerbosity",category:"models",group:"Sampling",label:{en:"Text Verbosity",ko:"텍스트 상세도"},description:{en:"OpenAI Responses and Codex response verbosity (low, medium, or high)",ko:"OpenAI Responses 및 Codex 응답 상세도(low, medium 또는 high)"},kind:"enum",scope:"both",defaultValue:"medium",choices:["low","medium","high"]},{path:"tier.advisor",category:"models",group:"Sampling",label:{en:"Service Tier —\x80\x94 Advisor",ko:"서비스 티어 — Advisor"},description:{en:"Service Tier for the advisor model. None = standard processing; Inherit = match the main agent's live per-family tiers; pick a value to apply it to the advisor model's family.",ko:"advisor 모델의 Service Tier입니다. None = 표준 처리, Inherit = 기본 에이전트의 실시간 제품군별 티어와 일치. 값을 선택하면 advisor 모델의 제품군에 적용됩니다."},kind:"enum",scope:"both",defaultValue:"none",choices:["inherit","none","auto","default","flex","scale","priority","ultrafast"],appliesTo:{en:"Applies to advisor provider models.",ko:"advisor 제공자 모델에 적용됩니다."}},{path:"tier.anthropic",category:"models",group:"Sampling",label:{en:"Service Tier —\x80\x94 Anthropic",ko:"서비스 티어 — Anthropic"},description:{en:'Processing tier for Claude requests. `priority` realizes fast mode (`speed: "fast"`) on supported direct Anthropic models; ignored on Bedrock/Vertex Claude and via OpenRouter.',ko:'Claude 요청의 처리 티어입니다. `priority`는 지원되는 Anthropic 직접 연결 모델에서 빠른 모드(`speed: "fast"`)를 사용합니다. Bedrock/Vertex Claude 및 OpenRouter를 통한 요청에서는 무시됩니다.'},kind:"enum",scope:"both",defaultValue:"none",choices:["none","priority"],appliesTo:{en:"Applies to anthropic provider models.",ko:"anthropic 제공자 모델에 적용됩니다."}},{path:"tier.google",category:"models",group:"Sampling",label:{en:"Service Tier —\x80\x94 Google",ko:"서비스 티어 — Google"},description:{en:"Processing tier for Gemini (Google AI Studio + Vertex) requests, and Google-family models routed via OpenRouter (none = omit). Sent as the top-level `serviceTier` field.",ko:"Gemini(Google AI Studio + Vertex) 요청 및 OpenRouter를 통해 라우팅되는 Google 제품군 모델의 처리 티어입니다(none = 생략). 최상위 `serviceTier` 필드로 전송됩니다."},kind:"enum",scope:"both",defaultValue:"none",choices:["none","flex","priority"],appliesTo:{en:"Applies to google provider models.",ko:"google 제공자 모델에 적용됩니다."}},{path:"tier.openai",category:"models",group:"Sampling",label:{en:"Service Tier —\x80\x94 OpenAI",ko:"서비스 티어 — OpenAI"},description:{en:"Processing tier for OpenAI / OpenAI-Codex requests, and OpenAI-family models routed via OpenRouter (none = omit). Sent as `service_tier`.",ko:"OpenAI / OpenAI-Codex 요청 및 OpenRouter를 통해 라우팅되는 OpenAI 제품군 모델의 처리 티어입니다(none = 생략). `service_tier`로 전송됩니다."},kind:"enum",scope:"both",defaultValue:"none",choices:["none","auto","default","flex","scale","priority","ultrafast"],appliesTo:{en:"Applies to openai provider models.",ko:"openai 제공자 모델에 적용됩니다."}},{path:"tier.subagent",category:"models",group:"Sampling",label:{en:"Service Tier —\x80\x94 Subagent",ko:"서비스 티어 — 서브에이전트"},description:{en:"Service Tier for spawned task/eval subagents. Inherit = match the main agent's live per-family tiers (tracks /fast); pick a value to apply it to whichever family the subagent's model belongs to.",ko:"생성된 task/eval 서브에이전트의 Service Tier입니다. Inherit = 기본 에이전트의 실시간 제품군별 티어와 일치(/fast 추적). 값을 선택하면 서브에이전트 모델이 속한 제품군에 적용됩니다."},kind:"enum",scope:"both",defaultValue:"inherit",choices:["inherit","none","auto","default","flex","scale","priority","ultrafast"],appliesTo:{en:"Applies to subagent provider models.",ko:"subagent 제공자 모델에 적용됩니다."}},{path:"topK",category:"models",group:"Sampling",label:{en:"Top K",ko:"Top K"},description:{en:"Sample from top-K tokens (-1 = provider default)",ko:"상위 K개 토큰에서 샘플링(-1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!0},{path:"topP",category:"models",group:"Sampling",label:{en:"Top P",ko:"Top P"},description:{en:"Nucleus sampling cutoff (0-1, -1 = provider default)",ko:"핵 샘플링 임계값(0-1, -1 = 제공자 기본값)"},kind:"number",scope:"both",defaultValue:-1,integer:!1,min:-1,max:1,step:.01},{path:"modelProviderOrder",category:"models",group:"Model Provider Order",label:{en:"Model Provider Order",ko:"모델 제공자 순서"},description:{en:"Sets the ordered list of model providers.",ko:"모델 제공자의 순서 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"modelRoles",category:"models",group:"Model Roles",label:{en:"Model Roles",ko:"모델 역할"},description:{en:"Maps each model role name to a model selector.",ko:"각 모델 역할 이름을 모델 선택자에 매핑합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"model-role"},{path:"modelTags",category:"models",group:"Model Tags",label:{en:"Model Tags",ko:"모델 태그"},description:{en:"Maps each tag id to an object with a required name and optional color and hidden flag.",ko:"각 태그 ID를 필수 name과 선택적 color 및 hidden 플래그가 있는 객체에 매핑합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"json"},{path:"providers.fetch",category:"models",group:"Services",label:{en:"Fetch Provider",ko:"Fetch 제공자"},description:{en:"Reader backend priority for the fetch/read URL tool",ko:"fetch/read URL 도구의 리더 백엔드 우선순위입니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","native","trafilatura","lynx","parallel","firecrawl","jina"],appliesTo:{en:"Applies to URL reads performed by the fetch/read tool.",ko:"fetch/read 도구가 수행하는 URL 읽기에 적용됩니다."}},{path:"providers.maxInFlightRequests",category:"models",group:"Services",label:{en:"Max In-Flight Requests",ko:"최대 동시 처리 요청 수"},description:{en:'Maximum concurrent LLM requests per provider id (for example "openai" or "anthropic"), shared across local OMP processes with this config root. Omitted providers are unlimited.',ko:'제공자 id별 최대 동시 LLM 요청 수입니다(예: "openai" 또는 "anthropic"). 이 구성 루트를 사용하는 로컬 OMP 프로세스 간에 공유됩니다. 생략된 제공자는 무제한입니다.'},kind:"object",scope:"both",defaultValue:{},recordValues:"json",appliesTo:{en:"Applies to the matching model provider or provider feature.",ko:"해당 모델 제공자 또는 제공자 기능에 적용됩니다."}},{path:"providers.openai-codex.codeMode",category:"models",group:"Services",label:{en:"Codex Code Mode",ko:"Codex 코드 모드"},description:{en:"Route Codex code_mode_only models (GPT-5.6) through eval. The direct tools are eval, ask, todo, yield, think, checkpoint, and rewind. Use eval cells for other session tools. Mirrors codex-rs Code Mode. 'auto' follows the model catalog flag.",ko:"Codex code_mode_only 모델(GPT-5.6)을 eval을 통해 실행합니다. 직접 도구는 eval, ask, todo, yield, think, checkpoint, rewind이며 그 밖의 세션 도구는 eval 셀에서 사용합니다. codex-rs Code Mode와 동일하게 동작하며 'auto'는 모델 카탈로그 플래그를 따릅니다."},kind:"enum",scope:"both",defaultValue:"off",choices:["off","on","auto"],appliesTo:{en:"Applies to openai-codex provider models.",ko:"openai-codex 제공자 모델에 적용됩니다."}},{path:"providers.anthropic.slowMode",category:"models",group:"Services",label:{en:"Anthropic Slow Mode",ko:"Anthropic 저속 모드"},description:{en:"When a Claude subscription hits its session limit and Anthropic offers low priority, continue at low priority after any wrap-up allowance (auto). Same setting as /slow on Anthropic.",ko:"Claude 구독이 세션 한도에 도달하고 Anthropic이 낮은 우선순위 처리를 제공하면 마무리 허용량을 쓴 뒤 낮은 우선순위로 계속 진행합니다(auto). Anthropic에서 /slow와 같은 설정입니다."},kind:"enum",scope:"both",defaultValue:"off",choices:["off","auto"],appliesTo:{en:"Applies to first-party Anthropic Claude subscription accounts.",ko:"Anthropic 자사 Claude 구독 계정에 적용됩니다."}},{path:"providers.webSearchTimeoutSeconds",category:"models",group:"Services",label:{en:"Web Search Timeout",ko:"웹 검색 시간 초과"},description:{en:"Hard timeout for each provider's search transport before web_search advances to the next fallback, in seconds (maximum 300)",ko:"web_search가 다음 대체 제공자로 넘어가기 전까지 각 제공자의 검색 전송에 적용할 강제 시간 제한(초)입니다(최대 300)."},kind:"number",scope:"both",defaultValue:60,max:300,appliesTo:{en:"Applies to each web search provider attempt.",ko:"각 웹 검색 제공자 시도에 적용됩니다."}},{path:"providers.streamFirstEventTimeoutSeconds",category:"models",group:"Timeouts",label:{en:"Stream First Event Timeout",ko:"스트림 첫 이벤트 시간 초과"},description:{en:"Seconds to wait for the first model stream event; -1 uses provider/env defaults, 0 disables the watchdog",ko:"첫 모델 스트림 이벤트를 기다릴 시간(초)입니다. -1은 제공자/env 기본값을 사용하고, 0은 감시 기능을 비활성화합니다."},kind:"number",scope:"both",defaultValue:-1,appliesTo:{en:"Applies to the matching model provider or provider feature.",ko:"해당 모델 제공자 또는 제공자 기능에 적용됩니다."}},{path:"providers.streamIdleTimeoutSeconds",category:"models",group:"Timeouts",label:{en:"Stream Idle Timeout",ko:"스트림 유휴 시간 초과"},description:{en:"Seconds a model stream may stay silent between events; -1 uses provider/env defaults, 0 disables the watchdog",ko:"모델 스트림이 이벤트 사이에 응답 없이 유지될 수 있는 시간(초)입니다. -1은 제공자/env 기본값을 사용하고, 0은 감시 기능을 비활성화합니다."},kind:"number",scope:"both",defaultValue:-1,appliesTo:{en:"Applies to the matching model provider or provider feature.",ko:"해당 모델 제공자 또는 제공자 기능에 적용됩니다."}},{path:"providers.cacheRetention",category:"models",group:"Protocol",label:{en:"Prompt Cache Retention",ko:"프롬프트 캐시 보존"},description:{en:"Prompt-cache retention forwarded to providers that support it (Anthropic, Bedrock, OpenRouter, OpenAI)",ko:"지원하는 제공자(Anthropic, Bedrock, OpenRouter, OpenAI)에 전달할 프롬프트 캐시 보존 기간입니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","short","long","none"]},{path:"providers.cacheWarming",category:"models",group:"Protocol",label:{en:"Cache Warming",ko:"캐시 예열"},description:{en:"Re-send the last request with a one-token output budget shortly before its prompt-cache entry expires",ko:"프롬프트 캐시 항목이 만료되기 직전에 출력 예산 1토큰으로 마지막 요청을 다시 보냅니다."},kind:"enum",scope:"both",defaultValue:"idle",choices:["off","streaming","idle"]},{path:"provider.appendOnlyContext",category:"models",group:"Protocol",label:{en:"Append-Only Context",ko:"추가 전용 컨텍스트"},description:{en:"Cache system prompt + tool specs and keep an append-only message log so provider prefix caches (DeepSeek, Xiaomi/SGLang, Anthropic) hit at maximum rate. Auto enables for known prefix-cache providers.",ko:"시스템 프롬프트와 도구 명세를 캐시하고 메시지 로그를 추가 전용으로 유지하여 제공자 접두사 캐시(DeepSeek, Xiaomi/SGLang, Anthropic)의 적중률을 최대화합니다. Auto는 알려진 접두사 캐시 제공자에서 활성화합니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","on","off"]},{path:"providers.openaiWebsockets",category:"models",group:"Protocol",label:{en:"OpenAI WebSockets",ko:"OpenAI WebSocket"},description:{en:"Websocket policy for OpenAI Codex models (auto uses model defaults, on forces, off disables)",ko:"OpenAI Codex 모델의 WebSocket 정책입니다(auto는 모델 기본값 사용, on은 강제 사용, off는 비활성화)."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","off","on"]},{path:"providers.openaiLiveSteering",category:"models",group:"Protocol",label:{en:"OpenAI Live Steering",ko:"OpenAI 실시간 조정"},description:{en:"Deliver messages typed while a GPT-6 response streams into that response over the Codex WebSocket, instead of waiting for the next tool boundary",ko:"GPT-6 응답이 스트리밍되는 동안 입력한 메시지를 다음 도구 경계까지 기다리지 않고 Codex WebSocket을 통해 해당 응답에 바로 전달합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to OpenAI Codex models over WebSocket.",ko:"WebSocket을 사용하는 OpenAI Codex 모델에 적용됩니다."}},{path:"thinkingBudgets.high",category:"models",group:"Thinking Budgets",label:{en:"High",ko:"높음"},description:{en:"Token budget for the high thinking level.",ko:"high 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:16384,integer:!0},{path:"thinkingBudgets.low",category:"models",group:"Thinking Budgets",label:{en:"Low",ko:"낮음"},description:{en:"Token budget for the low thinking level.",ko:"low 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:2048,integer:!0},{path:"thinkingBudgets.max",category:"models",group:"Thinking Budgets",label:{en:"Max",ko:"최대"},description:{en:"Token budget for the maximum thinking level.",ko:"maximum 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:32768,integer:!0},{path:"thinkingBudgets.medium",category:"models",group:"Thinking Budgets",label:{en:"Medium",ko:"중간"},description:{en:"Token budget for the medium thinking level.",ko:"medium 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:8192,integer:!0},{path:"thinkingBudgets.minimal",category:"models",group:"Thinking Budgets",label:{en:"Minimal",ko:"최소"},description:{en:"Token budget for the minimal thinking level.",ko:"minimal 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:1024,integer:!0},{path:"thinkingBudgets.xhigh",category:"models",group:"Thinking Budgets",label:{en:"Xhigh",ko:"매우 높음"},description:{en:"Token budget for the xhigh thinking level.",ko:"xhigh 사고 수준의 토큰 예산입니다."},kind:"number",scope:"both",defaultValue:32768,integer:!0},{path:"autolearn.autoContinue",category:"intelligence",group:"Auto-Learn",label:{en:"Auto-run capture at stop",ko:"중지 시 캡처 자동 실행"},description:{en:"When on, auto-run one private capture turn at stop (uses extra tokens). When off, only standing auto-learn guidance remains.",ko:"켜면 중지 시 비공개 캡처 턴을 한 번 자동 실행합니다(추가 토큰 사용). 끄면 상시 자동 학습 지침만 유지됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"autolearn.enabled",category:"intelligence",group:"Auto-Learn",label:{en:"Auto-Learn (experimental)",ko:"자동 학습(실험적)"},description:{en:"After the agent stops, nudge it to capture lessons to memory and create/enhance isolated managed skills",ko:"에이전트가 중지된 후 학습 내용을 메모리에 기록하고 격리된 관리형 스킬을 생성하거나 개선하도록 유도합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"autolearn.minToolCalls",category:"intelligence",group:"Autolearn",label:{en:"Min Tool Calls",ko:"최소 도구 호출 수"},description:{en:"Minimum number of tool calls for automatic learning.",ko:"자동 학습을 위한 최소 도구 호출 횟수입니다."},kind:"number",scope:"both",defaultValue:5,integer:!0},{path:"compaction.asyncEnabled",category:"intelligence",group:"Compaction",label:{en:"Async Compaction",ko:"비동기 압축"},description:{en:"Speculatively summarize in the background as context nears the compaction threshold, then splice the ready result in when the threshold is crossed",ko:"컨텍스트가 압축 임곗값에 가까워지면 백그라운드에서 미리 요약하고, 임곗값을 넘을 때 준비된 결과를 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.autoContinue",category:"intelligence",group:"Compaction",label:{en:"Auto Continue",ko:"자동 계속"},description:{en:"Whether to continue automatically after compaction.",ko:"압축 후 자동으로 계속할지 여부입니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.dropUseless",category:"intelligence",group:"Compaction",label:{en:"Elide Uneventful Results",ko:"무의미한 결과 생략"},description:{en:"Prune tool results flagged contextually useless (no matches, timed-out waits) once consumed (cache-aware)",ko:"컨텍스트상 불필요하다고 표시된 도구 결과(일치 항목 없음, 대기 시간 초과)를 사용 후 제거합니다(캐시 인식)."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.enabled",category:"intelligence",group:"Compaction",label:{en:"Auto-Compact",ko:"자동 압축"},description:{en:"Automatically compact context when it gets too large",ko:"컨텍스트가 너무 커지면 자동으로 압축합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"compaction.experimentalContextManagement",category:"intelligence",group:"Compaction",label:{en:"Notes-backed context windows (experimental)",ko:"메모 기반 컨텍스트 창(실험적)"},description:{en:"Keep persistent notes and searchable raw history across context windows. Restart to update available tools.",ko:"컨텍스트 창이 바뀌어도 영구 메모와 검색 가능한 원시 기록을 유지합니다. 사용 가능한 도구를 업데이트하려면 다시 시작하세요."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.handoffSaveToDisk",category:"intelligence",group:"Compaction",label:{en:"Save Handoff Docs",ko:"인계 문서 저장"},description:{en:"Save generated handoff documents to markdown files for the auto-handoff flow",ko:"자동 인계 흐름에서 생성된 인계 문서를 Markdown 파일로 저장합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.idleEnabled",category:"intelligence",group:"Compaction",label:{en:"Idle Compaction",ko:"유휴 압축"},description:{en:"Compact context while idle when token count exceeds threshold",ko:"토큰 수가 임곗값을 초과하면 유휴 상태에서 컨텍스트를 압축합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.idleThresholdTokens",category:"intelligence",group:"Compaction",label:{en:"Idle Compaction Threshold",ko:"유휴 압축 임곗값"},description:{en:"Token count above which idle compaction triggers",ko:"유휴 압축을 시작할 토큰 수 임곗값입니다."},kind:"number",scope:"both",defaultValue:2e5,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.idleTimeoutSeconds",category:"intelligence",group:"Compaction",label:{en:"Idle Compaction Delay",ko:"유휴 압축 지연 시간"},description:{en:"Seconds to wait while idle before compacting",ko:"압축 전 유휴 상태로 대기할 시간(초)입니다."},kind:"number",scope:"both",defaultValue:300,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.keepRecentTokens",category:"intelligence",group:"Compaction",label:{en:"Keep Recent Tokens",ko:"최근 토큰 유지"},description:{en:"Number of recent tokens to keep during compaction.",ko:"압축 중 유지할 최근 토큰 수입니다."},kind:"number",scope:"both",defaultValue:2e4,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.methodOrder",category:"intelligence",group:"Compaction",label:{en:"Compaction Method Order",ko:"압축 방식 순서"},description:{en:"Preferred fallback order for automatic context maintenance; unavailable or failed methods advance to the next choice",ko:"자동 컨텍스트 유지 관리의 선호 대체 순서입니다. 사용할 수 없거나 실패한 방식은 건너뛰고 다음 방식을 사용합니다."},kind:"array",scope:"both",defaultValue:["remote","snapcompact","handoff","shake","soft"],choices:["remote","snapcompact","handoff","soft","shake"],items:"string",appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"snapcompact.systemPrompt",category:"intelligence",group:"Compaction",label:{en:"Snapcompact System Prompt",ko:"Snapcompact 시스템 프롬프트"},description:{en:"Experimental: render selected system prompt text as dense PNG image(s) and attach to the first user message (vision models only). Saves tokens; loses prompt caching for imaged text.",ko:"실험 기능: 선택한 시스템 프롬프트 텍스트를 고밀도 PNG 이미지로 렌더링해 첫 사용자 메시지에 첨부합니다(비전 모델 전용). 토큰은 절약되지만 이미지로 바뀐 텍스트는 프롬프트 캐시를 쓸 수 없습니다."},kind:"enum",scope:"both",defaultValue:"none",choices:["none","agents-md","all"],appliesTo:{en:"Vision-capable models only.",ko:"비전 지원 모델에만 적용됩니다."}},{path:"snapcompact.toolResults",category:"intelligence",group:"Compaction",label:{en:"Snapcompact Tool Results",ko:"Snapcompact 도구 결과"},description:{en:"Experimental: render large historical tool results as dense PNG image(s) instead of text (vision models only). Saves tokens on accumulated read/search output.",ko:"실험 기능: 이전의 큰 도구 결과를 텍스트 대신 고밀도 PNG 이미지로 렌더링합니다(비전 모델 전용). 누적된 read/검색 출력의 토큰을 절약합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Vision-capable models only.",ko:"비전 지원 모델에만 적용됩니다."}},{path:"snapcompact.shape",category:"intelligence",group:"Compaction",label:{en:"Snapcompact Shape",ko:"Snapcompact 형태"},description:{en:"Frame shape snapcompact prints text with (compaction archive and inline imaging). Auto picks a shape tuned for the current model.",ko:"snapcompact가 텍스트를 출력할 프레임 형태입니다(압축 아카이브 및 인라인 이미지화). auto는 현재 모델에 맞춘 형태를 선택합니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","8x8r-bw","8x8r-sent","8x8u-bw","8x8u-sent","6x6u-bw","6x6u-sent","5x8-bw","5x8-sent","6x12-dim","8x13-bw","8on16-bw","8on22-bw","11on16-bw","silver16-bw","doc-8on16-bw","doc-8on16-sent","doc-8on16-sent-dim"]},{path:"compaction.midTurnEnabled",category:"intelligence",group:"Compaction",label:{en:"Mid-Turn Compaction",ko:"턴 도중 압축"},description:{en:"Check thresholds at safe mid-turn tool-loop boundaries before the next provider request",ko:"다음 제공자 요청 전에 안전한 턴 도중 도구 루프 경계에서 임곗값을 확인합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.remoteEndpoint",category:"intelligence",group:"Compaction",label:{en:"Remote Endpoint",ko:"원격 엔드포인트"},description:{en:"Remote endpoint used for compaction. The active model credential is sent to this endpoint.",ko:"압축에 사용하는 원격 엔드포인트입니다. 활성 모델의 자격 증명이 이 엔드포인트로 전송됩니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when compaction.methodOrder includes remote.",ko:"compaction.methodOrder에 remote가 포함된 경우 적용됩니다."}},{path:"compaction.remoteStreamingV2Enabled",category:"intelligence",group:"Compaction",label:{en:"Remote Compaction V2",ko:"원격 압축 V2"},description:{en:"Use Responses streaming compaction for compatible remote compaction models",ko:"호환되는 원격 압축 모델에 Responses 스트리밍 압축 사용"},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when compaction.methodOrder includes remote.",ko:"compaction.methodOrder에 remote가 포함된 경우 적용됩니다."}},{path:"compaction.reserveTokens",category:"intelligence",group:"Compaction",label:{en:"Reserve Tokens",ko:"예약 토큰"},description:{en:"Number of tokens to reserve during compaction.",ko:"압축 중 예약할 토큰 수입니다."},kind:"number",scope:"both",integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.supersedeReads",category:"intelligence",group:"Compaction",label:{en:"Supersede Stale Reads",ko:"오래된 읽기 대체"},description:{en:"Prune older read results when the same file is read again (cache-aware, runs every turn)",ko:"같은 파일을 다시 읽을 때 이전 읽기 결과를 제거합니다(캐시 인식, 매 턴 실행)."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.thresholdPercent",category:"intelligence",group:"Compaction",label:{en:"Compaction Threshold",ko:"압축 임계값"},description:{en:"Percent threshold for context maintenance; set to Default to use legacy reserve-based behavior",ko:"컨텍스트 유지를 위한 백분율 임계값입니다. 기존 예약 기반 동작을 사용하려면 Default로 설정하세요."},kind:"number",scope:"both",defaultValue:-1,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.thresholdTokens",category:"intelligence",group:"Compaction",label:{en:"Compaction Token Limit",ko:"압축 토큰 한도"},description:{en:"Fixed token limit for context maintenance; overrides percentage if set",ko:"컨텍스트 유지를 위한 고정 토큰 한도입니다. 설정하면 백분율보다 우선합니다."},kind:"number",scope:"both",defaultValue:-1,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"compaction.v2RetainedMessageBudget",category:"intelligence",group:"Compaction",label:{en:"V2 Retained Message Budget",ko:"V2 보존 메시지 예산"},description:{en:"Retained message budget for compaction version 2.",ko:"압축 버전 2의 보존 메시지 예산입니다."},kind:"number",scope:"both",defaultValue:64e3,integer:!0,appliesTo:{en:"Applies to compaction.enabled.",ko:"compaction.enabled에 적용됩니다."}},{path:"contextPromotion.enabled",category:"intelligence",group:"General",label:{en:"Auto-Promote Context",ko:"컨텍스트 자동 확장"},description:{en:"Promote to a larger-context model on context overflow instead of compacting",ko:"컨텍스트가 초과되면 압축 대신 더 큰 컨텍스트 모델로 전환합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"memory.backend",category:"intelligence",group:"General",label:{en:"Memory Backend",ko:"메모리 백엔드"},description:{en:"Off, local summary pipeline, Mnemopi SQLite, Hindsight remote memory, or Sharpshooter",ko:"끄기, 로컬 요약 파이프라인, Mnemopi SQLite, Hindsight 원격 메모리 또는 Sharpshooter"},kind:"enum",scope:"both",defaultValue:"off",choices:["off","local","hindsight","mnemopi","sharpshooter"]},{path:"goal.continuationModes",category:"intelligence",group:"Modes",label:{en:"Goal Continuation Modes",ko:"목표 계속 모드"},description:{en:"Run modes where active goals may auto-continue between turns",ko:"활성 목표가 턴 사이에 자동으로 계속될 수 있는 실행 모드"},kind:"array",scope:"both",defaultValue:["interactive"],items:"string"},{path:"goal.enabled",category:"intelligence",group:"Modes",label:{en:"Goal Mode",ko:"목표 모드"},description:{en:"Enable per-session goal mode and the hidden goal tool",ko:"세션별 목표 모드와 숨겨진 goal 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"title.refreshOnReplan",category:"intelligence",group:"Modes",label:{en:"Refresh Title on Replan",ko:"재계획 시 제목 새로 고침"},description:{en:"Refresh generated session titles after todo init replans unless the title was set by the user",ko:"할 일 초기화로 재계획한 뒤 자동 생성된 세션 제목을 새로 고칩니다. 사용자가 직접 지정한 제목은 유지합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"hindsight.apiToken",category:"intelligence",group:"Hindsight",label:{en:"Hindsight API Token",ko:"Hindsight API 토큰"},description:{en:"Bearer token for authenticated Hindsight servers",ko:"인증된 Hindsight 서버용 Bearer 토큰"},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.apiUrl",category:"intelligence",group:"Hindsight",label:{en:"Hindsight API URL",ko:"Hindsight API URL"},description:{en:"Hindsight server URL (Cloud or self-hosted)",ko:"Hindsight 서버 URL(Cloud 또는 자체 호스팅)"},kind:"string",scope:"global",defaultValue:"http://localhost:8888",admin:!0,confirmation:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.autoRecall",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Auto Recall",ko:"Hindsight 자동 회상"},description:{en:"Recall memories on the first turn of each session",ko:"각 세션의 첫 번째 턴에 메모리를 회상합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.autoRetain",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Auto Retain",ko:"Hindsight 자동 보존"},description:{en:"Retain transcript every N turns and at session boundaries",ko:"N턴마다 그리고 세션 경계에서 대화 기록을 보존합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.bankId",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Bank ID",ko:"Hindsight Bank ID"},description:{en:"Memory bank identifier (default: project name)",ko:"메모리 bank 식별자(기본값: 프로젝트 이름)"},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.bankIdPrefix",category:"intelligence",group:"Hindsight",label:{en:"Bank ID Prefix",ko:"Bank ID 접두사"},description:{en:"Prefix for Hindsight bank IDs.",ko:"Hindsight 뱅크 ID의 접두사입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.bankMission",category:"intelligence",group:"Hindsight",label:{en:"Bank Mission",ko:"Bank 미션"},description:{en:"Mission configured for the Hindsight bank.",ko:"Hindsight 뱅크에 구성된 미션입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.mentalModelAutoSeed",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Mental Model Auto-Seed",ko:"Hindsight 멘탈 모델 자동 시드"},description:{en:"At session start, create any built-in mental models (project-conventions, project-decisions, user-preferences) that do not yet exist on the bank.",ko:"세션 시작 시 bank에 아직 없는 기본 제공 멘탈 모델(project-conventions, project-decisions, user-preferences)을 생성합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.mentalModelMaxRenderChars",category:"intelligence",group:"Hindsight",label:{en:"Mental Model Max Render Chars",ko:"멘탈 모델 최대 렌더링 문자 수"},description:{en:"Maximum number of characters for rendering the mental model.",ko:"멘탈 모델 렌더링의 최대 문자 수입니다."},kind:"number",scope:"both",defaultValue:16e3,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.mentalModelsEnabled",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Mental Models",ko:"Hindsight 멘탈 모델"},description:{en:"Read curated reflect summaries (mental models) into developer instructions at boot. Loads existing models on the bank — does not write. Pair with hindsight.mentalModelAutoSeed to also auto-create the built-in seed set.",ko:"부팅 시 선별된 reflect 요약(멘탈 모델)을 개발자 지침에 불러옵니다. bank의 기존 모델만 로드하며 쓰지는 않습니다. 기본 제공 시드 세트도 자동 생성하려면 hindsight.mentalModelAutoSeed와 함께 사용하세요."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallBudget",category:"intelligence",group:"Hindsight",label:{en:"Recall Budget",ko:"회상 예산"},description:{en:"Budget level selected for recall.",ko:"회상에 선택된 예산 수준입니다."},kind:"enum",scope:"both",defaultValue:"mid",choices:["low","mid","high"],appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallContextTurns",category:"intelligence",group:"Hindsight",label:{en:"Recall Context Turns",ko:"회상 컨텍스트 턴"},description:{en:"Number of context turns used for recall.",ko:"회상에 사용하는 컨텍스트 턴 수입니다."},kind:"number",scope:"both",defaultValue:1,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallMaxQueryChars",category:"intelligence",group:"Hindsight",label:{en:"Recall Max Query Chars",ko:"회상 쿼리 최대 문자 수"},description:{en:"Maximum number of characters in a recall query.",ko:"회상 쿼리의 최대 문자 수입니다."},kind:"number",scope:"both",defaultValue:800,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallMaxTokens",category:"intelligence",group:"Hindsight",label:{en:"Recall Max Tokens",ko:"회상 최대 토큰 수"},description:{en:"Maximum number of tokens for recall.",ko:"회상의 최대 토큰 수입니다."},kind:"number",scope:"both",defaultValue:1024,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Recall Timeout Ms",ko:"회상 제한 시간(Ms)"},description:{en:"Recall timeout in milliseconds.",ko:"회상 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:3e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.recallTypes",category:"intelligence",group:"Hindsight",label:{en:"Recall Types",ko:"회상 유형"},description:{en:"Types of information included in recall.",ko:"회상에 포함할 정보 유형입니다."},kind:"array",scope:"both",defaultValue:["world","experience"],items:"string",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.reflectTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Reflect Timeout Ms",ko:"성찰 제한 시간(Ms)"},description:{en:"Reflection timeout in milliseconds.",ko:"성찰 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:12e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.requestTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Request Timeout Ms",ko:"요청 제한 시간(Ms)"},description:{en:"Hindsight request timeout in milliseconds.",ko:"Hindsight 요청 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:3e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainContext",category:"intelligence",group:"Hindsight",label:{en:"Retain Context",ko:"컨텍스트 보존"},description:{en:"Context value used for retention.",ko:"보존에 사용하는 컨텍스트 값입니다."},kind:"string",scope:"both",defaultValue:"omp",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainEveryNTurns",category:"intelligence",group:"Hindsight",label:{en:"Retain Every Nturns",ko:"N턴마다 보존"},description:{en:"Number of turns between retention operations.",ko:"보존 작업 사이의 턴 수입니다."},kind:"number",scope:"both",defaultValue:3,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainMission",category:"intelligence",group:"Hindsight",label:{en:"Retain Mission",ko:"미션 보존"},description:{en:"Mission used for retention.",ko:"보존에 사용하는 미션입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainMode",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Retain Mode",ko:"Hindsight 보존 모드"},description:{en:"full-session = upsert one document per session, last-turn = chunked",ko:"full-session = 세션당 문서 하나를 upsert, last-turn = 청크 단위"},kind:"enum",scope:"both",defaultValue:"full-session",choices:["full-session","last-turn"],appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainOverlapTurns",category:"intelligence",group:"Hindsight",label:{en:"Retain Overlap Turns",ko:"보존 중첩 턴"},description:{en:"Number of overlapping turns retained between retention operations.",ko:"보존 작업 간에 유지할 중첩 턴 수입니다."},kind:"number",scope:"both",defaultValue:2,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.retainTimeoutMs",category:"intelligence",group:"Hindsight",label:{en:"Retain Timeout Ms",ko:"보존 제한 시간(Ms)"},description:{en:"Retention timeout in milliseconds.",ko:"보존 제한 시간(밀리초)입니다."},kind:"number",scope:"both",defaultValue:6e4,integer:!0,appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"hindsight.scoping",category:"intelligence",group:"Hindsight",label:{en:"Hindsight Scoping",ko:"Hindsight 범위"},description:{en:"global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = shared bank with project tags so global + project memories merge on recall",ko:"global = 하나의 공유 뱅크, per-project = cwd별 격리된 뱅크, per-project-tagged = 프로젝트 태그가 있는 공유 뱅크로, 회상 시 전역 메모리와 프로젝트 메모리를 병합"},kind:"enum",scope:"both",defaultValue:"per-project-tagged",choices:["global","per-project","per-project-tagged"],appliesTo:{en:"Applies to memory.backend = hindsight.",ko:"memory.backend = hindsight에 적용됩니다."}},{path:"mnemopi.autoRecall",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Auto Recall",ko:"Mnemopi 자동 회상"},description:{en:"Recall local memories into the first turn of each session",ko:"각 세션의 첫 번째 턴에 로컬 메모리를 회상합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.autoRetain",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Auto Retain",ko:"Mnemopi 자동 보존"},description:{en:"Retain completed conversation turns into local Mnemopi memory",ko:"완료된 대화 턴을 로컬 Mnemopi 메모리에 보존합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.bank",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Bank",ko:"Mnemopi 뱅크"},description:{en:"Optional shared bank base name. Per-project modes derive project-local banks from it.",ko:"선택 사항인 공유 뱅크 기본 이름입니다. 프로젝트별 모드는 이 이름에서 프로젝트 로컬 뱅크를 파생합니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.dbPath",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi DB Path",ko:"Mnemopi DB 경로"},description:{en:"Optional SQLite DB path. Defaults to the agent memories directory.",ko:"선택 사항인 SQLite DB 경로입니다. 기본값은 에이전트 메모리 디렉터리입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.embeddingApiKey",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Embedding API Key",ko:"Mnemopi 임베딩 API 키"},description:{en:"Optional embedding API key passed to Mnemopi",ko:"Mnemopi에 전달할 선택 사항인 임베딩 API 키입니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when Mnemopi embeddings use an authenticated API.",ko:"Mnemopi 임베딩이 인증된 API를 사용할 때 적용됩니다."}},{path:"mnemopi.embeddingApiUrl",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Embedding API URL",ko:"Mnemopi 임베딩 API URL"},description:{en:"Optional OpenAI-compatible embedding endpoint passed to Mnemopi",ko:"Mnemopi에 전달할 선택 사항인 OpenAI 호환 임베딩 엔드포인트입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when Mnemopi uses a remote embedding endpoint.",ko:"Mnemopi가 원격 임베딩 엔드포인트를 사용할 때 적용됩니다."}},{path:"mnemopi.embeddingModel",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Embedding Model",ko:"Mnemopi 임베딩 모델"},description:{en:"Advanced: explicit embedding model id that overrides the variant. Leave empty to use mnemopi.embeddingVariant.",ko:"고급: variant를 재정의할 명시적 임베딩 모델 id입니다. mnemopi.embeddingVariant를 사용하려면 비워 두세요."},kind:"string",scope:"both",appliesTo:{en:"Applies when Mnemopi embeddings are enabled.",ko:"Mnemopi 임베딩이 활성화된 경우 적용됩니다."}},{path:"mnemopi.embeddingVariant",category:"intelligence",group:"Mnemopi",label:{en:"Embedding variant",ko:"임베딩 변형"},description:{en:"Local embedding model family. en = stronger English model; multilingual = cross-language model. Changing this rebuilds existing memory embeddings on next start.",ko:"로컬 임베딩 모델 계열입니다. en = 더 강력한 영어 모델, multilingual = 언어 간 모델입니다. 변경하면 다음 시작 시 기존 메모리 임베딩을 재구축합니다."},kind:"enum",scope:"both",defaultValue:"en",choices:["en","multilingual"],appliesTo:{en:"Applies when Mnemopi embeddings are enabled.",ko:"Mnemopi 임베딩이 활성화된 경우 적용됩니다."}},{path:"mnemopi.enhancedRecall",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Enhanced Recall",ko:"Mnemopi 향상된 회상"},description:{en:"Enable the tiered query result cache for repeated and similar recall queries",ko:"반복되거나 유사한 회상 쿼리에 계층형 쿼리 결과 캐시를 사용합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.injectionTokenLimit",category:"intelligence",group:"Mnemopi",label:{en:"Injection Token Limit",ko:"삽입 토큰 한도"},description:{en:"Token limit for Mnemopi injection.",ko:"Mnemopi 주입의 토큰 제한입니다."},kind:"number",scope:"both",defaultValue:5e3,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.llmApiKey",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM API Key",ko:"Mnemopi LLM API 키"},description:{en:"Optional LLM API key for Mnemopi remote mode",ko:"Mnemopi 원격 모드용 선택적 LLM API 키입니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when mnemopi.llmMode uses an authenticated remote model.",ko:"mnemopi.llmMode가 인증된 원격 모델을 사용할 때 적용됩니다."}},{path:"mnemopi.llmBaseUrl",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM Base URL",ko:"Mnemopi LLM 기본 URL"},description:{en:"Optional OpenAI-compatible LLM endpoint for Mnemopi remote mode",ko:"Mnemopi 원격 모드용 선택적 OpenAI 호환 LLM 엔드포인트입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0,appliesTo:{en:"Applies when mnemopi.llmMode is remote.",ko:"mnemopi.llmMode가 remote인 경우 적용됩니다."}},{path:"mnemopi.llmMode",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM Mode",ko:"Mnemopi LLM 모드"},description:{en:"Use no LLM, the online tiny model (the TINY role from /models, else @smol), or a remote OpenAI-compatible endpoint",ko:"LLM을 사용하지 않거나, 온라인 소형 모델(/models의 TINY 역할, 없으면 @smol) 또는 원격 OpenAI 호환 엔드포인트를 사용합니다."},kind:"enum",scope:"both",defaultValue:"smol",choices:["none","smol","remote"],appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.llmModel",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi LLM Model",ko:"Mnemopi LLM 모델"},description:{en:"Optional LLM model name for Mnemopi remote mode",ko:"Mnemopi 원격 모드용 선택적 LLM 모델 이름입니다."},kind:"string",scope:"both",appliesTo:{en:"Applies when Mnemopi LLM enrichment is enabled.",ko:"Mnemopi LLM 보강이 활성화된 경우 적용됩니다."}},{path:"mnemopi.noEmbeddings",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Disable Embeddings",ko:"Mnemopi 임베딩 비활성화"},description:{en:"Force deterministic FTS-only recall instead of vector embeddings",ko:"벡터 임베딩 대신 결정론적 FTS 전용 회상을 강제합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.polyphonicRecall",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Polyphonic Recall",ko:"Mnemopi 다중 회상"},description:{en:"Enable 4-voice recall (vector, graph, fact, temporal) fused with reciprocal rank fusion",ko:"상호 순위 융합으로 결합된 4개 보이스 회상(벡터, 그래프, 사실, 시간)을 사용합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.proactiveLinking",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Proactive Linking",ko:"Mnemopi 선제적 연결"},description:{en:"Ingest new memories into the episodic graph as they are stored, linking them to related entities and memories",ko:"새 메모리를 저장할 때 에피소드 그래프에 수집하여 관련 엔터티 및 메모리와 연결합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.recallContextTurns",category:"intelligence",group:"Mnemopi",label:{en:"Recall Context Turns",ko:"회상 컨텍스트 턴 수"},description:{en:"Number of context turns used for Mnemopi recall.",ko:"Mnemopi 회상에 사용하는 컨텍스트 턴 수입니다."},kind:"number",scope:"both",defaultValue:3,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.recallLimit",category:"intelligence",group:"Mnemopi",label:{en:"Recall Limit",ko:"회상 한도"},description:{en:"Limit on the number of Mnemopi recall results.",ko:"Mnemopi 회상 결과 수의 제한입니다."},kind:"number",scope:"both",defaultValue:8,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.recallMaxQueryChars",category:"intelligence",group:"Mnemopi",label:{en:"Recall Max Query Chars",ko:"회상 쿼리 최대 문자 수"},description:{en:"Maximum number of characters in a Mnemopi recall query.",ko:"Mnemopi 회상 쿼리의 최대 문자 수입니다."},kind:"number",scope:"both",defaultValue:4e3,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.retainEveryNTurns",category:"intelligence",group:"Mnemopi",label:{en:"Retain Every Nturns",ko:"N턴마다 보존"},description:{en:"Sets the Mnemopi retention interval in turns.",ko:"Mnemopi 유지 간격을 턴 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:4,integer:!0,appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"mnemopi.scoping",category:"intelligence",group:"Mnemopi",label:{en:"Mnemopi Scoping",ko:"Mnemopi 범위 지정"},description:{en:"global = one shared bank; per-project = isolated bank per cwd; per-project-tagged = project-local writes plus global recall visibility",ko:"global = 하나의 공유 뱅크, per-project = cwd별로 격리된 뱅크, per-project-tagged = 프로젝트 로컬 쓰기 및 전역 회상 가시성입니다."},kind:"enum",scope:"both",defaultValue:"per-project",choices:["global","per-project","per-project-tagged"],appliesTo:{en:"Applies to memory.backend = mnemopi.",ko:"memory.backend = mnemopi에 적용됩니다."}},{path:"sharpshooter.injectionTokenLimit",category:"intelligence",group:"Sharpshooter",label:{en:"Injection Token Limit",ko:"주입 토큰 한도"},description:{en:"Sets the Sharpshooter injection limit in tokens.",ko:"Sharpshooter 삽입 한도를 토큰 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:15e3,integer:!0,appliesTo:{en:"Applies to memory.backend = sharpshooter.",ko:"memory.backend = sharpshooter에 적용됩니다."}},{path:"sharpshooter.intervalMinutes",category:"intelligence",group:"Sharpshooter",label:{en:"Interval Minutes",ko:"간격(분)"},description:{en:"Sets the Sharpshooter interval in minutes.",ko:"Sharpshooter 간격을 분 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:5,appliesTo:{en:"Applies to memory.backend = sharpshooter.",ko:"memory.backend = sharpshooter에 적용됩니다."}},{path:"sharpshooter.model",category:"intelligence",group:"Sharpshooter",label:{en:"Sharpshooter Model",ko:"Sharpshooter 모델"},description:{en:"Model selector for extraction/consolidation, empty = smol role",ko:"추출/통합용 모델 선택자입니다. 비어 있으면 smol 역할을 사용합니다."},kind:"string",scope:"both",appliesTo:{en:"Applies to memory.backend = sharpshooter.",ko:"memory.backend = sharpshooter에 적용됩니다."}},{path:"advisor.enabled",category:"agents",group:"Advisor",label:{en:"Enable Advisor",ko:"Advisor 활성화"},description:{en:"Pair a second model (assigned to the 'advisor' role) that passively reviews each turn and injects notes.",ko:"'advisor' 역할에 할당된 두 번째 모델을 연결해 각 턴을 수동으로 검토하고 메모를 추가합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"advisor.immuneTurns",category:"agents",group:"Advisor",label:{en:"Advisor Immune Turns",ko:"Advisor 중단 면제 턴"},description:{en:"After an advisor concern or blocker interrupts, route further concerns/blockers non-interruptingly for this many primary turns.",ko:"Advisor의 우려 사항이나 차단 요소로 중단된 후, 지정한 기본 턴 수 동안 추가 우려 사항과 차단 요소를 중단 없이 전달합니다."},kind:"number",scope:"both",defaultValue:3,integer:!0,appliesTo:{en:"Applies to advisor.enabled.",ko:"advisor.enabled에 적용됩니다."}},{path:"advisor.maxNotesPerUpdate",category:"agents",group:"Advisor",label:{en:"Advisor Max Notes Per Update",ko:"Advisor 업데이트당 최대 메모 수"},description:{en:"Maximum non-blocker advice notes accepted per advisor prompt update (1–32; UI offers 1–5 quick picks). Blockers are exempt.",ko:"Advisor 프롬프트 업데이트당 허용할 비차단 조언 메모의 최대 개수입니다(1–32; UI에서는 1–5 빠른 선택 제공). 차단 요소는 제외됩니다."},kind:"number",scope:"both",defaultValue:4,integer:!0,min:1,max:32,step:1,appliesTo:{en:"Applies to advisor.enabled.",ko:"advisor.enabled에 적용됩니다."}},{path:"advisor.syncBacklog",category:"agents",group:"Advisor",label:{en:"Advisor Sync Backlog",ko:"Advisor 동기화 지연 턴"},description:{en:"Pause the main agent for up to 30 seconds if the advisor falls behind by this many turns. Off disables catch-up delays.",ko:"Advisor가 지정한 턴 수만큼 뒤처지면 기본 에이전트를 최대 30초 동안 일시 중지합니다. Off로 설정하면 따라잡기 지연이 비활성화됩니다."},kind:"enum",scope:"both",defaultValue:"off",choices:["off","1","3","5"],appliesTo:{en:"Applies to advisor.enabled.",ko:"advisor.enabled에 적용됩니다."}},{path:"branchSummary.enabled",category:"agents",group:"General",label:{en:"Branch Summaries",ko:"브랜치 요약"},description:{en:"Prompt to summarize when leaving a branch",ko:"브랜치를 떠날 때 요약하도록 요청합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"followUpMode",category:"agents",group:"Input",label:{en:"Follow-Up Mode",ko:"후속 모드"},description:{en:"How to drain follow-up messages after a turn completes",ko:"턴 완료 후 후속 메시지를 처리하는 방식"},kind:"enum",scope:"both",defaultValue:"one-at-a-time",choices:["all","one-at-a-time"]},{path:"interruptMode",category:"agents",group:"Input",label:{en:"Interrupt Mode",ko:"중단 모드"},description:{en:"When steering messages interrupt tool execution",ko:"지시 메시지가 도구 실행을 중단하는 방식을 설정합니다."},kind:"enum",scope:"both",defaultValue:"immediate",choices:["immediate","wait"]},{path:"steeringMode",category:"agents",group:"Input",label:{en:"Steering Mode",ko:"조정 모드"},description:{en:"How to process queued messages while agent is working",ko:"에이전트가 작업 중일 때 대기열의 메시지를 처리하는 방식을 설정합니다."},kind:"enum",scope:"both",defaultValue:"one-at-a-time",choices:["all","one-at-a-time"]},{path:"includeWorkspaceTree",category:"agents",group:"Prompt",label:{en:"Include Workspace Tree",ko:"워크스페이스 트리 포함"},description:{en:"Render the workspace directory tree in the system prompt. WARNING: This can bust prompt caching across sessions when files are modified.",ko:"시스템 프롬프트에 워크스페이스 디렉터리 트리를 렌더링합니다. 경고: 파일이 수정되면 세션 간 프롬프트 캐싱이 무효화될 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"personality",category:"agents",group:"Prompt",label:{en:"Personality",ko:"성격"},description:{en:"Communication style rendered into the system prompt's personality block",ko:"시스템 프롬프트의 성격 블록에 반영되는 커뮤니케이션 스타일입니다."},kind:"enum",scope:"both",defaultValue:"default",choices:["default","friendly","pragmatic","none"]},{path:"prewalk.enabled",category:"agents",group:"Prewalk",label:{en:"Enable Prewalk",ko:"Prewalk 사용"},description:{en:"Start on the active model, then switch to a fast/cheap model (default the 'smol' role) at the first edit/write after the plan nudge's todo list exists — the strong model plans, commits the todos, and starts the implementation before handing off. Overridable per session with --prewalk / --no-prewalk.",ko:"활성 모델로 시작한 후 계획 유도의 할 일 목록이 생성된 뒤 처음 편집하거나 쓸 때 빠르고 저렴한 모델(기본값은 'smol' 역할)로 전환합니다. 강력한 모델이 계획하고 할 일을 확정한 후 구현을 시작하고 인계합니다. 세션별로 --prewalk / --no-prewalk를 사용해 재정의할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.agentAdvisor",category:"agents",group:"Task",label:{en:"Agent Advisor",ko:"에이전트 어드바이저"},description:{en:"Per-agent advisor overrides: use 'on', 'off', or an advisor model selector for each agent name.",ko:"에이전트 이름별 어드바이저 재정의입니다. 각 값에 'on', 'off' 또는 어드바이저 모델 선택자를 사용합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"boolean-string",appliesTo:{en:"Applies per named task agent.",ko:"이름이 지정된 task 에이전트별로 적용됩니다."}},{path:"task.agentModelOverrides",category:"agents",group:"Task",label:{en:"Agent Model Overrides",ko:"에이전트 모델 재정의"},description:{en:"Configures task agent model overrides.",ko:"작업 에이전트의 모델 재정의를 구성합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"string-or-string-array",appliesTo:{en:"Applies per named task agent; each value is one model selector or an ordered selector list.",ko:"이름이 지정된 task 에이전트별로 적용되며 각 값은 하나의 모델 선택자 또는 순서가 있는 선택자 목록입니다."}},{path:"task.agentPrewalk",category:"agents",group:"Task",label:{en:"Agent Prewalk",ko:"에이전트 사전 탐색"},description:{en:"Per-agent prewalk overrides: use 'on', 'off', or a handoff model selector for each agent name.",ko:"에이전트 이름별 prewalk 재정의입니다. 각 값에 'on', 'off' 또는 인계할 모델 선택자를 사용합니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"boolean-string",appliesTo:{en:"Applies per named task agent.",ko:"이름이 지정된 task 에이전트별로 적용됩니다."}},{path:"task.disabledAgents",category:"agents",group:"Task",label:{en:"Disabled Agents",ko:"비활성화된 에이전트"},description:{en:"Sets the list of disabled task agents.",ko:"비활성화할 작업 에이전트 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"task.agentIdleTtlMs",category:"agents",group:"Subagents",label:{en:"Agent Idle TTL",ko:"에이전트 유휴 TTL"},description:{en:"How long an idle subagent stays live in memory before being parked to disk (ms). Parked agents are revived automatically when messaged or resumed. 0 keeps idle agents live until exit.",ko:"유휴 하위 에이전트를 디스크에 보관하기 전에 메모리에서 활성 상태로 유지할 시간(ms)입니다. 보관된 에이전트는 메시지를 받거나 재개될 때 자동으로 복원됩니다. 0은 종료할 때까지 유휴 에이전트를 활성 상태로 유지합니다."},kind:"number",scope:"both",defaultValue:42e4,integer:!0},{path:"task.batch",category:"agents",group:"Subagents",label:{en:"Batch Task Calls",ko:"작업 호출 일괄 처리"},description:{en:"Switch the task tool to its batch shape: one call carries { context, tasks[] } — one subagent per item, with an optional per-item agent (defaulting to the session spawn-policy agent), per-item isolation, and a required shared context prepended to every assignment. With async.enabled=true, each spawn runs as an independent background agent with the normal idle/parked lifecycle; otherwise the call blocks for merged results. Disable to restore the flat single-spawn schema.",ko:"task 도구를 일괄 처리 형식으로 전환합니다. 한 번의 호출에 { context, tasks[] }를 전달하며, 항목마다 하나의 하위 에이전트와 선택적 agent를 지정할 수 있습니다. agent의 기본값은 세션 생성 정책의 에이전트이며, 항목별 격리와 모든 할당 앞에 추가되는 필수 공유 컨텍스트가 적용됩니다. async.enabled=true이면 각 생성 작업이 일반적인 유휴/보관 수명 주기를 따르는 독립 백그라운드 에이전트로 실행됩니다. 그렇지 않으면 병합된 결과가 나올 때까지 호출이 차단됩니다. 비활성화하면 평면형 단일 생성 스키마로 복원됩니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"task.speculativeLaunch",category:"agents",group:"Subagents",label:{en:"Speculative Task Launch",ko:"작업 선행 실행"},description:{en:"Start each batch subagent as soon as its tasks[] item finishes streaming instead of waiting for the whole task call. Launched agents are aborted if the finished call fails validation, is blocked, or its arguments change. Requires auto-allowed task approval and no extension tool lifecycle handlers.",ko:"전체 task 호출을 기다리지 않고 각 tasks[] 항목의 스트리밍이 끝나는 즉시 해당 일괄 하위 에이전트를 시작합니다. 완료된 호출이 유효성 검사에 실패하거나 차단되거나 인수가 바뀌면 이미 시작된 에이전트는 중단됩니다. task 승인이 자동 허용이어야 하며 확장 도구 수명 주기 핸들러가 없어야 합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when task.batch is on.",ko:"task.batch가 켜진 경우 적용됩니다."}},{path:"task.eager",category:"agents",group:"Subagents",label:{en:"Prefer Task Delegation",ko:"작업 위임 우선"},description:{en:"How strongly to push delegating work to subagents",ko:"하위 에이전트에 작업을 위임하도록 유도할 강도를 설정합니다."},kind:"enum",scope:"both",defaultValue:"default",choices:["default","preferred","always"]},{path:"task.enableEffort",category:"agents",group:"Subagents",label:{en:"Per-Task Effort",ko:"작업별 노력 수준"},description:{en:"Expose the optional effort parameter on task spawns, allowing callers to override each subagent's thinking level",ko:"작업 생성 시 선택적 effort 매개변수를 노출하여 호출자가 각 하위 에이전트의 사고 수준을 재정의할 수 있도록 합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.enableLsp",category:"agents",group:"Subagents",label:{en:"LSP in Subagents",ko:"하위 에이전트에서 LSP 사용"},description:{en:"Allow subagents spawned via the task tool to use the lsp tool. Off by default to keep subagents cheap; enable when LSP-aware delegation is worth the extra tokens.",ko:"task 도구로 생성된 하위 에이전트가 lsp 도구를 사용할 수 있도록 합니다. 하위 에이전트의 비용을 낮추기 위해 기본적으로 꺼져 있습니다. 추가 토큰을 사용하더라도 LSP 기반 위임이 유용할 때 활성화하세요."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.maxConcurrency",category:"agents",group:"Subagents",label:{en:"Max Concurrent Tasks",ko:"최대 동시 작업 수"},description:{en:"Maximum number of subagents running concurrently; 0 means unlimited.",ko:"동시에 실행할 수 있는 최대 하위 에이전트 수입니다. 0은 무제한을 의미합니다."},kind:"number",scope:"both",defaultValue:32,integer:!0,min:0,step:1},{path:"task.maxEffort",category:"agents",group:"Subagents",label:{en:"Maximum Per-Spawn Effort",ko:"생성당 최대 작업량"},description:{en:"Maximum reasoning effort allowed for the task tool's per-spawn effort hint. Lower values prevent callers from escalating subagents above this ceiling; the default preserves the model's full range.",ko:"task 도구의 생성당 작업량 힌트에 허용되는 최대 추론 작업량입니다. 값을 낮추면 호출자가 서브에이전트의 작업량을 이 한도보다 높일 수 없습니다. 기본값은 모델의 전체 범위를 유지합니다."},kind:"enum",scope:"both",defaultValue:"max",choices:["minimal","low","medium","high","xhigh","max"]},{path:"task.maxRecursionDepth",category:"agents",group:"Subagents",label:{en:"Max Task Recursion",ko:"최대 작업 재귀 깊이"},description:{en:"How many levels deep subagents can spawn their own subagents",ko:"서브에이전트가 자체 서브에이전트를 생성할 수 있는 최대 단계 수"},kind:"number",scope:"both",defaultValue:2,integer:!0},{path:"task.maxRuntimeMs",category:"agents",group:"Subagents",label:{en:"Max Subagent Runtime",ko:"최대 서브에이전트 실행 시간"},description:{en:"Hard wall-clock limit per subagent (ms). 0 disables it. Defense-in-depth against provider-side stream hangs that escape the inference-layer watchdog; triggers a normal subagent abort with a 'timed out' reason.",ko:"서브에이전트당 엄격한 실제 시간 제한(ms)입니다. 0이면 비활성화됩니다. 추론 계층 감시를 벗어난 제공자 측 스트림 중단에 대비한 심층 방어 기능이며, 'timed out' 사유로 서브에이전트를 정상 중단합니다."},kind:"number",scope:"both",defaultValue:0,integer:!0},{path:"task.prewalk",category:"agents",group:"Subagents",label:{en:"Generic Task Prewalk",ko:"일반 작업 사전 실행"},description:{en:"Arm prewalk for the bundled generic `task` subagent: it starts on its resolved model, plans and begins the implementation, then hands off to the 'smol' role at its first edit/write. Per-agent overrides (task.agentPrewalk, configured from the /agents hub) and user agent `prewalk` frontmatter apply regardless of this toggle.",ko:"번들 generic `task` 서브에이전트의 사전 실행을 준비합니다. 확인된 모델에서 시작해 계획을 세우고 구현을 시작한 뒤, 처음 편집/쓰기를 수행할 때 'smol' 역할로 넘깁니다. 에이전트별 재정의(task.agentPrewalk, /agents 허브에서 구성)와 사용자 에이전트의 `prewalk` frontmatter는 이 설정과 관계없이 적용됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.softRequestBudget",category:"agents",group:"Subagents",label:{en:"Soft Subagent Request Budget",ko:"서브에이전트 소프트 요청 예산"},description:{en:"Soft per-subagent request budget (assistant requests per run). Crossing it injects a wrap-up steering notice (see task.softRequestBudgetNotice); at 1.5x the budget the run is force-stopped and the agent must yield its partial findings. 0 disables the guard. Bundled scout/sonic agents cap out at a lower built-in budget, so a value below that cap still applies to them.",ko:"서브에이전트별 소프트 요청 예산(실행당 어시스턴트 요청 수)입니다. 초과하면 마무리를 유도하는 안내가 삽입됩니다(task.softRequestBudgetNotice 참조). 예산의 1.5x에 도달하면 실행이 강제 중지되고 에이전트는 부분 결과를 제출해야 합니다. 0이면 보호 기능이 비활성화됩니다. 번들 scout/sonic 에이전트에는 더 낮은 기본 제공 한도가 있으므로, 이 한도보다 낮은 값도 해당 에이전트에 적용됩니다."},kind:"number",scope:"both",defaultValue:200,integer:!0},{path:"task.softRequestBudgetNotice",category:"agents",group:"Subagents",label:{en:"Soft Request Budget Notice",ko:"소프트 요청 예산 알림"},description:{en:"Inject one steering notice when a subagent crosses its soft request budget, asking it to wrap up before the 1.5x forced-yield stop.",ko:"서브에이전트가 소프트 요청 예산을 초과하면 1.5x 강제 제출 중지 전에 마무리하도록 유도하는 안내를 한 번 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"task.isolation.apply",category:"agents",group:"Isolation",label:{en:"Apply Isolated Changes",ko:"격리된 변경 사항 적용"},description:{en:"Automatically apply successful isolated task changes to the parent checkout; disable to retain patch or branch artifacts",ko:"성공한 격리 작업의 변경 사항을 상위 체크아웃에 자동 적용합니다. 비활성화하면 패치 또는 브랜치 아티팩트를 유지합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"task.isolation.commits",category:"agents",group:"Isolation",label:{en:"Isolation Commit Style",ko:"격리 커밋 스타일"},description:{en:"Commit message style for nested repo changes (generic or AI-generated)",ko:"중첩 저장소 변경 사항의 커밋 메시지 스타일(generic 또는 AI-generated)"},kind:"enum",scope:"both",defaultValue:"generic",choices:["generic","ai"]},{path:"task.isolation.enabled",category:"agents",group:"Isolation",label:{en:"Isolate Subagents",ko:"서브에이전트 격리"},description:{en:"Run subagents in an isolated copy of the checkout and integrate their changes afterwards",ko:"체크아웃의 격리된 복사본에서 서브에이전트를 실행한 후 변경 사항을 통합합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"task.isolation.merge",category:"agents",group:"Isolation",label:{en:"Isolation Merge Strategy",ko:"격리 병합 전략"},description:{en:"How isolated task changes are integrated (patch apply or branch merge)",ko:"격리 작업의 변경 사항을 통합하는 방식(패치 적용 또는 브랜치 병합)"},kind:"enum",scope:"both",defaultValue:"patch",choices:["patch","branch"]},{path:"todo.eager",category:"agents",group:"Todos",label:{en:"Create Todos Automatically",ko:"할 일 자동 생성"},description:{en:"How strongly to push automatic todo-list creation after the first message",ko:"첫 메시지 후 할 일 목록 자동 생성을 얼마나 강하게 유도할지 설정합니다."},kind:"enum",scope:"both",defaultValue:"default",choices:["default","preferred","always"]},{path:"todo.reminders",category:"agents",group:"Todos",label:{en:"Todo Reminders",ko:"할 일 알림"},description:{en:"Remind the agent to complete todos before stopping",ko:"에이전트가 중지하기 전에 할 일을 완료하도록 알립니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"todo.remindersMax",category:"agents",group:"Todos",label:{en:"Todo Reminder Limit",ko:"할 일 알림 한도"},description:{en:"Maximum number of todo reminders before giving up",ko:"포기하기 전까지 표시할 최대 할 일 알림 수"},kind:"number",scope:"both",defaultValue:3,integer:!0},{path:"todo.enabled",category:"agents",group:"Available Tools",label:{en:"Todos",ko:"할 일"},description:{en:"Enable the todo tool for task tracking",ko:"작업 추적을 위한 todo 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"magicKeywords.enabled",category:"agents",group:"Magic Keywords",label:{en:"Magic Keywords",ko:"매직 키워드"},description:{en:"Enable hidden notices for standalone ultrathink, orchestrate, workflowz, jevify keywords",ko:"단독으로 입력한 ultrathink, orchestrate, workflowz, jevify 키워드에 숨겨진 안내를 추가합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"magicKeywords.ultrathink",category:"agents",group:"Magic Keywords",label:{en:"Ultrathink Keyword",ko:"Ultrathink 키워드"},description:{en:"Let standalone ultrathink request maximum automatic thinking and append its hidden notice",ko:"단독으로 입력한 ultrathink가 최대 자동 사고를 요청하고 숨겨진 안내를 추가하도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when magicKeywords.enabled is on.",ko:"magicKeywords.enabled가 켜진 경우 적용됩니다."}},{path:"magicKeywords.orchestrate",category:"agents",group:"Magic Keywords",label:{en:"Orchestrate Keyword",ko:"Orchestrate 키워드"},description:{en:"Let standalone orchestrate append its hidden multi-agent orchestration notice",ko:"단독으로 입력한 orchestrate가 숨겨진 다중 에이전트 오케스트레이션 안내를 추가하도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when magicKeywords.enabled is on and the task tool is available.",ko:"magicKeywords.enabled가 켜져 있고 task 도구를 사용할 수 있을 때 적용됩니다."}},{path:"magicKeywords.workflow",category:"agents",group:"Magic Keywords",label:{en:"Workflow Keyword",ko:"Workflow 키워드"},description:{en:"Let standalone workflowz append its hidden eval workflow notice",ko:"단독으로 입력한 workflowz가 숨겨진 eval 워크플로 안내를 추가하도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when magicKeywords.enabled is on and the task and eval tools are available.",ko:"magicKeywords.enabled가 켜져 있고 task 및 eval 도구를 사용할 수 있을 때 적용됩니다."}},{path:"magicKeywords.jevify",category:"agents",group:"Magic Keywords",label:{en:"Jevify Keyword",ko:"Jevify 키워드"},description:{en:"Let standalone jevify append its hidden bulk-judge classification notice",ko:"단독으로 입력한 jevify가 숨겨진 일괄 판정 분류 안내를 추가하도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when magicKeywords.enabled is on and the eval tool is available.",ko:"magicKeywords.enabled가 켜져 있고 eval 도구를 사용할 수 있을 때 적용됩니다."}},{path:"ask.enabled",category:"tools",group:"Available Tools",label:{en:"Ask",ko:"질문"},description:{en:"Enable the ask tool for interactive user questions",ko:"대화형 사용자 질문을 위한 ask 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"ask.timeout",category:"tools",group:"Notifications",label:{en:"Ask Timeout",ko:"질문 제한 시간"},description:{en:"Auto-select the recommended ask option after this many seconds (0 disables)",ko:"지정한 시간(초)이 지나면 ask 도구의 권장 옵션을 자동으로 선택합니다(0은 비활성화)."},kind:"number",scope:"both",defaultValue:0,integer:!0,appliesTo:{en:"Applies when ask.enabled is on; ignored in plan mode.",ko:"ask.enabled가 켜진 경우 적용되며 계획 모드에서는 무시됩니다."}},{path:"astEdit.enabled",category:"tools",group:"Available Tools",label:{en:"AST Edit",ko:"AST 편집"},description:{en:"Enable the ast_edit tool for structural AST rewrites",ko:"구조적 AST 재작성을 위한 ast_edit 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"astGrep.enabled",category:"tools",group:"Available Tools",label:{en:"AST Grep",ko:"AST 검색"},description:{en:"Enable the ast_grep tool for structural AST search",ko:"구조적 AST 검색을 위한 ast_grep 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"browser.enabled",category:"tools",group:"Available Tools",label:{en:"Browser",ko:"브라우저"},description:{en:"Enable the browser eval prelude for scripted Chromium automation (Puppeteer)",ko:"스크립트 기반 Chromium 자동화(Puppeteer)를 위한 브라우저 eval 프렐류드를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"computer.enabled",category:"tools",group:"Available Tools",label:{en:"Computer",ko:"컴퓨터"},description:{en:"Enable the scriptable host-desktop eval prelude (screenshots, input, accessibility)",ko:"스크립팅 가능한 호스트 데스크톱 eval 프렐류드(스크린샷, 입력, 접근성)를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"debug.enabled",category:"tools",group:"Available Tools",label:{en:"Debug",ko:"디버그"},description:{en:"Enable the debug tool for DAP-based debugging",ko:"DAP 기반 디버깅용 디버그 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"fetch.enabled",category:"tools",group:"Available Tools",label:{en:"Read URLs",ko:"URL 읽기"},description:{en:"Allow the read tool to fetch and process URLs",ko:"read 도구가 URL을 가져와 처리하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"generate_image.enabled",category:"tools",group:"Available Tools",label:{en:"Generate Image",ko:"이미지 생성"},description:{en:"Enable the generate_image tool (text-to-image generation and editing). Exposed as an xd:// device when tools.xdev is on.",ko:"generate_image 도구(텍스트 기반 이미지 생성 및 편집)를 활성화합니다. tools.xdev가 켜져 있으면 xd:// 장치로 노출됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"speechgen.enabled",category:"tools",group:"Available Tools",label:{en:"Speech Generation",ko:"음성 생성"},description:{en:"Enable the tts tool for on-device (Kokoro) or xAI Grok Voice speech-file synthesis",ko:"온디바이스(Kokoro) 또는 xAI Grok Voice로 음성 파일을 합성하는 tts 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"speech.enabled",category:"tools",group:"Speech",label:{en:"Speech Vocalization",ko:"음성 읽기"},description:{en:"Speak the assistant's output aloud through the speakers as it streams",ko:"어시스턴트 출력이 스트리밍되는 동안 스피커로 소리 내어 읽어 줍니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"In ompgui (RPC) sessions only ask-tool questions are spoken, on the host machine's speakers.",ko:"ompgui(RPC) 세션에서는 ask 도구 질문만 호스트 기기의 스피커로 읽어 줍니다."}},{path:"speech.voice",category:"tools",group:"Speech",label:{en:"Speech Vocalization Voice",ko:"음성 읽기 목소리"},description:{en:"Kokoro voice used when speaking the assistant's output aloud",ko:"어시스턴트 출력을 소리 내어 읽을 때 사용할 Kokoro 목소리입니다."},kind:"enum",scope:"both",defaultValue:"af_heart",choices:["af_heart","af_bella","af_nicole","af_aoede","af_kore","af_sarah","am_michael","am_fenrir","am_puck","bf_emma","bm_george","bm_fable"],appliesTo:{en:"Applies when speech.enabled is on.",ko:"speech.enabled가 켜진 경우 적용됩니다."}},{path:"speech.enhanced",category:"tools",group:"Speech",label:{en:"Enhanced Speech Rewriting",ko:"향상된 음성 변환"},description:{en:"Rewrite assistant output into natural spoken prose with the tiny/smol model before synthesis (describes code, drops links and markdown). Falls back to mechanical cleanup on failure",ko:"합성하기 전에 tiny/smol 모델로 어시스턴트 출력을 자연스러운 구어체로 다시 씁니다(코드는 설명하고 링크와 마크다운은 제거). 실패하면 기계적 정리로 대체합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies when speech.enabled is on.",ko:"speech.enabled가 켜진 경우 적용됩니다."}},{path:"github.enabled",category:"tools",group:"Available Tools",label:{en:"GitHub CLI",ko:"GitHub CLI"},description:{en:"Enable the github tool (op-based dispatch for repository, issue, pull request, diff, search, checkout, push, and Actions watch workflows)",ko:"github 도구를 활성화합니다(저장소, 이슈, 풀 리퀘스트, diff, 검색, checkout, push 및 Actions watch 워크플로를 위한 작업 기반 디스패치)."},kind:"boolean",scope:"both",defaultValue:!1},{path:"github.cache.enabled",category:"tools",group:"GitHub",label:{en:"GitHub View Cache",ko:"GitHub 조회 캐시"},description:{en:"Cache rendered issue/PR view output in ~/.omp/cache/github-cache.db so repeated reads are free",ko:"렌더링된 이슈/PR 조회 결과를 ~/.omp/cache/github-cache.db에 캐시하여 반복 조회 비용을 없앱니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when github.enabled is on.",ko:"github.enabled가 켜진 경우 적용됩니다."}},{path:"github.cache.softTtlSec",category:"tools",group:"GitHub",label:{en:"GitHub Cache Soft TTL",ko:"GitHub 캐시 소프트 TTL"},description:{en:"Within this window, cached issue/PR view rows are returned directly (seconds; default 5 minutes)",ko:"이 기간 안에는 캐시된 이슈/PR 조회 결과를 바로 반환합니다(초 단위, 기본값 5분)."},kind:"number",scope:"both",defaultValue:300,integer:!0,appliesTo:{en:"Applies when github.cache.enabled is on.",ko:"github.cache.enabled가 켜진 경우 적용됩니다."}},{path:"github.cache.hardTtlSec",category:"tools",group:"GitHub",label:{en:"GitHub Cache Hard TTL",ko:"GitHub 캐시 하드 TTL"},description:{en:"Past the soft TTL the cached row is returned and refreshed in the background; past the hard TTL it is dropped (seconds; default 7 days)",ko:"소프트 TTL이 지나면 캐시 항목을 반환하면서 백그라운드에서 새로 고치고, 하드 TTL이 지나면 삭제합니다(초 단위, 기본값 7일)."},kind:"number",scope:"both",defaultValue:604800,integer:!0,appliesTo:{en:"Applies when github.cache.enabled is on.",ko:"github.cache.enabled가 켜진 경우 적용됩니다."}},{path:"glob.enabled",category:"tools",group:"Available Tools",label:{en:"Glob",ko:"Glob"},description:{en:"Enable the glob tool for glob-based file lookup",ko:"glob 기반 파일 검색용 glob 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"grep.enabled",category:"tools",group:"Available Tools",label:{en:"Grep",ko:"Grep"},description:{en:"Enable the grep tool for regex content search",ko:"정규식 콘텐츠 검색용 grep 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"grep.contextBefore",category:"tools",group:"Grep & Browser",label:{en:"Grep Context Before",ko:"Grep 앞쪽 컨텍스트"},description:{en:"Lines of context before each grep match",ko:"각 grep 일치 항목 앞에 표시할 컨텍스트 줄 수입니다."},kind:"number",scope:"both",defaultValue:1,integer:!0},{path:"grep.contextAfter",category:"tools",group:"Grep & Browser",label:{en:"Grep Context After",ko:"Grep 뒤쪽 컨텍스트"},description:{en:"Lines of context after each grep match",ko:"각 grep 일치 항목 뒤에 표시할 컨텍스트 줄 수입니다."},kind:"number",scope:"both",defaultValue:3,integer:!0},{path:"find.enabled",category:"tools",group:"Available Tools",label:{en:"Find (semantic grep)",ko:"Find(의미 기반 검색)"},description:{en:"Enable the find tool: natural-language search for files and line ranges, judged by the judge model role. Auto enables it only when the judge role resolves to a native TypeSafe jev model",ko:"자연어로 파일과 줄 범위를 검색하고 judge 모델 역할이 판정하는 find 도구를 활성화합니다. auto는 judge 역할이 네이티브 TypeSafe jev 모델로 확인될 때만 활성화합니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","on","off"],appliesTo:{en:"Auto requires the judge model role to resolve to a native TypeSafe jev model.",ko:"auto는 judge 모델 역할이 네이티브 TypeSafe jev 모델로 확인될 때만 활성화됩니다."}},{path:"async.enabled",category:"tools",group:"Execution",label:{en:"Async Execution",ko:"비동기 실행"},description:{en:"Enable async bash commands and background task execution",ko:"비동기 bash 명령과 백그라운드 작업 실행을 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.abortOnFabricatedResult",category:"tools",group:"Execution",label:{en:"Abort On Fabricated Tool Result",ko:"조작된 도구 결과 감지 시 중단"},description:{en:"With in-band tool calls, stop the model immediately when it starts hallucinating a tool result mid-turn. Disable to let the model finish generating and discard the fabricated continuation instead.",ko:"인밴드 도구 호출에서 모델이 응답 도중 도구 결과를 환각하기 시작하면 즉시 중지합니다. 비활성화하면 모델이 생성을 마칠 때까지 기다린 후 조작된 후속 내용을 폐기합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.intentTracing",category:"tools",group:"Execution",label:{en:"Intent Tracing",ko:"의도 추적"},description:{en:"Ask the agent to describe the intent of each tool call before executing it",ko:"각 도구 호출을 실행하기 전에 에이전트가 호출 의도를 설명하도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.maxTimeout",category:"tools",group:"Execution",label:{en:"Max Tool Timeout",ko:"최대 도구 시간 제한"},description:{en:"Maximum timeout in seconds the agent can set for any tool (0 = no limit)",ko:"에이전트가 도구에 설정할 수 있는 최대 시간 제한(초)(0 = 제한 없음)"},kind:"number",scope:"both",defaultValue:0,integer:!0},{path:"extensionHandlers.toolCallTimeoutMs",category:"tools",group:"Extensions",label:{en:"Tool Call Handler Timeout (ms)",ko:"도구 호출 핸들러 제한 시간(ms)"},description:{en:"Positive finite active-work timeout for extension tool_call handlers; invalid values use 30000ms, and time awaiting OMP-owned dialogs does not count",ko:"확장 tool_call 핸들러의 실제 작업 제한 시간(양의 유한값)입니다. 잘못된 값은 30000ms를 사용하며 OMP 대화 상자를 기다리는 시간은 포함되지 않습니다."},kind:"number",scope:"both",defaultValue:3e4,integer:!0},{path:"async.maxJobs",category:"tools",group:"Async",label:{en:"Max Jobs",ko:"최대 작업 수"},description:{en:"Maximum number of asynchronous jobs.",ko:"비동기 작업의 최대 개수입니다."},kind:"number",scope:"both",defaultValue:100,integer:!0},{path:"bash.allowCompoundCommands",category:"tools",group:"Bash",label:{en:"Allow Compound Commands",ko:"복합 명령 허용"},description:{en:"Evaluate literal && chains per command; unmatched commands use normal bash approval policy and mode",ko:"리터럴 && 체인을 명령별로 평가합니다. 일치하지 않는 명령에는 일반 bash 승인 정책과 모드를 적용합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.autoBackground.enabled",category:"tools",group:"Bash",label:{en:"Bash Auto-Background",ko:"Bash 자동 백그라운드 실행"},description:{en:"Automatically background long-running bash commands and deliver the result later",ko:"오래 실행되는 bash 명령을 자동으로 백그라운드에서 실행하고 결과를 나중에 전달합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.autoBackground.thresholdMs",category:"tools",group:"Bash",label:{en:"Threshold Ms",ko:"임곗값(ms)"},description:{en:"Threshold in milliseconds for automatically backgrounding Bash execution.",ko:"Bash 실행을 자동으로 백그라운드 처리하기 위한 임계값(밀리초)입니다."},kind:"number",scope:"both",defaultValue:6e4,integer:!0,admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.direnv",category:"tools",group:"Bash",label:{en:"direnv Auto-Load",ko:"direnv 자동 로드"},description:{en:"Auto-load a repo's direnv/devenv `.envrc` into the bash session so devenv tools and env vars are present without manual `direnv exec`. Honors direnv's allow list: an `.envrc` you haven't `direnv allow`ed is never executed",ko:"저장소의 direnv/devenv `.envrc`를 bash 세션에 자동으로 로드하여 수동 `direnv exec` 없이 devenv 도구와 환경 변수를 사용합니다. direnv 허용 목록을 따르므로 `direnv allow`하지 않은 `.envrc`는 실행되지 않습니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","off"],admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.direnvLoadTimeoutMs",category:"tools",group:"Bash",label:{en:"direnv Load Timeout (ms)",ko:"direnv 로드 제한 시간(ms)"},description:{en:"Max wait for the first `direnv export` (a cold devenv shell can be slow); on timeout the session runs without the direnv env",ko:"첫 `direnv export`를 기다리는 최대 시간입니다(초기 devenv 셸은 느릴 수 있음). 시간 초과 시 direnv 환경 없이 세션을 실행합니다."},kind:"number",scope:"both",defaultValue:3e4,integer:!0,admin:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bash.enabled",category:"tools",group:"Bash",label:{en:"Bash",ko:"Bash"},description:{en:"Enable the bash tool for shell command execution",ko:"셸 명령 실행을 위한 bash 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"bash.patterns",category:"tools",group:"Bash",label:{en:"Bash Approval Patterns",ko:"Bash 승인 패턴"},description:{en:"Ordered bash command approval rules. Each item has match and approval fields; only '*' wildcards are supported.",ko:"순서대로 적용되는 bash 명령 승인 규칙입니다. 각 항목에는 match와 approval 필드가 있으며, '*' 와일드카드만 지원됩니다."},kind:"array",scope:"both",defaultValue:[],items:"object",admin:!0,confirmation:!0,appliesTo:{en:"Applies to bash.enabled.",ko:"bash.enabled에 적용됩니다."}},{path:"bashInterceptor.enabled",category:"tools",group:"Bash",label:{en:"Bash Interceptor",ko:"Bash 인터셉터"},description:{en:"Block shell commands that have dedicated tools",ko:"전용 도구가 있는 셸 명령을 차단합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"shellMinimizer.enabled",category:"tools",group:"Bash",label:{en:"Shell Minimizer",ko:"셸 출력 최소화"},description:{en:"Compress verbose shell output (git, npm, cargo, etc.) before returning it to the agent",ko:"에이전트에 반환하기 전에 상세한 셸 출력(git, npm, cargo 등)을 압축합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0},{path:"shellMinimizer.sourceOutlineLevel",category:"tools",group:"Bash",label:{en:"Shell Minimizer Source Outline",ko:"셸 최소화 소스 개요"},description:{en:"Source outline mode for cat/read of source files: default or aggressive",ko:"소스 파일을 cat/read할 때 사용할 소스 개요 모드: default 또는 aggressive"},kind:"enum",scope:"both",defaultValue:"default",choices:["default","aggressive"],admin:!0},{path:"bashInterceptor.patterns",category:"tools",group:"Bash Interceptor",label:{en:"Patterns",ko:"패턴"},description:{en:"Patterns used by the Bash interceptor, with the corresponding tool and message for each pattern.",ko:"Bash 인터셉터가 사용하는 패턴과 각 패턴에 대응하는 도구 및 메시지입니다."},kind:"array",scope:"both",defaultValue:[{pattern:"^\\s*(cat|head|tail|less|more)\\s+",tool:"read",message:"Use the `read` tool instead of cat/head/tail. It provides better context and handles binary files."},{pattern:"^\\s*(grep|rg|ripgrep|ag|ack)\\s+",tool:"grep",message:"Use the `grep` tool instead of grep/rg. It respects .gitignore and provides structured output."},{pattern:"^\\s*(find|fd|locate)\\s+.*(-name|-iname|-type|--type|-glob)",tool:"glob",message:"Use the `glob` tool instead of find/fd. It respects .gitignore and is faster for glob patterns."},{pattern:"^\\s*sed\\s+(-i|--in-place)",tool:"edit",message:"Use the `edit` tool instead of sed -i. It provides diff preview and fuzzy matching."},{pattern:"^\\s*perl\\s+.*-[pn]?i",tool:"edit",message:"Use the `edit` tool instead of perl -i. It provides diff preview and fuzzy matching."},{pattern:"^\\s*awk\\s+.*-i\\s+inplace",tool:"edit",message:"Use the `edit` tool instead of awk -i inplace. It provides diff preview and fuzzy matching."},{pattern:"^\\s*(echo|printf|cat\\s*<<)\\s+(?:(?:[^\"'>]|\"[^\"]*\"|'[^']*')|(?<!\\|)>{1,2}\\|?\\s*(?:\"/dev/(?:null|tty|stdout|stderr)\"|'/dev/(?:null|tty|stdout|stderr)'|/dev/(?:null|tty|stdout|stderr))(?:[\\s;&|]|$))*(?<!\\|)>{1,2}\\|?\\s*(?!(?:\"/dev/(?:null|tty|stdout|stderr)\"|'/dev/(?:null|tty|stdout|stderr)'|/dev/(?:null|tty|stdout|stderr))(?:[\\s;&|]|$))[$\\w./~\"'-]",tool:"write",message:"Use the `write` tool instead of echo/cat redirection. It handles encoding and provides confirmation."},{pattern:"^\\s*nohup\\s+|(?<!&)\\&\\s*$",tool:"bash",message:"Use `bash` with `name` instead of nohup or background shell syntax so the service stays observable and managed."},{pattern:"^\\s*(?:(?:bun|npm|pnpm|yarn)\\s+(?:run\\s+)?(?:dev|start)(?:\\s|$)|(?:vite|next\\s+dev|nuxt\\s+dev|nodemon|lldb|gdb|tail\\s+-f)(?:\\s|$)|docker\\s+compose\\s+up(?!.*(?:\\s-d(?:\\s|$)|--detach))(?:\\s|$))",tool:"bash",message:"Use `bash` with `name` for services, watchers, and debuggers; inspect with `read proc://<name>`."},{pattern:"^\\s*(?:(?:bun|npm|pnpm|yarn)\\s+(?:run\\s+)?\\S+|cargo\\s+watch|watchexec|pytest|vitest|jest|tsc)(?:.|\\n)*(?:--watch|-w)(?:\\s|$)",tool:"bash",message:"Use `bash` with `name` for watch mode so its output, input, and lifecycle stay managed."}],items:"object",admin:!0,confirmation:!0},{path:"browser.cdpUrl",category:"tools",group:"Grep & Browser",label:{en:"Browser CDP URL",ko:"브라우저 CDP URL"},description:{en:"Default HTTP CDP discovery endpoint (for example http://127.0.0.1:9222) to attach to instead of launching a browser. Explicit app.cdp_url or app.path on the tool call take precedence.",ko:"브라우저를 실행하는 대신 연결할 기본 HTTP CDP 검색 엔드포인트입니다(예: http://127.0.0.1:9222). 도구 호출에 명시된 app.cdp_url 또는 app.path가 우선합니다."},kind:"string",scope:"both",admin:!0,confirmation:!0,appliesTo:{en:"Applies when Browser Relay is off; attaches to the configured CDP host instead of launching Chromium.",ko:"브라우저 릴레이가 꺼져 있을 때 적용되며 Chromium을 실행하는 대신 설정된 CDP 호스트에 연결합니다."}},{path:"browser.freezeOnTurnEnd",category:"tools",group:"Grep & Browser",label:{en:"Freeze Browser Tabs On Turn End",ko:"턴 종료 시 브라우저 탭 정지"},description:{en:"Freeze OMP-owned headless browser tabs when a turn settles so animated pages stop burning CPU/GPU while idle. Tabs unfreeze automatically on next use; pass persist:true on open to opt a tab out.",ko:"턴이 완료되면 OMP 소유의 헤드리스 브라우저 탭을 정지하여 유휴 상태에서 애니메이션 페이지가 CPU/GPU를 소모하지 않게 합니다. 다음 사용 시 자동으로 재개되며, open에 persist:true를 전달하면 해당 탭을 제외할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,appliesTo:{en:"Applies only to OMP-launched headless browser tabs.",ko:"OMP가 실행한 헤드리스 브라우저 탭에만 적용됩니다."}},{path:"browser.headless",category:"tools",group:"Grep & Browser",label:{en:"Headless Browser",ko:"헤드리스 브라우저"},description:{en:"Launch browser in headless mode (disable to show browser UI)",ko:"브라우저를 헤드리스 모드로 실행합니다(브라우저 UI를 표시하려면 비활성화)."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies only when OMP launches Chromium itself.",ko:"OMP가 Chromium을 직접 실행할 때만 적용됩니다."}},{path:"browser.idleCloseSec",category:"tools",group:"Grep & Browser",label:{en:"Browser Idle Close Timeout",ko:"브라우저 유휴 종료 시간"},description:{en:"Close OMP-owned headless browser tabs idle longer than this many seconds (0 = never; session dispose still reaps). Applies only to OMP-launched headless tabs, never relay/CDP/spawned browsers or other sessions' tabs.",ko:"지정한 초보다 오래 유휴 상태인 OMP 소유의 헤드리스 브라우저 탭을 닫습니다(0 = 닫지 않음, 세션 폐기 시에는 정리됨). OMP가 실행한 헤드리스 탭에만 적용되며 relay/CDP/별도 생성 브라우저나 다른 세션의 탭에는 적용되지 않습니다."},kind:"number",scope:"both",defaultValue:1800,admin:!0,appliesTo:{en:"Applies only to OMP-launched headless browser tabs.",ko:"OMP가 실행한 헤드리스 브라우저 탭에만 적용됩니다."}},{path:"browser.relay",category:"tools",group:"Grep & Browser",label:{en:"Browser Relay",ko:"브라우저 릴레이"},description:{en:"Drive your own Chrome tabs through the omp browser relay. Install the extension once (`omp browser-relay install`); the relay server auto-starts when the browser prelude needs it. Takes precedence over Browser CDP URL; set PI_BROWSER_RELAY=0 or PI_BROWSER_RELAY=1 to override.",ko:"omp 브라우저 릴레이를 통해 사용자의 Chrome 탭을 제어합니다. 확장 프로그램을 한 번 설치하세요(`omp browser-relay install`). 브라우저 프렐류드에서 필요할 때 릴레이 서버가 자동으로 시작됩니다. 브라우저 CDP URL보다 우선하며, PI_BROWSER_RELAY=0 또는 PI_BROWSER_RELAY=1로 재정의할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0,appliesTo:{en:"Applies to browser automation and takes precedence over Browser CDP URL.",ko:"브라우저 자동화에 적용되며 브라우저 CDP URL보다 우선합니다."}},{path:"browser.relayUrl",category:"tools",group:"Grep & Browser",label:{en:"Browser Relay URL",ko:"브라우저 릴레이 URL"},description:{en:"omp browser relay endpoint (default http://127.0.0.1:9224).",ko:"omp 브라우저 릴레이 엔드포인트입니다(기본값 http://127.0.0.1:9224)."},kind:"string",scope:"both",admin:!0,confirmation:!0,appliesTo:{en:"Applies when Browser Relay is enabled.",ko:"브라우저 릴레이가 활성화된 경우 적용됩니다."}},{path:"browser.screenshotDir",category:"tools",group:"Grep & Browser",label:{en:"Screenshot Directory",ko:"스크린샷 디렉터리"},description:{en:"Directory to save screenshots. If unset, screenshots go to a temp file. Supports ~. Examples: ~/Downloads, ~/Desktop, /sdcard/Download (Android)",ko:"스크린샷을 저장할 디렉터리입니다. 설정하지 않으면 임시 파일에 저장됩니다. ~를 지원합니다. 예: ~/Downloads, ~/Desktop, /sdcard/Download (Android)"},kind:"string",scope:"both",admin:!0,appliesTo:{en:"Applies to browser.enabled.",ko:"browser.enabled에 적용됩니다."}},{path:"computer.display",category:"tools",group:"Computer",label:{en:"Computer Display",ko:"컴퓨터 디스플레이"},description:{en:"Composite all displays or select a native display id",ko:"모든 디스플레이를 합성하거나 네이티브 디스플레이 id를 선택합니다."},kind:"string",scope:"both",defaultValue:"all",admin:!0,confirmation:!0,appliesTo:{en:"Applies to computer.enabled.",ko:"computer.enabled에 적용됩니다."}},{path:"computer.maxHeight",category:"tools",group:"Computer",label:{en:"Computer Screenshot Height",ko:"컴퓨터 스크린샷 높이"},description:{en:"Maximum composite screenshot height in pixels",ko:"합성 스크린샷의 최대 높이(픽셀)"},kind:"number",scope:"both",defaultValue:2400,integer:!0,admin:!0,appliesTo:{en:"Applies to computer.enabled.",ko:"computer.enabled에 적용됩니다."}},{path:"computer.maxWidth",category:"tools",group:"Computer",label:{en:"Computer Screenshot Width",ko:"컴퓨터 스크린샷 너비"},description:{en:"Maximum composite screenshot width in pixels",ko:"합성 스크린샷의 최대 너비(픽셀)"},kind:"number",scope:"both",defaultValue:3840,integer:!0,admin:!0,appliesTo:{en:"Applies to computer.enabled.",ko:"computer.enabled에 적용됩니다."}},{path:"edit.autoRepair.enabled",category:"tools",group:"Editing",label:{en:"Auto-Repair Parse Regressions",ko:"구문 분석 오류 자동 복구"},description:{en:"When an edit breaks a file's AST parse, ask the smol model to fix the broken region (validated by re-parse; falls back to a warning)",ko:"편집으로 파일의 AST 구문 분석이 깨지면 smol 모델에 손상된 영역의 수정을 요청합니다(재분석으로 검증하며, 실패 시 경고로 대체)."},kind:"boolean",scope:"both",defaultValue:!1},{path:"edit.blockAutoGenerated",category:"tools",group:"Editing",label:{en:"Block Auto-Generated Files",ko:"자동 생성 파일 차단"},description:{en:"Prevent editing of files that appear to be auto-generated (protoc, sqlc, swagger, etc.)",ko:"자동 생성된 것으로 보이는 파일(protoc, sqlc, swagger 등)의 편집을 방지합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"edit.enforceSeenLines",category:"tools",group:"Editing",label:{en:"Enforce Seen-Line Guard",ko:"확인된 줄 보호 적용"},description:{en:"Reject edits anchored on lines a prior read/search never displayed in full",ko:"이전 읽기/검색에서 전체가 표시되지 않은 줄을 기준으로 한 편집을 거부합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"edit.fuzzyMatch",category:"tools",group:"Editing",label:{en:"Fuzzy Match",ko:"퍼지 일치"},description:{en:"Accept high-confidence fuzzy matches for whitespace differences",ko:"공백 차이에 대해 신뢰도가 높은 퍼지 일치를 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"edit.fuzzyThreshold",category:"tools",group:"Editing",label:{en:"Fuzzy Match Threshold",ko:"퍼지 일치 임계값"},description:{en:"Similarity threshold (0-1) for accepting fuzzy matches",ko:"퍼지 일치를 허용할 유사도 임계값(0-1)"},kind:"number",scope:"both",defaultValue:.95,integer:!1,min:0,max:1,step:.01},{path:"edit.mode",category:"tools",group:"Editing",label:{en:"Edit Mode",ko:"편집 모드"},description:{en:"Select the edit tool variant (replace, patch, hashline, or apply_patch)",ko:"편집 도구 변형을 선택합니다(replace, patch, hashline 또는 apply_patch)."},kind:"enum",scope:"both",defaultValue:"hashline",choices:["apply_patch","hashline","patch","replace","sloppy"]},{path:"edit.streamingAbort",category:"tools",group:"Editing",label:{en:"Abort on Failed Preview",ko:"미리보기 실패 시 중단"},description:{en:"Abort streaming edit tool calls when patch preview fails",ko:"패치 미리보기가 실패하면 스트리밍 중인 edit 도구 호출을 중단합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"edit.recoverInlineEdits",category:"tools",group:"Editing",label:{en:"Recover Inline Edit Payloads",ko:"인라인 편집 내용 복구"},description:{en:"Execute edit payloads the model emits as plain text by converting them into edit tool calls",ko:"모델이 일반 텍스트로 출력한 편집 내용을 edit 도구 호출로 변환하여 실행합니다."},kind:"boolean",scope:"both",defaultValue:!0,appliesTo:{en:"Applies when edit.mode is sloppy.",ko:"edit.mode가 sloppy인 경우 적용됩니다."}},{path:"eval.autoBackground.enabled",category:"tools",group:"Eval & Runtimes",label:{en:"Eval Auto-Background",ko:"Eval 자동 백그라운드"},description:{en:"Automatically background long-running eval cells and deliver the result later",ko:"오래 실행되는 eval 셀을 자동으로 백그라운드로 전환하고 결과를 나중에 전달합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"eval.js",category:"tools",group:"Eval & Runtimes",label:{en:"JavaScript Eval Backend",ko:"JavaScript Eval 백엔드"},description:{en:"Allow the eval tool to dispatch JavaScript cells to the in-process runtime",ko:"eval 도구가 JavaScript 셀을 인프로세스 런타임으로 전달하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"eval.py",category:"tools",group:"Eval & Runtimes",label:{en:"Python Eval Backend",ko:"Python Eval 백엔드"},description:{en:"Allow the eval tool to dispatch Python cells to the IPython kernel",ko:"eval 도구가 Python 셀을 IPython 커널로 전달하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"eval.tools.enabled",category:"tools",group:"Eval & Runtimes",label:{en:"Eval-Defined Tools",ko:"Eval 정의 도구"},description:{en:"Let eval cells define tools (@tool in Python, tool(fn) in JS) that task, agent(), and workpool() subagents can call",ko:"eval 셀이 task, agent(), workpool() 하위 에이전트에서 호출할 수 있는 도구(Python의 @tool, JS의 tool(fn))를 정의하도록 허용합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"eval.workpool.freshAgents",category:"tools",group:"Eval & Runtimes",label:{en:"Fresh Workpool Agents",ko:"새 Workpool 에이전트"},description:{en:"Spawn a new subagent for every workpool item instead of reusing workers or batching queued items",ko:"워커를 재사용하거나 대기 항목을 일괄 처리하는 대신 각 workpool 항목마다 새 하위 에이전트를 생성합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"python.interpreter",category:"tools",group:"Eval & Runtimes",label:{en:"Python Interpreter",ko:"Python 인터프리터"},description:{en:"Optional path to an exact Python executable. When set, automatic Python runtime discovery is skipped.",ko:"정확한 Python 실행 파일의 선택적 경로입니다. 설정하면 Python 런타임 자동 검색을 건너뜁니다."},kind:"string",scope:"both",defaultValue:"",admin:!0,confirmation:!0},{path:"python.kernelMode",category:"tools",group:"Eval & Runtimes",label:{en:"Python Kernel Mode",ko:"Python 커널 모드"},description:{en:"Keep the IPython kernel alive across eval calls or start fresh each time",ko:"eval 호출 간에 IPython 커널을 유지하거나 매번 새로 시작합니다."},kind:"enum",scope:"both",defaultValue:"session",choices:["session","per-call"]},{path:"eval.autoBackground.thresholdMs",category:"tools",group:"Eval",label:{en:"Threshold Ms",ko:"임계값 Ms"},description:{en:"Threshold in milliseconds for automatically backgrounding evaluation.",ko:"평가를 자동으로 백그라운드 처리하기 위한 임계값(밀리초)입니다."},kind:"number",scope:"both",defaultValue:6e4,integer:!0,admin:!0,appliesTo:{en:"Applies to the matching eval backend.",ko:"해당 eval 백엔드에 적용됩니다."}},{path:"exa.enabled",category:"tools",group:"Services",label:{en:"Exa",ko:"Exa"},description:{en:"Enable the Exa web search provider",ko:"Exa 웹 검색 제공자를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"exa.searchDelayMs",category:"tools",group:"Services",label:{en:"Exa Search Delay",ko:"Exa 검색 지연"},description:{en:"Minimum delay between Exa web search requests in milliseconds; set 0 to disable pacing",ko:"Exa 웹 검색 요청 사이의 최소 지연 시간(밀리초)입니다. 속도 제한을 비활성화하려면 0으로 설정하세요."},kind:"number",scope:"both",defaultValue:1e3,integer:!0},{path:"searxng.endpoint",category:"tools",group:"Services",label:{en:"SearXNG Endpoint",ko:"SearXNG 엔드포인트"},description:{en:"Base URL of a self-hosted SearXNG instance used for web search",ko:"웹 검색에 사용할 자체 호스팅 SearXNG 인스턴스의 기본 URL입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0},{path:"lsp.diagnosticsDeduplicate",category:"tools",group:"LSP",label:{en:"Deduplicate Diagnostics",ko:"진단 중복 제거"},description:{en:"Suppress post-edit LSP diagnostics already shown for a file; only surface new or changed ones",ko:"파일에 대해 이미 표시된 편집 후 LSP 진단을 숨기고 새 항목이나 변경된 항목만 표시합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.diagnosticsOnEdit",category:"tools",group:"LSP",label:{en:"Diagnostics on Edit",ko:"편집 시 진단"},description:{en:"Return LSP diagnostics after editing code files",ko:"코드 파일을 편집한 후 LSP 진단을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"lsp.diagnosticsOnWrite",category:"tools",group:"LSP",label:{en:"Diagnostics on Write",ko:"쓰기 시 진단"},description:{en:"Return LSP diagnostics after writing code files",ko:"코드 파일을 쓴 후 LSP 진단을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.enabled",category:"tools",group:"LSP",label:{en:"LSP",ko:"LSP"},description:{en:"Enable the lsp tool for code intelligence (definitions, references, diagnostics, rename)",ko:"코드 인텔리전스(정의, 참조, 진단, 이름 변경)를 위한 lsp 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.formatOnWrite",category:"tools",group:"LSP",label:{en:"Format on Write",ko:"쓰기 시 포맷"},description:{en:"Automatically format code files using LSP after writing",ko:"코드 파일을 쓴 후 LSP를 사용해 자동으로 포맷합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"lsp.lazy",category:"tools",group:"LSP",label:{en:"Lazy LSP Startup",ko:"지연 LSP 시작"},description:{en:"Start language servers on first use (lsp tool or editing a matching file type) instead of at session startup",ko:"세션 시작 시가 아니라 처음 사용할 때(lsp 도구 사용 또는 일치하는 파일 형식 편집 시) 언어 서버를 시작합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"lsp.shared",category:"tools",group:"LSP",label:{en:"Shared Language Servers",ko:"공유 언어 서버"},description:{en:"Share one language server per project across omp instances via the daemon broker (falls back to private servers when unavailable)",ko:"데몬 브로커를 통해 여러 omp 인스턴스가 프로젝트당 하나의 언어 서버를 공유합니다(사용할 수 없으면 전용 서버로 대체)."},kind:"boolean",scope:"both",defaultValue:!0},{path:"read.defaultLimit",category:"tools",group:"Reading",label:{en:"Default Read Limit",ko:"기본 읽기 한도"},description:{en:"Default number of lines returned when agent calls read without a limit",ko:"에이전트가 한도를 지정하지 않고 read를 호출할 때 반환할 기본 줄 수입니다."},kind:"number",scope:"both",defaultValue:300,integer:!0},{path:"read.summarize.enabled",category:"tools",group:"Read Summaries",label:{en:"Read Summaries",ko:"읽기 요약"},description:{en:"Return structural code summaries when read is called without an explicit selector",ko:"명시적인 선택자 없이 read를 호출하면 구조화된 코드 요약을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"read.summarize.minBodyLines",category:"tools",group:"Read Summaries",label:{en:"Read Summary Body Lines",ko:"읽기 요약 본문 줄 수"},description:{en:"Minimum multiline body or literal length before read summaries collapse it",ko:"읽기 요약에서 여러 줄 본문 또는 리터럴을 접기 위한 최소 길이입니다."},kind:"number",scope:"both",defaultValue:4,integer:!0},{path:"read.summarize.minCommentLines",category:"tools",group:"Read Summaries",label:{en:"Read Summary Comment Lines",ko:"읽기 요약 주석 줄 수"},description:{en:"Minimum multiline block comment length before read summaries collapse it",ko:"읽기 요약에서 여러 줄 블록 주석을 접기 위한 최소 길이입니다."},kind:"number",scope:"both",defaultValue:6,integer:!0},{path:"read.summarize.minTotalLines",category:"tools",group:"Read Summaries",label:{en:"Read Summary Minimum File Length",ko:"읽기 요약 최소 파일 길이"},description:{en:"Files with fewer total lines are read verbatim instead of structurally summarized",ko:"전체 줄 수가 이 값보다 적은 파일은 구조적으로 요약하지 않고 원문 그대로 읽습니다."},kind:"number",scope:"both",defaultValue:100,integer:!0},{path:"read.summarize.prose",category:"tools",group:"Read Summaries",label:{en:"Prose Summaries",ko:"본문 요약"},description:{en:"Return structural summaries for Markdown and plain text reads",ko:"Markdown 및 일반 텍스트를 읽을 때 구조화된 요약을 반환합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"read.summarize.unfoldLimit",category:"tools",group:"Read Summaries",label:{en:"Read Summary Unfold Ceiling",ko:"읽기 요약 펼치기 상한"},description:{en:"Hard ceiling on summary size while BFS-unfolding. An unfold whose revealed lines would exceed this is skipped (that span stays folded) and unfolding continues with the remaining spans.",ko:"BFS 방식으로 펼칠 때의 요약 크기 상한입니다. 펼쳐서 표시되는 줄이 이 값을 초과하면 해당 범위는 접힌 상태로 건너뛰고 나머지 범위를 계속 펼칩니다."},kind:"number",scope:"both",defaultValue:100,integer:!0},{path:"read.summarize.unfoldUntil",category:"tools",group:"Read Summaries",label:{en:"Read Summary Unfold Target",ko:"읽기 요약 펼치기 목표"},description:{en:"BFS-unfold elidable spans until the summary is at least this many visible lines. 0 keeps only the outermost elisions.",ko:"요약의 표시 줄 수가 최소한 이 값에 도달할 때까지 생략 가능한 범위를 BFS 방식으로 펼칩니다. 0은 가장 바깥쪽 생략만 유지합니다."},kind:"number",scope:"both",defaultValue:50,integer:!0},{path:"searxng.basicPassword",category:"tools",group:"Searxng",label:{en:"Basic Password",ko:"기본 인증 비밀번호"},description:{en:"Configures the password credential for SearXNG basic authentication.",ko:"SearXNG 기본 인증의 비밀번호 자격 증명을 구성합니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0},{path:"searxng.basicUsername",category:"tools",group:"Searxng",label:{en:"Basic Username",ko:"기본 인증 사용자 이름"},description:{en:"Configures the username credential for SearXNG basic authentication.",ko:"SearXNG 기본 인증의 사용자 이름 자격 증명을 구성합니다."},kind:"string",scope:"both"},{path:"searxng.categories",category:"tools",group:"Searxng",label:{en:"Categories",ko:"카테고리"},description:{en:"Sets the SearXNG search categories.",ko:"SearXNG 검색 카테고리를 설정합니다."},kind:"string",scope:"both"},{path:"searxng.engines",category:"tools",group:"Searxng",label:{en:"Engines",ko:"검색 엔진"},description:{en:"Sets the SearXNG search engines.",ko:"SearXNG 검색 엔진을 설정합니다."},kind:"string",scope:"both"},{path:"searxng.language",category:"tools",group:"Searxng",label:{en:"Language",ko:"언어"},description:{en:"Sets the SearXNG search language.",ko:"SearXNG 검색 언어를 설정합니다."},kind:"string",scope:"both"},{path:"searxng.safesearch",category:"tools",group:"Searxng",label:{en:"Safe Search",ko:"안전 검색"},description:{en:"SearXNG safe-search level: 0 is off, 1 is moderate, and 2 is strict.",ko:"SearXNG 안전 검색 수준입니다. 0은 끄기, 1은 보통, 2는 엄격입니다."},kind:"number",scope:"both",integer:!0,min:0,max:2,step:1},{path:"searxng.token",category:"tools",group:"Searxng",label:{en:"Token",ko:"토큰"},description:{en:"Configures the SearXNG token credential.",ko:"SearXNG 토큰 자격 증명을 구성합니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0},{path:"shellMinimizer.except",category:"tools",group:"Shell Minimizer",label:{en:"Except",ko:"제외 항목"},description:{en:"Sets the shell minimizer exception list.",ko:"셸 최소화 도구의 예외 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string",admin:!0},{path:"shellMinimizer.maxCaptureBytes",category:"tools",group:"Shell Minimizer",label:{en:"Max Capture Bytes",ko:"최대 캡처 바이트"},description:{en:"Sets the maximum shell minimizer capture size in bytes.",ko:"셸 최소화 도구의 최대 캡처 크기를 바이트 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:4194304,integer:!0,admin:!0},{path:"shellMinimizer.only",category:"tools",group:"Shell Minimizer",label:{en:"Only",ko:"적용 대상"},description:{en:"Sets the shell minimizer inclusion-only list.",ko:"셸 최소화 도구의 전용 포함 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string",admin:!0},{path:"skills.customDirectories",category:"tools",group:"Skills",label:{en:"Custom Directories",ko:"사용자 지정 디렉터리"},description:{en:"Sets the custom skill directories.",ko:"사용자 지정 스킬 디렉터리를 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"skills.enableAgentsProject",category:"tools",group:"Skills",label:{en:"Enable Agents Project",ko:"Agents 프로젝트 활성화"},description:{en:"Enables the Agents project skill source.",ko:"Agents 프로젝트 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enableAgentsUser",category:"tools",group:"Skills",label:{en:"Enable Agents User",ko:"Agents 사용자 활성화"},description:{en:"Enables the Agents user skill source.",ko:"Agents 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enableClaudeProject",category:"tools",group:"Skills",label:{en:"Enable Claude Project",ko:"Claude 프로젝트 활성화"},description:{en:"Enables the Claude project skill source.",ko:"Claude 프로젝트 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enableClaudeUser",category:"tools",group:"Skills",label:{en:"Enable Claude User",ko:"Claude 사용자 활성화"},description:{en:"Enables the Claude user skill source.",ko:"Claude 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"skills.enableCodexUser",category:"tools",group:"Skills",label:{en:"Enable Codex User",ko:"Codex 사용자 활성화"},description:{en:"Enables the Codex user skill source.",ko:"Codex 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"skills.enablePiProject",category:"tools",group:"Skills",label:{en:"Enable Pi Project",ko:"Pi 프로젝트 활성화"},description:{en:"Enables the Pi project skill source.",ko:"Pi 프로젝트 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enablePiUser",category:"tools",group:"Skills",label:{en:"Enable Pi User",ko:"Pi 사용자 활성화"},description:{en:"Enables the Pi user skill source.",ko:"Pi 사용자 스킬 소스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.enabled",category:"tools",group:"Skills",label:{en:"Enabled",ko:"활성화"},description:{en:"Enables skill support.",ko:"스킬 지원을 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"skills.ignoredSkills",category:"tools",group:"Skills",label:{en:"Ignored Skills",ko:"무시할 스킬"},description:{en:"Sets the list of ignored skills.",ko:"무시할 스킬 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"skills.includeSkills",category:"tools",group:"Skills",label:{en:"Include Skills",ko:"포함할 스킬"},description:{en:"Sets the list of included skills.",ko:"포함할 스킬 목록을 설정합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"skills.enableSkillCommands",category:"tools",group:"Commands & Skills",label:{en:"Skill Commands",ko:"스킬 명령어"},description:{en:"Register skills as /skill:name commands",ko:"스킬을 /skill:name 명령어로 등록합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.approval",category:"tools",group:"Approvals",label:{en:"Tool Approval Policies",ko:"도구 승인 정책"},description:{en:"Per-tool approval policies. Set to 'allow' to auto-approve, 'prompt' to require confirmation, or 'deny' to block. Overrides are honored in every approval mode.",ko:"도구별 승인 정책입니다. 자동 승인하려면 'allow', 확인을 요구하려면 'prompt', 차단하려면 'deny'로 설정합니다. 재정의는 모든 승인 모드에서 적용됩니다."},kind:"object",scope:"both",defaultValue:{},recordValues:"approval",admin:!0,confirmation:!0},{path:"tools.approvalMode",category:"tools",group:"Approvals",label:{en:"Tool Approval",ko:"도구 승인"},description:{en:"Default approval behavior for tool calls. 'Always ask' auto-approves read-only tools only. 'Write' auto-approves read and workspace-write tools. 'Yolo' auto-approves all tiers; user policy may still prompt or block.",ko:"도구 호출의 기본 승인 동작입니다. 'Always ask'는 읽기 전용 도구만 자동 승인합니다. 'Write'는 읽기 및 워크스페이스 쓰기 도구를 자동 승인합니다. 'Yolo'는 모든 티어를 자동 승인하지만 사용자 정책에 따라 확인하거나 차단할 수 있습니다."},kind:"enum",scope:"both",defaultValue:"yolo",choices:["always-ask","write","yolo"],admin:!0,confirmation:!0},{path:"tools.artifactHeadBytes",category:"tools",group:"Output Limits",label:{en:"Artifact Head Size (KB)",ko:"아티팩트 앞부분 크기(KB)"},description:{en:"Amount of head content kept inline alongside the tail when output spills to artifact (middle elision). 0 disables — keep tail only.",ko:"출력이 아티팩트로 넘쳐 저장될 때 끝부분과 함께 인라인으로 유지할 앞부분 콘텐츠의 양입니다(중간 생략). 0이면 비활성화되어 끝부분만 유지합니다."},kind:"number",scope:"both",defaultValue:20,integer:!0},{path:"tools.artifactSpillThreshold",category:"tools",group:"Output Limits",label:{en:"Artifact Spill Threshold (KB)",ko:"아티팩트 분리 저장 임계값(KB)"},description:{en:"Tool output above this size is saved as an artifact; tail is kept inline",ko:"이 크기를 초과하는 도구 출력은 아티팩트로 저장하고 끝부분은 인라인으로 유지합니다."},kind:"number",scope:"both",defaultValue:50,integer:!0},{path:"tools.artifactTailBytes",category:"tools",group:"Output Limits",label:{en:"Artifact Tail Size (KB)",ko:"아티팩트 끝부분 크기(KB)"},description:{en:"Amount of tail content kept inline when output spills to artifact",ko:"출력이 아티팩트로 넘쳐 저장될 때 인라인으로 유지할 끝부분 콘텐츠의 양"},kind:"number",scope:"both",defaultValue:20,integer:!0},{path:"tools.outputMaxColumns",category:"tools",group:"Output Limits",label:{en:"Output Column Cap",ko:"출력 열 상한"},description:{en:"Per-line byte cap for streaming tool outputs (bash, python, js eval) and `read`. Lines wider than this are ellipsis-truncated; remaining bytes up to the next newline are dropped. 0 disables.",ko:"스트리밍 도구 출력(bash, python, js eval)과 `read`의 줄당 바이트 상한입니다. 이보다 긴 줄은 말줄임표로 잘리고 다음 줄바꿈까지 남은 바이트는 버려집니다. 0은 비활성화입니다."},kind:"number",scope:"both",defaultValue:768,integer:!0},{path:"tools.artifactTailLines",category:"tools",group:"Output Limits",label:{en:"Artifact Tail Lines",ko:"아티팩트 끝부분 줄 수"},description:{en:"Maximum lines of tail content kept inline when output spills to artifact",ko:"출력이 아티팩트로 넘어갈 때 인라인으로 유지할 끝부분의 최대 줄 수입니다."},kind:"number",scope:"both",defaultValue:500,integer:!0},{path:"tools.format",category:"tools",group:"Experimental",label:{en:"Tool Calling Mode",ko:"도구 호출 모드"},description:{en:"Controls how tools are exposed to the model. Auto uses provider-native tool calls unless the selected model is marked as not supporting them, then falls back to the GLM owned dialect. Native forces provider-native tools; the other values force the named owned dialect. Applies on session start.",ko:"도구가 모델에 제공되는 방식을 제어합니다. Auto는 선택한 모델이 지원하지 않는 것으로 표시되지 않는 한 제공자 네이티브 도구 호출을 사용하며, 지원하지 않으면 GLM 자체 관리 방언으로 대체합니다. Native는 제공자 네이티브 도구를 강제하고, 다른 값은 해당 이름의 자체 관리 방언을 강제합니다. 세션 시작 시 적용됩니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","native","glm","hermes","kimi","xml","anthropic","deepseek","harmony","qwen3","gemini","gemma","minimax"]},{path:"tools.xdev",category:"tools",group:"Discovery & MCP",label:{en:"xd:// Tools",ko:"xd:// 도구"},description:{en:"Mount rarely-used (discoverable) tools under xd:// device URLs driven via read/write instead of shipping their schemas on every request. Sessions whose explicit tool list grants read but omits write mount devices through a device-only write transport (filesystem writes stay rejected). Disable to expose every enabled tool top-level.",ko:"자주 사용하지 않는 검색 가능 도구를 요청마다 스키마로 전송하는 대신 read/write로 구동되는 xd:// 장치 URL 아래에 마운트합니다. 명시적 도구 목록에서 read는 허용하지만 write는 제외한 세션은 장치 전용 쓰기 전송을 통해 장치를 마운트합니다(파일 시스템 쓰기는 계속 거부됨). 비활성화하면 활성화된 모든 도구를 최상위에 노출합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"tools.xdevDocs",category:"tools",group:"Discovery & MCP",label:{en:"xd:// Prompt Docs",ko:"xd:// 프롬프트 문서"},description:{en:"Choose which mounted-device docs and schemas are inlined in the system prompt. Built-ins keeps core tools inline while MCP and extension tools stay on-demand.",ko:"시스템 프롬프트에 인라인으로 포함할 마운트된 장치 문서와 스키마를 선택합니다. Built-ins는 핵심 도구를 인라인으로 유지하고 MCP 및 확장 도구는 필요할 때만 제공합니다."},kind:"enum",scope:"both",defaultValue:"catalog",choices:["inline","builtins","catalog"]},{path:"tools.xdevInlineDevices",category:"tools",group:"Discovery & MCP",label:{en:"xd:// Inline Devices",ko:"xd:// 인라인 장치"},description:{en:"When xd:// Prompt Docs is Built-ins Only, inline dynamic devices whose names match these glob patterns (for example mcp__context_mode_*). Catalog Only ignores this setting.",ko:"xd:// Prompt Docs가 Built-ins Only일 때 이름이 이 glob 패턴과 일치하는 동적 장치를 인라인으로 포함합니다(예: mcp__context_mode_*). Catalog Only에서는 이 설정을 무시합니다."},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"ttsr.builtinRules",category:"tools",group:"Rules (TTSR)",label:{en:"Built-in Rules",ko:"기본 제공 규칙"},description:{en:"Load the default rules shipped with the agent (override individually with ttsr.disabledRules)",ko:"에이전트와 함께 제공되는 기본 규칙을 불러옵니다(ttsr.disabledRules로 개별 재정의)."},kind:"boolean",scope:"both",defaultValue:!0},{path:"ttsr.contextMode",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Context Mode",ko:"TTSR 컨텍스트 모드"},description:{en:"What to do with partial output when TTSR triggers",ko:"TTSR이 트리거될 때 부분 출력을 처리하는 방식"},kind:"enum",scope:"both",defaultValue:"discard",choices:["discard","keep"]},{path:"ttsr.disabledRules",category:"tools",group:"Rules (TTSR)",label:{en:"Disabled Rules",ko:"비활성화된 규칙"},description:{en:"Rule names to ignore entirely (applies to bundled defaults and your own rules)",ko:"완전히 무시할 규칙 이름(번들 기본 규칙과 사용자 규칙에 적용)"},kind:"array",scope:"both",defaultValue:[],items:"string"},{path:"ttsr.enabled",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR",ko:"TTSR"},description:{en:"Interrupt the agent mid-stream when output matches rule patterns (Time-Traveling Stream Rules)",ko:"출력이 규칙 패턴과 일치하면 스트리밍 도중 에이전트를 중단합니다(Time-Traveling Stream Rules)."},kind:"boolean",scope:"both",defaultValue:!0},{path:"ttsr.judge",category:"tools",group:"Rules (TTSR)",label:{en:"Judged Rules",ko:"판정 규칙"},description:{en:"Ask the judge model role each `question` rule about completed replies, reasoning, and tool calls; a yes injects the rule as a warning",ko:"완료된 응답, 추론, 도구 호출에 대해 judge 모델 역할에 각 `question` 규칙을 묻고, 해당된다고 판정하면 규칙을 경고로 삽입합니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","on","off"],appliesTo:{en:"Auto requires the judge model role to resolve to a native TypeSafe jev model.",ko:"auto는 judge 모델 역할이 네이티브 TypeSafe jev 모델로 확인될 때만 활성화됩니다."}},{path:"ttsr.interruptMode",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Interrupt Mode",ko:"TTSR 중단 모드"},description:{en:"When to interrupt mid-stream vs inject warning after completion",ko:"스트리밍 도중 중단할 시점과 완료 후 경고를 삽입할 시점을 설정합니다."},kind:"enum",scope:"both",defaultValue:"always",choices:["never","prose-only","tool-only","always"]},{path:"ttsr.repeatGap",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Repeat Gap",ko:"TTSR 반복 간격"},description:{en:"Messages before a rule can trigger again",ko:"규칙이 다시 트리거되기 전에 필요한 메시지 수"},kind:"number",scope:"both",defaultValue:10,integer:!0},{path:"ttsr.repeatMode",category:"tools",group:"Rules (TTSR)",label:{en:"TTSR Repeat Mode",ko:"TTSR 반복 모드"},description:{en:"How rules can repeat: once per session or after a message gap",ko:"규칙 반복 방식: 세션당 한 번 또는 메시지 간격 후 반복"},kind:"enum",scope:"both",defaultValue:"once",choices:["once","after-gap"]},{path:"checkpoint.enabled",category:"safety",group:"Available Tools",label:{en:"Checkpoint/Rewind",ko:"체크포인트/되돌리기"},description:{en:"Enable the checkpoint and rewind tools for context checkpointing",ko:"컨텍스트 체크포인트를 위한 checkpoint 및 rewind 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"security.enabled",category:"safety",group:"Available Tools",label:{en:"Security",ko:"보안"},description:{en:"Enable OMP-native security scan planning, execution, and the read-only security:// resource namespace",ko:"OMP 네이티브 보안 검사의 계획 및 실행과 읽기 전용 security:// 리소스 네임스페이스를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"codexResets.autoRedeem",category:"safety",group:"Services",label:{en:"Codex Auto-Redeem Saved Resets",ko:"저장된 Codex 리셋 자동 사용"},description:{en:"Spend saved Codex rate-limit resets automatically: restore an account blocked by an exhausted 5h or weekly window when a turn is stuck and no other account can take over, and salvage credits that are about to expire. unset asks before the first spend, yes spends without prompting, and no disables both checks.",ko:"저장된 Codex 사용량 제한 리셋을 자동으로 사용합니다. 턴이 멈추고 대신 사용할 계정이 없을 때 소진된 5h 또는 주간 제한으로 차단된 계정을 복원하고, 곧 만료될 크레딧을 회수합니다. unset은 처음 사용하기 전에 확인하고, yes는 확인 없이 사용하며, no는 두 검사를 모두 비활성화합니다."},kind:"enum",scope:"both",defaultValue:"unset",choices:["unset","yes","no"],admin:!0,confirmation:!0},{path:"codexResets.keepCredits",category:"safety",group:"Services",label:{en:"Codex Auto-Redeem Reserve",ko:"Codex 자동 사용 예비량"},description:{en:"Never auto-spend below this many saved resets (0 = the last credit may be spent automatically). Credits about to expire are exempt — a reserved credit that expires preserves nothing.",ko:"저장된 리셋이 지정한 개수 미만이 되도록 자동 사용하지 않습니다(0 = 마지막 크레딧도 자동 사용 가능). 곧 만료될 크레딧은 예외입니다. 만료되는 크레딧을 남겨 두어도 보존되지 않습니다."},kind:"number",scope:"both",defaultValue:0,integer:!0},{path:"codexResets.minBlockedMinutes",category:"safety",group:"Services",label:{en:"Codex Auto-Redeem Min Block",ko:"Codex 자동 사용 최소 차단 시간"},description:{en:"Only auto-redeem when the natural unblock — the latest reset among the exhausted 5h/weekly windows — is at least this many minutes away (don't spend a scarce credit to save a short wait). Raise it (e.g. 360) to ignore 5h-only blocks.",ko:"자연 해제 시점, 즉 소진된 5h/주간 제한 중 가장 늦은 리셋까지 지정한 분 이상 남은 경우에만 자동 사용합니다(짧은 대기 시간을 줄이려고 희소한 크레딧을 쓰지 않음). 5h 제한만 발생한 경우를 무시하려면 값을 높이세요(예: 360)."},kind:"number",scope:"both",defaultValue:60},{path:"codexResets.salvageHorizonHours",category:"safety",group:"Services",label:{en:"Codex Reset Salvage Horizon",ko:"Codex 리셋 회수 기한"},description:{en:"Spend a saved Codex reset automatically when it would otherwise expire within this many hours and either chat window (5h or weekly) has meaningful usage to restore (0 disables expiry salvage).",ko:"저장된 Codex 리셋이 지정한 시간 내에 만료될 예정이고 두 채팅 제한(5h 또는 주간) 중 하나에 복원할 만한 사용량이 있으면 자동으로 사용합니다(0은 만료 회수 비활성화)."},kind:"number",scope:"both",defaultValue:12},{path:"claudeResets.autoRedeem",category:"safety",group:"Services",label:{en:"Claude Auto-Redeem Resets",ko:"Claude 리셋 자동 사용"},description:{en:"Spend eligible Claude Cedar or Juniper resets automatically. Cedar is spent only for covered limits; Juniper can only recover a sole 5-hour block. unset asks before the first spend, yes spends without prompting, and no disables blocked recovery and expiry salvage.",ko:"사용 가능한 Claude Cedar 또는 Juniper 리셋을 자동으로 사용합니다. Cedar는 적용 대상 한도에만 사용되며 Juniper는 단독 5시간 차단만 복구할 수 있습니다. unset은 처음 사용하기 전에 확인하고, yes는 묻지 않고 사용하며, no는 차단 복구와 만료 회수를 모두 비활성화합니다."},kind:"enum",scope:"both",defaultValue:"unset",choices:["unset","yes","no"],admin:!0,confirmation:!0},{path:"claudeResets.keepCredits",category:"safety",group:"Services",label:{en:"Claude Auto-Redeem Reserve",ko:"Claude 자동 사용 예비량"},description:{en:"Keep at least this many Claude resets banked (0 allows the last eligible reset to be spent automatically). The reserve also applies to expiry salvage.",ko:"Claude 리셋을 최소 지정한 개수만큼 남겨 둡니다(0이면 마지막 사용 가능 리셋도 자동 사용). 이 예비량은 만료 회수에도 적용됩니다."},kind:"number",scope:"both",defaultValue:0,integer:!0},{path:"claudeResets.minBlockedMinutes",category:"safety",group:"Services",label:{en:"Claude Auto-Redeem Min Block",ko:"Claude 자동 사용 최소 차단 시간"},description:{en:"Only auto-redeem when the natural unblock — the latest reset among the exhausted covered windows — is at least this many minutes away. A 5-hour-only reset is never used for a weekly or model-scoped block.",ko:"자연 해제 시점, 즉 소진된 적용 대상 제한 중 가장 늦은 리셋까지 지정한 분 이상 남은 경우에만 자동 사용합니다. 5시간 전용 리셋은 주간 또는 모델별 차단에 사용되지 않습니다."},kind:"number",scope:"both",defaultValue:60},{path:"claudeResets.salvageHorizonHours",category:"safety",group:"Services",label:{en:"Claude Reset Salvage Horizon",ko:"Claude 리셋 회수 기한"},description:{en:"Use a server-selected Cedar reset within this many hours of expiry only when its covered windows have meaningful usage to restore and the grant permits early use or a covered window is exhausted (0 disables salvage).",ko:"서버가 선택한 Cedar 리셋이 지정한 시간 내에 만료될 예정이고, 적용 대상 제한에 복원할 만한 사용량이 있으며, 조기 사용이 허용되거나 적용 대상 제한이 소진된 경우에만 사용합니다(0은 회수 비활성화)."},kind:"number",scope:"both",defaultValue:12},{path:"isolation.backend",category:"safety",group:"Isolation",label:{en:"Isolation Backend",ko:"격리 백엔드"},description:{en:"Backend used for subagent isolation and worktree cloning",ko:"하위 에이전트 격리 및 worktree 복제에 사용할 백엔드입니다."},kind:"enum",scope:"both",defaultValue:"auto",choices:["auto","apfs","btrfs","zfs","reflink","overlayfs","projfs","block-clone","rcopy"],admin:!0,confirmation:!0},{path:"worktree.base",category:"safety",group:"Isolation",label:{en:"Worktree Base Directory",ko:"Worktree 기본 디렉터리"},description:{en:"Base directory for agent-managed worktrees — task-isolation copies, `github` PR checkouts, and `omp worktree` cleanup all live here. Unset uses ~/.omp/wt. Must be an absolute or ~-relative path; relative paths are ignored. The OMP_WORKTREE_DIR env var overrides this.",ko:"에이전트가 관리하는 worktree의 기본 디렉터리입니다. 작업 격리 복사본, `github` PR 체크아웃 및 `omp worktree` 정리가 모두 여기에 저장됩니다. 설정하지 않으면 ~/.omp/wt를 사용합니다. 절대 경로 또는 ~ 기준 경로여야 하며 상대 경로는 무시됩니다. OMP_WORKTREE_DIR 환경 변수가 이 설정을 재정의합니다."},kind:"string",scope:"both",admin:!0,confirmation:!0},{path:"worktree.clone",category:"safety",group:"Isolation",label:{en:"Clone Checkout into Worktrees",ko:"체크아웃을 Worktree로 복제"},description:{en:"New worktrees from `github pr_checkout` and `git worktree add` in bash start as a copy-on-write clone of the current checkout so ignored build artifacts (node_modules, target) carry over; falls back to a plain checkout when the filesystem cannot clone",ko:"bash의 `github pr_checkout` 및 `git worktree add`로 만드는 새 worktree를 현재 체크아웃의 copy-on-write 복제본으로 시작하여 무시된 빌드 아티팩트(node_modules, target)를 이어받습니다. 파일 시스템에서 복제할 수 없으면 일반 체크아웃으로 대체합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"worktree.cleanSource",category:"safety",group:"Isolation",label:{en:"Clean Source Checkout on /wt",ko:"/wt 실행 시 원본 체크아웃 정리"},description:{en:"When creating a worktree with `/wt`, reset tracked changes and remove untracked files from the original checkout after carrying them over",ko:"`/wt`로 worktree를 만들 때 변경 사항을 옮긴 뒤 원본 체크아웃의 추적 중인 변경 사항을 되돌리고 추적되지 않은 파일을 삭제합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0,appliesTo:{en:"Applies to the /wt (/worktree) slash command.",ko:"/wt(/worktree) 슬래시 명령에 적용됩니다."}},{path:"retry.baseDelayMs",category:"safety",group:"Retry",label:{en:"Base Delay Ms",ko:"기본 지연 시간(ms)"},description:{en:"Sets the base retry delay in milliseconds.",ko:"재시도의 기본 지연 시간을 밀리초 단위로 설정합니다."},kind:"number",scope:"both",defaultValue:500,integer:!0},{path:"retry.enabled",category:"safety",group:"Retry",label:{en:"Enabled",ko:"활성화"},description:{en:"Enables retry handling.",ko:"재시도 처리를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"retry.fallbackChains",category:"safety",group:"Retry & Fallback",label:{en:"Retry Fallback Chains",ko:"재시도 대체 체인"},description:{en:'JSON object mapping model roles, model selectors ("provider/model-id"), or provider wildcards ("provider/*") to ordered fallback selectors, e.g. {"default":["openai/gpt-4o-mini"],"google-antigravity/*":["google/*","google-vertex/*"]}. Model-oriented keys apply whenever that model/provider is active, regardless of role; a "provider/*" entry keeps the failing model\'s id and swaps the provider. An id-prefixed wildcard ("openrouter/google/*") re-prefixes the failing model\'s bare id (google-antigravity/gemini-x -> openrouter/google/gemini-x) and, used as a key, matches only that provider\'s ids under the prefix.',ko:'모델 역할, 모델 선택자("provider/model-id") 또는 제공자 와일드카드("provider/*")를 순서가 지정된 대체 선택자에 매핑하는 JSON 객체입니다. 예: {"default":["openai/gpt-4o-mini"],"google-antigravity/*":["google/*","google-vertex/*"]}. 모델 중심 키는 역할과 관계없이 해당 모델/제공자가 활성 상태일 때 적용됩니다. "provider/*" 항목은 실패한 모델의 id를 유지하면서 제공자만 바꿉니다. id 접두사 와일드카드("openrouter/google/*")는 실패한 모델의 접두사 없는 id에 새 접두사를 붙이며(google-antigravity/gemini-x -> openrouter/google/gemini-x), 키로 사용하면 해당 제공자에서 접두사 아래의 id만 일치시킵니다.'},kind:"object",scope:"both",defaultValue:{},recordValues:"string-array"},{path:"retry.fallbackRevertPolicy",category:"safety",group:"Retry & Fallback",label:{en:"Fallback Revert Policy",ko:"대체 모델 복귀 정책"},description:{en:"When to return to the primary model after a fallback",ko:"대체 모델 사용 후 기본 모델로 돌아갈 시점을 설정합니다."},kind:"enum",scope:"both",defaultValue:"cooldown-expiry",choices:["cooldown-expiry","never"]},{path:"retry.maxDelayMs",category:"safety",group:"Retry & Fallback",label:{en:"Max Retry Delay",ko:"최대 재시도 지연 시간"},description:{en:"Maximum wait between retries, in ms. When the provider asks us to wait longer than this and no credential or model fallback succeeds, the request fails fast instead of sleeping (e.g. 3-hour Anthropic rate-limit windows). 0 disables the ceiling — to let the session auto-resume through provider-stated quota resets.",ko:"재시도 사이의 최대 대기 시간(ms)입니다. 제공자가 이보다 긴 대기를 요청하고 자격 증명이나 모델 대체가 성공하지 않으면, 대기하지 않고 요청이 즉시 실패합니다(예: Anthropic의 3-hour 사용량 제한 구간). 0은 상한을 비활성화하여 제공자가 명시한 할당량 초기화 후 세션이 자동으로 재개되도록 합니다."},kind:"number",scope:"both",defaultValue:3e5,integer:!0},{path:"retry.maxRetries",category:"safety",group:"Retry & Fallback",label:{en:"Retry Attempts",ko:"재시도 횟수"},description:{en:"Maximum retry attempts on API errors",ko:"API 오류 발생 시 최대 재시도 횟수입니다."},kind:"number",scope:"both",defaultValue:10,integer:!0},{path:"retry.modelFallback",category:"safety",group:"Retry & Fallback",label:{en:"Retry Model Fallback",ko:"재시도 시 모델 대체"},description:{en:"Allow retry recovery to switch to configured fallback models",ko:"재시도 복구 중 설정된 대체 모델로 전환할 수 있도록 합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"providers.anthropic.serverSideFallback",category:"safety",group:"Retry & Fallback",label:{en:"Anthropic Server-Side Fallback (Fable 5)",ko:"Anthropic 서버 측 대체(Fable 5)"},description:{en:"When a Claude Fable 5 / Mythos 5 request is blocked by Anthropic's safety classifier, retry it on Claude Opus 5 server-side (Anthropic `server-side-fallback-2026-06-01` beta). Opt-in — leaving this off preserves the pre-fallback behavior for every request.",ko:"Claude Fable 5 / Mythos 5 요청이 Anthropic 안전 분류기에 의해 차단되면 서버 측에서 Claude Opus 5로 다시 시도합니다(Anthropic `server-side-fallback-2026-06-01` 베타). 선택 사항이며 끄면 모든 요청에서 기존 동작을 유지합니다."},kind:"boolean",scope:"both",defaultValue:!1,appliesTo:{en:"Applies to Anthropic models that declare server-side fallback models.",ko:"서버 측 대체 모델을 선언한 Anthropic 모델에 적용됩니다."}},{path:"retry.usageAwareFallback",category:"safety",group:"Retry & Fallback",label:{en:"Usage-Aware Fallback",ko:"사용량 기반 대체"},description:{en:"Use reliable coding-plan quota reports to prefer same-provider accounts, then configured fallback models, before a hard usage limit. Ordinary configured API keys are excluded.",ko:"신뢰할 수 있는 코딩 플랜 할당량 보고서를 사용하여 엄격한 사용량 한도에 도달하기 전에 동일 제공자의 계정을 우선한 다음 설정된 대체 모델을 사용합니다. 일반적으로 설정된 API 키는 제외됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"retry.usageReservePct",category:"safety",group:"Retry & Fallback",label:{en:"Reserve Margin",ko:"예비 여유율"},description:{en:"Treat a coding-plan model as near its limit below this remaining percentage. Unknown or unmapped usage keeps the primary model.",ko:"코딩 플랜 모델의 남은 비율이 이 값 미만이면 한도에 가까운 것으로 간주합니다. 사용량을 알 수 없거나 매핑되지 않은 경우 기본 모델을 유지합니다."},kind:"number",scope:"both",defaultValue:10},{path:"retry.usageReservePolicy",category:"safety",group:"Retry & Fallback",label:{en:"Reserve Policy",ko:"예비 여유 정책"},description:{en:"What to do when every same-provider coding-plan account is inside the reserve margin.",ko:"동일 제공자의 모든 코딩 플랜 계정이 예비 여유 범위에 있을 때 수행할 작업입니다."},kind:"enum",scope:"both",defaultValue:"confirm",choices:["confirm","auto","fail-closed"]},{path:"retry.waitForUsageReset",category:"safety",group:"Retry & Fallback",label:{en:"Wait For Usage Reset",ko:"사용량 초기화 대기"},description:{en:"When a provider reports usage-limit exhaustion with a reset time (5-hour or weekly quota windows on any provider), sleep until the reset instead of failing fast past retry.maxDelayMs. Waits are abortable (Esc) but also hold subagents, so leave off for unattended runs.",ko:"제공자가 초기화 시간과 함께 사용량 한도 소진을 보고하면(모든 제공자의 5-hour 또는 주간 할당량 구간), retry.maxDelayMs를 초과하여 즉시 실패하는 대신 초기화될 때까지 대기합니다. 대기는 중단할 수 있지만(Esc) 하위 에이전트도 대기시키므로 무인 실행에서는 비활성화하세요."},kind:"boolean",scope:"both",defaultValue:!1},{path:"secrets.enabled",category:"safety",group:"Privacy",label:{en:"Hide Secrets",ko:"비밀 정보 숨기기"},description:{en:"Obfuscate configured secrets and redact credential-shaped tokens before sending to AI providers",ko:"설정된 비밀 정보를 난독화하고 자격 증명 형태의 토큰을 AI 제공자에게 보내기 전에 가립니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"telemetry.otlpExportEnabled",category:"safety",group:"Privacy",label:{en:"OTLP Telemetry Export",ko:"OTLP 원격 측정 내보내기"},description:{en:"Allow OMP to export traces, logs, and metrics using OTEL_* endpoints. Changes take effect on the next launch.",ko:"OMP가 OTEL_* 엔드포인트로 트레이스, 로그, 메트릭을 내보내도록 허용합니다. 변경 사항은 다음 실행부터 적용됩니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"auth.broker.token",category:"system",group:"Auth",label:{en:"Token",ko:"토큰"},description:{en:"Authentication token configured for the broker.",ko:"브로커에 구성된 인증 토큰입니다."},kind:"string",scope:"global",secret:!0,admin:!0,confirmation:!0,appliesTo:{en:"Applies when auth.broker.url points to a broker that requires a token.",ko:"auth.broker.url이 토큰이 필요한 브로커를 가리킬 때 적용됩니다."}},{path:"auth.broker.url",category:"system",group:"Auth",label:{en:"URL",ko:"URL"},description:{en:"URL of the authentication broker.",ko:"인증 브로커의 URL입니다."},kind:"string",scope:"global",admin:!0,confirmation:!0},{path:"commands.enableClaudeProject",category:"system",group:"Commands & Skills",label:{en:"Claude Project Commands",ko:"Claude 프로젝트 명령"},description:{en:"Load commands from .claude/commands/",ko:".claude/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"commands.enableClaudeUser",category:"system",group:"Commands & Skills",label:{en:"Claude User Commands",ko:"Claude 사용자 명령"},description:{en:"Load commands from ~/.claude/commands/",ko:"~/.claude/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"commands.enableOpencodeProject",category:"system",group:"Commands & Skills",label:{en:"OpenCode Project Commands",ko:"OpenCode 프로젝트 명령"},description:{en:"Load commands from .opencode/commands/",ko:".opencode/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"commands.enableOpencodeUser",category:"system",group:"Commands & Skills",label:{en:"OpenCode User Commands",ko:"OpenCode 사용자 명령"},description:{en:"Load commands from ~/.config/opencode/commands/",ko:"~/.config/opencode/commands/에서 명령을 로드합니다."},kind:"boolean",scope:"both",defaultValue:!1,admin:!0,confirmation:!0},{path:"features.unexpectedStopDetection",category:"system",group:"Agent",label:{en:"Unexpected Stops",ko:"예기치 않은 중단"},description:{en:"Automatically recover when the assistant stops without a visible message. Smart also classifies text-only stops with a small model.",ko:"어시스턴트가 표시되는 메시지 없이 중단되면 자동으로 복구합니다. Smart는 소형 모델로 텍스트만 있는 중단도 분류합니다."},kind:"enum",scope:"both",defaultValue:"mechanical",choices:["none","mechanical","smart"]},{path:"gc.coldArchiveAfterDays",category:"system",group:"Gc",label:{en:"Cold Archive After Days",ko:"콜드 아카이브 전환 일수"},description:{en:"Number of days after which items are cold-archived.",ko:"항목을 콜드 아카이브하기까지의 일수입니다."},kind:"number",scope:"both",defaultValue:30,integer:!0},{path:"gc.retainNewestGlobal",category:"system",group:"Gc",label:{en:"Retain Newest Global",ko:"전체 최신 항목 보존"},description:{en:"Number of newest items to retain globally.",ko:"전역적으로 유지할 최신 항목 수입니다."},kind:"number",scope:"both",defaultValue:20,integer:!0},{path:"gc.retainNewestPerCwd",category:"system",group:"Gc",label:{en:"Retain Newest Per Cwd",ko:"Cwd별 최신 항목 보존"},description:{en:"Number of newest items to retain per current working directory.",ko:"현재 작업 디렉터리별로 유지할 최신 항목 수입니다."},kind:"number",scope:"both",defaultValue:10,integer:!0},{path:"launch.enabled",category:"system",group:"Available Tools",label:{en:"Launch",ko:"Launch"},description:{en:"Enable the launch tool for supervising shared long-running project processes",ko:"공유 장기 실행 프로젝트 프로세스를 감독하는 launch 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"vault.enabled",category:"system",group:"Available Tools",label:{en:"Obsidian Vault",ko:"Obsidian Vault"},description:{en:"Enable the vault:// internal URL for reading and editing Obsidian vault content via the Obsidian CLI. When disabled, vault:// resolution is refused and the vault:// entry is omitted from the system prompt.",ko:"Obsidian CLI를 통해 Obsidian vault 콘텐츠를 읽고 편집할 수 있도록 vault:// 내부 URL을 활성화합니다. 비활성화하면 vault:// 해석이 거부되고 시스템 프롬프트에서 vault:// 항목이 제외됩니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"web_search.enabled",category:"system",group:"Available Tools",label:{en:"Web Search",ko:"웹 검색"},description:{en:"Enable the web_search tool for live web results",ko:"실시간 웹 결과를 위한 web_search 도구를 활성화합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"mcp.enableProjectConfig",category:"system",group:"Discovery & MCP",label:{en:"MCP Project Config",ko:"MCP 프로젝트 설정"},description:{en:"Load .mcp.json/mcp.json from project root",ko:"프로젝트 루트에서 .mcp.json/mcp.json을 불러옵니다."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"mcp.startupTimeoutMs",category:"system",group:"Discovery & MCP",label:{en:"MCP Startup Window",ko:"MCP 시작 대기 시간"},description:{en:"Wait this many milliseconds for initial MCP tool discovery; 0 waits until connections settle",ko:"초기 MCP 도구 검색을 기다릴 시간(ms)입니다. 0이면 연결이 안정될 때까지 기다립니다."},kind:"number",scope:"both",defaultValue:250,integer:!0},{path:"mcp.notificationDebounceMs",category:"system",group:"Discovery & MCP",label:{en:"MCP Notification Debounce",ko:"MCP 알림 디바운스"},description:{en:"Debounce window in milliseconds for MCP resource updates before injecting them into the conversation",ko:"MCP 리소스 업데이트를 대화에 삽입하기 전 적용할 디바운스 시간(ms)입니다."},kind:"number",scope:"both",defaultValue:500,integer:!0},{path:"mcp.notifications",category:"system",group:"Discovery & MCP",label:{en:"MCP Update Injection",ko:"MCP 업데이트 삽입"},description:{en:"Inject MCP resource updates into the agent conversation",ko:"MCP 리소스 업데이트를 에이전트 대화에 삽입합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"marketplace.autoUpdate",category:"system",group:"Startup & Updates",label:{en:"Marketplace Auto-Update",ko:"마켓플레이스 자동 업데이트"},description:{en:"Check for plugin updates on startup",ko:"시작할 때 플러그인 업데이트를 확인합니다."},kind:"enum",scope:"both",defaultValue:"notify",choices:["off","notify","auto"],admin:!0,confirmation:!0,appliesTo:{en:"auto installs plugin updates without prompting.",ko:"auto는 확인 없이 플러그인 업데이트를 설치합니다."}},{path:"update.channel",category:"system",group:"Startup & Updates",label:{en:"Update Channel",ko:"업데이트 채널"},description:{en:"Update channel used by omp update and the startup update check",ko:"omp update와 시작 시 업데이트 확인에 사용할 업데이트 채널입니다."},kind:"enum",scope:"global",defaultValue:"stable",choices:["stable","canary"],admin:!0,confirmation:!0},{path:"share.serverUrl",category:"system",group:"Share",label:{en:"Share Server",ko:"공유 서버"},description:{en:"Share viewer/upload base used by /share (encrypted blob upload + viewer; links are <base>/<id>#<key>)",ko:"/share가 사용하는 공유 뷰어/업로드 기본 주소입니다(암호화된 blob 업로드 및 뷰어, 링크 형식은 <base>/<id>#<key>)."},kind:"string",scope:"global",defaultValue:"https://my.omp.sh/s",admin:!0,confirmation:!0},{path:"share.store",category:"system",group:"Share",label:{en:"Share Store",ko:"공유 저장소"},description:{en:"Where /share uploads the encrypted session blob",ko:"/share가 암호화된 세션 blob을 업로드할 위치입니다."},kind:"enum",scope:"both",defaultValue:"blob",choices:["blob","gist"]},{path:"share.redactSecrets",category:"system",group:"Share",label:{en:"Share Secret Redaction",ko:"공유 시 비밀 정보 가리기"},description:{en:"Run the secret obfuscator over /share snapshots before upload (uses the secrets.* config)",ko:"/share 스냅샷을 업로드하기 전에 비밀 정보 난독화를 적용합니다(secrets.* 설정 사용)."},kind:"boolean",scope:"both",defaultValue:!0,admin:!0,confirmation:!0},{path:"plan.autosave",category:"system",group:"Plan",label:{en:"Autosave",ko:"자동 저장"},description:{en:"Automatically save approved plans to disk when plan mode completes",ko:"계획 모드가 완료되면 승인된 계획을 디스크에 자동 저장합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"plan.autosaveDir",category:"system",group:"Plan",label:{en:"Autosave Dir",ko:"자동 저장 디렉터리"},description:{en:"Directory for autosaved plans. Supports ~, absolute, and cwd-relative paths. Empty uses <project>/.omp/plans/.",ko:"자동 저장된 계획의 디렉터리입니다. ~, 절대 경로 및 cwd 기준 상대 경로를 지원합니다. 비워 두면 <project>/.omp/plans/를 사용합니다."},kind:"string",scope:"both",admin:!0},{path:"plan.defaultOnStartup",category:"system",group:"Modes",label:{en:"Start in Plan Mode",ko:"계획 모드로 시작"},description:{en:"Automatically enter plan mode at the start of every new session",ko:"새 세션을 시작할 때마다 자동으로 계획 모드에 진입합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"plan.enabled",category:"system",group:"Modes",label:{en:"Plan Mode",ko:"계획 모드"},description:{en:"Enable plan mode for read-only exploration and planning before execution",ko:"실행 전에 읽기 전용 탐색과 계획을 위한 계획 모드를 사용합니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"power.sleepPrevention",category:"system",group:"Power",label:{en:"Sleep Prevention",ko:"절전 방지"},description:{en:"Prevent the system sleeping during active sessions. Each level is cumulative — it adds the flags of all lower levels.",ko:"활성 세션 중 시스템이 절전 모드로 전환되지 않도록 합니다. 각 단계는 누적되며 모든 하위 단계의 플래그가 추가됩니다."},kind:"enum",scope:"both",defaultValue:"idle",choices:["off","idle","display","system"],admin:!0,confirmation:!0},{path:"readLineNumbers",category:"system",group:"Reading",label:{en:"Line Numbers",ko:"줄 번호"},description:{en:"Prepend line numbers to read tool output by default",ko:"기본적으로 read 도구 출력 앞에 줄 번호를 추가합니다."},kind:"boolean",scope:"both",defaultValue:!1},{path:"shellPath",category:"system",group:"Shell Path",label:{en:"Shell Path",ko:"셸 경로"},description:{en:"Sets the shell executable path.",ko:"셸 실행 파일 경로를 설정합니다."},kind:"string",scope:"both",admin:!0,confirmation:!0},{path:"skillful",category:"system",group:"Prompt",label:{en:"List Skills in Prompt",ko:"프롬프트에 스킬 목록 표시"},description:{en:"List available skills in the system prompt; disable to save context and toggle per-session with /skillful",ko:"시스템 프롬프트에 사용 가능한 스킬을 나열합니다. 컨텍스트를 절약하려면 비활성화하고 세션별로 /skillful을 사용해 전환할 수 있습니다."},kind:"boolean",scope:"both",defaultValue:!0},{path:"workspace.additionalDirectories",category:"system",group:"General",label:{en:"Additional Workspace Dirs",ko:"추가 워크스페이스 디렉터리"},description:{en:"Extra workspace directories added to every session as additional roots (multi-root workspace). Managed live via /add-dir and /remove-dir. Paths resolve relative to cwd; absolute paths recommended. The agent is told these roots exist and can read/grep/glob them.",ko:"모든 세션에 추가 루트로 포함할 워크스페이스 디렉터리입니다(다중 루트 워크스페이스). /add-dir 및 /remove-dir로 실시간 관리합니다. 경로는 cwd를 기준으로 해석되며 절대 경로를 권장합니다. 에이전트는 이러한 루트의 존재를 안내받고 read/grep/glob할 수 있습니다."},kind:"array",scope:"both",defaultValue:[],items:"string",admin:!0,confirmation:!0}]},88501:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Ee:()=>N,Le:()=>O,rk:()=>J,tB:()=>K});var e=c(29021),f=c(33873),g=c(63294),h=c(80547),i=c(82536),j=c(20565),k=c(88016),l=c(58112),m=c(62761),n=c(85887),o=a([m]);m=(o.then?(await o)():o)[0];class O extends Error{constructor(a,b,c=[]){super(b),this.name="NativeSettingsError",this.code=a,this.issues=c}}let P=new Set(["__proto__","prototype","constructor"]),Q=new Map(k.K.map(a=>[a.path,a])),R={"advisor.immuneTurns":[0,20],"advisor.maxNotesPerUpdate":[1,32],"ask.timeout":[0,3600],"autolearn.minToolCalls":[0,100],"claudeResets.keepCredits":[0,100],"claudeResets.minBlockedMinutes":[0,10080],"claudeResets.salvageHorizonHours":[0,720],"compaction.keepRecentTokens":[1e3,1e6],"extensionHandlers.toolCallTimeoutMs":[1,36e5],"github.cache.hardTtlSec":[0,31536e3],"github.cache.softTtlSec":[0,31536e3],"grep.contextAfter":[0,100],"grep.contextBefore":[0,100],"mcp.notificationDebounceMs":[0,6e4],"mcp.startupTimeoutMs":[0,6e5],"providers.webSearchTimeoutSeconds":[0,300],"retry.maxRetries":[0,20],"retry.usageReservePct":[0,100],"tools.artifactTailLines":[0,1e5],"tools.outputMaxColumns":[0,1048576]};function p(a){let b=a.split(".");if(!b.length||b.some(a=>!a||P.has(a)))throw new O("invalid_path","Settings path is invalid",[{path:a,message:"Invalid settings path"}]);return b}function q(a,b){let c=a,d=[];for(let a of p(b)){if(d.push(a),!(0,j.u4)(c))return{present:!1,malformedAt:d.slice(0,-1).join(".")||a};if(!Object.prototype.hasOwnProperty.call(c,a))return{present:!1};c=c[a]}return{present:!0,value:c}}function r(a,b,c){let d=p(b),e=a;for(let a of d.slice(0,-1)){let b=e[a];(0,j.u4)(b)||(e[a]={}),e=e[a]}e[d.at(-1)]=c}function s(a){if(Array.isArray(a))return a.map(s);if((0,j.u4)(a)){let b={};for(let[c,d]of Object.entries(a))P.has(c)||(b[c]=s(d));return b}return a}function t(a,b,c=0,d={entries:0}){let e;if(c>8)throw Error("is nested too deeply");if(null!==a&&"boolean"!=typeof a){if("string"==typeof a){if(a.length>16384)throw Error("must be at most 16384 characters");return}if("number"==typeof a){if(!Number.isFinite(a))throw Error("must be finite");return}if(Array.isArray(a)){if(a.length>256)throw Error("must contain at most 256 items");for(let e of a)t(e,b,c+1,d);return}if(!(0,j.u4)(a))throw Error("must contain JSON values only");for(let[e,f]of Object.entries(a)){if(d.entries+=1,d.entries>512)throw Error("must contain at most 512 entries");if(!e||e.length>256||P.has(e))throw Error("contains an invalid key");t(f,b,c+1,d)}try{e=JSON.stringify(a)}catch{throw Error("must be JSON serializable")}if(Buffer.byteLength(e,"utf8")>131072)throw Error("must be at most 131072 bytes")}}function u(a,b,c,d){let e=`${a.path}.${b}`;switch(a.recordValues){case"string":if("string"!=typeof c||!c.trim()||c.length>16384)throw Error(`${e} must be a non-empty string`);return c;case"model-role":if(null===c&&"project"===d)return null;if("string"==typeof c){if(!c.trim()||c.length>16384)throw Error(`${e} must be a non-empty model selector`);return c}if(!Array.isArray(c)||0===c.length||c.length>256||c.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${e} must be a non-empty model selector or selector array`);return[...c];case"boolean-string":if("string"!=typeof c||!c.trim()||c.length>16384)throw Error(`${e} must be an on/off selector or model pattern`);return c;case"string-array":if(!Array.isArray(c)||c.length>256||c.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${e} must be a bounded string array`);return[...c];case"string-or-string-array":if("string"==typeof c){if(!c.trim()||c.length>16384)throw Error(`${e} must be a non-empty string or string array`);return c}if(!Array.isArray(c)||c.length>256||c.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${e} must be a non-empty string or bounded string array`);return[...c];case"approval":if("string"!=typeof c||!["allow","prompt","deny"].includes(c))throw Error(`${e} must be an allowed approval policy`);return c;default:return t(c,e),s(c)}}function v(a,b,c=!1){if("string"!=typeof a||!c&&!a.trim()||a.length>16384)throw Error(`${b} must be a bounded string`);return a}function w(a,b,c){let d=a.path,e=function(a,b){let c=a.path;if("modelTags"===c){if(!(0,j.u4)(b))throw Error(`${c} must be an object`);let a={};for(let[d,e]of Object.entries(b)){if(P.has(d)||!(0,j.u4)(e))throw Error(`${c}.${d} must be a model tag object`);let b=new Set(["name","color","hidden"]);if(Object.keys(e).some(a=>!b.has(a)))throw Error(`${c}.${d} contains an unknown field`);let f={name:v(e.name,`${c}.${d}.name`)};if(void 0!==e.color&&(f.color=v(e.color,`${c}.${d}.color`)),void 0!==e.hidden){if("boolean"!=typeof e.hidden)throw Error(`${c}.${d}.hidden must be a boolean`);f.hidden=e.hidden}a[d]=f}return t(a,c),a}if("providers.maxInFlightRequests"===c){if(!(0,j.u4)(b))throw Error(`${c} must be an object`);let a={};for(let[d,e]of Object.entries(b)){if(P.has(d)||"number"!=typeof e||!Number.isFinite(e)||e<=0||e>Number.MAX_SAFE_INTEGER)throw Error(`${c}.${d} must be a positive finite number`);a[d]=Math.max(1,Math.floor(e))}return a}if("images.urls.options"===c||"images.urls.credentials"===c){if(!(0,j.u4)(b))throw Error(`${c} must be an object`);let a={};for(let[d,e]of Object.entries(b)){if(P.has(d)||!(0,j.u4)(e))throw Error(`${c}.${d} must be an object`);let b={};for(let[a,f]of Object.entries(e)){if(P.has(a))throw Error(`${c}.${d} contains an invalid key`);"images.urls.credentials"===c?b[a]=v(f,`${c}.${d}.${a}`):(t(f,`${c}.${d}.${a}`),b[a]=s(f))}a[d]=b}return t(a,c),a}if("bash.patterns"===c){if(!Array.isArray(b)||b.length>256)throw Error(`${c} must be a bounded array`);return b.map((a,b)=>{if(!(0,j.u4)(a)||Object.keys(a).some(a=>!["match","approval"].includes(a)))throw Error(`${c}.${b} must contain only match and approval`);let d=v(a.match,`${c}.${b}.match`);if("allow"!==a.approval&&"prompt"!==a.approval&&"deny"!==a.approval)throw Error(`${c}.${b}.approval is invalid`);return{match:d,approval:a.approval}})}if("bashInterceptor.patterns"===c){if(!Array.isArray(b)||b.length>256)throw Error(`${c} must be a bounded array`);return b.map((a,b)=>{if(!(0,j.u4)(a)||Object.keys(a).some(a=>!["pattern","flags","tool","message","allowSubcommands"].includes(a)))throw Error(`${c}.${b} contains an unknown field`);let d={pattern:v(a.pattern,`${c}.${b}.pattern`),tool:v(a.tool,`${c}.${b}.tool`),message:v(a.message,`${c}.${b}.message`,!0)};void 0!==a.flags&&(d.flags=v(a.flags,`${c}.${b}.flags`,!0));try{new RegExp(d.pattern,d.flags)}catch{throw Error(`${c}.${b} must contain a valid regular expression`)}if(void 0!==a.allowSubcommands){if(!Array.isArray(a.allowSubcommands)||a.allowSubcommands.length>256||a.allowSubcommands.some(a=>"string"!=typeof a||!a.trim()||a.length>16384))throw Error(`${c}.${b}.allowSubcommands must be a bounded string array`);d.allowSubcommands=[...a.allowSubcommands]}return d})}}(a,b);if(void 0!==e)return e;switch(a.kind){case"boolean":if("boolean"!=typeof b)throw Error(`${d} must be a boolean`);return b;case"number":if("number"!=typeof b||!Number.isFinite(b)||Math.abs(b)>Number.MAX_SAFE_INTEGER)throw Error(`${d} must be a bounded finite number`);if(a.integer&&!Number.isSafeInteger(b))throw Error(`${d} must be a safe integer`);let f=R[d],g=a.min??f?.[0],h=a.max??f?.[1];if(void 0!==g&&b<g)throw Error(`${d} must be at least ${g}`);if(void 0!==h&&b>h)throw Error(`${d} must be at most ${h}`);return b;case"string":if("string"!=typeof b)throw Error(`${d} must be a string`);if(b.length>16384)throw Error(`${d} must be at most 16384 characters`);return b;case"enum":if("string"!=typeof b||!a.choices?.includes(b))throw Error(`${d} must be one of the allowed values`);return b;case"array":{if(!Array.isArray(b))throw Error(`${d} must be an array`);if(b.length>256)throw Error(`${d} must contain at most 256 items`);let c=[];for(let e of b)if("string"===a.items){if("string"!=typeof e||!e.trim()||e.length>16384)throw Error(`${d} must contain non-empty strings`);if(a.choices?.length&&!a.choices.includes(e))throw Error(`${d} contains an unsupported value`);c.push(e)}else if("number"===a.items){if("number"!=typeof e||!Number.isFinite(e))throw Error(`${d} must contain finite numbers`);c.push(e)}else t(e,d),c.push(s(e));return c}case"object":{if(!(0,j.u4)(b))throw Error(`${d} must be an object`);let e=Object.entries(b);if(e.length>512)throw Error(`${d} must contain at most 512 entries`);let f={};for(let[b,g]of e){if(!b||b.length>256||P.has(b))throw Error(`${d} contains an invalid key`);f[b]=u(a,b,g,c)}return t(f,d),f}}}function x(a){let b=(0,j.u4)(a.compaction)?a.compaction:void 0,c=b?.methodOrder??a["compaction.methodOrder"];if(Array.isArray(c))return c;let d=b?.strategy??a["compaction.strategy"],e=b?.remoteEnabled??a["compaction.remoteEnabled"],f=!1!==e;switch("shake-summary"===d?"shake":d){case"context-full":return f?["remote","soft"]:["soft"];case"handoff":return f?["handoff","remote","soft"]:["handoff","soft"];case"shake":return f?["shake","remote","soft"]:["shake","soft"];case"snapcompact":return f?["snapcompact","remote","soft"]:["snapcompact","soft"];case"off":return[];default:if(!1===e)return["snapcompact","handoff","shake","soft"];return}}function y(a,b){let c=q(a,b);if(c.present){if(("task.agentAdvisor"===b||"task.agentPrewalk"===b)&&(0,j.u4)(c.value)){let d={};for(let[a,b]of Object.entries(c.value))d[a]="boolean"==typeof b?b?"on":"off":b;if("task.agentAdvisor"===b&&!Object.prototype.hasOwnProperty.call(d,"task")){let b=(0,j.u4)(a.advisor)?a.advisor:void 0,c=b&&Object.prototype.hasOwnProperty.call(b,"subagents")?b.subagents:a["advisor.subagents"];"boolean"==typeof c&&(d.task=c?"on":"off")}return{present:!0,value:d}}return c}if("compaction.methodOrder"===b){let b=x(a);return void 0===b?c:{present:!0,value:b}}if("task.agentAdvisor"===b){let b=(0,j.u4)(a.advisor)?a.advisor:void 0,c=b&&Object.prototype.hasOwnProperty.call(b,"subagents")?b.subagents:a["advisor.subagents"];if("boolean"==typeof c)return{present:!0,value:{task:c?"on":"off"}}}return c}let S=new Set(["enabledModels","disabledProviders","enabledProviders"]);function z(a,b,c="global"){let d={},e=new Set(b?.map(a=>a.path)??[]),f=!1;for(let g of k.K){if(g.secret)continue;let h=y(a,g.path);if(h.malformedAt){b&&!e.has(h.malformedAt)&&(e.add(h.malformedAt),b.push({path:h.malformedAt,message:"Stored settings section is not an object and was omitted"}));continue}if(h.present)try{if(S.has(g.path)){let a=function(a){if(!Array.isArray(a)||a.length>256)throw Error("must be a bounded array");t(a,"registry");let b=[],c=!1;for(let d of a)if("string"==typeof d&&d.trim()&&d.length<=16384)b.push(d);else if((0,j.u4)(d))c=!0;else throw Error("must contain strings or path-scoped rules");return{value:b,hasScopedEntries:c}}(h.value);f||=a.hasScopedEntries,r(d,g.path,a.value)}else if("modelRoles"===g.path&&(0,j.u4)(h.value)){let a={};for(let[d,f]of Object.entries(h.value))try{a[d]=u(g,d,f,c)}catch{let a=`${g.path}.${d}`;b&&!e.has(a)&&(e.add(a),b.push({path:a,message:"Stored model role is invalid and was omitted"}))}r(d,g.path,a)}else r(d,g.path,w(g,h.value,c))}catch{b&&!e.has(g.path)&&(e.add(g.path),b.push({path:g.path,message:"Stored value is invalid or outside editor bounds and was omitted"}))}}return f&&(d.registryHasScopedEntries=!0),d}function A(a){let b=(0,g.Tp)((0,e.existsSync)(a)?(0,e.readFileSync)(a,"utf8"):"");if(b.errors.length)throw new O("invalid_yaml","Settings file is not valid YAML",[{path:"$",message:"Invalid YAML syntax"}]);let c=b.toJS();if(null!==c&&!(0,j.u4)(c))throw new O("invalid_yaml","Settings file must contain a YAML mapping",[{path:"$",message:"Expected a mapping"}]);return{path:a,doc:b,raw:(0,j.u4)(c)?c:{}}}function B(){return{path:(0,n.pA)(),scope:"global"}}async function C(a){let b,c;if("string"!=typeof a||!a.trim()||a.length>4096||a.includes("\0"))throw new O("invalid_scope","An existing authorized cwd is required for project settings",[{path:"cwd",message:"Invalid project cwd"}]);try{if(b=(0,e.realpathSync)(a),!(0,e.statSync)(b).isDirectory())throw Error("not a directory")}catch{throw new O("invalid_scope","An existing authorized cwd is required for project settings",[{path:"cwd",message:"Project cwd does not exist"}])}let d=await (0,h.mc)();if(!(0,h.B7)(b,d))throw new O("forbidden_scope","Project settings path is not authorized",[{path:"cwd",message:"Project cwd is outside allowed roots"}]);let g=(0,f.join)(b,".omp","config.yml");try{c=(0,i.SW)(g)}catch{throw new O("forbidden_scope","Project settings path cannot be resolved safely",[{path:"cwd",message:"Project settings path is unsafe"}])}if(!(0,i.o4)(c,new Set([b])))throw new O("forbidden_scope","Project settings path escapes the authorized workspace",[{path:"cwd",message:"Project settings symlink escapes the workspace"}]);return{path:c,scope:"project",cwd:b}}async function D(a,b){let c=a??"global";if("global"===c)return B();if("project"===c)return C(b);throw new O("invalid_scope","scope must be global or project",[{path:"scope",message:"Unsupported settings scope"}])}function E(a){let b={};for(let c of k.K){if(!c.secret)continue;let d=q(a,c.path);b[c.path]=d.present&&null!==d.value&&""!==d.value}return b}function F(a,b){let c=new Set;for(let d=1;d<=b.length;d+=1){let e=a.getIn(b.slice(0,d),!0);!(0,g.Vj)(e)&&"object"==typeof e&&null!==e&&"anchor"in e&&"string"==typeof e.anchor&&c.add(e.anchor)}0!==c.size&&(0,g.YR)(a,{Alias(d,e){if(!c.has(e.source))return;let f=e.resolve(a);if(!f)throw new O("invalid_yaml","Settings alias cannot be resolved",[{path:b.join("."),message:"Unresolved YAML alias"}]);let g=a.createNode(s(f.toJS(a)));return g.comment=e.comment,g.commentBefore=e.commentBefore,g.spaceBefore=e.spaceBefore,g}})}function G(a,b,c){let d=a.getIn(b,!0);if(!(0,g.Vj)(d))return;let e=a.toJS(),f=(0,j.u4)(e)?q(e,b.join(".")):{present:!1};if(!f.present||!(0,j.u4)(f.value))throw new O("invalid_yaml","Settings alias does not resolve to a mapping",[{path:c,message:"Aliased settings sections must resolve to mappings"}]);let h=f.value;try{t(h,c)}catch{throw new O("invalid_yaml","Aliased settings section cannot be materialized safely",[{path:c,message:"Aliased section contains unsafe or unbounded data"}])}a.setIn(b,a.createNode(s(h)))}function H(a,b,c){let d=p(b);F(a,d);for(let c=1;c<d.length;c+=1){let e=d.slice(0,c);G(a,e,b);let f=a.getIn(e,!0);void 0===f||(0,g.jh)(f)||a.setIn(e,{})}a.setIn(d,c)}function I(a,b){let c=p(b);F(a,c);for(let d=1;d<c.length;d+=1){let e=c.slice(0,d);G(a,e,b);let f=a.getIn(e,!0);if(void 0===f)return;if(!(0,g.jh)(f))return void a.deleteIn(e)}a.deleteIn(c)}function J(){let a=B(),b=A(a.path);return{path:a.path,settings:z(b.raw)}}async function K(a,b){let c=await D(a,b),d=A(B().path),e=[],f=z(d.raw,e,"global");if("global"===c.scope)return{path:c.path,scope:"global",settings:f,effectiveSettings:s(f),catalog:k.K,secretStatus:E(d.raw),...e.length?{issues:e}:{}};let g=A(c.path),h=z(g.raw,e,"project");return{path:c.path,scope:"project",cwd:c.cwd,settings:h,effectiveSettings:function(a,b){let c=s(a);for(let a of k.K){if(a.secret)continue;let d=q(b,a.path);if(!d.present)continue;let e=q(c,a.path),f=d.value;"modelRoles"===a.path&&(0,j.u4)(f)&&(f=Object.fromEntries(Object.entries(f).filter(([,a])=>null!==a))),r(c,a.path,e.present?function a(b,c){if(!(0,j.u4)(b)||!(0,j.u4)(c))return s(c);let d=s(b);for(let[b,e]of Object.entries(c))d[b]=(0,j.u4)(d[b])&&(0,j.u4)(e)?a(d[b],e):s(e);return d}(e.value,f):s(f))}return b.registryHasScopedEntries&&(c.registryHasScopedEntries=!0),c}(f,h),catalog:k.K,secretStatus:E(d.raw),...e.length?{issues:e}:{}}}function L(a,b){if(!Array.isArray(a)||a.length>k.K.length||a.some(a=>"string"!=typeof a))throw new O("invalid_update",`${b} must be an array of settings paths`,[{path:b,message:"Expected a bounded string array"}]);return[...new Set(a)]}function M(a,b){if(Object.is(a,b))return!0;if(Array.isArray(a)||Array.isArray(b))return Array.isArray(a)&&Array.isArray(b)&&a.length===b.length&&a.every((a,c)=>M(a,b[c]));if(!(0,j.u4)(a)||!(0,j.u4)(b))return!1;let c=Object.keys(a).sort(),d=Object.keys(b).sort();return c.length===d.length&&c.every((c,e)=>c===d[e]&&M(a[c],b[c]))}async function N(a){var b;if(!(0,j.u4)(a))throw new O("invalid_update","Settings update must be an object",[{path:"$",message:"Expected an object"}]);let c={...b=await D(a.scope,a.cwd),path:(0,m.k6)(b.path)},d=void 0===a.settings?{}:function(a,b="global"){if(!(0,j.u4)(a))throw new O("invalid_settings","settings must be an object",[{path:"settings",message:"Expected an object"}]);try{t(a,"settings")}catch(a){throw new O("invalid_settings","Settings object is malformed",[{path:"settings",message:a instanceof Error?a.message:"Malformed settings object"}])}let c={},d=[],e=new Set;for(let f of k.K){let g=q(a,f.path);if(g.malformedAt&&!e.has(g.malformedAt)){e.add(g.malformedAt),d.push({path:g.malformedAt,message:"Expected an object"});continue}if(g.present){if(f.secret){d.push({path:f.path,message:"Secret fields must use the write-only secrets object"});continue}if("project"===b&&"both"!==f.scope){d.push({path:f.path,message:"This setting is global-only"});continue}try{r(c,f.path,w(f,g.value,b))}catch(a){d.push({path:f.path,message:a instanceof Error?a.message:"Invalid value"})}}}if(d.length)throw new O("invalid_settings","One or more settings are invalid",d);return c}(a.settings,c.scope),h=void 0===a.reset?[]:L(a.reset,"reset"),i=new Set(void 0===a.confirm?[]:L(a.confirm,"confirm")),n=[];for(let a of h){let b=Q.get(a);!b||b.secret?n.push({path:a,message:"Unknown or secret reset path"}):"project"===c.scope&&"both"!==b.scope&&n.push({path:a,message:"This setting is global-only"})}let o=a.secrets;void 0===o||(0,j.u4)(o)||n.push({path:"secrets",message:"Expected an object keyed by secret path"});let p={};if((0,j.u4)(o))for(let[a,b]of(Object.keys(o).length>256&&n.push({path:"secrets",message:"Must contain at most 256 entries"}),Object.entries(o))){let d=Q.get(a);if(!d?.secret){n.push({path:a,message:"Unknown secret path"});continue}if("project"===c.scope&&"both"!==d.scope){n.push({path:a,message:"This secret is global-only"});continue}if(null===b){p[a]=null;continue}if("string"!=typeof b||!b.length||b.length>131072){n.push({path:a,message:"Secret replacement must be a non-empty bounded string or null"});continue}try{let e="object"===d.kind?JSON.parse(b):b;p[a]=w(d,e,c.scope)}catch{n.push({path:a,message:"Secret replacement has an invalid format"})}}if(n.length)throw new O("invalid_update","Settings update is invalid",n);let s=new Set(h);for(let a of k.K)q(d,a.path).present&&s.add(a.path);for(let a of Object.keys(p))s.add(a);(0,e.mkdirSync)((0,f.dirname)(c.path),{recursive:!0});let u=await (0,m.th)(c.path,async()=>{let a=A(c.path);var b=a.raw;let m=[];for(let a of s){if(!S.has(a))continue;let c=q(b,a);c.present&&Array.isArray(c.value)&&c.value.some(j.u4)&&m.push({path:a,message:"Path-scoped registry rules are read-only in this editor"})}if(m.length)throw new O("scoped_registry_read_only","Path-scoped registry rules cannot be replaced by this editor",m);for(let b of s){let c=Q.get(b);if(!c?.confirmation)continue;let e=y(a.raw,b),f=q(d,b),g=h.includes(b)?void 0:c.secret?p[b]:f.value;(e.present?M(e.value,g):void 0===e.malformedAt&&null==g)||i.has(b)||n.push({path:b,message:"Explicit confirmation is required"})}if(n.length)throw new O("confirmation_required","Explicit confirmation is required for risky settings",n);return!function(a,b,c,d,h=A(a.path)){let{doc:i,raw:m}=h;if(null===i.contents)i.contents=i.createNode({});else if(!(0,g.jh)(i.contents))throw new O("invalid_yaml","Settings file must contain a YAML mapping",[{path:"$",message:"Expected a mapping"}]);for(let a of(!function(a,b){if(!q(b,"compaction.methodOrder").present){let c=x(b);void 0!==c&&H(a,"compaction.methodOrder",c)}let c=q(b,"task.agentAdvisor"),d=y(b,"task.agentAdvisor");d.present&&!M(c.value,d.value)&&H(a,"task.agentAdvisor",d.value);let e=q(b,"task.agentPrewalk");if(e.present&&(0,j.u4)(e.value)){let b={},c=!1;for(let[a,d]of Object.entries(e.value))b[a]="boolean"==typeof d?d?"on":"off":d,c||="boolean"==typeof d;c&&H(a,"task.agentPrewalk",b)}let f=(0,j.u4)(b.compaction)?b.compaction:void 0;f&&Object.prototype.hasOwnProperty.call(f,"strategy")&&I(a,"compaction.strategy"),f&&Object.prototype.hasOwnProperty.call(f,"remoteEnabled")&&I(a,"compaction.remoteEnabled"),a.delete("compaction.strategy"),a.delete("compaction.remoteEnabled"),a.delete("compaction.methodOrder");let g=(0,j.u4)(b.advisor)?b.advisor:void 0;g&&Object.prototype.hasOwnProperty.call(g,"subagents")&&I(a,"advisor.subagents"),a.delete("advisor.subagents")}(i,m),k.K)){let c=q(b,a.path);c.present&&H(i,a.path,c.value)}for(let a of c)I(i,a);for(let[a,b]of Object.entries(d))null===b?I(i,a):H(i,a,b);(0,e.mkdirSync)((0,f.dirname)(a.path),{recursive:!0}),(0,l.D)(a.path,i.toString())}(c,d,h,p,a),K(c.scope,c.cwd)}),v=["enabledModels","enabledProviders","disabledProviders","modelProviderOrder"].some(a=>s.has(a));return{snapshot:u,registryInvalidated:v}}d()}catch(a){d(a)}})}};
|