alchemylab-opencode 1.0.22 → 1.0.23
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/dist/{chunk-WF7L36SZ.js → chunk-22MFGOA6.js} +1 -1
- package/dist/{chunk-X7PHY2B3.js → chunk-GCMAFSDE.js} +1 -1
- package/dist/{chunk-5FGJUXLI.js → chunk-MN5GIJ5E.js} +88 -88
- package/dist/{chunk-735MVPNG.js → chunk-SILEE7UA.js} +1 -1
- package/dist/{chunk-TECR6KUK.js → chunk-VREN4JVV.js} +1 -1
- package/dist/{mcp-JSKIR2KQ.js → mcp-3MLN7453.js} +1 -1
- package/dist/{registry-REVWYAGR.js → registry-HM2N65IE.js} +1 -1
- package/dist/{run-CPHBVDZ4.js → run-VQUBMRCD.js} +1 -1
- package/dist/run.js +1 -1
- package/dist/serve.js +1 -1
- package/dist/{server-VHCQ5HOC.js → server-TLPVN3ZL.js} +1 -1
- package/dist/{session-5BXSPMPJ.js → session-FWLEEJPX.js} +1 -1
- package/dist/{share-next-GSWCSZSC.js → share-next-PRCWHS3Z.js} +1 -1
- package/dist/{worktree-HPW4CL36.js → worktree-5G5VWN6L.js} +1 -1
- package/package.json +1 -1
|
@@ -23,7 +23,7 @@ ${l}
|
|
|
23
23
|
--- Errors ---
|
|
24
24
|
${b}
|
|
25
25
|
--- End ---`})}return C}K.parseText=F,t(F,"parseText")})(bn||={});import{Duration as Ri,Effect as ie,Layer as lr,Option as dr,ServiceMap as Ni}from"effect";import It from"path";import{fileURLToPath as ir,pathToFileURL as wn}from"url";import gi from"npm-package-arg";import Dr from"semver";var yi=["opencode-openai-codex-auth","opencode-copilot-auth"];function ul(e){return yi.some(r=>e.includes(r))}t(ul,"isDeprecatedPlugin");function po(e){try{return gi(e)}catch{}}t(po,"parse");function fo(e){let r=po(e);if(r?.type==="alias"&&!r.name){let s=r.subSpec;if(s?.name){let w=!s.rawSpec||s.rawSpec==="*"?"latest":s.rawSpec;return{pkg:s.name,version:w}}}return r?.name?r.raw===r.name?{pkg:r.name,version:"latest"}:{pkg:r.name,version:r.rawSpec}:{pkg:e,version:""}}t(fo,"parsePluginSpecifier");var hi=["index.ts","index.tsx","index.js","index.mjs","index.cjs"];function mo(e){return sr(e)?"file":"npm"}t(mo,"pluginSource");function bi(e,r){return e.startsWith("file://")?ir(e):It.isAbsolute(e)?e:It.resolve(r,e)}t(bi,"resolveExportPath");function wi(e){return It.isAbsolute(e)||/^[A-Za-z]:[\\/]/.test(e)}t(wi,"isAbsolutePath");function xi(e){if(typeof e=="string")return e;if(jt(e))for(let r of["import","default"]){let s=e[r];if(typeof s=="string")return s}}t(xi,"extractExportValue");function vi(e){let r=e.json.main;if(typeof r!="string")return;let s=r.trim();if(s)return s}t(vi,"packageMain");function Ei(e,r,s,w){let p=bi(r,w.dir),B=L.resolve(w.dir),ce=L.resolve(p);if(!L.contains(B,ce))throw new Error(`Plugin ${e} resolved ${s} entry outside plugin directory`);return ce}t(Ei,"resolvePackageFile");function uo(e,r,s,w){return wn(Ei(e,r,s,w)).href}t(uo,"resolvePackagePath");function Si(e,r,s){let w=s.json.exports;if(jt(w)){let B=xi(w[`./${r}`]);if(B)return uo(e,B,r,s)}if(r!=="server")return;let p=vi(s);if(p)return uo(e,p,r,s)}t(Si,"resolvePackageEntrypoint");function ki(e){if(e.startsWith("file://"))return ir(e);if(It.isAbsolute(e))return e}t(ki,"targetPath");async function jr(e){for(let r of hi){let s=It.join(e,r);if(await L.exists(s))return s}}t(jr,"resolveDirectoryIndex");async function Pi(e){let r=ki(e);if(!(!r||!(await L.statAsync(r))?.isDirectory()))return r}t(Pi,"resolveTargetDirectory");async function _i(e,r,s,w){let p=mo(e),B=w??(p==="npm"?await xn(r):await xn(r).catch(()=>{}));if(!B)return r;let ce=Si(e,s,B);if(ce)return ce;let W=await Pi(r);if(s==="tui"){if(p==="file"&&W){let I=await jr(W);if(I)return wn(I).href}return p==="npm"||W?void 0:r}if(W&&jt(B.json.exports)){if(p==="file"){let I=await jr(W);if(I)return wn(I).href}return}return r}t(_i,"resolvePluginEntrypoint");function sr(e){return e.startsWith("file://")||e.startsWith(".")||wi(e)}t(sr,"isPathPluginSpec");async function Ir(e){let r=e.startsWith("file://")?ir(e):e,s=It.isAbsolute(r)||/^[A-Za-z]:[\\/]/.test(r)?r:It.resolve(r);if(!(await L.statAsync(s))?.isDirectory())return e.startsWith("file://")?e:wn(s).href;if(await L.exists(It.join(s,"package.json")))return wn(s).href;let p=await jr(s);if(p)return wn(p).href;throw new Error(`Plugin directory ${s} is missing package.json or index file`)}t(Ir,"resolvePathPluginTarget");async function pl(e,r,s){if(!Dr.valid(r)||Dr.major(r)===0)return;let w=s??await xn(e).catch(()=>{});if(!w)return;let p=w.json.engines;if(!jt(p))return;let B=p.opencode;if(typeof B=="string"&&!Dr.satisfies(r,B))throw new Error(`Plugin requires opencode ${B} but running ${r}`)}t(pl,"checkPluginCompatibility");async function fl(e){if(sr(e))return Ir(e);let r=po(e),s=r?.name&&r.raw===r.name?`${r.name}@latest`:e;return(await st.add(s)).directory}t(fl,"resolvePluginTarget");async function xn(e){let r=e.startsWith("file://")?ir(e):e,w=(await L.statAsync(r))?.isDirectory()?r:It.dirname(r),p=It.join(w,"package.json"),B=await L.readJson(p);return{dir:w,pkg:p,json:B}}t(xn,"readPluginPackage");async function ml(e,r,s){let w=mo(e),p=w==="npm"?await xn(r):await xn(r).catch(()=>{}),B=await _i(e,r,s,p);return{spec:e,source:w,target:r,pkg:p,entry:B}}t(ml,"createPluginEntry");function gl(e,r){if(e===void 0)return;if(typeof e!="string")throw new TypeError(`Plugin ${r} has invalid id type ${typeof e}`);let s=e.trim();if(!s)throw new TypeError(`Plugin ${r} has an empty id`);return s}t(gl,"readPluginId");function yl(e,r,s,w="strict"){let p=e.default;if(!jt(p)){if(w==="detect")return;throw new TypeError(`Plugin ${r} must default export an object with ${s}()`)}if(w==="detect"&&!("id"in p)&&!("server"in p)&&!("tui"in p))return;let B="server"in p?p.server:void 0,ce="tui"in p?p.tui:void 0;if(B!==void 0&&typeof B!="function")throw new TypeError(`Plugin ${r} has invalid server export`);if(ce!==void 0&&typeof ce!="function")throw new TypeError(`Plugin ${r} has invalid tui export`);if(B!==void 0&&ce!==void 0)throw new TypeError(`Plugin ${r} must default export either server() or tui(), not both`);if(s==="server"&&B===void 0)throw new TypeError(`Plugin ${r} must default export an object with server()`);if(s==="tui"&&ce===void 0)throw new TypeError(`Plugin ${r} must default export an object with tui()`);return p}t(yl,"readV1Plugin");async function hl(e,r,s,w,p){if(e==="file"){if(w)return w;throw new TypeError(`Path plugin ${r} must export id`)}if(w)return w;let B=p??await xn(s);if(typeof B.json.name!="string"||!B.json.name.trim())throw new TypeError(`Plugin package ${B.pkg} is missing name`);return B.json.name.trim()}t(hl,"resolvePluginId");var ur;(k=>{let e=n.string().meta({$ref:"https://models.dev/model-schema.json#/$defs/Model"}),r=n.record(n.string(),n.unknown());k.PluginSpec=n.union([n.string(),n.tuple([n.string(),r])]);let w=Xe.create({service:"config"});function p(){switch(process.platform){case"darwin":return"/Library/Application Support/opencode";case"win32":return ze.join(process.env.ProgramData||"C:\\ProgramData","opencode");default:return"/etc/opencode"}}t(p,"systemManagedConfigDir");function B(){return process.env.OPENCODE_TEST_MANAGED_CONFIG_DIR||p()}k.managedConfigDir=B,t(B,"managedConfigDir");let ce=B(),W="ai.opencode.managed",I=new Set(["PayloadDisplayName","PayloadIdentifier","PayloadType","PayloadUUID","PayloadVersion","_manualProfile"]);function F(h,N){let A=JSON.parse(h);for(let q of Object.keys(A))I.has(q)&&delete A[q];return _(JSON.stringify(A),N)}k.parseManagedPlist=F,t(F,"parseManagedPlist");async function K(){if(process.platform!=="darwin")return{};let h=W,N=go.userInfo().username,A=[ze.join("/Library/Managed Preferences",N,`${h}.plist`),ze.join("/Library/Managed Preferences",`${h}.plist`)];for(let q of A){if(!cr(q))continue;w.info("reading macOS managed preferences",{path:q});let de=await Ve.run(["plutil","-convert","json","-o","-",q],{nothrow:!0});if(de.code!==0){w.warn("failed to convert managed preferences plist",{path:q});continue}return F(de.stdout.toString(),`mobileconfig:${q}`)}return{}}t(K,"readManagedPreferences");function l(h,N){let A=gt(h,N);return h.instructions&&N.instructions&&(A.instructions=Array.from(new Set([...h.instructions,...N.instructions]))),A}t(l,"mergeConfigConcatArrays");async function v(h,N){var Oe=[];try{if(!await u(h))return;let A=Kt(Oe,await Ft.acquire(`config-install:${L.resolve(h)}`,{signal:N?.signal,onWait:t(f=>N?.waitTick?.({dir:h,attempt:f.attempt,delay:f.delay,waited:f.waited}),"onWait")}),!0);N?.signal?.throwIfAborted();let q=ze.join(h,"package.json");let de=Lt.isLocal()?"*":Lt.VERSION;let ne=await L.readJson(q).catch(()=>({dependencies:{}}));ne.dependencies={...ne.dependencies,"@opencode-ai/plugin":de};await L.writeJson(q,ne);let ve=ze.join(h,".gitignore");let Be=await L.exists(ve);Be||await L.write(ve,["node_modules","package.json","package-lock.json","bun.lock",".gitignore"].join(`
|
|
26
|
-
`));await st.install(h)}catch(Ke){var vt=Ke,ct=!0}finally{var a=Vt(Oe,vt,ct);a&&await a}}k.installDependencies=v,t(v,"installDependencies");async function u(h){try{return await Rr.access(h,Ii.W_OK),!0}catch{return!1}}t(u,"isWritable");function i(h,N){let A=h.replaceAll("\\","/");for(let q of N){let de=A.indexOf(q);if(de!==-1)return A.slice(de+q.length)}}t(i,"rel");function c(h){let N=ze.extname(h);return N.length?h.slice(0,-N.length):h}t(c,"trim");async function C(h){let N={};for(let A of await Sn.scan("{command,commands}/**/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async Ke=>{let vt=zt.FrontmatterError.isInstance(Ke)?Ke.data.message:`Failed to parse command ${A}`,{Session:ct}=await import("./session-5BXSPMPJ.js");Wt.publish(ct.Event.Error,{error:new ft.Unknown({message:vt}).toObject()}),w.error("failed to load command",{command:A,err:Ke})});if(!q)continue;let ne=i(A,["/.opencode/command/","/.opencode/commands/","/command/","/commands/"])??ze.basename(A),Be={name:c(ne),...q.data,template:q.content.trim()},Oe=k.Command.safeParse(Be);if(Oe.success){N[Be.name]=Oe.data;continue}throw new k.InvalidError({path:A,issues:Oe.error.issues},{cause:Oe.error})}return N}t(C,"loadCommand");async function E(h){let N={};for(let A of await Sn.scan("{agent,agents}/**/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async Ke=>{let vt=zt.FrontmatterError.isInstance(Ke)?Ke.data.message:`Failed to parse agent ${A}`,{Session:ct}=await import("./session-5BXSPMPJ.js");Wt.publish(ct.Event.Error,{error:new ft.Unknown({message:vt}).toObject()}),w.error("failed to load agent",{agent:A,err:Ke})});if(!q)continue;let ne=i(A,["/.opencode/agent/","/.opencode/agents/","/agent/","/agents/"])??ze.basename(A),Be={name:c(ne),...q.data,prompt:q.content.trim()},Oe=k.Agent.safeParse(Be);if(Oe.success){N[Be.name]=Oe.data;continue}throw new k.InvalidError({path:A,issues:Oe.error.issues},{cause:Oe.error})}return N}t(E,"loadAgent");async function b(h){let N={};if(process.env.OPENCODE_CLIENT!=="alchemy")return N;let A=ze.join(h,".alchemy_lab","action-server.json"),q;for(let ne=0;ne<20&&!q;ne++)try{let ve=JSON.parse(await L.readText(A));ve?.port&&(q=ve.port)}catch{await new Promise(ve=>setTimeout(ve,500))}if(!q)return w.warn("alchemy agents: no action-server.json; agents unavailable until config reload"),N;let de=[];try{let ne=await fetch(`http://127.0.0.1:${q}/api/agents/markdown`,{signal:AbortSignal.timeout(8e3)});if(!ne.ok)throw new Error(`HTTP ${ne.status}`);de=(await ne.json()).data??[]}catch(ne){return w.warn("alchemy agents: fetch failed",{port:q,err:ne}),N}for(let ne of de){let ve;try{ve=zt.parseText(ne.markdown,`alchemy agent ${ne.name}`)}catch(Ke){w.error("failed to parse alchemy agent",{agent:ne.name,err:Ke});continue}let Be={name:ne.name,...ve.data,prompt:ve.content.trim()},Oe=k.Agent.safeParse(Be);Oe.success?N[ne.name]=Oe.data:w.error("invalid alchemy agent",{agent:ne.name,issues:Oe.error.issues})}return w.info("alchemy agents loaded in memory",{count:Object.keys(N).length,port:q}),N}t(b,"loadAlchemyAgents");async function x(h){let N={};for(let A of await Sn.scan("{mode,modes}/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async ve=>{let Be=zt.FrontmatterError.isInstance(ve)?ve.data.message:`Failed to parse mode ${A}`,{Session:Oe}=await import("./session-5BXSPMPJ.js");Wt.publish(Oe.Event.Error,{error:new ft.Unknown({message:Be}).toObject()}),w.error("failed to load mode",{mode:A,err:ve})});if(!q)continue;let de={name:ze.basename(A,".md"),...q.data,prompt:q.content.trim()},ne=k.Agent.safeParse(de);if(ne.success){N[de.name]={...ne.data,mode:"primary"};continue}}return N}t(x,"loadMode");async function P(h){let N=[];for(let A of await Sn.scan("{plugin,plugins}/*.{ts,js}",{cwd:h,absolute:!0,dot:!0,symlink:!0}))N.push(ar(A).href);return N}t(P,"loadPlugin");function V(h){return Array.isArray(h)?h[0]:h}k.pluginSpecifier=V,t(V,"pluginSpecifier");function se(h){return Array.isArray(h)?h[1]:void 0}k.pluginOptions=se,t(se,"pluginOptions");async function oe(h,N){let A=V(h);if(!sr(A))return h;let q=ze.dirname(N),de=A.startsWith("file://")?A:ze.isAbsolute(A)||/^[A-Za-z]:[\\/]/.test(A)?ar(A).href:ar(ze.resolve(q,A)).href,ne=await Ir(de).catch(()=>de);return Array.isArray(h)?[ne,h[1]]:ne}k.resolvePluginSpec=oe,t(oe,"resolvePluginSpec");function Z(h){let N=new Set,A=[];for(let q of h.toReversed()){let de=V(q.spec),ne=de.startsWith("file://")?de:fo(de).pkg;N.has(ne)||(N.add(ne),A.push(q))}return A.toReversed()}k.deduplicatePluginOrigins=Z,t(Z,"deduplicatePluginOrigins"),k.McpLocal=n.object({type:n.literal("local").describe("Type of MCP server connection"),command:n.string().array().describe("Command and arguments to run the MCP server"),environment:n.record(n.string(),n.string()).optional().describe("Environment variables to set when running the MCP server"),enabled:n.boolean().optional().describe("Enable or disable the MCP server on startup"),timeout:n.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.")}).strict().meta({ref:"McpLocalConfig"}),k.McpOAuth=n.object({clientId:n.string().optional().describe("OAuth client ID. If not provided, dynamic client registration (RFC 7591) will be attempted."),clientSecret:n.string().optional().describe("OAuth client secret (if required by the authorization server)"),scope:n.string().optional().describe("OAuth scopes to request during authorization")}).strict().meta({ref:"McpOAuthConfig"}),k.McpRemote=n.object({type:n.literal("remote").describe("Type of MCP server connection"),url:n.string().describe("URL of the remote MCP server"),enabled:n.boolean().optional().describe("Enable or disable the MCP server on startup"),headers:n.record(n.string(),n.string()).optional().describe("Headers to send with the request"),oauth:n.union([k.McpOAuth,n.literal(!1)]).optional().describe("OAuth authentication configuration for the MCP server. Set to false to disable OAuth auto-detection."),timeout:n.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.")}).strict().meta({ref:"McpRemoteConfig"}),k.Mcp=n.discriminatedUnion("type",[k.McpLocal,k.McpRemote]),k.PermissionAction=n.enum(["ask","allow","deny"]).meta({ref:"PermissionActionConfig"}),k.PermissionObject=n.record(n.string(),k.PermissionAction).meta({ref:"PermissionObjectConfig"}),k.PermissionRule=n.union([k.PermissionAction,k.PermissionObject]).meta({ref:"PermissionRuleConfig"});let Dt=t(h=>typeof h=="object"&&h!==null&&!Array.isArray(h)?{__originalKeys:Object.keys(h),...h}:h,"permissionPreprocess"),Rt=t(h=>{if(typeof h=="string")return{"*":h};let N=h,{__originalKeys:A,...q}=N;if(!A)return q;let de={};for(let ne of A)ne in q&&(de[ne]=q[ne]);return de},"permissionTransform");k.Permission=n.preprocess(Dt,n.object({__originalKeys:n.string().array().optional(),read:k.PermissionRule.optional(),edit:k.PermissionRule.optional(),glob:k.PermissionRule.optional(),grep:k.PermissionRule.optional(),list:k.PermissionRule.optional(),bash:k.PermissionRule.optional(),task:k.PermissionRule.optional(),external_directory:k.PermissionRule.optional(),todowrite:k.PermissionAction.optional(),question:k.PermissionAction.optional(),webfetch:k.PermissionAction.optional(),websearch:k.PermissionAction.optional(),codesearch:k.PermissionAction.optional(),lsp:k.PermissionRule.optional(),doom_loop:k.PermissionAction.optional(),skill:k.PermissionRule.optional()}).catchall(k.PermissionRule).or(k.PermissionAction)).transform(Rt).meta({ref:"PermissionConfig"}),k.Command=n.object({template:n.string(),description:n.string().optional(),agent:n.string().optional(),model:e.optional(),subtask:n.boolean().optional()}),k.Skills=n.object({paths:n.array(n.string()).optional().describe("Additional paths to skill folders"),urls:n.array(n.string()).optional().describe("URLs to fetch skills from (e.g., https://example.com/.well-known/skills/)")}),k.Agent=n.object({model:e.optional(),variant:n.string().optional().describe("Default model variant for this agent (applies only when using the agent's configured model)."),temperature:n.number().optional(),top_p:n.number().optional(),prompt:n.string().optional(),tools:n.record(n.string(),n.boolean()).optional().describe("@deprecated Use 'permission' field instead"),disable:n.boolean().optional(),description:n.string().optional().describe("Description of when to use the agent"),mode:n.enum(["subagent","primary","all"]).optional(),hidden:n.boolean().optional().describe("Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)"),options:n.record(n.string(),n.any()).optional(),color:n.union([n.string().regex(/^#[0-9a-fA-F]{6}$/,"Invalid hex color format"),n.enum(["primary","secondary","accent","success","warning","error","info"])]).optional().describe("Hex color code (e.g., #FF5733) or theme color (e.g., primary)"),steps:n.number().int().positive().optional().describe("Maximum number of agentic iterations before forcing text-only response"),maxSteps:n.number().int().positive().optional().describe("@deprecated Use 'steps' field instead."),permission:k.Permission.optional()}).catchall(n.any()).transform((h,N)=>{let A=new Set(["name","model","variant","prompt","description","temperature","top_p","mode","hidden","color","steps","maxSteps","options","permission","disable","tools"]),q={...h.options};for(let[ve,Be]of Object.entries(h))A.has(ve)||(q[ve]=Be);let de={};for(let[ve,Be]of Object.entries(h.tools??{})){let Oe=Be?"allow":"deny";ve==="write"||ve==="edit"||ve==="patch"||ve==="multiedit"?de.edit=Oe:de[ve]=Oe}Object.assign(de,h.permission);let ne=h.steps??h.maxSteps;return{...h,options:q,permission:de,steps:ne}}).meta({ref:"AgentConfig"}),k.Keybinds=n.object({leader:n.string().optional().default("ctrl+x").describe("Leader key for keybind combinations"),app_exit:n.string().optional().default("ctrl+c,ctrl+d,<leader>q").describe("Exit the application"),editor_open:n.string().optional().default("<leader>e").describe("Open external editor"),theme_list:n.string().optional().default("<leader>t").describe("List available themes"),sidebar_toggle:n.string().optional().default("<leader>b").describe("Toggle sidebar"),scrollbar_toggle:n.string().optional().default("none").describe("Toggle session scrollbar"),username_toggle:n.string().optional().default("none").describe("Toggle username visibility"),status_view:n.string().optional().default("<leader>s").describe("View status"),session_export:n.string().optional().default("<leader>x").describe("Export session to editor"),session_new:n.string().optional().default("<leader>n").describe("Create a new session"),session_list:n.string().optional().default("<leader>l").describe("List all sessions"),session_timeline:n.string().optional().default("<leader>g").describe("Show session timeline"),session_fork:n.string().optional().default("none").describe("Fork session from message"),session_rename:n.string().optional().default("ctrl+r").describe("Rename session"),session_delete:n.string().optional().default("ctrl+d").describe("Delete session"),stash_delete:n.string().optional().default("ctrl+d").describe("Delete stash entry"),model_provider_list:n.string().optional().default("ctrl+a").describe("Open provider list from model dialog"),model_favorite_toggle:n.string().optional().default("ctrl+f").describe("Toggle model favorite status"),session_share:n.string().optional().default("none").describe("Share current session"),session_unshare:n.string().optional().default("none").describe("Unshare current session"),session_interrupt:n.string().optional().default("escape").describe("Interrupt current session"),session_compact:n.string().optional().default("<leader>c").describe("Compact the session"),messages_page_up:n.string().optional().default("pageup,ctrl+alt+b").describe("Scroll messages up by one page"),messages_page_down:n.string().optional().default("pagedown,ctrl+alt+f").describe("Scroll messages down by one page"),messages_line_up:n.string().optional().default("ctrl+alt+y").describe("Scroll messages up by one line"),messages_line_down:n.string().optional().default("ctrl+alt+e").describe("Scroll messages down by one line"),messages_half_page_up:n.string().optional().default("ctrl+alt+u").describe("Scroll messages up by half page"),messages_half_page_down:n.string().optional().default("ctrl+alt+d").describe("Scroll messages down by half page"),messages_first:n.string().optional().default("ctrl+g,home").describe("Navigate to first message"),messages_last:n.string().optional().default("ctrl+alt+g,end").describe("Navigate to last message"),messages_next:n.string().optional().default("none").describe("Navigate to next message"),messages_previous:n.string().optional().default("none").describe("Navigate to previous message"),messages_last_user:n.string().optional().default("none").describe("Navigate to last user message"),messages_copy:n.string().optional().default("<leader>y").describe("Copy message"),messages_undo:n.string().optional().default("<leader>u").describe("Undo message"),messages_redo:n.string().optional().default("<leader>r").describe("Redo message"),messages_toggle_conceal:n.string().optional().default("<leader>h").describe("Toggle code block concealment in messages"),tool_details:n.string().optional().default("none").describe("Toggle tool details visibility"),model_list:n.string().optional().default("<leader>m").describe("List available models"),model_cycle_recent:n.string().optional().default("f2").describe("Next recently used model"),model_cycle_recent_reverse:n.string().optional().default("shift+f2").describe("Previous recently used model"),model_cycle_favorite:n.string().optional().default("none").describe("Next favorite model"),model_cycle_favorite_reverse:n.string().optional().default("none").describe("Previous favorite model"),command_list:n.string().optional().default("ctrl+p").describe("List available commands"),agent_list:n.string().optional().default("<leader>a").describe("List agents"),agent_cycle:n.string().optional().default("tab").describe("Next agent"),agent_cycle_reverse:n.string().optional().default("shift+tab").describe("Previous agent"),variant_cycle:n.string().optional().default("ctrl+t").describe("Cycle model variants"),input_clear:n.string().optional().default("ctrl+c").describe("Clear input field"),input_paste:n.string().optional().default("ctrl+v").describe("Paste from clipboard"),input_submit:n.string().optional().default("return").describe("Submit input"),input_newline:n.string().optional().default("shift+return,ctrl+return,alt+return,ctrl+j").describe("Insert newline in input"),input_move_left:n.string().optional().default("left,ctrl+b").describe("Move cursor left in input"),input_move_right:n.string().optional().default("right,ctrl+f").describe("Move cursor right in input"),input_move_up:n.string().optional().default("up").describe("Move cursor up in input"),input_move_down:n.string().optional().default("down").describe("Move cursor down in input"),input_select_left:n.string().optional().default("shift+left").describe("Select left in input"),input_select_right:n.string().optional().default("shift+right").describe("Select right in input"),input_select_up:n.string().optional().default("shift+up").describe("Select up in input"),input_select_down:n.string().optional().default("shift+down").describe("Select down in input"),input_line_home:n.string().optional().default("ctrl+a").describe("Move to start of line in input"),input_line_end:n.string().optional().default("ctrl+e").describe("Move to end of line in input"),input_select_line_home:n.string().optional().default("ctrl+shift+a").describe("Select to start of line in input"),input_select_line_end:n.string().optional().default("ctrl+shift+e").describe("Select to end of line in input"),input_visual_line_home:n.string().optional().default("alt+a").describe("Move to start of visual line in input"),input_visual_line_end:n.string().optional().default("alt+e").describe("Move to end of visual line in input"),input_select_visual_line_home:n.string().optional().default("alt+shift+a").describe("Select to start of visual line in input"),input_select_visual_line_end:n.string().optional().default("alt+shift+e").describe("Select to end of visual line in input"),input_buffer_home:n.string().optional().default("home").describe("Move to start of buffer in input"),input_buffer_end:n.string().optional().default("end").describe("Move to end of buffer in input"),input_select_buffer_home:n.string().optional().default("shift+home").describe("Select to start of buffer in input"),input_select_buffer_end:n.string().optional().default("shift+end").describe("Select to end of buffer in input"),input_delete_line:n.string().optional().default("ctrl+shift+d").describe("Delete line in input"),input_delete_to_line_end:n.string().optional().default("ctrl+k").describe("Delete to end of line in input"),input_delete_to_line_start:n.string().optional().default("ctrl+u").describe("Delete to start of line in input"),input_backspace:n.string().optional().default("backspace,shift+backspace").describe("Backspace in input"),input_delete:n.string().optional().default("ctrl+d,delete,shift+delete").describe("Delete character in input"),input_undo:n.string().optional().default("ctrl+-,super+z").describe("Undo in input"),input_redo:n.string().optional().default("ctrl+.,super+shift+z").describe("Redo in input"),input_word_forward:n.string().optional().default("alt+f,alt+right,ctrl+right").describe("Move word forward in input"),input_word_backward:n.string().optional().default("alt+b,alt+left,ctrl+left").describe("Move word backward in input"),input_select_word_forward:n.string().optional().default("alt+shift+f,alt+shift+right").describe("Select word forward in input"),input_select_word_backward:n.string().optional().default("alt+shift+b,alt+shift+left").describe("Select word backward in input"),input_delete_word_forward:n.string().optional().default("alt+d,alt+delete,ctrl+delete").describe("Delete word forward in input"),input_delete_word_backward:n.string().optional().default("ctrl+w,ctrl+backspace,alt+backspace").describe("Delete word backward in input"),history_previous:n.string().optional().default("up").describe("Previous history item"),history_next:n.string().optional().default("down").describe("Next history item"),session_child_first:n.string().optional().default("<leader>down").describe("Go to first child session"),session_child_cycle:n.string().optional().default("right").describe("Go to next child session"),session_child_cycle_reverse:n.string().optional().default("left").describe("Go to previous child session"),session_parent:n.string().optional().default("up").describe("Go to parent session"),terminal_suspend:n.string().optional().default("ctrl+z").describe("Suspend terminal"),terminal_title_toggle:n.string().optional().default("none").describe("Toggle terminal title"),tips_toggle:n.string().optional().default("<leader>h").describe("Toggle tips on home screen"),plugin_manager:n.string().optional().default("none").describe("Open plugin manager dialog"),display_thinking:n.string().optional().default("none").describe("Toggle thinking blocks visibility")}).strict().meta({ref:"KeybindsConfig"}),k.Server=n.object({port:n.number().int().positive().optional().describe("Port to listen on"),hostname:n.string().optional().describe("Hostname to listen on"),mdns:n.boolean().optional().describe("Enable mDNS service discovery"),mdnsDomain:n.string().optional().describe("Custom domain name for mDNS service (default: opencode.local)"),cors:n.array(n.string()).optional().describe("Additional domains to allow for CORS")}).strict().meta({ref:"ServerConfig"}),k.Layout=n.enum(["auto","stretch"]).meta({ref:"LayoutConfig"}),k.Provider=an.Provider.partial().extend({whitelist:n.array(n.string()).optional(),blacklist:n.array(n.string()).optional(),models:n.record(n.string(),an.Model.partial().extend({variants:n.record(n.string(),n.object({disabled:n.boolean().optional().describe("Disable this variant for the model")}).catchall(n.any())).optional().describe("Variant-specific configuration")})).optional(),options:n.object({apiKey:n.string().optional(),baseURL:n.string().optional(),enterpriseUrl:n.string().optional().describe("GitHub Enterprise URL for copilot authentication"),setCacheKey:n.boolean().optional().describe("Enable promptCacheKey for this provider (default false)"),timeout:n.union([n.number().int().positive().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),n.literal(!1).describe("Disable timeout for this provider entirely.")]).optional().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),chunkTimeout:n.number().int().positive().optional().describe("Timeout in milliseconds between streamed SSE chunks for this provider. If no chunk arrives within this window, the request is aborted.")}).catchall(n.any()).optional()}).strict().meta({ref:"ProviderConfig"}),k.Info=n.object({$schema:n.string().optional().describe("JSON schema reference for configuration validation"),logLevel:Xe.Level.optional().describe("Log level"),server:k.Server.optional().describe("Server configuration for opencode serve and web commands"),command:n.record(n.string(),k.Command).optional().describe("Command configuration, see https://opencode.ai/docs/commands"),skills:k.Skills.optional().describe("Additional skill folder paths"),watcher:n.object({ignore:n.array(n.string()).optional()}).optional(),snapshot:n.boolean().optional().describe("Enable or disable snapshot tracking. When false, filesystem snapshots are not recorded and undoing or reverting will not undo/redo file changes. Defaults to true."),plugin:k.PluginSpec.array().optional(),share:n.enum(["manual","auto","disabled"]).optional().describe("Control sharing behavior:'manual' allows manual sharing via commands, 'auto' enables automatic sharing, 'disabled' disables all sharing"),autoshare:n.boolean().optional().describe("@deprecated Use 'share' field instead. Share newly created sessions automatically"),autoupdate:n.union([n.boolean(),n.literal("notify")]).optional().describe("Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications"),disabled_providers:n.array(n.string()).optional().describe("Disable providers that are loaded automatically"),enabled_providers:n.array(n.string()).optional().describe("When set, ONLY these providers will be enabled. All other providers will be ignored"),model:e.describe("Model to use in the format of provider/model, eg anthropic/claude-2").optional(),small_model:e.describe("Small model to use for tasks like title generation in the format of provider/model").optional(),default_agent:n.string().optional().describe("Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid."),username:n.string().optional().describe("Custom username to display in conversations instead of system username"),mode:n.object({build:k.Agent.optional(),plan:k.Agent.optional()}).catchall(k.Agent).optional().describe("@deprecated Use `agent` field instead."),agent:n.object({plan:k.Agent.optional(),build:k.Agent.optional(),general:k.Agent.optional(),explore:k.Agent.optional(),title:k.Agent.optional(),summary:k.Agent.optional(),compaction:k.Agent.optional()}).catchall(k.Agent).optional().describe("Agent configuration, see https://opencode.ai/docs/agents"),provider:n.record(n.string(),k.Provider).optional().describe("Custom provider configurations and model overrides"),mcp:n.record(n.string(),n.union([k.Mcp,n.object({enabled:n.boolean()}).strict()])).optional().describe("MCP (Model Context Protocol) server configurations"),formatter:n.union([n.literal(!1),n.record(n.string(),n.object({disabled:n.boolean().optional(),command:n.array(n.string()).optional(),environment:n.record(n.string(),n.string()).optional(),extensions:n.array(n.string()).optional()}))]).optional(),lsp:n.union([n.literal(!1),n.record(n.string(),n.union([n.object({disabled:n.literal(!0)}),n.object({command:n.array(n.string()),extensions:n.array(n.string()).optional(),disabled:n.boolean().optional(),env:n.record(n.string(),n.string()).optional(),initialization:n.record(n.string(),n.any()).optional()})]))]).optional().refine(h=>{if(!h||typeof h=="boolean")return!0;let N=new Set(Object.values(wr).map(A=>A.id));return Object.entries(h).every(([A,q])=>q.disabled||N.has(A)?!0:!!q.extensions)},{error:"For custom LSP servers, 'extensions' array is required."}),instructions:n.array(n.string()).optional().describe("Additional instruction files or patterns to include"),layout:k.Layout.optional().describe("@deprecated Always uses stretch layout."),permission:k.Permission.optional(),tools:n.record(n.string(),n.boolean()).optional(),enterprise:n.object({url:n.string().optional().describe("Enterprise URL")}).optional(),compaction:n.object({auto:n.boolean().optional().describe("Enable automatic compaction when context is full (default: true)"),prune:n.boolean().optional().describe("Enable pruning of old tool outputs (default: true)"),reserved:n.number().int().min(0).optional().describe("Token buffer for compaction. Leaves enough window to avoid overflow during compaction.")}).optional(),experimental:n.object({disable_paste_summary:n.boolean().optional(),batch_tool:n.boolean().optional().describe("Enable the batch tool"),openTelemetry:n.boolean().optional().describe("Enable OpenTelemetry spans for AI SDK calls (using the 'experimental_telemetry' flag)"),primary_tools:n.array(n.string()).optional().describe("Tools that should only be available to primary agents."),continue_loop_on_deny:n.boolean().optional().describe("Continue the agent loop when a tool call is denied"),mcp_timeout:n.number().int().positive().optional().describe("Timeout in milliseconds for model context protocol (MCP) requests")}).optional()}).strict().meta({ref:"Config"});class d extends Ni.Service()("@opencode/Config"){static{t(this,"Service")}}k.Service=d;function o(){let h=["opencode.jsonc","opencode.json","config.json"].map(N=>ze.join(z.Path.config,N));for(let N of h)if(cr(N))return N;return h[0]}t(o,"globalConfigFile");function m(h,N,A=[]){if(!jt(N)){let q=Ci(h,A,N,{formattingOptions:{insertSpaces:!0,tabSize:2}});return Ti(h,q)}return Object.entries(N).reduce((q,[de,ne])=>ne===void 0?q:m(q,ne,[...A,de]),h)}t(m,"patchJsonc");function j(h){let{plugin_origins:N,...A}=h;return A}t(j,"writable");function _(h,N){let A=[],q=Di(h,A,{allowTrailingComma:!0});if(A.length){let ne=h.split(`
|
|
26
|
+
`));await st.install(h)}catch(Ke){var vt=Ke,ct=!0}finally{var a=Vt(Oe,vt,ct);a&&await a}}k.installDependencies=v,t(v,"installDependencies");async function u(h){try{return await Rr.access(h,Ii.W_OK),!0}catch{return!1}}t(u,"isWritable");function i(h,N){let A=h.replaceAll("\\","/");for(let q of N){let de=A.indexOf(q);if(de!==-1)return A.slice(de+q.length)}}t(i,"rel");function c(h){let N=ze.extname(h);return N.length?h.slice(0,-N.length):h}t(c,"trim");async function C(h){let N={};for(let A of await Sn.scan("{command,commands}/**/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async Ke=>{let vt=zt.FrontmatterError.isInstance(Ke)?Ke.data.message:`Failed to parse command ${A}`,{Session:ct}=await import("./session-FWLEEJPX.js");Wt.publish(ct.Event.Error,{error:new ft.Unknown({message:vt}).toObject()}),w.error("failed to load command",{command:A,err:Ke})});if(!q)continue;let ne=i(A,["/.opencode/command/","/.opencode/commands/","/command/","/commands/"])??ze.basename(A),Be={name:c(ne),...q.data,template:q.content.trim()},Oe=k.Command.safeParse(Be);if(Oe.success){N[Be.name]=Oe.data;continue}throw new k.InvalidError({path:A,issues:Oe.error.issues},{cause:Oe.error})}return N}t(C,"loadCommand");async function E(h){let N={};for(let A of await Sn.scan("{agent,agents}/**/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async Ke=>{let vt=zt.FrontmatterError.isInstance(Ke)?Ke.data.message:`Failed to parse agent ${A}`,{Session:ct}=await import("./session-FWLEEJPX.js");Wt.publish(ct.Event.Error,{error:new ft.Unknown({message:vt}).toObject()}),w.error("failed to load agent",{agent:A,err:Ke})});if(!q)continue;let ne=i(A,["/.opencode/agent/","/.opencode/agents/","/agent/","/agents/"])??ze.basename(A),Be={name:c(ne),...q.data,prompt:q.content.trim()},Oe=k.Agent.safeParse(Be);if(Oe.success){N[Be.name]=Oe.data;continue}throw new k.InvalidError({path:A,issues:Oe.error.issues},{cause:Oe.error})}return N}t(E,"loadAgent");async function b(h){let N={};if(process.env.OPENCODE_CLIENT!=="alchemy")return N;let A=ze.join(h,".alchemy_lab","action-server.json"),q;for(let ne=0;ne<20&&!q;ne++)try{let ve=JSON.parse(await L.readText(A));ve?.port&&(q=ve.port)}catch{await new Promise(ve=>setTimeout(ve,500))}if(!q)return w.warn("alchemy agents: no action-server.json; agents unavailable until config reload"),N;let de=[];try{let ne=await fetch(`http://127.0.0.1:${q}/api/agents/markdown`,{signal:AbortSignal.timeout(8e3)});if(!ne.ok)throw new Error(`HTTP ${ne.status}`);de=(await ne.json()).data??[]}catch(ne){return w.warn("alchemy agents: fetch failed",{port:q,err:ne}),N}for(let ne of de){let ve;try{ve=zt.parseText(ne.markdown,`alchemy agent ${ne.name}`)}catch(Ke){w.error("failed to parse alchemy agent",{agent:ne.name,err:Ke});continue}let Be={name:ne.name,...ve.data,prompt:ve.content.trim()},Oe=k.Agent.safeParse(Be);Oe.success?N[ne.name]=Oe.data:w.error("invalid alchemy agent",{agent:ne.name,issues:Oe.error.issues})}return w.info("alchemy agents loaded in memory",{count:Object.keys(N).length,port:q}),N}t(b,"loadAlchemyAgents");async function x(h){let N={};for(let A of await Sn.scan("{mode,modes}/*.md",{cwd:h,absolute:!0,dot:!0,symlink:!0})){let q=await zt.parse(A).catch(async ve=>{let Be=zt.FrontmatterError.isInstance(ve)?ve.data.message:`Failed to parse mode ${A}`,{Session:Oe}=await import("./session-FWLEEJPX.js");Wt.publish(Oe.Event.Error,{error:new ft.Unknown({message:Be}).toObject()}),w.error("failed to load mode",{mode:A,err:ve})});if(!q)continue;let de={name:ze.basename(A,".md"),...q.data,prompt:q.content.trim()},ne=k.Agent.safeParse(de);if(ne.success){N[de.name]={...ne.data,mode:"primary"};continue}}return N}t(x,"loadMode");async function P(h){let N=[];for(let A of await Sn.scan("{plugin,plugins}/*.{ts,js}",{cwd:h,absolute:!0,dot:!0,symlink:!0}))N.push(ar(A).href);return N}t(P,"loadPlugin");function V(h){return Array.isArray(h)?h[0]:h}k.pluginSpecifier=V,t(V,"pluginSpecifier");function se(h){return Array.isArray(h)?h[1]:void 0}k.pluginOptions=se,t(se,"pluginOptions");async function oe(h,N){let A=V(h);if(!sr(A))return h;let q=ze.dirname(N),de=A.startsWith("file://")?A:ze.isAbsolute(A)||/^[A-Za-z]:[\\/]/.test(A)?ar(A).href:ar(ze.resolve(q,A)).href,ne=await Ir(de).catch(()=>de);return Array.isArray(h)?[ne,h[1]]:ne}k.resolvePluginSpec=oe,t(oe,"resolvePluginSpec");function Z(h){let N=new Set,A=[];for(let q of h.toReversed()){let de=V(q.spec),ne=de.startsWith("file://")?de:fo(de).pkg;N.has(ne)||(N.add(ne),A.push(q))}return A.toReversed()}k.deduplicatePluginOrigins=Z,t(Z,"deduplicatePluginOrigins"),k.McpLocal=n.object({type:n.literal("local").describe("Type of MCP server connection"),command:n.string().array().describe("Command and arguments to run the MCP server"),environment:n.record(n.string(),n.string()).optional().describe("Environment variables to set when running the MCP server"),enabled:n.boolean().optional().describe("Enable or disable the MCP server on startup"),timeout:n.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.")}).strict().meta({ref:"McpLocalConfig"}),k.McpOAuth=n.object({clientId:n.string().optional().describe("OAuth client ID. If not provided, dynamic client registration (RFC 7591) will be attempted."),clientSecret:n.string().optional().describe("OAuth client secret (if required by the authorization server)"),scope:n.string().optional().describe("OAuth scopes to request during authorization")}).strict().meta({ref:"McpOAuthConfig"}),k.McpRemote=n.object({type:n.literal("remote").describe("Type of MCP server connection"),url:n.string().describe("URL of the remote MCP server"),enabled:n.boolean().optional().describe("Enable or disable the MCP server on startup"),headers:n.record(n.string(),n.string()).optional().describe("Headers to send with the request"),oauth:n.union([k.McpOAuth,n.literal(!1)]).optional().describe("OAuth authentication configuration for the MCP server. Set to false to disable OAuth auto-detection."),timeout:n.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified.")}).strict().meta({ref:"McpRemoteConfig"}),k.Mcp=n.discriminatedUnion("type",[k.McpLocal,k.McpRemote]),k.PermissionAction=n.enum(["ask","allow","deny"]).meta({ref:"PermissionActionConfig"}),k.PermissionObject=n.record(n.string(),k.PermissionAction).meta({ref:"PermissionObjectConfig"}),k.PermissionRule=n.union([k.PermissionAction,k.PermissionObject]).meta({ref:"PermissionRuleConfig"});let Dt=t(h=>typeof h=="object"&&h!==null&&!Array.isArray(h)?{__originalKeys:Object.keys(h),...h}:h,"permissionPreprocess"),Rt=t(h=>{if(typeof h=="string")return{"*":h};let N=h,{__originalKeys:A,...q}=N;if(!A)return q;let de={};for(let ne of A)ne in q&&(de[ne]=q[ne]);return de},"permissionTransform");k.Permission=n.preprocess(Dt,n.object({__originalKeys:n.string().array().optional(),read:k.PermissionRule.optional(),edit:k.PermissionRule.optional(),glob:k.PermissionRule.optional(),grep:k.PermissionRule.optional(),list:k.PermissionRule.optional(),bash:k.PermissionRule.optional(),task:k.PermissionRule.optional(),external_directory:k.PermissionRule.optional(),todowrite:k.PermissionAction.optional(),question:k.PermissionAction.optional(),webfetch:k.PermissionAction.optional(),websearch:k.PermissionAction.optional(),codesearch:k.PermissionAction.optional(),lsp:k.PermissionRule.optional(),doom_loop:k.PermissionAction.optional(),skill:k.PermissionRule.optional()}).catchall(k.PermissionRule).or(k.PermissionAction)).transform(Rt).meta({ref:"PermissionConfig"}),k.Command=n.object({template:n.string(),description:n.string().optional(),agent:n.string().optional(),model:e.optional(),subtask:n.boolean().optional()}),k.Skills=n.object({paths:n.array(n.string()).optional().describe("Additional paths to skill folders"),urls:n.array(n.string()).optional().describe("URLs to fetch skills from (e.g., https://example.com/.well-known/skills/)")}),k.Agent=n.object({model:e.optional(),variant:n.string().optional().describe("Default model variant for this agent (applies only when using the agent's configured model)."),temperature:n.number().optional(),top_p:n.number().optional(),prompt:n.string().optional(),tools:n.record(n.string(),n.boolean()).optional().describe("@deprecated Use 'permission' field instead"),disable:n.boolean().optional(),description:n.string().optional().describe("Description of when to use the agent"),mode:n.enum(["subagent","primary","all"]).optional(),hidden:n.boolean().optional().describe("Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)"),options:n.record(n.string(),n.any()).optional(),color:n.union([n.string().regex(/^#[0-9a-fA-F]{6}$/,"Invalid hex color format"),n.enum(["primary","secondary","accent","success","warning","error","info"])]).optional().describe("Hex color code (e.g., #FF5733) or theme color (e.g., primary)"),steps:n.number().int().positive().optional().describe("Maximum number of agentic iterations before forcing text-only response"),maxSteps:n.number().int().positive().optional().describe("@deprecated Use 'steps' field instead."),permission:k.Permission.optional()}).catchall(n.any()).transform((h,N)=>{let A=new Set(["name","model","variant","prompt","description","temperature","top_p","mode","hidden","color","steps","maxSteps","options","permission","disable","tools"]),q={...h.options};for(let[ve,Be]of Object.entries(h))A.has(ve)||(q[ve]=Be);let de={};for(let[ve,Be]of Object.entries(h.tools??{})){let Oe=Be?"allow":"deny";ve==="write"||ve==="edit"||ve==="patch"||ve==="multiedit"?de.edit=Oe:de[ve]=Oe}Object.assign(de,h.permission);let ne=h.steps??h.maxSteps;return{...h,options:q,permission:de,steps:ne}}).meta({ref:"AgentConfig"}),k.Keybinds=n.object({leader:n.string().optional().default("ctrl+x").describe("Leader key for keybind combinations"),app_exit:n.string().optional().default("ctrl+c,ctrl+d,<leader>q").describe("Exit the application"),editor_open:n.string().optional().default("<leader>e").describe("Open external editor"),theme_list:n.string().optional().default("<leader>t").describe("List available themes"),sidebar_toggle:n.string().optional().default("<leader>b").describe("Toggle sidebar"),scrollbar_toggle:n.string().optional().default("none").describe("Toggle session scrollbar"),username_toggle:n.string().optional().default("none").describe("Toggle username visibility"),status_view:n.string().optional().default("<leader>s").describe("View status"),session_export:n.string().optional().default("<leader>x").describe("Export session to editor"),session_new:n.string().optional().default("<leader>n").describe("Create a new session"),session_list:n.string().optional().default("<leader>l").describe("List all sessions"),session_timeline:n.string().optional().default("<leader>g").describe("Show session timeline"),session_fork:n.string().optional().default("none").describe("Fork session from message"),session_rename:n.string().optional().default("ctrl+r").describe("Rename session"),session_delete:n.string().optional().default("ctrl+d").describe("Delete session"),stash_delete:n.string().optional().default("ctrl+d").describe("Delete stash entry"),model_provider_list:n.string().optional().default("ctrl+a").describe("Open provider list from model dialog"),model_favorite_toggle:n.string().optional().default("ctrl+f").describe("Toggle model favorite status"),session_share:n.string().optional().default("none").describe("Share current session"),session_unshare:n.string().optional().default("none").describe("Unshare current session"),session_interrupt:n.string().optional().default("escape").describe("Interrupt current session"),session_compact:n.string().optional().default("<leader>c").describe("Compact the session"),messages_page_up:n.string().optional().default("pageup,ctrl+alt+b").describe("Scroll messages up by one page"),messages_page_down:n.string().optional().default("pagedown,ctrl+alt+f").describe("Scroll messages down by one page"),messages_line_up:n.string().optional().default("ctrl+alt+y").describe("Scroll messages up by one line"),messages_line_down:n.string().optional().default("ctrl+alt+e").describe("Scroll messages down by one line"),messages_half_page_up:n.string().optional().default("ctrl+alt+u").describe("Scroll messages up by half page"),messages_half_page_down:n.string().optional().default("ctrl+alt+d").describe("Scroll messages down by half page"),messages_first:n.string().optional().default("ctrl+g,home").describe("Navigate to first message"),messages_last:n.string().optional().default("ctrl+alt+g,end").describe("Navigate to last message"),messages_next:n.string().optional().default("none").describe("Navigate to next message"),messages_previous:n.string().optional().default("none").describe("Navigate to previous message"),messages_last_user:n.string().optional().default("none").describe("Navigate to last user message"),messages_copy:n.string().optional().default("<leader>y").describe("Copy message"),messages_undo:n.string().optional().default("<leader>u").describe("Undo message"),messages_redo:n.string().optional().default("<leader>r").describe("Redo message"),messages_toggle_conceal:n.string().optional().default("<leader>h").describe("Toggle code block concealment in messages"),tool_details:n.string().optional().default("none").describe("Toggle tool details visibility"),model_list:n.string().optional().default("<leader>m").describe("List available models"),model_cycle_recent:n.string().optional().default("f2").describe("Next recently used model"),model_cycle_recent_reverse:n.string().optional().default("shift+f2").describe("Previous recently used model"),model_cycle_favorite:n.string().optional().default("none").describe("Next favorite model"),model_cycle_favorite_reverse:n.string().optional().default("none").describe("Previous favorite model"),command_list:n.string().optional().default("ctrl+p").describe("List available commands"),agent_list:n.string().optional().default("<leader>a").describe("List agents"),agent_cycle:n.string().optional().default("tab").describe("Next agent"),agent_cycle_reverse:n.string().optional().default("shift+tab").describe("Previous agent"),variant_cycle:n.string().optional().default("ctrl+t").describe("Cycle model variants"),input_clear:n.string().optional().default("ctrl+c").describe("Clear input field"),input_paste:n.string().optional().default("ctrl+v").describe("Paste from clipboard"),input_submit:n.string().optional().default("return").describe("Submit input"),input_newline:n.string().optional().default("shift+return,ctrl+return,alt+return,ctrl+j").describe("Insert newline in input"),input_move_left:n.string().optional().default("left,ctrl+b").describe("Move cursor left in input"),input_move_right:n.string().optional().default("right,ctrl+f").describe("Move cursor right in input"),input_move_up:n.string().optional().default("up").describe("Move cursor up in input"),input_move_down:n.string().optional().default("down").describe("Move cursor down in input"),input_select_left:n.string().optional().default("shift+left").describe("Select left in input"),input_select_right:n.string().optional().default("shift+right").describe("Select right in input"),input_select_up:n.string().optional().default("shift+up").describe("Select up in input"),input_select_down:n.string().optional().default("shift+down").describe("Select down in input"),input_line_home:n.string().optional().default("ctrl+a").describe("Move to start of line in input"),input_line_end:n.string().optional().default("ctrl+e").describe("Move to end of line in input"),input_select_line_home:n.string().optional().default("ctrl+shift+a").describe("Select to start of line in input"),input_select_line_end:n.string().optional().default("ctrl+shift+e").describe("Select to end of line in input"),input_visual_line_home:n.string().optional().default("alt+a").describe("Move to start of visual line in input"),input_visual_line_end:n.string().optional().default("alt+e").describe("Move to end of visual line in input"),input_select_visual_line_home:n.string().optional().default("alt+shift+a").describe("Select to start of visual line in input"),input_select_visual_line_end:n.string().optional().default("alt+shift+e").describe("Select to end of visual line in input"),input_buffer_home:n.string().optional().default("home").describe("Move to start of buffer in input"),input_buffer_end:n.string().optional().default("end").describe("Move to end of buffer in input"),input_select_buffer_home:n.string().optional().default("shift+home").describe("Select to start of buffer in input"),input_select_buffer_end:n.string().optional().default("shift+end").describe("Select to end of buffer in input"),input_delete_line:n.string().optional().default("ctrl+shift+d").describe("Delete line in input"),input_delete_to_line_end:n.string().optional().default("ctrl+k").describe("Delete to end of line in input"),input_delete_to_line_start:n.string().optional().default("ctrl+u").describe("Delete to start of line in input"),input_backspace:n.string().optional().default("backspace,shift+backspace").describe("Backspace in input"),input_delete:n.string().optional().default("ctrl+d,delete,shift+delete").describe("Delete character in input"),input_undo:n.string().optional().default("ctrl+-,super+z").describe("Undo in input"),input_redo:n.string().optional().default("ctrl+.,super+shift+z").describe("Redo in input"),input_word_forward:n.string().optional().default("alt+f,alt+right,ctrl+right").describe("Move word forward in input"),input_word_backward:n.string().optional().default("alt+b,alt+left,ctrl+left").describe("Move word backward in input"),input_select_word_forward:n.string().optional().default("alt+shift+f,alt+shift+right").describe("Select word forward in input"),input_select_word_backward:n.string().optional().default("alt+shift+b,alt+shift+left").describe("Select word backward in input"),input_delete_word_forward:n.string().optional().default("alt+d,alt+delete,ctrl+delete").describe("Delete word forward in input"),input_delete_word_backward:n.string().optional().default("ctrl+w,ctrl+backspace,alt+backspace").describe("Delete word backward in input"),history_previous:n.string().optional().default("up").describe("Previous history item"),history_next:n.string().optional().default("down").describe("Next history item"),session_child_first:n.string().optional().default("<leader>down").describe("Go to first child session"),session_child_cycle:n.string().optional().default("right").describe("Go to next child session"),session_child_cycle_reverse:n.string().optional().default("left").describe("Go to previous child session"),session_parent:n.string().optional().default("up").describe("Go to parent session"),terminal_suspend:n.string().optional().default("ctrl+z").describe("Suspend terminal"),terminal_title_toggle:n.string().optional().default("none").describe("Toggle terminal title"),tips_toggle:n.string().optional().default("<leader>h").describe("Toggle tips on home screen"),plugin_manager:n.string().optional().default("none").describe("Open plugin manager dialog"),display_thinking:n.string().optional().default("none").describe("Toggle thinking blocks visibility")}).strict().meta({ref:"KeybindsConfig"}),k.Server=n.object({port:n.number().int().positive().optional().describe("Port to listen on"),hostname:n.string().optional().describe("Hostname to listen on"),mdns:n.boolean().optional().describe("Enable mDNS service discovery"),mdnsDomain:n.string().optional().describe("Custom domain name for mDNS service (default: opencode.local)"),cors:n.array(n.string()).optional().describe("Additional domains to allow for CORS")}).strict().meta({ref:"ServerConfig"}),k.Layout=n.enum(["auto","stretch"]).meta({ref:"LayoutConfig"}),k.Provider=an.Provider.partial().extend({whitelist:n.array(n.string()).optional(),blacklist:n.array(n.string()).optional(),models:n.record(n.string(),an.Model.partial().extend({variants:n.record(n.string(),n.object({disabled:n.boolean().optional().describe("Disable this variant for the model")}).catchall(n.any())).optional().describe("Variant-specific configuration")})).optional(),options:n.object({apiKey:n.string().optional(),baseURL:n.string().optional(),enterpriseUrl:n.string().optional().describe("GitHub Enterprise URL for copilot authentication"),setCacheKey:n.boolean().optional().describe("Enable promptCacheKey for this provider (default false)"),timeout:n.union([n.number().int().positive().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),n.literal(!1).describe("Disable timeout for this provider entirely.")]).optional().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),chunkTimeout:n.number().int().positive().optional().describe("Timeout in milliseconds between streamed SSE chunks for this provider. If no chunk arrives within this window, the request is aborted.")}).catchall(n.any()).optional()}).strict().meta({ref:"ProviderConfig"}),k.Info=n.object({$schema:n.string().optional().describe("JSON schema reference for configuration validation"),logLevel:Xe.Level.optional().describe("Log level"),server:k.Server.optional().describe("Server configuration for opencode serve and web commands"),command:n.record(n.string(),k.Command).optional().describe("Command configuration, see https://opencode.ai/docs/commands"),skills:k.Skills.optional().describe("Additional skill folder paths"),watcher:n.object({ignore:n.array(n.string()).optional()}).optional(),snapshot:n.boolean().optional().describe("Enable or disable snapshot tracking. When false, filesystem snapshots are not recorded and undoing or reverting will not undo/redo file changes. Defaults to true."),plugin:k.PluginSpec.array().optional(),share:n.enum(["manual","auto","disabled"]).optional().describe("Control sharing behavior:'manual' allows manual sharing via commands, 'auto' enables automatic sharing, 'disabled' disables all sharing"),autoshare:n.boolean().optional().describe("@deprecated Use 'share' field instead. Share newly created sessions automatically"),autoupdate:n.union([n.boolean(),n.literal("notify")]).optional().describe("Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications"),disabled_providers:n.array(n.string()).optional().describe("Disable providers that are loaded automatically"),enabled_providers:n.array(n.string()).optional().describe("When set, ONLY these providers will be enabled. All other providers will be ignored"),model:e.describe("Model to use in the format of provider/model, eg anthropic/claude-2").optional(),small_model:e.describe("Small model to use for tasks like title generation in the format of provider/model").optional(),default_agent:n.string().optional().describe("Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid."),username:n.string().optional().describe("Custom username to display in conversations instead of system username"),mode:n.object({build:k.Agent.optional(),plan:k.Agent.optional()}).catchall(k.Agent).optional().describe("@deprecated Use `agent` field instead."),agent:n.object({plan:k.Agent.optional(),build:k.Agent.optional(),general:k.Agent.optional(),explore:k.Agent.optional(),title:k.Agent.optional(),summary:k.Agent.optional(),compaction:k.Agent.optional()}).catchall(k.Agent).optional().describe("Agent configuration, see https://opencode.ai/docs/agents"),provider:n.record(n.string(),k.Provider).optional().describe("Custom provider configurations and model overrides"),mcp:n.record(n.string(),n.union([k.Mcp,n.object({enabled:n.boolean()}).strict()])).optional().describe("MCP (Model Context Protocol) server configurations"),formatter:n.union([n.literal(!1),n.record(n.string(),n.object({disabled:n.boolean().optional(),command:n.array(n.string()).optional(),environment:n.record(n.string(),n.string()).optional(),extensions:n.array(n.string()).optional()}))]).optional(),lsp:n.union([n.literal(!1),n.record(n.string(),n.union([n.object({disabled:n.literal(!0)}),n.object({command:n.array(n.string()),extensions:n.array(n.string()).optional(),disabled:n.boolean().optional(),env:n.record(n.string(),n.string()).optional(),initialization:n.record(n.string(),n.any()).optional()})]))]).optional().refine(h=>{if(!h||typeof h=="boolean")return!0;let N=new Set(Object.values(wr).map(A=>A.id));return Object.entries(h).every(([A,q])=>q.disabled||N.has(A)?!0:!!q.extensions)},{error:"For custom LSP servers, 'extensions' array is required."}),instructions:n.array(n.string()).optional().describe("Additional instruction files or patterns to include"),layout:k.Layout.optional().describe("@deprecated Always uses stretch layout."),permission:k.Permission.optional(),tools:n.record(n.string(),n.boolean()).optional(),enterprise:n.object({url:n.string().optional().describe("Enterprise URL")}).optional(),compaction:n.object({auto:n.boolean().optional().describe("Enable automatic compaction when context is full (default: true)"),prune:n.boolean().optional().describe("Enable pruning of old tool outputs (default: true)"),reserved:n.number().int().min(0).optional().describe("Token buffer for compaction. Leaves enough window to avoid overflow during compaction.")}).optional(),experimental:n.object({disable_paste_summary:n.boolean().optional(),batch_tool:n.boolean().optional().describe("Enable the batch tool"),openTelemetry:n.boolean().optional().describe("Enable OpenTelemetry spans for AI SDK calls (using the 'experimental_telemetry' flag)"),primary_tools:n.array(n.string()).optional().describe("Tools that should only be available to primary agents."),continue_loop_on_deny:n.boolean().optional().describe("Continue the agent loop when a tool call is denied"),mcp_timeout:n.number().int().positive().optional().describe("Timeout in milliseconds for model context protocol (MCP) requests")}).optional()}).strict().meta({ref:"Config"});class d extends Ni.Service()("@opencode/Config"){static{t(this,"Service")}}k.Service=d;function o(){let h=["opencode.jsonc","opencode.json","config.json"].map(N=>ze.join(z.Path.config,N));for(let N of h)if(cr(N))return N;return h[0]}t(o,"globalConfigFile");function m(h,N,A=[]){if(!jt(N)){let q=Ci(h,A,N,{formattingOptions:{insertSpaces:!0,tabSize:2}});return Ti(h,q)}return Object.entries(N).reduce((q,[de,ne])=>ne===void 0?q:m(q,ne,[...A,de]),h)}t(m,"patchJsonc");function j(h){let{plugin_origins:N,...A}=h;return A}t(j,"writable");function _(h,N){let A=[],q=Di(h,A,{allowTrailingComma:!0});if(A.length){let ne=h.split(`
|
|
27
27
|
`),ve=A.map(Be=>{let Oe=h.substring(0,Be.offset).split(`
|
|
28
28
|
`),Ke=Oe.length,vt=Oe[Oe.length-1].length+1,ct=ne[Ke-1],a=`${ji(Be.error)} at line ${Ke}, column ${vt}`;return ct?`${a}
|
|
29
29
|
Line ${Ke}: ${ct}
|
|
@@ -9,4 +9,4 @@ if (typeof globalThis.Bun === 'undefined') {
|
|
|
9
9
|
if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
|
|
10
10
|
if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
|
|
11
11
|
|
|
12
|
-
import{F as D,a as z,b as V,h as q,k as C}from"./chunk-
|
|
12
|
+
import{F as D,a as z,b as V,h as q,k as C}from"./chunk-MN5GIJ5E.js";import{D as N,n as w,q as A}from"./chunk-22MFGOA6.js";import{B as J,h as S,j as O,k as b,l as B,n as F}from"./chunk-N7PLTD3P.js";import{e as K}from"./chunk-M4CB72HE.js";import{a as c}from"./chunk-MBZTOEAD.js";import{Effect as t,Exit as de,Layer as u,Option as j,Schema as k,Scope as G,ServiceMap as pe,Stream as fe}from"effect";import{FetchHttpClient as le,HttpClient as Q,HttpClientRequest as p,HttpClientResponse as ue}from"effect/unstable/http";import{sqliteTable as ce,text as I}from"drizzle-orm/sqlite-core";var l=ce("session_share",{session_id:I().primaryKey().references(()=>F.id,{onDelete:"cascade"}),id:I().notNull(),secret:I().notNull(),url:I().notNull(),...B});var ye;(x=>{let f=K.create({service:"share-next"}),y=process.env.OPENCODE_DISABLE_SHARE==="true"||process.env.OPENCODE_DISABLE_SHARE==="1",W=k.Struct({id:k.String,url:k.String,secret:k.String});class _ extends pe.Service()("@opencode/ShareNext"){static{c(this,"Service")}}x.Service=_;let $=c(i=>t.sync(()=>O.use(i)),"db");function U(i){return{create:`/api/${i}`,sync:c(d=>`/api/${i}/${d}/sync`,"sync"),remove:c(d=>`/api/${i}/${d}`,"remove"),data:c(d=>`/api/${i}/${d}/data`,"data")}}c(U,"api");let X=U("share"),Y=U("shares");function R(i){switch(i.type){case"session":return"session";case"message":return`message/${i.data.id}`;case"part":return`part/${i.data.messageID}/${i.data.id}`;case"session_diff":return"session_diff";case"model":return"model"}}c(R,"key"),x.layer=u.effect(_,t.gen(function*(){let i=yield*A.Service,d=yield*w.Service,te=yield*N.Service,H=yield*Q.HttpClient,L=Q.filterStatusOk(H),P=yield*C.Service,M=yield*D.Service;function m(e,s){return t.gen(function*(){if(y)return;let n=yield*S.get(E),r=n.queue.get(e);if(r){for(let a of s)r.data.set(R(a),a);return}let o=new Map(s.map(a=>[R(a),a]));n.queue.set(e,{data:o}),yield*re(e).pipe(t.delay(1e3),t.catchCause(a=>t.sync(()=>{f.error("share flush failed",{sessionID:e,cause:a})})),t.forkIn(n.scope))})}c(m,"sync");let E=yield*S.make(t.fn("ShareNext.state")(function*(e){let s={queue:new Map,scope:yield*G.make()};if(yield*t.addFinalizer(()=>G.close(s.scope,de.void).pipe(t.andThen(t.sync(()=>{s.queue.clear()})))),y)return s;let n=c((r,o)=>d.subscribe(r).pipe(fe.runForEach(a=>o(a).pipe(t.catchCause(v=>t.sync(()=>{f.error("share subscriber failed",{type:r.type,cause:v})})))),t.forkScoped),"watch");return yield*n(D.Event.Updated,r=>t.gen(function*(){let o=yield*M.get(r.properties.sessionID);yield*m(o.id,[{type:"session",data:o}])})),yield*n(q.Event.Updated,r=>t.gen(function*(){let o=r.properties.info;if(yield*m(o.sessionID,[{type:"message",data:o}]),o.role!=="user")return;let a=yield*P.getModel(o.model.providerID,o.model.modelID);yield*m(o.sessionID,[{type:"model",data:[a]}])})),yield*n(q.Event.PartUpdated,r=>m(r.properties.part.sessionID,[{type:"part",data:r.properties.part}])),yield*n(D.Event.Diff,r=>m(r.properties.sessionID,[{type:"session_diff",data:r.properties.diff}])),s})),h=t.fn("ShareNext.request")(function*(){let e={},s=yield*i.active();if(j.isNone(s)||!s.value.active_org_id){let r=(yield*te.get()).enterprise?.url??"https://opncd.ai";return{headers:e,api:X,baseUrl:r}}let n=yield*i.token(s.value.id);if(j.isNone(n))throw new Error("No active account token available for sharing");return e.authorization=`Bearer ${n.value}`,e["x-org-id"]=s.value.active_org_id,{headers:e,api:Y,baseUrl:s.value.url}}),T=t.fnUntraced(function*(e){let s=yield*$(n=>n.select().from(l).where((0,b.eq)(l.session_id,e)).get());if(s)return{id:s.id,secret:s.secret,url:s.url}}),re=t.fn("ShareNext.flush")(function*(e){if(y)return;let s=yield*S.get(E),n=s.queue.get(e);if(!n)return;s.queue.delete(e);let r=yield*T(e);if(!r)return;let o=yield*h(),a=yield*p.post(`${o.baseUrl}${o.api.sync(r.id)}`).pipe(p.setHeaders(o.headers),p.bodyJson({secret:r.secret,data:Array.from(n.data.values())}),t.flatMap(v=>H.execute(v)));a.status>=400&&f.warn("failed to sync share",{sessionID:e,shareID:r.id,status:a.status})}),se=t.fn("ShareNext.full")(function*(e){f.info("full sync",{sessionID:e});let s=yield*M.get(e),n=yield*M.diff(e),r=yield*t.sync(()=>Array.from(q.stream(e))),o=yield*t.forEach(Array.from(new Map(r.filter(a=>a.info.role==="user").map(a=>a.info.model).map(a=>[`${a.providerID}/${a.modelID}`,a])).values()),a=>P.getModel(z.make(a.providerID),V.make(a.modelID)),{concurrency:8});yield*m(e,[{type:"session",data:s},...r.map(a=>({type:"message",data:a.info})),...r.flatMap(a=>a.parts.map(v=>({type:"part",data:v}))),{type:"session_diff",data:n},{type:"model",data:o}])}),ne=t.fn("ShareNext.init")(function*(){y||(yield*S.get(E))}),ae=t.fn("ShareNext.url")(function*(){return(yield*h()).baseUrl}),ie=t.fn("ShareNext.create")(function*(e){if(y)return{id:"",url:"",secret:""};f.info("creating share",{sessionID:e});let s=yield*h(),n=yield*p.post(`${s.baseUrl}${s.api.create}`).pipe(p.setHeaders(s.headers),p.bodyJson({sessionID:e}),t.flatMap(o=>L.execute(o)),t.flatMap(ue.schemaBodyJson(W)));yield*$(o=>o.insert(l).values({session_id:e,id:n.id,secret:n.secret,url:n.url}).onConflictDoUpdate({target:l.session_id,set:{id:n.id,secret:n.secret,url:n.url}}).run());let r=yield*S.get(E);return yield*se(e).pipe(t.catchCause(o=>t.sync(()=>{f.error("share full sync failed",{sessionID:e,cause:o})})),t.forkIn(r.scope)),n}),oe=t.fn("ShareNext.remove")(function*(e){if(y)return;f.info("removing share",{sessionID:e});let s=yield*T(e);if(!s)return;let n=yield*h();yield*p.delete(`${n.baseUrl}${n.api.remove(s.id)}`).pipe(p.setHeaders(n.headers),p.bodyJson({secret:s.secret}),t.flatMap(r=>L.execute(r))),yield*$(r=>r.delete(l).where((0,b.eq)(l.session_id,e)).run())});return _.of({init:ne,url:ae,request:h,create:ie,remove:oe})})),x.defaultLayer=x.layer.pipe(u.provide(w.layer),u.provide(A.defaultLayer),u.provide(N.defaultLayer),u.provide(le.layer),u.provide(C.defaultLayer),u.provide(D.defaultLayer));let{runPromise:g}=J(_,x.defaultLayer);async function me(){return g(i=>i.init())}x.init=me,c(me,"init");async function Se(){return g(i=>i.url())}x.url=Se,c(Se,"url");async function ge(){return g(i=>i.request())}x.request=ge,c(ge,"request");async function he(i){return g(d=>d.create(i))}x.create=he,c(he,"create");async function ve(i){return g(d=>d.remove(i))}x.remove=ve,c(ve,"remove")})(ye||={});export{ye as a};
|