@robota-sdk/agent-command 3.0.0-beta.92 → 3.0.0-beta.93

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.
@@ -1,82 +1,84 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@robota-sdk/agent-framework"),t=require("@robota-sdk/agent-core"),n=require("node:fs"),r=require("node:net"),i=require("node:path"),a=require("@robota-sdk/agent-core/node"),o=require("node:os"),s=require("node:child_process"),c=require("@robota-sdk/agent-preset"),l=require("node:crypto");function u(e){let t=[],n=``,r,i=!1;for(let a of e){if(i){n+=a,i=!1;continue}if(r&&a===`\\`){i=!0;continue}if(r){a===r?r=void 0:n+=a;continue}if(a===`"`||a===`'`){r=a;continue}if(/\s/.test(a)){n.length>0&&(t.push(n),n=``);continue}n+=a}return n.length>0&&t.push(n),t}function d(e){let t=[],n,r,i;for(let a=0;a<e.length;a+=1){let o=e[a];if(o!==`--background`){if(o===`--agent`||o===`--type`||o===`-a`){n=e[a+1],a+=1;continue}if(o===`--model`){r=e[a+1],a+=1;continue}if(o===`--isolation`){let t=e[a+1];(t===`none`||t===`worktree`)&&(i=t),a+=1;continue}o!==void 0&&t.push(o)}}return{positional:t,...n?{agentType:n}:{},...r?{model:r}:{},...i?{isolation:i}:{}}}function f(e,t,n,r){return{agentType:t,label:n,mode:`background`,prompt:r,...e.model?{model:e.model}:{},...e.isolation?{isolation:e.isolation}:{}}}function p(t,n){let r=d(t),[i,...a]=r.positional,o=r.agentType??e.DEFAULT_AGENT_TYPE,s=r.positional;!r.agentType&&i&&n.has(i)&&(o=i,s=a);let c=s.join(` `).trim();if(c)return f(r,o,o,c)}function m(e,t){let n=d(e);return n.positional.map(e=>h(e,n,t)).filter(e=>e!==void 0)}function h(t,n,r){let i=t.indexOf(`=`);if(i>0)return g(t.slice(0,i),t.slice(i+1),n,r);let a=t.indexOf(`:`);if(a<=0||a===t.length-1)return;let o=t.slice(0,a),s=t.slice(a+1);return f(n,n.agentType??(r.has(o)?o:e.DEFAULT_AGENT_TYPE),o,s)}function g(t,n,r,i){let a=n.indexOf(`:`);if(a===-1)return f(r,r.agentType??(i.has(t)?t:e.DEFAULT_AGENT_TYPE),t,n);if(a!==0&&a!==n.length-1)return f(r,n.slice(0,a),t,n.slice(a+1))}function _(e){return e instanceof Error?e.message:String(e)}function v(e){return new Set(e.listAgentDefinitions().map(e=>e.name))}function y(e,t){let n=e.listAgentDefinitions();if(!n.some(e=>e.name===t))return{message:`Unknown agent type: ${t}\nAvailable agents: ${n.map(e=>e.name).join(`, `)}`,success:!1}}async function b(e,t){let n=y(e,t.agentType);if(n)return n;try{return{state:await e.spawnAgentJob(t)}}catch(e){return{message:_(e),success:!1}}}function x(){return{message:``,uiIntents:[{type:`show-agent-switcher`}],success:!0}}function ee(e,t){return e.setDefaultAgentType(t),{message:`Default agent: ${t}`,success:!0,data:{agentType:t}}}async function te(e){let t=e.listAgentDefinitions(),n=e.listAgentJobs();return{message:[`Available agents:`,...t.map(e=>` ${e.name} - ${e.description}`),``,n.length===0?`No active agent jobs.`:`Agent jobs:`,...n.map(e=>` ${ne(e)}`)].join(`
2
- `),success:!0,data:{agents:t.length,jobs:n.length}}}function ne(e){let t=[e.worktreePath?`worktree=${e.worktreePath}`:void 0,e.branchName?`branch=${e.branchName}`:void 0].filter(e=>e!==void 0),n=t.length>0?` ${t.join(` `)}`:``;return`${e.id} [${e.status}${n}] ${e.label} - ${e.promptPreview}`}async function re(e,t){let n=p(t,v(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await b(e,n);if(`success`in r)return r;let{state:i}=r;return{message:`Started agent job: ${i.id}`,success:!0,data:{agentId:i.id,status:i.status}}}async function ie(t,n){let r=n.includes(`--wait`)||!n.includes(`--detach`),i=m(n.filter(e=>e!==`--wait`&&e!==`--detach`),v(t));if(i.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let a=i.map(e=>y(t,e.agentType)).find(e=>e!==void 0);if(a)return a;let o;try{o=await Promise.all(i.map(e=>t.spawnAgentJob(e)))}catch(e){return{message:_(e),success:!1}}let s=t.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:o.map(e=>e.id),label:`agent parallel`});if(r){let n=(0,e.summarizeBackgroundJobGroup)(await t.waitBackgroundJobGroup(s.id));return{message:de(n),success:!0,data:{agentIds:o.map(e=>e.id),groupId:s.id,summary:n}}}return{message:[`Started agent jobs:`,...o.map(e=>`${e.label}: ${e.id}`)].join(`
3
- `),success:!0,data:{agentIds:o.map(e=>e.id),groupId:s.id}}}async function ae(t,n){let[r]=n;if(!r)return{message:`Usage: agent wait GROUP_ID`,success:!1};let i=(0,e.summarizeBackgroundJobGroup)(await t.waitBackgroundJobGroup(r));return{message:de(i),success:!0,data:{groupId:r,summary:i}}}async function oe(e,t){let[n,r]=t;if(!n)return{message:`Usage: agent read AGENT_ID [OFFSET]`,success:!1};let i=r?{offset:Number.parseInt(r,10)}:void 0,a=await e.readBackgroundTaskLog(n,i),o=a.nextCursor?`\nNext offset: ${a.nextCursor.offset}`:``;return{message:a.lines.length>0?`${a.lines.join(`
4
- `)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function se(e,t){let[n,...r]=t,i=r.join(` `).trim();return!n||!i?{message:`Usage: agent send AGENT_ID PROMPT`,success:!1}:(await e.sendAgentJob(n,i),{message:`Sent input to agent job: ${n}`,success:!0,data:{agentId:n}})}async function ce(e,t){let[n,...r]=t;return n?(await e.cancelAgentJob(n,r.join(` `)||void 0),{message:`Agent job stopped: ${n}`,success:!0,data:{agentId:n}}):{message:`Usage: agent stop AGENT_ID [REASON]`,success:!1}}async function le(e,t){let[n]=t;return n?(await e.closeAgentJob(n),{message:`Agent job closed: ${n}`,success:!0,data:{agentId:n}}):{message:`Usage: agent close AGENT_ID`,success:!1}}async function ue(e,t){try{if(t.trim()===``)return x();let[n=`list`,...r]=u(t);return n===`list`&&r.length===0?te(e):n===`run`?re(e,r):n===`parallel`?ie(e,r):n===`wait`?ae(e,r):n===`read`||n===`open`?oe(e,r):n===`send`?se(e,r):n===`stop`||n===`cancel`?ce(e,r):n===`close`?le(e,r):r.length===0&&v(e).has(n)?ee(e,n):re(e,[n,...r])}catch(e){return{message:_(e),success:!1}}}function de(e){return[`Background job group ${e.groupId}: ${e.status} (${e.completed}/${e.total} completed, ${e.failed} failed, ${e.cancelled} cancelled, ${e.pending} pending)`,...e.lines].join(`
5
- `)}function fe(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function pe(){return[{name:`list`,description:`List available agents and active jobs`,source:`agent`},{name:`run`,description:`Start one background agent job`,source:`agent`},{name:`parallel`,description:`Run multiple agents in parallel`,source:`agent`},{name:`wait`,description:`Wait for a background agent group summary`,source:`agent`},{name:`read`,description:`Read an agent job log page`,source:`agent`},{name:`send`,description:`Send follow-up input to an agent job`,source:`agent`},{name:`stop`,description:`Cancel a running agent job`,source:`agent`},{name:`close`,description:`Dismiss a terminal agent job`,source:`agent`},{name:`open`,description:`Read an agent job log page (alias for read)`,source:`agent`}]}function me(){return{name:`agent`,displayName:`Agent Jobs`,description:`Start and manage background subagent jobs`,modelDescription:[`Start and manage background subagent jobs.`,`Natural-language arguments start one background agent job.`,`When the user explicitly asks to create, run, spawn, delegate to, or use agents/subagents, start the requested agent command immediately and do not ask a follow-up question unless execution is impossible or unsafe.`,`If the target item is unspecified, include target selection inside the agent prompt instead of delaying execution.`,`The parallel form starts multiple background agent jobs as a wait_all group and returns a consolidated group summary unless --detach is present.`,`list, wait, read, send, stop, close, and open manage existing agent jobs.`,`Returns the started job id (or group summary), the job list, or the requested log page.`].join(` `),source:`agent`,modelInvocable:!0,argumentHint:`PROMPT | AGENT_NAME PROMPT | list | parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"] | wait GROUP_ID | read AGENT_ID [OFFSET] | send AGENT_ID PROMPT | stop AGENT_ID | close AGENT_ID`,safety:`background-agent`,subcommands:pe()}}function he(){let e=me();return{name:e.name,semanticRole:`subagentSpawn`,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>ue(fe(e),t),...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands}}}var ge=class{name=`agent`;getCommands(){return[me()]}};function _e(){return{name:`agent-command-agent`,commandSources:[new ge],systemCommands:[he()],sessionRequirements:[`runtime`]}}function ve(e){return e.trim().split(/\s+/).filter(Boolean)}async function ye(t,n){let[r=`list`,i,...a]=ve(n);if(r===`list`){let n=(0,e.listCommandBackgroundTasks)(t);return{message:(0,e.formatCommandBackgroundTaskList)(n),success:!0,data:{count:n.length}}}if(!i)return{message:e.BACKGROUND_COMMAND_USAGE,success:!1};if(r===`read`||r===`log`||r===`open`){let n=await(0,e.readCommandBackgroundTaskLog)(t,i,(0,e.parseCommandBackgroundLogCursor)(a[0])),r=n.nextCursor?`\nNext offset: ${n.nextCursor.offset}`:``;return{message:n.lines.length>0?`${n.lines.join(`
6
- `)}${r}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:n.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await(0,e.cancelCommandBackgroundTask)(t,i,a.join(` `)||void 0),{message:`Background task cancelled: ${i}`,success:!0,data:{taskId:i}}):r===`close`||r===`dismiss`?(await(0,e.closeCommandBackgroundTask)(t,i),{message:`Background task closed: ${i}`,success:!0,data:{taskId:i}}):{message:`Unknown background action: ${r}`,success:!1}}function be(){return{name:`background`,displayName:`Background Tasks`,description:e.BACKGROUND_COMMAND_DESCRIPTION,source:`background`,modelInvocable:!1,subcommands:(0,e.buildBackgroundCommandSubcommands)()}}function xe(){let e=be();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,subcommands:e.subcommands,execute:ye}}var Se=class{name=`background`;getCommands(){return[be()]}};function Ce(){return{name:`agent-command-background`,commandSources:[new Se],systemCommands:[xe()]}}function we(e){let t=e.trim();return t.length>0?t:void 0}async function Te(t,n){let{before:r,after:i,beforeMessageCount:a,afterMessageCount:o}=await(0,e.compactCommandContext)(t,we(n)),s=a-o;return{message:[`Context compacted.`,` Removed messages: ${s} (${a>0?Math.round(s/a*100):0}% of total)`,` Context: ${Math.round(r.usedPercentage)}% → ${Math.round(i.usedPercentage)}%`].join(`
7
- `),success:!0,data:{before:r,after:i,beforeMessageCount:a,afterMessageCount:o}}}function Ee(){return{name:`compact`,displayName:`Compact Context`,description:`Compress context window`,modelDescription:`Summarize older conversation turns to free context-window space. Use it when the context is nearly full (check with the context command) or before starting a large new task; optional instructions say what the summary must keep. Returns how many messages were removed and the context usage before and after.`,source:`compact`,modelInvocable:!0,argumentHint:`[instructions]`,safety:`write`,example:`/compact Summarize the current context`}}function De(){let e=Ee();return{name:e.name,semanticRole:`contextReduction`,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},example:e.example,requiresPermission:!1,userInvocable:!0,modelInvocable:e.modelInvocable,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`blocking`,execute:Te}}var Oe=class{name=`compact`;getCommands(){return[Ee()]}};function ke(){return{name:`agent-command-compact`,commandSources:[new Oe],systemCommands:[De()]}}function S(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function Ae(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${S(e)} (${t})`}function C(e){return Math.ceil(e/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN)}function w(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${C(e.byteLength).toLocaleString()} tokens`].join(` `)}function je(e){try{return JSON.parse(e)}catch{return null}}function Me(e){let t=je(e);if(t===null)return``;let n=Object.values(t)[0],r=typeof n==`string`?n:JSON.stringify(n);return r.length>60?`${r.slice(0,60)}…`:r}function Ne(e){let n=0,r=0,i=0,a=0,o=0,s=0,c=0;for(let l of e){let e=Math.ceil(JSON.stringify(l).length/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN);l.role===`system`?n+=e:l.role===`user`?(r+=e,i++):l.role===`assistant`?(a+=e,o++):l.role===`tool`&&(s+=e,c++)}return{systemTokens:n,userTokens:r,userCount:i,assistantTokens:a,assistantCount:o,toolTokens:s,toolCallCount:c,totalTokens:n+r+a+s}}function Pe(e){return Ie(e.filter(e=>e.category===`chat`).map(e=>({type:e.type,data:e.data})))}function Fe(e){return Ie(e.map(e=>({type:e.role,data:e})))}function Ie(e){let t=new Map;for(let n of e){if(n.type!==`assistant`)continue;let e=n.data;for(let n of e.toolCalls??[])t.set(n.id,{name:n.function.name,firstArg:Me(n.function.arguments)})}let n=0,r=0,i=new Map;for(let a of e)if(a.type===`user`)n++;else if(a.type===`tool`){let e=a.data,n=t.get(e.toolCallId??``),o=n?.name??`tool`,s=n?.firstArg??``;r++,i.set(`${o}:${s}`,{toolName:o,displayArg:s})}return{turnCount:n,toolResults:[...i.values()],totalToolCallCount:r}}function T(e,t,n){let r=`${e}${t>0?` — ~${t.toLocaleString()} tokens`:``}:`;return n.length===0?`${r}\n (none)`:[r,...n.map(e=>` ${e}`)].join(`
8
- `)}function Le(n){let r=(0,e.readCommandContextState)(n),i=(0,e.readAutoCompactThreshold)(n),a=(0,e.readAutoCompactThresholdSource)(n),o=n.getSession().getHistory(),s=Ne(o),c=n.getSession().getOfferedToolSchemas(),l=(0,t.estimateToolSchemaTokens)(c),u=Fe(o),d=(0,e.listCommandContextReferences)(n),f=d.filter(e=>e.loadType===`system`),p=d.filter(e=>e.loadType===`manual`),m=d.filter(e=>e.loadType===`prompt-reference`),h=f.reduce((e,t)=>e+C(t.byteLength),0),g=p.reduce((e,t)=>e+C(t.byteLength),0),_=m.reduce((e,t)=>e+C(t.byteLength),0),v=u.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${u.turnCount} turn${u.turnCount===1?``:`s`} | ~${s.totalTokens.toLocaleString()} tokens`,y=u.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),b=u.toolResults.length,x=u.totalToolCallCount,ee=x===0?`Tool results (0): (none)`:b<x?`Tool results (${b} unique / ${x} calls, ~${s.toolTokens.toLocaleString()} tokens):`:`Tool results (${b}, ~${s.toolTokens.toLocaleString()} tokens):`,te=u.turnCount===0?[]:[`User (${s.userCount}): ~${s.userTokens.toLocaleString()} tokens`,`Assistant (${s.assistantCount}): ~${s.assistantTokens.toLocaleString()} tokens`,...s.systemTokens>0?[`System messages: ~${s.systemTokens.toLocaleString()} tokens`]:[],x>0?[ee,...y.map(e=>` ${e}`)].join(`
9
- `):ee],ne=u.turnCount===0?`${v}:\n (none)`:[`${v}:`,...te.map(e=>` ${e}`)].join(`
10
- `);return{success:!0,message:[`Context: ${r.usedTokens.toLocaleString()} / ${r.maxTokens.toLocaleString()} tokens (${Math.round(r.usedPercentage)}%)`,Ae(i,a),``,T(`System prompt (active every turn)`,h,f.map(w)),``,T(`Tool schemas (sent every turn)`,l,c.map(e=>e.name)),``,ne,``,T(`Manually added`,g,p.map(w)),``,T(`Prompt references (@-syntax)`,_,m.map(w))].join(`
11
- `),data:{references:d,history:{turnCount:u.turnCount,toolResults:u.toolResults},toolSchemaTokens:l}}}const E=[`Usage: /context [list] | add <path> | remove <path> | clear | auto on | off | <percent> | reset`,`Examples: /context list, /context add AGENTS.md, /context remove AGENTS.md, /context auto 85%`].join(`
12
- `);function Re(e){return e?`settings`:`current session only`}async function ze(t,n){let r=n.trim().split(/\s+/).filter(e=>e.length>0);if(r.length>0)return Be(t,r);let i=(0,e.readCommandContextState)(t),a=(0,e.readAutoCompactThreshold)(t),o=(0,e.readAutoCompactThresholdSource)(t),s=Pe(t.getSession().getFullHistory()),c=(0,e.listCommandContextReferences)(t);return{message:[`Context: ${i.usedTokens.toLocaleString()} / ${i.maxTokens.toLocaleString()} tokens (${Math.round(i.usedPercentage)}%)`,Ae(a,o),qe(c),`History: ${s.turnCount} turn${s.turnCount===1?``:`s`}`].join(`
13
- `),success:!0,data:{usedTokens:i.usedTokens,maxTokens:i.maxTokens,percentage:i.usedPercentage,autoCompactThreshold:a,autoCompactThresholdSource:o,references:c}}}async function Be(t,n){let[r,...i]=n;if(r===`list`)return i.length>0?{success:!1,message:E}:Le(t);if(r===`add`)return He(t,i);if(r===`remove`)return Ue(t,i);if(r===`clear`){if(i.length>0)return{success:!1,message:E};let n=(0,e.clearCommandContextReferences)(t);return{success:!0,message:`Context references cleared: ${n.removed.length} removed.`,data:{removed:n.removed}}}return r===`auto`?Ve(t,i):{success:!1,message:E}}function Ve(t,n){let[r,i]=n;if(i!==void 0)return{success:!1,message:E};if(r===void 0){let n=(0,e.readAutoCompactThreshold)(t),r=(0,e.readAutoCompactThresholdSource)(t);return{success:!0,message:[Ae(n,r),E].join(`
14
- `),data:{autoCompactThreshold:n,autoCompactThresholdSource:r}}}if(r===`on`)return We(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`enabled`);if(r===`off`)return We(t,!1,`disabled`);if(r===`reset`){let n=(0,e.resetAutoCompactThresholdSetting)(t);return(0,e.setCommandAutoCompactThreshold)(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`default`),{success:!0,message:`Auto compact reset to default: ${S(e.DEFAULT_AUTO_COMPACT_THRESHOLD)} (${Re(n)}).`,data:{autoCompactThreshold:e.DEFAULT_AUTO_COMPACT_THRESHOLD,autoCompactThresholdSource:`default`,persisted:n}}}let a=Ke(r);return a.success?We(t,a.threshold,`threshold set`):{success:!1,message:`${a.message}\n${E}`}}async function He(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:E};let i=await(0,e.addCommandContextReference)(t,r);return i.reference?{success:!0,message:[`Context reference added: ${w(i.reference)}.`,...i.evicted.length>0?[`Evicted ${i.evicted.length} older context reference(s).`]:[]].join(`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@robota-sdk/agent-framework"),t=require("@robota-sdk/agent-core"),n=require("node:fs"),r=require("node:net"),i=require("node:path"),a=require("@robota-sdk/agent-core/node"),o=require("node:os"),s=require("node:child_process"),c=require("@robota-sdk/agent-preset"),l=require("node:crypto");function u(e){let t=[],n=``,r,i=!1;for(let a of e){if(i){n+=a,i=!1;continue}if(r&&a===`\\`){i=!0;continue}if(r){a===r?r=void 0:n+=a;continue}if(a===`"`||a===`'`){r=a;continue}if(/\s/.test(a)){n.length>0&&(t.push(n),n=``);continue}n+=a}return n.length>0&&t.push(n),t}function d(e){let t=[],n,r,i;for(let a=0;a<e.length;a+=1){let o=e[a];if(o!==`--background`){if(o===`--agent`||o===`--type`||o===`-a`){n=e[a+1],a+=1;continue}if(o===`--model`){r=e[a+1],a+=1;continue}if(o===`--isolation`){let t=e[a+1];(t===`none`||t===`worktree`)&&(i=t),a+=1;continue}o!==void 0&&t.push(o)}}return{positional:t,...n?{agentType:n}:{},...r?{model:r}:{},...i?{isolation:i}:{}}}function f(e,t,n,r){return{agentType:t,label:n,mode:`background`,prompt:r,...e.model?{model:e.model}:{},...e.isolation?{isolation:e.isolation}:{}}}function p(t,n){let r=d(t),[i,...a]=r.positional,o=r.agentType??e.DEFAULT_AGENT_TYPE,s=r.positional;!r.agentType&&i&&n.has(i)&&(o=i,s=a);let c=s.join(` `).trim();if(c)return f(r,o,o,c)}function m(e,t){let n=d(e);return n.positional.map(e=>h(e,n,t)).filter(e=>e!==void 0)}function h(t,n,r){let i=t.indexOf(`=`);if(i>0)return g(t.slice(0,i),t.slice(i+1),n,r);let a=t.indexOf(`:`);if(a<=0||a===t.length-1)return;let o=t.slice(0,a),s=t.slice(a+1);return f(n,n.agentType??(r.has(o)?o:e.DEFAULT_AGENT_TYPE),o,s)}function g(t,n,r,i){let a=n.indexOf(`:`);if(a===-1)return f(r,r.agentType??(i.has(t)?t:e.DEFAULT_AGENT_TYPE),t,n);if(a!==0&&a!==n.length-1)return f(r,n.slice(0,a),t,n.slice(a+1))}function _(e){return e instanceof Error?e.message:String(e)}function v(e){return new Set(e.listAgentDefinitions().map(e=>e.name))}function y(e,t){let n=e.listAgentDefinitions();if(!n.some(e=>e.name===t))return{message:`Unknown agent type: ${t}\nAvailable agents: ${n.map(e=>e.name).join(`, `)}`,success:!1}}async function b(e,t){let n=y(e,t.agentType);if(n)return n;try{return{state:await e.spawnAgentJob(t)}}catch(e){return{message:_(e),success:!1}}}function x(){return{message:``,uiIntents:[{type:`show-agent-switcher`}],success:!0}}function S(e,t){return e.setDefaultAgentType(t),{message:`Default agent: ${t}`,success:!0,data:{agentType:t}}}async function C(e){let t=e.listAgentDefinitions(),n=e.listAgentJobs();return{message:[`Available agents:`,...t.map(e=>` ${e.name} - ${e.description}`),``,n.length===0?`No active agent jobs.`:`Agent jobs:`,...n.map(e=>` ${w(e)}`)].join(`
2
+ `),success:!0,data:{agents:t.length,jobs:n.length}}}function w(e){let t=[e.worktreePath?`worktree=${e.worktreePath}`:void 0,e.branchName?`branch=${e.branchName}`:void 0].filter(e=>e!==void 0),n=t.length>0?` ${t.join(` `)}`:``;return`${e.id} [${e.status}${n}] ${e.label} - ${e.promptPreview}`}async function ee(e,t){let n=p(t,v(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await b(e,n);if(`success`in r)return r;let{state:i}=r;return{message:`Started agent job: ${i.id}`,success:!0,data:{agentId:i.id,status:i.status}}}async function te(t,n){let r=n.includes(`--wait`)||!n.includes(`--detach`),i=m(n.filter(e=>e!==`--wait`&&e!==`--detach`),v(t));if(i.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let a=i.map(e=>y(t,e.agentType)).find(e=>e!==void 0);if(a)return a;let o;try{o=await Promise.all(i.map(e=>t.spawnAgentJob(e)))}catch(e){return{message:_(e),success:!1}}let s=t.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:o.map(e=>e.id),label:`agent parallel`});if(r){let n=(0,e.summarizeBackgroundJobGroup)(await t.waitBackgroundJobGroup(s.id));return{message:ce(n),success:!0,data:{agentIds:o.map(e=>e.id),groupId:s.id,summary:n}}}return{message:[`Started agent jobs:`,...o.map(e=>`${e.label}: ${e.id}`)].join(`
3
+ `),success:!0,data:{agentIds:o.map(e=>e.id),groupId:s.id}}}async function ne(t,n){let[r]=n;if(!r)return{message:`Usage: agent wait GROUP_ID`,success:!1};let i=(0,e.summarizeBackgroundJobGroup)(await t.waitBackgroundJobGroup(r));return{message:ce(i),success:!0,data:{groupId:r,summary:i}}}async function re(e,t){let[n,r]=t;if(!n)return{message:`Usage: agent read AGENT_ID [OFFSET]`,success:!1};let i=r?{offset:Number.parseInt(r,10)}:void 0,a=await e.readBackgroundTaskLog(n,i),o=a.nextCursor?`\nNext offset: ${a.nextCursor.offset}`:``;return{message:a.lines.length>0?`${a.lines.join(`
4
+ `)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function ie(e,t){let[n,...r]=t,i=r.join(` `).trim();return!n||!i?{message:`Usage: agent send AGENT_ID PROMPT`,success:!1}:(await e.sendAgentJob(n,i),{message:`Sent input to agent job: ${n}`,success:!0,data:{agentId:n}})}async function ae(e,t){let[n,...r]=t;return n?(await e.cancelAgentJob(n,r.join(` `)||void 0),{message:`Agent job stopped: ${n}`,success:!0,data:{agentId:n}}):{message:`Usage: agent stop AGENT_ID [REASON]`,success:!1}}async function oe(e,t){let[n]=t;return n?(await e.closeAgentJob(n),{message:`Agent job closed: ${n}`,success:!0,data:{agentId:n}}):{message:`Usage: agent close AGENT_ID`,success:!1}}async function se(e,t){try{if(t.trim()===``)return x();let[n=`list`,...r]=u(t);return n===`list`&&r.length===0?C(e):n===`run`?ee(e,r):n===`parallel`?te(e,r):n===`wait`?ne(e,r):n===`read`||n===`open`?re(e,r):n===`send`?ie(e,r):n===`stop`||n===`cancel`?ae(e,r):n===`close`?oe(e,r):r.length===0&&v(e).has(n)?S(e,n):ee(e,[n,...r])}catch(e){return{message:_(e),success:!1}}}function ce(e){return[`Background job group ${e.groupId}: ${e.status} (${e.completed}/${e.total} completed, ${e.failed} failed, ${e.cancelled} cancelled, ${e.pending} pending)`,...e.lines].join(`
5
+ `)}function le(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function ue(){return[{name:`list`,description:`List available agents and active jobs`,source:`agent`},{name:`run`,description:`Start one background agent job`,source:`agent`},{name:`parallel`,description:`Run multiple agents in parallel`,source:`agent`},{name:`wait`,description:`Wait for a background agent group summary`,source:`agent`},{name:`read`,description:`Read an agent job log page`,source:`agent`},{name:`send`,description:`Send follow-up input to an agent job`,source:`agent`},{name:`stop`,description:`Cancel a running agent job`,source:`agent`},{name:`close`,description:`Dismiss a terminal agent job`,source:`agent`},{name:`open`,description:`Read an agent job log page (alias for read)`,source:`agent`}]}function de(){return{name:`agent`,displayName:`Agent Jobs`,description:`Start and manage background subagent jobs`,modelDescription:[`Start and manage background subagent jobs.`,`Natural-language arguments start one background agent job.`,`When the user explicitly asks to create, run, spawn, delegate to, or use agents/subagents, start the requested agent command immediately and do not ask a follow-up question unless execution is impossible or unsafe.`,`If the target item is unspecified, include target selection inside the agent prompt instead of delaying execution.`,`The parallel form starts multiple background agent jobs as a wait_all group and returns a consolidated group summary unless --detach is present.`,`list, wait, read, send, stop, close, and open manage existing agent jobs.`,`Returns the started job id (or group summary), the job list, or the requested log page.`].join(` `),source:`agent`,modelInvocable:!0,argumentHint:`PROMPT | AGENT_NAME PROMPT | list | parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"] | wait GROUP_ID | read AGENT_ID [OFFSET] | send AGENT_ID PROMPT | stop AGENT_ID | close AGENT_ID`,safety:`background-agent`,subcommands:ue()}}function fe(){let e=de();return{name:e.name,semanticRole:`subagentSpawn`,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>se(le(e),t),...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands}}}var pe=class{name=`agent`;getCommands(){return[de()]}};function me(){return{name:`agent-command-agent`,commandSources:[new pe],systemCommands:[fe()],sessionRequirements:[`runtime`]}}function he(e){return e.trim().split(/\s+/).filter(Boolean)}async function ge(t,n){let[r=`list`,i,...a]=he(n);if(r===`list`){let n=(0,e.listCommandBackgroundTasks)(t);return{message:(0,e.formatCommandBackgroundTaskList)(n),success:!0,data:{count:n.length}}}if(!i)return{message:e.BACKGROUND_COMMAND_USAGE,success:!1};if(r===`read`||r===`log`||r===`open`){let n=await(0,e.readCommandBackgroundTaskLog)(t,i,(0,e.parseCommandBackgroundLogCursor)(a[0])),r=n.nextCursor?`\nNext offset: ${n.nextCursor.offset}`:``;return{message:n.lines.length>0?`${n.lines.join(`
6
+ `)}${r}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:n.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await(0,e.cancelCommandBackgroundTask)(t,i,a.join(` `)||void 0),{message:`Background task cancelled: ${i}`,success:!0,data:{taskId:i}}):r===`close`||r===`dismiss`?(await(0,e.closeCommandBackgroundTask)(t,i),{message:`Background task closed: ${i}`,success:!0,data:{taskId:i}}):{message:`Unknown background action: ${r}`,success:!1}}function _e(){return{name:`background`,displayName:`Background Tasks`,description:e.BACKGROUND_COMMAND_DESCRIPTION,source:`background`,modelInvocable:!1,subcommands:(0,e.buildBackgroundCommandSubcommands)()}}function ve(){let e=_e();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,subcommands:e.subcommands,execute:ge}}var ye=class{name=`background`;getCommands(){return[_e()]}};function be(){return{name:`agent-command-background`,commandSources:[new ye],systemCommands:[ve()]}}function xe(e){let t=e.trim();return t.length>0?t:void 0}async function Se(t,n){let{before:r,after:i,beforeMessageCount:a,afterMessageCount:o}=await(0,e.compactCommandContext)(t,xe(n)),s=a-o;return{message:[`Context compacted.`,` Removed messages: ${s} (${a>0?Math.round(s/a*100):0}% of total)`,` Context: ${Math.round(r.usedPercentage)}% → ${Math.round(i.usedPercentage)}%`].join(`
7
+ `),success:!0,data:{before:r,after:i,beforeMessageCount:a,afterMessageCount:o}}}function Ce(){return{name:`compact`,displayName:`Compact Context`,description:`Compress context window`,modelDescription:`Summarize older conversation turns to free context-window space. Use it when the context is nearly full (check with the context command) or before starting a large new task; optional instructions say what the summary must keep. Returns how many messages were removed and the context usage before and after.`,source:`compact`,modelInvocable:!0,argumentHint:`[instructions]`,safety:`write`,example:`/compact Summarize the current context`}}function we(){let e=Ce();return{name:e.name,semanticRole:`contextReduction`,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},example:e.example,requiresPermission:!1,userInvocable:!0,modelInvocable:e.modelInvocable,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`blocking`,execute:Se}}var Te=class{name=`compact`;getCommands(){return[Ce()]}};function Ee(){return{name:`agent-command-compact`,commandSources:[new Te],systemCommands:[we()]}}function T(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function De(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${T(e)} (${t})`}function E(e){return Math.ceil(e/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN)}function D(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${E(e.byteLength).toLocaleString()} tokens`].join(` `)}function Oe(e){try{return JSON.parse(e)}catch{return null}}function ke(e){let t=Oe(e);if(t===null)return``;let n=Object.values(t)[0],r=typeof n==`string`?n:JSON.stringify(n);return r.length>60?`${r.slice(0,60)}…`:r}function Ae(e){let n=0,r=0,i=0,a=0,o=0,s=0,c=0;for(let l of e){let e=Math.ceil(JSON.stringify(l).length/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN);l.role===`system`?n+=e:l.role===`user`?(r+=e,i++):l.role===`assistant`?(a+=e,o++):l.role===`tool`&&(s+=e,c++)}return{systemTokens:n,userTokens:r,userCount:i,assistantTokens:a,assistantCount:o,toolTokens:s,toolCallCount:c,totalTokens:n+r+a+s}}function je(e){return Ne(e.filter(e=>e.category===`chat`).map(e=>({type:e.type,data:e.data})))}function Me(e){return Ne(e.map(e=>({type:e.role,data:e})))}function Ne(e){let t=new Map;for(let n of e){if(n.type!==`assistant`)continue;let e=n.data;for(let n of e.toolCalls??[])t.set(n.id,{name:n.function.name,firstArg:ke(n.function.arguments)})}let n=0,r=0,i=new Map;for(let a of e)if(a.type===`user`)n++;else if(a.type===`tool`){let e=a.data,n=t.get(e.toolCallId??``),o=n?.name??`tool`,s=n?.firstArg??``;r++,i.set(`${o}:${s}`,{toolName:o,displayArg:s})}return{turnCount:n,toolResults:[...i.values()],totalToolCallCount:r}}function Pe(e,t,n){let r=`${e}${t>0?` — ~${t.toLocaleString()} tokens`:``}:`;return n.length===0?`${r}\n (none)`:[r,...n.map(e=>` ${e}`)].join(`
8
+ `)}function Fe(n){let r=(0,e.readCommandContextState)(n),i=(0,e.readAutoCompactThreshold)(n),a=(0,e.readAutoCompactThresholdSource)(n),o=n.getSession().getHistory(),s=Ae(o),c=n.getSession().getOfferedToolSchemas(),l=(0,t.estimateToolSchemaTokens)(c),u=Me(o),d=(0,e.listCommandContextReferences)(n),f=d.filter(e=>e.loadType===`system`),p=d.filter(e=>e.loadType===`manual`),m=d.filter(e=>e.loadType===`prompt-reference`),h=f.reduce((e,t)=>e+E(t.byteLength),0),g=p.reduce((e,t)=>e+E(t.byteLength),0),_=m.reduce((e,t)=>e+E(t.byteLength),0),v=u.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${u.turnCount} turn${u.turnCount===1?``:`s`} | ~${s.totalTokens.toLocaleString()} tokens`,y=u.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),b=u.toolResults.length,x=u.totalToolCallCount,S=x===0?`Tool results (0): (none)`:b<x?`Tool results (${b} unique / ${x} calls, ~${s.toolTokens.toLocaleString()} tokens):`:`Tool results (${b}, ~${s.toolTokens.toLocaleString()} tokens):`,C=u.turnCount===0?[]:[`User (${s.userCount}): ~${s.userTokens.toLocaleString()} tokens`,`Assistant (${s.assistantCount}): ~${s.assistantTokens.toLocaleString()} tokens`,...s.systemTokens>0?[`System messages: ~${s.systemTokens.toLocaleString()} tokens`]:[],x>0?[S,...y.map(e=>` ${e}`)].join(`
9
+ `):S],w=u.turnCount===0?`${v}:\n (none)`:[`${v}:`,...C.map(e=>` ${e}`)].join(`
10
+ `);return{success:!0,message:[`Context: ${r.usedTokens.toLocaleString()} / ${r.maxTokens.toLocaleString()} tokens (${Math.round(r.usedPercentage)}%)`,De(i,a),``,Pe(`System prompt (active every turn)`,h,f.map(D)),``,Pe(`Tool schemas (sent every turn)`,l,c.map(e=>e.name)),``,w,``,Pe(`Manually added`,g,p.map(D)),``,Pe(`Prompt references (@-syntax)`,_,m.map(D))].join(`
11
+ `),data:{references:d,history:{turnCount:u.turnCount,toolResults:u.toolResults},toolSchemaTokens:l}}}const O=[`Usage: /context [list] | add <path> | remove <path> | clear | auto on | off | <percent> | reset`,`Examples: /context list, /context add AGENTS.md, /context remove AGENTS.md, /context auto 85%`].join(`
12
+ `);function Ie(e){return e?`settings`:`current session only`}async function Le(t,n){let r=n.trim().split(/\s+/).filter(e=>e.length>0);if(r.length>0)return Re(t,r);let i=(0,e.readCommandContextState)(t),a=(0,e.readAutoCompactThreshold)(t),o=(0,e.readAutoCompactThresholdSource)(t),s=je(t.getSession().getFullHistory()),c=(0,e.listCommandContextReferences)(t);return{message:[`Context: ${i.usedTokens.toLocaleString()} / ${i.maxTokens.toLocaleString()} tokens (${Math.round(i.usedPercentage)}%)`,De(a,o),Ge(c),`History: ${s.turnCount} turn${s.turnCount===1?``:`s`}`].join(`
13
+ `),success:!0,data:{usedTokens:i.usedTokens,maxTokens:i.maxTokens,percentage:i.usedPercentage,autoCompactThreshold:a,autoCompactThresholdSource:o,references:c}}}async function Re(t,n){let[r,...i]=n;if(r===`list`)return i.length>0?{success:!1,message:O}:Fe(t);if(r===`add`)return Be(t,i);if(r===`remove`)return Ve(t,i);if(r===`clear`){if(i.length>0)return{success:!1,message:O};let n=(0,e.clearCommandContextReferences)(t);return{success:!0,message:`Context references cleared: ${n.removed.length} removed.`,data:{removed:n.removed}}}return r===`auto`?ze(t,i):{success:!1,message:O}}function ze(t,n){let[r,i]=n;if(i!==void 0)return{success:!1,message:O};if(r===void 0){let n=(0,e.readAutoCompactThreshold)(t),r=(0,e.readAutoCompactThresholdSource)(t);return{success:!0,message:[De(n,r),O].join(`
14
+ `),data:{autoCompactThreshold:n,autoCompactThresholdSource:r}}}if(r===`on`)return He(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`enabled`);if(r===`off`)return He(t,!1,`disabled`);if(r===`reset`){let n=(0,e.resetAutoCompactThresholdSetting)(t);return(0,e.setCommandAutoCompactThreshold)(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`default`),{success:!0,message:`Auto compact reset to default: ${T(e.DEFAULT_AUTO_COMPACT_THRESHOLD)} (${Ie(n)}).`,data:{autoCompactThreshold:e.DEFAULT_AUTO_COMPACT_THRESHOLD,autoCompactThresholdSource:`default`,persisted:n}}}let a=We(r);return a.success?He(t,a.threshold,`threshold set`):{success:!1,message:`${a.message}\n${O}`}}async function Be(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:O};let i=await(0,e.addCommandContextReference)(t,r);return i.reference?{success:!0,message:[`Context reference added: ${D(i.reference)}.`,...i.evicted.length>0?[`Evicted ${i.evicted.length} older context reference(s).`]:[]].join(`
15
15
  `),data:{reference:i.reference,evicted:i.evicted}}:{success:!1,message:i.diagnostics.join(`
16
- `)||`Context reference not found: ${r}`,data:{diagnostics:i.diagnostics}}}function Ue(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:E};let i=(0,e.removeCommandContextReference)(t,r);return i.removed?{success:!0,message:`Context reference removed: ${w(i.removed)}.`,data:{removed:i.removed}}:{success:!1,message:`Context reference not found: ${r}`}}function We(t,n,r){let i=(0,e.writeAutoCompactThresholdSetting)(t,n),a=i?`settings`:`session`;return(0,e.setCommandAutoCompactThreshold)(t,n,a),{success:!0,message:Ge(r,n,i),data:{autoCompactThreshold:n,autoCompactThresholdSource:a,persisted:i}}}function Ge(e,t,n){let r=Re(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${S(t)} (${r}).`:`Auto compact threshold set to ${S(t)} (${r}).`}function Ke(e){if(e.endsWith(`%`)){let t=Number(e.slice(0,-1));return!Number.isFinite(t)||t<=0||t>100?{success:!1,message:`Auto compact percentage must be greater than 0% and at most 100%.`}:{success:!0,threshold:t/100}}if(e.includes(`.`)){let t=Number(e);return!Number.isFinite(t)||t<=0||t>1?{success:!1,message:`Auto compact fraction must be greater than 0 and at most 1.`}:{success:!0,threshold:t}}return{success:!1,message:`Use a percentage such as 85% or a fraction such as 0.85.`}}function qe(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function D(e,t){return{name:e.name,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,...e.example===void 0?{}:{example:e.example},...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands},...e.runner===void 0?{}:{runner:e.runner},...e.surfaces===void 0?{}:{surfaces:e.surfaces},...t.semanticRole===void 0?{}:{semanticRole:t.semanticRole},lifecycle:t.lifecycle,requiresPermission:t.requiresPermission,execute:t.execute}}function Je(){return{name:`context`,displayName:`Context References`,description:`Context window info, reference inventory, and auto-compact controls`,modelDescription:"Inspect the context window. Use it before a large task or before deciding to compact, or to see which files the user pinned into context. Bare returns used/max tokens and percentage, the auto-compact threshold, the pinned-reference summary and the turn count; `list` returns the per-category token breakdown and every pinned reference.",source:`context`,modelInvocable:!0,userInvocable:!0,argumentHint:`list | add <path> | remove <path> | clear | auto ...`,subcommands:[{name:`list`,description:`List loaded context references`,source:`context`,modelInvocable:!0},{name:`add`,description:`Add a file to active context references`,source:`context`,modelInvocable:!1},{name:`remove`,description:`Remove a context reference`,source:`context`,modelInvocable:!1},{name:`clear`,description:`Clear context references`,source:`context`,modelInvocable:!1},{name:`auto`,description:`Inspect or change auto-compact policy`,source:`context`,modelInvocable:!1}]}}function Ye(){return D(Je(),{requiresPermission:!1,lifecycle:`inline`,execute:ze})}var Xe=class{name=`context`;getCommands(){return[Je()]}};function Ze(){return{name:`agent-command-context`,commandSources:[new Xe],systemCommands:[Ye()]}}function Qe(){return{name:`devices`,displayName:`Devices`,description:`Manage this device's identity among the user's devices: list the roster with the device mesh status (whether it is on, how this device finds the others, which are linked), create the identity and its recovery phrase (init, for the user's first device only: on a device of a user who already has others it makes a separate identity that can never link to them), enrol another device (add shows a one-time code; join on the new device reads it), revoke a device, or rotate the signing key from the phrase. A new identity or new lists take effect in the running session's device mesh at once. Operator-only; the phrase and the enrollment code are handled on the terminal only, and results carry only device ids and names.`,source:`devices`,modelInvocable:!1,userInvocable:!0,argumentHint:`[list|init [name]|add|join [name]|revoke <device-id>|recover]`,subcommands:[{name:`list`,description:`List your devices and the device mesh status`,source:`devices`},{name:`init`,description:`Create your device identity and recovery phrase, on your first device only (on another, a separate identity that can never link to your devices; use add/join there)`,source:`devices`,argumentHint:`[name]`},{name:`revoke`,description:`Revoke a device with the signing key`,source:`devices`,argumentHint:`<device-id>`},{name:`recover`,description:`Rotate the signing key from your recovery phrase`,source:`devices`},{name:`add`,description:`Enrol another device: show a one-time code for it`,source:`devices`},{name:`join`,description:`Join your devices with the code another device shows`,source:`devices`,argumentHint:`[name]`}]}}const $e={"no-terminal":`This needs an interactive terminal; the recovery phrase is never shown or read anywhere else.`,"not-initialized":"This device has no identity yet. If your other devices are already linked, run `/devices add` there and `/devices join` here, typing the code it shows. Run `/devices init` only when setting up your first device: it creates a separate identity that cannot link to an existing device group.","already-initialized":"This device already has an identity. Use `/devices recover` to rotate its signing key.",cancelled:`Cancelled. Nothing was changed.`,"confirmation-failed":`The confirmation did not match. Nothing was changed.`,"phrase-invalid":`That is not a valid recovery phrase. Nothing was changed.`,"phrase-mismatch":`That phrase (with that passphrase) belongs to a different identity than this device. Nothing was changed.`,"no-signing-key":"This device does not hold the signing key. Revoke from a device that does, or `/devices recover`.","signing-key-expired":"The signing key on this device has expired. Run `/devices recover` to issue a new one.","unknown-device":`No device in the roster has that id.`,"ambiguous-device":`More than one device starts with that id; give more of it.`,"self-revocation":"This device cannot revoke itself. Revoke it from another device, or `/devices recover`.","changed-concurrently":`The device identity changed in another session while this was waiting. Nothing was changed; try again.`,"no-relay":"Enrolling a device needs a signaling relay. Set `transports.webrtc.options.relayUrl` in your settings on both devices.","code-invalid":`That is not an enrollment code. Nothing was changed.`,"code-on-command-line":"Do not put the code on the command line, where history keeps it. Run `/devices add` again on the other device for a new code, then `/devices join` here and type it at the prompt.","code-not-accepted":"No device accepted that code: it is wrong, expired or already used, or the connection was tampered with. Run `/devices add` on the other device for a new code.","enrollment-expired":`The code expired before a device joined. Nothing was changed.`,"too-many-attempts":"Too many attempts failed to prove the code, so it no longer works. Nothing was changed; run `/devices add` again.","enrollment-declined":`The enrollment was declined. Nothing was changed.`,"enrollment-timed-out":`Nobody answered in time. Nothing was changed.`,"enrollment-failed":`The signaling relay or the connection to the other device failed before the enrollment finished. Nothing was changed; try again.`};function O(e){return e.slice(0,10)}function et(e){return new Date(e).toISOString().slice(0,10)}function tt(e){return{success:!1,message:$e[e]}}function nt(e){if(e.state===`off`)return["Device mesh: off. Set `transports.mesh.enabled` to true in your user settings to link your devices."];if(e.state===`failed`)return[`Device mesh: could not start: ${e.reason??`no reason was reported`}.`];let t=e.sources.length>0?`; finds devices by ${e.sources.join(`, `)}`:``,n=e.linked.map(e=>` ${O(e.deviceId)} ${e.name??``} ${e.locality===`same-host`?`on this machine`:`on another machine`}`);return[`Device mesh: ${e.state}${t}.`,...n.length>0?[`Linked now:`,...n]:[`No device is linked right now.`]]}function rt(e,t){if(e===void 0)return{success:!0,message:$e[`not-initialized`]};let n=e.devices.map(e=>{let t=[...e.thisDevice?[`this device`]:[],...e.holdsSigningKey?[`holds the signing key`]:[]],n=t.length>0?` (${t.join(`, `)})`:``;return` ${O(e.deviceId)} ${e.name}${n} certificate expires ${et(e.certificateExpiresAt)}`});return{success:!0,message:[`Devices of user ${O(e.userId)}:`,...n,`${e.revokedDeviceCount} revoked. Roster and revocation list valid until ${new Date(e.listsExpireAt).toISOString()}.`,...t===void 0?[]:nt(t)].join(`
17
- `)}}function it(e){return e.getCommandInvocationSource()===`user`}async function k(e,t,n){if(!e.canHandoffTerminal())return tt(`no-terminal`);try{let r=await e.runWithTerminal(t);return r.ok?{success:!0,message:n(r.value)}:tt(r.reason)}catch(e){return{success:!1,message:`Device identity operation failed: ${e instanceof Error?e.message:`unknown error`}`}}}async function at(e,t,n){if(!it(t))return{success:!1,message:"`/devices` runs only for the operator at this terminal, never from a remote surface or the model."};let r=n.trim(),i=r.indexOf(` `),a=(i===-1?r:r.slice(0,i)).toLowerCase(),o=i===-1?``:r.slice(i+1).trim();switch(a){case``:case`list`:try{return rt(await e.list(),e.meshStatus?.())}catch(e){return{success:!1,message:`Device identity could not be read: ${e instanceof Error?e.message:`unknown error`}`}}case`init`:return k(t,()=>e.init(o.length>0?{name:o}:{}),e=>[`Device identity created. This device: ${O(e.deviceId)}; user ${O(e.userId)}.`,`It holds signing key ${O(e.signingKeyId)}.`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`],`Keep the recovery phrase offline; it is the only way to recover this identity.`].join(`
18
- `));case`recover`:return k(t,()=>e.recover(),e=>[`Recovered. New signing key ${O(e.signingKeyId)}; ${e.revokedSigningKeyCount} old signing key(s) revoked.`,`This device (${O(e.deviceId)}) is certified again.`,...e.droppedDeviceCount>0?[`${e.droppedDeviceCount} other device(s) were certified by a retired signing key and must enrol again.`]:[]].join(`
19
- `));case`revoke`:return o.length===0?{success:!1,message:`Usage: /devices revoke <device-id>`}:k(t,()=>e.revoke(o),e=>`Revoked ${e.name} (${O(e.deviceId)}). A new roster and revocation list were issued.`);case`add`:return k(t,()=>e.add(),e=>[`Enrolled ${e.name} (${O(e.deviceId)}). A new roster was issued.`,...e.confirmed?[]:["The new device did not confirm it kept its identity; check `/devices` there."]].join(`
20
- `));case`join`:return k(t,()=>e.join(o.length>0?{name:o}:{}),e=>[`Joined the devices of user ${O(e.userId)}. This device: ${e.name} (${O(e.deviceId)}).`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`]].join(`
21
- `));default:return{success:!1,message:`Unknown argument "${a}". Usage: /devices [list|init [name]|add|join [name]|revoke <device-id>|recover]`}}}var ot=class{name=`devices`;getCommands(){return[Qe()]}};function st(e){let t=D(Qe(),{requiresPermission:!1,lifecycle:`inline`,execute:(t,n)=>at(e,t,n)});return{name:`agent-command-devices`,commandSources:[new ot],systemCommands:[t]}}const ct=3e3;function lt(e,t){return new Promise(n=>{let i=Date.now(),a=(0,r.createConnection)({host:e,port:t}),o=setTimeout(()=>{a.destroy(),n({reachable:!1,error:`timeout (${ct/1e3}s)`})},ct);a.on(`connect`,()=>{clearTimeout(o),a.destroy(),n({reachable:!0,elapsedMs:Date.now()-i})}),a.on(`error`,e=>{clearTimeout(o),n({reachable:!1,error:e.message})})})}function ut(e){if(!(0,n.existsSync)(e))return{exists:!1,isDirectory:!1,writable:!1};let t;try{t=(0,n.statSync)(e)}catch{return{exists:!0,isDirectory:!1,writable:!1}}let r=t.isDirectory(),i=t.mode&511,a=!1;try{(0,n.accessSync)(e,n.constants.W_OK),a=!0}catch{a=!1}return{exists:!0,isDirectory:r,writable:a,mode:i}}function dt(e,t=process.env){let r=e.trim().split(/\s+/)[0];if(r===void 0||r.length===0)return!1;if((0,i.isAbsolute)(r)||r.includes(`/`))return(0,n.existsSync)(r);let a=process.platform===`win32`?[``,`.exe`,`.cmd`,`.bat`]:[``];return(t.PATH??``).split(i.delimiter).filter(e=>e.length>0).some(e=>a.some(t=>(0,n.existsSync)((0,i.join)(e,r+t))))}function ft(e=process.env){return{probeEndpoint:lt,inspectPath:ut,resolveCommand:t=>dt(t,e),ownerOnlyGuarantee:()=>(0,a.ownerOnlyGuarantee)()}}const pt={ok:`✓`,warn:`⚠`,fail:`✗`,"not-configured":`○`,"not-probed":`–`};function mt(e,t){let n=[` ${pt[e.status]} ${e.label} [${e.id}] ${e.status}${e.cause===void 0?``:`: ${e.cause}`}`];e.path!==void 0&&n.push(` path: ${e.path}`);for(let t of e.detail??[])n.push(` ${t}`);if(e.repair!==void 0){let r=t.formatRepairCommand?.(e.repair);n.push(` repair: ${r??`request repair for ${e.repair} through your host`}`)}return n}function ht(e,t){let n=t.productName?.trim();return e.failCount===0&&e.warnCount===0?n?`✓ All checks passed. ${n} is ready to use.`:`✓ All checks passed.`:e.failCount>0?n?`✗ ${e.failCount} issue(s) found. Fix the items above to use ${n}.`:`✗ ${e.failCount} issue(s) found. Fix the items above before use.`:n?`⚠ ${e.warnCount} warning(s). ${n} may work but check the items above.`:`⚠ ${e.warnCount} warning(s). Check the items above.`}function gt(e,t=`Doctor`,n={}){let r=[``,t,``,...e.checks.flatMap(e=>mt(e,n)),``,ht(e,n)];return e.repairable.length>0&&r.push(` repairable: ${e.repairable.join(`, `)} — ${n.repairOffer??`ask your host to apply a repair`}`),r.push(``),r}const _t=`[redacted]`,vt=/(\b[a-z][a-z0-9+.-]{0,31}:\/\/)([^\s/@]+)@/gi,yt=/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,bt=/\b(?:sk-[A-Za-z0-9_-]{8,}|AIza[0-9A-Za-z_-]{20,}|ghp_[A-Za-z0-9]{20,}|xox[abprs]-[A-Za-z0-9-]{10,})\b/g,xt=/\.\.\."[^"]*"\.\.\./g;function St(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Ct(e,t=[]){let n=e,r=new Set;for(let e of t)typeof e!=`string`||e.length<4||r.has(e)||(r.add(e),n=n.replace(new RegExp(St(e),`g`),_t));return n=n.replace(vt,`$1${_t}@`),n=n.replace(yt,`$1 ${_t}`),n=n.replace(bt,_t),n}function wt(t){return t instanceof e.SettingsParseError?`${t.name}: ${t.filePath} is not valid JSON (see the settings check)`:`${t.name}: ${t.message.replace(xt,`…`)}`}function Tt(e,t){let n=new Set,r=e=>{if(e!==void 0){if(e.startsWith(`$ENV:`)){let r=t[e.slice(5).trim()];r!==void 0&&n.add(r);return}n.add(e)}};for(let t of e)if(t!==void 0){r(t.provider?.apiKey);for(let e of Object.values(t.providers??{}))r(e.apiKey);for(let e of Object.values(t.env??{}))n.add(e)}return[...n]}function Et(e){let t=(0,i.basename)((0,i.dirname)(e.kind===`host`?e.path:e.relativePath)).replace(/^\./,``);return`settings.${e.scope}.${t}`}function Dt(e){let t=e.settingsSources.find(t=>t.kind===`host`&&t.path===e.userSettingsPath);return t===void 0?void 0:Et(t)}function Ot(e){let t=e.cause;if(t===void 0)return e.state;switch(t.state){case`unreadable`:return t.errno===void 0?`unreadable`:`unreadable (${t.errno})`;case`invalid-json`:return t.offset===void 0?`invalid-json`:`invalid-json at offset ${t.offset}`;case`schema-invalid`:return`schema-invalid: ${(t.issues??[]).map(e=>`${e.path} (${e.code})`).join(`, `)}`;default:return t.state}}function kt(e,t){return e.source.kind===`host`&&e.source.path===t.userSettingsPath&&e.state===`empty`}function At(e,t){let n=Et(e.source),r=e.source.kind===`host`?e.source.path:e.source.relativePath;if(e.state===`absent`)return{id:n,label:`Settings layer`,status:`not-configured`,path:r,cause:`absent`};if(e.state===`ok`)return{id:n,label:`Settings layer`,status:`ok`,path:r,cause:`ok`};let i=kt(e,t);return{id:n,label:`Settings layer`,status:`fail`,path:r,cause:Ot(e),detail:i?[`The file exists but holds nothing; rewriting it as {} loses no content.`]:[`Session start will refuse this configuration. Fix the file at the named path.`],...i?{repair:n}:{}}}function jt(e){let t=[...e.provenance.map(e=>`${e.key}: ${e.rule} ← ${e.contributors.join(` → `)}`),...e.hookSources.map((e,t)=>`settings hook ${t+1}: ${e.event}/${e.type} ← ${e.source}`)];return e.partial?{id:`settings.merge`,label:`Merged settings`,status:`warn`,cause:`partial — a present layer is broken; session start will refuse this configuration`,detail:t.length===0?[`(no key declared by a healthy layer)`]:t}:{id:`settings.merge`,label:`Merged settings`,status:`ok`,cause:`${e.provenance.length} key(s) from ${e.layers.filter(e=>e.state===`ok`).length} layer(s)`,detail:t.length===0?[`(no settings declared)`]:t}}function Mt(t){let n=(0,e.inspectSettingsLayers)(t.settingsSources);return{inspection:n,checks:[...n.layers.map(e=>At(e,t)),jt(n)]}}function Nt(e){let t=e.source===`env-default`?`env-default via ${e.sourceEnvVar??`environment`}`:`settings profile`;return{id:`provider.resolution`,label:`Provider`,status:`ok`,cause:`${e.name} (${e.model}) — ${t}`}}function Pt(e,n){let r=(0,t.findProviderDefinition)(n.providerDefinitions,e.name),i=e.baseURL??r?.defaults?.baseURL;if(i!==void 0)try{let t=new URL(i),n=t.port===``?t.protocol===`http:`?80:443:Number(t.port);return{host:t.hostname,port:n,origin:e.baseURL===void 0?`definition defaults.baseURL`:`profile baseURL`}}catch{return}let a=r?.endpoint;return a===void 0?void 0:{...a,origin:`definition endpoint`}}async function Ft(e,t,n){let r=Pt(e,t);if(r===void 0)return{id:`provider.reachability`,label:`Provider reachability`,status:`warn`,cause:`not checked: ${e.name} declares no endpoint (no profile baseURL, defaults.baseURL or definition endpoint)`};let i=await n.probeEndpoint(r.host,r.port),a=`${r.host}:${r.port} (${r.origin})`;return i.reachable?{id:`provider.reachability`,label:`Provider reachability`,status:`ok`,cause:`${a} reachable in ${i.elapsedMs??0}ms`}:{id:`provider.reachability`,label:`Provider reachability`,status:`warn`,cause:`${a} unreachable: ${i.error??`connection failed`}`,detail:[`Check proxy settings, firewall, or the profile baseURL.`]}}async function It(t,n){let r;try{r=(0,e.readProviderSettings)(t.settingsSources,{providerDefinitions:t.providerDefinitions,env:{...t.env}})}catch(e){return{checks:[{id:`provider.resolution`,label:`Provider`,status:`fail`,cause:wt(e instanceof Error?e:Error(String(e))),detail:[t.diagnosticGuidance?.providerResolution??`Configure a provider or set its API key environment variable.`]}]}}return{checks:[Nt(r),await Ft(r,t,n)],...r.apiKey===void 0?{}:{resolvedApiKey:r.apiKey}}}function Lt(e,t){let{root:n,sessions:r}=e.userStorage,i=[t.inspectPath(n),t.inspectPath(r)];return i.some(e=>!e.exists)?`missing`:i.some(e=>!e.isDirectory||!e.writable)?`unwritable`:t.ownerOnlyGuarantee()===`posix-mode`?i.some(e=>e.mode!==void 0&&(e.mode&63)!=0)?`too-open`:`ok`:`mode-not-probed`}function Rt(e,t){let{root:n,sessions:r}=e.userStorage,i={id:`storage.user`,label:`User storage`,path:n};switch(Lt(e,t)){case`missing`:return{...i,status:`warn`,cause:`not initialized (created on first write)`,detail:[n,r],repair:`storage.user`};case`unwritable`:return{...i,status:`fail`,cause:`exists but is not a writable directory`,detail:[n,r]};case`too-open`:return{...i,status:`warn`,cause:`not owner-only (mode allows group/other access)`,detail:[n,r],repair:`storage.user`};case`mode-not-probed`:return{...i,status:`not-probed`,cause:`owner-only mode is not asserted on this platform (windows-acl)`};default:return{...i,status:`ok`,cause:`writable, owner-only`}}}function zt(e,t){if(e.projectAccess.status!==`trusted`)return{id:`storage.project`,label:`Project storage`,status:`not-configured`,cause:`project sources are disabled in an untrusted workspace`};let n=e.projectStorageRoot;if(n===void 0)return{id:`storage.project`,label:`Project storage`,status:`not-configured`,cause:`the host names no project state root`};let r=t.inspectPath(n);return r.exists?r.isDirectory&&r.writable?{id:`storage.project`,label:`Project storage`,status:`ok`,path:n,cause:`writable`}:{id:`storage.project`,label:`Project storage`,status:`fail`,path:n,cause:`exists but is not a writable directory`}:{id:`storage.project`,label:`Project storage`,status:`not-configured`,path:n,cause:`absent (created on first write)`}}function Bt(e){let t=e.projectAccess;if(t.status===`trusted`)return{id:`workspace.trust`,label:`Workspace trust`,status:`ok`,path:t.identity.displayPath,cause:`trusted`};let n=t.cause===void 0?t.trustState:`${t.trustState}: ${t.cause.name}: ${t.cause.message}`;return{id:`workspace.trust`,label:`Workspace trust`,status:t.trustState===`store-unavailable`||t.trustState===`identity-unavailable`?`fail`:`warn`,...t.displayPath===void 0?{}:{path:t.displayPath},cause:n,detail:[e.diagnosticGuidance?.projectTrust??`Project sources are disabled. Approve this workspace with the host.`]}}function Vt(e){let t=new Map,n=!1;for(let r of e.layers)for(let[e,i]of Object.entries(r.settings?.providers??{})){let r=t.get(e);r?.apiKey!==void 0&&i.baseURL!==void 0&&i.baseURL!==r.baseURL&&i.apiKey===void 0&&(n=!0),t.set(e,{baseURL:i.baseURL??r?.baseURL,apiKey:i.apiKey??r?.apiKey})}return n?{id:`provider.security`,label:`Provider security`,status:`warn`,cause:`provider endpoint quarantined; inherited credential removed (credential redacted)`}:void 0}function Ht(e,t,n){let r=Vt(n);return[Bt(e),Rt(e,t),zt(e,t),...r===void 0?[]:[r]]}const Ut=`storage.user`;function Wt(e){let t=Dt(e);return t===void 0?[Ut]:[t,Ut]}function Gt(e,t){return Wt(t).includes(e)}function Kt(t,n){let r=(0,e.inspectSettingsLayers)(n.settingsSources).layers.find(e=>Et(e.source)===t);return r===void 0||r.source.kind!==`host`?{ok:!1,reason:`${t}: no user settings layer in this composition`}:kt(r,n)?{ok:!0,plan:{id:t,description:`rewrite the empty user settings file as {}`,path:r.source.path}}:{ok:!1,reason:`${t}: state is ${r.state}; only an empty file is rewritten`}}function qt(e,t){let n=Lt(e,t),{root:r}=e.userStorage;return n!==`missing`&&n!==`too-open`?{ok:!1,reason:`storage.user: state is ${n}; only a missing or too-open directory is repaired`}:{ok:!0,plan:{id:`storage.user`,description:`create the user store root and its sessions directory as owner-only directories`,path:r}}}function Jt(e,t,n){return Gt(e,t)?e===`storage.user`?qt(t,n):Kt(e,t):{ok:!1,reason:`${e}: not a repairable check (allowlist: ${Wt(t).join(`, `)})`}}async function Yt(t,n,r,i){let o=Jt(t,n,r);if(!o.ok)return{applied:!1,reason:o.reason};if(!await i(o.plan))return{applied:!1,reason:`${t}: repair not confirmed; nothing written`};let s=Jt(t,n,r);if(!s.ok)return{applied:!1,reason:`${s.reason} (state changed before the write)`};if(s.plan.id===`storage.user`){let{root:e,sessions:t}=n.userStorage;(0,a.ensureOwnerOnlyDirectory)(t,{withinRoot:e})}else(0,e.writeSettings)(s.plan.path,{});return{applied:!0,plan:s.plan}}const Xt={"manifest-unreadable":`manifest could not be parsed`,"manifest-invalid":`manifest is not a valid plugin.json (name, version, description required)`,"load-failed":`plugin assets could not be loaded`};function Zt(e){let t=[],n=e.reduce((e,t)=>e+t.loaded.length,0),r=e.filter(e=>e.cacheDirPresent);t.push(r.length===0?{id:`plugins`,label:`Plugins`,status:`not-configured`,cause:`no plugin cache directory`,detail:e.map(e=>e.pluginsDir)}:{id:`plugins`,label:`Plugins`,status:`ok`,cause:`${n} plugin(s) loaded`,detail:r.map(e=>`${e.pluginsDir}: ${e.loaded.length} loaded, ${e.skipped.length} skipped`)});for(let n of e){for(let e of n.skipped)e.reason!==`disabled`&&t.push({id:`plugin.${e.pluginId}`,label:`Plugin`,status:`fail`,path:e.manifestPath,cause:Xt[e.reason]??e.reason,...e.detail===void 0?{}:{detail:[e.detail]}});for(let e of n.hookIssues)t.push({id:`plugin.${e.pluginId}.hooks`,label:`Plugin hooks`,status:`warn`,path:e.hooksPath,cause:`hooks.json fails the hooks schema: ${e.issues.map(e=>`${e.path} (${e.code})`).join(`, `)}`,detail:[`Report-only: the plugin still loads; these hooks may not run.`]})}return t}function Qt(t){let n=(0,e.inspectSkillSources)(t.contributionSources,t.skillRoots).roots.filter(e=>e.present),r=n.reduce((e,t)=>e+t.discovered.length,0),i=[n.length===0?{id:`skills`,label:`Skills and commands`,status:`not-configured`,cause:`no skill or command root present`}:{id:`skills`,label:`Skills and commands`,status:`ok`,cause:`${r} discovered`,detail:n.map(e=>`${e.sourceDisplayName}: ${e.root} (${e.discovered.length})`)}];for(let e of n)for(let t of e.skipped)i.push({id:`skill.${t.path}`,label:`Skill definition`,status:t.reason===`frontmatter-invalid`?`fail`:`warn`,path:`${e.sourceDisplayName}: ${t.path}`,cause:t.reason,...t.detail===void 0?{}:{detail:[t.detail]}});return i}function $t(e,t){let n=[],r=e=>{if(e!==void 0)for(let t of Object.values(e))for(let e of t??[])for(let t of e.hooks??[])t.type===`command`&&typeof t.command==`string`&&n.push(t.command)};r(e.merged.hooks);for(let e of t)for(let t of e.loaded)r(t.hooks);return n}function en(e,t,n){let r=$t(e,t),i=r.filter(e=>!n.resolveCommand(e));return[r.length===0?{id:`hooks`,label:`Hooks`,status:`not-configured`,cause:`no command hooks configured`}:i.length===0?{id:`hooks`,label:`Hooks`,status:`ok`,cause:`${r.length} command hook(s); every executable resolves`}:{id:`hooks`,label:`Hooks`,status:`warn`,cause:`${i.length} command hook executable(s) not found on PATH`,detail:i.map(e=>e.split(/\s+/)[0]??e)},{id:`hooks.execution`,label:`Hook execution`,status:`not-probed`,cause:`the doctor does not run hooks`}]}function tn(e,t){let n=`mcp.plugin.${e.pluginId}.${e.name}`,r=[`Declaration only: plugin .mcp.json is not a runtime source. Copy a supported definition to mcpServers in settings, then use /mcp approve <name>.`];if(e.transport===`stdio`&&e.command!==void 0)return t.resolveCommand(e.command)?{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`stdio command ${e.command} resolves`,detail:r}:{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`stdio command ${e.command} not found on PATH`,detail:[...r,...e.envKeys.length===0?[]:[`env keys: ${e.envKeys.join(`, `)}`]]};if(e.transport===`http`&&e.url!==void 0)try{return new URL(e.url),{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`url ${e.url}`,detail:r}}catch{return{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`url is not parseable`,detail:r}}return{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`neither command nor url declared`,detail:r}}function nn(e,t,n){let r=[];if(e.mcpActivation===void 0)r.push({id:`mcp.activation`,label:`MCP activation`,status:`not-configured`,cause:`this CLI composes no MCP activation adapter`});else{let t=e.mcpActivation.list();r.push({id:`mcp.activation`,label:`MCP activation`,status:`ok`,cause:`${t.length} server(s) known`});for(let e of t)r.push({id:`mcp.${e.serverId}`,label:`MCP server`,status:e.allowed?`ok`:`warn`,cause:`${e.status} (${e.source}): ${e.reason}`})}for(let e of t){for(let t of e.mcpServers)r.push(tn(t,n));for(let t of e.mcpFaults)r.push({id:`mcp.plugin.${t.pluginId}`,label:`MCP declaration (plugin)`,status:`warn`,path:t.mcpPath,cause:`.mcp.json ${t.reason}`})}return r.push({id:`mcp.connection`,label:`MCP connection`,status:`not-probed`,cause:`the doctor does not connect to MCP servers`}),r}function rn(t,n,r){let i,a;try{i=(0,e.loadHostBundlePluginInspectionFromScopes)(t.pluginsDirs,{settingsPath:t.userSettingsPath})}catch(n){a=n instanceof Error?n.message:String(n),i=(0,e.loadHostBundlePluginInspectionFromScopes)(t.pluginsDirs,{enabledPlugins:{}})}return[...Zt(i).map(e=>a!==void 0&&e.id===`plugins`?{...e,status:`fail`,cause:`no plugin loads: ${a}`}:e),...Qt(t),...en(r,i,n),...nn(t,i,n)]}function an(e,t,n){return{id:e,label:t,status:`fail`,cause:wt(n)}}async function on(e,t,n,r){try{return r(await n())}catch(n){return[an(e,t,n instanceof Error?n:Error(String(n)))]}}function sn(e,t){let n=e=>Ct(e,t);return{...e,label:n(e.label),...e.path===void 0?{}:{path:n(e.path)},...e.cause===void 0?{}:{cause:n(e.cause)},...e.detail===void 0?{}:{detail:e.detail.map(n)}}}function cn(e){let t=e.filter(e=>e.status===`fail`).length;return{checks:e,failCount:t,warnCount:e.filter(e=>e.status===`warn`).length,repairable:e.flatMap(e=>e.repair===void 0?[]:[e.repair]),exitCode:t===0?0:1}}function ln(e){try{let t=Mt(e);return{checks:t.checks,result:t}}catch(e){return{checks:[an(`settings`,`Settings`,e instanceof Error?e:Error(String(e)))]}}}async function un(e,t){let n=[...e.hostChecks];e.compositionFailure!==void 0&&n.push(e.compositionFailure);let r=ln(e);n.push(...r.checks);let i=r.result?.inspection,a=Tt((i?.layers??[]).map(e=>e.settings),e.env);return n.push(...await on(`provider`,`Provider`,()=>It(e,t),e=>(e.resolvedApiKey!==void 0&&a.push(e.resolvedApiKey),e.checks))),i!==void 0&&(n.push(...await on(`storage`,`Storage`,()=>Ht(e,t,i),e=>e)),n.push(...await on(`extensions`,`Extensions`,()=>rn(e,t,i),e=>e))),cn(n.map(e=>sn(e,a)))}function dn(){return{name:`doctor`,displayName:`Doctor`,description:"Diagnose configuration and runtime readiness; `repair <check-id>` applies an allowlisted fix",source:`doctor`,modelInvocable:!1,userInvocable:!0,argumentHint:`[repair <check-id>]`}}var fn=class{name=`doctor`;getCommands(){return[dn()]}};async function pn(e,n){let r=e.getUserInteraction();if(r===void 0)return!1;let i=await r.ask((0,t.confirmAction)(`doctor-repair:${n.id}`,`Repair ${n.id}?`,{description:`${n.description} (${n.path})`,defaultYes:!1}));return i.type===`answer`&&i.values[0]===`yes`}async function mn(e,t,n,r,i){let a=await Yt(e,t,n,e=>pn(r,e));if(!a.applied)return{success:!1,message:a.reason,data:{repair:e,applied:!1}};let o=await un(t,n),s=o.checks.find(t=>t.id===e);return{success:!0,message:[`Repaired ${e}: ${a.plan.description}.`,...gt(o,`${i.title??`Doctor`} (after repair)`,i)].join(`
22
- `),data:{repair:e,applied:!0,status:s?.status,exitCode:o.exitCode}}}async function hn(e,t,n,r,i){let[a,o]=r.trim().split(/\s+/);if(a===`repair`)return o===void 0||o.length===0?{success:!1,message:`Usage: /doctor repair <check-id>`}:mn(o,e,t,n,i);let s=await un(e,t);return{success:s.failCount===0,message:gt(s,i.title,i).join(`
23
- `),data:{failCount:s.failCount,warnCount:s.warnCount,repairable:[...s.repairable]}}}function gn(e,t=ft({...e.env}),n={}){let r=D(dn(),{requiresPermission:!1,lifecycle:`inline`,execute:(r,i)=>hn(e,t,r,i,n)});return{name:`agent-command-doctor`,commandSources:[new fn],systemCommands:[r]}}function _n(){let e=process.env.VISUAL?.trim(),t=process.env.EDITOR?.trim(),n=(e!==void 0&&e.length>0?e:t!==void 0&&t.length>0?t:`vi`).split(/\s+/).filter(e=>e.length>0);return{command:n[0]??`vi`,args:n.slice(1)}}function A(e,t,n){return new Promise((r,i)=>{let a=(0,s.spawn)(e,[...t],{cwd:n,stdio:`inherit`,env:process.env});a.on(`error`,i),a.on(`exit`,(e,t)=>{if(e!==null){r(e);return}if(t){let e=o.constants.signals[t];r(128+(e??0));return}r(0)})})}const vn="Compose a message in $EDITOR (optionally pre-filled with `/editor <text>`), then return it.";async function yn(e,t,r=`agent-editor-`){if(!e.canHandoffTerminal())return{message:`An editor is unavailable here (no interactive terminal).`,success:!1};let a=_n(),s=(0,n.mkdtempSync)((0,i.join)((0,o.tmpdir)(),r)),c=(0,i.join)(s,`message.md`);(0,n.writeFileSync)(c,t??``,`utf8`);try{let t=await e.runWithTerminal(async()=>A(a.command,[...a.args,c],e.getCwd()));if(t!==0)return{message:`Editor exited without saving (code ${t}).`,success:!1,data:{exitCode:t}};let r=(0,n.readFileSync)(c,`utf8`).replace(/\s+$/u,``);return r.length===0?{message:`Editor closed with empty content; nothing composed.`,success:!1}:{message:r,success:!0,data:{content:r}}}finally{(0,n.rmSync)(s,{recursive:!0,force:!0,maxRetries:3,retryDelay:20})}}function bn(){return{name:`editor`,displayName:`Editor`,description:vn,source:`editor`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function xn(e){let t=bn();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:(t,n)=>yn(t,n,e)}}var Sn=class{name=`editor`;getCommands(){return[bn()]}};function Cn(e){return{name:`agent-command-editor`,commandSources:[new Sn],systemCommands:[xn(e)]}}const wn=`advisorModel`;function Tn(e){if(e.killSwitch)return`Advisor: disabled by the environment kill switch.`;if(e.target===void 0||!e.enabled)return`Advisor: off. Set one with /advisor <profile> or /advisor <profile>:<model>.`;let t=e.registered?`${e.sessionCalls}/${e.maxCallsPerSession} calls used this session`:`available from the next session`;return`Advisor: ${e.target} (${t}).`}async function En(e,t){let n=e.getCommandHostAdapters?.()??{},r=n.advisor;if(r===void 0)return{success:!1,message:`The advisor is not available in this environment.`};let i=t.trim();if(i.length===0){let e=r.status();return{success:!0,message:Tn(e),data:{advisor:{...e}}}}let a=r.set(i);if(!a.success||a.saved===void 0)return{success:a.success,message:a.message};let o=n.settings;if(o!==void 0&&e.getCommandInvocationSource()===`user`){let e=o.read();if(a.saved===`off`){let{[wn]:t,...n}=e;o.write(n)}else o.write({...e,[wn]:a.saved})}return{success:!0,message:a.message,data:{advisor:{...r.status()}}}}function Dn(){return{name:`advisor`,displayName:`Advisor`,description:`Show, set, or turn off the model the main model can consult for advice`,source:`advisor`,argumentHint:`<profile> | <profile>:<model> | off`,modelInvocable:!1}}function On(){let e=Dn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:En}}var kn=class{name=`advisor`;getCommands(){return[Dn()]}};function An(){return{name:`agent-command-advisor`,commandSources:[new kn],systemCommands:[On()]}}const jn=[`auto`,...t.MODEL_EFFORT_VALUES];function Mn(t){return t.disposition===`not-applied`?`This model doesn't support effort levels, so it will use its default.`:`Effort: ${e.EFFORT_LEVEL_LABELS[t.requested]}`}async function Nn(n){let r=n.getUserInteraction();if(r===void 0)return;let i=await r.ask((0,t.selectAction)(`effort`,`Select model effort`,jn.map(t=>({value:t,label:e.EFFORT_LEVEL_LABELS[t]}))));return(0,e.parseModelEffort)(i.type===`answer`?i.values[0]:void 0,`/effort`)}function Pn(t){let n=t.getCommandHostAdapters?.().effort;if(n!==void 0)return n.getResolution();let r=t.getSession().getModelEffort();return(0,e.resolveModelEffort)({command:r,modelDefault:r===`auto`?`high`:r})}function Fn(e){return e.getCommandHostAdapters?.()??{}}function In(e,t){let n=Fn(e).settings;if(n===void 0||t===`max`)return;let r=n.read();if(t===`auto`){let{effort:e,...t}=r;n.write(t);return}n.write({...r,effort:t})}async function Ln(t,n){let r;try{r=(0,e.parseModelEffort)(n.trim()||void 0,`/effort`),r===void 0&&(r=await Nn(t))}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}let i=Pn(t);if(r===void 0)return{message:Mn(i),success:!0,data:{effort:i}};let a=Fn(t).effort,o;try{o=a===void 0?(0,e.resolveModelEffort)({command:r,modelDefault:i.effective}):await a.apply(r,t.getSession()),a===void 0&&await t.getSession().applyModelOptions({effort:r}),t.getCommandInvocationSource()===`user`&&In(t,r)}catch(e){return{message:`Model effort was not applied: ${e instanceof Error?e.message:String(e)}`,success:!1}}return{message:Mn(o),success:!0,data:{effort:o}}}const Rn=`auto | ${t.MODEL_EFFORT_VALUES.join(` | `)}`;function zn(){return{name:`effort`,displayName:`Model Effort`,description:`Show or change the model effort level`,source:`effort`,argumentHint:Rn,modelInvocable:!1}}function Bn(){let e=zn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Ln}}var Vn=class{name=`effort`;getCommands(){return[zn()]}};function Hn(){return{name:`agent-command-effort`,commandSources:[new Vn],systemCommands:[Bn()]}}async function Un(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`exit`,`Exit the session?`)))?{success:!0,message:`Exit cancelled.`}:{success:!0,message:`Exit requested.`,hostActions:[(0,e.createSessionExitHostAction)()]}}function Wn(){return{name:`exit`,displayName:`Exit Session`,description:e.EXIT_COMMAND_DESCRIPTION,source:`exit`,modelInvocable:!1}}function Gn(){let e=Wn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Un}}var Kn=class{name=`exit`;getCommands(){return[Wn()]}};function qn(){return{name:`agent-command-exit`,commandSources:[new Kn],systemCommands:[Gn()]}}const Jn=`none`,Yn=`--same-dir`;function Xn(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0),n=t.find(e=>e.startsWith(`--`)&&e!==Yn);if(n!==void 0)return{error:`Unknown option: ${n}\nUsage: /fork [name] [${Yn}]`};let r=t.filter(e=>e!==Yn);return{name:r.length>0?r.join(` `):void 0,isolation:t.includes(Yn)?Jn:`worktree`}}function Zn(e){return e instanceof Error?e.message:String(e)}function Qn(e,t,n){return[`Forked this conversation into "${e}" (${t}), running ${n===Jn?`in this directory`:`in its own worktree`}.`,`The fork is a copy: this session keeps going, and the two are separate records.`,`See its progress with /background list. Attaching from the background panel points this`,`terminal at the copy as it was forked; the fork's own turns stay in its task transcript.`].join(`
24
- `)}function $n(e,t,n){let r=n?.(e.sessionId);return`The fork "${e.name}" was written (${e.sessionId}) but its background job could not start: ${t}\n${r===void 0?`Resume the saved session through your host.`:`Resume it in a new terminal with: ${r}`}`}async function er(e,t=``,n){let r=Xn(t);if(`error`in r)return{message:r.error,success:!1};let i=e.getAgentJobCapability();if(!i)return{message:`This session cannot start background jobs, so it cannot run a fork.`,success:!1};let a;try{a=await e.forkSession(r.name===void 0?{}:{name:r.name})}catch(e){return{message:`Could not fork this session: ${Zn(e)}`,success:!1}}try{let e=await i.spawnAgentJob({agentType:`general-purpose`,label:a.name,mode:`background`,prompt:`Continue.`,isolation:r.isolation,resumeSessionId:a.sessionId});return{message:Qn(a.name,e.id,r.isolation),success:!0,data:{sessionId:a.sessionId,name:a.name,taskId:e.id}}}catch(e){return{message:$n(a,Zn(e),n),success:!1}}}function tr(){return{name:`fork`,displayName:`Fork Session`,description:`Copy this conversation into a new background session and keep working here. The fork inherits the whole conversation and the assembled system prompt; it is a copy, so nothing it does reaches this session and it never merges back.`,source:`fork`,modelInvocable:!1,argumentHint:`[name] [--same-dir]`}}function nr(e){let t=tr();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,...t.argumentHint===void 0?{}:{argumentHint:t.argumentHint},execute:(t,n)=>er(t,n,e)}}var rr=class{name=`fork`;getCommands(){return[tr()]}};function ir(e){return{name:`agent-command-fork`,commandSources:[new rr],systemCommands:[nr(e)],sessionRequirements:[`runtime`]}}const ar=[`build`,`chore`,`ci`,`docs`,`feat`,`fix`,`perf`,`refactor`,`revert`,`style`,`test`],or=/^([^\s():!]+)(\(([^\s()]+)\))?(!)?: (.*)$/;function sr(e){if(e.trim().length===0)return{ok:!1,reason:`the subject is empty`};if(e.indexOf(`: `)===-1)return{ok:!1,reason:"the subject has no `: ` type separator — the form is `<type>[(scope)][!]: <description>`"};let t=or.exec(e);if(!t)return{ok:!1,reason:"the part before `: ` must be a type word with an optional `(scope)` and `!` — the form is `<type>[(scope)][!]: <description>`"};let n=t[1]??``;if((t[5]??``).trim().length===0)return{ok:!1,reason:"the description after `: ` is empty"};let r=[];return ar.includes(n)||r.push(`type "${n}" is not one of the conventional types (${ar.join(`, `)})`),e.length>72&&r.push(`the subject is ${e.length} characters; 72 is the conventional limit`),e.endsWith(`.`)&&r.push(`the subject ends with a period`),{ok:!0,warnings:r}}function cr(e){let t=e.trim();return t===`-m`?``:(t.startsWith(`-m `)&&(t=t.slice(3).trim()),t.length>=2&&(t.startsWith(`"`)||t.startsWith(`'`))&&t.endsWith(t[0]??``)&&(t=t.slice(1,-1).trim()),t)}function j(e){return{success:!1,message:e,data:{git:`commit`,committed:!1}}}async function lr(e){let n=await e.ask((0,t.textAction)(`git-commit-subject`,`Commit message`,{description:`Conventional Commits form: <type>[(scope)][!]: <description>`,placeholder:`feat: describe the change`}));if(n.type===`answer`)return cr(n.text??n.values[0]??``)}async function ur(t,n){let r=await t.run([`diff`,`--cached`,`--quiet`],{cwd:n});if(r.kind===`failed`||r.exitCode!==0&&r.exitCode!==1)return{staged:!1,result:{success:!1,message:(0,e.gitFailureMessage)(`diff --cached`,r)??`git failed`}};if(r.exitCode===1)return{staged:!0};let i=await t.run(e.GIT_STATUS_ARGS,{cwd:n}),a=(0,e.gitFailureMessage)(`status`,i);if(a!==void 0||i.kind!==`exited`)return{staged:!1,result:{success:!1,message:a??`git status failed`}};let o=(0,e.parseStatusPorcelainV2)(i.stdout);return{staged:!1,result:{success:!1,message:`Nothing is staged (${o.unstaged.length} unstaged, ${o.untracked.length} untracked). Stage files with \`git add\` or \`/shell git add ...\` and run \`/git commit\` again.`,data:{git:`commit`,committed:!1,unstaged:o.unstaged.length,untracked:o.untracked.length}}}}async function dr(e,t){let n=cr(e);if(n.length===0){if(t===void 0)return{result:j("Commit cancelled: a commit message was needed and none could be asked for (no interactive session). Run `/git commit <subject>`.")};let e=await lr(t);if(e===void 0||e.length===0)return{result:j(`Commit cancelled.`)};n=e}return{subject:n}}async function fr(n,r,i,a,o){if(o===void 0)return{confirmed:!1,result:j(`Commit cancelled: a confirmation was needed and none could be asked for (no interactive session).`)};let s=await n.run([`diff`,`--cached`,`--name-status`],{cwd:r}),c=(0,e.gitFailureMessage)(`diff --cached --name-status`,s);if(c!==void 0||s.kind!==`exited`)return{confirmed:!1,result:{success:!1,message:c??`git failed`}};let l=s.stdout.split(`
16
+ `)||`Context reference not found: ${r}`,data:{diagnostics:i.diagnostics}}}function Ve(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:O};let i=(0,e.removeCommandContextReference)(t,r);return i.removed?{success:!0,message:`Context reference removed: ${D(i.removed)}.`,data:{removed:i.removed}}:{success:!1,message:`Context reference not found: ${r}`}}function He(t,n,r){let i=(0,e.writeAutoCompactThresholdSetting)(t,n),a=i?`settings`:`session`;return(0,e.setCommandAutoCompactThreshold)(t,n,a),{success:!0,message:Ue(r,n,i),data:{autoCompactThreshold:n,autoCompactThresholdSource:a,persisted:i}}}function Ue(e,t,n){let r=Ie(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${T(t)} (${r}).`:`Auto compact threshold set to ${T(t)} (${r}).`}function We(e){if(e.endsWith(`%`)){let t=Number(e.slice(0,-1));return!Number.isFinite(t)||t<=0||t>100?{success:!1,message:`Auto compact percentage must be greater than 0% and at most 100%.`}:{success:!0,threshold:t/100}}if(e.includes(`.`)){let t=Number(e);return!Number.isFinite(t)||t<=0||t>1?{success:!1,message:`Auto compact fraction must be greater than 0 and at most 1.`}:{success:!0,threshold:t}}return{success:!1,message:`Use a percentage such as 85% or a fraction such as 0.85.`}}function Ge(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function k(e,t){return{name:e.name,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,...e.example===void 0?{}:{example:e.example},...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands},...e.runner===void 0?{}:{runner:e.runner},...e.surfaces===void 0?{}:{surfaces:e.surfaces},...t.semanticRole===void 0?{}:{semanticRole:t.semanticRole},lifecycle:t.lifecycle,requiresPermission:t.requiresPermission,execute:t.execute}}function Ke(){return{name:`context`,displayName:`Context References`,description:`Context window info, reference inventory, and auto-compact controls`,modelDescription:"Inspect the context window. Use it before a large task or before deciding to compact, or to see which files the user pinned into context. Bare returns used/max tokens and percentage, the auto-compact threshold, the pinned-reference summary and the turn count; `list` returns the per-category token breakdown and every pinned reference.",source:`context`,modelInvocable:!0,userInvocable:!0,argumentHint:`list | add <path> | remove <path> | clear | auto ...`,subcommands:[{name:`list`,description:`List loaded context references`,source:`context`,modelInvocable:!0},{name:`add`,description:`Add a file to active context references`,source:`context`,modelInvocable:!1},{name:`remove`,description:`Remove a context reference`,source:`context`,modelInvocable:!1},{name:`clear`,description:`Clear context references`,source:`context`,modelInvocable:!1},{name:`auto`,description:`Inspect or change auto-compact policy`,source:`context`,modelInvocable:!1}]}}function qe(){return k(Ke(),{requiresPermission:!1,lifecycle:`inline`,execute:Le})}var Je=class{name=`context`;getCommands(){return[Ke()]}};function Ye(){return{name:`agent-command-context`,commandSources:[new Je],systemCommands:[qe()]}}function Xe(){return{name:`devices`,displayName:`Devices`,description:`Manage this device's identity among the user's devices: list the roster with the device mesh status (whether it is on, how this device finds the others, which are linked), create the identity and its recovery phrase (init, for the user's first device only: on a device of a user who already has others it makes a separate identity that can never link to them), enrol another device (add shows a one-time code; join on the new device reads it), revoke a device, or rotate the signing key from the phrase. A new identity or new lists take effect in the running session's device mesh at once. Operator-only; the phrase and the enrollment code are handled on the terminal only, and results carry only device ids and names.`,source:`devices`,modelInvocable:!1,userInvocable:!0,argumentHint:`[list|init [name]|add|join [name]|revoke <device-id>|recover]`,subcommands:[{name:`list`,description:`List your devices and the device mesh status`,source:`devices`},{name:`init`,description:`Create your device identity and recovery phrase, on your first device only (on another, a separate identity that can never link to your devices; use add/join there)`,source:`devices`,argumentHint:`[name]`},{name:`revoke`,description:`Revoke a device with the signing key`,source:`devices`,argumentHint:`<device-id>`},{name:`recover`,description:`Rotate the signing key from your recovery phrase`,source:`devices`},{name:`add`,description:`Enrol another device: show a one-time code for it`,source:`devices`},{name:`join`,description:`Join your devices with the code another device shows`,source:`devices`,argumentHint:`[name]`}]}}const Ze={"no-terminal":`This needs an interactive terminal; the recovery phrase is never shown or read anywhere else.`,"not-initialized":"This device has no identity yet. If your other devices are already linked, run `/devices add` there and `/devices join` here, typing the code it shows. Run `/devices init` only when setting up your first device: it creates a separate identity that cannot link to an existing device group.","already-initialized":"This device already has an identity. Use `/devices recover` to rotate its signing key.",cancelled:`Cancelled. Nothing was changed.`,"confirmation-failed":`The confirmation did not match. Nothing was changed.`,"phrase-invalid":`That is not a valid recovery phrase. Nothing was changed.`,"phrase-mismatch":`That phrase (with that passphrase) belongs to a different identity than this device. Nothing was changed.`,"no-signing-key":"This device does not hold the signing key. Revoke from a device that does, or `/devices recover`.","signing-key-expired":"The signing key on this device has expired. Run `/devices recover` to issue a new one.","unknown-device":`No device in the roster has that id.`,"ambiguous-device":`More than one device starts with that id; give more of it.`,"self-revocation":"This device cannot revoke itself. Revoke it from another device, or `/devices recover`.","changed-concurrently":`The device identity changed in another session while this was waiting. Nothing was changed; try again.`,"no-relay":"Enrolling a device needs a signaling relay. Set `transports.webrtc.options.relayUrl` in your settings on both devices.","code-invalid":`That is not an enrollment code. Nothing was changed.`,"code-on-command-line":"Do not put the code on the command line, where history keeps it. Run `/devices add` again on the other device for a new code, then `/devices join` here and type it at the prompt.","code-not-accepted":"No device accepted that code: it is wrong, expired or already used, or the connection was tampered with. Run `/devices add` on the other device for a new code.","enrollment-expired":`The code expired before a device joined. Nothing was changed.`,"too-many-attempts":"Too many attempts failed to prove the code, so it no longer works. Nothing was changed; run `/devices add` again.","enrollment-declined":`The enrollment was declined. Nothing was changed.`,"enrollment-timed-out":`Nobody answered in time. Nothing was changed.`,"enrollment-failed":`The signaling relay or the connection to the other device failed before the enrollment finished. Nothing was changed; try again.`};function A(e){return e.slice(0,10)}function Qe(e){return new Date(e).toISOString().slice(0,10)}function $e(e){return{success:!1,message:Ze[e]}}function et(e){if(e.state===`off`)return["Device mesh: off. Set `transports.mesh.enabled` to true in your user settings to link your devices."];if(e.state===`failed`)return[`Device mesh: could not start: ${e.reason??`no reason was reported`}.`];let t=e.sources.length>0?`; finds devices by ${e.sources.join(`, `)}`:``,n=e.linked.map(e=>` ${A(e.deviceId)} ${e.name??``} ${e.locality===`same-host`?`on this machine`:`on another machine`}`);return[`Device mesh: ${e.state}${t}.`,...n.length>0?[`Linked now:`,...n]:[`No device is linked right now.`]]}function tt(e,t){if(e===void 0)return{success:!0,message:Ze[`not-initialized`]};let n=e.devices.map(e=>{let t=[...e.thisDevice?[`this device`]:[],...e.holdsSigningKey?[`holds the signing key`]:[]],n=t.length>0?` (${t.join(`, `)})`:``;return` ${A(e.deviceId)} ${e.name}${n} certificate expires ${Qe(e.certificateExpiresAt)}`});return{success:!0,message:[`Devices of user ${A(e.userId)}:`,...n,`${e.revokedDeviceCount} revoked. Roster and revocation list valid until ${new Date(e.listsExpireAt).toISOString()}.`,...t===void 0?[]:et(t)].join(`
17
+ `)}}function nt(e){return e.getCommandInvocationSource()===`user`}async function j(e,t,n){if(!e.canHandoffTerminal())return $e(`no-terminal`);try{let r=await e.runWithTerminal(t);return r.ok?{success:!0,message:n(r.value)}:$e(r.reason)}catch(e){return{success:!1,message:`Device identity operation failed: ${e instanceof Error?e.message:`unknown error`}`}}}async function rt(e,t,n){if(!nt(t))return{success:!1,message:"`/devices` runs only for the operator at this terminal, never from a remote surface or the model."};let r=n.trim(),i=r.indexOf(` `),a=(i===-1?r:r.slice(0,i)).toLowerCase(),o=i===-1?``:r.slice(i+1).trim();switch(a){case``:case`list`:try{return tt(await e.list(),e.meshStatus?.())}catch(e){return{success:!1,message:`Device identity could not be read: ${e instanceof Error?e.message:`unknown error`}`}}case`init`:return j(t,()=>e.init(o.length>0?{name:o}:{}),e=>[`Device identity created. This device: ${A(e.deviceId)}; user ${A(e.userId)}.`,`It holds signing key ${A(e.signingKeyId)}.`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`],`Keep the recovery phrase offline; it is the only way to recover this identity.`].join(`
18
+ `));case`recover`:return j(t,()=>e.recover(),e=>[`Recovered. New signing key ${A(e.signingKeyId)}; ${e.revokedSigningKeyCount} old signing key(s) revoked.`,`This device (${A(e.deviceId)}) is certified again.`,...e.droppedDeviceCount>0?[`${e.droppedDeviceCount} other device(s) were certified by a retired signing key and must enrol again.`]:[]].join(`
19
+ `));case`revoke`:return o.length===0?{success:!1,message:`Usage: /devices revoke <device-id>`}:j(t,()=>e.revoke(o),e=>`Revoked ${e.name} (${A(e.deviceId)}). A new roster and revocation list were issued.`);case`add`:return j(t,()=>e.add(),e=>[`Enrolled ${e.name} (${A(e.deviceId)}). A new roster was issued.`,...e.confirmed?[]:["The new device did not confirm it kept its identity; check `/devices` there."]].join(`
20
+ `));case`join`:return j(t,()=>e.join(o.length>0?{name:o}:{}),e=>[`Joined the devices of user ${A(e.userId)}. This device: ${e.name} (${A(e.deviceId)}).`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`]].join(`
21
+ `));default:return{success:!1,message:`Unknown argument "${a}". Usage: /devices [list|init [name]|add|join [name]|revoke <device-id>|recover]`}}}var it=class{name=`devices`;getCommands(){return[Xe()]}};function at(e){let t=k(Xe(),{requiresPermission:!1,lifecycle:`inline`,execute:(t,n)=>rt(e,t,n)});return{name:`agent-command-devices`,commandSources:[new it],systemCommands:[t]}}const ot=3e3;function st(e,t){return new Promise(n=>{let i=Date.now(),a=(0,r.createConnection)({host:e,port:t}),o=setTimeout(()=>{a.destroy(),n({reachable:!1,error:`timeout (${ot/1e3}s)`})},ot);a.on(`connect`,()=>{clearTimeout(o),a.destroy(),n({reachable:!0,elapsedMs:Date.now()-i})}),a.on(`error`,e=>{clearTimeout(o),n({reachable:!1,error:e.message})})})}function ct(e){if(!(0,n.existsSync)(e))return{exists:!1,isDirectory:!1,writable:!1};let t;try{t=(0,n.statSync)(e)}catch{return{exists:!0,isDirectory:!1,writable:!1}}let r=t.isDirectory(),i=t.mode&511,a=!1;try{(0,n.accessSync)(e,n.constants.W_OK),a=!0}catch{a=!1}return{exists:!0,isDirectory:r,writable:a,mode:i}}function lt(e,t=process.env){let r=e.trim().split(/\s+/)[0];if(r===void 0||r.length===0)return!1;if((0,i.isAbsolute)(r)||r.includes(`/`))return(0,n.existsSync)(r);let a=process.platform===`win32`?[``,`.exe`,`.cmd`,`.bat`]:[``];return(t.PATH??``).split(i.delimiter).filter(e=>e.length>0).some(e=>a.some(t=>(0,n.existsSync)((0,i.join)(e,r+t))))}function ut(e=process.env){return{probeEndpoint:st,inspectPath:ct,resolveCommand:t=>lt(t,e),ownerOnlyGuarantee:()=>(0,a.ownerOnlyGuarantee)()}}const dt={ok:`✓`,warn:`⚠`,fail:`✗`,"not-configured":`○`,"not-probed":`–`};function ft(e,t){let n=[` ${dt[e.status]} ${e.label} [${e.id}] ${e.status}${e.cause===void 0?``:`: ${e.cause}`}`];e.path!==void 0&&n.push(` path: ${e.path}`);for(let t of e.detail??[])n.push(` ${t}`);if(e.repair!==void 0){let r=t.formatRepairCommand?.(e.repair);n.push(` repair: ${r??`request repair for ${e.repair} through your host`}`)}return n}function pt(e,t){let n=t.productName?.trim();return e.failCount===0&&e.warnCount===0?n?`✓ All checks passed. ${n} is ready to use.`:`✓ All checks passed.`:e.failCount>0?n?`✗ ${e.failCount} issue(s) found. Fix the items above to use ${n}.`:`✗ ${e.failCount} issue(s) found. Fix the items above before use.`:n?`⚠ ${e.warnCount} warning(s). ${n} may work but check the items above.`:`⚠ ${e.warnCount} warning(s). Check the items above.`}function mt(e,t=`Doctor`,n={}){let r=[``,t,``,...e.checks.flatMap(e=>ft(e,n)),``,pt(e,n)];return e.repairable.length>0&&r.push(` repairable: ${e.repairable.join(`, `)} — ${n.repairOffer??`ask your host to apply a repair`}`),r.push(``),r}const ht=`[redacted]`,gt=/(\b[a-z][a-z0-9+.-]{0,31}:\/\/)([^\s/@]+)@/gi,_t=/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,vt=/\b(?:sk-[A-Za-z0-9_-]{8,}|AIza[0-9A-Za-z_-]{20,}|ghp_[A-Za-z0-9]{20,}|xox[abprs]-[A-Za-z0-9-]{10,})\b/g,yt=/\.\.\."[^"]*"\.\.\./g;function bt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function xt(e,t=[]){let n=e,r=new Set;for(let e of t)typeof e!=`string`||e.length<4||r.has(e)||(r.add(e),n=n.replace(new RegExp(bt(e),`g`),ht));return n=n.replace(gt,`$1${ht}@`),n=n.replace(_t,`$1 ${ht}`),n=n.replace(vt,ht),n}function St(t){return t instanceof e.SettingsParseError?`${t.name}: ${t.filePath} is not valid JSON (see the settings check)`:`${t.name}: ${t.message.replace(yt,`…`)}`}function Ct(e,t){let n=new Set,r=e=>{if(e!==void 0){if(e.startsWith(`$ENV:`)){let r=t[e.slice(5).trim()];r!==void 0&&n.add(r);return}n.add(e)}};for(let t of e)if(t!==void 0){r(t.provider?.apiKey);for(let e of Object.values(t.providers??{}))r(e.apiKey);for(let e of Object.values(t.env??{}))n.add(e)}return[...n]}function wt(e){let t=(0,i.basename)((0,i.dirname)(e.kind===`host`?e.path:e.relativePath)).replace(/^\./,``);return`settings.${e.scope}.${t}`}function Tt(e){let t=e.settingsSources.find(t=>t.kind===`host`&&t.path===e.userSettingsPath);return t===void 0?void 0:wt(t)}function Et(e){let t=e.cause;if(t===void 0)return e.state;switch(t.state){case`unreadable`:return t.errno===void 0?`unreadable`:`unreadable (${t.errno})`;case`invalid-json`:return t.offset===void 0?`invalid-json`:`invalid-json at offset ${t.offset}`;case`schema-invalid`:return`schema-invalid: ${(t.issues??[]).map(e=>`${e.path} (${e.code})`).join(`, `)}`;default:return t.state}}function Dt(e,t){return e.source.kind===`host`&&e.source.path===t.userSettingsPath&&e.state===`empty`}function Ot(e,t){let n=wt(e.source),r=e.source.kind===`host`?e.source.path:e.source.relativePath;if(e.state===`absent`)return{id:n,label:`Settings layer`,status:`not-configured`,path:r,cause:`absent`};if(e.state===`ok`)return{id:n,label:`Settings layer`,status:`ok`,path:r,cause:`ok`};let i=Dt(e,t);return{id:n,label:`Settings layer`,status:`fail`,path:r,cause:Et(e),detail:i?[`The file exists but holds nothing; rewriting it as {} loses no content.`]:[`Session start will refuse this configuration. Fix the file at the named path.`],...i?{repair:n}:{}}}function kt(e){let t=[...e.provenance.map(e=>`${e.key}: ${e.rule} ← ${e.contributors.join(` → `)}`),...e.hookSources.map((e,t)=>`settings hook ${t+1}: ${e.event}/${e.type} ← ${e.source}`)];return e.partial?{id:`settings.merge`,label:`Merged settings`,status:`warn`,cause:`partial — a present layer is broken; session start will refuse this configuration`,detail:t.length===0?[`(no key declared by a healthy layer)`]:t}:{id:`settings.merge`,label:`Merged settings`,status:`ok`,cause:`${e.provenance.length} key(s) from ${e.layers.filter(e=>e.state===`ok`).length} layer(s)`,detail:t.length===0?[`(no settings declared)`]:t}}function At(t){let n=(0,e.inspectSettingsLayers)(t.settingsSources);return{inspection:n,checks:[...n.layers.map(e=>Ot(e,t)),kt(n)]}}function jt(e){let t=e.source===`env-default`?`env-default via ${e.sourceEnvVar??`environment`}`:`settings profile`;return{id:`provider.resolution`,label:`Provider`,status:`ok`,cause:`${e.name} (${e.model}) — ${t}`}}function Mt(e,n){let r=(0,t.findProviderDefinition)(n.providerDefinitions,e.name),i=e.baseURL??r?.defaults?.baseURL;if(i!==void 0)try{let t=new URL(i),n=t.port===``?t.protocol===`http:`?80:443:Number(t.port);return{host:t.hostname,port:n,origin:e.baseURL===void 0?`definition defaults.baseURL`:`profile baseURL`}}catch{return}let a=r?.endpoint;return a===void 0?void 0:{...a,origin:`definition endpoint`}}async function Nt(e,t,n){let r=Mt(e,t);if(r===void 0)return{id:`provider.reachability`,label:`Provider reachability`,status:`warn`,cause:`not checked: ${e.name} declares no endpoint (no profile baseURL, defaults.baseURL or definition endpoint)`};let i=await n.probeEndpoint(r.host,r.port),a=`${r.host}:${r.port} (${r.origin})`;return i.reachable?{id:`provider.reachability`,label:`Provider reachability`,status:`ok`,cause:`${a} reachable in ${i.elapsedMs??0}ms`}:{id:`provider.reachability`,label:`Provider reachability`,status:`warn`,cause:`${a} unreachable: ${i.error??`connection failed`}`,detail:[`Check proxy settings, firewall, or the profile baseURL.`]}}async function Pt(t,n){let r;try{r=(0,e.readProviderSettings)(t.settingsSources,{providerDefinitions:t.providerDefinitions,env:{...t.env}})}catch(e){return{checks:[{id:`provider.resolution`,label:`Provider`,status:`fail`,cause:St(e instanceof Error?e:Error(String(e))),detail:[t.diagnosticGuidance?.providerResolution??`Configure a provider or set its API key environment variable.`]}]}}return{checks:[jt(r),await Nt(r,t,n)],...r.apiKey===void 0?{}:{resolvedApiKey:r.apiKey}}}function Ft(e,t){let{root:n,sessions:r}=e.userStorage,i=[t.inspectPath(n),t.inspectPath(r)];return i.some(e=>!e.exists)?`missing`:i.some(e=>!e.isDirectory||!e.writable)?`unwritable`:t.ownerOnlyGuarantee()===`posix-mode`?i.some(e=>e.mode!==void 0&&(e.mode&63)!=0)?`too-open`:`ok`:`mode-not-probed`}function It(e,t){let{root:n,sessions:r}=e.userStorage,i={id:`storage.user`,label:`User storage`,path:n};switch(Ft(e,t)){case`missing`:return{...i,status:`warn`,cause:`not initialized (created on first write)`,detail:[n,r],repair:`storage.user`};case`unwritable`:return{...i,status:`fail`,cause:`exists but is not a writable directory`,detail:[n,r]};case`too-open`:return{...i,status:`warn`,cause:`not owner-only (mode allows group/other access)`,detail:[n,r],repair:`storage.user`};case`mode-not-probed`:return{...i,status:`not-probed`,cause:`owner-only mode is not asserted on this platform (windows-acl)`};default:return{...i,status:`ok`,cause:`writable, owner-only`}}}function Lt(e,t){if(e.projectAccess.status!==`trusted`)return{id:`storage.project`,label:`Project storage`,status:`not-configured`,cause:`project sources are disabled in an untrusted workspace`};let n=e.projectStorageRoot;if(n===void 0)return{id:`storage.project`,label:`Project storage`,status:`not-configured`,cause:`the host names no project state root`};let r=t.inspectPath(n);return r.exists?r.isDirectory&&r.writable?{id:`storage.project`,label:`Project storage`,status:`ok`,path:n,cause:`writable`}:{id:`storage.project`,label:`Project storage`,status:`fail`,path:n,cause:`exists but is not a writable directory`}:{id:`storage.project`,label:`Project storage`,status:`not-configured`,path:n,cause:`absent (created on first write)`}}function Rt(e){let t=e.projectAccess;if(t.status===`trusted`)return{id:`workspace.trust`,label:`Workspace trust`,status:`ok`,path:t.identity.displayPath,cause:`trusted`};let n=t.cause===void 0?t.trustState:`${t.trustState}: ${t.cause.name}: ${t.cause.message}`;return{id:`workspace.trust`,label:`Workspace trust`,status:t.trustState===`store-unavailable`||t.trustState===`identity-unavailable`?`fail`:`warn`,...t.displayPath===void 0?{}:{path:t.displayPath},cause:n,detail:[e.diagnosticGuidance?.projectTrust??`Project sources are disabled. Approve this workspace with the host.`]}}function zt(e){let t=new Map,n=!1;for(let r of e.layers)for(let[e,i]of Object.entries(r.settings?.providers??{})){let r=t.get(e);r?.apiKey!==void 0&&i.baseURL!==void 0&&i.baseURL!==r.baseURL&&i.apiKey===void 0&&(n=!0),t.set(e,{baseURL:i.baseURL??r?.baseURL,apiKey:i.apiKey??r?.apiKey})}return n?{id:`provider.security`,label:`Provider security`,status:`warn`,cause:`provider endpoint quarantined; inherited credential removed (credential redacted)`}:void 0}function Bt(e,t,n){let r=zt(n);return[Rt(e),It(e,t),Lt(e,t),...r===void 0?[]:[r]]}const Vt=`storage.user`;function Ht(e){let t=Tt(e);return t===void 0?[Vt]:[t,Vt]}function Ut(e,t){return Ht(t).includes(e)}function Wt(t,n){let r=(0,e.inspectSettingsLayers)(n.settingsSources).layers.find(e=>wt(e.source)===t);return r===void 0||r.source.kind!==`host`?{ok:!1,reason:`${t}: no user settings layer in this composition`}:Dt(r,n)?{ok:!0,plan:{id:t,description:`rewrite the empty user settings file as {}`,path:r.source.path}}:{ok:!1,reason:`${t}: state is ${r.state}; only an empty file is rewritten`}}function Gt(e,t){let n=Ft(e,t),{root:r}=e.userStorage;return n!==`missing`&&n!==`too-open`?{ok:!1,reason:`storage.user: state is ${n}; only a missing or too-open directory is repaired`}:{ok:!0,plan:{id:`storage.user`,description:`create the user store root and its sessions directory as owner-only directories`,path:r}}}function Kt(e,t,n){return Ut(e,t)?e===`storage.user`?Gt(t,n):Wt(e,t):{ok:!1,reason:`${e}: not a repairable check (allowlist: ${Ht(t).join(`, `)})`}}async function qt(t,n,r,i){let o=Kt(t,n,r);if(!o.ok)return{applied:!1,reason:o.reason};if(!await i(o.plan))return{applied:!1,reason:`${t}: repair not confirmed; nothing written`};let s=Kt(t,n,r);if(!s.ok)return{applied:!1,reason:`${s.reason} (state changed before the write)`};if(s.plan.id===`storage.user`){let{root:e,sessions:t}=n.userStorage;(0,a.ensureOwnerOnlyDirectory)(t,{withinRoot:e})}else(0,e.writeSettings)(s.plan.path,{});return{applied:!0,plan:s.plan}}const Jt={"manifest-unreadable":`manifest could not be parsed`,"manifest-invalid":`manifest is not a valid plugin.json (name, version, description required)`,"load-failed":`plugin assets could not be loaded`};function Yt(e){let t=[],n=e.reduce((e,t)=>e+t.loaded.length,0),r=e.filter(e=>e.cacheDirPresent);t.push(r.length===0?{id:`plugins`,label:`Plugins`,status:`not-configured`,cause:`no plugin cache directory`,detail:e.map(e=>e.pluginsDir)}:{id:`plugins`,label:`Plugins`,status:`ok`,cause:`${n} plugin(s) loaded`,detail:r.map(e=>`${e.pluginsDir}: ${e.loaded.length} loaded, ${e.skipped.length} skipped`)});for(let n of e){for(let e of n.skipped)e.reason!==`disabled`&&t.push({id:`plugin.${e.pluginId}`,label:`Plugin`,status:`fail`,path:e.manifestPath,cause:Jt[e.reason]??e.reason,...e.detail===void 0?{}:{detail:[e.detail]}});for(let e of n.hookIssues)t.push({id:`plugin.${e.pluginId}.hooks`,label:`Plugin hooks`,status:`warn`,path:e.hooksPath,cause:`hooks.json fails the hooks schema: ${e.issues.map(e=>`${e.path} (${e.code})`).join(`, `)}`,detail:[`Report-only: the plugin still loads; these hooks may not run.`]})}return t}function Xt(t){let n=(0,e.inspectSkillSources)(t.contributionSources,t.skillRoots).roots.filter(e=>e.present),r=n.reduce((e,t)=>e+t.discovered.length,0),i=[n.length===0?{id:`skills`,label:`Skills and commands`,status:`not-configured`,cause:`no skill or command root present`}:{id:`skills`,label:`Skills and commands`,status:`ok`,cause:`${r} discovered`,detail:n.map(e=>`${e.sourceDisplayName}: ${e.root} (${e.discovered.length})`)}];for(let e of n)for(let t of e.skipped)i.push({id:`skill.${t.path}`,label:`Skill definition`,status:t.reason===`frontmatter-invalid`?`fail`:`warn`,path:`${e.sourceDisplayName}: ${t.path}`,cause:t.reason,...t.detail===void 0?{}:{detail:[t.detail]}});return i}function Zt(e,t){let n=[],r=e=>{if(e!==void 0)for(let t of Object.values(e))for(let e of t??[])for(let t of e.hooks??[])t.type===`command`&&typeof t.command==`string`&&n.push(t.command)};r(e.merged.hooks);for(let e of t)for(let t of e.loaded)r(t.hooks);return n}function Qt(e,t,n){let r=Zt(e,t),i=r.filter(e=>!n.resolveCommand(e));return[r.length===0?{id:`hooks`,label:`Hooks`,status:`not-configured`,cause:`no command hooks configured`}:i.length===0?{id:`hooks`,label:`Hooks`,status:`ok`,cause:`${r.length} command hook(s); every executable resolves`}:{id:`hooks`,label:`Hooks`,status:`warn`,cause:`${i.length} command hook executable(s) not found on PATH`,detail:i.map(e=>e.split(/\s+/)[0]??e)},{id:`hooks.execution`,label:`Hook execution`,status:`not-probed`,cause:`the doctor does not run hooks`}]}function $t(e,t){let n=`mcp.plugin.${e.pluginId}.${e.name}`,r=[`Declaration only: plugin .mcp.json is not a runtime source. Copy a supported definition to mcpServers in settings, then use /mcp approve <name>.`];if(e.transport===`stdio`&&e.command!==void 0)return t.resolveCommand(e.command)?{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`stdio command ${e.command} resolves`,detail:r}:{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`stdio command ${e.command} not found on PATH`,detail:[...r,...e.envKeys.length===0?[]:[`env keys: ${e.envKeys.join(`, `)}`]]};if(e.transport===`http`&&e.url!==void 0)try{return new URL(e.url),{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`url ${e.url}`,detail:r}}catch{return{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`url is not parseable`,detail:r}}return{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`neither command nor url declared`,detail:r}}function en(e,t,n){let r=[];if(e.mcpActivation===void 0)r.push({id:`mcp.activation`,label:`MCP activation`,status:`not-configured`,cause:`this CLI composes no MCP activation adapter`});else{let t=e.mcpActivation.list();r.push({id:`mcp.activation`,label:`MCP activation`,status:`ok`,cause:`${t.length} server(s) known`});for(let e of t)r.push({id:`mcp.${e.serverId}`,label:`MCP server`,status:e.allowed?`ok`:`warn`,cause:`${e.status} (${e.source}): ${e.reason}`})}for(let e of t){for(let t of e.mcpServers)r.push($t(t,n));for(let t of e.mcpFaults)r.push({id:`mcp.plugin.${t.pluginId}`,label:`MCP declaration (plugin)`,status:`warn`,path:t.mcpPath,cause:`.mcp.json ${t.reason}`})}return r.push({id:`mcp.connection`,label:`MCP connection`,status:`not-probed`,cause:`the doctor does not connect to MCP servers`}),r}function tn(t,n,r){let i,a;try{i=(0,e.loadHostBundlePluginInspectionFromScopes)(t.pluginsDirs,{settingsPath:t.userSettingsPath})}catch(n){a=n instanceof Error?n.message:String(n),i=(0,e.loadHostBundlePluginInspectionFromScopes)(t.pluginsDirs,{enabledPlugins:{}})}return[...Yt(i).map(e=>a!==void 0&&e.id===`plugins`?{...e,status:`fail`,cause:`no plugin loads: ${a}`}:e),...Xt(t),...Qt(r,i,n),...en(t,i,n)]}function nn(e,t,n){return{id:e,label:t,status:`fail`,cause:St(n)}}async function rn(e,t,n,r){try{return r(await n())}catch(n){return[nn(e,t,n instanceof Error?n:Error(String(n)))]}}function an(e,t){let n=e=>xt(e,t);return{...e,label:n(e.label),...e.path===void 0?{}:{path:n(e.path)},...e.cause===void 0?{}:{cause:n(e.cause)},...e.detail===void 0?{}:{detail:e.detail.map(n)}}}function on(e){let t=e.filter(e=>e.status===`fail`).length;return{checks:e,failCount:t,warnCount:e.filter(e=>e.status===`warn`).length,repairable:e.flatMap(e=>e.repair===void 0?[]:[e.repair]),exitCode:t===0?0:1}}function sn(e){try{let t=At(e);return{checks:t.checks,result:t}}catch(e){return{checks:[nn(`settings`,`Settings`,e instanceof Error?e:Error(String(e)))]}}}async function cn(e,t){let n=[...e.hostChecks];e.compositionFailure!==void 0&&n.push(e.compositionFailure);let r=sn(e);n.push(...r.checks);let i=r.result?.inspection,a=Ct((i?.layers??[]).map(e=>e.settings),e.env);return n.push(...await rn(`provider`,`Provider`,()=>Pt(e,t),e=>(e.resolvedApiKey!==void 0&&a.push(e.resolvedApiKey),e.checks))),i!==void 0&&(n.push(...await rn(`storage`,`Storage`,()=>Bt(e,t,i),e=>e)),n.push(...await rn(`extensions`,`Extensions`,()=>tn(e,t,i),e=>e))),on(n.map(e=>an(e,a)))}function ln(){return{name:`doctor`,displayName:`Doctor`,description:"Diagnose configuration and runtime readiness; `repair <check-id>` applies an allowlisted fix",source:`doctor`,modelInvocable:!1,userInvocable:!0,argumentHint:`[repair <check-id>]`}}var un=class{name=`doctor`;getCommands(){return[ln()]}};async function dn(e,n){let r=e.getUserInteraction();if(r===void 0)return!1;let i=await r.ask((0,t.confirmAction)(`doctor-repair:${n.id}`,`Repair ${n.id}?`,{description:`${n.description} (${n.path})`,defaultYes:!1}));return i.type===`answer`&&i.values[0]===`yes`}async function fn(e,t,n,r,i){let a=await qt(e,t,n,e=>dn(r,e));if(!a.applied)return{success:!1,message:a.reason,data:{repair:e,applied:!1}};let o=await cn(t,n),s=o.checks.find(t=>t.id===e);return{success:!0,message:[`Repaired ${e}: ${a.plan.description}.`,...mt(o,`${i.title??`Doctor`} (after repair)`,i)].join(`
22
+ `),data:{repair:e,applied:!0,status:s?.status,exitCode:o.exitCode}}}async function pn(e,t,n,r,i){let[a,o]=r.trim().split(/\s+/);if(a===`repair`)return o===void 0||o.length===0?{success:!1,message:`Usage: /doctor repair <check-id>`}:fn(o,e,t,n,i);let s=await cn(e,t);return{success:s.failCount===0,message:mt(s,i.title,i).join(`
23
+ `),data:{failCount:s.failCount,warnCount:s.warnCount,repairable:[...s.repairable]}}}function mn(e,t=ut({...e.env}),n={}){let r=k(ln(),{requiresPermission:!1,lifecycle:`inline`,execute:(r,i)=>pn(e,t,r,i,n)});return{name:`agent-command-doctor`,commandSources:[new un],systemCommands:[r]}}function hn(){let e=process.env.VISUAL?.trim(),t=process.env.EDITOR?.trim(),n=(e!==void 0&&e.length>0?e:t!==void 0&&t.length>0?t:`vi`).split(/\s+/).filter(e=>e.length>0);return{command:n[0]??`vi`,args:n.slice(1)}}function M(e,t,n){return new Promise((r,i)=>{let a=(0,s.spawn)(e,[...t],{cwd:n,stdio:`inherit`,env:process.env});a.on(`error`,i),a.on(`exit`,(e,t)=>{if(e!==null){r(e);return}if(t){let e=o.constants.signals[t];r(128+(e??0));return}r(0)})})}const gn="Compose a message in $EDITOR (optionally pre-filled with `/editor <text>`), then return it.";async function _n(e,t,r=`agent-editor-`){if(!e.canHandoffTerminal())return{message:`An editor is unavailable here (no interactive terminal).`,success:!1};let a=hn(),s=(0,n.mkdtempSync)((0,i.join)((0,o.tmpdir)(),r)),c=(0,i.join)(s,`message.md`);(0,n.writeFileSync)(c,t??``,`utf8`);try{let t=await e.runWithTerminal(async()=>M(a.command,[...a.args,c],e.getCwd()));if(t!==0)return{message:`Editor exited without saving (code ${t}).`,success:!1,data:{exitCode:t}};let r=(0,n.readFileSync)(c,`utf8`).replace(/\s+$/u,``);return r.length===0?{message:`Editor closed with empty content; nothing composed.`,success:!1}:{message:r,success:!0,data:{content:r}}}finally{(0,n.rmSync)(s,{recursive:!0,force:!0,maxRetries:3,retryDelay:20})}}function vn(){return{name:`editor`,displayName:`Editor`,description:gn,source:`editor`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function yn(e){let t=vn();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:(t,n)=>_n(t,n,e)}}var bn=class{name=`editor`;getCommands(){return[vn()]}};function xn(e){return{name:`agent-command-editor`,commandSources:[new bn],systemCommands:[yn(e)]}}const Sn=`advisorModel`;function Cn(e){if(e.killSwitch)return`Advisor: disabled by the environment kill switch.`;if(e.target===void 0||!e.enabled)return`Advisor: off. Set one with /advisor <profile> or /advisor <profile>:<model>.`;let t=e.registered?`${e.sessionCalls}/${e.maxCallsPerSession} calls used this session`:`available from the next session`;return`Advisor: ${e.target} (${t}).`}async function wn(e,t){let n=e.getCommandHostAdapters?.()??{},r=n.advisor;if(r===void 0)return{success:!1,message:`The advisor is not available in this environment.`};let i=t.trim();if(i.length===0){let e=r.status();return{success:!0,message:Cn(e),data:{advisor:{...e}}}}let a=r.set(i);if(!a.success||a.saved===void 0)return{success:a.success,message:a.message};let o=n.settings;if(o!==void 0&&e.getCommandInvocationSource()===`user`){let e=o.read();if(a.saved===`off`){let{[Sn]:t,...n}=e;o.write(n)}else o.write({...e,[Sn]:a.saved})}return{success:!0,message:a.message,data:{advisor:{...r.status()}}}}function Tn(){return{name:`advisor`,displayName:`Advisor`,description:`Show, set, or turn off the model the main model can consult for advice`,source:`advisor`,argumentHint:`<profile> | <profile>:<model> | off`,modelInvocable:!1}}function En(){let e=Tn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:wn}}var Dn=class{name=`advisor`;getCommands(){return[Tn()]}};function On(){return{name:`agent-command-advisor`,commandSources:[new Dn],systemCommands:[En()]}}const kn=[`auto`,...t.MODEL_EFFORT_VALUES];function An(t){return t.disposition===`not-applied`?`This model doesn't support effort levels, so it will use its default.`:`Effort: ${e.EFFORT_LEVEL_LABELS[t.requested]}`}async function jn(n){let r=n.getUserInteraction();if(r===void 0)return;let i=await r.ask((0,t.selectAction)(`effort`,`Select model effort`,kn.map(t=>({value:t,label:e.EFFORT_LEVEL_LABELS[t]}))));return(0,e.parseModelEffort)(i.type===`answer`?i.values[0]:void 0,`/effort`)}function Mn(t){let n=t.getCommandHostAdapters?.().effort;if(n!==void 0)return n.getResolution();let r=t.getSession().getModelEffort();return(0,e.resolveModelEffort)({command:r,modelDefault:r===`auto`?`high`:r})}function Nn(e){return e.getCommandHostAdapters?.()??{}}function Pn(e,t){let n=Nn(e).settings;if(n===void 0||t===`max`)return;let r=n.read();if(t===`auto`){let{effort:e,...t}=r;n.write(t);return}n.write({...r,effort:t})}async function Fn(t,n){let r;try{r=(0,e.parseModelEffort)(n.trim()||void 0,`/effort`),r===void 0&&(r=await jn(t))}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}let i=Mn(t);if(r===void 0)return{message:An(i),success:!0,data:{effort:i}};let a=Nn(t).effort,o;try{o=a===void 0?(0,e.resolveModelEffort)({command:r,modelDefault:i.effective}):await a.apply(r,t.getSession()),a===void 0&&await t.getSession().applyModelOptions({effort:r}),t.getCommandInvocationSource()===`user`&&Pn(t,r)}catch(e){return{message:`Model effort was not applied: ${e instanceof Error?e.message:String(e)}`,success:!1}}return{message:An(o),success:!0,data:{effort:o}}}const In=`auto | ${t.MODEL_EFFORT_VALUES.join(` | `)}`;function Ln(){return{name:`effort`,displayName:`Model Effort`,description:`Show or change the model effort level`,source:`effort`,argumentHint:In,modelInvocable:!1}}function Rn(){let e=Ln();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Fn}}var zn=class{name=`effort`;getCommands(){return[Ln()]}};function Bn(){return{name:`agent-command-effort`,commandSources:[new zn],systemCommands:[Rn()]}}async function Vn(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`exit`,`Exit the session?`)))?{success:!0,message:`Exit cancelled.`}:{success:!0,message:`Exit requested.`,hostActions:[(0,e.createSessionExitHostAction)()]}}function Hn(){return{name:`exit`,displayName:`Exit Session`,description:e.EXIT_COMMAND_DESCRIPTION,source:`exit`,modelInvocable:!1}}function Un(){let e=Hn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Vn}}var Wn=class{name=`exit`;getCommands(){return[Hn()]}};function Gn(){return{name:`agent-command-exit`,commandSources:[new Wn],systemCommands:[Un()]}}const Kn=`none`,qn=`--same-dir`;function Jn(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0),n=t.find(e=>e.startsWith(`--`)&&e!==qn);if(n!==void 0)return{error:`Unknown option: ${n}\nUsage: /fork [name] [${qn}]`};let r=t.filter(e=>e!==qn);return{name:r.length>0?r.join(` `):void 0,isolation:t.includes(qn)?Kn:`worktree`}}function Yn(e){return e instanceof Error?e.message:String(e)}function Xn(e,t,n){return[`Forked this conversation into "${e}" (${t}), running ${n===Kn?`in this directory`:`in its own worktree`}.`,`The fork is a copy: this session keeps going, and the two are separate records.`,`See its progress with /background list. Attaching from the background panel points this`,`terminal at the copy as it was forked; the fork's own turns stay in its task transcript.`].join(`
24
+ `)}function Zn(e,t,n){let r=n?.(e.sessionId);return`The fork "${e.name}" was written (${e.sessionId}) but its background job could not start: ${t}\n${r===void 0?`Resume the saved session through your host.`:`Resume it in a new terminal with: ${r}`}`}async function Qn(e,t=``,n){let r=Jn(t);if(`error`in r)return{message:r.error,success:!1};let i=e.getAgentJobCapability();if(!i)return{message:`This session cannot start background jobs, so it cannot run a fork.`,success:!1};let a;try{a=await e.forkSession(r.name===void 0?{}:{name:r.name})}catch(e){return{message:`Could not fork this session: ${Yn(e)}`,success:!1}}try{let e=await i.spawnAgentJob({agentType:`general-purpose`,label:a.name,mode:`background`,prompt:`Continue.`,isolation:r.isolation,resumeSessionId:a.sessionId});return{message:Xn(a.name,e.id,r.isolation),success:!0,data:{sessionId:a.sessionId,name:a.name,taskId:e.id}}}catch(e){return{message:Zn(a,Yn(e),n),success:!1}}}function $n(){return{name:`fork`,displayName:`Fork Session`,description:`Copy this conversation into a new background session and keep working here. The fork inherits the whole conversation and the assembled system prompt; it is a copy, so nothing it does reaches this session and it never merges back.`,source:`fork`,modelInvocable:!1,argumentHint:`[name] [--same-dir]`}}function er(e){let t=$n();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,...t.argumentHint===void 0?{}:{argumentHint:t.argumentHint},execute:(t,n)=>Qn(t,n,e)}}var tr=class{name=`fork`;getCommands(){return[$n()]}};function nr(e){return{name:`agent-command-fork`,commandSources:[new tr],systemCommands:[er(e)],sessionRequirements:[`runtime`]}}const rr=[`build`,`chore`,`ci`,`docs`,`feat`,`fix`,`perf`,`refactor`,`revert`,`style`,`test`],ir=/^([^\s():!]+)(\(([^\s()]+)\))?(!)?: (.*)$/;function ar(e){if(e.trim().length===0)return{ok:!1,reason:`the subject is empty`};if(e.indexOf(`: `)===-1)return{ok:!1,reason:"the subject has no `: ` type separator — the form is `<type>[(scope)][!]: <description>`"};let t=ir.exec(e);if(!t)return{ok:!1,reason:"the part before `: ` must be a type word with an optional `(scope)` and `!` — the form is `<type>[(scope)][!]: <description>`"};let n=t[1]??``;if((t[5]??``).trim().length===0)return{ok:!1,reason:"the description after `: ` is empty"};let r=[];return rr.includes(n)||r.push(`type "${n}" is not one of the conventional types (${rr.join(`, `)})`),e.length>72&&r.push(`the subject is ${e.length} characters; 72 is the conventional limit`),e.endsWith(`.`)&&r.push(`the subject ends with a period`),{ok:!0,warnings:r}}function or(e){let t=e.trim();return t===`-m`?``:(t.startsWith(`-m `)&&(t=t.slice(3).trim()),t.length>=2&&(t.startsWith(`"`)||t.startsWith(`'`))&&t.endsWith(t[0]??``)&&(t=t.slice(1,-1).trim()),t)}function sr(e){return{success:!1,message:e,data:{git:`commit`,committed:!1}}}async function cr(e){let n=await e.ask((0,t.textAction)(`git-commit-subject`,`Commit message`,{description:`Conventional Commits form: <type>[(scope)][!]: <description>`,placeholder:`feat: describe the change`}));if(n.type===`answer`)return or(n.text??n.values[0]??``)}async function lr(t,n){let r=await t.run([`diff`,`--cached`,`--quiet`],{cwd:n});if(r.kind===`failed`||r.exitCode!==0&&r.exitCode!==1)return{staged:!1,result:{success:!1,message:(0,e.gitFailureMessage)(`diff --cached`,r)??`git failed`}};if(r.exitCode===1)return{staged:!0};let i=await t.run(e.GIT_STATUS_ARGS,{cwd:n}),a=(0,e.gitFailureMessage)(`status`,i);if(a!==void 0||i.kind!==`exited`)return{staged:!1,result:{success:!1,message:a??`git status failed`}};let o=(0,e.parseStatusPorcelainV2)(i.stdout);return{staged:!1,result:{success:!1,message:`Nothing is staged (${o.unstaged.length} unstaged, ${o.untracked.length} untracked). Stage files with \`git add\` or \`/shell git add ...\` and run \`/git commit\` again.`,data:{git:`commit`,committed:!1,unstaged:o.unstaged.length,untracked:o.untracked.length}}}}async function ur(e,t){let n=or(e);if(n.length===0){if(t===void 0)return{result:sr("Commit cancelled: a commit message was needed and none could be asked for (no interactive session). Run `/git commit <subject>`.")};let e=await cr(t);if(e===void 0||e.length===0)return{result:sr(`Commit cancelled.`)};n=e}return{subject:n}}async function dr(n,r,i,a,o){if(o===void 0)return{confirmed:!1,result:sr(`Commit cancelled: a confirmation was needed and none could be asked for (no interactive session).`)};let s=await n.run([`diff`,`--cached`,`--name-status`],{cwd:r}),c=(0,e.gitFailureMessage)(`diff --cached --name-status`,s);if(c!==void 0||s.kind!==`exited`)return{confirmed:!1,result:{success:!1,message:c??`git failed`}};let l=s.stdout.split(`
25
25
  `).filter(e=>e.length>0).map(e=>e.replace(/\t/g,` `)),u=[`Message: ${i}`,...a.map(e=>`Warning: ${e}`),`Staged (${l.length}):`,...l.map(e=>` ${e}`)].join(`
26
- `);return(0,t.isConfirmed)(await o.ask((0,t.confirmAction)(`git-commit`,`Commit ${l.length} staged file(s)?`,{description:u,defaultYes:!1})))?{confirmed:!0,files:l}:{confirmed:!1,result:j(`Commit cancelled.`)}}async function pr(t,n,r,i){let a=await ur(t,n);if(!a.staged)return a.result;let o=await dr(r,i);if(!(`subject`in o))return o.result;let{subject:s}=o,c=sr(s);if(!c.ok)return{success:!1,message:`Commit refused: ${c.reason}.`,data:{git:`commit`,committed:!1,subject:s}};let l=await fr(t,n,s,c.warnings,i);if(!l.confirmed)return l.result;let u=await t.run([`commit`,`-m`,s],{cwd:n}),d=(0,e.gitFailureMessage)(`commit`,u);if(d!==void 0||u.kind!==`exited`)return{success:!1,message:d??`git commit failed`};let f=u.stdout.split(`
27
- `).find(e=>e.trim().length>0)??``;return{success:!0,message:`Committed: ${f.length>0?f:s}`,data:{git:`commit`,committed:!0,subject:s,files:l.files}}}const mr=`Usage: /git status | /git diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | /git commit [<subject>]`;function hr(e,t,n){return{name:e,description:t,source:`git`,modelInvocable:!1,...n?{argumentHint:n}:{}}}function gr(){return{name:`git`,displayName:`Git`,description:`Show the git status, view a diff, or commit the staged changes after confirming`,source:`git`,modelInvocable:!1,argumentHint:`status | diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | commit [<subject>]`,subcommands:[hr(`status`,`Show the branch and the staged, unstaged and untracked paths`),hr(`diff`,`Show the unstaged diff, the staged diff, or a diff against one or two revisions`,`[--staged | <rev> | <a>..<b>] [-- <path> ...]`),hr(`commit`,`Commit the staged changes with a Conventional Commits subject, after confirming`,`[<subject>]`)]}}async function _r(t,n,r=(0,e.createGitProcess)()){let i=n.trim(),a=i.search(/\s/),o=a===-1?i:i.slice(0,a),s=a===-1?``:i.slice(a+1).trim(),c=t.getCwd();switch(o){case`status`:return s.length>0?{success:!1,message:`\`/git status\` takes no arguments.\n${mr}`}:(0,e.executeGitStatus)(r,c);case`diff`:return(0,e.executeGitDiff)(r,c,s);case`commit`:return pr(r,c,s,t.getUserInteraction());default:return{success:!1,message:o.length===0?mr:`Unknown /git verb "${o}".\n${mr}`}}}function vr(e){let t=gr();return{name:t.name,displayName:t.displayName,description:t.description,argumentHint:t.argumentHint,example:`/git status`,subcommands:t.subcommands,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`blocking`,execute:(t,n)=>_r(t,n,e)}}var yr=class{name=`git`;getCommands(){return[gr()]}};function br(t={}){return{name:`agent-command-git`,commandSources:[new yr],systemCommands:[vr(t.port??(0,e.createGitProcess)())]}}const xr=`Assign an autonomous goal the agent pursues across turns until satisfied.`;function Sr(e){let t=[`Goal: ${e.objective}`,`Status: ${e.status}${e.stopReason?` (${e.stopReason})`:``}`,`Iterations: ${e.iterations} / ${e.maxIterations}`],n=e.progress[e.progress.length-1];return n?.reason&&t.push(`Latest: ${n.reason}`),t.join(`
28
- `)}async function Cr(t,n){let r=n.trim(),i=r.split(/\s+/)[0]?.toLowerCase()??``;if(r.length===0||i===`help`)return{message:`Usage:
26
+ `);return(0,t.isConfirmed)(await o.ask((0,t.confirmAction)(`git-commit`,`Commit ${l.length} staged file(s)?`,{description:u,defaultYes:!1})))?{confirmed:!0,files:l}:{confirmed:!1,result:sr(`Commit cancelled.`)}}async function fr(t,n,r,i){let a=await lr(t,n);if(!a.staged)return a.result;let o=await ur(r,i);if(!(`subject`in o))return o.result;let{subject:s}=o,c=ar(s);if(!c.ok)return{success:!1,message:`Commit refused: ${c.reason}.`,data:{git:`commit`,committed:!1,subject:s}};let l=await dr(t,n,s,c.warnings,i);if(!l.confirmed)return l.result;let u=await t.run([`commit`,`-m`,s],{cwd:n}),d=(0,e.gitFailureMessage)(`commit`,u);if(d!==void 0||u.kind!==`exited`)return{success:!1,message:d??`git commit failed`};let f=u.stdout.split(`
27
+ `).find(e=>e.trim().length>0)??``;return{success:!0,message:`Committed: ${f.length>0?f:s}`,data:{git:`commit`,committed:!0,subject:s,files:l.files}}}const pr=`Usage: /git status | /git diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | /git commit [<subject>]`;function mr(e,t,n){return{name:e,description:t,source:`git`,modelInvocable:!1,...n?{argumentHint:n}:{}}}function hr(){return{name:`git`,displayName:`Git`,description:`Show the git status, view a diff, or commit the staged changes after confirming`,source:`git`,modelInvocable:!1,argumentHint:`status | diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | commit [<subject>]`,subcommands:[mr(`status`,`Show the branch and the staged, unstaged and untracked paths`),mr(`diff`,`Show the unstaged diff, the staged diff, or a diff against one or two revisions`,`[--staged | <rev> | <a>..<b>] [-- <path> ...]`),mr(`commit`,`Commit the staged changes with a Conventional Commits subject, after confirming`,`[<subject>]`)]}}async function gr(t,n,r=(0,e.createGitProcess)()){let i=n.trim(),a=i.search(/\s/),o=a===-1?i:i.slice(0,a),s=a===-1?``:i.slice(a+1).trim(),c=t.getCwd();switch(o){case`status`:return s.length>0?{success:!1,message:`\`/git status\` takes no arguments.\n${pr}`}:(0,e.executeGitStatus)(r,c);case`diff`:return(0,e.executeGitDiff)(r,c,s);case`commit`:return fr(r,c,s,t.getUserInteraction());default:return{success:!1,message:o.length===0?pr:`Unknown /git verb "${o}".\n${pr}`}}}function _r(e){let t=hr();return{name:t.name,displayName:t.displayName,description:t.description,argumentHint:t.argumentHint,example:`/git status`,subcommands:t.subcommands,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`blocking`,execute:(t,n)=>gr(t,n,e)}}var vr=class{name=`git`;getCommands(){return[hr()]}};function yr(t={}){return{name:`agent-command-git`,commandSources:[new vr],systemCommands:[_r(t.port??(0,e.createGitProcess)())]}}const br=`Assign an autonomous goal the agent pursues across turns until satisfied.`;function xr(e){let t=[`Goal: ${e.objective}`,`Status: ${e.status}${e.stopReason?` (${e.stopReason})`:``}`,`Iterations: ${e.iterations} / ${e.maxIterations}`],n=e.progress[e.progress.length-1];return n?.reason&&t.push(`Latest: ${n.reason}`),t.join(`
28
+ `)}async function Sr(t,n){let r=n.trim(),i=r.split(/\s+/)[0]?.toLowerCase()??``;if(r.length===0||i===`help`)return{message:`Usage:
29
29
  /goal <objective> assign a goal and pursue it autonomously
30
30
  /goal status show the current goal and progress
31
- /goal cancel stop the current goal`,success:!0};if(i===`status`){let e=t.getGoalState();return e?{message:Sr(e),success:!0,data:{status:e.status}}:{message:`No goal is set.`,success:!0}}if((0,e.isGoalCancelVerb)(r)){let e=t.cancelGoal();return e?{message:`Goal cancelled: ${e.objective}`,success:!0}:{message:`No active goal to cancel.`,success:!1}}let a;try{a=await t.setGoal(r)}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return{message:`Goal set — pursuing autonomously (up to ${a.maxIterations} iterations):\n${a.objective}`,success:!0,data:{goalId:a.id}}}function wr(){return{name:`goal`,displayName:`Autonomous Goal`,description:xr,source:`goal`,modelInvocable:!1}}function Tr(){let e=wr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Cr}}var Er=class{name=`goal`;getCommands(){return[wr()]}};function Dr(){return{name:`agent-command-goal`,commandSources:[new Er],systemCommands:[Tr()]}}function M(e){return e.stillMine?`This session is still on this machine, and still yours to use.`:`This session now belongs to the destination, and this one ends.`}function Or(e){return e.map(e=>` ${e.deviceId}${e.name?` ${e.name}`:``}`).join(`
32
- `)}function kr(){return{success:!0,message:[`Usage:`,` /handoff list where this session could move to`,` /handoff <session-or-device-id> move it there, after confirming what stays behind`].join(`
33
- `)}}async function Ar(e,t){let n=e.getCommandHostAdapters?.().handoff;if(n===void 0)return{success:!1,message:`This session has no hand-off carrier, so it cannot be moved to another machine. Nothing changed — the session is still here.`};let r=t.trim();if(r===``||r===`help`){let e=await n.destinations();return e.length===0?{success:!0,message:`No other machine is reachable for a hand-off right now.
34
- `+M(n.status())}:{success:!0,message:[`This session could move to:`,Or(e),``,kr().message??``].join(`
35
- `)}}let i=await n.destinations();if(!i.some(e=>e.deviceId===r))return{success:!1,message:`No reachable machine is called '${r}'.\n`+(i.length>0?`Reachable now:\n${Or(i)}`:`None are reachable right now.`)+`\n${M(n.status())}`};let a=await n.staysBehind(),o=[a.uncommittedChanges?` - uncommitted changes in the working tree stay on THIS machine`:null,a.subprocesses>0?` - ${a.subprocesses} running process(es) stay on THIS machine and will not be reachable there`:null,` - the destination uses ITS OWN provider credential; credentials are never transferred`].filter(e=>e!==null),s=e.getUserInteraction?.();if(s===void 0)return{success:!1,message:`A hand-off needs a person to confirm what stays behind, and no interactive session is attached.\n${M(n.status())}`};let c=await s.ask({id:`handoff:${r}`,title:`Move this session to ${r}?`,description:[`What will NOT travel:`,...o].join(`
36
- `),options:[{value:`move`,label:`Move it to ${r}`},{value:`stay`,label:`Keep it here`}]});if(c.type!==`answer`||!c.values.includes(`move`))return{success:!0,message:`Hand-off cancelled.\n${M(n.status())}`};let l=[],u=await n.transfer(r,e=>{l.push(jr(e,r))});return{success:u.state===`done`,message:[...l,u.state===`done`?`Hand-off complete. ${r} saved this session and has not started it; resume it there.`:`Hand-off stopped: ${u.reason??`no reason was reported`}.`,M(u)].join(`
37
- `)}}function jr(e,t){switch(e.state){case`offered`:return`Offering the session to ${t}...`;case`sending`:return`Sending the session...`;case`awaiting-confirmation`:return`Sent. Waiting for ${t} to confirm it has the session on disk — until it does, this machine keeps it.`;case`done`:return`${t} confirmed it has the session.`;case`stopped`:return`Stopped: ${e.reason??`no reason was reported`}.`;default:return``}}function Mr(){return{name:`handoff`,displayName:`Hand off`,description:"Push this conversation to another running session for the same user on this machine, or to another linked device, after the operator confirms what stays behind (uncommitted changes, running processes; credentials never travel). The receiving operator must also accept; the session arrives saved, not started, and this one ends once it is saved there. With no argument it lists the sessions and devices it could go to. User-only: the model cannot run it; when the user wants to continue this work in another session or on another device, suggest they run `/handoff <session-or-device-id>`.",source:`handoff`,modelInvocable:!1,userInvocable:!0,argumentHint:`[session-id]`}}function Nr(){let e=Mr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Ar(e,t)}}var Pr=class{name=`handoff`;getCommands(){return[Mr()]}};function Fr(){return{name:`agent-command-handoff`,commandSources:[new Pr],systemCommands:[Nr()]}}function Ir(t,n){return{success:!0,message:(0,e.formatCommandHelpMessage)(t)}}function Lr(){return{name:`help`,displayName:`Help`,description:e.HELP_COMMAND_DESCRIPTION,source:`help`,modelInvocable:!1}}function Rr(){let e=Lr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Ir}}var zr=class{name=`help`;getCommands(){return[Lr()]}};function Br(){return{name:`agent-command-help`,commandSources:[new zr],systemCommands:[Rr()]}}function Vr(){return{name:`keybindings`,displayName:`Keybindings`,description:`Open the contextual terminal keybindings file in $EDITOR`,source:`keybindings`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}async function Hr(e,t){if(!e)return{success:!1,message:`Key bindings are available in an interactive terminal. Run /keybindings there.`};if(!t.canHandoffTerminal())return{success:!1,message:`Keybindings editor is unavailable here.`};let n=await e.ensureFile(),r=_n(),i=await t.runWithTerminal(()=>A(r.command,[...r.args,n],t.getCwd()));return i===0?{success:!0,message:`Opened keybindings: ${n}`,data:{path:n}}:{success:!1,message:`Keybindings editor exited with code ${i}.`,data:{path:n,exitCode:i}}}var Ur=class{name=`keybindings`;getCommands(){return[Vr()]}};function Wr(e){let t=Vr(),n={name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:t=>Hr(e,t)};return{name:`agent-command-keybindings`,commandSources:[new Ur],systemCommands:[n]}}async function Gr(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildLanguageCommandSubcommands)().map(e=>({value:e.name,label:e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`language`,`Select language`,i)),o=a.type===`answer`?a.values[0]:void 0;return o===void 0?void 0:(0,e.parseLanguageArgument)(o)}async function Kr(t,n){let r=(0,e.parseLanguageArgument)(n);return r===void 0&&(r=await Gr(t),r===void 0)?{message:(0,e.formatLanguageUsageMessage)(),success:!1}:{message:`Language set to "${r}".`,success:!0,data:{language:r},hostActions:[{type:`language-change`,language:r}]}}function qr(){return{name:`language`,displayName:`Language`,description:e.LANGUAGE_COMMAND_DESCRIPTION,source:`language`,argumentHint:e.LANGUAGE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildLanguageCommandSubcommands)(`language`),modelInvocable:!1}}function Jr(){let e=qr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Kr}}var Yr=class{name=`language`;getCommands(){return[qr()]}};function Xr(){return{name:`agent-command-language`,commandSources:[new Yr],systemCommands:[Jr()]}}function Zr(e,n,r=`session`,i){let a=(0,t.shellArgumentForDisplay)(e)??`<server>`;switch(n){case`approve`:return`/mcp approve ${a}`;case`sign-in`:return r===`terminal`?i===void 0?void 0:`${i} mcp login ${a}`:`/mcp login ${a}`;case`trust-workspace`:return i===void 0?void 0:`${i} trust`}}const Qr={approve:`is waiting for the user’s approval`,"sign-in":`needs the user to sign in`,"trust-workspace":`needs the user to trust this workspace`};function $r(e){let n=(0,t.shellArgumentForDisplay)(e);return n===void 0?"An MCP server (its name cannot be shown here; `/mcp status` lists it)":`MCP server "${n}"`}function ei(e,t,n=`session`,r){let i=t===`trust-workspace`||t===`sign-in`&&n===`terminal`?` in a terminal, then restart the session`:``,a=Zr(e,t,n,r),o=a===void 0?t===`trust-workspace`?`ask the user to trust this workspace in a terminal`:`ask the user to sign in from a terminal`:`ask the user to run \`${a}\`${i}`;return`${$r(e)} ${Qr[t]}, so its tools are unavailable. You cannot do this yourself; ${o}.`}function ti(e,t){if(e.size!==0)return[`MCP servers that did not start this session. Mention this only when the user needs one of these servers or its tools:`,...[...e].map(([e,n])=>`- ${ei(e,n,`session`,t)}`)].join(`
38
- `)}function ni(e,t){if(e===`pending`||e===`stale`)return`approve`;if(e===`untrusted`)return`trust-workspace`;if(e===`approved`&&(t===`sign-in-required`||t===`signed-out`))return`sign-in`}function ri(e,n,r,i){let a=(0,t.shellArgumentForDisplay)(e.serverId),o=ni(e.status,n);return{...a===void 0?{}:{name:a},status:e.status,...n===void 0?{}:{oauth:n},...o===void 0?{}:(()=>{let t=Zr(e.serverId,o,r,i);return t===void 0?{}:{suggestCommand:t}})()}}function ii(e){let t=e.name??`(name not shown)`,n=e.oauth===void 0?``:` — sign-in: ${e.oauth}`,r=e.suggestCommand===void 0?``:` — ask the user to run \`${e.suggestCommand}\``;return` ${t} — ${e.status}${n}${r}`}async function ai(e,t){if(!e)return{message:`MCP is not available in this environment.`,success:!0};let n=new Map((await e.oauthStatus?.()??[]).map(e=>[e.serverId,e.state])),r=e.list().map(r=>ri(r,n.get(r.serverId),e.userActionSurface??`session`,t)),i=(e.sourceProblems?.()??[]).length,a=r.length===0?[`No MCP servers are configured.`]:[`MCP servers:`,...r.map(ii)];return i>0&&a.push(`${i} MCP configuration source(s) could not be read; the user can see which with \`/mcp status\`.`),{message:a.join(`
39
- `),success:!0,data:{servers:r,unreadableSources:i}}}function N(e){return e.getCommandHostAdapters?.().mcpActivation}const oi={"signed-in":`signed in`,"expired-refreshable":`token expired, will refresh`,"sign-in-required":`sign-in required`,"signed-out":`signed out`},si={refresh_token:`refresh token`,access_token:`access token`};function ci(e){let t=e.revocationFailure??`revocation-failed`;switch(e.revocation){case`revoked`:return`the tokens were revoked`;case`not-attempted`:return`there were no tokens to revoke`;case`unsupported`:return`the authorization server offers no token revocation; the tokens stay valid until they expire`;case`failed`:return`token revocation failed (${t}); the tokens stay valid until they expire`;case`partial`:return(e.tokens??[]).map(e=>e.revoked?`the ${si[e.token]} was revoked`:`the ${si[e.token]} was not (${e.failure??`revocation-failed`}) and stays valid until it expires`).join(`; `)}}function P(e){return(0,t.shellArgumentForDisplay)(e)??`<server>`}function li(e,n){let r=P(e),i=`run /mcp login ${r}, or ${n===void 0?`sign in from a terminal`:`run ${n} mcp login ${r} in a terminal`}`;return(0,t.shellArgumentForDisplay)(e)===void 0?` (${i}; its name cannot be shown safely here)`:` (${i})`}function ui(e,t,n){let r=e.displayName?` (${e.displayName})`:``,i=t===void 0?``:` — OAuth: ${oi[t]}${t===`sign-in-required`||t===`signed-out`?li(e.serverId,n):``}`;return` ${e.serverId}${r} — ${e.status} — ${e.source} — ${e.reason}${i}`}function di(e){let t=e.blockedServerNames??[],n=t.length===0?``:` Blocked until fixed: ${t.join(`, `)}.`;return` ${e.source} (${e.origin}) could not be read: ${e.reason}.${n}`}async function fi(e){let t=await e.oauthStatus?.()??[];return new Map(t.map(e=>[e.serverId,e.state]))}async function pi(e,t){if(!e)return{message:`MCP activation management is not available in this environment.`,success:!0};let n=e.list(),r=await fi(e),i=e.sourceProblems?.()??[],a=i.length===0?[]:[`MCP source problems:\n${i.map(di).join(`
40
- `)}`];return n.length===0?{message:a.length===0?`No MCP definitions are registered.`:a[0],success:!0,data:{servers:[],sourceProblems:i}}:{message:[`MCP activation status:\n${n.map(e=>ui(e,r.get(e.serverId),t)).join(`
31
+ /goal cancel stop the current goal`,success:!0};if(i===`status`){let e=t.getGoalState();return e?{message:xr(e),success:!0,data:{status:e.status}}:{message:`No goal is set.`,success:!0}}if((0,e.isGoalCancelVerb)(r)){let e=t.cancelGoal();return e?{message:`Goal cancelled: ${e.objective}`,success:!0}:{message:`No active goal to cancel.`,success:!1}}let a;try{a=await t.setGoal(r)}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return{message:`Goal set — pursuing autonomously (up to ${a.maxIterations} iterations):\n${a.objective}`,success:!0,data:{goalId:a.id}}}function Cr(){return{name:`goal`,displayName:`Autonomous Goal`,description:br,source:`goal`,modelInvocable:!1}}function wr(){let e=Cr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Sr}}var Tr=class{name=`goal`;getCommands(){return[Cr()]}};function Er(){return{name:`agent-command-goal`,commandSources:[new Tr],systemCommands:[wr()]}}function N(e){return e.stillMine?`This session is still on this machine, and still yours to use.`:`This session now belongs to the destination, and this one ends.`}function Dr(e){return e.map(e=>` ${e.deviceId}${e.name?` ${e.name}`:``}`).join(`
32
+ `)}function Or(){return{success:!0,message:[`Usage:`,` /handoff list where this session could move to`,` /handoff <session-or-device-id> move it there, after confirming what stays behind`].join(`
33
+ `)}}async function kr(e,t){let n=e.getCommandHostAdapters?.().handoff;if(n===void 0)return{success:!1,message:`This session has no hand-off carrier, so it cannot be moved to another machine. Nothing changed — the session is still here.`};let r=t.trim();if(r===``||r===`help`){let e=await n.destinations();return e.length===0?{success:!0,message:`No other machine is reachable for a hand-off right now.
34
+ `+N(n.status())}:{success:!0,message:[`This session could move to:`,Dr(e),``,Or().message??``].join(`
35
+ `)}}let i=await n.destinations();if(!i.some(e=>e.deviceId===r))return{success:!1,message:`No reachable machine is called '${r}'.\n`+(i.length>0?`Reachable now:\n${Dr(i)}`:`None are reachable right now.`)+`\n${N(n.status())}`};let a=await n.staysBehind(),o=[a.uncommittedChanges?` - uncommitted changes in the working tree stay on THIS machine`:null,a.subprocesses>0?` - ${a.subprocesses} running process(es) stay on THIS machine and will not be reachable there`:null,` - the destination uses ITS OWN provider credential; credentials are never transferred`].filter(e=>e!==null),s=e.getUserInteraction?.();if(s===void 0)return{success:!1,message:`A hand-off needs a person to confirm what stays behind, and no interactive session is attached.\n${N(n.status())}`};let c=await s.ask({id:`handoff:${r}`,title:`Move this session to ${r}?`,description:[`What will NOT travel:`,...o].join(`
36
+ `),options:[{value:`move`,label:`Move it to ${r}`},{value:`stay`,label:`Keep it here`}]});if(c.type!==`answer`||!c.values.includes(`move`))return{success:!0,message:`Hand-off cancelled.\n${N(n.status())}`};let l=[],u=await n.transfer(r,e=>{l.push(Ar(e,r))});return{success:u.state===`done`,message:[...l,u.state===`done`?`Hand-off complete. ${r} saved this session and has not started it; resume it there.`:`Hand-off stopped: ${u.reason??`no reason was reported`}.`,N(u)].join(`
37
+ `)}}function Ar(e,t){switch(e.state){case`offered`:return`Offering the session to ${t}...`;case`sending`:return`Sending the session...`;case`awaiting-confirmation`:return`Sent. Waiting for ${t} to confirm it has the session on disk — until it does, this machine keeps it.`;case`done`:return`${t} confirmed it has the session.`;case`stopped`:return`Stopped: ${e.reason??`no reason was reported`}.`;default:return``}}function jr(){return{name:`handoff`,displayName:`Hand off`,description:"Push this conversation to another running session for the same user on this machine, or to another linked device, after the operator confirms what stays behind (uncommitted changes, running processes; credentials never travel). The receiving operator must also accept; the session arrives saved, not started, and this one ends once it is saved there. With no argument it lists the sessions and devices it could go to. User-only: the model cannot run it; when the user wants to continue this work in another session or on another device, suggest they run `/handoff <session-or-device-id>`.",source:`handoff`,modelInvocable:!1,userInvocable:!0,argumentHint:`[session-id]`}}function Mr(){let e=jr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>kr(e,t)}}var Nr=class{name=`handoff`;getCommands(){return[jr()]}};function Pr(){return{name:`agent-command-handoff`,commandSources:[new Nr],systemCommands:[Mr()]}}function Fr(t,n){return{success:!0,message:(0,e.formatCommandHelpMessage)(t)}}function Ir(){return{name:`help`,displayName:`Help`,description:e.HELP_COMMAND_DESCRIPTION,source:`help`,modelInvocable:!1}}function Lr(){let e=Ir();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Fr}}var Rr=class{name=`help`;getCommands(){return[Ir()]}};function zr(){return{name:`agent-command-help`,commandSources:[new Rr],systemCommands:[Lr()]}}function Br(){return{name:`keybindings`,displayName:`Keybindings`,description:`Open the contextual terminal keybindings file in $EDITOR`,source:`keybindings`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}async function Vr(e,t){if(!e)return{success:!1,message:`Key bindings are available in an interactive terminal. Run /keybindings there.`};if(!t.canHandoffTerminal())return{success:!1,message:`Keybindings editor is unavailable here.`};let n=await e.ensureFile(),r=hn(),i=await t.runWithTerminal(()=>M(r.command,[...r.args,n],t.getCwd()));return i===0?{success:!0,message:`Opened keybindings: ${n}`,data:{path:n}}:{success:!1,message:`Keybindings editor exited with code ${i}.`,data:{path:n,exitCode:i}}}var Hr=class{name=`keybindings`;getCommands(){return[Br()]}};function Ur(e){let t=Br(),n={name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:t=>Vr(e,t)};return{name:`agent-command-keybindings`,commandSources:[new Hr],systemCommands:[n]}}async function Wr(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildLanguageCommandSubcommands)().map(e=>({value:e.name,label:e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`language`,`Select language`,i)),o=a.type===`answer`?a.values[0]:void 0;return o===void 0?void 0:(0,e.parseLanguageArgument)(o)}async function Gr(t,n){let r=(0,e.parseLanguageArgument)(n);return r===void 0&&(r=await Wr(t),r===void 0)?{message:(0,e.formatLanguageUsageMessage)(),success:!1}:{message:`Language set to "${r}".`,success:!0,data:{language:r},hostActions:[{type:`language-change`,language:r}]}}function Kr(){return{name:`language`,displayName:`Language`,description:e.LANGUAGE_COMMAND_DESCRIPTION,source:`language`,argumentHint:e.LANGUAGE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildLanguageCommandSubcommands)(`language`),modelInvocable:!1}}function qr(){let e=Kr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Gr}}var Jr=class{name=`language`;getCommands(){return[Kr()]}};function Yr(){return{name:`agent-command-language`,commandSources:[new Jr],systemCommands:[qr()]}}function Xr(e,n,r=`session`,i){let a=(0,t.shellArgumentForDisplay)(e)??`<server>`;switch(n){case`approve`:return`/mcp approve ${a}`;case`sign-in`:return r===`terminal`?i===void 0?void 0:`${i} mcp login ${a}`:`/mcp login ${a}`;case`trust-workspace`:return i===void 0?void 0:`${i} trust`}}const Zr={approve:`is waiting for the user’s approval`,"sign-in":`needs the user to sign in`,"trust-workspace":`needs the user to trust this workspace`};function Qr(e){let n=(0,t.shellArgumentForDisplay)(e);return n===void 0?"An MCP server (its name cannot be shown here; `/mcp status` lists it)":`MCP server "${n}"`}function $r(e,t,n=`session`,r){let i=t===`trust-workspace`||t===`sign-in`&&n===`terminal`?` in a terminal, then restart the session`:``,a=Xr(e,t,n,r),o=a===void 0?t===`trust-workspace`?`ask the user to trust this workspace in a terminal`:`ask the user to sign in from a terminal`:`ask the user to run \`${a}\`${i}`;return`${Qr(e)} ${Zr[t]}, so its tools are unavailable. You cannot do this yourself; ${o}.`}function ei(e,t){if(e.size!==0)return[`MCP servers that did not start this session. Mention this only when the user needs one of these servers or its tools:`,...[...e].map(([e,n])=>`- ${$r(e,n,`session`,t)}`)].join(`
38
+ `)}function ti(e,t){if(e===`pending`||e===`stale`)return`approve`;if(e===`untrusted`)return`trust-workspace`;if(e===`approved`&&(t===`sign-in-required`||t===`signed-out`))return`sign-in`}function ni(e,n,r,i){let a=(0,t.shellArgumentForDisplay)(e.serverId),o=ti(e.status,n);return{...a===void 0?{}:{name:a},status:e.status,...n===void 0?{}:{oauth:n},...o===void 0?{}:(()=>{let t=Xr(e.serverId,o,r,i);return t===void 0?{}:{suggestCommand:t}})()}}function ri(e){let t=e.name??`(name not shown)`,n=e.oauth===void 0?``:` — sign-in: ${e.oauth}`,r=e.suggestCommand===void 0?``:` — ask the user to run \`${e.suggestCommand}\``;return` ${t} — ${e.status}${n}${r}`}async function ii(e,t){if(!e)return{message:`MCP is not available in this environment.`,success:!0};let n=new Map((await e.oauthStatus?.()??[]).map(e=>[e.serverId,e.state])),r=e.list().map(r=>ni(r,n.get(r.serverId),e.userActionSurface??`session`,t)),i=(e.sourceProblems?.()??[]).length,a=r.length===0?[`No MCP servers are configured.`]:[`MCP servers:`,...r.map(ri)];return i>0&&a.push(`${i} MCP configuration source(s) could not be read; the user can see which with \`/mcp status\`.`),{message:a.join(`
39
+ `),success:!0,data:{servers:r,unreadableSources:i}}}function P(e){return e.getCommandHostAdapters?.().mcpActivation}const ai={"signed-in":`signed in`,"expired-refreshable":`token expired, will refresh`,"sign-in-required":`sign-in required`,"signed-out":`signed out`},oi={refresh_token:`refresh token`,access_token:`access token`};function si(e){let t=e.revocationFailure??`revocation-failed`;switch(e.revocation){case`revoked`:return`the tokens were revoked`;case`not-attempted`:return`there were no tokens to revoke`;case`unsupported`:return`the authorization server offers no token revocation; the tokens stay valid until they expire`;case`failed`:return`token revocation failed (${t}); the tokens stay valid until they expire`;case`partial`:return(e.tokens??[]).map(e=>e.revoked?`the ${oi[e.token]} was revoked`:`the ${oi[e.token]} was not (${e.failure??`revocation-failed`}) and stays valid until it expires`).join(`; `)}}function F(e){return(0,t.shellArgumentForDisplay)(e)??`<server>`}function ci(e,n){let r=F(e),i=`run /mcp login ${r}, or ${n===void 0?`sign in from a terminal`:`run ${n} mcp login ${r} in a terminal`}`;return(0,t.shellArgumentForDisplay)(e)===void 0?` (${i}; its name cannot be shown safely here)`:` (${i})`}function li(e,t,n){let r=e.displayName?` (${e.displayName})`:``,i=t===void 0?``:` — OAuth: ${ai[t]}${t===`sign-in-required`||t===`signed-out`?ci(e.serverId,n):``}`;return` ${e.serverId}${r} — ${e.status} — ${e.source} — ${e.reason}${i}`}function ui(e){let t=e.blockedServerNames??[],n=t.length===0?``:` Blocked until fixed: ${t.join(`, `)}.`;return` ${e.source} (${e.origin}) could not be read: ${e.reason}.${n}`}async function di(e){let t=await e.oauthStatus?.()??[];return new Map(t.map(e=>[e.serverId,e.state]))}async function fi(e,t){if(!e)return{message:`MCP activation management is not available in this environment.`,success:!0};let n=e.list(),r=await di(e),i=e.sourceProblems?.()??[],a=i.length===0?[]:[`MCP source problems:\n${i.map(ui).join(`
40
+ `)}`];return n.length===0?{message:a.length===0?`No MCP definitions are registered.`:a[0],success:!0,data:{servers:[],sourceProblems:i}}:{message:[`MCP activation status:\n${n.map(e=>li(e,r.get(e.serverId),t)).join(`
41
41
  `)}`,...a].join(`
42
42
 
43
- `),success:!0,data:{servers:n.map(e=>({serverId:e.serverId,...e.displayName===void 0?{}:{displayName:e.displayName},source:e.source,status:e.status,allowed:e.allowed,provenanceId:e.provenanceId,definitionFingerprint:e.definitionFingerprint,securityIdentity:e.securityIdentity,...r.has(e.serverId)?{oauth:r.get(e.serverId)}:{},...e.connection===void 0?{}:{connection:e.connection},...e.connectionFailureReason===void 0?{}:{connectionFailureReason:e.connectionFailureReason},...e.toolNames===void 0?{}:{toolNames:e.toolNames}})),sourceProblems:i}}}async function mi(e,t){let n=t.trim(),r=n.indexOf(` `),i=e.getCommandProductVocabulary?.()?.cliName,a=(r===-1?n:n.slice(0,r)).toLowerCase(),o=r===-1?``:n.slice(r+1).trim();if(a.startsWith(`skill-`))return gi(e,a,o);if(a===``||a===`status`||a===`list`){let t=e.getCommandInvocationSource?.();return t===`user`||t===`remote`?pi(N(e),i):ai(N(e),i)}if(a===`login`)return Ci(e,o);if(a===`reload`)return vi(e);if(a!==`approve`&&a!==`reject`&&a!==`revoke`&&a!==`logout`)return{message:`Unknown argument. Usage: /mcp [status] | /mcp <approve|reject|revoke|logout> <serverId> | /mcp login <serverId> [--no-browser] | /mcp reload`,success:!1};if(!o)return{message:`Usage: /mcp ${a} <serverId>`,success:!1};let s=N(e);if(!s)return{message:`MCP activation management is not available in this environment.`,success:!0};if(a===`logout`)return _i(s,o);try{let t=await s[a](o),n={message:`MCP server ${o} is now ${t.status}. ${t.reason}`,success:t.status===`approved`||t.status===`rejected`||t.status===`revoked`,data:{serverId:t.serverId,status:t.status,allowed:t.allowed,source:t.source,provenanceId:t.provenanceId,definitionFingerprint:t.definitionFingerprint,securityIdentity:t.securityIdentity}};if(a!==`approve`||t.status!==`approved`||s.reload===void 0)return n;try{let t=await vi(e);return{...n,message:`${n.message} ${t.message}`,data:{...n.data,reload:t.data??{}}}}catch(e){let t=e instanceof Error?e.message:String(e);return{...n,message:`${n.message} Could not connect now: ${t}. Run /mcp reload to retry.`}}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function hi(e){if(!e.startsWith(`[`))return e.split(/\s+/).filter(Boolean);try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(e=>typeof e==`string`)?t:void 0}catch{return}}async function gi(e,t,n){let r=e.getCommandInvocationSource?.(),i=r===`user`||r===`remote`&&e.getCommandSurfaceLocalityEvidence?.()===`local`;if(t!==`skill-list`&&!i)return{success:!1,message:`Only a known local user can inspect, approve or withdraw MCP skill instructions.`};let a=hi(n),o=t===`skill-list`?1:t===`skill-approve`?3:2;if(![`skill-list`,`skill-inspect`,`skill-approve`,`skill-withdraw`].includes(t)||!a||a.length!==o||a.some(e=>e.length===0))return{success:!1,message:`Usage: /mcp skill-list <server> | skill-inspect <server> <uri> | skill-approve <server> <uri> <fingerprint> | skill-withdraw <server> <uri>. JSON string arrays also accept opaque arguments.`};let s=N(e)?.skills;if(!s)return{success:!1,message:`MCP Skills are not available in this environment.`};let c=a[0],l=a[1];try{if(t===`skill-list`){let e=await s.list(c);return{success:!0,message:e.length===0?`No MCP skills are advertised.`:e.map(e=>`${e.name} — ${e.uri}\n${e.description}`+(e.invocationName?`\nInvoke skill: ${e.invocationName}`:``)+(e.unavailableReason?`\nUnavailable: ${e.unavailableReason}`:``)).join(`
43
+ `),success:!0,data:{servers:n.map(e=>({serverId:e.serverId,...e.displayName===void 0?{}:{displayName:e.displayName},source:e.source,status:e.status,allowed:e.allowed,provenanceId:e.provenanceId,definitionFingerprint:e.definitionFingerprint,securityIdentity:e.securityIdentity,...r.has(e.serverId)?{oauth:r.get(e.serverId)}:{},...e.connection===void 0?{}:{connection:e.connection},...e.connectionFailureReason===void 0?{}:{connectionFailureReason:e.connectionFailureReason},...e.toolNames===void 0?{}:{toolNames:e.toolNames}})),sourceProblems:i}}}async function pi(e,t){let n=t.trim(),r=n.indexOf(` `),i=e.getCommandProductVocabulary?.()?.cliName,a=(r===-1?n:n.slice(0,r)).toLowerCase(),o=r===-1?``:n.slice(r+1).trim();if(a.startsWith(`skill-`))return hi(e,a,o);if(a===``||a===`status`||a===`list`){let t=e.getCommandInvocationSource?.();return t===`user`||t===`remote`?fi(P(e),i):ii(P(e),i)}if(a===`login`)return Si(e,o);if(a===`reload`)return _i(e);if(a!==`approve`&&a!==`reject`&&a!==`revoke`&&a!==`logout`)return{message:`Unknown argument. Usage: /mcp [status] | /mcp <approve|reject|revoke|logout> <serverId> | /mcp login <serverId> [--no-browser] | /mcp reload`,success:!1};if(!o)return{message:`Usage: /mcp ${a} <serverId>`,success:!1};let s=P(e);if(!s)return{message:`MCP activation management is not available in this environment.`,success:!0};if(a===`logout`)return gi(s,o);try{let t=await s[a](o),n={message:`MCP server ${o} is now ${t.status}. ${t.reason}`,success:t.status===`approved`||t.status===`rejected`||t.status===`revoked`,data:{serverId:t.serverId,status:t.status,allowed:t.allowed,source:t.source,provenanceId:t.provenanceId,definitionFingerprint:t.definitionFingerprint,securityIdentity:t.securityIdentity}};if(a!==`approve`||t.status!==`approved`||s.reload===void 0)return n;try{let t=await _i(e);return{...n,message:`${n.message} ${t.message}`,data:{...n.data,reload:t.data??{}}}}catch(e){let t=e instanceof Error?e.message:String(e);return{...n,message:`${n.message} Could not connect now: ${t}. Run /mcp reload to retry.`}}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function mi(e){if(!e.startsWith(`[`))return e.split(/\s+/).filter(Boolean);try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(e=>typeof e==`string`)?t:void 0}catch{return}}async function hi(e,t,n){let r=e.getCommandInvocationSource?.(),i=r===`user`||r===`remote`&&e.getCommandSurfaceLocalityEvidence?.()===`local`;if(t!==`skill-list`&&!i)return{success:!1,message:`Only a known local user can inspect, approve or withdraw MCP skill instructions.`};let a=mi(n),o=t===`skill-list`?1:t===`skill-approve`?3:2;if(![`skill-list`,`skill-inspect`,`skill-approve`,`skill-withdraw`].includes(t)||!a||a.length!==o||a.some(e=>e.length===0))return{success:!1,message:`Usage: /mcp skill-list <server> | skill-inspect <server> <uri> | skill-approve <server> <uri> <fingerprint> | skill-withdraw <server> <uri>. JSON string arrays also accept opaque arguments.`};let s=P(e)?.skills;if(!s)return{success:!1,message:`MCP Skills are not available in this environment.`};let c=a[0],l=a[1];try{if(t===`skill-list`){let e=await s.list(c);return{success:!0,message:e.length===0?`No MCP skills are advertised.`:e.map(e=>`${e.name} — ${e.uri}\n${e.description}`+(e.invocationName?`\nInvoke skill: ${e.invocationName}`:``)+(e.unavailableReason?`\nUnavailable: ${e.unavailableReason}`:``)).join(`
44
44
 
45
- `),data:{skills:e.map(e=>({serverId:e.serverId,uri:e.uri,name:e.name,description:e.description,...e.invocationName?{invocationName:e.invocationName}:{},...e.unavailableReason?{unavailableReason:e.unavailableReason}:{}}))}}}if(t===`skill-withdraw`)return s.withdraw(c,l,`user`),{success:!0,message:`MCP skill content consent withdrawn.`};let e=t===`skill-approve`?await s.approve(c,l,a[2],`user`):await s.inspect(c,l),n=[c,l,e.fingerprint],r=n.every(e=>/^[\w:./%-]+$/.test(e))?n.join(` `):JSON.stringify(n);return{success:!0,message:t===`skill-approve`?`MCP skill content consent saved; activation remains a separate action.`:`${e.content}\n\nFrontmatter: ${JSON.stringify(e.frontmatter)}\n\nApprove exactly this content: /mcp skill-approve ${r}`,data:{serverId:e.serverId,uri:e.uri,namespace:e.namespace,fingerprint:e.fingerprint,frontmatter:e.frontmatter,...t===`skill-inspect`?{content:e.content}:{}}}}catch{return{success:!1,message:`MCP skill request refused. Check /mcp status; run /mcp skill-inspect <server> <uri> before granting content consent.`}}}async function _i(e,t){if(e.oauthLogout===void 0||(await fi(e)).get(t)===void 0)return{message:`MCP server ${t} does not declare OAuth.`,success:!1};let n;try{n=await e.oauthLogout(t)}catch{return{message:`Signing out of MCP server ${t} failed.`,success:!1}}return{message:`${n.removed?`Signed out of MCP server ${t}`:`MCP server ${t} was not signed in`}; ${ci(n)}.`,success:!0,data:{...n}}}async function vi(e){let t=N(e);if(!t)return{message:`MCP activation management is not available in this environment.`,success:!0};if(t.reload===void 0)return{message:`Reloading MCP servers is not available in this environment.`,success:!1};let n=await t.reload(),r=[];try{r=n.tools.length===0?[]:await e.getSession().addTools(n.tools)}finally{n.reloadToken!==void 0&&t.reloadToolsAdded?.(n.reloadToken,r)}let i=n.tools.length-r.length;return{message:`Reloaded MCP servers. ${[n.connectedServerIds.length===0?`No server newly connected.`:`Connected: ${n.connectedServerIds.join(`, `)}.`,n.failedServerIds.length===0?void 0:`Still not connected: ${n.failedServerIds.join(`, `)} (see /mcp status).`,i===0?void 0:`${i} of the new tools ${i===1?`was`:`were`} left out: the session already has a tool by that name.`].filter(e=>e!==void 0).join(` `)}`.trim(),success:!0,data:{connectedServerIds:n.connectedServerIds,failedServerIds:n.failedServerIds,tools:[...r]}}}let F=0;function yi(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{if(r.aborted)return`cancel`;F+=1;let i=await n.ask({id:`mcp-login-browser-${F}`,title:`Sign in to MCP server ${P(t)}`,description:`Your browser will open this URL; if it does not, open it yourself:\n${e.authorizationUrl}\n\nThe sign-in completes on its own once you approve in the browser.`,options:[{value:`open`,label:`Open my browser`},{value:`paste`,label:`Paste the redirect instead (browser on another machine)`},{value:`cancel`,label:`Cancel`}],maxSelect:1,default:{values:[`open`]}});if(i.type!==`answer`||r.aborted)return`cancel`;let a=i.values[0];return a===`open`||a===`paste`?a:`cancel`}}function bi(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{r.throwIfAborted(),F+=1;let i=await n.ask({id:`mcp-login-redirect-${F}`,title:`Sign in to MCP server ${P(t)}`,description:`Open this URL in a browser:\n${e.authorizationUrl}\n\nAfter you approve, the browser is sent to ${e.redirectUri}, which may not load. Copy the full address from its address bar and paste it here.`,allowFreeText:!0,masked:!0,placeholder:`Redirect URL (not shown)`});if(i.type!==`answer`||i.text===void 0||i.text.trim()===``)throw Error(`No redirect URL was pasted.`);return i.text}}function xi(e,t){let{serverId:n,failure:r}=e,i=P(n);switch(r){case`not-oauth`:return`MCP server ${n} does not declare OAuth; there is nothing to sign in to.`;case`url-unset`:return`MCP server ${n} has an unset variable in its url.`;case`sign-in-in-progress`:return`A sign-in to MCP server ${n} is already in progress.`;case`prompt-unavailable`:return t===void 0?`Signing in without a browser needs a redirect URL pasted in a terminal, but no product command name is available in this session.`:`Signing in without a browser needs the redirect URL pasted here, and nothing here can ask for it; run ${t} mcp login ${i} --no-browser in a terminal.`;case`browser-failed`:return`Sign-in to MCP server ${n} failed (browser-failed): no browser could be opened. Run /mcp login ${i} --no-browser to paste the redirect instead.`;default:{let a=r===`token-exchange-failed`&&e.preRegisteredClient?t===void 0?` If its pre-registered client needs a secret, sign in from a terminal configured for this product.`:` If its pre-registered client needs a secret, run ${t} mcp login ${i} --client-secret in a terminal.`:``;return`Sign-in to MCP server ${n} failed (${r??`unexpected-error`}); nothing was changed.${a}`}}}function Si(e,t,n){switch(t){case`connected`:return n===0?`Signed in to MCP server ${e}; it is connected and offers no new tools.`:`Signed in to MCP server ${e}; ${n} of its tools ${n===1?`is`:`are`} available from your next message.`;case`recovered`:return`Signed in to MCP server ${e}; its tools work again.`;case`not-admitted`:return`Signed in to MCP server ${e}, but it is not approved for this session (see /mcp status).`;default:return`Signed in to MCP server ${e}, but it could not connect in this session; the next session connects it.`}}async function Ci(e,t){let n=e.getCommandProductVocabulary?.()?.cliName,r=t.split(/\s+/).filter(e=>e!==``),i=r.includes(`--no-browser`),a=r.includes(`--client-secret`),o=r.filter(e=>e!==`--no-browser`&&e!==`--client-secret`),s=o[0];if(o.length!==1||s===void 0||s.startsWith(`-`))return{message:`Usage: /mcp login <serverId> [--no-browser]`,success:!1};let c=P(s);if(a)return{message:n===void 0?`A client secret is never typed into a session. Sign in from a terminal configured for this product.`:`A client secret is never typed into a session. Run ${n} mcp login ${c} --client-secret in a terminal.`,success:!1};let l=N(e);if(!l)return{message:`MCP activation management is not available in this environment.`,success:!0};if(l.oauthLogin===void 0)return{message:n===void 0?`Signing in is not available in this session; sign in from a terminal configured for this product.`:`Signing in is not available in this session; run ${n} mcp login ${c} in a terminal.`,success:!1};let u=new AbortController,d=bi(e,s),f=i?void 0:yi(e,s),p=await l.oauthLogin({serverId:s,noBrowser:i,signal:u.signal,...d===void 0?{}:{readRedirect:(e,t)=>d(e,t).catch(e=>{throw u.abort(),e})},...f===void 0?{}:{confirmBrowser:async(e,t)=>{let n=await f(e,t);return n===`cancel`&&u.abort(),n}}});if(p.failure!==void 0)return{message:xi(p,n),success:!1,data:{serverId:s,failure:p.failure}};let m=p.tools.length===0?[]:await e.getSession().addTools(p.tools);p.tools.length>0&&l.oauthToolsAdded?.(s,m);let h=p.tools.length-m.length,g=h===0?``:` ${h} of its tools ${h===1?`was`:`were`} left out: the session already has a tool by that name.`;return{message:`${Si(s,p.connection,m.length)}${g}`,success:!0,data:{serverId:s,connection:p.connection??`not-connected`,tools:[...m],...h===0?{}:{dropped:h}}}}function wi(){return{name:`mcp`,displayName:`MCP activation`,description:`Show each MCP server's trust approval and OAuth sign-in state, or change one server: approve, reject or revoke its trust; sign in to it (login, which connects it in this session) or out of it (logout). Use when an MCP server is not approved, needs a sign-in, or should stop being used. List MCP Skills metadata, inspect exact instructions, approve their content fingerprint or withdraw content consent separately from server trust. Returns the status list, verified preview, or what the action did.`,modelDescription:`Show which MCP servers are configured and why any of them is unavailable. Use it when an MCP server or its tools are missing, a tool call reports that a server needs sign-in or approval, or the user asks about MCP servers. Returns one line per server: its name, activation state, sign-in state, and the command to suggest to the user when the server needs their approval, sign-in or workspace trust. Use skill-list <server> to discover advertised skill names, URIs and descriptions without loading instructions. Returns an invocation name for each supported skill; use the session skill activation command with that exact name when its workflow fits the task. If content consent is needed, ask the user to run /mcp skill-inspect <server> <uri> and approve the reviewed fingerprint. You cannot approve, inspect instructions, sign in or sign out yourself.`,argumentHint:`[status] | <approve|reject|revoke|logout> <server> | login <server> [--no-browser]`,source:`mcp-activation`,modelInvocable:!0,runsBare:!0,subcommands:[{name:`status`,description:`Show every MCP server’s name, activation state and sign-in state`,source:`mcp-activation`,modelInvocable:!0},{name:`skill-list`,description:`Discover MCP skill metadata and exact invocation names, or reasons they are unavailable, without activating instructions`,argumentHint:`<server>`,source:`mcp-activation`,modelInvocable:!0},...[`skill-inspect`,`skill-approve`,`skill-withdraw`].map(e=>({name:e,description:e===`skill-inspect`?`Review verified MCP skill instructions and frontmatter without activation`:e===`skill-approve`?`Grant consent for an exactly reviewed MCP skill content fingerprint`:`Withdraw MCP skill content consent`,argumentHint:e===`skill-approve`?`<server> <uri> <fingerprint>`:`<server> <uri>`,source:`mcp-activation`,modelInvocable:!1})),{name:`reload`,description:`Retry connecting every MCP server that is not currently connected`,source:`mcp-activation`,modelInvocable:!1},...[`approve`,`reject`,`revoke`,`login`,`logout`].map(e=>({name:e,description:Ti[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const Ti={approve:`Trust and activate an MCP server`,reject:`Refuse an MCP server`,revoke:`Withdraw an earlier approval`,login:`Sign in to an OAuth MCP server and connect it in this session`,logout:`Sign out of an OAuth MCP server and revoke its tokens`};function Ei(){let e=wi();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},argumentHint:e.argumentHint,...e.subcommands===void 0?{}:{subcommands:e.subcommands},requiresPermission:!0,modelRequiresPermission:!1,userInvocable:!0,modelInvocable:!0,lifecycle:`inline`,execute:mi}}var Di=class{name=`mcp-activation`;getCommands(){return[wi()]}};function Oi(){return{name:`agent-command-mcp-activation`,commandSources:[new Di],systemCommands:[Ei()]}}function I(){return{message:e.MEMORY_COMMAND_USAGE,success:!1}}function L(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function ki(t){try{return{ok:!0,store:(0,e.createCommandMemoryStores)(t)}}catch(e){return{ok:!1,result:L(e instanceof Error?e:String(e))}}}async function Ai(e){let t=await e.list(),n=t.topics.length>0?t.topics.map(e=>`- ${e.name}: ${e.path}`).join(`
45
+ `),data:{skills:e.map(e=>({serverId:e.serverId,uri:e.uri,name:e.name,description:e.description,...e.invocationName?{invocationName:e.invocationName}:{},...e.unavailableReason?{unavailableReason:e.unavailableReason}:{}}))}}}if(t===`skill-withdraw`)return s.withdraw(c,l,`user`),{success:!0,message:`MCP skill content consent withdrawn.`};let e=t===`skill-approve`?await s.approve(c,l,a[2],`user`):await s.inspect(c,l),n=[c,l,e.fingerprint],r=n.every(e=>/^[\w:./%-]+$/.test(e))?n.join(` `):JSON.stringify(n);return{success:!0,message:t===`skill-approve`?`MCP skill content consent saved; activation remains a separate action.`:`${e.content}\n\nFrontmatter: ${JSON.stringify(e.frontmatter)}\n\nApprove exactly this content: /mcp skill-approve ${r}`,data:{serverId:e.serverId,uri:e.uri,namespace:e.namespace,fingerprint:e.fingerprint,frontmatter:e.frontmatter,...t===`skill-inspect`?{content:e.content}:{}}}}catch{return{success:!1,message:`MCP skill request refused. Check /mcp status; run /mcp skill-inspect <server> <uri> before granting content consent.`}}}async function gi(e,t){if(e.oauthLogout===void 0||(await di(e)).get(t)===void 0)return{message:`MCP server ${t} does not declare OAuth.`,success:!1};let n;try{n=await e.oauthLogout(t)}catch{return{message:`Signing out of MCP server ${t} failed.`,success:!1}}return{message:`${n.removed?`Signed out of MCP server ${t}`:`MCP server ${t} was not signed in`}; ${si(n)}.`,success:!0,data:{...n}}}async function _i(e){let t=P(e);if(!t)return{message:`MCP activation management is not available in this environment.`,success:!0};if(t.reload===void 0)return{message:`Reloading MCP servers is not available in this environment.`,success:!1};let n=await t.reload(),r=[];try{r=n.tools.length===0?[]:await e.getSession().addTools(n.tools)}finally{n.reloadToken!==void 0&&t.reloadToolsAdded?.(n.reloadToken,r)}let i=n.tools.length-r.length;return{message:`Reloaded MCP servers. ${[n.connectedServerIds.length===0?`No server newly connected.`:`Connected: ${n.connectedServerIds.join(`, `)}.`,n.failedServerIds.length===0?void 0:`Still not connected: ${n.failedServerIds.join(`, `)} (see /mcp status).`,i===0?void 0:`${i} of the new tools ${i===1?`was`:`were`} left out: the session already has a tool by that name.`].filter(e=>e!==void 0).join(` `)}`.trim(),success:!0,data:{connectedServerIds:n.connectedServerIds,failedServerIds:n.failedServerIds,tools:[...r]}}}let I=0;function vi(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{if(r.aborted)return`cancel`;I+=1;let i=await n.ask({id:`mcp-login-browser-${I}`,title:`Sign in to MCP server ${F(t)}`,description:`Your browser will open this URL; if it does not, open it yourself:\n${e.authorizationUrl}\n\nThe sign-in completes on its own once you approve in the browser.`,options:[{value:`open`,label:`Open my browser`},{value:`paste`,label:`Paste the redirect instead (browser on another machine)`},{value:`cancel`,label:`Cancel`}],maxSelect:1,default:{values:[`open`]}});if(i.type!==`answer`||r.aborted)return`cancel`;let a=i.values[0];return a===`open`||a===`paste`?a:`cancel`}}function yi(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{r.throwIfAborted(),I+=1;let i=await n.ask({id:`mcp-login-redirect-${I}`,title:`Sign in to MCP server ${F(t)}`,description:`Open this URL in a browser:\n${e.authorizationUrl}\n\nAfter you approve, the browser is sent to ${e.redirectUri}, which may not load. Copy the full address from its address bar and paste it here.`,allowFreeText:!0,masked:!0,placeholder:`Redirect URL (not shown)`});if(i.type!==`answer`||i.text===void 0||i.text.trim()===``)throw Error(`No redirect URL was pasted.`);return i.text}}function bi(e,t){let{serverId:n,failure:r}=e,i=F(n);switch(r){case`not-oauth`:return`MCP server ${n} does not declare OAuth; there is nothing to sign in to.`;case`url-unset`:return`MCP server ${n} has an unset variable in its url.`;case`sign-in-in-progress`:return`A sign-in to MCP server ${n} is already in progress.`;case`prompt-unavailable`:return t===void 0?`Signing in without a browser needs a redirect URL pasted in a terminal, but no product command name is available in this session.`:`Signing in without a browser needs the redirect URL pasted here, and nothing here can ask for it; run ${t} mcp login ${i} --no-browser in a terminal.`;case`browser-failed`:return`Sign-in to MCP server ${n} failed (browser-failed): no browser could be opened. Run /mcp login ${i} --no-browser to paste the redirect instead.`;default:{let a=r===`token-exchange-failed`&&e.preRegisteredClient?t===void 0?` If its pre-registered client needs a secret, sign in from a terminal configured for this product.`:` If its pre-registered client needs a secret, run ${t} mcp login ${i} --client-secret in a terminal.`:``;return`Sign-in to MCP server ${n} failed (${r??`unexpected-error`}); nothing was changed.${a}`}}}function xi(e,t,n){switch(t){case`connected`:return n===0?`Signed in to MCP server ${e}; it is connected and offers no new tools.`:`Signed in to MCP server ${e}; ${n} of its tools ${n===1?`is`:`are`} available from your next message.`;case`recovered`:return`Signed in to MCP server ${e}; its tools work again.`;case`not-admitted`:return`Signed in to MCP server ${e}, but it is not approved for this session (see /mcp status).`;default:return`Signed in to MCP server ${e}, but it could not connect in this session; the next session connects it.`}}async function Si(e,t){let n=e.getCommandProductVocabulary?.()?.cliName,r=t.split(/\s+/).filter(e=>e!==``),i=r.includes(`--no-browser`),a=r.includes(`--client-secret`),o=r.filter(e=>e!==`--no-browser`&&e!==`--client-secret`),s=o[0];if(o.length!==1||s===void 0||s.startsWith(`-`))return{message:`Usage: /mcp login <serverId> [--no-browser]`,success:!1};let c=F(s);if(a)return{message:n===void 0?`A client secret is never typed into a session. Sign in from a terminal configured for this product.`:`A client secret is never typed into a session. Run ${n} mcp login ${c} --client-secret in a terminal.`,success:!1};let l=P(e);if(!l)return{message:`MCP activation management is not available in this environment.`,success:!0};if(l.oauthLogin===void 0)return{message:n===void 0?`Signing in is not available in this session; sign in from a terminal configured for this product.`:`Signing in is not available in this session; run ${n} mcp login ${c} in a terminal.`,success:!1};let u=new AbortController,d=yi(e,s),f=i?void 0:vi(e,s),p=await l.oauthLogin({serverId:s,noBrowser:i,signal:u.signal,...d===void 0?{}:{readRedirect:(e,t)=>d(e,t).catch(e=>{throw u.abort(),e})},...f===void 0?{}:{confirmBrowser:async(e,t)=>{let n=await f(e,t);return n===`cancel`&&u.abort(),n}}});if(p.failure!==void 0)return{message:bi(p,n),success:!1,data:{serverId:s,failure:p.failure}};let m=p.tools.length===0?[]:await e.getSession().addTools(p.tools);p.tools.length>0&&l.oauthToolsAdded?.(s,m);let h=p.tools.length-m.length,g=h===0?``:` ${h} of its tools ${h===1?`was`:`were`} left out: the session already has a tool by that name.`;return{message:`${xi(s,p.connection,m.length)}${g}`,success:!0,data:{serverId:s,connection:p.connection??`not-connected`,tools:[...m],...h===0?{}:{dropped:h}}}}function Ci(){return{name:`mcp`,displayName:`MCP activation`,description:`Show each MCP server's trust approval and OAuth sign-in state, or change one server: approve, reject or revoke its trust; sign in to it (login, which connects it in this session) or out of it (logout). Use when an MCP server is not approved, needs a sign-in, or should stop being used. List MCP Skills metadata, inspect exact instructions, approve their content fingerprint or withdraw content consent separately from server trust. Returns the status list, verified preview, or what the action did.`,modelDescription:`Show which MCP servers are configured and why any of them is unavailable. Use it when an MCP server or its tools are missing, a tool call reports that a server needs sign-in or approval, or the user asks about MCP servers. Returns one line per server: its name, activation state, sign-in state, and the command to suggest to the user when the server needs their approval, sign-in or workspace trust. Use skill-list <server> to discover advertised skill names, URIs and descriptions without loading instructions. Returns an invocation name for each supported skill; use the session skill activation command with that exact name when its workflow fits the task. If content consent is needed, ask the user to run /mcp skill-inspect <server> <uri> and approve the reviewed fingerprint. You cannot approve, inspect instructions, sign in or sign out yourself.`,argumentHint:`[status] | <approve|reject|revoke|logout> <server> | login <server> [--no-browser]`,source:`mcp-activation`,modelInvocable:!0,runsBare:!0,subcommands:[{name:`status`,description:`Show every MCP server’s name, activation state and sign-in state`,source:`mcp-activation`,modelInvocable:!0},{name:`skill-list`,description:`Discover MCP skill metadata and exact invocation names, or reasons they are unavailable, without activating instructions`,argumentHint:`<server>`,source:`mcp-activation`,modelInvocable:!0},...[`skill-inspect`,`skill-approve`,`skill-withdraw`].map(e=>({name:e,description:e===`skill-inspect`?`Review verified MCP skill instructions and frontmatter without activation`:e===`skill-approve`?`Grant consent for an exactly reviewed MCP skill content fingerprint`:`Withdraw MCP skill content consent`,argumentHint:e===`skill-approve`?`<server> <uri> <fingerprint>`:`<server> <uri>`,source:`mcp-activation`,modelInvocable:!1})),{name:`reload`,description:`Retry connecting every MCP server that is not currently connected`,source:`mcp-activation`,modelInvocable:!1},...[`approve`,`reject`,`revoke`,`login`,`logout`].map(e=>({name:e,description:wi[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const wi={approve:`Trust and activate an MCP server`,reject:`Refuse an MCP server`,revoke:`Withdraw an earlier approval`,login:`Sign in to an OAuth MCP server and connect it in this session`,logout:`Sign out of an OAuth MCP server and revoke its tokens`};function Ti(){let e=Ci();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},argumentHint:e.argumentHint,...e.subcommands===void 0?{}:{subcommands:e.subcommands},requiresPermission:!0,modelRequiresPermission:!1,userInvocable:!0,modelInvocable:!0,lifecycle:`inline`,execute:pi}}var Ei=class{name=`mcp-activation`;getCommands(){return[Ci()]}};function Di(){return{name:`agent-command-mcp-activation`,commandSources:[new Ei],systemCommands:[Ti()]}}function L(){return{message:e.MEMORY_COMMAND_USAGE,success:!1}}function R(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Oi(t){try{return{ok:!0,store:(0,e.createCommandMemoryStores)(t)}}catch(e){return{ok:!1,result:R(e instanceof Error?e:String(e))}}}async function ki(e){let t=await e.list(),n=t.topics.length>0?t.topics.map(e=>`- ${e.name}: ${e.path}`).join(`
46
46
  `):`(none)`;return{message:[`Memory index: ${t.indexPath}`,`Topics directory: ${t.topicsPath}`,`Topics:`,n].join(`
47
- `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function ji(e,t){if(!t||t===`index`){let t=await e.loadStartupMemory();return{message:t.content||`(empty memory index)`,success:!0,data:{path:t.path,lineCount:t.lineCount,truncated:t.truncated}}}return{message:await e.readTopic(t)||`(empty memory topic: ${t})`,success:!0,data:{topic:t}}}function Mi(t){let n=t[1],r=t[2],i=t.slice(3).join(` `).trim();if(!(!n||!(0,e.isCommandMemoryType)(n)||!r||i.length===0))return{type:n,topic:r,text:i}}async function Ni(e){let t=await e.listPending(`pending`);return{message:[`Pending memory candidates:`,...t.length>0?t.map(e=>`- ${e.id} ${e.type}/${e.topic} confidence=${e.confidence}: ${e.text}`):[`(no pending memory candidates)`]].join(`
48
- `),success:!0,data:{count:t.length}}}function Pi(t,n){(0,e.recordCommandMemoryEvent)(t,n)}async function Fi(t,n,r){if(!r)return I();try{let{record:i,saved:a}=await(0,e.approvePendingMemoryCandidate)(n,r);return Pi(t,{type:`memory_candidate_approved`,candidateId:i.id,topic:i.topic,reason:`approved-by-user`}),Pi(t,{type:`memory_candidate_saved`,candidateId:i.id,topic:i.topic,reason:a.deduplicated?`deduplicated`:`approved-and-saved`}),{message:a.deduplicated?`Saved memory candidate ${r} was already present in ${a.topicPath}`:`Saved memory candidate ${r} to ${a.topicPath}`,success:!0,data:{id:r,status:i.status,topic:a.topic,topicPath:a.topicPath,deduplicated:a.deduplicated}}}catch(e){return L(e instanceof Error?e:String(e))}}async function Ii(e,t,n){if(!n)return I();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return Pi(e,{type:`memory_candidate_rejected`,candidateId:r.id,topic:r.topic,reason:`rejected-by-user`}),{message:`Rejected memory candidate ${n}`,success:!0,data:{id:n,status:r.status}}}catch(e){return L(e instanceof Error?e:String(e))}}function Li(t){let n=(0,e.listCommandUsedMemoryReferences)(t);return{message:[`Used memory references:`,...n.length>0?n.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
49
- `),success:!0,data:{count:n.length,references:[...n]}}}function Ri(e){return((e.getCommandHostAdapters?.().permissionMode)?.getPermissionMode()??e.getSession?.().getPermissionMode())===`plan`}async function zi(t,n){let r=n.trim().split(/\s+/).filter(Boolean),i=r[0]??`list`,a=t.getCommandInvocationSource();if((i===`correct`||i===`forget`)&&a!==`user`&&a!==`remote`)return{success:!1,message:`Memory correction and forgetting: only the user can run /memory correct or /memory forget.`};let o=ki(t);if(!o.ok)return o.result;let s=o.store;if(i===`correct`||i===`forget`)try{if(i===`correct`){let t=Mi(r);if(!t)return I();if((0,e.hasSensitiveCommandMemoryContent)(t.text))return{success:!1,message:`Refusing to save sensitive memory content.`};if(!s.replaceTopic)return{success:!1,message:`This memory backend does not support topic correction.`};let n=await s.replaceTopic(t);return{success:!0,message:`Replaced all active memory in ${n.topicPath}. Automatic additions to this topic now require user correction. Historical transcripts and backups remain.`,data:{...n}}}if(!r[1]||r.length!==2)return I();if(!s.forgetTopic)return{success:!1,message:`This memory backend does not support forgetting topics.`};let t=await s.forgetTopic(r[1]);return{success:!0,message:`Forgot active memory topic ${t.topic}. Source topic removed; automatic restoration is blocked. Historical transcripts and backups remain.`,data:{...t}}}catch(e){return L(e instanceof Error?e:String(e))}if(i===`list`)return Ai(s);if(i===`show`)return ji(s,r[1]);if(i===`pending`)return Ni(s);if(i===`approve`)return Fi(t,s,r[1]);if(i===`reject`)return Ii(t,s,r[1]);if(i===`used`)return Li(t);if(i===`add`){if(t.getCommandInvocationSource()===`model`&&Ri(t))return{message:`Plan mode saves no memory. Save it after plan mode ends.`,success:!1};let n=Mi(r);if(!n)return I();if((0,e.hasSensitiveCommandMemoryContent)(n.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let i;try{i=await s.append(n)}catch(e){return L(e instanceof Error?e:String(e))}return{message:i.deduplicated?`${n.type} memory already exists in ${i.topicPath}`:`Saved ${n.type} memory to ${i.topicPath}`,success:!0,data:{indexPath:i.indexPath,topicPath:i.topicPath,topic:i.topic,deduplicated:i.deduplicated}}}return I()}function Bi(){return{name:`memory`,displayName:`Memory`,description:e.MEMORY_COMMAND_DESCRIPTION,modelDescription:"Read and write this project’s durable memory. Use `list` or `show [topic]` to look up stored conventions, preferences or references before asking the user again; `add <type> <topic> <text>` to save a durable preference, project convention, feedback item or reference worth reusing across sessions (never secrets, credentials or transient facts); `pending` to see candidates awaiting the user’s review; `used` to report which memory items informed this turn. Bare lists topics. In plan mode `add` is refused: save after plan mode ends. Returns the requested topics or entries, or a confirmation of what was saved. Approving or rejecting a pending candidate is the user’s review: suggest `/memory approve <id>` or `/memory reject <id>`. Correcting or forgetting saved knowledge is also user-only: suggest `/memory correct <type> <topic> <text>` to replace every entry in a topic or `/memory forget <topic>` to remove it from active recall. These operations block automatic restoration of that topic; historical transcripts and backups remain.",source:`memory`,argumentHint:e.MEMORY_COMMAND_ARGUMENT_HINT,modelInvocable:!0,safety:`write`,subcommands:(0,e.buildMemoryCommandSubcommands)()}}function Vi(){let e=Bi();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:zi}}var Hi=class{name=`memory`;getCommands(){return[Bi()]}};function Ui(){return{name:`agent-command-memory`,commandSources:[new Hi],systemCommands:[Vi()]}}function Wi(t,n){try{(0,e.writeCommandPermissionMode)(t,n);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function Gi(t,n){let r=(0,e.retryCommandPermissionDenial)(t,Number(n.trim().split(/\s+/)[1]));return r===void 0?{message:`Usage: /permissions retry <n>, where <n> numbers a call blocked by the auto-mode classifier in /permissions.`,success:!1}:{message:`${r.argument===void 0?r.toolName:`${r.toolName}(${r.argument})`} will run once, without the classifier, when the model tries it again.`,success:!0}}function Ki(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===`retry`)return Gi(t,n);if(r!==void 0){if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let n=Wi(t,r);if(n!==void 0)return n;let i=(0,e.readCommandPermissionsState)(t);return{message:`Permission mode set to: ${r}\n${(0,e.formatCommandPermissionsMessage)(i)}`,success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}let i=(0,e.readCommandPermissionsState)(t);return{message:(0,e.formatCommandPermissionsMessage)(i),success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}async function qi(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildPermissionModeSubcommands)().map(e=>({value:e.name,label:e.displayName??e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`mode`,`Select interaction mode`,i));return a.type===`answer`?a.values[0]:void 0}async function Ji(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===void 0&&(r=await qi(t),r===void 0)){let n=(0,e.readCommandPermissionMode)(t);return{message:`Current mode: ${n}`,success:!0,data:{mode:n}}}if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let i=Wi(t,r);return i===void 0?{message:`Permission mode set to: ${r}`,success:!0,data:{mode:r}}:i}function Yi(){return{name:`mode`,displayName:`Interaction Mode`,description:e.PERMISSION_MODE_COMMAND_DESCRIPTION,source:`mode`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`mode`),modelInvocable:!1}}function Xi(){let e=Yi();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Ji}}var Zi=class{name=`mode`;getCommands(){return[Yi()]}};function Qi(){return{name:`agent-command-mode`,commandSources:[new Zi],systemCommands:[Xi()]}}function $i(e,t){return e.getSession().getModelId()??t?.model??``}function ea(t,n,r,i){let a=n.currentProvider===void 0?void 0:n.providers?.[n.currentProvider];return(0,e.buildModelListSnapshot)(n.providers,n.currentProvider,$i(t,a),r.providerDefinitions,i?r.orgPolicy?.allowedProviders:void 0)}async function ta(t,n,r){let i=r.settings.readMergedSettings(),a=n.trim();if(a.length===0){let e=ea(t,i,r,!0);return na(t.getUserInteraction(),e,t,r)}let o=(0,e.resolveModelListSelection)(ea(t,i,r,!1),a);return o===void 0?{message:`Unknown model "${a}". Run /model to see the choices.`,success:!1}:o.profileName===i.currentProvider?aa(t,o,i,r):oa(o,i,r)}async function na(e,n,r,i){if(n.groups.length===0)return{message:`No provider profiles configured. Run /provider add to add one.`,success:!0};if(!e)return{message:ra(n),success:!0};let a=n.groups.flatMap(e=>e.models.map(t=>({value:t.id,label:ia(n,e.profileName,e.providerLabel,t)}))),o=await e.ask((0,t.selectAction)(`model`,`Select model`,a,{maxVisible:8}));return o.type!==`answer`||o.values[0]===void 0?{message:`Model selection cancelled.`,success:!0}:ta(r,o.values[0],i)}function ra(e){let t=[];for(let n of e.groups){t.push(`${n.providerLabel} (${n.profileName})`);for(let r of n.models){let i=r.id===e.currentModel&&n.profileName===e.currentProfile?`*`:`-`;t.push(` ${i} ${r.label}`)}}return t.join(`
50
- `)}function ia(e,t,n,r){let i=r.id===e.currentModel&&t===e.currentProfile?`* `:``,a=e.groups.filter(e=>e.providerLabel===n).length>1?` (${t})`:``;return`${i}${n}: ${r.label}${a}`}async function aa(t,n,r,i){let a=n.profileName;try{await t.getSession().applyModelOptions({model:n.model.id})}catch(e){return{message:`Could not switch to "${n.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let o=i.settings.readTargetSettings(),s=r.providers?.[a]??o.providers?.[a]??{};return i.settings.writeTargetSettings((0,e.upsertProviderProfile)(o,a,{...s,model:n.model.id})),{message:`Model: ${n.model.label}`,success:!0}}function oa(t,n,r){let{orgPolicy:i}=r;if(i?.allowedProviders&&!i.allowedProviders.includes(t.profileName))return{message:(0,e.formatOrgPolicyViolationMessage)(`Provider "${t.profileName}" is not allowed by your organization policy. Allowed: ${i.allowedProviders.join(`, `)}.`,i.adminContact),success:!1};let a=n.providers?.[t.profileName];if(a===void 0)return{message:`Provider profile "${t.profileName}" was not found.`,success:!1};let o={...a,model:t.model.id};try{(0,e.validateProviderProfile)(t.profileName,o,{providerDefinitions:r.providerDefinitions,...r.env===void 0?{}:{env:r.env}})}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let s=r.settings.readTargetSettings(),c=r.settings.readMergedSettings(),l=(0,e.upsertProviderProfile)(s,t.profileName,o),u=s.providers?.[t.profileName]!==void 0||c.providers?.[t.profileName]!==void 0?{...l,currentProvider:t.profileName}:(0,e.setCurrentProvider)(l,t.profileName);return r.settings.writeTargetSettings(u),{message:`Model: ${t.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t.profileName}]}}function sa(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function ca(e){let t=sa();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,lifecycle:`inline`,execute:(t,n)=>ta(t,n,e)}}var la=class{name=`model`;getCommands(){return[sa()]}};function ua(e){return{name:`agent-command-model`,commandSources:[new la],systemCommands:[ca(e)]}}const R=[{mode:`auto-allow`,description:`Confine shell commands; confined ones run without a prompt`},{mode:`regular`,description:`Confine shell commands; prompts work as usual`},{mode:`off`,description:`Run shell commands on this machine, unconfined`}];function da(e){return R.some(t=>t.mode===e)}function fa(e){let t=[`Sandbox: ${e.mode}${e.backend===void 0?``:` (${e.backend})`}`];return e.unavailable!==void 0&&t.push(e.mode===`off`?`Not available here: ${e.unavailable}.`:`Cannot run here: ${e.unavailable}. Commands run unconfined.`),e.mode!==`off`&&e.unavailable===void 0&&(t.push(`Writes are limited to the workspace and temp directories; settings and git hooks stay read-only.`,`Network: ${e.network?`allowed`:`blocked`}.`),e.excludedCommands.length>0&&t.push(`Run unconfined: ${e.excludedCommands.join(`, `)}.`)),t.join(`
51
- `)}async function pa(e,n){let r=e.getUserInteraction();if(!r)return;let i=R.map(({mode:e,description:t})=>({value:e,label:e===n?`${e} (current)`:e,description:t})),a=await r.ask((0,t.selectAction)(`sandbox`,`Sandbox mode`,i));return a.type===`answer`?a.values[0]:void 0}async function ma(e,t){let n=e.getCommandHostAdapters?.().sandbox;if(n===void 0)return{message:`This host has no OS sandbox.`,success:!1};let r=n.status(),i=t.trim().split(/\s+/)[0]||await pa(e,r.mode);if(i===void 0||i===``)return{message:fa(r),success:!0,data:{...r}};if(!da(i))return{message:`Unknown sandbox mode "${i}". Valid: ${R.map(e=>e.mode).join(` | `)}`,success:!1};n.setMode(i);let a=n.status();return{message:`Sandbox mode set to: ${i}\n${fa(a)}`,success:!0,data:{...a}}}const ha=R.map(e=>e.mode).join(` | `);function ga(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:ha,subcommands:R.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function _a(){let e=ga();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:ma}}var va=class{name=`sandbox`;getCommands(){return[ga()]}};function ya(){return{name:`agent-command-sandbox`,commandSources:[new va],systemCommands:[_a()]}}function ba(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function xa(e,t){return[`Available output styles:`,...t.listOutputStyles().map(t=>{let n=t.id===e?`* `:` `,r=t.tokenCost?` [input cost: ${t.tokenCost}]`:``;return`${n}${t.id} — ${t.name}: ${t.description}${r}`})].join(`
47
+ `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function Ai(e,t){if(!t||t===`index`){let t=await e.loadStartupMemory();return{message:t.content||`(empty memory index)`,success:!0,data:{path:t.path,lineCount:t.lineCount,truncated:t.truncated}}}return{message:await e.readTopic(t)||`(empty memory topic: ${t})`,success:!0,data:{topic:t}}}function ji(t){let n=t[1],r=t[2],i=t.slice(3).join(` `).trim();if(!(!n||!(0,e.isCommandMemoryType)(n)||!r||i.length===0))return{type:n,topic:r,text:i}}async function Mi(e){let t=await e.listPending(`pending`);return{message:[`Pending memory candidates:`,...t.length>0?t.map(e=>`- ${e.id} ${e.type}/${e.topic} confidence=${e.confidence}: ${e.text}`):[`(no pending memory candidates)`]].join(`
48
+ `),success:!0,data:{count:t.length}}}function Ni(t,n){(0,e.recordCommandMemoryEvent)(t,n)}async function Pi(t,n,r){if(!r)return L();try{let{record:i,saved:a}=await(0,e.approvePendingMemoryCandidate)(n,r);return Ni(t,{type:`memory_candidate_approved`,candidateId:i.id,topic:i.topic,reason:`approved-by-user`}),Ni(t,{type:`memory_candidate_saved`,candidateId:i.id,topic:i.topic,reason:a.deduplicated?`deduplicated`:`approved-and-saved`}),{message:a.deduplicated?`Saved memory candidate ${r} was already present in ${a.topicPath}`:`Saved memory candidate ${r} to ${a.topicPath}`,success:!0,data:{id:r,status:i.status,topic:a.topic,topicPath:a.topicPath,deduplicated:a.deduplicated}}}catch(e){return R(e instanceof Error?e:String(e))}}async function Fi(e,t,n){if(!n)return L();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return Ni(e,{type:`memory_candidate_rejected`,candidateId:r.id,topic:r.topic,reason:`rejected-by-user`}),{message:`Rejected memory candidate ${n}`,success:!0,data:{id:n,status:r.status}}}catch(e){return R(e instanceof Error?e:String(e))}}function Ii(t){let n=(0,e.listCommandUsedMemoryReferences)(t);return{message:[`Used memory references:`,...n.length>0?n.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
49
+ `),success:!0,data:{count:n.length,references:[...n]}}}function Li(e){return((e.getCommandHostAdapters?.().permissionMode)?.getPermissionMode()??e.getSession?.().getPermissionMode())===`plan`}async function Ri(t,n){let r=n.trim().split(/\s+/).filter(Boolean),i=r[0]??`list`,a=t.getCommandInvocationSource();if((i===`correct`||i===`forget`)&&a!==`user`&&a!==`remote`)return{success:!1,message:`Memory correction and forgetting: only the user can run /memory correct or /memory forget.`};let o=Oi(t);if(!o.ok)return o.result;let s=o.store;if(i===`correct`||i===`forget`)try{if(i===`correct`){let t=ji(r);if(!t)return L();if((0,e.hasSensitiveCommandMemoryContent)(t.text))return{success:!1,message:`Refusing to save sensitive memory content.`};if(!s.replaceTopic)return{success:!1,message:`This memory backend does not support topic correction.`};let n=await s.replaceTopic(t);return{success:!0,message:`Replaced all active memory in ${n.topicPath}. Automatic additions to this topic now require user correction. Historical transcripts and backups remain.`,data:{...n}}}if(!r[1]||r.length!==2)return L();if(!s.forgetTopic)return{success:!1,message:`This memory backend does not support forgetting topics.`};let t=await s.forgetTopic(r[1]);return{success:!0,message:`Forgot active memory topic ${t.topic}. Source topic removed; automatic restoration is blocked. Historical transcripts and backups remain.`,data:{...t}}}catch(e){return R(e instanceof Error?e:String(e))}if(i===`list`)return ki(s);if(i===`show`)return Ai(s,r[1]);if(i===`pending`)return Mi(s);if(i===`approve`)return Pi(t,s,r[1]);if(i===`reject`)return Fi(t,s,r[1]);if(i===`used`)return Ii(t);if(i===`add`){if(t.getCommandInvocationSource()===`model`&&Li(t))return{message:`Plan mode saves no memory. Save it after plan mode ends.`,success:!1};let n=ji(r);if(!n)return L();if((0,e.hasSensitiveCommandMemoryContent)(n.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let i;try{i=await s.append(n)}catch(e){return R(e instanceof Error?e:String(e))}return{message:i.deduplicated?`${n.type} memory already exists in ${i.topicPath}`:`Saved ${n.type} memory to ${i.topicPath}`,success:!0,data:{indexPath:i.indexPath,topicPath:i.topicPath,topic:i.topic,deduplicated:i.deduplicated}}}return L()}function zi(){return{name:`memory`,displayName:`Memory`,description:e.MEMORY_COMMAND_DESCRIPTION,modelDescription:"Read and write this project’s durable memory. Use `list` or `show [topic]` to look up stored conventions, preferences or references before asking the user again; `add <type> <topic> <text>` to save a durable preference, project convention, feedback item or reference worth reusing across sessions (never secrets, credentials or transient facts); `pending` to see candidates awaiting the user’s review; `used` to report which memory items informed this turn. Bare lists topics. In plan mode `add` is refused: save after plan mode ends. Returns the requested topics or entries, or a confirmation of what was saved. Approving or rejecting a pending candidate is the user’s review: suggest `/memory approve <id>` or `/memory reject <id>`. Correcting or forgetting saved knowledge is also user-only: suggest `/memory correct <type> <topic> <text>` to replace every entry in a topic or `/memory forget <topic>` to remove it from active recall. These operations block automatic restoration of that topic; historical transcripts and backups remain.",source:`memory`,argumentHint:e.MEMORY_COMMAND_ARGUMENT_HINT,modelInvocable:!0,safety:`write`,subcommands:(0,e.buildMemoryCommandSubcommands)()}}function Bi(){let e=zi();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:Ri}}var Vi=class{name=`memory`;getCommands(){return[zi()]}};function Hi(){return{name:`agent-command-memory`,commandSources:[new Vi],systemCommands:[Bi()]}}function Ui(t,n){try{(0,e.writeCommandPermissionMode)(t,n);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function Wi(t,n){let r=(0,e.retryCommandPermissionDenial)(t,Number(n.trim().split(/\s+/)[1]));return r===void 0?{message:`Usage: /permissions retry <n>, where <n> numbers a call blocked by the auto-mode classifier in /permissions.`,success:!1}:{message:`${r.argument===void 0?r.toolName:`${r.toolName}(${r.argument})`} will run once, without the classifier, when the model tries it again.`,success:!0}}function Gi(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===`retry`)return Wi(t,n);if(r!==void 0){if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let n=Ui(t,r);if(n!==void 0)return n;let i=(0,e.readCommandPermissionsState)(t);return{message:`Permission mode set to: ${r}\n${(0,e.formatCommandPermissionsMessage)(i)}`,success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}let i=(0,e.readCommandPermissionsState)(t);return{message:(0,e.formatCommandPermissionsMessage)(i),success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}async function Ki(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildPermissionModeSubcommands)().map(e=>({value:e.name,label:e.displayName??e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`mode`,`Select interaction mode`,i));return a.type===`answer`?a.values[0]:void 0}async function qi(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===void 0&&(r=await Ki(t),r===void 0)){let n=(0,e.readCommandPermissionMode)(t);return{message:`Current mode: ${n}`,success:!0,data:{mode:n}}}if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let i=Ui(t,r);return i===void 0?{message:`Permission mode set to: ${r}`,success:!0,data:{mode:r}}:i}function Ji(){return{name:`mode`,displayName:`Interaction Mode`,description:e.PERMISSION_MODE_COMMAND_DESCRIPTION,source:`mode`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`mode`),modelInvocable:!1}}function Yi(){let e=Ji();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:qi}}var Xi=class{name=`mode`;getCommands(){return[Ji()]}};function Zi(){return{name:`agent-command-mode`,commandSources:[new Xi],systemCommands:[Yi()]}}async function Qi(n,r,i){if((0,e.validateProviderProfile)(n,r,{providerDefinitions:i.providerDefinitions,...i.env===void 0?{}:{env:i.env}}),r.apiKeyRef!==void 0)try{if(i.resolveCredential===void 0)throw Error(`Host credential resolution unavailable.`);if(!(await i.resolveCredential((0,t.normalizeProviderConfig)({name:r.type,model:r.model,apiKeyRef:r.apiKeyRef,baseURL:r.baseURL},i.providerDefinitions))).apiKey?.trim())throw Error(`Host credential unavailable.`)}catch{throw Error(`Saved connection unavailable. Run /provider reconnect ${n}.`)}}function $i(e,t){return e.getSession().getModelId()??t?.model??``}function ea(t,n,r,i){let a=n.currentProvider===void 0?void 0:n.providers?.[n.currentProvider];return(0,e.buildModelListSnapshot)(n.providers,n.currentProvider,$i(t,a),r.providerDefinitions,i?r.orgPolicy?.allowedProviders:void 0)}async function ta(t,n,r){let i=r.settings.readMergedSettings(),a=n.trim();if(a.length===0){let e=ea(t,i,r,!0);return na(t.getUserInteraction(),e,t,r)}let o=(0,e.resolveModelListSelection)(ea(t,i,r,!1),a);return o===void 0?{message:`Unknown model "${a}". Run /model to see the choices.`,success:!1}:o.profileName===i.currentProvider?aa(t,o,i,r):oa(o,i,r)}async function na(e,n,r,i){if(n.groups.length===0)return{message:`No provider profiles configured. Run /provider add to add one.`,success:!0};if(!e)return{message:ra(n),success:!0};let a=n.groups.flatMap(e=>e.models.map(t=>({value:t.id,label:ia(n,e.profileName,e.providerLabel,t)}))),o=await e.ask((0,t.selectAction)(`model`,`Select model`,a,{maxVisible:8}));return o.type!==`answer`||o.values[0]===void 0?{message:`Model selection cancelled.`,success:!0}:ta(r,o.values[0],i)}function ra(e){let t=[];for(let n of e.groups){t.push(`${n.providerLabel} (${n.profileName})`);for(let r of n.models){let i=r.id===e.currentModel&&n.profileName===e.currentProfile?`*`:`-`;t.push(` ${i} ${r.label}`)}}return t.join(`
50
+ `)}function ia(e,t,n,r){let i=r.id===e.currentModel&&t===e.currentProfile?`* `:``,a=e.groups.filter(e=>e.providerLabel===n).length>1?` (${t})`:``;return`${i}${n}: ${r.label}${a}`}async function aa(t,n,r,i){let a=n.profileName;try{await t.getSession().applyModelOptions({model:n.model.id})}catch(e){return{message:`Could not switch to "${n.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let o=i.settings.readTargetSettings(),s=r.providers?.[a]??o.providers?.[a]??{};return i.settings.writeTargetSettings((0,e.upsertProviderProfile)(o,a,{...s,model:n.model.id})),{message:`Model: ${n.model.label}`,success:!0}}async function oa(t,n,r){let{orgPolicy:i}=r;if(i?.allowedProviders&&!i.allowedProviders.includes(t.profileName))return{message:(0,e.formatOrgPolicyViolationMessage)(`Provider "${t.profileName}" is not allowed by your organization policy. Allowed: ${i.allowedProviders.join(`, `)}.`,i.adminContact),success:!1};let a=n.providers?.[t.profileName];if(a===void 0)return{message:`Provider profile "${t.profileName}" was not found.`,success:!1};let o={...a,model:t.model.id};try{await Qi(t.profileName,o,r)}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let s=r.settings.readTargetSettings(),c=r.settings.readMergedSettings();if(c.currentProvider!==n.currentProvider||JSON.stringify(c.providers?.[t.profileName])!==JSON.stringify(a))return{success:!1,message:`Provider settings changed while switching. Run /model again.`};let l=(0,e.upsertProviderProfile)(s,t.profileName,o),u=s.providers?.[t.profileName]!==void 0||c.providers?.[t.profileName]!==void 0?{...l,currentProvider:t.profileName}:(0,e.setCurrentProvider)(l,t.profileName);return r.settings.writeTargetSettings(u),{message:`Model: ${t.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t.profileName}]}}function sa(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function ca(e){let t=sa();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,lifecycle:`inline`,execute:(t,n)=>ta(t,n,e)}}var la=class{name=`model`;getCommands(){return[sa()]}};function ua(e){return{name:`agent-command-model`,commandSources:[new la],systemCommands:[ca(e)]}}const z=[{mode:`auto-allow`,description:`Confine shell commands; confined ones run without a prompt`},{mode:`regular`,description:`Confine shell commands; prompts work as usual`},{mode:`off`,description:`Run shell commands on this machine, unconfined`}];function da(e){return z.some(t=>t.mode===e)}function fa(e){let t=[`Sandbox: ${e.mode}${e.backend===void 0?``:` (${e.backend})`}`];return e.unavailable!==void 0&&t.push(e.mode===`off`?`Not available here: ${e.unavailable}.`:`Cannot run here: ${e.unavailable}. Commands run unconfined.`),e.mode!==`off`&&e.unavailable===void 0&&(t.push(`Writes are limited to the workspace and temp directories; settings and git hooks stay read-only.`,`Network: ${e.network?`allowed`:`blocked`}.`),e.excludedCommands.length>0&&t.push(`Run unconfined: ${e.excludedCommands.join(`, `)}.`)),t.join(`
51
+ `)}async function pa(e,n){let r=e.getUserInteraction();if(!r)return;let i=z.map(({mode:e,description:t})=>({value:e,label:e===n?`${e} (current)`:e,description:t})),a=await r.ask((0,t.selectAction)(`sandbox`,`Sandbox mode`,i));return a.type===`answer`?a.values[0]:void 0}async function ma(e,t){let n=e.getCommandHostAdapters?.().sandbox;if(n===void 0)return{message:`This host has no OS sandbox.`,success:!1};let r=n.status(),i=t.trim().split(/\s+/)[0]||await pa(e,r.mode);if(i===void 0||i===``)return{message:fa(r),success:!0,data:{...r}};if(!da(i))return{message:`Unknown sandbox mode "${i}". Valid: ${z.map(e=>e.mode).join(` | `)}`,success:!1};n.setMode(i);let a=n.status();return{message:`Sandbox mode set to: ${i}\n${fa(a)}`,success:!0,data:{...a}}}const ha=z.map(e=>e.mode).join(` | `);function ga(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:ha,subcommands:z.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function _a(){let e=ga();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:ma}}var va=class{name=`sandbox`;getCommands(){return[ga()]}};function ya(){return{name:`agent-command-sandbox`,commandSources:[new va],systemCommands:[_a()]}}function ba(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function xa(e,t){return[`Available output styles:`,...t.listOutputStyles().map(t=>{let n=t.id===e?`* `:` `,r=t.tokenCost?` [input cost: ${t.tokenCost}]`:``;return`${n}${t.id} — ${t.name}: ${t.description}${r}`})].join(`
52
52
  `)}function Sa(e,t){let n=e.getActiveOutputStyleId(),r=t.listOutputStyles();return{success:!0,message:xa(n,t),data:{outputStyles:r,active:n}}}async function Ca(e,n){let r=e.getUserInteraction();if(!r)return;let i=n.listOutputStyles().map(e=>({value:e.id,label:e.id,description:e.description})),a=await r.ask((0,t.selectAction)(`output-style`,`Select an output style`,i));return a.type===`answer`?a.values[0]:void 0}async function wa(e,t){let n=ba(e);if(!n)return{success:!1,message:`Output styles are not available in this environment.`};let r=t.trim();if(r===`list`||!r&&(r=await Ca(e,n)??``,!r))return Sa(e,n);let i=n.getOutputStyle(r);return i?{success:!0,message:`Switching output style to ${i.name}...`,data:{outputStyle:i.id},hostActions:[{type:`output-style-change`,styleId:i.id}]}:{success:!1,message:`Unknown output style "${r}". Available: ${n.listOutputStyles().map(e=>e.id).join(`, `)||`(none)`}`}}function Ta(){return{name:`output-style`,displayName:`Output Style`,description:`List or switch the active provider-neutral response style`,argumentHint:`list | <style-id>`,source:`output-style`,userInvocable:!0,modelInvocable:!1}}function Ea(){let e=Ta();return{name:e.name,displayName:e.displayName,description:e.description,argumentHint:e.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:wa}}var Da=class{name=`output-style`;getCommands(){return[Ta()]}};function Oa(){return{name:`agent-command-output-style`,commandSources:[new Da],systemCommands:[Ea()]}}const ka=/^[a-zA-Z0-9_-]{1,64}$/u;function Aa(e){let t=Object.entries(e).filter(([,e])=>(e??0)>0);return t.length===0?`none`:t.map(([e,t])=>`${e} ${t}`).join(`, `)}function ja(e){let{counters:t}=e;return` ${e.grantId} ${e.principal} ${e.state} accepted ${t.accepted}; refused: ${Aa(t.refused)}; settled: ${Aa(t.settled)}`}async function Ma(e,t=``){let n=e.getCommandHostAdapters?.().externalEvents;if(!n)return{message:`This session holds no external event grant. Grants are given only when a session starts.`,success:!0};let[r,i,a]=t.trim().split(/\s+/u).filter(e=>e!==``);if(r===void 0){let e=n.list();return{message:e.length===0?`This session holds no external event grant.`:`External event grants:\n${e.map(ja).join(`
53
53
  `)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!ka.test(i)?{message:`Usage: /events | /events revoke <grant-id>`,success:!1}:n.revoke(i)===`revoked`?{message:`Revoked external event grant ${i}. Later events for it are refused.`,success:!0}:{message:`This session holds no external event grant ${i}.`,success:!1}}function Na(){return{name:`events`,displayName:`Events`,description:"List this session's external event grants (each grant's label, whether it pins a subject or a client, whether it is open or revoked, and its counts of accepted, refused and settled events), or revoke one with `/events revoke <grant-id>`. Returns the grants, or whether the revocation took effect. User-only: the model cannot run it; when the user wants to stop events from outside, suggest `/events revoke <grant-id>`.",source:`events`,argumentHint:`[revoke <grant-id>]`,modelInvocable:!1}}function Pa(){let e=Na();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},lifecycle:`inline`,execute:(e,t)=>Ma(e,t)}}var Fa=class{name=`events`;getCommands(){return[Na()]}};function Ia(){return{name:`agent-command-events`,commandSources:[new Fa],systemCommands:[Pa()]}}function La(e){return e.liveness!==`dead`}function Ra(e,t){let n=e.sessionId===t?` (this session)`:``,r=e.liveness===`unknown`?` liveness unknown`:``,i=e.status===`needs-input`?`needs input`:e.status??`unknown`;return` ${e.sessionId}${e.name?` ${e.name}`:``} status ${i}${n?``:Ba(e)}${r}${n}`}function za(e){let t=e.locality===`same-host`?`on this machine`:`on another machine`;return` ${e.deviceId}${e.name?` ${e.name}`:``} ${t}`}function Ba(e){if(e.workspaceClaim===`mismatched`)return` workspace claim mismatched, not believed`;switch(e.workspaceRelation){case void 0:return``;case`unknown`:return` workspace unknown`;default:return` ${e.workspaceRelation.replace(`-`,` `)}`}}function Va(e){let t=e.trim(),n=t.search(/\s/);if(n===-1)return;let r=t.slice(n).trim();if(r!==``)return{target:t.slice(0,n),text:r}}function Ha(e,t){let n=e.reason===void 0?``:` ${e.reason}`;switch(e.state){case`acknowledged`:case`delivered`:return{message:`Delivered to ${t}.`,success:!0};case`pending`:return{message:`${t} has the message; it is waiting behind work already running there.`,success:!0};case`duplicate`:return{message:`${t} had already seen that message.`,success:!0};default:return{message:`Not delivered to ${t}.${n}`,success:!1}}}async function Ua(e,t){if(e.send===void 0)return{message:`This environment can discover other sessions but cannot address them.`,success:!1};let n=Va(t);return n===void 0?{message:`Usage: /peers send <session-id> <message>. Run /peers for the session ids.`,success:!1}:Ha(await e.send(n.target,n.text),n.target)}async function Wa(e,t,n){if(e.prepareFile===void 0)return{message:`This environment cannot send files to other sessions.`,success:!1};let r=Va(t);if(r===void 0)return{message:`Usage: /peers send-file <session-id> <path>. Run /peers for the session ids.`,success:!1};let i=await e.prepareFile(r.target,r.text,{origin:`operator`,cwd:n});if(!i.ok)return{message:`Not sent: ${i.reason}`,success:!1};let{file:a}=i,o=await a.send();if(o.state===`delivered`||o.state===`acknowledged`)return{message:`Sent ${a.path} to ${r.target}: ${a.size} bytes, sha256 ${a.sha256}.`,success:!0};let s=o.reason===void 0?``:` ${o.reason}`;return{message:`${a.path} was not sent to ${r.target}.${s}`,success:!1}}async function Ga(e,t=``){let n=e.getCommandHostAdapters?.().localPeers;if(!n)return{message:`Local peer discovery is not available in this environment.`,success:!0};let r=t.trim(),i=/^send-file(?=\s|$)/.exec(r);if(i!==null)return Wa(n,r.slice(i[0].length),e.getCwd?.()??``);let a=/^send(?=\s|$)/.exec(r);if(a!==null)return Ua(n,r.slice(a[0].length));let o=n.listDevices?.()??[],s=n.localDiscoveryOff;if(s!==void 0){let e=`Sessions on this host are not listed: local peer discovery is off for this session (${s}).`;return{message:o.length===0?`${e}\nNo device is linked right now.`:`Linked devices:\n${o.map(za).join(`
54
54
  `)}\n\n${e}\n\nSend to one: /peers send <device-id> <message>\nSend a file: /peers send-file <device-id> <path>`,success:!0}}let c=n.ownSessionId(),l=(n.listWithWorkspace===void 0?n.list():await n.listWithWorkspace()).filter(La);if(l.filter(e=>e.sessionId!==c).length===0&&o.length===0)return{message:`No other live session is announced. Start a second session on this host, as this user, and it appears here.`,success:!0};let u=[`Live sessions:\n${l.map(e=>Ra(e,c)).join(`
55
55
  `)}`];o.length>0&&u.push(`Linked devices:\n${o.map(za).join(`
56
56
  `)}`);let d=o.length>0?`<session-or-device-id>`:`<session-id>`;return{message:`${u.join(`
57
57
 
58
- `)}\n\nSend to one: /peers send ${d} <message>\nSend a file: /peers send-file ${d} <path>`,success:!0}}function Ka(){return{name:`peers`,displayName:`Peers`,description:"List the other live sessions for this user on this host and the user's linked devices, send one a message, or send one a copy of a file. Returns the sessions and devices with the ids to address them by (linked devices even when local discovery is off and sessions on this host cannot be listed), or how a send ended. User-only: the model cannot run it; it answers a peer's message with its reply tool, and when the user wants to reach another session or device, suggest they run `/peers`.",source:`peers`,modelInvocable:!1}}function qa(){let e=Ka();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Ga(e,t)}}var Ja=class{name=`peers`;getCommands(){return[Ka()]}};function Ya(){return{name:`agent-command-peers`,commandSources:[new Ja],systemCommands:[qa()]}}function Xa(){return{name:`permissions`,displayName:`Permissions`,description:e.PERMISSIONS_COMMAND_DESCRIPTION,source:`permissions`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`permissions`),modelInvocable:!1}}function Za(){let e=Xa();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Ki}}var Qa=class{name=`permissions`;getCommands(){return[Xa()]}};function $a(){return{name:`agent-command-permissions`,commandSources:[new Qa],systemCommands:[Za()]}}function eo(e){let t=[`Plan: ${e.objective}`,`Phase: ${e.phase}${e.approvedAt?` (approved ${e.approvedAt})`:``}`];return e.steps.forEach((e,n)=>{t.push(` ${n+1}. [${e.status}] ${e.description}`)}),t.join(`
58
+ `)}\n\nSend to one: /peers send ${d} <message>\nSend a file: /peers send-file ${d} <path>`,success:!0}}function Ka(){return{name:`peers`,displayName:`Peers`,description:"List the other live sessions for this user on this host and the user's linked devices, send one a message, or send one a copy of a file. Returns the sessions and devices with the ids to address them by (linked devices even when local discovery is off and sessions on this host cannot be listed), or how a send ended. User-only: the model cannot run it; it answers a peer's message with its reply tool, and when the user wants to reach another session or device, suggest they run `/peers`.",source:`peers`,modelInvocable:!1}}function qa(){let e=Ka();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Ga(e,t)}}var Ja=class{name=`peers`;getCommands(){return[Ka()]}};function Ya(){return{name:`agent-command-peers`,commandSources:[new Ja],systemCommands:[qa()]}}function Xa(){return{name:`permissions`,displayName:`Permissions`,description:e.PERMISSIONS_COMMAND_DESCRIPTION,source:`permissions`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`permissions`),modelInvocable:!1}}function Za(){let e=Xa();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Gi}}var Qa=class{name=`permissions`;getCommands(){return[Xa()]}};function $a(){return{name:`agent-command-permissions`,commandSources:[new Qa],systemCommands:[Za()]}}function eo(e){let t=[`Plan: ${e.objective}`,`Phase: ${e.phase}${e.approvedAt?` (approved ${e.approvedAt})`:``}`];return e.steps.forEach((e,n)=>{t.push(` ${n+1}. [${e.status}] ${e.description}`)}),t.join(`
59
59
  `)}async function to(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`help`)return{message:`Usage:
60
60
  /plan <objective> draft a plan for review (stays read-only until approved)
61
61
  /plan status show the current plan and phase
62
62
  /plan approve approve the plan (edits auto-apply; shell stays confirmed)
63
- /plan revert return to drafting (re-blocks edits)`,success:!0};if(r===`status`){let t=e.getPlanState();return t?{message:eo(t),success:!0,data:{phase:t.phase}}:{message:`No plan is active.`,success:!0}}if(r===`approve`){if(!e.getPlanState())return{message:`No plan to approve. Start one with /plan <objective>.`,success:!1};try{let t=e.approvePlan();return{message:`Plan approved — edits will auto-apply; shell steps stay confirmed.\nPhase: ${t.phase}`,success:!0,data:{phase:t.phase}}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}if(r===`revert`){if(!e.getPlanState())return{message:`No plan to revert.`,success:!1};let t=e.revertPlan();return{message:`Reverted to drafting — edits are blocked again (plan mode).\nPhase: ${t.phase}`,success:!0,data:{phase:t.phase}}}let i;try{i=await e.setPlan(n)}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return{message:`Plan drafted (read-only until approved). Review it, then run /plan approve:\n${i.objective}`,success:!0,data:{planId:i.id}}}function no(){return{name:`plan`,displayName:`Plan Mode`,description:`Draft a reviewable plan, then approve it to unblock edits (plan → review → approve → act).`,source:`plan`,modelInvocable:!1}}function ro(){let e=no();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:to}}var io=class{name=`plan`;getCommands(){return[no()]}};function ao(){return{name:`agent-command-plan`,commandSources:[new io],systemCommands:[ro()]}}function oo(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function z(e){return{success:!1,message:e}}function so(t){return(0,e.resolvePluginCommandAdapter)(t)}const co=`Installing and uninstalling plugins runs code on this computer, so it only works from the desktop app or the page opened here — not from a remote device.`;function lo(e){return(e.getCommandSurfaceLocality?.()??`local`)===`remote`}async function B(e,t){let n=so(e);if(n===void 0)return{success:!1,message:`Plugin management is not available.`};try{return{success:!0,message:await t(n)}}catch(e){return{success:!1,message:`Plugin error: ${e instanceof Error?e.message:String(e)}`}}}async function uo(e,t){let{subcommand:n,subArgs:r}=oo(t);return n===`add`&&r.length>0?B(e,async e=>{let t=await e.marketplaceAdd(r);return`Added marketplace: "${t}" (from ${r})\nInstall plugins with: /plugin install <name>@${t}`}):n===`remove`&&r.length>0?B(e,async e=>(await e.marketplaceRemove(r),`Removed marketplace "${r}" and uninstalled its plugins.`)):n===`update`&&r.length>0?B(e,async e=>(await e.marketplaceUpdate(r),`Updated marketplace "${r}".`)):n===`list`?B(e,async e=>{let t=await e.marketplaceList();return t.length===0?`No marketplace sources configured.`:`Marketplace sources:\n${t.map(e=>` ${e.name} (${e.type})`).join(`
64
- `)}`}):z(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function V(e,t,n,r){return t.length===0?Promise.resolve(z(n)):B(e,e=>Promise.resolve(r(e,t)))}function fo(){return{success:!0,message:`Opening plugin manager...`,uiIntents:[(0,e.createShowPluginManagerIntent)()]}}function po(e,t){return lo(e)?Promise.resolve(z(co)):V(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function mo(e,t){return lo(e)?Promise.resolve(z(co)):V(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}async function ho(e){let t=so(e);if(t===void 0)return{success:!0,message:`Plugin management is not available.`,data:{plugins:[]}};try{let e=await t.listInstalled();return{success:!0,message:e.length===0?`No plugins are installed.`:`Installed plugins:\n${e.map(e=>` ${e.name}${e.enabled?``:` (disabled)`} — ${e.description}`).join(`
65
- `)}`,data:{plugins:e}}}catch(e){return{success:!1,message:`Plugin error: ${e instanceof Error?e.message:String(e)}`}}}function go(e,t){return V(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function _o(e,t){return V(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function vo(e,t){let{subcommand:n,subArgs:r}=oo(t);switch(n){case``:case`manage`:return fo();case`list`:return ho(e);case`install`:return po(e,r);case`uninstall`:return mo(e,r);case`enable`:return go(e,r);case`disable`:return _o(e,r);case`marketplace`:return uo(e,r);default:return z(`Unknown plugin subcommand: ${n}`)}}async function yo(e,t){return B(e,async e=>{let t=await e.reloadPlugins();return`Reloaded ${t.loadedPluginCount===1?`1 plugin resource`:`${t.loadedPluginCount} plugin resources`}. Plugin commands and skills are active now; hook changes apply to new sessions.`}).then(e=>({...e,data:{...e.data,pluginRegistryReloaded:!0}}))}function bo(){return{name:`plugin`,displayName:`Plugins`,description:e.PLUGIN_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1,argumentHint:e.PLUGIN_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildPluginCommandSubcommands)()}}function xo(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:e.RELOAD_PLUGINS_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1}}function So(){let e=bo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,canRunDuringTurn:e=>{let t=e.trim().split(/\s+/);return t.length===2&&[`disable`,`uninstall`].includes(t[0])},subcommands:e.subcommands,execute:vo}}function Co(){let e=xo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:yo}}var wo=class{name=`plugin-manager`;getCommands(){return[bo(),xo()]}};function To(){return{name:`agent-command-plugin`,commandSources:[new wo],systemCommands:[So(),Co()]}}function Eo(e){return e.getCommandHostAdapters?.().presetRegistry??(0,c.createPresetRegistry)()}function Do(e){return e.getSession().getActivePresetId()}function Oo(e,t){return[`Available presets:`,...t.listPresets().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
66
- `)}function ko(e,t){return`Unknown preset: ${e}. Available: ${t.listPresets().map(e=>e.id).join(`, `)}`}function Ao(e,t){let n=Do(e);return{message:Oo(n,t),success:!0,data:{presets:t.listPresets(),active:n}}}async function jo(e,n){let r=e.getUserInteraction();if(!r)return;let i=n.listPresets().map(e=>({value:e.id,label:e.id,description:e.description})),a=await r.ask((0,t.selectAction)(`preset`,`Select a preset`,i));return a.type===`answer`?a.values[0]:void 0}async function Mo(t,n){let r=Eo(t),i=n.trim().split(/\s+/)[0];if(i===`list`||(i===void 0||i.length===0)&&(i=await jo(t,r),i===void 0))return Ao(t,r);if(r.getPreset(i)===void 0)return{message:ko(i,r),success:!1};let a=r.resolvePreset(i),o=await(0,e.applyPresetToSession)(t,i,a),s=o.unknownCommandModules.map(({name:e,kind:t})=>`Preset command-module "${e}" (${t}) matched no module — expected the agent-command-* form; ignored.`);return{message:[`Switched to preset: ${i}`,...s].join(`
67
- `),success:!0,data:{preset:i,unknownCommandModules:o.unknownCommandModules}}}function No(e=`preset`){return(0,c.createPresetRegistry)().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function Po(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:No(`preset`),modelInvocable:!1}}function Fo(){let e=Po();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Mo}}var Io=class{name=`preset`;getCommands(){return[Po()]}};function Lo(){return{name:`agent-command-preset`,commandSources:[new Io],systemCommands:[Fo()]}}function H(e,t,n={}){let r=Jo(e,t);return{type:e,steps:Zo(Yo(r).filter(e=>e.editOnly!==!0||n.includeEditOnlySteps===!0),n.initialValues),setupHelpLinks:r.setupHelpLinks??[],stepIndex:0,values:{},existingProfileNames:n.existingProfileNames??[],...n.profileName===void 0?{}:{profileName:n.profileName},...n.setCurrent===void 0?{}:{setCurrent:n.setCurrent}}}function Ro(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Wo(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
68
- `)}function zo(e,n){let r=e.trim(),i=r.length>0?r:`1`,a=Ko(i);if(a!==void 0){let e=n[a];if(e!==void 0)return e.type;throw Error(`Provider selection ${i} is out of range. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`)}let o=(0,t.findProviderDefinition)(n,i);if(o===void 0)throw Error(`Unknown provider: ${i}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return o.type}function U(e){let t=e.steps[e.stepIndex];if(t===void 0)throw Error(`Provider setup step ${e.stepIndex} is out of range`);return t}function Bo(e,t){let n=U(e),r=t.trim()||n.defaultValue||``,i=qo(n,r);if(i!==void 0)return{status:`error`,state:e,message:i};let a={...e,stepIndex:e.stepIndex+1,values:{...e.values,[n.key]:r}};return a.stepIndex<e.steps.length?{status:`next`,state:a}:{status:`complete`,input:Qo(a)}}async function Vo(e,t,n,r={}){let i=H(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=U(i),n=await t(Ho(e,i.setupHelpLinks),e.masked===!0),r=Bo(i,n);if(r.status===`complete`)return r.input;if(r.status===`error`)throw Error(r.message);i=r.state}throw Error(`Provider setup flow ended without completion`)}function Ho(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Go(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Uo={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Wo(e){let t=`${e.category===void 0?``:`${Uo[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Go(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${Xo(e.kind)}: ${e.label} - ${e.url}`).join(`
69
- `)}function Ko(e){if(/^\d+$/.test(e))return Number(e)-1}function qo(e,t){if(e.required===!0&&t.length===0)return`Required`}function Jo(e,n){let r=(0,t.findProviderDefinition)(n,e);if(r===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return r}function Yo(e){if(e.setupSteps!==void 0)return[...e.setupSteps];let t=[{key:`model`,title:`${e.type} model`,defaultValue:e.defaults?.model,required:e.defaults?.model===void 0}];return e.defaults?.baseURL!==void 0&&t.unshift({key:`baseURL`,title:`${e.type} base URL`,defaultValue:e.defaults.baseURL}),e.requiresApiKey===!0&&t.push({key:`apiKey`,title:`${e.type} API key`,defaultValue:e.defaults?.apiKey,required:e.defaults?.apiKey===void 0,masked:!0}),t}function Xo(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function Zo(e,t){return t===void 0?[...e]:e.map(e=>{let n=t[e.key];return n===void 0?e:{...e,defaultValue:n,required:!1}})}function Qo(t){let n=t.profileName??(0,e.suggestProviderProfileName)({type:t.type},{existingProfileNames:t.existingProfileNames}),r=t.values.apiKey;return{profile:n,type:t.type,model:t.values.model,...r!==void 0&&r.length>0&&{apiKey:r},...t.values.baseURL!==void 0&&{baseURL:t.values.baseURL},setCurrent:t.setCurrent??!0}}const $o={type:`session-restart`,reason:`other`};function es(e,t){return H(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function ts(e,n){let r=U(e),i=r.masked===!0&&r.defaultValue!==void 0?`(unchanged)`:r.defaultValue,a=Go(e.setupHelpLinks),o=[n,a.length>0?a:void 0].filter(e=>e!==void 0&&e.length>0).join(`
70
- `)||void 0;return(0,t.textAction)(`provider-setup-${r.key}`,r.title,{description:o,placeholder:i,allowEmpty:r.defaultValue!==void 0||r.editOnly===!0&&r.required!==!0,masked:r.masked})}async function ns(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(ts(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Bo(i,t.text??``);if(o.status===`error`){a=o.message;continue}if(o.status===`complete`)return n(o.input);i=o.state,a=void 0}}function rs(e,t,n,r){return ns(e,t,e=>is(e,n,r),`Provider setup cancelled.`)}function is(t,n,r){let i=n.settings.readTargetSettings(),a=(0,e.buildProviderSetupPatch)(t,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}});return n.settings.writeTargetSettings((0,e.mergeProviderPatch)(i,a)),r?{message:`Provider ${t.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t.profile}]}:{message:`Provider ${t.profile} configured. Restarting...`,success:!0,hostActions:[{...$o,message:`Provider setup restart`}]}}function as(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function os(t,n,r){if(!n)return{message:`Usage: /provider switch <profile>`,success:!1};if(!t?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:i}=r;if(i?.allowedProviders&&!i.allowedProviders.includes(n))return{message:(0,e.formatOrgPolicyViolationMessage)(`Provider "${n}" is not allowed by your organization policy. Allowed: ${i.allowedProviders.join(`, `)}.`,i.adminContact),success:!1};if(r.settings.readMergedSettings().currentProvider===n)return{message:`Already using provider "${n}".`,success:!0};let a=t[n];try{(0,e.validateProviderProfile)(n,a,{providerDefinitions:r.providerDefinitions,...r.env===void 0?{}:{env:r.env}})}catch(e){return{message:`Failed to switch to "${n}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let o=r.settings.readTargetSettings(),s=r.settings.readMergedSettings(),c=o.providers?.[n]!==void 0||s.providers?.[n]!==void 0?{...o,currentProvider:n}:(0,e.setCurrentProvider)(o,n);return r.settings.writeTargetSettings(c),{message:`Switched to ${n} (${a.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:n}]}}async function ss(e,t,n){let r=n.settings.readMergedSettings().providers?.[t];if(!r)return{message:`Provider profile "${t}" was not found.`,success:!1};if(!r.type)return{message:`Provider profile "${t}" is missing type.`,success:!1};let i;try{i=H(r.type,n.providerDefinitions,{includeEditOnlySteps:!0,profileName:t,setCurrent:!1,initialValues:cs(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return ns(e,i,e=>ls(e,t,n),`Provider edit cancelled.`)}function cs(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function ls(t,n,r){let i=r.settings.readMergedSettings(),a=i.providers?.[n];if(!a)return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:o}=r;if(o?.requireApiKeyFromEnv&&(0,e.isApiKeyPlaintext)(t.apiKey))return{message:(0,e.formatOrgPolicyViolationMessage)(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,o.adminContact),success:!1};let s=r.settings.readTargetSettings(),c=(0,e.buildProviderSetupPatch)(t,{providerDefinitions:r.providerDefinitions,...r.env===void 0?{}:{env:r.env}}).providers[n];if(!c)return{message:`Provider profile "${n}" was not updated.`,success:!1};r.settings.writeTargetSettings((0,e.upsertProviderProfile)(s,n,{...a,...c}));let l=i.currentProvider===n;return{message:l?`Provider ${n} updated. Switching...`:`Provider ${n} updated.`,success:!0,...l?{hostActions:[{type:`provider-hot-swap`,profileName:n}]}:{}}}const us={type:`session-restart`,reason:`other`};async function ds(e,n,r){let i=r.settings.readMergedSettings();if(!i.providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let a=vs(n,Object.keys(i.providers)),o;for(;;){let i=await e.ask((0,t.textAction)(`provider-duplicate`,`Duplicate ${n} as`,{description:o,placeholder:a,allowEmpty:!0}));if(i.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let s=i.text??``,c=fs(s,a,r);if(c!==void 0){o=c;continue}return ps(n,s,a,r)}}function fs(e,t,n){let r=ys(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function ps(t,n,r,i){let a=i.settings.readMergedSettings().providers?.[t];if(!a)return{message:`Provider profile "${t}" was not found.`,success:!1};let o=ys(n,r),s=fs(o,r,i);return s===void 0?(i.settings.writeTargetSettings((0,e.upsertProviderProfile)(i.settings.readTargetSettings(),o,{...a})),{message:`Provider profile duplicated: ${t} -> ${o}.`,success:!0}):{message:s,success:!1}}function ms(t,n,r,i){return r?t?.[r]?Object.keys(t).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n===r?{message:`Cannot delete the profile in use. Switch to another profile first.`,success:!1}:i.settings.readTargetSettings().providers?.[r]===void 0?{message:`Provider profile "${r}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(i.settings.writeTargetSettings((0,e.deleteProviderProfile)(i.settings.readTargetSettings(),r)),{message:`Provider profile deleted: ${r}.`,success:!0}):{message:`Provider profile "${r}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function hs(e,n,r){let i=r.settings.readMergedSettings().providers??{};return i[n]?Object.keys(i).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(0,t.isConfirmed)(await e.ask((0,t.confirmAction)(`provider-delete`,`Delete profile "${n}"?`)))?gs(e,n,r):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${n}" was not found.`,success:!1}}async function gs(n,r,i){let a=i.settings.readMergedSettings();if(a.currentProvider!==r)return i.settings.writeTargetSettings((0,e.deleteProviderProfile)(i.settings.readTargetSettings(),r)),{message:`Provider profile deleted: ${r}.`,success:!0};let o=Object.entries(a.providers??{}).filter(([e])=>e!==r).map(([e,t])=>({value:e,label:as(e,t,a.currentProvider)})),s=await n.ask((0,t.selectAction)(`provider-delete-replacement`,`Replacement provider for ${r}`,o,{maxVisible:8}));return s.type!==`answer`||s.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:_s(r,s.values[0],i)}function _s(t,n,r){if(r.settings.readMergedSettings().providers?.[n]===void 0||n===t)return{message:`Provider profile "${n}" was not found.`,success:!1};let i=(0,e.deleteProviderProfile)(r.settings.readTargetSettings(),t);return r.settings.writeTargetSettings({...i,currentProvider:n}),{message:`Provider profile deleted: ${t}. Restarting with ${n}...`,success:!0,hostActions:[{...us,message:`Provider delete restart`}]}}function vs(t,n){let r=(0,e.sanitizeProviderProfileName)(`${t}-copy`)??`provider-copy`;if(!n.includes(r))return r;for(let e=2;e<1e3;e+=1){let t=`${r}-${e}`;if(!n.includes(t))return t}return`${r}-${Date.now()}`}function ys(t,n){return(0,e.sanitizeProviderProfileName)(t.trim()||n)??``}const bs=`switch`,xs=`edit`,Ss=`test`,Cs=`duplicate`,ws=`delete`;async function Ts(e,n,r,i){let a=Object.entries(r??{}).map(([e,t])=>({value:e,label:as(e,t,n)})),o=await e.ask((0,t.selectAction)(`provider-profile`,`Select provider profile`,a,{maxVisible:8}));return o.type!==`answer`||o.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Es(e,o.values[0],i)}async function Es(e,n,r){if(!r.settings.readMergedSettings().providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let i=await e.ask((0,t.selectAction)(`provider-profile-action`,`Provider profile: ${n}`,[{value:bs,label:`Switch`},{value:xs,label:`Edit`},{value:Ss,label:`Test`},{value:Cs,label:`Duplicate`},{value:ws,label:`Delete`}]));return i.type!==`answer`||i.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Ds(e,n,i.values[0],r)}async function Ds(t,n,r,i){let a=i.settings.readMergedSettings();switch(r){case bs:return os(a.providers,n,i);case xs:return ss(t,n,i);case Ss:return(0,e.testProviderProfileCommand)(a.currentProvider,a.providers,n,i);case Cs:return ds(t,n,i);case ws:return hs(t,n,i);default:return{message:`Unknown provider profile action "${r}".`,success:!1}}}async function Os(n,r,i){let a=n.getUserInteraction(),o=n.isSetupRequired?.()===!0,s=i.settings.readMergedSettings(),c=r.trim();if(c.length===0)return ks(a,s.currentProvider,s.providers,i);let l=c.split(/\s+/),[u=`current`,d]=l;return u===`list`?ks(a,s.currentProvider,s.providers,i):u===`current`||u===``?{message:js(s.currentProvider,s.providers),success:!0}:u===`switch`?os(s.providers,d,i):u===`test`?(0,e.testProviderProfileCommand)(s.currentProvider,s.providers,d,i):u===`edit`?a?d?ss(a,d,i):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:u===`duplicate`?a?d?ds(a,d,i):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:u===`delete`?d?!l.includes(`--confirmed`)&&a&&!(0,t.isConfirmed)(await a.ask((0,t.confirmAction)(`provider-delete`,`Delete profile "${d}"?`)))?{message:`Provider delete cancelled.`,success:!0}:ms(s.providers,s.currentProvider,d,i):{message:`Usage: provider delete <profile>`,success:!1}:u===`add`?Ms(a,d,i,o):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function ks(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:As(t,n),success:!0}:Ts(e,t,n,r)}function As(e,t){let n=Object.entries(t??{});return n.length===0?`No provider profiles configured.`:n.map(([t,n])=>`${t===e?`*`:`-`} ${t}: ${n.type??`unknown`} ${n.model??`(no model)`}`).join(`
71
- `)}function js(e,t){if(!e)return`No current provider configured.`;let n=t?.[e];return n?[`Current provider: ${e}`,`Type: ${n.type??`unknown`}`,`Model: ${n.model??`(no model)`}`,...n.baseURL?[`Base URL: ${n.baseURL}`]:[]].join(`
72
- `):`Current provider "${e}" was not found in providers.`}function Ms(e,n,r,i){return n===void 0||n.length===0?e?Ns(e,r,i):{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:(0,t.findProviderDefinition)(r.providerDefinitions,n)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:e?rs(e,es(n,r),r,i):{message:`Provider setup for "${n}" requires an interactive session.`,success:!1}}async function Ns(e,n,r){let i=n.providerDefinitions.map(e=>({value:e.type,label:Wo(e)})),a=await e.ask((0,t.selectAction)(`provider-type`,`Select provider`,i,{maxVisible:6}));if(a.type!==`answer`||a.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let o=a.values[0];return(0,t.findProviderDefinition)(n.providerDefinitions,o)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(n.providerDefinitions)}`,success:!1}:rs(e,es(o,n),n,r)}function Ps(){return[{name:`current`,description:`Show current provider`,source:`provider`},{name:`list`,description:`List provider profiles`,source:`provider`},{name:`switch`,description:`Hot-swap to another provider profile`,source:`provider`},{name:`add`,description:`Configure a provider profile`,source:`provider`},{name:`edit`,description:`Edit a profile, including optional server credentials`,source:`provider`},{name:`test`,description:`Test provider profile`,source:`provider`}]}function Fs(){return{name:`provider`,displayName:`Provider Setup`,description:`Show, configure or switch provider profiles. Suggest editing a profile when its URL, model or credentials need correction; returns profile details or the result of the change.`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | edit <profile> | test [profile]`,subcommands:Ps(),example:`/provider switch production`}}var Is=class{name=`provider`;getCommands(){return[Fs()]}};function Ls(e){let t=Fs();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,subcommands:t.subcommands,lifecycle:`inline`,execute:(t,n)=>Os(t,n,e)}}function Rs(e){return{name:`agent-command-provider`,commandSources:[new Is],systemCommands:[Ls(e)]}}async function zs(e,t){let n=(await e(`
63
+ /plan revert return to drafting (re-blocks edits)`,success:!0};if(r===`status`){let t=e.getPlanState();return t?{message:eo(t),success:!0,data:{phase:t.phase}}:{message:`No plan is active.`,success:!0}}if(r===`approve`){if(!e.getPlanState())return{message:`No plan to approve. Start one with /plan <objective>.`,success:!1};try{let t=e.approvePlan();return{message:`Plan approved — edits will auto-apply; shell steps stay confirmed.\nPhase: ${t.phase}`,success:!0,data:{phase:t.phase}}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}if(r===`revert`){if(!e.getPlanState())return{message:`No plan to revert.`,success:!1};let t=e.revertPlan();return{message:`Reverted to drafting — edits are blocked again (plan mode).\nPhase: ${t.phase}`,success:!0,data:{phase:t.phase}}}let i;try{i=await e.setPlan(n)}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return{message:`Plan drafted (read-only until approved). Review it, then run /plan approve:\n${i.objective}`,success:!0,data:{planId:i.id}}}function no(){return{name:`plan`,displayName:`Plan Mode`,description:`Draft a reviewable plan, then approve it to unblock edits (plan → review → approve → act).`,source:`plan`,modelInvocable:!1}}function ro(){let e=no();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:to}}var io=class{name=`plan`;getCommands(){return[no()]}};function ao(){return{name:`agent-command-plan`,commandSources:[new io],systemCommands:[ro()]}}function oo(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function B(e){return{success:!1,message:e}}function so(t){return(0,e.resolvePluginCommandAdapter)(t)}const co=`Installing and uninstalling plugins runs code on this computer, so it only works from the desktop app or the page opened here — not from a remote device.`;function lo(e){return(e.getCommandSurfaceLocality?.()??`local`)===`remote`}async function V(e,t){let n=so(e);if(n===void 0)return{success:!1,message:`Plugin management is not available.`};try{return{success:!0,message:await t(n)}}catch(e){return{success:!1,message:`Plugin error: ${e instanceof Error?e.message:String(e)}`}}}async function uo(e,t){let{subcommand:n,subArgs:r}=oo(t);return n===`add`&&r.length>0?V(e,async e=>{let t=await e.marketplaceAdd(r);return`Added marketplace: "${t}" (from ${r})\nInstall plugins with: /plugin install <name>@${t}`}):n===`remove`&&r.length>0?V(e,async e=>(await e.marketplaceRemove(r),`Removed marketplace "${r}" and uninstalled its plugins.`)):n===`update`&&r.length>0?V(e,async e=>(await e.marketplaceUpdate(r),`Updated marketplace "${r}".`)):n===`list`?V(e,async e=>{let t=await e.marketplaceList();return t.length===0?`No marketplace sources configured.`:`Marketplace sources:\n${t.map(e=>` ${e.name} (${e.type})`).join(`
64
+ `)}`}):B(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function fo(e,t,n,r){return t.length===0?Promise.resolve(B(n)):V(e,e=>Promise.resolve(r(e,t)))}function po(){return{success:!0,message:`Opening plugin manager...`,uiIntents:[(0,e.createShowPluginManagerIntent)()]}}function mo(e,t){return lo(e)?Promise.resolve(B(co)):fo(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function ho(e,t){return lo(e)?Promise.resolve(B(co)):fo(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}async function go(e){let t=so(e);if(t===void 0)return{success:!0,message:`Plugin management is not available.`,data:{plugins:[]}};try{let e=await t.listInstalled();return{success:!0,message:e.length===0?`No plugins are installed.`:`Installed plugins:\n${e.map(e=>` ${e.name}${e.enabled?``:` (disabled)`} — ${e.description}`).join(`
65
+ `)}`,data:{plugins:e}}}catch(e){return{success:!1,message:`Plugin error: ${e instanceof Error?e.message:String(e)}`}}}function _o(e,t){return fo(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function vo(e,t){return fo(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function yo(e,t){let{subcommand:n,subArgs:r}=oo(t);switch(n){case``:case`manage`:return po();case`list`:return go(e);case`install`:return mo(e,r);case`uninstall`:return ho(e,r);case`enable`:return _o(e,r);case`disable`:return vo(e,r);case`marketplace`:return uo(e,r);default:return B(`Unknown plugin subcommand: ${n}`)}}async function bo(e,t){return V(e,async e=>{let t=await e.reloadPlugins();return`Reloaded ${t.loadedPluginCount===1?`1 plugin resource`:`${t.loadedPluginCount} plugin resources`}. Plugin commands and skills are active now; hook changes apply to new sessions.`}).then(e=>({...e,data:{...e.data,pluginRegistryReloaded:!0}}))}function xo(){return{name:`plugin`,displayName:`Plugins`,description:e.PLUGIN_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1,argumentHint:e.PLUGIN_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildPluginCommandSubcommands)()}}function So(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:e.RELOAD_PLUGINS_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1}}function Co(){let e=xo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,canRunDuringTurn:e=>{let t=e.trim().split(/\s+/);return t.length===2&&[`disable`,`uninstall`].includes(t[0])},subcommands:e.subcommands,execute:yo}}function wo(){let e=So();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:bo}}var To=class{name=`plugin-manager`;getCommands(){return[xo(),So()]}};function Eo(){return{name:`agent-command-plugin`,commandSources:[new To],systemCommands:[Co(),wo()]}}function Do(e){return e.getCommandHostAdapters?.().presetRegistry??(0,c.createPresetRegistry)()}function Oo(e){return e.getSession().getActivePresetId()}function ko(e,t){return[`Available presets:`,...t.listPresets().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
66
+ `)}function Ao(e,t){return`Unknown preset: ${e}. Available: ${t.listPresets().map(e=>e.id).join(`, `)}`}function jo(e,t){let n=Oo(e);return{message:ko(n,t),success:!0,data:{presets:t.listPresets(),active:n}}}async function Mo(e,n){let r=e.getUserInteraction();if(!r)return;let i=n.listPresets().map(e=>({value:e.id,label:e.id,description:e.description})),a=await r.ask((0,t.selectAction)(`preset`,`Select a preset`,i));return a.type===`answer`?a.values[0]:void 0}async function No(t,n){let r=Do(t),i=n.trim().split(/\s+/)[0];if(i===`list`||(i===void 0||i.length===0)&&(i=await Mo(t,r),i===void 0))return jo(t,r);if(r.getPreset(i)===void 0)return{message:Ao(i,r),success:!1};let a=r.resolvePreset(i),o=await(0,e.applyPresetToSession)(t,i,a),s=o.unknownCommandModules.map(({name:e,kind:t})=>`Preset command-module "${e}" (${t}) matched no module — expected the agent-command-* form; ignored.`);return{message:[`Switched to preset: ${i}`,...s].join(`
67
+ `),success:!0,data:{preset:i,unknownCommandModules:o.unknownCommandModules}}}function Po(e=`preset`){return(0,c.createPresetRegistry)().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function Fo(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:Po(`preset`),modelInvocable:!1}}function Io(){let e=Fo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:No}}var Lo=class{name=`preset`;getCommands(){return[Fo()]}};function Ro(){return{name:`agent-command-preset`,commandSources:[new Lo],systemCommands:[Io()]}}function H(e,t,n={}){let r=Xo(e,t);return{type:e,steps:$o(Zo(r).filter(e=>e.editOnly!==!0||n.includeEditOnlySteps===!0),n.initialValues),setupHelpLinks:r.setupHelpLinks??[],stepIndex:0,values:{},existingProfileNames:n.existingProfileNames??[],...n.profileName===void 0?{}:{profileName:n.profileName},...n.setCurrent===void 0?{}:{setCurrent:n.setCurrent}}}function zo(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Ko(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
68
+ `)}function Bo(e,n){let r=e.trim(),i=r.length>0?r:`1`,a=Jo(i);if(a!==void 0){let e=n[a];if(e!==void 0)return e.type;throw Error(`Provider selection ${i} is out of range. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`)}let o=(0,t.findProviderDefinition)(n,i);if(o===void 0)throw Error(`Unknown provider: ${i}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return o.type}function Vo(e){let t=e.steps[e.stepIndex];if(t===void 0)throw Error(`Provider setup step ${e.stepIndex} is out of range`);return t}function Ho(e,t){let n=Vo(e),r=t.trim()||n.defaultValue||``,i=Yo(n,r);if(i!==void 0)return{status:`error`,state:e,message:i};let a={...e,stepIndex:e.stepIndex+1,values:{...e.values,[n.key]:r}};return a.stepIndex<e.steps.length?{status:`next`,state:a}:{status:`complete`,input:es(a)}}async function Uo(e,t,n,r={}){let i=H(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=Vo(i),n=await t(Wo(e,i.setupHelpLinks),e.masked===!0),r=Ho(i,n);if(r.status===`complete`)return r.input;if(r.status===`error`)throw Error(r.message);i=r.state}throw Error(`Provider setup flow ended without completion`)}function Wo(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=qo(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Go={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Ko(e){let t=`${e.category===void 0?``:`${Go[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function qo(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${Qo(e.kind)}: ${e.label} - ${e.url}`).join(`
69
+ `)}function Jo(e){if(/^\d+$/.test(e))return Number(e)-1}function Yo(e,t){if(e.required===!0&&t.length===0)return`Required`}function Xo(e,n){let r=(0,t.findProviderDefinition)(n,e);if(r===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return r}function Zo(e){if(e.setupSteps!==void 0)return[...e.setupSteps];let t=[{key:`model`,title:`${e.type} model`,defaultValue:e.defaults?.model,required:e.defaults?.model===void 0}];return e.defaults?.baseURL!==void 0&&t.unshift({key:`baseURL`,title:`${e.type} base URL`,defaultValue:e.defaults.baseURL}),e.requiresApiKey===!0&&t.push({key:`apiKey`,title:`${e.type} API key`,defaultValue:e.defaults?.apiKey,required:e.defaults?.apiKey===void 0,masked:!0}),t}function Qo(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function $o(e,t){return t===void 0?[...e]:e.map(e=>{let n=t[e.key];return n===void 0?e:{...e,defaultValue:n,required:!1}})}function es(t){let n=t.profileName??(0,e.suggestProviderProfileName)({type:t.type},{existingProfileNames:t.existingProfileNames}),r=t.values.apiKey;return{profile:n,type:t.type,model:t.values.model,...r!==void 0&&r.length>0&&{apiKey:r},...t.values.baseURL!==void 0&&{baseURL:t.values.baseURL},setCurrent:t.setCurrent??!0}}function ts(e,n){let r=Vo(e),i=r.masked===!0&&r.defaultValue!==void 0?`(unchanged)`:r.defaultValue,a=qo(e.setupHelpLinks),o=[n,a.length>0?a:void 0].filter(e=>e!==void 0&&e.length>0).join(`
70
+ `)||void 0;return(0,t.textAction)(`provider-setup-${r.key}`,r.title,{description:o,placeholder:i,allowEmpty:r.defaultValue!==void 0||r.editOnly===!0&&r.required!==!0,masked:r.masked})}async function ns(e,t,n,r,i){let a=t,o;for(;;){if(i?.aborted)return{message:r,success:!0};let t=await e.ask(ts(a,o),{signal:i});if(t.type===`cancelled`)return{message:r,success:!0};let s=Ho(a,t.text??``);if(s.status===`error`){o=s.message;continue}if(s.status===`complete`)return n(s.input);a=s.state,o=void 0}}let rs=0;const is={"awaiting-approval":`Waiting for browser approval`,exchanging:`Completing browser authentication`,validating:`Checking the connection`,saving:`Finishing connection setup`};function U(e,n){return((0,t.findProviderDefinition)(n.providerDefinitions,e)?.connectionMethods?.length??0)>0}async function as(n,r,i,a,o=!1){let s=(0,t.findProviderDefinition)(i.providerDefinitions,r.type),c=r.profileName??(0,e.suggestProviderProfileName)({type:r.type},{existingProfileNames:r.existingProfileNames}),l=i.settings.readMergedSettings(),u=l.providers?.[c],d=JSON.stringify(u);if(i.orgPolicy?.allowedProviders&&!i.orgPolicy.allowedProviders.includes(c))return{success:!1,message:(0,e.formatOrgPolicyViolationMessage)(`Provider profile "${c}" is not allowed by your organization policy.`,i.orgPolicy.adminContact)};let f=(s?.connectionMethods??[]).filter(e=>i.orgPolicy?.requireApiKeyFromEnv!==!0||e===`api-key`),p=i.orgPolicy?.requireApiKeyFromEnv?(0,e.formatOrgPolicyViolationMessage)(`Your organization requires an environment reference such as $ENV:OPENROUTER_API_KEY.`,i.orgPolicy.adminContact):void 0;for(;;){let m=await n.ask((0,t.selectAction)(`provider-connection-method`,`Connect with ${s?.displayName??r.type}`,f.map(e=>({value:e,label:e===`api-key`?`API key`:`Browser`})),{description:p}));if(m.type!==`answer`)return os();let h=m.values[0];if(h!==`api-key`&&h!==`browser`||!f.includes(h))return os();let g;if(h===`api-key`){let r=await n.ask((0,t.textAction)(`provider-connection-key`,`API key or $ENV:VARIABLE_NAME`,{masked:!0,allowEmpty:!1}));if(r.type!==`answer`)return os();if(g=r.text?.trim(),!g||i.orgPolicy?.requireApiKeyFromEnv&&!(0,t.isEnvReference)(g)){p=i.orgPolicy?.requireApiKeyFromEnv?(0,e.formatOrgPolicyViolationMessage)(`Enter an environment reference such as $ENV:OPENROUTER_API_KEY.`,i.orgPolicy.adminContact):`An API key is required.`;continue}if((0,t.isEnvReference)(g)){let e=g.slice(t.ENV_REFERENCE_PREFIX.length).trim();if(!e||!(i.env??process.env)[e]?.trim()){p=`The environment reference is unset or invalid. Set its variable, then choose API key to try again.`;continue}}}let _=new AbortController,v,y=0,b=++rs,x=()=>{v?.abort(),v=void 0},S=e=>{x();let r=new AbortController;v=r,n.ask((0,t.selectAction)(`provider-connection-progress-${b}-${++y}`,is[e],[{value:`cancel`,label:`Cancel connection`}],{description:`Keep this session open. You can cancel and choose API key setup.`}),{signal:r.signal}).then(e=>{(e.type===`answer`||!r.signal.aborted)&&_.abort()}).catch(()=>{r.signal.aborted||_.abort()})},C,w=async(f,p)=>{x();let m=p??_.signal,h,v={...r,profileName:c,steps:r.steps.filter(e=>e.key!==`apiKey`&&e.key!==`baseURL`)};if(v.steps.length===0?h={profile:c,type:r.type,model:s?.defaults?.model,setCurrent:r.setCurrent??!0}:await ns(n,v,e=>(h=e,{success:!0,message:``}),`Provider connection cancelled.`,m),!h||m.aborted||_.signal.aborted)throw _.abort(),Error(`Provider connection cancelled.`);let y=i.settings.readMergedSettings();if(JSON.stringify(y.providers?.[c])!==d||y.currentProvider!==l.currentProvider)throw Error(`Provider connection changed while setup was pending.`);let b=f===void 0?{apiKeyEnv:g?.slice(t.ENV_REFERENCE_PREFIX.length).trim()}:{apiKeyRef:f},S=(0,e.buildProviderSetupPatch)({...h,...b},{providerDefinitions:i.providerDefinitions,env:i.env});if(o&&u!==void 0){let e={...u};delete e.apiKey,delete e.apiKeyRef,S.providers[c]={...e,...S.providers[c]}}i.settings.writeTargetSettings((0,e.mergeProviderPatch)(i.settings.readTargetSettings(),S));let w=l.currentProvider===c;C={success:!0,message:`Provider ${c} connected.`,...o?w?{hostActions:[{type:`session-restart`,reason:`other`,message:`Provider connection restart`}]}:{}:{hostActions:a?[{type:`provider-hot-swap`,profileName:c}]:[{type:`session-restart`,reason:`other`,message:`Provider setup restart`}]}}};try{if(g!==void 0&&(0,t.isEnvReference)(g))await w();else if(i.connectionHost===void 0){p=`Host connection support is unavailable. Choose API key and use an environment reference.`;continue}else await i.connectionHost.connect({type:r.type,profile:c,method:h,...g===void 0?{}:{apiKey:g},signal:_.signal,...h===`browser`?{onProgress:S}:{}},w);if(C===void 0)throw Error(`The host did not save a connection.`);return C}catch{let e=h===`browser`&&r.type===`openrouter`?` If OpenRouter issued a key during this attempt, it may remain in your account. Review OpenRouter Keys at https://openrouter.ai/keys.`:``;if(_.signal.aborted){p=`Connection cancelled. Choose a connection method to try again.${e}`;continue}return{success:!1,message:`Connection failed. Retry with ${o?`/provider reconnect ${c}`:`/provider add ${r.type}`} and choose ${r.type===`openrouter`?`an ordinary OpenRouter API key or Browser`:`API key or Browser`}.${e}`}}finally{x()}}}function os(){return{success:!0,message:`Provider connection cancelled.`}}const ss={type:`session-restart`,reason:`other`};function cs(e,t){return H(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function ls(e,t,n,r){return U(t.type,n)?as(e,t,n,r):ns(e,t,e=>us(e,n,r),`Provider setup cancelled.`)}function us(t,n,r){let i=n.settings.readTargetSettings(),a=(0,e.buildProviderSetupPatch)(t,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}});return n.settings.writeTargetSettings((0,e.mergeProviderPatch)(i,a)),r?{message:`Provider ${t.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t.profile}]}:{message:`Provider ${t.profile} configured. Restarting...`,success:!0,hostActions:[{...ss,message:`Provider setup restart`}]}}function ds(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}async function fs(t,n,r){if(!n)return{message:`Usage: /provider switch <profile>`,success:!1};if(!t?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:i}=r;if(i?.allowedProviders&&!i.allowedProviders.includes(n))return{message:(0,e.formatOrgPolicyViolationMessage)(`Provider "${n}" is not allowed by your organization policy. Allowed: ${i.allowedProviders.join(`, `)}.`,i.adminContact),success:!1};let a=r.settings.readMergedSettings();if(a.currentProvider===n)return{message:`Already using provider "${n}".`,success:!0};let o=t[n];try{await Qi(n,o,r)}catch(e){return{message:`Failed to switch to "${n}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let s=r.settings.readTargetSettings(),c=r.settings.readMergedSettings();if(c.currentProvider!==a.currentProvider||JSON.stringify(c.providers?.[n])!==JSON.stringify(o))return{success:!1,message:`Provider settings changed while switching. Run /provider switch again.`};let l=s.providers?.[n]!==void 0||c.providers?.[n]!==void 0?{...s,currentProvider:n}:(0,e.setCurrentProvider)(s,n);return r.settings.writeTargetSettings(l),{message:`Switched to ${n} (${o.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:n}]}}async function ps(e,t,n){let r=n.settings.readMergedSettings().providers?.[t];if(!r)return{message:`Provider profile "${t}" was not found.`,success:!1};if(!r.type)return{message:`Provider profile "${t}" is missing type.`,success:!1};let i;try{i=H(r.type,n.providerDefinitions,{includeEditOnlySteps:!0,profileName:t,setCurrent:!1,initialValues:hs(r)}),U(r.type,n)&&(i={...i,steps:i.steps.filter(e=>e.key!==`apiKey`)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return ns(e,i,e=>gs(e,t,n),`Provider edit cancelled.`)}async function ms(e,t,n){let r=n.settings.readMergedSettings().providers?.[t];return r?.type?U(r.type,n)?as(e,H(r.type,n.providerDefinitions,{profileName:t,setCurrent:!1,initialValues:{...r.model===void 0?{}:{model:r.model}}}),n,!1,!0):{success:!1,message:`Use /provider edit ${t} to update this provider's credentials.`}:{success:!1,message:`Provider profile "${t}" was not found.`}}function hs(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function gs(t,n,r){let i=r.settings.readMergedSettings(),a=i.providers?.[n];if(!a)return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:o}=r;if(o?.requireApiKeyFromEnv&&(0,e.isApiKeyPlaintext)(t.apiKey))return{message:(0,e.formatOrgPolicyViolationMessage)(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,o.adminContact),success:!1};let s=r.settings.readTargetSettings(),c=(0,e.buildProviderSetupPatch)({...t,...t.apiKey===void 0&&a.apiKeyRef!==void 0?{apiKeyRef:a.apiKeyRef}:{},...t.apiKey===void 0&&a.apiKey!==void 0?{apiKey:a.apiKey}:{}},{providerDefinitions:r.providerDefinitions,...r.env===void 0?{}:{env:r.env}}).providers[n];if(!c)return{message:`Provider profile "${n}" was not updated.`,success:!1};r.settings.writeTargetSettings((0,e.upsertProviderProfile)(s,n,{...a,...c}));let l=i.currentProvider===n;return{message:l?`Provider ${n} updated. Switching...`:`Provider ${n} updated.`,success:!0,...l?{hostActions:[{type:`provider-hot-swap`,profileName:n}]}:{}}}const _s={type:`session-restart`,reason:`other`};async function vs(e,n,r){let i=r.settings.readMergedSettings();if(!i.providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let a=Ts(n,Object.keys(i.providers)),o;for(;;){let i=await e.ask((0,t.textAction)(`provider-duplicate`,`Duplicate ${n} as`,{description:o,placeholder:a,allowEmpty:!0}));if(i.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let s=i.text??``,c=ys(s,a,r);if(c!==void 0){o=c;continue}return bs(n,s,a,r)}}function ys(e,t,n){let r=Es(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function bs(t,n,r,i){let a=i.settings.readMergedSettings().providers?.[t];if(!a)return{message:`Provider profile "${t}" was not found.`,success:!1};let o=Es(n,r),s=ys(o,r,i);return s===void 0?(i.settings.writeTargetSettings((0,e.upsertProviderProfile)(i.settings.readTargetSettings(),o,{...a})),{message:`Provider profile duplicated: ${t} -> ${o}.`,success:!0}):{message:s,success:!1}}function xs(t,n,r,i){return r?t?.[r]?Object.keys(t).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n===r?{message:`Cannot delete the profile in use. Switch to another profile first.`,success:!1}:i.settings.readTargetSettings().providers?.[r]===void 0?{message:`Provider profile "${r}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(i.settings.writeTargetSettings((0,e.deleteProviderProfile)(i.settings.readTargetSettings(),r)),{message:`Provider profile deleted: ${r}.`,success:!0}):{message:`Provider profile "${r}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function Ss(e,n,r){let i=r.settings.readMergedSettings().providers??{};return i[n]?Object.keys(i).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(0,t.isConfirmed)(await e.ask((0,t.confirmAction)(`provider-delete`,`Delete profile "${n}"?`)))?Cs(e,n,r):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${n}" was not found.`,success:!1}}async function Cs(n,r,i){let a=i.settings.readMergedSettings();if(a.currentProvider!==r)return i.settings.writeTargetSettings((0,e.deleteProviderProfile)(i.settings.readTargetSettings(),r)),{message:`Provider profile deleted: ${r}.`,success:!0};let o=Object.entries(a.providers??{}).filter(([e])=>e!==r).map(([e,t])=>({value:e,label:ds(e,t,a.currentProvider)})),s=await n.ask((0,t.selectAction)(`provider-delete-replacement`,`Replacement provider for ${r}`,o,{maxVisible:8}));return s.type!==`answer`||s.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:ws(r,s.values[0],i)}function ws(t,n,r){if(r.settings.readMergedSettings().providers?.[n]===void 0||n===t)return{message:`Provider profile "${n}" was not found.`,success:!1};let i=(0,e.deleteProviderProfile)(r.settings.readTargetSettings(),t);return r.settings.writeTargetSettings({...i,currentProvider:n}),{message:`Provider profile deleted: ${t}. Restarting with ${n}...`,success:!0,hostActions:[{..._s,message:`Provider delete restart`}]}}function Ts(t,n){let r=(0,e.sanitizeProviderProfileName)(`${t}-copy`)??`provider-copy`;if(!n.includes(r))return r;for(let e=2;e<1e3;e+=1){let t=`${r}-${e}`;if(!n.includes(t))return t}return`${r}-${Date.now()}`}function Es(t,n){return(0,e.sanitizeProviderProfileName)(t.trim()||n)??``}const Ds=`switch`,Os=`edit`,ks=`test`,As=`duplicate`,js=`delete`,Ms=`reconnect`;async function Ns(e,n,r,i){let a=Object.entries(r??{}).map(([e,t])=>({value:e,label:ds(e,t,n)})),o=await e.ask((0,t.selectAction)(`provider-profile`,`Select provider profile`,a,{maxVisible:8}));return o.type!==`answer`||o.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Ps(e,o.values[0],i)}async function Ps(e,n,r){let i=r.settings.readMergedSettings();if(!i.providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let a=await e.ask((0,t.selectAction)(`provider-profile-action`,`Provider profile: ${n}`,[{value:Ds,label:`Switch`},{value:Os,label:`Edit`},...U(i.providers[n]?.type??``,r)?[{value:Ms,label:`Reconnect`}]:[],{value:ks,label:`Test`},{value:As,label:`Duplicate`},{value:js,label:`Delete`}]));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Fs(e,n,a.values[0],r)}async function Fs(t,n,r,i){let a=i.settings.readMergedSettings();switch(r){case Ds:return fs(a.providers,n,i);case Os:return ps(t,n,i);case Ms:return ms(t,n,i);case ks:return(0,e.testProviderProfileCommand)(a.currentProvider,a.providers,n,i);case As:return vs(t,n,i);case js:return Ss(t,n,i);default:return{message:`Unknown provider profile action "${r}".`,success:!1}}}async function Is(n,r,i){let a=n.getUserInteraction(),o=n.isSetupRequired?.()===!0,s=i.settings.readMergedSettings(),c=r.trim();if(c.length===0)return Ls(a,s.currentProvider,s.providers,i);let l=c.split(/\s+/),[u=`current`,d]=l;return u===`list`?Ls(a,s.currentProvider,s.providers,i):u===`current`||u===``?{message:zs(s.currentProvider,s.providers),success:!0}:u===`switch`?fs(s.providers,d,i):u===`test`?(0,e.testProviderProfileCommand)(s.currentProvider,s.providers,d,i):u===`edit`?a?d?ps(a,d,i):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:u===`reconnect`?a?d?ms(a,d,i):{message:`Usage: /provider reconnect <profile>`,success:!1}:{message:`Provider reconnect requires an interactive session.`,success:!1}:u===`duplicate`?a?d?vs(a,d,i):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:u===`delete`?d?!l.includes(`--confirmed`)&&a&&!(0,t.isConfirmed)(await a.ask((0,t.confirmAction)(`provider-delete`,`Delete profile "${d}"?`)))?{message:`Provider delete cancelled.`,success:!0}:xs(s.providers,s.currentProvider,d,i):{message:`Usage: provider delete <profile>`,success:!1}:u===`add`?Bs(a,d,i,o):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|reconnect <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function Ls(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Rs(t,n),success:!0}:Ns(e,t,n,r)}function Rs(e,t){let n=Object.entries(t??{});return n.length===0?`No provider profiles configured.`:n.map(([t,n])=>`${t===e?`*`:`-`} ${t}: ${n.type??`unknown`} ${n.model??`(no model)`}`).join(`
71
+ `)}function zs(e,t){if(!e)return`No current provider configured.`;let n=t?.[e];return n?[`Current provider: ${e}`,`Type: ${n.type??`unknown`}`,`Model: ${n.model??`(no model)`}`,...n.baseURL?[`Base URL: ${n.baseURL}`]:[]].join(`
72
+ `):`Current provider "${e}" was not found in providers.`}function Bs(e,n,r,i){return n===void 0||n.length===0?e?Vs(e,r,i):{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:(0,t.findProviderDefinition)(r.providerDefinitions,n)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:e?ls(e,cs(n,r),r,i):{message:`Provider setup for "${n}" requires an interactive session.`,success:!1}}async function Vs(e,n,r){let i=n.providerDefinitions.map(e=>({value:e.type,label:Ko(e)})),a=await e.ask((0,t.selectAction)(`provider-type`,`Select provider`,i,{maxVisible:6}));if(a.type!==`answer`||a.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let o=a.values[0];return(0,t.findProviderDefinition)(n.providerDefinitions,o)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(n.providerDefinitions)}`,success:!1}:ls(e,cs(o,n),n,r)}function Hs(){return[{name:`current`,description:`Show current provider`,source:`provider`},{name:`list`,description:`List provider profiles`,source:`provider`},{name:`switch`,description:`Hot-swap to another provider profile`,source:`provider`},{name:`add`,description:`Configure a provider profile`,source:`provider`},{name:`edit`,description:`Edit a profile, including optional server credentials`,source:`provider`},{name:`reconnect`,description:`Replace a named service connection through browser approval or API key entry`,source:`provider`,modelInvocable:!1},{name:`test`,description:`Test provider profile`,source:`provider`}]}function Us(){return{name:`provider`,displayName:`Provider Setup`,description:`Show, configure or switch provider profiles. Suggest /provider reconnect <profile> when a saved service connection needs new credentials, or /provider edit <profile> for its model or server settings; returns profile details or the result of the change.`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | edit <profile> | reconnect <profile> | test [profile]`,subcommands:Hs(),example:`/provider switch production`}}var Ws=class{name=`provider`;getCommands(){return[Us()]}};function Gs(e){let t=Us();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,subcommands:t.subcommands,lifecycle:`inline`,execute:(t,n)=>Is(t,n,e)}}function Ks(e){return{name:`agent-command-provider`,commandSources:[new Ws],systemCommands:[Gs(e)]}}const qs=`
73
73
  Do you have an API key for an AI provider?
74
74
 
75
75
  1. Yes, I have an API key
76
76
  2. No — get a free key (Google Gemini, takes ~2 min)
77
77
  3. No — use a local model (LM Studio, no API key needed)
78
78
 
79
- Choose [1-3] (default: 1): `)).trim()||`1`;return n===`2`?(t.writeLine(`
79
+ Choose [1-3] (default: 1): `;async function Js(e,t,n=!1){let r=(await e(n?qs.replace(` Choose [1-3]`,` 4. Connect with OpenRouter (Browser or API key)
80
+
81
+ Choose [1-4]`):qs)).trim()||`1`;return n&&r===`4`?{path:`connect`,preselectedType:`openrouter`}:r===`2`?(t.writeLine(`
80
82
  ── Get a free Gemini API key ────────────────────────────────────────────────
81
83
 
82
84
  1. Open https://aistudio.google.com/apikey in your browser
@@ -85,7 +87,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require
85
87
  4. Copy the key starting with "AIza..."
86
88
 
87
89
  ─────────────────────────────────────────────────────────────────────────────
88
- `),await e(` Press Enter when you have your API key: `),{path:`free-key`,preselectedType:`gemini`}):n===`3`?(t.writeLine(`
90
+ `),await e(` Press Enter when you have your API key: `),{path:`free-key`,preselectedType:`gemini`}):r===`3`?(t.writeLine(`
89
91
  ── Set up a local model with LM Studio ──────────────────────────────────────
90
92
 
91
93
  1. Download LM Studio from https://lmstudio.ai
@@ -96,23 +98,24 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require
96
98
  When the server is running, come back here and press Enter to continue.
97
99
 
98
100
  ─────────────────────────────────────────────────────────────────────────────
99
- `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function Bs(t,n,r,i,a){let o=await zs(r,i),s=Hs(n),c=Object.keys((0,e.readMergedProviderSettings)(s.sources).providers??{}),l=Us(s.stores,n.settingsScope),u;u=o.preselectedType===void 0?zo(await r(Ro(a)),a):o.preselectedType,(0,e.applyProviderConfiguration)(l,await Vo(u,r,a,{existingProfileNames:c}),{providerDefinitions:a,env:n.env});let d=await r(` Response language (ko/en/ja/zh, default: en): `);if(d){let e=l.read();e.language=d,l.write(e)}i.writeLine(`\n Config saved to ${l.displayName}\n`)}async function Vs(t,n,r,i,a,o){let s=Hs(n),c=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?c:{...c,currentProvider:n.provider},a,n.env??o.env)===`valid`||n.provider===void 0&&(0,e.resolveEnvDefaultProvider)(a,o.env)!==void 0)return;if(!(o.isInteractive??(()=>!1))())throw new e.ProviderConfigError(o.formatError(a));await Bs(t,Ws({...n,env:n.env??o.env},s.stores),r,i,a);let l=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?l:{...l,currentProvider:n.provider},a,n.env??o.env)!==`valid`)throw new e.ProviderConfigError(o.formatError(a))}function Hs(e){if(e.settingsSources===void 0||e.settingsStores===void 0)throw Error(`Provider startup requires host settings sources and stores.`);return{sources:e.settingsSources,stores:e.settingsStores}}function Us(t,n){if(n===void 0)return(0,e.resolveProviderSettingsWriteTarget)(t);let r=n===`user`?`user`:`project-local`,i=t.findLast(e=>e.scope===r);if(i!==void 0)return i;throw new e.WorkspaceAuthorityRequiredError(`No authorized ${r} settings store is available.`)}function Ws(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:Gs(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function Gs(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&typeof n.read().currentProvider==`string`)return n}}const Ks="only the operator at this terminal can do this; a connected surface cannot pair, enroll or revoke devices. Run `/remote-control` on the host terminal.";function qs(e,t){if(!e)return{message:`Remote control is not available in this environment.`,success:!0};switch(e.state){case`off`:return{message:"Remote control is off. Use `/remote-control` to enable it.",success:!0};case`no-relay`:return{message:"Remote control is unavailable: no signaling relay is configured (set `transports.webrtc.options.relayUrl`).",success:!0};case`awaiting-pairing`:return{message:t?`Remote control is waiting for a device to pair.\nOpen: ${e.pairingUrl}`:`Remote control is waiting for a device to pair. The pairing link is shown only on the host terminal.`,success:!0};case`paired`:return{message:`Remote control is active — a device is paired.`,success:!0};default:return{message:`Remote control status is unknown.`,success:!0}}}function Js(e,t){let n=e.getCommandInvocationSource()===`user`,r=t.trim(),i=r.indexOf(` `),a=(i===-1?r:r.slice(0,i)).toLowerCase(),o=i===-1?``:r.slice(i+1).trim();if(a===`status`){let t=e.getCommandHostAdapters?.().remoteControl,r=qs(t?.getStatus(),n);if(!t?.describeKeyStorage)return r;let i=t.describeKeyStorage()??`chosen when remote control is first enabled`;return{...r,message:`${r.message}\nHost key storage: ${i}`}}if(a===`devices`){let t=(e.getCommandHostAdapters?.().remoteControl)?.listDevices?.();return t?t.length===0?{message:`No trusted devices are enrolled yet.`,success:!0}:{message:`Trusted devices:\n${t.map(e=>` ${e.deviceId} ${e.label} (last seen ${e.lastSeenAt})`).join(`
100
- `)}`,success:!0}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}if(a===`revoke`){if(!n)return{message:`\`/remote-control revoke\`: ${Ks}`,success:!1};if(!o)return{message:`Usage: /remote-control revoke <deviceId>`,success:!1};let t=e.getCommandHostAdapters?.().remoteControl;return t?.revokeDevice?t.revokeDevice(o)?{message:`Revoked trusted device ${o}. It must re-pair to reconnect.`,success:!0}:{message:`No trusted device with id ${o}.`,success:!1}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}return a===`stop`||a===`off`?{message:`Stopping remote control...`,success:!0,hostActions:[{type:`remote-control-stop`}]}:a===``||a===`enable`||a===`on`?n?{message:`Enabling remote control...`,success:!0,hostActions:[{type:`remote-control-enable`}]}:{message:`\`/remote-control enable\`: ${Ks}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function Ys(){return{name:`remote-control`,displayName:`Remote control`,description:`Enable P2P remote control (pair a device to co-drive this session), or check status. Pairing and revoking run only for the operator at the host terminal; a connected surface can stop remote control and read its status, without the pairing link.`,source:`remote-control`,modelInvocable:!1,userInvocable:!0,argumentHint:`[enable|stop|status|devices|revoke <device-id>]`,subcommands:[{name:`status`,description:`Show remote-control status`,source:`remote-control`},{name:`devices`,description:`List trusted devices`,source:`remote-control`},{name:`enable`,description:`Enable remote control and pair a device`,source:`remote-control`},{name:`stop`,description:`Stop remote control`,source:`remote-control`},{name:`revoke`,description:`Revoke a trusted device`,source:`remote-control`,argumentHint:`<device-id>`}]}}function Xs(){return D(Ys(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>Js(e,t)})}var Zs=class{name=`remote-control`;getCommands(){return[Ys()]}};function Qs(){return{name:`agent-command-remote-control`,commandSources:[new Zs],systemCommands:[Xs()]}}function $s(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function ec(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function tc(){let e=ec();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:$s}}var nc=class{name=`reset`;getCommands(){return[ec()]}};function rc(){return{name:`agent-command-reset`,commandSources:[new nc],systemCommands:[tc()]}}function W(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function ic(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function ac(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${ic(e.prompt)}`):[`(no edit checkpoints)`]].join(`
101
- `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function oc(e){return e.length>0?e.join(`, `):`(none)`}function sc(e){let t=e.capturedFiles.length>0?e.capturedFiles.map(e=>{let t=e.snapshotSizeBytes===void 0?``:` size=${e.snapshotSizeBytes}B`;return`- ${e.relativePath} action=${e.restoreAction} snapshot=${String(e.snapshotAvailable)}${t}`}):[`(no files captured)`];return{message:[`Checkpoint ${e.target.id}`,`Prompt: ${ic(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${oc(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${oc(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
102
- `),success:!0,data:{inspection:e}}}function cc(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
103
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function lc(e){return{message:[`Rolled back code through ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Removed checkpoints: ${e.removedCheckpointCount}`].join(`
104
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function uc(e,t){return e.reason===`restricted-workspace`?t===void 0?`Edit checkpoints need a trusted workspace. Trust it from a terminal, then restart the session.`:`Edit checkpoints need a trusted workspace: run ${t} trust --yes, then restart ${t}.`:e.message}function G(t,n){return{message:t instanceof e.EditCheckpointsUnavailableError?uc(t,n):t instanceof Error?t.message:String(t),success:!1}}function dc(t){try{return ac((0,e.listCommandEditCheckpoints)(t))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}function fc(t,n){if(!n)return W();try{return sc((0,e.inspectCommandEditCheckpoint)(t,n))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function pc(t,n){if(!n)return W();try{return cc(await(0,e.restoreCommandEditCheckpoint)(t,n))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function mc(t,n){if(!n)return W();try{return lc(await(0,e.rollbackCommandEditCheckpoint)(t,n))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function hc(t,n){if(!n)return W();try{let r=await(0,e.forkCommandEditCheckpoint)(t,n);return{message:[`Forked a new branch from ${r.target.id} (the previous future is preserved).`,`Restored files: ${r.restoredFileCount}`].join(`
105
- `),success:!0,data:{target:r.target,restoredFileCount:r.restoredFileCount}}}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}function gc(t,n){if(!n)return W();try{return(0,e.switchCommandEditCheckpointBranch)(t,n),{message:`Switched to checkpoint branch ${n}.`,success:!0}}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}function _c(t){try{let n=(0,e.listCommandEditCheckpointBranches)(t);return{message:n.length===0?`No checkpoint branches yet.`:`Branch tips:\n${n.map(e=>`- ${e}`).join(`
106
- `)}`,success:!0,data:{branches:n}}}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function vc(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?dc(e):r===`inspect`?fc(e,n[1]):r===`restore`||r===`code`?pc(e,n[1]):r===`rollback`?mc(e,n[1]):r===`fork`?hc(e,n[1]):r===`switch`?gc(e,n[1]):r===`branches`?_c(e):W()}function yc(){return{name:`rewind`,displayName:`Rewind History`,description:e.REWIND_COMMAND_DESCRIPTION,source:`rewind`,argumentHint:e.REWIND_COMMAND_ARGUMENT_HINT,modelInvocable:!1,safety:`write`,subcommands:(0,e.buildRewindCommandSubcommands)()}}function bc(){let e=yc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,argumentHint:e.argumentHint,userInvocable:!0,modelInvocable:!1,safety:`write`,subcommands:e.subcommands,execute:vc}}var xc=class{name=`rewind`;getCommands(){return[yc()]}};function Sc(){return{name:`agent-command-rewind`,commandSources:[new xc],systemCommands:[bc()]}}function Cc(e,t){let n=Math.floor(Math.min(1800,t.milliseconds/2e3)),r=(0,l.createHash)(`sha256`).update(e).digest().readUInt32BE(0)%(n+1);if(r===0)return{cronExpression:t.cronExpression,jitterSeconds:r};let i=/^(\d+)(s|m|h)$/.exec(t.description);if(!i)throw Error(`Unsupported fixed-loop cadence for jitter.`);let a=Number(i[1]),o=i[2],s=r%60,c=Math.floor(r/60);return o===`s`?{cronExpression:a===60?`${r} * * * * *`:`${r}-59/${a} * * * * *`,jitterSeconds:r}:o===`m`?{cronExpression:a===60?`${s} ${c} * * * *`:`${s} ${c}-59/${a} * * * *`,jitterSeconds:r}:{cronExpression:a===24?`${s} ${c} 0 * * *`:`${s} ${c} */${a} * * *`,jitterSeconds:r}}const wc=4096,K=new WeakMap,Tc=new Set([`second`,`seconds`,`minute`,`minutes`,`hour`,`hours`,`day`,`days`,`s`,`m`,`h`,`d`]),Ec=`Usage: /loop [<prompt>] | /loop <N><s|m|h|d> [<prompt>] | /loop <prompt> every <N> <unit> | /loop list | /loop stop <id>. Bare and interval-only forms require a host maintenance prompt.`,Dc={ui:void 0,source:`user`},q={s:1e3,m:6e4,h:36e5,d:864e5},Oc=[...kc(60).map(e=>({cronExpression:e===60?`0 * * * * *`:`*/${e} * * * * *`,milliseconds:e*q.s,description:`${e}s`})),...kc(60).filter(e=>e>1).map(e=>({cronExpression:e===60?`0 0 * * * *`:`0 */${e} * * * *`,milliseconds:e*q.m,description:`${e}m`})),...kc(24).filter(e=>e>1).map(e=>({cronExpression:e===24?`0 0 0 * * *`:`0 0 */${e} * * *`,milliseconds:e*q.h,description:`${e}h`}))];function kc(e){return Array.from({length:e},(e,t)=>t+1).filter(t=>e%t===0)}function Ac(e,t){let n=Number(e),r=q[t];if(!Number.isSafeInteger(n)||n<=0||r===void 0)return;let i=n*r;return Number.isSafeInteger(i)&&i<=q.d?i:void 0}function jc(e){let t=e.length;for(;t>0&&/[a-z]/i.test(e[t-1]);)--t;let n=e.slice(t).toLowerCase();if(!Tc.has(n))return;for(;t>0&&/\s/u.test(e[t-1]);)--t;let r=t;for(;t>0&&e.charCodeAt(t-1)>=48&&e.charCodeAt(t-1)<=57;)--t;if(t===r)return;let i=e.slice(t,r),a=t;for(;t>0&&/\s/u.test(e[t-1]);)--t;if(t===a||e.slice(t-5,t).toLowerCase()!==`every`)return;t-=5;let o=t;for(;t>0&&/\s/u.test(e[t-1]);)--t;if(t===o)return;let s=e.slice(0,t).trim();return s?{instruction:s,amount:i,unit:n}:void 0}function Mc(e,t){let n=t&&t.length<=wc?t.trim():void 0;if(e===``)return;let r=/^(\d+)(s|m|h|d)$/i.exec(e);if(r&&n){let e=Ac(r[1],r[2].toLowerCase());return e===void 0?void 0:{instruction:n,requestedMs:e}}let i=/^(\d+)(s|m|h|d)\s([\s\S]+)$/i.exec(e);if(i){let e=i[3].trim(),t=Ac(i[1],i[2].toLowerCase());return e&&t!==void 0&&!jc(e)?{instruction:e,requestedMs:t}:void 0}let a=jc(e);if(!a)return;let o=Ac(a.amount,a.unit[0]);return o===void 0?void 0:{instruction:a.instruction,requestedMs:o}}function Nc(e){return Oc.find(t=>t.milliseconds>=e)}function J(e){return e.listSchedules().filter(e=>e.metadata?.sessionLoop===!0&&e.metadata?.sessionLoopSelfPaced!==!0&&e.status!==`cancelled`&&e.status!==`completed`&&e.status!==`failed`)}function Y(e){return(e.listSelfPacedLoops?.()??[]).filter(e=>e.phase!==`stopped`&&e.phase!==`expired`)}function X(e){let t=e.metadata?.sessionLoopId;return typeof t==`string`&&t.length>0?t:e.id}function Pc(e){let t=J(e),n=Y(e);return t.length+n.length===0?`No other active loops.`:[...t.map(e=>`- ${X(e)} [${e.status}] ${e.label}`),...n.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`)].join(`
107
- `)}async function Fc(e,n,r){if(n.source===`model`)return{success:!1,message:`Starting a loop with its built-in prompt needs a person to confirm it — ask the user to run /loop, or give your own prompt with /loop <prompt>.`};let{ui:i}=n;if(!i)return{success:!1,message:`A loop with the default maintenance prompt needs someone to confirm it. Start it from an interactive session, or give the loop its own prompt: /loop <prompt>`};let a=r.split(`
108
- `)[0].trim()||r,o=await i.ask((0,t.selectAction)(`loop-start-default`,`Start a loop that keeps working on its own for up to 7 days? It will: ${a}`,[{value:`start`,label:`Start`},{value:`cancel`,label:`Cancel`}],{description:Pc(e)}));if(!(o.type===`answer`&&o.values.includes(`start`)))return{success:!0,message:`Loop not started.`}}async function Ic(t,n,r,i={},a=Dc){let o=r.trim();return o===`list`?Lc(t,i):(0,e.isLoopStopVerb)(o)?Rc(t,n,o):i.disabled?{success:!1,message:`Session loops are disabled by the host.`}:zc(t,o,i,a)}function Lc(e,t){let n=J(e),r=Y(e);return{success:!0,message:(t.disabled?`Session loops are disabled by the host.
101
+ `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}function Ys(e){return{async ask(t,n){let r=t.options??[],i=await e([t.description,` ${t.title}`,...r.map((e,t)=>` ${t+1}. ${e.label}`),r.length>0?` Choose: `:` ${t.placeholder??``}: `].filter(e=>e!==void 0).join(`
102
+ `),t.masked,n);if(n?.signal?.aborted)return{type:`cancelled`};if(r.length===0)return{type:`answer`,values:[],text:i};let a=r[Number(i.trim()||`1`)-1]??r.find(e=>e.value===i.trim());return a===void 0?{type:`cancelled`}:{type:`answer`,values:[a.value]}}}}async function Xs(t,n,r,i,a){let o=await Js(r,i,a.some(e=>e.type===`openrouter`)),s=Qs(n),c=Object.keys((0,e.readMergedProviderSettings)(s.sources).providers??{}),l=$s(s.stores,n.settingsScope),u;u=o.preselectedType===void 0?Bo(await r(zo(a)),a):o.preselectedType;let d={providerDefinitions:a,env:n.env,connectionHost:n.connectionHost,orgPolicy:n.orgPolicy,settings:{readMergedSettings:()=>(0,e.readMergedProviderSettings)(s.sources),readTargetSettings:()=>l.read(),writeTargetSettings:e=>l.write(e)}};if(U(u,d)){let t=n.interaction===void 0?a.map(e=>({...e,connectionMethods:e.connectionMethods?.filter(e=>e!==`browser`)})):a;n.interaction===void 0&&i.writeLine(`Browser connection is unavailable here. API key setup remains available.`);let o=await as(n.interaction??Ys(r),H(u,t,{existingProfileNames:c}),{...d,providerDefinitions:t},!1);if(!o.success)throw new e.ProviderConfigError(o.message);if(o.hostActions===void 0)return}else(0,e.applyProviderConfiguration)(l,await Uo(u,r,a,{existingProfileNames:c}),{providerDefinitions:a,env:n.env});let f=await r(` Response language (ko/en/ja/zh, default: en): `);if(f){let e=l.read();e.language=f,l.write(e)}i.writeLine(`\n Config saved to ${l.displayName}\n`)}async function Zs(t,n,r,i,a,o){let s=Qs(n),c=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?c:{...c,currentProvider:n.provider},a,n.env??o.env)===`valid`||n.provider===void 0&&(0,e.resolveEnvDefaultProvider)(a,o.env)!==void 0)return;if(!(o.isInteractive??(()=>!1))())throw new e.ProviderConfigError(o.formatError(a));await Xs(t,ec({...n,env:n.env??o.env},s.stores),r,i,a);let l=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?l:{...l,currentProvider:n.provider},a,n.env??o.env)!==`valid`)throw new e.ProviderConfigError(o.formatError(a))}function Qs(e){if(e.settingsSources===void 0||e.settingsStores===void 0)throw Error(`Provider startup requires host settings sources and stores.`);return{sources:e.settingsSources,stores:e.settingsStores}}function $s(t,n){if(n===void 0)return(0,e.resolveProviderSettingsWriteTarget)(t);let r=n===`user`?`user`:`project-local`,i=t.findLast(e=>e.scope===r);if(i!==void 0)return i;throw new e.WorkspaceAuthorityRequiredError(`No authorized ${r} settings store is available.`)}function ec(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:tc(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function tc(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&typeof n.read().currentProvider==`string`)return n}}const nc="only the operator at this terminal can do this; a connected surface cannot pair, enroll or revoke devices. Run `/remote-control` on the host terminal.";function rc(e,t){if(!e)return{message:`Remote control is not available in this environment.`,success:!0};switch(e.state){case`off`:return{message:"Remote control is off. Use `/remote-control` to enable it.",success:!0};case`no-relay`:return{message:"Remote control is unavailable: no signaling relay is configured (set `transports.webrtc.options.relayUrl`).",success:!0};case`awaiting-pairing`:return{message:t?`Remote control is waiting for a device to pair.\nOpen: ${e.pairingUrl}`:`Remote control is waiting for a device to pair. The pairing link is shown only on the host terminal.`,success:!0};case`paired`:return{message:`Remote control is active — a device is paired.`,success:!0};default:return{message:`Remote control status is unknown.`,success:!0}}}function ic(e,t){let n=e.getCommandInvocationSource()===`user`,r=t.trim(),i=r.indexOf(` `),a=(i===-1?r:r.slice(0,i)).toLowerCase(),o=i===-1?``:r.slice(i+1).trim();if(a===`status`){let t=e.getCommandHostAdapters?.().remoteControl,r=rc(t?.getStatus(),n);if(!t?.describeKeyStorage)return r;let i=t.describeKeyStorage()??`chosen when remote control is first enabled`;return{...r,message:`${r.message}\nHost key storage: ${i}`}}if(a===`devices`){let t=(e.getCommandHostAdapters?.().remoteControl)?.listDevices?.();return t?t.length===0?{message:`No trusted devices are enrolled yet.`,success:!0}:{message:`Trusted devices:\n${t.map(e=>` ${e.deviceId} ${e.label} (last seen ${e.lastSeenAt})`).join(`
103
+ `)}`,success:!0}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}if(a===`revoke`){if(!n)return{message:`\`/remote-control revoke\`: ${nc}`,success:!1};if(!o)return{message:`Usage: /remote-control revoke <deviceId>`,success:!1};let t=e.getCommandHostAdapters?.().remoteControl;return t?.revokeDevice?t.revokeDevice(o)?{message:`Revoked trusted device ${o}. It must re-pair to reconnect.`,success:!0}:{message:`No trusted device with id ${o}.`,success:!1}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}return a===`stop`||a===`off`?{message:`Stopping remote control...`,success:!0,hostActions:[{type:`remote-control-stop`}]}:a===``||a===`enable`||a===`on`?n?{message:`Enabling remote control...`,success:!0,hostActions:[{type:`remote-control-enable`}]}:{message:`\`/remote-control enable\`: ${nc}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function ac(){return{name:`remote-control`,displayName:`Remote control`,description:`Enable P2P remote control (pair a device to co-drive this session), or check status. Pairing and revoking run only for the operator at the host terminal; a connected surface can stop remote control and read its status, without the pairing link.`,source:`remote-control`,modelInvocable:!1,userInvocable:!0,argumentHint:`[enable|stop|status|devices|revoke <device-id>]`,subcommands:[{name:`status`,description:`Show remote-control status`,source:`remote-control`},{name:`devices`,description:`List trusted devices`,source:`remote-control`},{name:`enable`,description:`Enable remote control and pair a device`,source:`remote-control`},{name:`stop`,description:`Stop remote control`,source:`remote-control`},{name:`revoke`,description:`Revoke a trusted device`,source:`remote-control`,argumentHint:`<device-id>`}]}}function oc(){return k(ac(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>ic(e,t)})}var sc=class{name=`remote-control`;getCommands(){return[ac()]}};function cc(){return{name:`agent-command-remote-control`,commandSources:[new sc],systemCommands:[oc()]}}function lc(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function uc(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function dc(){let e=uc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:lc}}var fc=class{name=`reset`;getCommands(){return[uc()]}};function pc(){return{name:`agent-command-reset`,commandSources:[new fc],systemCommands:[dc()]}}function W(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function mc(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function hc(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${mc(e.prompt)}`):[`(no edit checkpoints)`]].join(`
104
+ `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function gc(e){return e.length>0?e.join(`, `):`(none)`}function _c(e){let t=e.capturedFiles.length>0?e.capturedFiles.map(e=>{let t=e.snapshotSizeBytes===void 0?``:` size=${e.snapshotSizeBytes}B`;return`- ${e.relativePath} action=${e.restoreAction} snapshot=${String(e.snapshotAvailable)}${t}`}):[`(no files captured)`];return{message:[`Checkpoint ${e.target.id}`,`Prompt: ${mc(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${gc(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${gc(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
105
+ `),success:!0,data:{inspection:e}}}function vc(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
106
+ `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function yc(e){return{message:[`Rolled back code through ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Removed checkpoints: ${e.removedCheckpointCount}`].join(`
107
+ `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function bc(e,t){return e.reason===`restricted-workspace`?t===void 0?`Edit checkpoints need a trusted workspace. Trust it from a terminal, then restart the session.`:`Edit checkpoints need a trusted workspace: run ${t} trust --yes, then restart ${t}.`:e.message}function G(t,n){return{message:t instanceof e.EditCheckpointsUnavailableError?bc(t,n):t instanceof Error?t.message:String(t),success:!1}}function xc(t){try{return hc((0,e.listCommandEditCheckpoints)(t))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}function Sc(t,n){if(!n)return W();try{return _c((0,e.inspectCommandEditCheckpoint)(t,n))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function Cc(t,n){if(!n)return W();try{return vc(await(0,e.restoreCommandEditCheckpoint)(t,n))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function wc(t,n){if(!n)return W();try{return yc(await(0,e.rollbackCommandEditCheckpoint)(t,n))}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function Tc(t,n){if(!n)return W();try{let r=await(0,e.forkCommandEditCheckpoint)(t,n);return{message:[`Forked a new branch from ${r.target.id} (the previous future is preserved).`,`Restored files: ${r.restoredFileCount}`].join(`
108
+ `),success:!0,data:{target:r.target,restoredFileCount:r.restoredFileCount}}}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}function Ec(t,n){if(!n)return W();try{return(0,e.switchCommandEditCheckpointBranch)(t,n),{message:`Switched to checkpoint branch ${n}.`,success:!0}}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}function Dc(t){try{let n=(0,e.listCommandEditCheckpointBranches)(t);return{message:n.length===0?`No checkpoint branches yet.`:`Branch tips:\n${n.map(e=>`- ${e}`).join(`
109
+ `)}`,success:!0,data:{branches:n}}}catch(e){return G(e instanceof Error?e:String(e),t.getCommandProductVocabulary?.()?.cliName)}}async function Oc(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?xc(e):r===`inspect`?Sc(e,n[1]):r===`restore`||r===`code`?Cc(e,n[1]):r===`rollback`?wc(e,n[1]):r===`fork`?Tc(e,n[1]):r===`switch`?Ec(e,n[1]):r===`branches`?Dc(e):W()}function kc(){return{name:`rewind`,displayName:`Rewind History`,description:e.REWIND_COMMAND_DESCRIPTION,source:`rewind`,argumentHint:e.REWIND_COMMAND_ARGUMENT_HINT,modelInvocable:!1,safety:`write`,subcommands:(0,e.buildRewindCommandSubcommands)()}}function Ac(){let e=kc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,argumentHint:e.argumentHint,userInvocable:!0,modelInvocable:!1,safety:`write`,subcommands:e.subcommands,execute:Oc}}var jc=class{name=`rewind`;getCommands(){return[kc()]}};function Mc(){return{name:`agent-command-rewind`,commandSources:[new jc],systemCommands:[Ac()]}}function Nc(e,t){let n=Math.floor(Math.min(1800,t.milliseconds/2e3)),r=(0,l.createHash)(`sha256`).update(e).digest().readUInt32BE(0)%(n+1);if(r===0)return{cronExpression:t.cronExpression,jitterSeconds:r};let i=/^(\d+)(s|m|h)$/.exec(t.description);if(!i)throw Error(`Unsupported fixed-loop cadence for jitter.`);let a=Number(i[1]),o=i[2],s=r%60,c=Math.floor(r/60);return o===`s`?{cronExpression:a===60?`${r} * * * * *`:`${r}-59/${a} * * * * *`,jitterSeconds:r}:o===`m`?{cronExpression:a===60?`${s} ${c} * * * *`:`${s} ${c}-59/${a} * * * *`,jitterSeconds:r}:{cronExpression:a===24?`${s} ${c} 0 * * *`:`${s} ${c} */${a} * * *`,jitterSeconds:r}}const Pc=4096,K=new WeakMap,Fc=new Set([`second`,`seconds`,`minute`,`minutes`,`hour`,`hours`,`day`,`days`,`s`,`m`,`h`,`d`]),Ic=`Usage: /loop [<prompt>] | /loop <N><s|m|h|d> [<prompt>] | /loop <prompt> every <N> <unit> | /loop list | /loop stop <id>. Bare and interval-only forms require a host maintenance prompt.`,Lc={ui:void 0,source:`user`},q={s:1e3,m:6e4,h:36e5,d:864e5},Rc=[...zc(60).map(e=>({cronExpression:e===60?`0 * * * * *`:`*/${e} * * * * *`,milliseconds:e*q.s,description:`${e}s`})),...zc(60).filter(e=>e>1).map(e=>({cronExpression:e===60?`0 0 * * * *`:`0 */${e} * * * *`,milliseconds:e*q.m,description:`${e}m`})),...zc(24).filter(e=>e>1).map(e=>({cronExpression:e===24?`0 0 0 * * *`:`0 0 */${e} * * *`,milliseconds:e*q.h,description:`${e}h`}))];function zc(e){return Array.from({length:e},(e,t)=>t+1).filter(t=>e%t===0)}function Bc(e,t){let n=Number(e),r=q[t];if(!Number.isSafeInteger(n)||n<=0||r===void 0)return;let i=n*r;return Number.isSafeInteger(i)&&i<=q.d?i:void 0}function Vc(e){let t=e.length;for(;t>0&&/[a-z]/i.test(e[t-1]);)--t;let n=e.slice(t).toLowerCase();if(!Fc.has(n))return;for(;t>0&&/\s/u.test(e[t-1]);)--t;let r=t;for(;t>0&&e.charCodeAt(t-1)>=48&&e.charCodeAt(t-1)<=57;)--t;if(t===r)return;let i=e.slice(t,r),a=t;for(;t>0&&/\s/u.test(e[t-1]);)--t;if(t===a||e.slice(t-5,t).toLowerCase()!==`every`)return;t-=5;let o=t;for(;t>0&&/\s/u.test(e[t-1]);)--t;if(t===o)return;let s=e.slice(0,t).trim();return s?{instruction:s,amount:i,unit:n}:void 0}function Hc(e,t){let n=t&&t.length<=Pc?t.trim():void 0;if(e===``)return;let r=/^(\d+)(s|m|h|d)$/i.exec(e);if(r&&n){let e=Bc(r[1],r[2].toLowerCase());return e===void 0?void 0:{instruction:n,requestedMs:e}}let i=/^(\d+)(s|m|h|d)\s([\s\S]+)$/i.exec(e);if(i){let e=i[3].trim(),t=Bc(i[1],i[2].toLowerCase());return e&&t!==void 0&&!Vc(e)?{instruction:e,requestedMs:t}:void 0}let a=Vc(e);if(!a)return;let o=Bc(a.amount,a.unit[0]);return o===void 0?void 0:{instruction:a.instruction,requestedMs:o}}function Uc(e){return Rc.find(t=>t.milliseconds>=e)}function J(e){return e.listSchedules().filter(e=>e.metadata?.sessionLoop===!0&&e.metadata?.sessionLoopSelfPaced!==!0&&e.status!==`cancelled`&&e.status!==`completed`&&e.status!==`failed`)}function Y(e){return(e.listSelfPacedLoops?.()??[]).filter(e=>e.phase!==`stopped`&&e.phase!==`expired`)}function X(e){let t=e.metadata?.sessionLoopId;return typeof t==`string`&&t.length>0?t:e.id}function Wc(e){let t=J(e),n=Y(e);return t.length+n.length===0?`No other active loops.`:[...t.map(e=>`- ${X(e)} [${e.status}] ${e.label}`),...n.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`)].join(`
110
+ `)}async function Gc(e,n,r){if(n.source===`model`)return{success:!1,message:`Starting a loop with its built-in prompt needs a person to confirm it — ask the user to run /loop, or give your own prompt with /loop <prompt>.`};let{ui:i}=n;if(!i)return{success:!1,message:`A loop with the default maintenance prompt needs someone to confirm it. Start it from an interactive session, or give the loop its own prompt: /loop <prompt>`};let a=r.split(`
111
+ `)[0].trim()||r,o=await i.ask((0,t.selectAction)(`loop-start-default`,`Start a loop that keeps working on its own for up to 7 days? It will: ${a}`,[{value:`start`,label:`Start`},{value:`cancel`,label:`Cancel`}],{description:Wc(e)}));if(!(o.type===`answer`&&o.values.includes(`start`)))return{success:!0,message:`Loop not started.`}}async function Kc(t,n,r,i={},a=Lc){let o=r.trim();return o===`list`?qc(t,i):(0,e.isLoopStopVerb)(o)?Jc(t,n,o):i.disabled?{success:!1,message:`Session loops are disabled by the host.`}:Yc(t,o,i,a)}function qc(e,t){let n=J(e),r=Y(e);return{success:!0,message:(t.disabled?`Session loops are disabled by the host.
109
112
  `:``)+(n.length+r.length===0?`No active loops.`:[...n.map(e=>`- ${X(e)} [${e.status}] ${e.label}`),...r.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`+(e.phase===`waiting`&&e.delaySeconds!==void 0&&e.reason?` — next ${e.delaySeconds}s: ${e.reason}`:``))].join(`
110
- `)),data:{count:n.length+r.length}}}async function Rc(e,t,n){let r=/^stop\s+(\S+)$/.exec(n);if(!r)return{success:!1,message:Ec};let i=Y(e).find(e=>e.loopId===r[1]);if(i)return e.stopSelfPacedLoop?(await e.stopSelfPacedLoop(i.loopId,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${i.loopId}. An already-running turn may finish.`,data:{loopId:i.loopId}}):{success:!1,message:`This host cannot stop self-paced loops.`};let a=J(e).find(e=>X(e)===r[1]);return a?(await t(a.id,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${X(a)}. An already-running turn may finish.`,data:{loopId:X(a),taskId:a.id}}):{success:!1,message:`Active loop not found: ${r[1]}`}}async function zc(e,t,n,r=Dc){let i=t===``||/^\d+(s|m|h|d)$/i.test(t),a=n.defaultPrompt;if(i&&n.resolveDefaultPrompt)try{a=n.resolveDefaultPrompt()}catch(e){return{success:!1,message:`Default loop prompt could not be loaded: ${e instanceof Error?e.message:String(e)}`}}let o=Mc(t,a);if(!o){if(/^\d+[a-z](?:\s|$)/i.test(t)||jc(t))return{success:!1,message:Ec};let n=(t||a||``).trim();if(!n||t===``&&n.length>wc)return{success:!1,message:Ec};if(!e.createSelfPacedLoop)return{success:!1,message:`Self-paced loops require a persistent interactive session.`};if(i){let t=await Fc(e,r,n);if(t)return t}let o=K.get(e)??0;if(J(e).length+Y(e).length+o>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};K.set(e,o+1);try{let t=i?await e.createSelfPacedLoop(n,{useDefaultPrompt:!0}):await e.createSelfPacedLoop(n);return{success:!0,message:`Self-paced loop ${t.loopId} started. It will choose a 1–60 minute delay after each iteration and expires ${t.expiresAt}. Stop with /loop stop ${t.loopId}.`,data:{loopId:t.loopId,expiresAt:t.expiresAt}}}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}}if(i){let t=await Fc(e,r,o.instruction);if(t)return t}let s=K.get(e)??0;if(J(e).length+Y(e).length+s>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};let c=Nc(o.requestedMs),u=`Loop: ${o.instruction.slice(0,48)}`,d=`loop_${(0,l.randomUUID)()}`,f=Cc(d,c),p=Date.now(),m=new Date(p+o.requestedMs).toISOString(),h=new Date(p+6048e5).toISOString();K.set(e,s+1);let g;try{g=await e.spawnScheduledWake({label:u,cronExpression:f.cronExpression,agentInstruction:o.instruction,sessionLoop:!0,sessionLoopId:d,...i?{sessionLoopDefaultPrompt:!0}:{},sessionLoopFirstAllowedAt:m,sessionLoopExpiresAt:h})}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}let _=c.milliseconds===o.requestedMs?``:` (rounded up)`,v=g.kind===`scheduled`&&g.nextFireAt&&g.nextFireAt>=m?` Next fire: ${g.nextFireAt}.`:``;return{success:!0,message:`Loop ${d} uses a ${c.description}${_} local-clock step with stable offset +${f.jitterSeconds}s; elapsed gaps can change with daylight saving. First eligible at or after ${m}.${v} Expires: ${h}. Stop with /loop stop ${d}.`,data:{loopId:d,taskId:g.id,requestedMs:o.requestedMs,cadenceLabel:c.description,cronExpression:f.cronExpression,jitterSeconds:f.jitterSeconds,firstAllowedAt:m,expiresAt:h}}}const Bc={s:1e3,m:6e4,h:36e5,d:864e5},Z=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function Vc(e,t){let n=e.trim();if(n.length===0)return{ok:!1,error:Z};if(n.startsWith(`in `)){let e=n.slice(3).trim(),r=e.indexOf(` `);if(r===-1)return{ok:!1,error:`Missing instruction. ${Z}`};let i=e.slice(0,r),a=e.slice(r+1).trim(),o=/^(\d+)(s|m|h|d)$/.exec(i);if(!o)return{ok:!1,error:`Invalid duration "${i}". ${Z}`};if(a.length===0)return{ok:!1,error:`Missing instruction. ${Z}`};let s=parseInt(o[1],10)*Bc[o[2]];return{ok:!0,spec:{cronExpression:new Date(t+s).toISOString(),instruction:a,recurring:!1}}}if(n.startsWith(`cron `)){let e=n.slice(5).trim(),t=/^["']([^"']+)["']\s+(\S.*)$/.exec(e);if(!t)return{ok:!1,error:`cron form needs a quoted expression. ${Z}`};let r=t[2].trim();return r.length===0?{ok:!1,error:`Missing instruction. ${Z}`}:{ok:!0,spec:{cronExpression:t[1].trim(),instruction:r,recurring:!0}}}return{ok:!1,error:Z}}function Hc(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}const Uc=`Usage: /schedule list | pause <id> | resume <id> | edit <id> <spec> (or a create spec: in <N><s|m|h|d> … | cron "<expr>" …)`;function Wc(e){return e.length===0?`No schedules.`:e.map(e=>{let t=e.kind===`scheduled`?e.schedule?.cronExpression??`(unknown)`:`(unknown)`,n=e.kind===`scheduled`&&e.nextFireAt?`next ${e.nextFireAt}`:`—`;return`- ${e.id} [${e.status}] ${t} — ${e.label} (${n})`}).join(`
111
- `)}async function Gc(e,t,n,r){if(t===`list`){let t=e.listSchedules();return{message:Wc(t),success:!0,data:{count:t.length}}}if(t===`pause`||t===`resume`){let r=n.split(/\s+/)[0];return r?t===`pause`?(await e.pauseSchedule(r),{message:`Schedule paused: ${r}`,success:!0,data:{taskId:r}}):(await e.resumeSchedule(r),{message:`Schedule resumed: ${r}`,success:!0,data:{taskId:r}}):{message:Uc,success:!1}}if(t===`edit`){let t=n.indexOf(` `),i=t===-1?n:n.slice(0,t),a=t===-1?``:n.slice(t+1).trim();if(!i||!a)return{message:Uc,success:!1};let o=Vc(a,r);return o.ok?(await e.editSchedule(i,{cronExpression:o.spec.cronExpression,agentInstruction:o.spec.instruction,label:Hc(`Scheduled`,o.spec.instruction)}),{message:`Schedule updated: ${i} (cron \`${o.spec.cronExpression}\`).`,success:!0,data:{taskId:i,cronExpression:o.spec.cronExpression}}):{message:o.error,success:!1}}}async function Kc(e,t,n=Date.now()){let r=t.trim(),i=r.indexOf(` `),a=await Gc(e,(i===-1?r:r.slice(0,i)).toLowerCase(),i===-1?``:r.slice(i+1).trim(),n);if(a)return a;let o=Vc(t,n);if(!o.ok)return{message:`${o.error}\n${Uc}`,success:!1};let{cronExpression:s,instruction:c,recurring:l}=o.spec,u=await e.spawnScheduledWake({label:Hc(`Scheduled`,c),cronExpression:s,agentInstruction:c});return{message:`Scheduled wake (${l?`cron \`${s}\``:`once at ${s}`}): "${c}" — task ${u.id}.`,success:!0,data:{taskId:u.id,cronExpression:s,recurring:l}}}function qc(e){let t=/^["']([^"']+)["']\s+["']([^"']+)["']\s+(\S.*)$/.exec(e.trim());if(!t)return null;let n=t[3].trim();return n.length===0?null:{command:t[1],matchPattern:t[2],instruction:n}}async function Jc(t,n){let r=qc(n);if(!r)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let i;try{i=await t.spawnMonitorWake({label:Hc(`Monitor`,r.instruction),command:r.command,matchPattern:r.matchPattern,agentInstruction:r.instruction})}catch(t){if(t instanceof e.MonitorCommandRefusedError)return{message:t.message,success:!1};throw t}return{message:`Monitoring \`${r.command}\` for /${r.matchPattern}/ — task ${i.id}.`,success:!0,data:{taskId:i.id,matchPattern:r.matchPattern}}}function Yc(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function Xc(){return{name:`schedule`,displayName:`Schedule Wake`,description:`Schedule the agent to wake on a timer, and manage schedules (list / pause / resume / edit).`,modelDescription:'Wake yourself later with an instruction. Use it when work must wait (a deploy, a long build, a reply) instead of polling: `in <N><s|m|h|d> <instruction>` or `cron "<expr>" <instruction>`; `list`, `pause`, `resume` and `edit` manage existing schedules. Returns the schedule id, or the schedule list.',source:`schedule`,argumentHint:`in <N><s|m|h|d> <instruction> | cron "<expr>" <instruction> | list | pause <id> | resume <id> | edit <id> <spec>`,modelInvocable:!0}}function Zc(){return{name:`monitor`,displayName:`Monitor Process`,description:`Watch a process’s output and wake the agent when a line matches a pattern.`,modelDescription:`Run a command in the background and wake yourself when a line of its output matches a pattern. Use it to wait for a server to start, a test to fail or a log line to appear instead of polling. The command is allowed, refused or asked about by the same permission rules as a shell tool call. Returns the monitor task id, or a refusal naming what the user must allow.`,source:`schedule`,argumentHint:`"<command>" "<pattern>" <instruction>`,modelInvocable:!0}}function Qc(){return{name:`loop`,displayName:`Repeat Prompt`,description:`Repeat a prompt on a fixed cadence or let each iteration choose its next delay; list or stop active loops.`,modelDescription:"Repeat a prompt on a fixed cadence (`<N><s|m|h|d> <prompt>`) or self-paced (`<prompt>`: each iteration chooses its next delay or stops). Use it when the user asks for recurring work in this session, and always give your own prompt: any form that would fall back to the host's default maintenance prompt — bare `/loop` or an interval alone (`<N><s|m|h|d>`) — needs a person to confirm it and is always refused for you, whether or not one is attached. `list` shows active loops; `stop <id>` ends one, even mid-turn. Returns the loop id and its next fire time, the loop list, or a refusal naming the command to suggest.",source:`schedule`,argumentHint:`[prompt] | <N><s|m|h|d> [prompt] | <prompt> every <N> <unit> | list | stop <id>`,modelInvocable:!0,subcommands:[{name:`list`,description:`List active loops`,source:`schedule`},{name:`stop`,description:`Stop an active loop`,source:`schedule`,argumentHint:`<id>`}]}}function $c(){let e=Xc();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>Kc(Yc(e),t)}}function el(){let e=Zc();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!0,modelRequiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>Jc(Yc(e),t)}}function tl(e){let t=Qc();return{name:t.name,displayName:t.displayName,description:t.description,...t.modelDescription===void 0?{}:{modelDescription:t.modelDescription},requiresPermission:!0,userInvocable:!0,modelInvocable:!0,argumentHint:t.argumentHint,subcommands:t.subcommands,lifecycle:`inline`,execute:(t,n)=>Ic(Yc(t),(e,n)=>t.cancelBackgroundTask(e,n),n,e,{ui:t.getUserInteraction(),source:t.getCommandInvocationSource()})}}var nl=class{name=`schedule`;getCommands(){return[Xc(),Zc(),Qc()]}};function rl(e={}){return{name:`agent-command-schedule`,commandSources:[new nl],systemCommands:[$c(),el(),tl(e)],sessionRequirements:[`runtime`]}}function il(e,n,r){return(0,t.calculateModelCost)(e,n,r)}function Q(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function al(e){return e.toLocaleString(`en-US`)}const ol=`Conversation cleared.`;function sl(e,t){let n=t.trim();return n===``?{success:!1,message:`Usage: /cd <directory>`}:{success:!0,message:``,hostActions:[{type:`workspace-move`,path:n}]}}async function cl(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:((0,e.clearConversationHistory)(n),{success:!0,message:ol})}function ll(t,n){let r=(0,e.parseSessionNameArgument)(n);return r===void 0?{success:!1,message:e.RENAME_COMMAND_USAGE}:{success:!0,message:`Session renamed to "${r}".`,data:{name:r},hostActions:[(0,e.createSessionRenameHostAction)(r)]}}function ul(){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},uiIntents:[(0,e.createShowSessionPickerIntent)()]}}function dl(e){return e.getCommandHostAdapters?.().costBudget}const fl=`Budget persistence is not available on this host (no cost-budget adapter was composed).`;function pl(e){return`Could not write the budget: ${e instanceof Error?e.message:String(e)}`}function ml(e,t){if(e.length===0)return;let n={inputTokens:0,outputTokens:0,partial:!1,models:[]},r=new Set,i=0,a=!1;for(let o of e){n.inputTokens+=o.promptTokens,n.outputTokens+=o.completionTokens;let e=o.source?.scope===`tool`,s=o.costUsd??(!e&&t?il(t,o.promptTokens,o.completionTokens):void 0);if(s===void 0){n.partial=!0;continue}i+=s,a=!0,r.add(e?o.source?.label??`another model`:t??`main model`)}return a&&(n.costUsd=i),n.models=[...r],n}function hl(t){let n=t.getSession(),r=(0,e.readCommandSessionInfo)(t),i=n.getModelId(),a=ml(t.getSessionUsage(),i),o=[`Session: ${r.sessionId}`,`Messages: ${r.messageCount}`],s={sessionId:r.sessionId,messageCount:r.messageCount};if(a){o.push(`Tokens: ${al(a.inputTokens)} input / ${al(a.outputTokens)} output`),s.inputTokens=a.inputTokens,s.outputTokens=a.outputTokens;let e=a.costUsd;if(e!==void 0){let n=a.models.length>1?`mixed: ${a.models.join(`, `)}`:a.models[0]??``,r=a.partial?`; some usage could not be priced`:``;o.push(`Cost: ${Q(e)} (${n}${r})`),s.estimatedCostUsd=e,s.costModels=a.models,a.partial&&(s.costPartial=!0);let i=dl(t)?.read();if(i?.monthly){let t=i.monthly-e,n=Math.min(100,Math.round(e/i.monthly*100));o.push(`Budget: ${Q(t)} remaining of ${Q(i.monthly)}/mo (${n}% used)`),s.budgetMonthly=i.monthly,s.budgetRemainingUsd=t}}}else o.push(`Tokens: not yet available (no turns completed)`);return{lines:o,data:s}}function gl(e,t){let n=t.trim();if(n.startsWith(`budget`)){let t=n.slice(6).trim(),r=t===`clear`||t===``?void 0:parseFloat(t);if(r!==void 0&&(!Number.isFinite(r)||r<=0))return{success:!1,message:`Usage: /cost budget <amount> (e.g. /cost budget 5.00)`};let i=dl(e);if(i===void 0)return{success:!1,message:fl};if(t===`clear`){try{i.clear()}catch(e){return{success:!1,message:pl(e)}}return{success:!0,message:`Monthly budget cleared.`}}if(t===``){let e=i.read();return e?.monthly?{success:!0,message:`Monthly budget: ${Q(e.monthly)}`}:{success:!0,message:`No budget set. Use: /cost budget <amount>`}}if(r===void 0)return{success:!1,message:fl};try{i.write({monthly:r})}catch(e){return{success:!1,message:pl(e)}}return{success:!0,message:`Monthly budget set to ${Q(r)}.`}}let{lines:r,data:i}=hl(e);return{success:!0,message:r.join(`
112
- `),data:i}}function _l(t,n){let r=(0,e.validateCommandSessionReplayLog)(t);return{success:r.validation.ok,message:(0,e.formatCommandSessionReplayValidationReport)(r),data:{logFile:r.logFile,entryCount:r.entryCount,issueCount:r.validation.issues.length,ok:r.validation.ok}}}function vl(){return{name:`clear`,displayName:`Clear History`,description:e.CLEAR_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function yl(){return{name:`rename`,displayName:`Rename Session`,description:e.RENAME_COMMAND_DESCRIPTION,argumentHint:`<name>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function bl(){return{name:`cd`,displayName:`Change Directory`,description:`Move this session to another working directory`,argumentHint:`<directory>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function xl(){return{name:`resume`,displayName:`Resume Session`,description:e.RESUME_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function Sl(){return{name:`cost`,displayName:`Session Cost`,description:e.COST_COMMAND_DESCRIPTION,modelDescription:"Report this session’s token usage and estimated cost. Use it before an expensive step (a large refactor, many subagents) or when the user asks what the session has cost. Returns the message count, input/output token totals and the estimated USD cost, with the remaining monthly budget when one is set. Setting or clearing the budget is the user’s decision: suggest `/cost budget <amount>`.",argumentHint:`[budget [<amount>|clear]]`,runsBare:!0,source:`session`,modelInvocable:!0,userInvocable:!0,subcommands:[{name:`budget`,description:`Show, set, or clear the monthly budget`,argumentHint:`[<amount>|clear]`,source:`session`,modelInvocable:!1}]}}function Cl(){return{name:`validate-session`,displayName:`Validate Session`,description:e.VALIDATE_SESSION_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function wl(){return D(vl(),{requiresPermission:!1,lifecycle:`inline`,execute:cl})}function Tl(){return D(yl(),{requiresPermission:!1,lifecycle:`inline`,execute:ll})}function El(){return D(bl(),{requiresPermission:!1,lifecycle:`inline`,execute:sl})}function Dl(){return D(xl(),{requiresPermission:!1,lifecycle:`inline`,execute:ul})}function Ol(){return D(Sl(),{requiresPermission:!1,lifecycle:`inline`,execute:gl})}function kl(){return D(Cl(),{requiresPermission:!1,lifecycle:`inline`,execute:_l})}var Al=class{name=`session`;getCommands(){return[vl(),yl(),bl(),xl(),Sl(),Cl()]}};function jl(){return{name:`agent-command-session`,commandSources:[new Al],systemCommands:[wl(),Tl(),El(),Dl(),Ol(),kl()]}}function Ml(){return{name:`settings`,displayName:`Settings`,description:`Open settings — language, output style, preset, permissions and more`,source:`settings`,modelInvocable:!1}}function Nl(){let e=Ml();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:async()=>({success:!0,message:`Opening settings...`,uiIntents:[{type:`show-settings`}]})}}var Pl=class{name=`settings`;getCommands(){return[Ml()]}};function Fl(){return{name:`agent-command-settings`,commandSources:[new Pl],systemCommands:[Nl()]}}function Il(e){let n=(0,t.resolvePlatformShell)({executable:e});return{command:n.command,interactiveArgs:n.interactiveArgs,commandArgs:e=>n.commandArgs(e)}}const Ll="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function Rl(e,t,n){if(!e.canHandoffTerminal())return{message:`An interactive shell is unavailable here (no interactive terminal).`,success:!1};let r=Il(n),i=e.getCwd(),a=t.trim(),o=await e.runWithTerminal(async()=>a.length>0?A(r.command,r.commandArgs(a),i):A(r.command,r.interactiveArgs,i));return{message:a.length>0?`Command exited (code ${o}).`:`Shell session ended (code ${o}).`,success:o===0,data:{exitCode:o}}}function zl(){return{name:`shell`,displayName:`Shell`,description:Ll,source:`shell`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function Bl(e){let t=zl();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:(t,n)=>Rl(t,n,e)}}var Vl=class{name=`shell`;getCommands(){return[zl()]}};function Hl(e){return{name:`agent-command-shell`,commandSources:[new Vl],systemCommands:[Bl(e)]}}function Ul(){return{name:`skill-read`,description:`Read a supporting file from a skill active in this execution`,modelDescription:`Read verified supporting bytes from a skill already activated in this execution. Use when its instructions refer to a resource in the returned manifest. Args are a JSON array ["<skill-name>", "<resource-uri>"]. Returns the verified URI, digest, size and text or base64 blob with optional MIME type. This does not activate nested skills or grant consent; unactivated skills, undeclared resources and ended executions are refused. Binary blobs are returned as encoded data, not a rendered image.`,argumentHint:`["<skill-name>", "<resource-uri>"]`,source:`skills`,userInvocable:!0,modelInvocable:!0,safety:`read-only`}}async function Wl(e,t=``){let n;try{n=JSON.parse(t)}catch{return{success:!1,message:`Use /skill-read ["<skill-name>", "<resource-uri>"]`}}if(!Array.isArray(n)||n.length!==2||n.some(e=>typeof e!=`string`||!e.length))return{success:!1,message:`Use /skill-read ["<skill-name>", "<resource-uri>"]`};if(!e.readSkillResource)return{success:!1,message:`This host does not provide active skill resource reads.`};try{let t=await e.readSkillResource(n[0],n[1]);return{success:!0,message:`Read verified skill resource: ${t.uri}`,data:{...t}}}catch(e){return{success:!1,message:`Skill resource read refused: ${e instanceof Error?e.message:`host refused the read`}`}}}function Gl(){return{...Ul(),semanticRole:`skillResourceRead`,requiresPermission:!1,lifecycle:`inline`,execute:Wl}}const Kl=`List registered skills, or activate one by name`;function ql(e){let t=[];return e.modelInvocable||t.push(`model-disabled`),e.userInvocable||t.push(`model-only`),e.context&&t.push(`context:${e.context}`),e.agent&&t.push(`agent:${e.agent}`),t.length>0?` [${t.join(`, `)}]`:``}function Jl(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${ql(e)}`}function Yl(e){return e.length===0?[`No skills are registered for this session.`,``,`Skills are metadata until activated. Do not invent or imitate a skill workflow when no matching registered skill exists.`].join(`
113
- `):[`Registered skills:`,...e.map(Jl),``,`Activation contract:`,`- Use /skills <skill-name> [args] to activate a matching skill.`,`- Treat /<skill-name> as a virtual alias for /skills <skill-name>.`,`- The system prompt Skills section is skill selection metadata.`,`- Treat descriptions as selection metadata only, not as loaded SKILL.md content.`,`- Do not answer by merely naming, recommending, or imitating a matching skill.`,`- If no listed skill matches the task, continue without claiming a skill was activated.`].join(`
114
- `)}function Xl(e){let t=e.trim();if(t.length===0||t===`list`)return{action:`list`,skillArgs:``};let[n=``,...r]=t.split(/\s+/);return n.length===0?{action:`list`,skillArgs:``}:{action:`activate`,skillName:n,skillArgs:r.join(` `)}}async function Zl(e,t=``){let n=Xl(t);if(n.action===`activate`&&n.skillName!==void 0){let t=`/${n.skillName}${n.skillArgs?` ${n.skillArgs}`:``}`;return await e.executeSkillCommandByName(n.skillName,n.skillArgs,{invocationSource:e.getCommandInvocationSource(),displayInput:t,rawInput:t})??{success:!1,message:`Unknown skill: ${n.skillName}`}}let r=e.listSkills();return{success:!0,message:Yl(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function Ql(){return{name:`skills`,displayName:`Skills`,description:Kl,modelDescription:`Skill command. Before following a matching registered skill from the system prompt Skills section, invoke the projected skills command tool with args "<skill-name> [args]". Without arguments, list registered skills. With a skill name, activate that skill; a skill that declares it is not model-invocable is refused. Returns the skill list with each skill's description, or the activated skill's instructions to follow. Slash syntax is a UI input/display concern; the SDK command identity is "skills".`,source:`skills`,modelInvocable:!0,userInvocable:!0,argumentHint:`[list | <skill-name> [args]]`,safety:`read-only`}}function $l(){let e=Ql();return{name:e.name,semanticRole:`skillActivation`,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`inline`,execute:Zl}}var eu=class{name=`skills`;getCommands(){return[Ql(),Ul()]}};function tu(t){let n=[new eu];return n.push(new e.SkillCommandSource(t.contributionSources,t.skillRoots??[])),{name:`agent-command-skills`,commandSources:n,systemCommands:[$l(),Gl()]}}const nu=[`Usage: /statusline on | off | reset | git on | git off`,`Fields: model, context, permission mode, message count, session name, thinking state, git branch.`].join(`
115
- `);function ru(t){let n=t.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[r,i]=n;return r===`on`&&i===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:r===`off`&&i===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:r===`reset`&&i===void 0?{success:!0,message:`Status line settings reset.`,patch:{...e.DEFAULT_STATUS_LINE_COMMAND_SETTINGS}}:r===`git`&&i===`on`&&n.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:r===`git`&&i===`off`&&n.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:nu}}function iu(e,t){let n=ru(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function au(){return{name:`statusline`,displayName:`Status Line`,description:e.STATUSLINE_COMMAND_DESCRIPTION,source:`statusline`,argumentHint:e.STATUSLINE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildStatusLineCommandSubcommands)(`statusline`),modelInvocable:!1}}function ou(){let e=au();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:iu}}var su=class{name=`statusline`;getCommands(){return[au()]}};function cu(){return{name:`agent-command-statusline`,commandSources:[new su],systemCommands:[ou()]}}const lu=`list | <theme-id> | syntax on|off | motion on|off`;function $(e){return e?`on`:`off`}function uu(e){let{settings:t,reducedMotionPin:n}=e.getAppearance(),r=e.listThemes().map(e=>`${e.id===t.theme?`* `:` `}${e.id} — ${e.name} (${e.appearance}, ${e.source})`),i=n?`${$(n.reducedMotion)} for this run (pinned by ${n.tier}; saved ${$(t.reducedMotion)})`:$(t.reducedMotion);return[`Available themes:`,...r,``,`syntax highlighting: ${$(t.syntaxHighlighting)}`,`reduced motion: ${i}`].join(`
116
- `)}function du(e){return{success:!0,message:uu(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function fu(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function pu(e){if(e===`on`)return!0;if(e===`off`)return!1}function mu(e){let t={},n=0,r;for(e[0]!==`syntax`&&e[0]!==`motion`&&(r=e[0],n=1);n<e.length;){let r=e[n],i=pu(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${lu}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function hu(e,t,n){let r=[];t&&r.push(`theme ${t.name}`),e.syntaxHighlighting!==void 0&&r.push(`syntax highlighting ${$(e.syntaxHighlighting)}`),e.reducedMotion!==void 0&&r.push(`motion ${$(!e.reducedMotion)}`);let i=r.length>0?`Applied: ${r.join(`, `)}.`:`Nothing to change.`;return e.reducedMotion!==void 0&&n.reducedMotionPin?`${i} Saved, but this run keeps reduced motion pinned by ${n.reducedMotionPin.tier}.`:i}function gu(e,t){if(!e)return{success:!1,message:`Themes are available in an interactive terminal. Run /theme there.`};let n=t.trim().split(/\s+/u).filter(Boolean);if(n.length===0)return{success:!0,message:`Opening the theme picker...`,uiIntents:[{type:`show-theme-picker`}]};if(n.length===1&&n[0]===`list`)return du(e);let r=mu(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${lu}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return fu(r.themeId,e);i.theme=a.id}return{success:!0,message:hu(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function _u(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:lu,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var vu=class{name=`theme`;getCommands(){return[_u()]}};function yu(e){let t=_u(),n={name:t.name,displayName:t.displayName,description:t.description,argumentHint:t.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:(t,n)=>gu(e,n)};return{name:`agent-command-theme`,commandSources:[new vu],systemCommands:[n]}}const bu=`Inspect user-local storage and memory state.`,xu=`storage list [--format json] | memory set/list/inspect/disable/delete`,Su=`Usage: user-local storage list [--format json] | user-local memory set <category> <key> <value> --summary <summary> --source <source> | user-local memory list [--format json] | user-local memory inspect <category> <key> [--format json] | user-local memory disable <category> <key> | user-local memory delete <category> <key>`;function Cu(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
117
- `)}function wu(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function Tu(t,n,r){let i=await(0,e.listUserLocalMemoryItems)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):Cu(i.items),success:!0,data:{list:i}}}async function Eu(t,n,r){let[i,a,o]=r.positional,s=await(0,e.setUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:wu(i),key:a??``,value:o??``,summary:r.summary??``,source:r.source??``});return{message:`Stored user-local memory item ${s.category}/${s.key} at ${s.storageLocation}`,success:!0,data:{item:s}}}async function Du(t,n,r){let[i,a]=r.positional,o=await(0,e.inspectUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:wu(i),key:a??``});return{message:r.format===`json`?JSON.stringify(o,null,2):`${o.category}/${o.key}: ${o.summary}`,success:!0,data:{item:o}}}async function Ou(t,n,r){let[i,a]=r.positional,o=await(0,e.disableUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:wu(i),key:a??``});return{message:`Disabled user-local memory item ${o.category}/${o.key}`,success:!0,data:{item:o}}}async function ku(t,n,r){let[i,a]=r.positional,o=await(0,e.deleteUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:wu(i),key:a??``});return{message:`Deleted user-local memory item ${o.category}/${o.key}`,success:!0,data:{result:o}}}async function Au(e,t,n){return(n.action??`list`)===`list`?Tu(e,t,n):n.action===`set`?Eu(e,t,n):n.action===`inspect`?Du(e,t,n):n.action===`disable`?Ou(e,t,n):n.action===`delete`?ku(e,t,n):{message:Su,success:!1}}function ju(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Mu(e,t,n){return e===`--format`?{format:t[n+1],nextIndex:n+1}:e.startsWith(`--format=`)?{format:e.slice(9),nextIndex:n}:e===`--summary`?{summary:t[n+1],nextIndex:n+1}:e.startsWith(`--summary=`)?{summary:e.slice(10),nextIndex:n}:e===`--source`?{source:t[n+1],nextIndex:n+1}:e.startsWith(`--source=`)?{source:e.slice(9),nextIndex:n}:null}function Nu(e,t={}){let n=t.format,r=t.summary,i=t.source,a=[];for(let t=0;t<e.length;t+=1){let o=e[t],s=Mu(o,e,t);if(s!==null){n=s.format??n,r=s.summary??r,i=s.source??i,t=s.nextIndex;continue}a.push(o)}return{target:a[0],action:a[1],positional:a.slice(2),format:ju(n),summary:r,source:i}}function Pu(e){return e.trim().split(/\s+/).filter(Boolean)}function Fu(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
118
- `)}async function Iu(t,n,r){if((r.action??`list`)!==`list`)return{message:Su,success:!1};let i=await(0,e.inspectUserLocalStorage)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):Fu(i.root,i.categories),success:!0,data:{root:i.root,categories:i.categories,inspection:i}}}async function Lu(e,t,n){return n.target===`storage`?Iu(e,t,n):n.target===`memory`?Au(e,t,n):{message:Su,success:!1}}function Ru(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function zu(e){try{return await Lu(e.cwd,e.storageRoot,Nu(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:Ru(e instanceof Error?e.message:String(e)),success:!1}}}async function Bu(e,t,n){try{return await Lu(e.getCwd(),n,Nu(Pu(t)))}catch(e){return{message:Ru(e instanceof Error?e.message:String(e)),success:!1}}}function Vu(){return{name:`user-local`,displayName:`User Config`,description:bu,source:`user-local`,argumentHint:xu,modelInvocable:!1,safety:`read-only`,subcommands:[{name:`storage`,description:`Inspect user-local storage categories`,source:`user-local`},{name:`memory`,description:`Inspect and manage user-local memory items`,source:`user-local`}]}}function Hu(e){let t=Vu();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,safety:t.safety,subcommands:t.subcommands,execute:(t,n)=>Bu(t,n,e)}}var Uu=class{name=`user-local`;getCommands(){return[Vu()]}};function Wu(e){return{name:`agent-command-user-local`,commandSources:[new Uu],systemCommands:[Hu(e)]}}function Gu(t,n,r){return(0,e.selectCommandModules)(t,n,r)}function Ku({cwd:t,userLocalStorageRoot:n,editorTemporaryDirectoryPrefix:r,contributionSources:i,skillRoots:a,providerDefinitions:o,providerSettingsAdapter:s,orgPolicy:c,keybindingsFilePort:l,themeCataloguePort:u,devicesPort:d,doctorInputs:f,doctorDisplay:p,formatForkResumeCommand:m,loopOptions:h,enabledCommandModules:g,disabledCommandModules:_,providerEnvironment:v}){let y=[tu({contributionSources:i??[],skillRoots:a}),Br(),_e(),Hn(),An(),$a(),Qi(),ya(),Lo(),Oa(),Xr(),Ce(),ir(m),Dr(),ao(),Hl(),Cn(r),br(),Wr(l),yu(u),...f===void 0?[]:[gn(f,void 0,p)],Ui(),Oi(),Wu(n),ke(),Ze(),qn(),jl(),rc(),Sc(),rl(h),cu(),To(),Fl(),Ya(),Ia(),Fr(),Qs(),...d===void 0?[]:[st(d)],Rs({providerDefinitions:o,settings:s,...c===void 0?{}:{orgPolicy:c},...v===void 0?{}:{env:v}}),ua({providerDefinitions:o,settings:s,...c===void 0?{}:{orgPolicy:c},...v===void 0?{}:{env:v}})],b=y.map(e=>e.name);return{modules:Gu(y,g,_),unknownModuleNames:(0,e.findUnknownModuleNames)(b,g,_)}}function qu(t){let{shellExecutable:n,editorTemporaryDirectoryPrefix:r,keybindingsFile:i,themeCatalogue:a,enabledCommandModules:o,disabledCommandModules:s}=t,c=[[Hl(n),(e,t)=>Rl(e,t,n)],[Cn(r),(e,t)=>yn(e,t,r)],[Wr(i),e=>Hr(i,e)],[yu(a),(e,t)=>gu(a,t)]],l=new Set((0,e.selectCommandModules)(c.map(([e])=>e),o,s));return c.filter(([e])=>l.has(e)).flatMap(([e,t])=>(e.systemCommands??[]).map(e=>({name:e.name,execute:t})))}exports.ADVISOR_SETTING_KEY=wn,exports.AdvisorCommandSource=kn,exports.AgentCommandSource=ge,exports.BackgroundCommandSource=Se,exports.CLEAR_COMMAND_MESSAGE=ol,exports.CompactCommandSource=Oe,exports.ContextCommandSource=Xe,exports.DoctorCommandSource=fn,exports.EDITOR_COMMAND_DESCRIPTION=vn,exports.EditorCommandSource=Sn,exports.EffortCommandSource=Vn,exports.ExitCommandSource=Kn,exports.GOAL_COMMAND_DESCRIPTION=xr,exports.GitCommandSource=yr,exports.GoalCommandSource=Er,exports.HandoffCommandSource=Pr,exports.HelpCommandSource=zr,exports.KeybindingsCommandSource=Ur,exports.LanguageCommandSource=Yr,exports.MCPActivationCommandSource=Di,exports.MemoryCommandSource=Hi,exports.ModeCommandSource=Zi,exports.ModelCommandSource=la,exports.OutputStyleCommandSource=Da,exports.PermissionsCommandSource=Qa,exports.PluginManagerCommandSource=wo,exports.PresetCommandSource=Io,exports.ProviderCommandSource=Is,exports.RemoteControlCommandSource=Zs,exports.RewindCommandSource=xc,exports.SANDBOX_MODES=R,exports.SHELL_COMMAND_DESCRIPTION=Ll,exports.SKILLS_COMMAND_DESCRIPTION=Kl,exports.STATUSLINE_USAGE=nu,exports.STORAGE_REPAIR_ID=Ut,exports.SandboxCommandSource=va,exports.ScheduleCommandSource=nl,exports.SessionCommandSource=Al,exports.SettingsCommandSource=Pl,exports.ShellCommandSource=Vl,exports.SkillsCommandSource=eu,exports.StatusLineCommandSource=su,exports.ThemeCommandSource=vu,exports.USER_LOCAL_COMMAND_ARGUMENT_HINT=xu,exports.USER_LOCAL_COMMAND_DESCRIPTION=bu,exports.USER_LOCAL_COMMAND_USAGE=Su,exports.UserLocalCommandSource=Uu,exports.applyDoctorRepair=Yt,exports.buildDoctorReport=cn,exports.collectSettingsSecrets=Tt,exports.createAdvisorCommandEntry=Dn,exports.createAdvisorCommandModule=An,exports.createAgentCommandEntry=me,exports.createAgentCommandModule=_e,exports.createAgentSystemCommand=he,exports.createBackgroundCommandEntry=be,exports.createBackgroundCommandModule=Ce,exports.createClearCommandEntry=vl,exports.createCompactCommandEntry=Ee,exports.createCompactCommandModule=ke,exports.createContextCommandEntry=Je,exports.createContextCommandModule=Ze,exports.createCostCommandEntry=Sl,exports.createDefaultCommandModules=Ku,exports.createDevicesCommandModule=st,exports.createDoctorCommandEntry=dn,exports.createDoctorCommandModule=gn,exports.createEditorCommandEntry=bn,exports.createEditorCommandModule=Cn,exports.createEffortCommandEntry=zn,exports.createEffortCommandModule=Hn,exports.createExitCommandEntry=Wn,exports.createExitCommandModule=qn,exports.createGitCommandEntry=gr,exports.createGitCommandModule=br,Object.defineProperty(exports,"createGitProcess",{enumerable:!0,get:function(){return e.createGitProcess}}),exports.createGoalCommandEntry=wr,exports.createGoalCommandModule=Dr,exports.createHandoffCommandEntry=Mr,exports.createHandoffCommandModule=Fr,exports.createHelpCommandEntry=Lr,exports.createHelpCommandModule=Br,exports.createKeybindingsCommandEntry=Vr,exports.createKeybindingsCommandModule=Wr,exports.createLanguageCommandEntry=qr,exports.createLanguageCommandModule=Xr,exports.createLoopCommandEntry=Qc,exports.createMCPActivationCommandEntry=wi,exports.createMCPActivationCommandModule=Oi,exports.createMemoryCommandEntry=Bi,exports.createMemoryCommandModule=Ui,exports.createModeCommandEntry=Yi,exports.createModeCommandModule=Qi,exports.createModelCommandEntry=sa,exports.createModelCommandModule=ua,exports.createMonitorCommandEntry=Zc,exports.createNodeDoctorDeps=ft,exports.createOutputStyleCommandEntry=Ta,exports.createOutputStyleCommandModule=Oa,exports.createPermissionsCommandEntry=Xa,exports.createPermissionsCommandModule=$a,exports.createPlanCommandModule=ao,exports.createPluginCommandEntry=bo,exports.createPluginCommandModule=To,exports.createPresetCommandEntry=Po,exports.createPresetCommandModule=Lo,exports.createProviderCommandEntry=Fs,exports.createProviderCommandModule=Rs,exports.createProviderSetupFlow=H,exports.createReloadPluginsCommandEntry=xo,exports.createRemoteControlCommandEntry=Ys,exports.createRemoteControlCommandModule=Qs,exports.createRenameCommandEntry=yl,exports.createResetCommandEntry=ec,exports.createResetCommandModule=rc,exports.createResumeCommandEntry=xl,exports.createRewindCommandModule=Sc,exports.createSandboxCommandModule=ya,exports.createScheduleCommandEntry=Xc,exports.createScheduleCommandModule=rl,exports.createSessionCommandModule=jl,exports.createSettingsCommandEntry=Ml,exports.createSettingsCommandModule=Fl,exports.createShellCommandEntry=zl,exports.createShellCommandModule=Hl,exports.createSkillsCommandEntry=Ql,exports.createSkillsCommandModule=tu,exports.createStatusLineCommandEntry=au,exports.createStatusLineCommandModule=cu,exports.createTerminalClientCommands=qu,exports.createThemeCommandEntry=_u,exports.createThemeCommandModule=yu,exports.createUserLocalCommandEntry=Vu,exports.createUserLocalCommandModule=Wu,exports.createValidateSessionCommandEntry=Cl,exports.doctorRepairAllowlist=Wt,exports.ensureProviderConfig=Vs,exports.executeAdvisorCommand=En,exports.executeAgentCommand=ue,exports.executeBackgroundCommand=ye,exports.executeClearCommand=cl,exports.executeCompactCommand=Te,exports.executeContextCommand=ze,exports.executeCostCommand=gl,exports.executeEditorCommand=yn,exports.executeEffortCommand=Ln,exports.executeExitCommand=Un,exports.executeGitCommand=_r,exports.executeGoalCommand=Cr,exports.executeHandoffCommand=Ar,exports.executeHelpCommand=Ir,exports.executeLanguageCommand=Kr,exports.executeLoopCommand=Ic,exports.executeMCPActivationCommand=mi,exports.executeMemoryCommand=zi,exports.executeModeCommand=Ji,exports.executeModelCommand=ta,exports.executeMonitorCommand=Jc,exports.executeOutputStyleCommand=wa,exports.executePermissionsCommand=Ki,exports.executePluginCommand=vo,exports.executePresetCommand=Mo,exports.executeProviderCommand=Os,exports.executeReloadPluginsCommand=yo,exports.executeRemoteControlCommand=Js,exports.executeRenameCommand=ll,exports.executeResetCommand=$s,exports.executeResumeCommand=ul,exports.executeRewindCommand=vc,exports.executeSandboxCommand=ma,exports.executeScheduleCommand=Kc,exports.executeShellCommand=Rl,exports.executeSkillsCommand=Zl,exports.executeStatusLineCommand=iu,exports.executeThemeCommand=gu,exports.executeUserLocalCommand=Bu,exports.executeUserLocalDirectCommand=zu,exports.executeValidateSessionCommand=_l,exports.formatProviderSetupChoiceLabel=Wo,exports.formatProviderSetupHelpLinks=Go,exports.formatProviderSetupPromptLabel=Ho,exports.formatProviderSetupSelectionPrompt=Ro,exports.formatSandboxStatus=fa,exports.getProviderSetupStep=U,Object.defineProperty(exports,"gitEnvironment",{enumerable:!0,get:function(){return e.gitEnvironment}}),exports.isDoctorRepairId=Gt,exports.mcpUnavailableServersNotice=ti,exports.mcpUserActionCommand=Zr,exports.mcpUserActionNotice=ei,exports.parseScheduleSpec=Vc,exports.planDoctorRepair=Jt,exports.redactDiagnosticText=Ct,exports.renderDoctorReport=gt,exports.resolveCommandOnPath=dt,exports.resolveEditor=_n,exports.resolveProviderSetupSelection=zo,exports.resolveShell=Il,exports.runDoctor=un,exports.runProviderSetupPromptFlow=Vo,exports.runProviderStartupSetup=Bs,exports.spawnInherited=A,exports.submitProviderSetupValue=Bo,exports.validateProviderSetupValue=qo;
113
+ `)),data:{count:n.length+r.length}}}async function Jc(e,t,n){let r=/^stop\s+(\S+)$/.exec(n);if(!r)return{success:!1,message:Ic};let i=Y(e).find(e=>e.loopId===r[1]);if(i)return e.stopSelfPacedLoop?(await e.stopSelfPacedLoop(i.loopId,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${i.loopId}. An already-running turn may finish.`,data:{loopId:i.loopId}}):{success:!1,message:`This host cannot stop self-paced loops.`};let a=J(e).find(e=>X(e)===r[1]);return a?(await t(a.id,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${X(a)}. An already-running turn may finish.`,data:{loopId:X(a),taskId:a.id}}):{success:!1,message:`Active loop not found: ${r[1]}`}}async function Yc(e,t,n,r=Lc){let i=t===``||/^\d+(s|m|h|d)$/i.test(t),a=n.defaultPrompt;if(i&&n.resolveDefaultPrompt)try{a=n.resolveDefaultPrompt()}catch(e){return{success:!1,message:`Default loop prompt could not be loaded: ${e instanceof Error?e.message:String(e)}`}}let o=Hc(t,a);if(!o){if(/^\d+[a-z](?:\s|$)/i.test(t)||Vc(t))return{success:!1,message:Ic};let n=(t||a||``).trim();if(!n||t===``&&n.length>Pc)return{success:!1,message:Ic};if(!e.createSelfPacedLoop)return{success:!1,message:`Self-paced loops require a persistent interactive session.`};if(i){let t=await Gc(e,r,n);if(t)return t}let o=K.get(e)??0;if(J(e).length+Y(e).length+o>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};K.set(e,o+1);try{let t=i?await e.createSelfPacedLoop(n,{useDefaultPrompt:!0}):await e.createSelfPacedLoop(n);return{success:!0,message:`Self-paced loop ${t.loopId} started. It will choose a 1–60 minute delay after each iteration and expires ${t.expiresAt}. Stop with /loop stop ${t.loopId}.`,data:{loopId:t.loopId,expiresAt:t.expiresAt}}}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}}if(i){let t=await Gc(e,r,o.instruction);if(t)return t}let s=K.get(e)??0;if(J(e).length+Y(e).length+s>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};let c=Uc(o.requestedMs),u=`Loop: ${o.instruction.slice(0,48)}`,d=`loop_${(0,l.randomUUID)()}`,f=Nc(d,c),p=Date.now(),m=new Date(p+o.requestedMs).toISOString(),h=new Date(p+6048e5).toISOString();K.set(e,s+1);let g;try{g=await e.spawnScheduledWake({label:u,cronExpression:f.cronExpression,agentInstruction:o.instruction,sessionLoop:!0,sessionLoopId:d,...i?{sessionLoopDefaultPrompt:!0}:{},sessionLoopFirstAllowedAt:m,sessionLoopExpiresAt:h})}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}let _=c.milliseconds===o.requestedMs?``:` (rounded up)`,v=g.kind===`scheduled`&&g.nextFireAt&&g.nextFireAt>=m?` Next fire: ${g.nextFireAt}.`:``;return{success:!0,message:`Loop ${d} uses a ${c.description}${_} local-clock step with stable offset +${f.jitterSeconds}s; elapsed gaps can change with daylight saving. First eligible at or after ${m}.${v} Expires: ${h}. Stop with /loop stop ${d}.`,data:{loopId:d,taskId:g.id,requestedMs:o.requestedMs,cadenceLabel:c.description,cronExpression:f.cronExpression,jitterSeconds:f.jitterSeconds,firstAllowedAt:m,expiresAt:h}}}const Xc={s:1e3,m:6e4,h:36e5,d:864e5},Z=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function Zc(e,t){let n=e.trim();if(n.length===0)return{ok:!1,error:Z};if(n.startsWith(`in `)){let e=n.slice(3).trim(),r=e.indexOf(` `);if(r===-1)return{ok:!1,error:`Missing instruction. ${Z}`};let i=e.slice(0,r),a=e.slice(r+1).trim(),o=/^(\d+)(s|m|h|d)$/.exec(i);if(!o)return{ok:!1,error:`Invalid duration "${i}". ${Z}`};if(a.length===0)return{ok:!1,error:`Missing instruction. ${Z}`};let s=parseInt(o[1],10)*Xc[o[2]];return{ok:!0,spec:{cronExpression:new Date(t+s).toISOString(),instruction:a,recurring:!1}}}if(n.startsWith(`cron `)){let e=n.slice(5).trim(),t=/^["']([^"']+)["']\s+(\S.*)$/.exec(e);if(!t)return{ok:!1,error:`cron form needs a quoted expression. ${Z}`};let r=t[2].trim();return r.length===0?{ok:!1,error:`Missing instruction. ${Z}`}:{ok:!0,spec:{cronExpression:t[1].trim(),instruction:r,recurring:!0}}}return{ok:!1,error:Z}}function Qc(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}const $c=`Usage: /schedule list | pause <id> | resume <id> | edit <id> <spec> (or a create spec: in <N><s|m|h|d> … | cron "<expr>" …)`;function el(e){return e.length===0?`No schedules.`:e.map(e=>{let t=e.kind===`scheduled`?e.schedule?.cronExpression??`(unknown)`:`(unknown)`,n=e.kind===`scheduled`&&e.nextFireAt?`next ${e.nextFireAt}`:`—`;return`- ${e.id} [${e.status}] ${t} — ${e.label} (${n})`}).join(`
114
+ `)}async function tl(e,t,n,r){if(t===`list`){let t=e.listSchedules();return{message:el(t),success:!0,data:{count:t.length}}}if(t===`pause`||t===`resume`){let r=n.split(/\s+/)[0];return r?t===`pause`?(await e.pauseSchedule(r),{message:`Schedule paused: ${r}`,success:!0,data:{taskId:r}}):(await e.resumeSchedule(r),{message:`Schedule resumed: ${r}`,success:!0,data:{taskId:r}}):{message:$c,success:!1}}if(t===`edit`){let t=n.indexOf(` `),i=t===-1?n:n.slice(0,t),a=t===-1?``:n.slice(t+1).trim();if(!i||!a)return{message:$c,success:!1};let o=Zc(a,r);return o.ok?(await e.editSchedule(i,{cronExpression:o.spec.cronExpression,agentInstruction:o.spec.instruction,label:Qc(`Scheduled`,o.spec.instruction)}),{message:`Schedule updated: ${i} (cron \`${o.spec.cronExpression}\`).`,success:!0,data:{taskId:i,cronExpression:o.spec.cronExpression}}):{message:o.error,success:!1}}}async function nl(e,t,n=Date.now()){let r=t.trim(),i=r.indexOf(` `),a=await tl(e,(i===-1?r:r.slice(0,i)).toLowerCase(),i===-1?``:r.slice(i+1).trim(),n);if(a)return a;let o=Zc(t,n);if(!o.ok)return{message:`${o.error}\n${$c}`,success:!1};let{cronExpression:s,instruction:c,recurring:l}=o.spec,u=await e.spawnScheduledWake({label:Qc(`Scheduled`,c),cronExpression:s,agentInstruction:c});return{message:`Scheduled wake (${l?`cron \`${s}\``:`once at ${s}`}): "${c}" — task ${u.id}.`,success:!0,data:{taskId:u.id,cronExpression:s,recurring:l}}}function rl(e){let t=/^["']([^"']+)["']\s+["']([^"']+)["']\s+(\S.*)$/.exec(e.trim());if(!t)return null;let n=t[3].trim();return n.length===0?null:{command:t[1],matchPattern:t[2],instruction:n}}async function il(t,n){let r=rl(n);if(!r)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let i;try{i=await t.spawnMonitorWake({label:Qc(`Monitor`,r.instruction),command:r.command,matchPattern:r.matchPattern,agentInstruction:r.instruction})}catch(t){if(t instanceof e.MonitorCommandRefusedError)return{message:t.message,success:!1};throw t}return{message:`Monitoring \`${r.command}\` for /${r.matchPattern}/ — task ${i.id}.`,success:!0,data:{taskId:i.id,matchPattern:r.matchPattern}}}function al(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function ol(){return{name:`schedule`,displayName:`Schedule Wake`,description:`Schedule the agent to wake on a timer, and manage schedules (list / pause / resume / edit).`,modelDescription:'Wake yourself later with an instruction. Use it when work must wait (a deploy, a long build, a reply) instead of polling: `in <N><s|m|h|d> <instruction>` or `cron "<expr>" <instruction>`; `list`, `pause`, `resume` and `edit` manage existing schedules. Returns the schedule id, or the schedule list.',source:`schedule`,argumentHint:`in <N><s|m|h|d> <instruction> | cron "<expr>" <instruction> | list | pause <id> | resume <id> | edit <id> <spec>`,modelInvocable:!0}}function sl(){return{name:`monitor`,displayName:`Monitor Process`,description:`Watch a process’s output and wake the agent when a line matches a pattern.`,modelDescription:`Run a command in the background and wake yourself when a line of its output matches a pattern. Use it to wait for a server to start, a test to fail or a log line to appear instead of polling. The command is allowed, refused or asked about by the same permission rules as a shell tool call. Returns the monitor task id, or a refusal naming what the user must allow.`,source:`schedule`,argumentHint:`"<command>" "<pattern>" <instruction>`,modelInvocable:!0}}function cl(){return{name:`loop`,displayName:`Repeat Prompt`,description:`Repeat a prompt on a fixed cadence or let each iteration choose its next delay; list or stop active loops.`,modelDescription:"Repeat a prompt on a fixed cadence (`<N><s|m|h|d> <prompt>`) or self-paced (`<prompt>`: each iteration chooses its next delay or stops). Use it when the user asks for recurring work in this session, and always give your own prompt: any form that would fall back to the host's default maintenance prompt — bare `/loop` or an interval alone (`<N><s|m|h|d>`) — needs a person to confirm it and is always refused for you, whether or not one is attached. `list` shows active loops; `stop <id>` ends one, even mid-turn. Returns the loop id and its next fire time, the loop list, or a refusal naming the command to suggest.",source:`schedule`,argumentHint:`[prompt] | <N><s|m|h|d> [prompt] | <prompt> every <N> <unit> | list | stop <id>`,modelInvocable:!0,subcommands:[{name:`list`,description:`List active loops`,source:`schedule`},{name:`stop`,description:`Stop an active loop`,source:`schedule`,argumentHint:`<id>`}]}}function ll(){let e=ol();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>nl(al(e),t)}}function ul(){let e=sl();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!0,modelRequiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>il(al(e),t)}}function dl(e){let t=cl();return{name:t.name,displayName:t.displayName,description:t.description,...t.modelDescription===void 0?{}:{modelDescription:t.modelDescription},requiresPermission:!0,userInvocable:!0,modelInvocable:!0,argumentHint:t.argumentHint,subcommands:t.subcommands,lifecycle:`inline`,execute:(t,n)=>Kc(al(t),(e,n)=>t.cancelBackgroundTask(e,n),n,e,{ui:t.getUserInteraction(),source:t.getCommandInvocationSource()})}}var fl=class{name=`schedule`;getCommands(){return[ol(),sl(),cl()]}};function pl(e={}){return{name:`agent-command-schedule`,commandSources:[new fl],systemCommands:[ll(),ul(),dl(e)],sessionRequirements:[`runtime`]}}function ml(e,n,r){return(0,t.calculateModelCost)(e,n,r)}function Q(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function hl(e){return e.toLocaleString(`en-US`)}const gl=`Conversation cleared.`;function _l(e,t){let n=t.trim();return n===``?{success:!1,message:`Usage: /cd <directory>`}:{success:!0,message:``,hostActions:[{type:`workspace-move`,path:n}]}}async function vl(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:((0,e.clearConversationHistory)(n),{success:!0,message:gl})}function yl(t,n){let r=(0,e.parseSessionNameArgument)(n);return r===void 0?{success:!1,message:e.RENAME_COMMAND_USAGE}:{success:!0,message:`Session renamed to "${r}".`,data:{name:r},hostActions:[(0,e.createSessionRenameHostAction)(r)]}}function bl(){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},uiIntents:[(0,e.createShowSessionPickerIntent)()]}}function xl(e){return e.getCommandHostAdapters?.().costBudget}const Sl=`Budget persistence is not available on this host (no cost-budget adapter was composed).`;function Cl(e){return`Could not write the budget: ${e instanceof Error?e.message:String(e)}`}function wl(e,t){if(e.length===0)return;let n={inputTokens:0,outputTokens:0,partial:!1,models:[]},r=new Set,i=0,a=!1;for(let o of e){n.inputTokens+=o.promptTokens,n.outputTokens+=o.completionTokens;let e=o.source?.scope===`tool`,s=o.costUsd??(!e&&t?ml(t,o.promptTokens,o.completionTokens):void 0);if(s===void 0){n.partial=!0;continue}i+=s,a=!0,r.add(e?o.source?.label??`another model`:t??`main model`)}return a&&(n.costUsd=i),n.models=[...r],n}function Tl(t){let n=t.getSession(),r=(0,e.readCommandSessionInfo)(t),i=n.getModelId(),a=wl(t.getSessionUsage(),i),o=[`Session: ${r.sessionId}`,`Messages: ${r.messageCount}`],s={sessionId:r.sessionId,messageCount:r.messageCount};if(a){o.push(`Tokens: ${hl(a.inputTokens)} input / ${hl(a.outputTokens)} output`),s.inputTokens=a.inputTokens,s.outputTokens=a.outputTokens;let e=a.costUsd;if(e!==void 0){let n=a.models.length>1?`mixed: ${a.models.join(`, `)}`:a.models[0]??``,r=a.partial?`; some usage could not be priced`:``;o.push(`Cost: ${Q(e)} (${n}${r})`),s.estimatedCostUsd=e,s.costModels=a.models,a.partial&&(s.costPartial=!0);let i=xl(t)?.read();if(i?.monthly){let t=i.monthly-e,n=Math.min(100,Math.round(e/i.monthly*100));o.push(`Budget: ${Q(t)} remaining of ${Q(i.monthly)}/mo (${n}% used)`),s.budgetMonthly=i.monthly,s.budgetRemainingUsd=t}}}else o.push(`Tokens: not yet available (no turns completed)`);return{lines:o,data:s}}function El(e,t){let n=t.trim();if(n.startsWith(`budget`)){let t=n.slice(6).trim(),r=t===`clear`||t===``?void 0:parseFloat(t);if(r!==void 0&&(!Number.isFinite(r)||r<=0))return{success:!1,message:`Usage: /cost budget <amount> (e.g. /cost budget 5.00)`};let i=xl(e);if(i===void 0)return{success:!1,message:Sl};if(t===`clear`){try{i.clear()}catch(e){return{success:!1,message:Cl(e)}}return{success:!0,message:`Monthly budget cleared.`}}if(t===``){let e=i.read();return e?.monthly?{success:!0,message:`Monthly budget: ${Q(e.monthly)}`}:{success:!0,message:`No budget set. Use: /cost budget <amount>`}}if(r===void 0)return{success:!1,message:Sl};try{i.write({monthly:r})}catch(e){return{success:!1,message:Cl(e)}}return{success:!0,message:`Monthly budget set to ${Q(r)}.`}}let{lines:r,data:i}=Tl(e);return{success:!0,message:r.join(`
115
+ `),data:i}}function Dl(t,n){let r=(0,e.validateCommandSessionReplayLog)(t);return{success:r.validation.ok,message:(0,e.formatCommandSessionReplayValidationReport)(r),data:{logFile:r.logFile,entryCount:r.entryCount,issueCount:r.validation.issues.length,ok:r.validation.ok}}}function Ol(){return{name:`clear`,displayName:`Clear History`,description:e.CLEAR_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function kl(){return{name:`rename`,displayName:`Rename Session`,description:e.RENAME_COMMAND_DESCRIPTION,argumentHint:`<name>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function Al(){return{name:`cd`,displayName:`Change Directory`,description:`Move this session to another working directory`,argumentHint:`<directory>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function jl(){return{name:`resume`,displayName:`Resume Session`,description:e.RESUME_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function Ml(){return{name:`cost`,displayName:`Session Cost`,description:e.COST_COMMAND_DESCRIPTION,modelDescription:"Report this session’s token usage and estimated cost. Use it before an expensive step (a large refactor, many subagents) or when the user asks what the session has cost. Returns the message count, input/output token totals and the estimated USD cost, with the remaining monthly budget when one is set. Setting or clearing the budget is the user’s decision: suggest `/cost budget <amount>`.",argumentHint:`[budget [<amount>|clear]]`,runsBare:!0,source:`session`,modelInvocable:!0,userInvocable:!0,subcommands:[{name:`budget`,description:`Show, set, or clear the monthly budget`,argumentHint:`[<amount>|clear]`,source:`session`,modelInvocable:!1}]}}function Nl(){return{name:`validate-session`,displayName:`Validate Session`,description:e.VALIDATE_SESSION_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function Pl(){return k(Ol(),{requiresPermission:!1,lifecycle:`inline`,execute:vl})}function Fl(){return k(kl(),{requiresPermission:!1,lifecycle:`inline`,execute:yl})}function Il(){return k(Al(),{requiresPermission:!1,lifecycle:`inline`,execute:_l})}function Ll(){return k(jl(),{requiresPermission:!1,lifecycle:`inline`,execute:bl})}function Rl(){return k(Ml(),{requiresPermission:!1,lifecycle:`inline`,execute:El})}function zl(){return k(Nl(),{requiresPermission:!1,lifecycle:`inline`,execute:Dl})}var Bl=class{name=`session`;getCommands(){return[Ol(),kl(),Al(),jl(),Ml(),Nl()]}};function Vl(){return{name:`agent-command-session`,commandSources:[new Bl],systemCommands:[Pl(),Fl(),Il(),Ll(),Rl(),zl()]}}function Hl(){return{name:`settings`,displayName:`Settings`,description:`Open settings — language, output style, preset, permissions and more`,source:`settings`,modelInvocable:!1}}function Ul(){let e=Hl();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:async()=>({success:!0,message:`Opening settings...`,uiIntents:[{type:`show-settings`}]})}}var Wl=class{name=`settings`;getCommands(){return[Hl()]}};function Gl(){return{name:`agent-command-settings`,commandSources:[new Wl],systemCommands:[Ul()]}}function Kl(e){let n=(0,t.resolvePlatformShell)({executable:e});return{command:n.command,interactiveArgs:n.interactiveArgs,commandArgs:e=>n.commandArgs(e)}}const ql="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function Jl(e,t,n){if(!e.canHandoffTerminal())return{message:`An interactive shell is unavailable here (no interactive terminal).`,success:!1};let r=Kl(n),i=e.getCwd(),a=t.trim(),o=await e.runWithTerminal(async()=>a.length>0?M(r.command,r.commandArgs(a),i):M(r.command,r.interactiveArgs,i));return{message:a.length>0?`Command exited (code ${o}).`:`Shell session ended (code ${o}).`,success:o===0,data:{exitCode:o}}}function Yl(){return{name:`shell`,displayName:`Shell`,description:ql,source:`shell`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function Xl(e){let t=Yl();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:(t,n)=>Jl(t,n,e)}}var Zl=class{name=`shell`;getCommands(){return[Yl()]}};function Ql(e){return{name:`agent-command-shell`,commandSources:[new Zl],systemCommands:[Xl(e)]}}function $l(){return{name:`skill-read`,description:`Read a supporting file from a skill active in this execution`,modelDescription:`Read verified supporting bytes from a skill already activated in this execution. Use when its instructions refer to a resource in the returned manifest. Args are a JSON array ["<skill-name>", "<resource-uri>"]. Returns the verified URI, digest, size and text or base64 blob with optional MIME type. This does not activate nested skills or grant consent; unactivated skills, undeclared resources and ended executions are refused. Binary blobs are returned as encoded data, not a rendered image.`,argumentHint:`["<skill-name>", "<resource-uri>"]`,source:`skills`,userInvocable:!0,modelInvocable:!0,safety:`read-only`}}async function eu(e,t=``){let n;try{n=JSON.parse(t)}catch{return{success:!1,message:`Use /skill-read ["<skill-name>", "<resource-uri>"]`}}if(!Array.isArray(n)||n.length!==2||n.some(e=>typeof e!=`string`||!e.length))return{success:!1,message:`Use /skill-read ["<skill-name>", "<resource-uri>"]`};if(!e.readSkillResource)return{success:!1,message:`This host does not provide active skill resource reads.`};try{let t=await e.readSkillResource(n[0],n[1]);return{success:!0,message:`Read verified skill resource: ${t.uri}`,data:{...t}}}catch(e){return{success:!1,message:`Skill resource read refused: ${e instanceof Error?e.message:`host refused the read`}`}}}function tu(){return{...$l(),semanticRole:`skillResourceRead`,requiresPermission:!1,lifecycle:`inline`,execute:eu}}const nu=`List registered skills, or activate one by name`;function ru(e){let t=[];return e.modelInvocable||t.push(`model-disabled`),e.userInvocable||t.push(`model-only`),e.context&&t.push(`context:${e.context}`),e.agent&&t.push(`agent:${e.agent}`),t.length>0?` [${t.join(`, `)}]`:``}function iu(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${ru(e)}`}function au(e){return e.length===0?[`No skills are registered for this session.`,``,`Skills are metadata until activated. Do not invent or imitate a skill workflow when no matching registered skill exists.`].join(`
116
+ `):[`Registered skills:`,...e.map(iu),``,`Activation contract:`,`- Use /skills <skill-name> [args] to activate a matching skill.`,`- Treat /<skill-name> as a virtual alias for /skills <skill-name>.`,`- The system prompt Skills section is skill selection metadata.`,`- Treat descriptions as selection metadata only, not as loaded SKILL.md content.`,`- Do not answer by merely naming, recommending, or imitating a matching skill.`,`- If no listed skill matches the task, continue without claiming a skill was activated.`].join(`
117
+ `)}function ou(e){let t=e.trim();if(t.length===0||t===`list`)return{action:`list`,skillArgs:``};let[n=``,...r]=t.split(/\s+/);return n.length===0?{action:`list`,skillArgs:``}:{action:`activate`,skillName:n,skillArgs:r.join(` `)}}async function su(e,t=``){let n=ou(t);if(n.action===`activate`&&n.skillName!==void 0){let t=`/${n.skillName}${n.skillArgs?` ${n.skillArgs}`:``}`;return await e.executeSkillCommandByName(n.skillName,n.skillArgs,{invocationSource:e.getCommandInvocationSource(),displayInput:t,rawInput:t})??{success:!1,message:`Unknown skill: ${n.skillName}`}}let r=e.listSkills();return{success:!0,message:au(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function cu(){return{name:`skills`,displayName:`Skills`,description:nu,modelDescription:`Skill command. Before following a matching registered skill from the system prompt Skills section, invoke the projected skills command tool with args "<skill-name> [args]". Without arguments, list registered skills. With a skill name, activate that skill; a skill that declares it is not model-invocable is refused. Returns the skill list with each skill's description, or the activated skill's instructions to follow. Slash syntax is a UI input/display concern; the SDK command identity is "skills".`,source:`skills`,modelInvocable:!0,userInvocable:!0,argumentHint:`[list | <skill-name> [args]]`,safety:`read-only`}}function lu(){let e=cu();return{name:e.name,semanticRole:`skillActivation`,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`inline`,execute:su}}var uu=class{name=`skills`;getCommands(){return[cu(),$l()]}};function du(t){let n=[new uu];return n.push(new e.SkillCommandSource(t.contributionSources,t.skillRoots??[])),{name:`agent-command-skills`,commandSources:n,systemCommands:[lu(),tu()]}}const fu=[`Usage: /statusline on | off | reset | git on | git off`,`Fields: model, context, permission mode, message count, session name, thinking state, git branch.`].join(`
118
+ `);function pu(t){let n=t.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[r,i]=n;return r===`on`&&i===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:r===`off`&&i===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:r===`reset`&&i===void 0?{success:!0,message:`Status line settings reset.`,patch:{...e.DEFAULT_STATUS_LINE_COMMAND_SETTINGS}}:r===`git`&&i===`on`&&n.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:r===`git`&&i===`off`&&n.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:fu}}function mu(e,t){let n=pu(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function hu(){return{name:`statusline`,displayName:`Status Line`,description:e.STATUSLINE_COMMAND_DESCRIPTION,source:`statusline`,argumentHint:e.STATUSLINE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildStatusLineCommandSubcommands)(`statusline`),modelInvocable:!1}}function gu(){let e=hu();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:mu}}var _u=class{name=`statusline`;getCommands(){return[hu()]}};function vu(){return{name:`agent-command-statusline`,commandSources:[new _u],systemCommands:[gu()]}}const yu=`list | <theme-id> | syntax on|off | motion on|off`;function $(e){return e?`on`:`off`}function bu(e){let{settings:t,reducedMotionPin:n}=e.getAppearance(),r=e.listThemes().map(e=>`${e.id===t.theme?`* `:` `}${e.id} — ${e.name} (${e.appearance}, ${e.source})`),i=n?`${$(n.reducedMotion)} for this run (pinned by ${n.tier}; saved ${$(t.reducedMotion)})`:$(t.reducedMotion);return[`Available themes:`,...r,``,`syntax highlighting: ${$(t.syntaxHighlighting)}`,`reduced motion: ${i}`].join(`
119
+ `)}function xu(e){return{success:!0,message:bu(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function Su(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function Cu(e){if(e===`on`)return!0;if(e===`off`)return!1}function wu(e){let t={},n=0,r;for(e[0]!==`syntax`&&e[0]!==`motion`&&(r=e[0],n=1);n<e.length;){let r=e[n],i=Cu(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${yu}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function Tu(e,t,n){let r=[];t&&r.push(`theme ${t.name}`),e.syntaxHighlighting!==void 0&&r.push(`syntax highlighting ${$(e.syntaxHighlighting)}`),e.reducedMotion!==void 0&&r.push(`motion ${$(!e.reducedMotion)}`);let i=r.length>0?`Applied: ${r.join(`, `)}.`:`Nothing to change.`;return e.reducedMotion!==void 0&&n.reducedMotionPin?`${i} Saved, but this run keeps reduced motion pinned by ${n.reducedMotionPin.tier}.`:i}function Eu(e,t){if(!e)return{success:!1,message:`Themes are available in an interactive terminal. Run /theme there.`};let n=t.trim().split(/\s+/u).filter(Boolean);if(n.length===0)return{success:!0,message:`Opening the theme picker...`,uiIntents:[{type:`show-theme-picker`}]};if(n.length===1&&n[0]===`list`)return xu(e);let r=wu(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${yu}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return Su(r.themeId,e);i.theme=a.id}return{success:!0,message:Tu(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function Du(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:yu,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var Ou=class{name=`theme`;getCommands(){return[Du()]}};function ku(e){let t=Du(),n={name:t.name,displayName:t.displayName,description:t.description,argumentHint:t.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:(t,n)=>Eu(e,n)};return{name:`agent-command-theme`,commandSources:[new Ou],systemCommands:[n]}}const Au=`Inspect user-local storage and memory state.`,ju=`storage list [--format json] | memory set/list/inspect/disable/delete`,Mu=`Usage: user-local storage list [--format json] | user-local memory set <category> <key> <value> --summary <summary> --source <source> | user-local memory list [--format json] | user-local memory inspect <category> <key> [--format json] | user-local memory disable <category> <key> | user-local memory delete <category> <key>`;function Nu(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
120
+ `)}function Pu(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function Fu(t,n,r){let i=await(0,e.listUserLocalMemoryItems)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):Nu(i.items),success:!0,data:{list:i}}}async function Iu(t,n,r){let[i,a,o]=r.positional,s=await(0,e.setUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Pu(i),key:a??``,value:o??``,summary:r.summary??``,source:r.source??``});return{message:`Stored user-local memory item ${s.category}/${s.key} at ${s.storageLocation}`,success:!0,data:{item:s}}}async function Lu(t,n,r){let[i,a]=r.positional,o=await(0,e.inspectUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Pu(i),key:a??``});return{message:r.format===`json`?JSON.stringify(o,null,2):`${o.category}/${o.key}: ${o.summary}`,success:!0,data:{item:o}}}async function Ru(t,n,r){let[i,a]=r.positional,o=await(0,e.disableUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Pu(i),key:a??``});return{message:`Disabled user-local memory item ${o.category}/${o.key}`,success:!0,data:{item:o}}}async function zu(t,n,r){let[i,a]=r.positional,o=await(0,e.deleteUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Pu(i),key:a??``});return{message:`Deleted user-local memory item ${o.category}/${o.key}`,success:!0,data:{result:o}}}async function Bu(e,t,n){return(n.action??`list`)===`list`?Fu(e,t,n):n.action===`set`?Iu(e,t,n):n.action===`inspect`?Lu(e,t,n):n.action===`disable`?Ru(e,t,n):n.action===`delete`?zu(e,t,n):{message:Mu,success:!1}}function Vu(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Hu(e,t,n){return e===`--format`?{format:t[n+1],nextIndex:n+1}:e.startsWith(`--format=`)?{format:e.slice(9),nextIndex:n}:e===`--summary`?{summary:t[n+1],nextIndex:n+1}:e.startsWith(`--summary=`)?{summary:e.slice(10),nextIndex:n}:e===`--source`?{source:t[n+1],nextIndex:n+1}:e.startsWith(`--source=`)?{source:e.slice(9),nextIndex:n}:null}function Uu(e,t={}){let n=t.format,r=t.summary,i=t.source,a=[];for(let t=0;t<e.length;t+=1){let o=e[t],s=Hu(o,e,t);if(s!==null){n=s.format??n,r=s.summary??r,i=s.source??i,t=s.nextIndex;continue}a.push(o)}return{target:a[0],action:a[1],positional:a.slice(2),format:Vu(n),summary:r,source:i}}function Wu(e){return e.trim().split(/\s+/).filter(Boolean)}function Gu(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
121
+ `)}async function Ku(t,n,r){if((r.action??`list`)!==`list`)return{message:Mu,success:!1};let i=await(0,e.inspectUserLocalStorage)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):Gu(i.root,i.categories),success:!0,data:{root:i.root,categories:i.categories,inspection:i}}}async function qu(e,t,n){return n.target===`storage`?Ku(e,t,n):n.target===`memory`?Bu(e,t,n):{message:Mu,success:!1}}function Ju(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Yu(e){try{return await qu(e.cwd,e.storageRoot,Uu(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:Ju(e instanceof Error?e.message:String(e)),success:!1}}}async function Xu(e,t,n){try{return await qu(e.getCwd(),n,Uu(Wu(t)))}catch(e){return{message:Ju(e instanceof Error?e.message:String(e)),success:!1}}}function Zu(){return{name:`user-local`,displayName:`User Config`,description:Au,source:`user-local`,argumentHint:ju,modelInvocable:!1,safety:`read-only`,subcommands:[{name:`storage`,description:`Inspect user-local storage categories`,source:`user-local`},{name:`memory`,description:`Inspect and manage user-local memory items`,source:`user-local`}]}}function Qu(e){let t=Zu();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,safety:t.safety,subcommands:t.subcommands,execute:(t,n)=>Xu(t,n,e)}}var $u=class{name=`user-local`;getCommands(){return[Zu()]}};function ed(e){return{name:`agent-command-user-local`,commandSources:[new $u],systemCommands:[Qu(e)]}}function td(t,n,r){return(0,e.selectCommandModules)(t,n,r)}function nd({cwd:t,userLocalStorageRoot:n,editorTemporaryDirectoryPrefix:r,contributionSources:i,skillRoots:a,providerDefinitions:o,providerSettingsAdapter:s,orgPolicy:c,keybindingsFilePort:l,themeCataloguePort:u,devicesPort:d,doctorInputs:f,doctorDisplay:p,formatForkResumeCommand:m,loopOptions:h,enabledCommandModules:g,disabledCommandModules:_,providerEnvironment:v,providerConnectionHost:y,providerCredentialResolver:b}){let x=[du({contributionSources:i??[],skillRoots:a}),zr(),me(),Bn(),On(),$a(),Zi(),ya(),Ro(),Oa(),Yr(),be(),nr(m),Er(),ao(),Ql(),xn(r),yr(),Ur(l),ku(u),...f===void 0?[]:[mn(f,void 0,p)],Hi(),Di(),ed(n),Ee(),Ye(),Gn(),Vl(),pc(),Mc(),pl(h),vu(),Eo(),Gl(),Ya(),Ia(),Pr(),cc(),...d===void 0?[]:[at(d)],Ks({providerDefinitions:o,settings:s,...c===void 0?{}:{orgPolicy:c},...v===void 0?{}:{env:v},...y===void 0?{}:{connectionHost:y},...b===void 0?{}:{resolveCredential:b}}),ua({providerDefinitions:o,settings:s,...c===void 0?{}:{orgPolicy:c},...v===void 0?{}:{env:v},...b===void 0?{}:{resolveCredential:b}})],S=x.map(e=>e.name);return{modules:td(x,g,_),unknownModuleNames:(0,e.findUnknownModuleNames)(S,g,_)}}function rd(t){let{shellExecutable:n,editorTemporaryDirectoryPrefix:r,keybindingsFile:i,themeCatalogue:a,enabledCommandModules:o,disabledCommandModules:s}=t,c=[[Ql(n),(e,t)=>Jl(e,t,n)],[xn(r),(e,t)=>_n(e,t,r)],[Ur(i),e=>Vr(i,e)],[ku(a),(e,t)=>Eu(a,t)]],l=new Set((0,e.selectCommandModules)(c.map(([e])=>e),o,s));return c.filter(([e])=>l.has(e)).flatMap(([e,t])=>(e.systemCommands??[]).map(e=>({name:e.name,execute:t})))}exports.ADVISOR_SETTING_KEY=Sn,exports.AdvisorCommandSource=Dn,exports.AgentCommandSource=pe,exports.BackgroundCommandSource=ye,exports.CLEAR_COMMAND_MESSAGE=gl,exports.CompactCommandSource=Te,exports.ContextCommandSource=Je,exports.DoctorCommandSource=un,exports.EDITOR_COMMAND_DESCRIPTION=gn,exports.EditorCommandSource=bn,exports.EffortCommandSource=zn,exports.ExitCommandSource=Wn,exports.GOAL_COMMAND_DESCRIPTION=br,exports.GitCommandSource=vr,exports.GoalCommandSource=Tr,exports.HandoffCommandSource=Nr,exports.HelpCommandSource=Rr,exports.KeybindingsCommandSource=Hr,exports.LanguageCommandSource=Jr,exports.MCPActivationCommandSource=Ei,exports.MemoryCommandSource=Vi,exports.ModeCommandSource=Xi,exports.ModelCommandSource=la,exports.OutputStyleCommandSource=Da,exports.PermissionsCommandSource=Qa,exports.PluginManagerCommandSource=To,exports.PresetCommandSource=Lo,exports.ProviderCommandSource=Ws,exports.RemoteControlCommandSource=sc,exports.RewindCommandSource=jc,exports.SANDBOX_MODES=z,exports.SHELL_COMMAND_DESCRIPTION=ql,exports.SKILLS_COMMAND_DESCRIPTION=nu,exports.STATUSLINE_USAGE=fu,exports.STORAGE_REPAIR_ID=Vt,exports.SandboxCommandSource=va,exports.ScheduleCommandSource=fl,exports.SessionCommandSource=Bl,exports.SettingsCommandSource=Wl,exports.ShellCommandSource=Zl,exports.SkillsCommandSource=uu,exports.StatusLineCommandSource=_u,exports.ThemeCommandSource=Ou,exports.USER_LOCAL_COMMAND_ARGUMENT_HINT=ju,exports.USER_LOCAL_COMMAND_DESCRIPTION=Au,exports.USER_LOCAL_COMMAND_USAGE=Mu,exports.UserLocalCommandSource=$u,exports.applyDoctorRepair=qt,exports.buildDoctorReport=on,exports.collectSettingsSecrets=Ct,exports.createAdvisorCommandEntry=Tn,exports.createAdvisorCommandModule=On,exports.createAgentCommandEntry=de,exports.createAgentCommandModule=me,exports.createAgentSystemCommand=fe,exports.createBackgroundCommandEntry=_e,exports.createBackgroundCommandModule=be,exports.createClearCommandEntry=Ol,exports.createCompactCommandEntry=Ce,exports.createCompactCommandModule=Ee,exports.createContextCommandEntry=Ke,exports.createContextCommandModule=Ye,exports.createCostCommandEntry=Ml,exports.createDefaultCommandModules=nd,exports.createDevicesCommandModule=at,exports.createDoctorCommandEntry=ln,exports.createDoctorCommandModule=mn,exports.createEditorCommandEntry=vn,exports.createEditorCommandModule=xn,exports.createEffortCommandEntry=Ln,exports.createEffortCommandModule=Bn,exports.createExitCommandEntry=Hn,exports.createExitCommandModule=Gn,exports.createGitCommandEntry=hr,exports.createGitCommandModule=yr,Object.defineProperty(exports,"createGitProcess",{enumerable:!0,get:function(){return e.createGitProcess}}),exports.createGoalCommandEntry=Cr,exports.createGoalCommandModule=Er,exports.createHandoffCommandEntry=jr,exports.createHandoffCommandModule=Pr,exports.createHelpCommandEntry=Ir,exports.createHelpCommandModule=zr,exports.createKeybindingsCommandEntry=Br,exports.createKeybindingsCommandModule=Ur,exports.createLanguageCommandEntry=Kr,exports.createLanguageCommandModule=Yr,exports.createLoopCommandEntry=cl,exports.createMCPActivationCommandEntry=Ci,exports.createMCPActivationCommandModule=Di,exports.createMemoryCommandEntry=zi,exports.createMemoryCommandModule=Hi,exports.createModeCommandEntry=Ji,exports.createModeCommandModule=Zi,exports.createModelCommandEntry=sa,exports.createModelCommandModule=ua,exports.createMonitorCommandEntry=sl,exports.createNodeDoctorDeps=ut,exports.createOutputStyleCommandEntry=Ta,exports.createOutputStyleCommandModule=Oa,exports.createPermissionsCommandEntry=Xa,exports.createPermissionsCommandModule=$a,exports.createPlanCommandModule=ao,exports.createPluginCommandEntry=xo,exports.createPluginCommandModule=Eo,exports.createPresetCommandEntry=Fo,exports.createPresetCommandModule=Ro,exports.createProviderCommandEntry=Us,exports.createProviderCommandModule=Ks,exports.createProviderSetupFlow=H,exports.createReloadPluginsCommandEntry=So,exports.createRemoteControlCommandEntry=ac,exports.createRemoteControlCommandModule=cc,exports.createRenameCommandEntry=kl,exports.createResetCommandEntry=uc,exports.createResetCommandModule=pc,exports.createResumeCommandEntry=jl,exports.createRewindCommandModule=Mc,exports.createSandboxCommandModule=ya,exports.createScheduleCommandEntry=ol,exports.createScheduleCommandModule=pl,exports.createSessionCommandModule=Vl,exports.createSettingsCommandEntry=Hl,exports.createSettingsCommandModule=Gl,exports.createShellCommandEntry=Yl,exports.createShellCommandModule=Ql,exports.createSkillsCommandEntry=cu,exports.createSkillsCommandModule=du,exports.createStatusLineCommandEntry=hu,exports.createStatusLineCommandModule=vu,exports.createTerminalClientCommands=rd,exports.createThemeCommandEntry=Du,exports.createThemeCommandModule=ku,exports.createUserLocalCommandEntry=Zu,exports.createUserLocalCommandModule=ed,exports.createValidateSessionCommandEntry=Nl,exports.doctorRepairAllowlist=Ht,exports.ensureProviderConfig=Zs,exports.executeAdvisorCommand=wn,exports.executeAgentCommand=se,exports.executeBackgroundCommand=ge,exports.executeClearCommand=vl,exports.executeCompactCommand=Se,exports.executeContextCommand=Le,exports.executeCostCommand=El,exports.executeEditorCommand=_n,exports.executeEffortCommand=Fn,exports.executeExitCommand=Vn,exports.executeGitCommand=gr,exports.executeGoalCommand=Sr,exports.executeHandoffCommand=kr,exports.executeHelpCommand=Fr,exports.executeLanguageCommand=Gr,exports.executeLoopCommand=Kc,exports.executeMCPActivationCommand=pi,exports.executeMemoryCommand=Ri,exports.executeModeCommand=qi,exports.executeModelCommand=ta,exports.executeMonitorCommand=il,exports.executeOutputStyleCommand=wa,exports.executePermissionsCommand=Gi,exports.executePluginCommand=yo,exports.executePresetCommand=No,exports.executeProviderCommand=Is,exports.executeReloadPluginsCommand=bo,exports.executeRemoteControlCommand=ic,exports.executeRenameCommand=yl,exports.executeResetCommand=lc,exports.executeResumeCommand=bl,exports.executeRewindCommand=Oc,exports.executeSandboxCommand=ma,exports.executeScheduleCommand=nl,exports.executeShellCommand=Jl,exports.executeSkillsCommand=su,exports.executeStatusLineCommand=mu,exports.executeThemeCommand=Eu,exports.executeUserLocalCommand=Xu,exports.executeUserLocalDirectCommand=Yu,exports.executeValidateSessionCommand=Dl,exports.formatProviderSetupChoiceLabel=Ko,exports.formatProviderSetupHelpLinks=qo,exports.formatProviderSetupPromptLabel=Wo,exports.formatProviderSetupSelectionPrompt=zo,exports.formatSandboxStatus=fa,exports.getProviderSetupStep=Vo,Object.defineProperty(exports,"gitEnvironment",{enumerable:!0,get:function(){return e.gitEnvironment}}),exports.isDoctorRepairId=Ut,exports.mcpUnavailableServersNotice=ei,exports.mcpUserActionCommand=Xr,exports.mcpUserActionNotice=$r,exports.parseScheduleSpec=Zc,exports.planDoctorRepair=Kt,exports.redactDiagnosticText=xt,exports.renderDoctorReport=mt,exports.resolveCommandOnPath=lt,exports.resolveEditor=hn,exports.resolveProviderSetupSelection=Bo,exports.resolveShell=Kl,exports.runDoctor=cn,exports.runProviderSetupPromptFlow=Uo,exports.runProviderStartupSetup=Xs,exports.spawnInherited=M,exports.submitProviderSetupValue=Ho,exports.validateProviderSetupValue=Yo;