@robota-sdk/agent-command 3.0.0-beta.92 → 3.0.0-beta.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/node/index.cjs +78 -75
- package/dist/node/index.d.cts +13 -4
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.ts +13 -4
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +83 -80
- package/dist/node/index.js.map +1 -1
- package/package.json +7 -7
- package/src/default/default-command-modules.ts +15 -1
- package/src/model/model-command.ts +41 -16
- package/src/provider/__tests__/provider-connection-setup.test.ts +567 -0
- package/src/provider/__tests__/provider-reference-switch.test.ts +113 -0
- package/src/provider/provider-command-execution.ts +23 -5
- package/src/provider/provider-command-module.ts +8 -2
- package/src/provider/provider-command-profile-operations.ts +60 -12
- package/src/provider/provider-command-profile.ts +8 -0
- package/src/provider/provider-command-setup.ts +11 -60
- package/src/provider/provider-connection-setup.ts +287 -0
- package/src/provider/provider-connection-validation.ts +38 -0
- package/src/provider/provider-onboarding.ts +11 -2
- package/src/provider/provider-prompt-interaction.ts +28 -0
- package/src/provider/provider-setup-ask.ts +67 -0
- package/src/provider/provider-setup-flow.ts +5 -1
- package/src/provider/provider-startup.ts +63 -8
package/dist/node/index.js
CHANGED
|
@@ -1,82 +1,84 @@
|
|
|
1
|
-
import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_COMMAND_DESCRIPTION as n,COST_COMMAND_DESCRIPTION as r,DEFAULT_AGENT_TYPE as i,DEFAULT_AUTO_COMPACT_THRESHOLD as a,DEFAULT_STATUS_LINE_COMMAND_SETTINGS as o,EFFORT_LEVEL_LABELS as s,EXIT_COMMAND_DESCRIPTION as c,EditCheckpointsUnavailableError as l,GIT_STATUS_ARGS as u,HELP_COMMAND_DESCRIPTION as d,LANGUAGE_COMMAND_ARGUMENT_HINT as f,LANGUAGE_COMMAND_DESCRIPTION as p,MEMORY_COMMAND_ARGUMENT_HINT as m,MEMORY_COMMAND_DESCRIPTION as h,MEMORY_COMMAND_USAGE as g,MonitorCommandRefusedError as _,PERMISSIONS_COMMAND_DESCRIPTION as v,PERMISSION_MODE_ARGUMENT_HINT as y,PERMISSION_MODE_COMMAND_DESCRIPTION as
|
|
2
|
-
`),success:!0,data:{agents:t.length,jobs:n.length}}}function Qn(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 $n(e,t){let n=Vn(t,Kn(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await Jn(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 er(e,t){let n=t.includes(`--wait`)||!t.includes(`--detach`),r=Hn(t.filter(e=>e!==`--wait`&&e!==`--detach`),Kn(e));if(r.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let i=r.map(t=>qn(e,t.agentType)).find(e=>e!==void 0);if(i)return i;let a;try{a=await Promise.all(r.map(t=>e.spawnAgentJob(t)))}catch(e){return{message:Gn(e),success:!1}}let o=e.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:a.map(e=>e.id),label:`agent parallel`});if(n){let t=
|
|
3
|
-
`),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id}}}async function tr(e,t){let[n]=t;if(!n)return{message:`Usage: agent wait GROUP_ID`,success:!1};let r=
|
|
1
|
+
import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_COMMAND_DESCRIPTION as n,COST_COMMAND_DESCRIPTION as r,DEFAULT_AGENT_TYPE as i,DEFAULT_AUTO_COMPACT_THRESHOLD as a,DEFAULT_STATUS_LINE_COMMAND_SETTINGS as o,EFFORT_LEVEL_LABELS as s,EXIT_COMMAND_DESCRIPTION as c,EditCheckpointsUnavailableError as l,GIT_STATUS_ARGS as u,HELP_COMMAND_DESCRIPTION as d,LANGUAGE_COMMAND_ARGUMENT_HINT as f,LANGUAGE_COMMAND_DESCRIPTION as p,MEMORY_COMMAND_ARGUMENT_HINT as m,MEMORY_COMMAND_DESCRIPTION as h,MEMORY_COMMAND_USAGE as g,MonitorCommandRefusedError as _,PERMISSIONS_COMMAND_DESCRIPTION as v,PERMISSION_MODE_ARGUMENT_HINT as y,PERMISSION_MODE_COMMAND_DESCRIPTION as b,PLUGIN_COMMAND_ARGUMENT_HINT as x,PLUGIN_COMMAND_DESCRIPTION as S,ProviderConfigError as ee,RELOAD_PLUGINS_COMMAND_DESCRIPTION as te,RENAME_COMMAND_DESCRIPTION as ne,RENAME_COMMAND_USAGE as re,RESUME_COMMAND_DESCRIPTION as ie,REWIND_COMMAND_ARGUMENT_HINT as ae,REWIND_COMMAND_DESCRIPTION as oe,STATUSLINE_COMMAND_ARGUMENT_HINT as se,STATUSLINE_COMMAND_DESCRIPTION as ce,SettingsParseError as le,SkillCommandSource as ue,VALIDATE_SESSION_COMMAND_DESCRIPTION as de,WorkspaceAuthorityRequiredError as fe,addCommandContextReference as pe,applyPresetToSession as me,applyProviderConfiguration as he,approvePendingMemoryCandidate as ge,buildBackgroundCommandSubcommands as _e,buildLanguageCommandSubcommands as ve,buildMemoryCommandSubcommands as ye,buildModelListSnapshot as be,buildPermissionModeSubcommands as xe,buildPluginCommandSubcommands as Se,buildProviderSetupPatch as Ce,buildRewindCommandSubcommands as we,buildStatusLineCommandSubcommands as Te,cancelCommandBackgroundTask as Ee,checkSettingsDocument as De,clearCommandContextReferences as Oe,clearConversationHistory as ke,closeCommandBackgroundTask as Ae,compactCommandContext as je,createCommandMemoryStores as Me,createGitProcess as Ne,createGitProcess as Pe,createSessionExitHostAction as Fe,createSessionRenameHostAction as Ie,createShowPluginManagerIntent as Le,createShowSessionPickerIntent as Re,deleteProviderProfile as ze,deleteUserLocalMemoryItem as Be,disableUserLocalMemoryItem as Ve,executeGitDiff as He,executeGitStatus as Ue,findUnknownModuleNames as We,forkCommandEditCheckpoint as Ge,formatCommandBackgroundTaskList as Ke,formatCommandHelpMessage as qe,formatCommandPermissionsMessage as Je,formatCommandSessionReplayValidationReport as Ye,formatInvalidPermissionModeMessage as Xe,formatLanguageUsageMessage as Ze,formatOrgPolicyViolationMessage as C,gitEnvironment as Qe,gitFailureMessage as $e,hasSensitiveCommandMemoryContent as et,inspectCommandEditCheckpoint as tt,inspectSettingsLayers as nt,inspectSkillSources as rt,inspectUserLocalMemoryItem as it,inspectUserLocalStorage as at,isApiKeyPlaintext as ot,isCommandMemoryType as st,isGoalCancelVerb as ct,isLoopStopVerb as lt,isPermissionMode as ut,listCommandBackgroundTasks as dt,listCommandContextReferences as ft,listCommandEditCheckpointBranches as pt,listCommandEditCheckpoints as mt,listCommandUsedMemoryReferences as ht,listUserLocalMemoryItems as gt,loadHostBundlePluginInspectionFromScopes as _t,mergeProviderPatch as vt,parseCommandBackgroundLogCursor as yt,parseLanguageArgument as bt,parseModelEffort as xt,parsePermissionModeArgument as St,parseSessionNameArgument as Ct,parseStatusPorcelainV2 as wt,readAutoCompactThreshold as Tt,readAutoCompactThresholdSource as Et,readCommandBackgroundTaskLog as Dt,readCommandContextState as Ot,readCommandPermissionMode as kt,readCommandPermissionsState as At,readCommandSessionInfo as jt,readMergedProviderSettings as Mt,readProviderSettings as Nt,recordCommandMemoryEvent as Pt,removeCommandContextReference as Ft,resetAutoCompactThresholdSetting as It,resolveEnvDefaultProvider as Lt,resolveModelEffort as Rt,resolveModelListSelection as zt,resolvePluginCommandAdapter as Bt,resolveProviderSettingsWriteTarget as Vt,restoreCommandEditCheckpoint as Ht,retryCommandPermissionDenial as Ut,rollbackCommandEditCheckpoint as Wt,sanitizeProviderProfileName as Gt,selectCommandModules as Kt,setCommandAutoCompactThreshold as qt,setCurrentProvider as Jt,setUserLocalMemoryItem as Yt,suggestProviderProfileName as Xt,summarizeBackgroundJobGroup as Zt,switchCommandEditCheckpointBranch as Qt,testProviderProfileCommand as $t,upsertProviderProfile as en,validateCommandSessionReplayLog as tn,validateProviderProfile as nn,writeAutoCompactThresholdSetting as rn,writeCommandPermissionMode as an,writeSettings as on}from"@robota-sdk/agent-framework";import{CONTEXT_ESTIMATE_CHARS_PER_TOKEN as sn,ENV_REFERENCE_PREFIX as cn,MODEL_EFFORT_VALUES as ln,calculateModelCost as un,confirmAction as w,estimateToolSchemaTokens as dn,findProviderDefinition as T,formatSupportedProviderTypes as E,isConfirmed as D,isEnvReference as fn,normalizeProviderConfig as pn,resolvePlatformShell as mn,selectAction as O,shellArgumentForDisplay as k,textAction as hn}from"@robota-sdk/agent-core";import{accessSync as gn,constants as _n,existsSync as vn,mkdtempSync as yn,readFileSync as bn,rmSync as xn,statSync as Sn,writeFileSync as Cn}from"node:fs";import{createConnection as wn}from"node:net";import{basename as Tn,delimiter as En,dirname as Dn,isAbsolute as On,join as kn}from"node:path";import{ensureOwnerOnlyDirectory as An,ownerOnlyGuarantee as jn}from"@robota-sdk/agent-core/node";import{constants as Mn,tmpdir as Nn}from"node:os";import{spawn as Pn}from"node:child_process";import{createPresetRegistry as Fn}from"@robota-sdk/agent-preset";import{createHash as In,randomUUID as Ln}from"node:crypto";function Rn(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 zn(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 Bn(e,t,n,r){return{agentType:t,label:n,mode:`background`,prompt:r,...e.model?{model:e.model}:{},...e.isolation?{isolation:e.isolation}:{}}}function Vn(e,t){let n=zn(e),[r,...a]=n.positional,o=n.agentType??i,s=n.positional;!n.agentType&&r&&t.has(r)&&(o=r,s=a);let c=s.join(` `).trim();if(c)return Bn(n,o,o,c)}function Hn(e,t){let n=zn(e);return n.positional.map(e=>Un(e,n,t)).filter(e=>e!==void 0)}function Un(e,t,n){let r=e.indexOf(`=`);if(r>0)return Wn(e.slice(0,r),e.slice(r+1),t,n);let a=e.indexOf(`:`);if(a<=0||a===e.length-1)return;let o=e.slice(0,a),s=e.slice(a+1);return Bn(t,t.agentType??(n.has(o)?o:i),o,s)}function Wn(e,t,n,r){let a=t.indexOf(`:`);if(a===-1)return Bn(n,n.agentType??(r.has(e)?e:i),e,t);if(a!==0&&a!==t.length-1)return Bn(n,t.slice(0,a),e,t.slice(a+1))}function Gn(e){return e instanceof Error?e.message:String(e)}function Kn(e){return new Set(e.listAgentDefinitions().map(e=>e.name))}function qn(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 Jn(e,t){let n=qn(e,t.agentType);if(n)return n;try{return{state:await e.spawnAgentJob(t)}}catch(e){return{message:Gn(e),success:!1}}}function Yn(){return{message:``,uiIntents:[{type:`show-agent-switcher`}],success:!0}}function Xn(e,t){return e.setDefaultAgentType(t),{message:`Default agent: ${t}`,success:!0,data:{agentType:t}}}async function Zn(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=>` ${Qn(e)}`)].join(`
|
|
2
|
+
`),success:!0,data:{agents:t.length,jobs:n.length}}}function Qn(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 $n(e,t){let n=Vn(t,Kn(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await Jn(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 er(e,t){let n=t.includes(`--wait`)||!t.includes(`--detach`),r=Hn(t.filter(e=>e!==`--wait`&&e!==`--detach`),Kn(e));if(r.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let i=r.map(t=>qn(e,t.agentType)).find(e=>e!==void 0);if(i)return i;let a;try{a=await Promise.all(r.map(t=>e.spawnAgentJob(t)))}catch(e){return{message:Gn(e),success:!1}}let o=e.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:a.map(e=>e.id),label:`agent parallel`});if(n){let t=Zt(await e.waitBackgroundJobGroup(o.id));return{message:sr(t),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id,summary:t}}}return{message:[`Started agent jobs:`,...a.map(e=>`${e.label}: ${e.id}`)].join(`
|
|
3
|
+
`),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id}}}async function tr(e,t){let[n]=t;if(!n)return{message:`Usage: agent wait GROUP_ID`,success:!1};let r=Zt(await e.waitBackgroundJobGroup(n));return{message:sr(r),success:!0,data:{groupId:n,summary:r}}}async function nr(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
4
|
`)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function rr(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 ir(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 ar(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 or(e,t){try{if(t.trim()===``)return Yn();let[n=`list`,...r]=Rn(t);return n===`list`&&r.length===0?Zn(e):n===`run`?$n(e,r):n===`parallel`?er(e,r):n===`wait`?tr(e,r):n===`read`||n===`open`?nr(e,r):n===`send`?rr(e,r):n===`stop`||n===`cancel`?ir(e,r):n===`close`?ar(e,r):r.length===0&&Kn(e).has(n)?Xn(e,n):$n(e,[n,...r])}catch(e){return{message:Gn(e),success:!1}}}function sr(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 cr(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function lr(){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 ur(){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:lr()}}function dr(){let e=ur();return{name:e.name,semanticRole:`subagentSpawn`,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>or(cr(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 fr=class{name=`agent`;getCommands(){return[ur()]}};function pr(){return{name:`agent-command-agent`,commandSources:[new fr],systemCommands:[dr()],sessionRequirements:[`runtime`]}}function mr(e){return e.trim().split(/\s+/).filter(Boolean)}async function hr(e,n){let[r=`list`,i,...a]=mr(n);if(r===`list`){let t=
|
|
6
|
-
`)}${n}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:t.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await
|
|
7
|
-
`),success:!0,data:{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}}}function Sr(){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 Cr(){let e=Sr();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:xr}}var wr=class{name=`compact`;getCommands(){return[Sr()]}};function Tr(){return{name:`agent-command-compact`,commandSources:[new wr],systemCommands:[Cr()]}}function Er(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function Dr(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${Er(e)} (${t})`}function Or(e){return Math.ceil(e/
|
|
8
|
-
`)}function Ir(e){let t=
|
|
9
|
-
`):
|
|
10
|
-
`);return{success:!0,message:[`Context: ${t.usedTokens.toLocaleString()} / ${t.maxTokens.toLocaleString()} tokens (${Math.round(t.usedPercentage)}%)`,Dr(n,r),``,Fr(`System prompt (active every turn)`,p,u.map(
|
|
11
|
-
`),data:{references:l,history:{turnCount:c.turnCount,toolResults:c.toolResults},toolSchemaTokens:s}}}const
|
|
12
|
-
`);function Lr(e){return e?`settings`:`current session only`}async function Rr(e,t){let n=t.trim().split(/\s+/).filter(e=>e.length>0);if(n.length>0)return zr(e,n);let r=
|
|
13
|
-
`),success:!0,data:{usedTokens:r.usedTokens,maxTokens:r.maxTokens,percentage:r.usedPercentage,autoCompactThreshold:i,autoCompactThresholdSource:a,references:s}}}async function zr(e,t){let[n,...r]=t;if(n===`list`)return r.length>0?{success:!1,message:
|
|
14
|
-
`),data:{autoCompactThreshold:t,autoCompactThresholdSource:n}}}if(n===`on`)return Ur(e,a,`enabled`);if(n===`off`)return Ur(e,!1,`disabled`);if(n===`reset`){let t=
|
|
5
|
+
`)}function cr(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function lr(){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 ur(){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:lr()}}function dr(){let e=ur();return{name:e.name,semanticRole:`subagentSpawn`,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>or(cr(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 fr=class{name=`agent`;getCommands(){return[ur()]}};function pr(){return{name:`agent-command-agent`,commandSources:[new fr],systemCommands:[dr()],sessionRequirements:[`runtime`]}}function mr(e){return e.trim().split(/\s+/).filter(Boolean)}async function hr(e,n){let[r=`list`,i,...a]=mr(n);if(r===`list`){let t=dt(e);return{message:Ke(t),success:!0,data:{count:t.length}}}if(!i)return{message:t,success:!1};if(r===`read`||r===`log`||r===`open`){let t=await Dt(e,i,yt(a[0])),n=t.nextCursor?`\nNext offset: ${t.nextCursor.offset}`:``;return{message:t.lines.length>0?`${t.lines.join(`
|
|
6
|
+
`)}${n}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:t.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await Ee(e,i,a.join(` `)||void 0),{message:`Background task cancelled: ${i}`,success:!0,data:{taskId:i}}):r===`close`||r===`dismiss`?(await Ae(e,i),{message:`Background task closed: ${i}`,success:!0,data:{taskId:i}}):{message:`Unknown background action: ${r}`,success:!1}}function gr(){return{name:`background`,displayName:`Background Tasks`,description:e,source:`background`,modelInvocable:!1,subcommands:_e()}}function _r(){let e=gr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,subcommands:e.subcommands,execute:hr}}var vr=class{name=`background`;getCommands(){return[gr()]}};function yr(){return{name:`agent-command-background`,commandSources:[new vr],systemCommands:[_r()]}}function br(e){let t=e.trim();return t.length>0?t:void 0}async function xr(e,t){let{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}=await je(e,br(t)),o=i-a;return{message:[`Context compacted.`,` Removed messages: ${o} (${i>0?Math.round(o/i*100):0}% of total)`,` Context: ${Math.round(n.usedPercentage)}% → ${Math.round(r.usedPercentage)}%`].join(`
|
|
7
|
+
`),success:!0,data:{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}}}function Sr(){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 Cr(){let e=Sr();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:xr}}var wr=class{name=`compact`;getCommands(){return[Sr()]}};function Tr(){return{name:`agent-command-compact`,commandSources:[new wr],systemCommands:[Cr()]}}function Er(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function Dr(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${Er(e)} (${t})`}function Or(e){return Math.ceil(e/sn)}function A(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${Or(e.byteLength).toLocaleString()} tokens`].join(` `)}function kr(e){try{return JSON.parse(e)}catch{return null}}function Ar(e){let t=kr(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 jr(e){let t=0,n=0,r=0,i=0,a=0,o=0,s=0;for(let c of e){let e=Math.ceil(JSON.stringify(c).length/sn);c.role===`system`?t+=e:c.role===`user`?(n+=e,r++):c.role===`assistant`?(i+=e,a++):c.role===`tool`&&(o+=e,s++)}return{systemTokens:t,userTokens:n,userCount:r,assistantTokens:i,assistantCount:a,toolTokens:o,toolCallCount:s,totalTokens:t+n+i+o}}function Mr(e){return Pr(e.filter(e=>e.category===`chat`).map(e=>({type:e.type,data:e.data})))}function Nr(e){return Pr(e.map(e=>({type:e.role,data:e})))}function Pr(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:Ar(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 Fr(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 Ir(e){let t=Ot(e),n=Tt(e),r=Et(e),i=e.getSession().getHistory(),a=jr(i),o=e.getSession().getOfferedToolSchemas(),s=dn(o),c=Nr(i),l=ft(e),u=l.filter(e=>e.loadType===`system`),d=l.filter(e=>e.loadType===`manual`),f=l.filter(e=>e.loadType===`prompt-reference`),p=u.reduce((e,t)=>e+Or(t.byteLength),0),m=d.reduce((e,t)=>e+Or(t.byteLength),0),h=f.reduce((e,t)=>e+Or(t.byteLength),0),g=c.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${c.turnCount} turn${c.turnCount===1?``:`s`} | ~${a.totalTokens.toLocaleString()} tokens`,_=c.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),v=c.toolResults.length,y=c.totalToolCallCount,b=y===0?`Tool results (0): (none)`:v<y?`Tool results (${v} unique / ${y} calls, ~${a.toolTokens.toLocaleString()} tokens):`:`Tool results (${v}, ~${a.toolTokens.toLocaleString()} tokens):`,x=c.turnCount===0?[]:[`User (${a.userCount}): ~${a.userTokens.toLocaleString()} tokens`,`Assistant (${a.assistantCount}): ~${a.assistantTokens.toLocaleString()} tokens`,...a.systemTokens>0?[`System messages: ~${a.systemTokens.toLocaleString()} tokens`]:[],y>0?[b,..._.map(e=>` ${e}`)].join(`
|
|
9
|
+
`):b],S=c.turnCount===0?`${g}:\n (none)`:[`${g}:`,...x.map(e=>` ${e}`)].join(`
|
|
10
|
+
`);return{success:!0,message:[`Context: ${t.usedTokens.toLocaleString()} / ${t.maxTokens.toLocaleString()} tokens (${Math.round(t.usedPercentage)}%)`,Dr(n,r),``,Fr(`System prompt (active every turn)`,p,u.map(A)),``,Fr(`Tool schemas (sent every turn)`,s,o.map(e=>e.name)),``,S,``,Fr(`Manually added`,m,d.map(A)),``,Fr(`Prompt references (@-syntax)`,h,f.map(A))].join(`
|
|
11
|
+
`),data:{references:l,history:{turnCount:c.turnCount,toolResults:c.toolResults},toolSchemaTokens:s}}}const j=[`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 Lr(e){return e?`settings`:`current session only`}async function Rr(e,t){let n=t.trim().split(/\s+/).filter(e=>e.length>0);if(n.length>0)return zr(e,n);let r=Ot(e),i=Tt(e),a=Et(e),o=Mr(e.getSession().getFullHistory()),s=ft(e);return{message:[`Context: ${r.usedTokens.toLocaleString()} / ${r.maxTokens.toLocaleString()} tokens (${Math.round(r.usedPercentage)}%)`,Dr(i,a),Kr(s),`History: ${o.turnCount} turn${o.turnCount===1?``:`s`}`].join(`
|
|
13
|
+
`),success:!0,data:{usedTokens:r.usedTokens,maxTokens:r.maxTokens,percentage:r.usedPercentage,autoCompactThreshold:i,autoCompactThresholdSource:a,references:s}}}async function zr(e,t){let[n,...r]=t;if(n===`list`)return r.length>0?{success:!1,message:j}:Ir(e);if(n===`add`)return Vr(e,r);if(n===`remove`)return Hr(e,r);if(n===`clear`){if(r.length>0)return{success:!1,message:j};let t=Oe(e);return{success:!0,message:`Context references cleared: ${t.removed.length} removed.`,data:{removed:t.removed}}}return n===`auto`?Br(e,r):{success:!1,message:j}}function Br(e,t){let[n,r]=t;if(r!==void 0)return{success:!1,message:j};if(n===void 0){let t=Tt(e),n=Et(e);return{success:!0,message:[Dr(t,n),j].join(`
|
|
14
|
+
`),data:{autoCompactThreshold:t,autoCompactThresholdSource:n}}}if(n===`on`)return Ur(e,a,`enabled`);if(n===`off`)return Ur(e,!1,`disabled`);if(n===`reset`){let t=It(e);return qt(e,a,`default`),{success:!0,message:`Auto compact reset to default: ${Er(a)} (${Lr(t)}).`,data:{autoCompactThreshold:a,autoCompactThresholdSource:`default`,persisted:t}}}let i=Gr(n);return i.success?Ur(e,i.threshold,`threshold set`):{success:!1,message:`${i.message}\n${j}`}}async function Vr(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:j};let r=await pe(e,n);return r.reference?{success:!0,message:[`Context reference added: ${A(r.reference)}.`,...r.evicted.length>0?[`Evicted ${r.evicted.length} older context reference(s).`]:[]].join(`
|
|
15
15
|
`),data:{reference:r.reference,evicted:r.evicted}}:{success:!1,message:r.diagnostics.join(`
|
|
16
|
-
`)||`Context reference not found: ${n}`,data:{diagnostics:r.diagnostics}}}function Hr(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:
|
|
17
|
-
`)}}function ri(e){return e.getCommandInvocationSource()===`user`}async function
|
|
18
|
-
`));case`recover`:return
|
|
19
|
-
`));case`revoke`:return o.length===0?{success:!1,message:`Usage: /devices revoke <device-id>`}:
|
|
20
|
-
`));case`join`:return
|
|
21
|
-
`));default:return{success:!1,message:`Unknown argument "${a}". Usage: /devices [list|init [name]|add|join [name]|revoke <device-id>|recover]`}}}var ai=class{name=`devices`;getCommands(){return[Zr()]}};function oi(e){let t=k(Zr(),{requiresPermission:!1,lifecycle:`inline`,execute:(t,n)=>ii(e,t,n)});return{name:`agent-command-devices`,commandSources:[new ai],systemCommands:[t]}}const si=3e3;function ci(e,t){return new Promise(n=>{let r=Date.now(),i=wn({host:e,port:t}),a=setTimeout(()=>{i.destroy(),n({reachable:!1,error:`timeout (${si/1e3}s)`})},si);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({reachable:!0,elapsedMs:Date.now()-r})}),i.on(`error`,e=>{clearTimeout(a),n({reachable:!1,error:e.message})})})}function li(e){if(!vn(e))return{exists:!1,isDirectory:!1,writable:!1};let t;try{t=Sn(e)}catch{return{exists:!0,isDirectory:!1,writable:!1}}let n=t.isDirectory(),r=t.mode&511,i=!1;try{gn(e,_n.W_OK),i=!0}catch{i=!1}return{exists:!0,isDirectory:n,writable:i,mode:r}}function ui(e,t=process.env){let n=e.trim().split(/\s+/)[0];if(n===void 0||n.length===0)return!1;if(On(n)||n.includes(`/`))return vn(n);let r=process.platform===`win32`?[``,`.exe`,`.cmd`,`.bat`]:[``];return(t.PATH??``).split(En).filter(e=>e.length>0).some(e=>r.some(t=>vn(kn(e,n+t))))}function di(e=process.env){return{probeEndpoint:ci,inspectPath:li,resolveCommand:t=>ui(t,e),ownerOnlyGuarantee:()=>jn()}}const fi={ok:`✓`,warn:`⚠`,fail:`✗`,"not-configured":`○`,"not-probed":`–`};function pi(e,t){let n=[` ${fi[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 mi(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 hi(e,t=`Doctor`,n={}){let r=[``,t,``,...e.checks.flatMap(e=>pi(e,n)),``,mi(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 M=`[redacted]`,gi=/(\b[a-z][a-z0-9+.-]{0,31}:\/\/)([^\s/@]+)@/gi,_i=/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,vi=/\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,yi=/\.\.\."[^"]*"\.\.\./g;function bi(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function xi(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(bi(e),`g`),M));return n=n.replace(gi,`$1${M}@`),n=n.replace(_i,`$1 ${M}`),n=n.replace(vi,M),n}function Si(e){return e instanceof fe?`${e.name}: ${e.filePath} is not valid JSON (see the settings check)`:`${e.name}: ${e.message.replace(yi,`…`)}`}function Ci(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 wi(e){let t=Tn(Dn(e.kind===`host`?e.path:e.relativePath)).replace(/^\./,``);return`settings.${e.scope}.${t}`}function Ti(e){let t=e.settingsSources.find(t=>t.kind===`host`&&t.path===e.userSettingsPath);return t===void 0?void 0:wi(t)}function Ei(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 Di(e,t){return e.source.kind===`host`&&e.source.path===t.userSettingsPath&&e.state===`empty`}function Oi(e,t){let n=wi(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=Di(e,t);return{id:n,label:`Settings layer`,status:`fail`,path:r,cause:Ei(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 ki(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 Ai(e){let t=at(e.settingsSources);return{inspection:t,checks:[...t.layers.map(t=>Oi(t,e)),ki(t)]}}function ji(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 Mi(e,t){let n=S(t.providerDefinitions,e.name),r=e.baseURL??n?.defaults?.baseURL;if(r!==void 0)try{let t=new URL(r),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 i=n?.endpoint;return i===void 0?void 0:{...i,origin:`definition endpoint`}}async function Ni(e,t,n){let r=Mi(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 Pi(e,t){let n;try{n=It(e.settingsSources,{providerDefinitions:e.providerDefinitions,env:{...e.env}})}catch(t){return{checks:[{id:`provider.resolution`,label:`Provider`,status:`fail`,cause:Si(t instanceof Error?t:Error(String(t))),detail:[e.diagnosticGuidance?.providerResolution??`Configure a provider or set its API key environment variable.`]}]}}return{checks:[ji(n),await Ni(n,e,t)],...n.apiKey===void 0?{}:{resolvedApiKey:n.apiKey}}}function Fi(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 Ii(e,t){let{root:n,sessions:r}=e.userStorage,i={id:`storage.user`,label:`User storage`,path:n};switch(Fi(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 Li(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 Ri(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 zi(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 Bi(e,t,n){let r=zi(n);return[Ri(e),Ii(e,t),Li(e,t),...r===void 0?[]:[r]]}const Vi=`storage.user`;function Hi(e){let t=Ti(e);return t===void 0?[Vi]:[t,Vi]}function Ui(e,t){return Hi(t).includes(e)}function Wi(e,t){let n=at(t.settingsSources).layers.find(t=>wi(t.source)===e);return n===void 0||n.source.kind!==`host`?{ok:!1,reason:`${e}: no user settings layer in this composition`}:Di(n,t)?{ok:!0,plan:{id:e,description:`rewrite the empty user settings file as {}`,path:n.source.path}}:{ok:!1,reason:`${e}: state is ${n.state}; only an empty file is rewritten`}}function Gi(e,t){let n=Fi(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 Ki(e,t,n){return Ui(e,t)?e===`storage.user`?Gi(t,n):Wi(e,t):{ok:!1,reason:`${e}: not a repairable check (allowlist: ${Hi(t).join(`, `)})`}}async function qi(e,t,n,r){let i=Ki(e,t,n);if(!i.ok)return{applied:!1,reason:i.reason};if(!await r(i.plan))return{applied:!1,reason:`${e}: repair not confirmed; nothing written`};let a=Ki(e,t,n);if(!a.ok)return{applied:!1,reason:`${a.reason} (state changed before the write)`};if(a.plan.id===`storage.user`){let{root:e,sessions:n}=t.userStorage;An(n,{withinRoot:e})}else ln(a.plan.path,{});return{applied:!0,plan:a.plan}}const Ji={"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 Yi(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:Ji[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 Xi(e){let t=ot(e.contributionSources,e.skillRoots).roots.filter(e=>e.present),n=t.reduce((e,t)=>e+t.discovered.length,0),r=[t.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:`${n} discovered`,detail:t.map(e=>`${e.sourceDisplayName}: ${e.root} (${e.discovered.length})`)}];for(let e of t)for(let t of e.skipped)r.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 r}function Zi(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 Qi(e,t,n){let r=Zi(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 $i(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 ea(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($i(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 ta(e,t,n){let r,i;try{r=bt(e.pluginsDirs,{settingsPath:e.userSettingsPath})}catch(t){i=t instanceof Error?t.message:String(t),r=bt(e.pluginsDirs,{enabledPlugins:{}})}return[...Yi(r).map(e=>i!==void 0&&e.id===`plugins`?{...e,status:`fail`,cause:`no plugin loads: ${i}`}:e),...Xi(e),...Qi(n,r,t),...ea(e,r,t)]}function na(e,t,n){return{id:e,label:t,status:`fail`,cause:Si(n)}}async function ra(e,t,n,r){try{return r(await n())}catch(n){return[na(e,t,n instanceof Error?n:Error(String(n)))]}}function ia(e,t){let n=e=>xi(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 aa(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 oa(e){try{let t=Ai(e);return{checks:t.checks,result:t}}catch(e){return{checks:[na(`settings`,`Settings`,e instanceof Error?e:Error(String(e)))]}}}async function sa(e,t){let n=[...e.hostChecks];e.compositionFailure!==void 0&&n.push(e.compositionFailure);let r=oa(e);n.push(...r.checks);let i=r.result?.inspection,a=Ci((i?.layers??[]).map(e=>e.settings),e.env);return n.push(...await ra(`provider`,`Provider`,()=>Pi(e,t),e=>(e.resolvedApiKey!==void 0&&a.push(e.resolvedApiKey),e.checks))),i!==void 0&&(n.push(...await ra(`storage`,`Storage`,()=>Bi(e,t,i),e=>e)),n.push(...await ra(`extensions`,`Extensions`,()=>ta(e,t,i),e=>e))),aa(n.map(e=>ia(e,a)))}function ca(){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 la=class{name=`doctor`;getCommands(){return[ca()]}};async function ua(e,t){let n=e.getUserInteraction();if(n===void 0)return!1;let r=await n.ask(x(`doctor-repair:${t.id}`,`Repair ${t.id}?`,{description:`${t.description} (${t.path})`,defaultYes:!1}));return r.type===`answer`&&r.values[0]===`yes`}async function da(e,t,n,r,i){let a=await qi(e,t,n,e=>ua(r,e));if(!a.applied)return{success:!1,message:a.reason,data:{repair:e,applied:!1}};let o=await sa(t,n),s=o.checks.find(t=>t.id===e);return{success:!0,message:[`Repaired ${e}: ${a.plan.description}.`,...hi(o,`${i.title??`Doctor`} (after repair)`,i)].join(`
|
|
22
|
-
`),data:{repair:e,applied:!0,status:s?.status,exitCode:o.exitCode}}}async function
|
|
23
|
-
`),data:{failCount:s.failCount,warnCount:s.warnCount,repairable:[...s.repairable]}}}function
|
|
24
|
-
`)}function
|
|
16
|
+
`)||`Context reference not found: ${n}`,data:{diagnostics:r.diagnostics}}}function Hr(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:j};let r=Ft(e,n);return r.removed?{success:!0,message:`Context reference removed: ${A(r.removed)}.`,data:{removed:r.removed}}:{success:!1,message:`Context reference not found: ${n}`}}function Ur(e,t,n){let r=rn(e,t),i=r?`settings`:`session`;return qt(e,t,i),{success:!0,message:Wr(n,t,r),data:{autoCompactThreshold:t,autoCompactThresholdSource:i,persisted:r}}}function Wr(e,t,n){let r=Lr(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${Er(t)} (${r}).`:`Auto compact threshold set to ${Er(t)} (${r}).`}function Gr(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 Kr(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function M(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 qr(){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 Jr(){return M(qr(),{requiresPermission:!1,lifecycle:`inline`,execute:Rr})}var Yr=class{name=`context`;getCommands(){return[qr()]}};function Xr(){return{name:`agent-command-context`,commandSources:[new Yr],systemCommands:[Jr()]}}function Zr(){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 Qr={"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 N(e){return e.slice(0,10)}function $r(e){return new Date(e).toISOString().slice(0,10)}function ei(e){return{success:!1,message:Qr[e]}}function ti(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=>` ${N(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 ni(e,t){if(e===void 0)return{success:!0,message:Qr[`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` ${N(e.deviceId)} ${e.name}${n} certificate expires ${$r(e.certificateExpiresAt)}`});return{success:!0,message:[`Devices of user ${N(e.userId)}:`,...n,`${e.revokedDeviceCount} revoked. Roster and revocation list valid until ${new Date(e.listsExpireAt).toISOString()}.`,...t===void 0?[]:ti(t)].join(`
|
|
17
|
+
`)}}function ri(e){return e.getCommandInvocationSource()===`user`}async function ii(e,t,n){if(!e.canHandoffTerminal())return ei(`no-terminal`);try{let r=await e.runWithTerminal(t);return r.ok?{success:!0,message:n(r.value)}:ei(r.reason)}catch(e){return{success:!1,message:`Device identity operation failed: ${e instanceof Error?e.message:`unknown error`}`}}}async function ai(e,t,n){if(!ri(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 ni(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 ii(t,()=>e.init(o.length>0?{name:o}:{}),e=>[`Device identity created. This device: ${N(e.deviceId)}; user ${N(e.userId)}.`,`It holds signing key ${N(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 ii(t,()=>e.recover(),e=>[`Recovered. New signing key ${N(e.signingKeyId)}; ${e.revokedSigningKeyCount} old signing key(s) revoked.`,`This device (${N(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>`}:ii(t,()=>e.revoke(o),e=>`Revoked ${e.name} (${N(e.deviceId)}). A new roster and revocation list were issued.`);case`add`:return ii(t,()=>e.add(),e=>[`Enrolled ${e.name} (${N(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 ii(t,()=>e.join(o.length>0?{name:o}:{}),e=>[`Joined the devices of user ${N(e.userId)}. This device: ${e.name} (${N(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 oi=class{name=`devices`;getCommands(){return[Zr()]}};function si(e){let t=M(Zr(),{requiresPermission:!1,lifecycle:`inline`,execute:(t,n)=>ai(e,t,n)});return{name:`agent-command-devices`,commandSources:[new oi],systemCommands:[t]}}const ci=3e3;function li(e,t){return new Promise(n=>{let r=Date.now(),i=wn({host:e,port:t}),a=setTimeout(()=>{i.destroy(),n({reachable:!1,error:`timeout (${ci/1e3}s)`})},ci);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({reachable:!0,elapsedMs:Date.now()-r})}),i.on(`error`,e=>{clearTimeout(a),n({reachable:!1,error:e.message})})})}function ui(e){if(!vn(e))return{exists:!1,isDirectory:!1,writable:!1};let t;try{t=Sn(e)}catch{return{exists:!0,isDirectory:!1,writable:!1}}let n=t.isDirectory(),r=t.mode&511,i=!1;try{gn(e,_n.W_OK),i=!0}catch{i=!1}return{exists:!0,isDirectory:n,writable:i,mode:r}}function di(e,t=process.env){let n=e.trim().split(/\s+/)[0];if(n===void 0||n.length===0)return!1;if(On(n)||n.includes(`/`))return vn(n);let r=process.platform===`win32`?[``,`.exe`,`.cmd`,`.bat`]:[``];return(t.PATH??``).split(En).filter(e=>e.length>0).some(e=>r.some(t=>vn(kn(e,n+t))))}function fi(e=process.env){return{probeEndpoint:li,inspectPath:ui,resolveCommand:t=>di(t,e),ownerOnlyGuarantee:()=>jn()}}const pi={ok:`✓`,warn:`⚠`,fail:`✗`,"not-configured":`○`,"not-probed":`–`};function mi(e,t){let n=[` ${pi[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 hi(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 gi(e,t=`Doctor`,n={}){let r=[``,t,``,...e.checks.flatMap(e=>mi(e,n)),``,hi(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 _i=`[redacted]`,vi=/(\b[a-z][a-z0-9+.-]{0,31}:\/\/)([^\s/@]+)@/gi,yi=/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,bi=/\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,xi=/\.\.\."[^"]*"\.\.\./g;function Si(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Ci(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(Si(e),`g`),_i));return n=n.replace(vi,`$1${_i}@`),n=n.replace(yi,`$1 ${_i}`),n=n.replace(bi,_i),n}function wi(e){return e instanceof le?`${e.name}: ${e.filePath} is not valid JSON (see the settings check)`:`${e.name}: ${e.message.replace(xi,`…`)}`}function Ti(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 Ei(e){let t=Tn(Dn(e.kind===`host`?e.path:e.relativePath)).replace(/^\./,``);return`settings.${e.scope}.${t}`}function Di(e){let t=e.settingsSources.find(t=>t.kind===`host`&&t.path===e.userSettingsPath);return t===void 0?void 0:Ei(t)}function Oi(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 ki(e,t){return e.source.kind===`host`&&e.source.path===t.userSettingsPath&&e.state===`empty`}function Ai(e,t){let n=Ei(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=ki(e,t);return{id:n,label:`Settings layer`,status:`fail`,path:r,cause:Oi(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 ji(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 Mi(e){let t=nt(e.settingsSources);return{inspection:t,checks:[...t.layers.map(t=>Ai(t,e)),ji(t)]}}function Ni(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 Pi(e,t){let n=T(t.providerDefinitions,e.name),r=e.baseURL??n?.defaults?.baseURL;if(r!==void 0)try{let t=new URL(r),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 i=n?.endpoint;return i===void 0?void 0:{...i,origin:`definition endpoint`}}async function Fi(e,t,n){let r=Pi(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 Ii(e,t){let n;try{n=Nt(e.settingsSources,{providerDefinitions:e.providerDefinitions,env:{...e.env}})}catch(t){return{checks:[{id:`provider.resolution`,label:`Provider`,status:`fail`,cause:wi(t instanceof Error?t:Error(String(t))),detail:[e.diagnosticGuidance?.providerResolution??`Configure a provider or set its API key environment variable.`]}]}}return{checks:[Ni(n),await Fi(n,e,t)],...n.apiKey===void 0?{}:{resolvedApiKey:n.apiKey}}}function Li(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 Ri(e,t){let{root:n,sessions:r}=e.userStorage,i={id:`storage.user`,label:`User storage`,path:n};switch(Li(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 zi(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 Bi(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 Vi(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 Hi(e,t,n){let r=Vi(n);return[Bi(e),Ri(e,t),zi(e,t),...r===void 0?[]:[r]]}const Ui=`storage.user`;function Wi(e){let t=Di(e);return t===void 0?[Ui]:[t,Ui]}function Gi(e,t){return Wi(t).includes(e)}function Ki(e,t){let n=nt(t.settingsSources).layers.find(t=>Ei(t.source)===e);return n===void 0||n.source.kind!==`host`?{ok:!1,reason:`${e}: no user settings layer in this composition`}:ki(n,t)?{ok:!0,plan:{id:e,description:`rewrite the empty user settings file as {}`,path:n.source.path}}:{ok:!1,reason:`${e}: state is ${n.state}; only an empty file is rewritten`}}function qi(e,t){let n=Li(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 Ji(e,t,n){return Gi(e,t)?e===`storage.user`?qi(t,n):Ki(e,t):{ok:!1,reason:`${e}: not a repairable check (allowlist: ${Wi(t).join(`, `)})`}}async function Yi(e,t,n,r){let i=Ji(e,t,n);if(!i.ok)return{applied:!1,reason:i.reason};if(!await r(i.plan))return{applied:!1,reason:`${e}: repair not confirmed; nothing written`};let a=Ji(e,t,n);if(!a.ok)return{applied:!1,reason:`${a.reason} (state changed before the write)`};if(a.plan.id===`storage.user`){let{root:e,sessions:n}=t.userStorage;An(n,{withinRoot:e})}else on(a.plan.path,{});return{applied:!0,plan:a.plan}}const Xi={"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 Zi(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:Xi[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 Qi(e){let t=rt(e.contributionSources,e.skillRoots).roots.filter(e=>e.present),n=t.reduce((e,t)=>e+t.discovered.length,0),r=[t.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:`${n} discovered`,detail:t.map(e=>`${e.sourceDisplayName}: ${e.root} (${e.discovered.length})`)}];for(let e of t)for(let t of e.skipped)r.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 r}function $i(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 ea(e,t,n){let r=$i(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 ta(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 na(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(ta(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 ra(e,t,n){let r,i;try{r=_t(e.pluginsDirs,{settingsPath:e.userSettingsPath})}catch(t){i=t instanceof Error?t.message:String(t),r=_t(e.pluginsDirs,{enabledPlugins:{}})}return[...Zi(r).map(e=>i!==void 0&&e.id===`plugins`?{...e,status:`fail`,cause:`no plugin loads: ${i}`}:e),...Qi(e),...ea(n,r,t),...na(e,r,t)]}function ia(e,t,n){return{id:e,label:t,status:`fail`,cause:wi(n)}}async function aa(e,t,n,r){try{return r(await n())}catch(n){return[ia(e,t,n instanceof Error?n:Error(String(n)))]}}function oa(e,t){let n=e=>Ci(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 sa(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 ca(e){try{let t=Mi(e);return{checks:t.checks,result:t}}catch(e){return{checks:[ia(`settings`,`Settings`,e instanceof Error?e:Error(String(e)))]}}}async function la(e,t){let n=[...e.hostChecks];e.compositionFailure!==void 0&&n.push(e.compositionFailure);let r=ca(e);n.push(...r.checks);let i=r.result?.inspection,a=Ti((i?.layers??[]).map(e=>e.settings),e.env);return n.push(...await aa(`provider`,`Provider`,()=>Ii(e,t),e=>(e.resolvedApiKey!==void 0&&a.push(e.resolvedApiKey),e.checks))),i!==void 0&&(n.push(...await aa(`storage`,`Storage`,()=>Hi(e,t,i),e=>e)),n.push(...await aa(`extensions`,`Extensions`,()=>ra(e,t,i),e=>e))),sa(n.map(e=>oa(e,a)))}function ua(){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 da=class{name=`doctor`;getCommands(){return[ua()]}};async function fa(e,t){let n=e.getUserInteraction();if(n===void 0)return!1;let r=await n.ask(w(`doctor-repair:${t.id}`,`Repair ${t.id}?`,{description:`${t.description} (${t.path})`,defaultYes:!1}));return r.type===`answer`&&r.values[0]===`yes`}async function pa(e,t,n,r,i){let a=await Yi(e,t,n,e=>fa(r,e));if(!a.applied)return{success:!1,message:a.reason,data:{repair:e,applied:!1}};let o=await la(t,n),s=o.checks.find(t=>t.id===e);return{success:!0,message:[`Repaired ${e}: ${a.plan.description}.`,...gi(o,`${i.title??`Doctor`} (after repair)`,i)].join(`
|
|
22
|
+
`),data:{repair:e,applied:!0,status:s?.status,exitCode:o.exitCode}}}async function ma(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>`}:pa(o,e,t,n,i);let s=await la(e,t);return{success:s.failCount===0,message:gi(s,i.title,i).join(`
|
|
23
|
+
`),data:{failCount:s.failCount,warnCount:s.warnCount,repairable:[...s.repairable]}}}function ha(e,t=fi({...e.env}),n={}){let r=M(ua(),{requiresPermission:!1,lifecycle:`inline`,execute:(r,i)=>ma(e,t,r,i,n)});return{name:`agent-command-doctor`,commandSources:[new da],systemCommands:[r]}}function ga(){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 P(e,t,n){return new Promise((r,i)=>{let a=Pn(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=Mn.signals[t];r(128+(e??0));return}r(0)})})}const _a="Compose a message in $EDITOR (optionally pre-filled with `/editor <text>`), then return it.";async function va(e,t,n=`agent-editor-`){if(!e.canHandoffTerminal())return{message:`An editor is unavailable here (no interactive terminal).`,success:!1};let r=ga(),i=yn(kn(Nn(),n)),a=kn(i,`message.md`);Cn(a,t??``,`utf8`);try{let t=await e.runWithTerminal(async()=>P(r.command,[...r.args,a],e.getCwd()));if(t!==0)return{message:`Editor exited without saving (code ${t}).`,success:!1,data:{exitCode:t}};let n=bn(a,`utf8`).replace(/\s+$/u,``);return n.length===0?{message:`Editor closed with empty content; nothing composed.`,success:!1}:{message:n,success:!0,data:{content:n}}}finally{xn(i,{recursive:!0,force:!0,maxRetries:3,retryDelay:20})}}function ya(){return{name:`editor`,displayName:`Editor`,description:_a,source:`editor`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function ba(e){let t=ya();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)=>va(t,n,e)}}var xa=class{name=`editor`;getCommands(){return[ya()]}};function Sa(e){return{name:`agent-command-editor`,commandSources:[new xa],systemCommands:[ba(e)]}}const Ca=`advisorModel`;function wa(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 Ta(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:wa(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{[Ca]:t,...n}=e;o.write(n)}else o.write({...e,[Ca]:a.saved})}return{success:!0,message:a.message,data:{advisor:{...r.status()}}}}function Ea(){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 Da(){let e=Ea();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Ta}}var Oa=class{name=`advisor`;getCommands(){return[Ea()]}};function ka(){return{name:`agent-command-advisor`,commandSources:[new Oa],systemCommands:[Da()]}}const Aa=[`auto`,...ln];function ja(e){return e.disposition===`not-applied`?`This model doesn't support effort levels, so it will use its default.`:`Effort: ${s[e.requested]}`}async function Ma(e){let t=e.getUserInteraction();if(t===void 0)return;let n=await t.ask(O(`effort`,`Select model effort`,Aa.map(e=>({value:e,label:s[e]}))));return xt(n.type===`answer`?n.values[0]:void 0,`/effort`)}function Na(e){let t=e.getCommandHostAdapters?.().effort;if(t!==void 0)return t.getResolution();let n=e.getSession().getModelEffort();return Rt({command:n,modelDefault:n===`auto`?`high`:n})}function Pa(e){return e.getCommandHostAdapters?.()??{}}function Fa(e,t){let n=Pa(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 Ia(e,t){let n;try{n=xt(t.trim()||void 0,`/effort`),n===void 0&&(n=await Ma(e))}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}let r=Na(e);if(n===void 0)return{message:ja(r),success:!0,data:{effort:r}};let i=Pa(e).effort,a;try{a=i===void 0?Rt({command:n,modelDefault:r.effective}):await i.apply(n,e.getSession()),i===void 0&&await e.getSession().applyModelOptions({effort:n}),e.getCommandInvocationSource()===`user`&&Fa(e,n)}catch(e){return{message:`Model effort was not applied: ${e instanceof Error?e.message:String(e)}`,success:!1}}return{message:ja(a),success:!0,data:{effort:a}}}const La=`auto | ${ln.join(` | `)}`;function Ra(){return{name:`effort`,displayName:`Model Effort`,description:`Show or change the model effort level`,source:`effort`,argumentHint:La,modelInvocable:!1}}function za(){let e=Ra();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Ia}}var Ba=class{name=`effort`;getCommands(){return[Ra()]}};function Va(){return{name:`agent-command-effort`,commandSources:[new Ba],systemCommands:[za()]}}async function Ha(e,t){let n=e.getUserInteraction();return n&&!D(await n.ask(w(`exit`,`Exit the session?`)))?{success:!0,message:`Exit cancelled.`}:{success:!0,message:`Exit requested.`,hostActions:[Fe()]}}function Ua(){return{name:`exit`,displayName:`Exit Session`,description:c,source:`exit`,modelInvocable:!1}}function Wa(){let e=Ua();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Ha}}var Ga=class{name=`exit`;getCommands(){return[Ua()]}};function Ka(){return{name:`agent-command-exit`,commandSources:[new Ga],systemCommands:[Wa()]}}const qa=`none`,Ja=`--same-dir`;function Ya(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0),n=t.find(e=>e.startsWith(`--`)&&e!==Ja);if(n!==void 0)return{error:`Unknown option: ${n}\nUsage: /fork [name] [${Ja}]`};let r=t.filter(e=>e!==Ja);return{name:r.length>0?r.join(` `):void 0,isolation:t.includes(Ja)?qa:`worktree`}}function Xa(e){return e instanceof Error?e.message:String(e)}function Za(e,t,n){return[`Forked this conversation into "${e}" (${t}), running ${n===qa?`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 Qa(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 $a(e,t=``,n){let r=Ya(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: ${Xa(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:Za(a.name,e.id,r.isolation),success:!0,data:{sessionId:a.sessionId,name:a.name,taskId:e.id}}}catch(e){return{message:Qa(a,Xa(e),n),success:!1}}}function eo(){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 to(e){let t=eo();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)=>$a(t,n,e)}}var no=class{name=`fork`;getCommands(){return[eo()]}};function ro(e){return{name:`agent-command-fork`,commandSources:[new no],systemCommands:[to(e)],sessionRequirements:[`runtime`]}}const io=[`build`,`chore`,`ci`,`docs`,`feat`,`fix`,`perf`,`refactor`,`revert`,`style`,`test`],ao=/^([^\s():!]+)(\(([^\s()]+)\))?(!)?: (.*)$/;function oo(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=ao.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 io.includes(n)||r.push(`type "${n}" is not one of the conventional types (${io.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 so(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 co(e){return{success:!1,message:e,data:{git:`commit`,committed:!1}}}async function lo(e){let t=await e.ask(hn(`git-commit-subject`,`Commit message`,{description:`Conventional Commits form: <type>[(scope)][!]: <description>`,placeholder:`feat: describe the change`}));if(t.type===`answer`)return so(t.text??t.values[0]??``)}async function uo(e,t){let n=await e.run([`diff`,`--cached`,`--quiet`],{cwd:t});if(n.kind===`failed`||n.exitCode!==0&&n.exitCode!==1)return{staged:!1,result:{success:!1,message:$e(`diff --cached`,n)??`git failed`}};if(n.exitCode===1)return{staged:!0};let r=await e.run(u,{cwd:t}),i=$e(`status`,r);if(i!==void 0||r.kind!==`exited`)return{staged:!1,result:{success:!1,message:i??`git status failed`}};let a=wt(r.stdout);return{staged:!1,result:{success:!1,message:`Nothing is staged (${a.unstaged.length} unstaged, ${a.untracked.length} untracked). Stage files with \`git add\` or \`/shell git add ...\` and run \`/git commit\` again.`,data:{git:`commit`,committed:!1,unstaged:a.unstaged.length,untracked:a.untracked.length}}}}async function fo(e,t){let n=so(e);if(n.length===0){if(t===void 0)return{result:co("Commit cancelled: a commit message was needed and none could be asked for (no interactive session). Run `/git commit <subject>`.")};let e=await lo(t);if(e===void 0||e.length===0)return{result:co(`Commit cancelled.`)};n=e}return{subject:n}}async function po(e,t,n,r,i){if(i===void 0)return{confirmed:!1,result:co(`Commit cancelled: a confirmation was needed and none could be asked for (no interactive session).`)};let a=await e.run([`diff`,`--cached`,`--name-status`],{cwd:t}),o=$e(`diff --cached --name-status`,a);if(o!==void 0||a.kind!==`exited`)return{confirmed:!1,result:{success:!1,message:o??`git failed`}};let s=a.stdout.split(`
|
|
25
25
|
`).filter(e=>e.length>0).map(e=>e.replace(/\t/g,` `)),c=[`Message: ${n}`,...r.map(e=>`Warning: ${e}`),`Staged (${s.length}):`,...s.map(e=>` ${e}`)].join(`
|
|
26
|
-
`);return
|
|
27
|
-
`).find(e=>e.trim().length>0)??``;return{success:!0,message:`Committed: ${d.length>0?d:o}`,data:{git:`commit`,committed:!0,subject:o,files:c.files}}}const
|
|
28
|
-
`)}async function
|
|
26
|
+
`);return D(await i.ask(w(`git-commit`,`Commit ${s.length} staged file(s)?`,{description:c,defaultYes:!1})))?{confirmed:!0,files:s}:{confirmed:!1,result:co(`Commit cancelled.`)}}async function mo(e,t,n,r){let i=await uo(e,t);if(!i.staged)return i.result;let a=await fo(n,r);if(!(`subject`in a))return a.result;let{subject:o}=a,s=oo(o);if(!s.ok)return{success:!1,message:`Commit refused: ${s.reason}.`,data:{git:`commit`,committed:!1,subject:o}};let c=await po(e,t,o,s.warnings,r);if(!c.confirmed)return c.result;let l=await e.run([`commit`,`-m`,o],{cwd:t}),u=$e(`commit`,l);if(u!==void 0||l.kind!==`exited`)return{success:!1,message:u??`git commit failed`};let d=l.stdout.split(`
|
|
27
|
+
`).find(e=>e.trim().length>0)??``;return{success:!0,message:`Committed: ${d.length>0?d:o}`,data:{git:`commit`,committed:!0,subject:o,files:c.files}}}const ho=`Usage: /git status | /git diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | /git commit [<subject>]`;function go(e,t,n){return{name:e,description:t,source:`git`,modelInvocable:!1,...n?{argumentHint:n}:{}}}function _o(){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:[go(`status`,`Show the branch and the staged, unstaged and untracked paths`),go(`diff`,`Show the unstaged diff, the staged diff, or a diff against one or two revisions`,`[--staged | <rev> | <a>..<b>] [-- <path> ...]`),go(`commit`,`Commit the staged changes with a Conventional Commits subject, after confirming`,`[<subject>]`)]}}async function vo(e,t,n=Pe()){let r=t.trim(),i=r.search(/\s/),a=i===-1?r:r.slice(0,i),o=i===-1?``:r.slice(i+1).trim(),s=e.getCwd();switch(a){case`status`:return o.length>0?{success:!1,message:`\`/git status\` takes no arguments.\n${ho}`}:Ue(n,s);case`diff`:return He(n,s,o);case`commit`:return mo(n,s,o,e.getUserInteraction());default:return{success:!1,message:a.length===0?ho:`Unknown /git verb "${a}".\n${ho}`}}}function yo(e){let t=_o();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)=>vo(t,n,e)}}var bo=class{name=`git`;getCommands(){return[_o()]}};function xo(e={}){return{name:`agent-command-git`,commandSources:[new bo],systemCommands:[yo(e.port??Pe())]}}const So=`Assign an autonomous goal the agent pursues across turns until satisfied.`;function Co(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 wo(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`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(r===`status`){let t=e.getGoalState();return t?{message:
|
|
32
|
-
`)}function
|
|
33
|
-
`)}}async function
|
|
34
|
-
`+
|
|
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${
|
|
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${
|
|
37
|
-
`)}}function
|
|
38
|
-
`)}function
|
|
39
|
-
`),success:!0,data:{servers:r,unreadableSources:i}}}function
|
|
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=>
|
|
31
|
+
/goal cancel stop the current goal`,success:!0};if(r===`status`){let t=e.getGoalState();return t?{message:Co(t),success:!0,data:{status:t.status}}:{message:`No goal is set.`,success:!0}}if(ct(n)){let t=e.cancelGoal();return t?{message:`Goal cancelled: ${t.objective}`,success:!0}:{message:`No active goal to cancel.`,success:!1}}let i;try{i=await e.setGoal(n)}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return{message:`Goal set — pursuing autonomously (up to ${i.maxIterations} iterations):\n${i.objective}`,success:!0,data:{goalId:i.id}}}function To(){return{name:`goal`,displayName:`Autonomous Goal`,description:So,source:`goal`,modelInvocable:!1}}function Eo(){let e=To();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:wo}}var Do=class{name=`goal`;getCommands(){return[To()]}};function Oo(){return{name:`agent-command-goal`,commandSources:[new Do],systemCommands:[Eo()]}}function F(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 ko(e){return e.map(e=>` ${e.deviceId}${e.name?` ${e.name}`:``}`).join(`
|
|
32
|
+
`)}function Ao(){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 jo(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
|
+
`+F(n.status())}:{success:!0,message:[`This session could move to:`,ko(e),``,Ao().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${ko(i)}`:`None are reachable right now.`)+`\n${F(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${F(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${F(n.status())}`};let l=[],u=await n.transfer(r,e=>{l.push(Mo(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`}.`,F(u)].join(`
|
|
37
|
+
`)}}function Mo(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 No(){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 Po(){let e=No();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>jo(e,t)}}var Fo=class{name=`handoff`;getCommands(){return[No()]}};function Io(){return{name:`agent-command-handoff`,commandSources:[new Fo],systemCommands:[Po()]}}function Lo(e,t){return{success:!0,message:qe(e)}}function Ro(){return{name:`help`,displayName:`Help`,description:d,source:`help`,modelInvocable:!1}}function zo(){let e=Ro();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Lo}}var Bo=class{name=`help`;getCommands(){return[Ro()]}};function Vo(){return{name:`agent-command-help`,commandSources:[new Bo],systemCommands:[zo()]}}function Ho(){return{name:`keybindings`,displayName:`Keybindings`,description:`Open the contextual terminal keybindings file in $EDITOR`,source:`keybindings`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}async function Uo(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=ga(),i=await t.runWithTerminal(()=>P(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 Wo=class{name=`keybindings`;getCommands(){return[Ho()]}};function Go(e){let t=Ho(),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=>Uo(e,t)};return{name:`agent-command-keybindings`,commandSources:[new Wo],systemCommands:[n]}}async function Ko(e){let t=e.getUserInteraction();if(!t)return;let n=ve().map(e=>({value:e.name,label:e.name,description:e.description})),r=await t.ask(O(`language`,`Select language`,n)),i=r.type===`answer`?r.values[0]:void 0;return i===void 0?void 0:bt(i)}async function qo(e,t){let n=bt(t);return n===void 0&&(n=await Ko(e),n===void 0)?{message:Ze(),success:!1}:{message:`Language set to "${n}".`,success:!0,data:{language:n},hostActions:[{type:`language-change`,language:n}]}}function Jo(){return{name:`language`,displayName:`Language`,description:p,source:`language`,argumentHint:f,subcommands:ve(`language`),modelInvocable:!1}}function Yo(){let e=Jo();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:qo}}var Xo=class{name=`language`;getCommands(){return[Jo()]}};function Zo(){return{name:`agent-command-language`,commandSources:[new Xo],systemCommands:[Yo()]}}function Qo(e,t,n=`session`,r){let i=k(e)??`<server>`;switch(t){case`approve`:return`/mcp approve ${i}`;case`sign-in`:return n===`terminal`?r===void 0?void 0:`${r} mcp login ${i}`:`/mcp login ${i}`;case`trust-workspace`:return r===void 0?void 0:`${r} trust`}}const $o={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 es(e){let t=k(e);return t===void 0?"An MCP server (its name cannot be shown here; `/mcp status` lists it)":`MCP server "${t}"`}function ts(e,t,n=`session`,r){let i=t===`trust-workspace`||t===`sign-in`&&n===`terminal`?` in a terminal, then restart the session`:``,a=Qo(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`${es(e)} ${$o[t]}, so its tools are unavailable. You cannot do this yourself; ${o}.`}function ns(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])=>`- ${ts(e,n,`session`,t)}`)].join(`
|
|
38
|
+
`)}function rs(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 is(e,t,n,r){let i=k(e.serverId),a=rs(e.status,t);return{...i===void 0?{}:{name:i},status:e.status,...t===void 0?{}:{oauth:t},...a===void 0?{}:(()=>{let t=Qo(e.serverId,a,n,r);return t===void 0?{}:{suggestCommand:t}})()}}function as(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 os(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=>is(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(as)];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 I(e){return e.getCommandHostAdapters?.().mcpActivation}const ss={"signed-in":`signed in`,"expired-refreshable":`token expired, will refresh`,"sign-in-required":`sign-in required`,"signed-out":`signed out`},cs={refresh_token:`refresh token`,access_token:`access token`};function ls(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 ${cs[e.token]} was revoked`:`the ${cs[e.token]} was not (${e.failure??`revocation-failed`}) and stays valid until it expires`).join(`; `)}}function L(e){return k(e)??`<server>`}function us(e,t){let n=L(e),r=`run /mcp login ${n}, or ${t===void 0?`sign in from a terminal`:`run ${t} mcp login ${n} in a terminal`}`;return k(e)===void 0?` (${r}; its name cannot be shown safely here)`:` (${r})`}function ds(e,t,n){let r=e.displayName?` (${e.displayName})`:``,i=t===void 0?``:` — OAuth: ${ss[t]}${t===`sign-in-required`||t===`signed-out`?us(e.serverId,n):``}`;return` ${e.serverId}${r} — ${e.status} — ${e.source} — ${e.reason}${i}`}function fs(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 ps(e){let t=await e.oauthStatus?.()??[];return new Map(t.map(e=>[e.serverId,e.state]))}async function ms(e,t){if(!e)return{message:`MCP activation management is not available in this environment.`,success:!0};let n=e.list(),r=await ps(e),i=e.sourceProblems?.()??[],a=i.length===0?[]:[`MCP source problems:\n${i.map(fs).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=>ds(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
|
|
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 hs(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 _s(e,a,o);if(a===``||a===`status`||a===`list`){let t=e.getCommandInvocationSource?.();return t===`user`||t===`remote`?ms(I(e),i):os(I(e),i)}if(a===`login`)return Ts(e,o);if(a===`reload`)return ys(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=I(e);if(!s)return{message:`MCP activation management is not available in this environment.`,success:!0};if(a===`logout`)return vs(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 ys(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 gs(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 _s(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=gs(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=I(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 ms(e,t){if(e.oauthLogout===void 0||(await ls(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`}; ${as(n)}.`,success:!0,data:{...n}}}async function hs(e){let t=L(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 gs=0;function _s(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{if(r.aborted)return`cancel`;gs+=1;let i=await n.ask({id:`mcp-login-browser-${gs}`,title:`Sign in to MCP server ${R(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 vs(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{r.throwIfAborted(),gs+=1;let i=await n.ask({id:`mcp-login-redirect-${gs}`,title:`Sign in to MCP server ${R(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 ys(e,t){let{serverId:n,failure:r}=e,i=R(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 bs(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 xs(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=R(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=L(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=vs(e,s),f=i?void 0:_s(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:ys(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:`${bs(s,p.connection,m.length)}${g}`,success:!0,data:{serverId:s,connection:p.connection??`not-connected`,tools:[...m],...h===0?{}:{dropped:h}}}}function Ss(){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:Cs[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const Cs={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 ws(){let e=Ss();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:ds}}var Ts=class{name=`mcp-activation`;getCommands(){return[Ss()]}};function Es(){return{name:`agent-command-mcp-activation`,commandSources:[new Ts],systemCommands:[ws()]}}function z(){return{message:g,success:!1}}function B(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Ds(e){try{return{ok:!0,store:Fe(e)}}catch(e){return{ok:!1,result:B(e instanceof Error?e:String(e))}}}async function Os(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 vs(e,t){if(e.oauthLogout===void 0||(await ps(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`}; ${ls(n)}.`,success:!0,data:{...n}}}async function ys(e){let t=I(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 bs=0;function xs(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{if(r.aborted)return`cancel`;bs+=1;let i=await n.ask({id:`mcp-login-browser-${bs}`,title:`Sign in to MCP server ${L(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 Ss(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{r.throwIfAborted(),bs+=1;let i=await n.ask({id:`mcp-login-redirect-${bs}`,title:`Sign in to MCP server ${L(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 Cs(e,t){let{serverId:n,failure:r}=e,i=L(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 ws(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 Ts(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=L(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=I(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=Ss(e,s),f=i?void 0:xs(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:Cs(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:`${ws(s,p.connection,m.length)}${g}`,success:!0,data:{serverId:s,connection:p.connection??`not-connected`,tools:[...m],...h===0?{}:{dropped:h}}}}function Es(){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:Ds[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const Ds={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 Os(){let e=Es();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:hs}}var ks=class{name=`mcp-activation`;getCommands(){return[Es()]}};function As(){return{name:`agent-command-mcp-activation`,commandSources:[new ks],systemCommands:[Os()]}}function R(){return{message:g,success:!1}}function z(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function js(e){try{return{ok:!0,store:Me(e)}}catch(e){return{ok:!1,result:z(e instanceof Error?e:String(e))}}}async function Ms(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
|
|
48
|
-
`),success:!0,data:{count:t.length}}}function
|
|
49
|
-
`),success:!0,data:{count:t.length,references:[...t]}}}function
|
|
50
|
-
`)}function
|
|
51
|
-
`)}async function
|
|
52
|
-
`)}function
|
|
53
|
-
`)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!
|
|
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(
|
|
55
|
-
`)}`];o.length>0&&u.push(`Linked devices:\n${o.map(
|
|
47
|
+
`),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function Ns(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 Ps(e){let t=e[1],n=e[2],r=e.slice(3).join(` `).trim();if(!(!t||!st(t)||!n||r.length===0))return{type:t,topic:n,text:r}}async function Fs(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 Is(e,t){Pt(e,t)}async function Ls(e,t,n){if(!n)return R();try{let{record:r,saved:i}=await ge(t,n);return Is(e,{type:`memory_candidate_approved`,candidateId:r.id,topic:r.topic,reason:`approved-by-user`}),Is(e,{type:`memory_candidate_saved`,candidateId:r.id,topic:r.topic,reason:i.deduplicated?`deduplicated`:`approved-and-saved`}),{message:i.deduplicated?`Saved memory candidate ${n} was already present in ${i.topicPath}`:`Saved memory candidate ${n} to ${i.topicPath}`,success:!0,data:{id:n,status:r.status,topic:i.topic,topicPath:i.topicPath,deduplicated:i.deduplicated}}}catch(e){return z(e instanceof Error?e:String(e))}}async function Rs(e,t,n){if(!n)return R();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return Is(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 z(e instanceof Error?e:String(e))}}function zs(e){let t=ht(e);return{message:[`Used memory references:`,...t.length>0?t.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:t.length,references:[...t]}}}function Bs(e){return((e.getCommandHostAdapters?.().permissionMode)?.getPermissionMode()??e.getSession?.().getPermissionMode())===`plan`}async function Vs(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`,i=e.getCommandInvocationSource();if((r===`correct`||r===`forget`)&&i!==`user`&&i!==`remote`)return{success:!1,message:`Memory correction and forgetting: only the user can run /memory correct or /memory forget.`};let a=js(e);if(!a.ok)return a.result;let o=a.store;if(r===`correct`||r===`forget`)try{if(r===`correct`){let e=Ps(n);if(!e)return R();if(et(e.text))return{success:!1,message:`Refusing to save sensitive memory content.`};if(!o.replaceTopic)return{success:!1,message:`This memory backend does not support topic correction.`};let t=await o.replaceTopic(e);return{success:!0,message:`Replaced all active memory in ${t.topicPath}. Automatic additions to this topic now require user correction. Historical transcripts and backups remain.`,data:{...t}}}if(!n[1]||n.length!==2)return R();if(!o.forgetTopic)return{success:!1,message:`This memory backend does not support forgetting topics.`};let e=await o.forgetTopic(n[1]);return{success:!0,message:`Forgot active memory topic ${e.topic}. Source topic removed; automatic restoration is blocked. Historical transcripts and backups remain.`,data:{...e}}}catch(e){return z(e instanceof Error?e:String(e))}if(r===`list`)return Ms(o);if(r===`show`)return Ns(o,n[1]);if(r===`pending`)return Fs(o);if(r===`approve`)return Ls(e,o,n[1]);if(r===`reject`)return Rs(e,o,n[1]);if(r===`used`)return zs(e);if(r===`add`){if(e.getCommandInvocationSource()===`model`&&Bs(e))return{message:`Plan mode saves no memory. Save it after plan mode ends.`,success:!1};let t=Ps(n);if(!t)return R();if(et(t.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let r;try{r=await o.append(t)}catch(e){return z(e instanceof Error?e:String(e))}return{message:r.deduplicated?`${t.type} memory already exists in ${r.topicPath}`:`Saved ${t.type} memory to ${r.topicPath}`,success:!0,data:{indexPath:r.indexPath,topicPath:r.topicPath,topic:r.topic,deduplicated:r.deduplicated}}}return R()}function Hs(){return{name:`memory`,displayName:`Memory`,description:h,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:m,modelInvocable:!0,safety:`write`,subcommands:ye()}}function Us(){let e=Hs();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:Vs}}var Ws=class{name=`memory`;getCommands(){return[Hs()]}};function Gs(){return{name:`agent-command-memory`,commandSources:[new Ws],systemCommands:[Us()]}}function Ks(e,t){try{an(e,t);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function qs(e,t){let n=Ut(e,Number(t.trim().split(/\s+/)[1]));return n===void 0?{message:`Usage: /permissions retry <n>, where <n> numbers a call blocked by the auto-mode classifier in /permissions.`,success:!1}:{message:`${n.argument===void 0?n.toolName:`${n.toolName}(${n.argument})`} will run once, without the classifier, when the model tries it again.`,success:!0}}function Js(e,t){let n=St(t);if(n===`retry`)return qs(e,t);if(n!==void 0){if(!ut(n))return{message:Xe(),success:!1};let t=Ks(e,n);if(t!==void 0)return t;let r=At(e);return{message:`Permission mode set to: ${n}\n${Je(r)}`,success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}let r=At(e);return{message:Je(r),success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}async function Ys(e){let t=e.getUserInteraction();if(!t)return;let n=xe().map(e=>({value:e.name,label:e.displayName??e.name,description:e.description})),r=await t.ask(O(`mode`,`Select interaction mode`,n));return r.type===`answer`?r.values[0]:void 0}async function Xs(e,t){let n=St(t);if(n===void 0&&(n=await Ys(e),n===void 0)){let t=kt(e);return{message:`Current mode: ${t}`,success:!0,data:{mode:t}}}if(!ut(n))return{message:Xe(),success:!1};let r=Ks(e,n);return r===void 0?{message:`Permission mode set to: ${n}`,success:!0,data:{mode:n}}:r}function Zs(){return{name:`mode`,displayName:`Interaction Mode`,description:b,source:`mode`,argumentHint:y,subcommands:xe(`mode`),modelInvocable:!1}}function Qs(){let e=Zs();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:Xs}}var $s=class{name=`mode`;getCommands(){return[Zs()]}};function ec(){return{name:`agent-command-mode`,commandSources:[new $s],systemCommands:[Qs()]}}async function tc(e,t,n){if(nn(e,t,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}}),t.apiKeyRef!==void 0)try{if(n.resolveCredential===void 0)throw Error(`Host credential resolution unavailable.`);if(!(await n.resolveCredential(pn({name:t.type,model:t.model,apiKeyRef:t.apiKeyRef,baseURL:t.baseURL},n.providerDefinitions))).apiKey?.trim())throw Error(`Host credential unavailable.`)}catch{throw Error(`Saved connection unavailable. Run /provider reconnect ${e}.`)}}function nc(e,t){return e.getSession().getModelId()??t?.model??``}function rc(e,t,n,r){let i=t.currentProvider===void 0?void 0:t.providers?.[t.currentProvider];return be(t.providers,t.currentProvider,nc(e,i),n.providerDefinitions,r?n.orgPolicy?.allowedProviders:void 0)}async function ic(e,t,n){let r=n.settings.readMergedSettings(),i=t.trim();if(i.length===0){let t=rc(e,r,n,!0);return ac(e.getUserInteraction(),t,e,n)}let a=zt(rc(e,r,n,!1),i);return a===void 0?{message:`Unknown model "${i}". Run /model to see the choices.`,success:!1}:a.profileName===r.currentProvider?cc(e,a,r,n):lc(a,r,n)}async function ac(e,t,n,r){if(t.groups.length===0)return{message:`No provider profiles configured. Run /provider add to add one.`,success:!0};if(!e)return{message:oc(t),success:!0};let i=t.groups.flatMap(e=>e.models.map(n=>({value:n.id,label:sc(t,e.profileName,e.providerLabel,n)}))),a=await e.ask(O(`model`,`Select model`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Model selection cancelled.`,success:!0}:ic(n,a.values[0],r)}function oc(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 sc(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 cc(e,t,n,r){let i=t.profileName;try{await e.getSession().applyModelOptions({model:t.model.id})}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=r.settings.readTargetSettings(),o=n.providers?.[i]??a.providers?.[i]??{};return r.settings.writeTargetSettings(en(a,i,{...o,model:t.model.id})),{message:`Model: ${t.model.label}`,success:!0}}async function lc(e,t,n){let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(e.profileName))return{message:C(`Provider "${e.profileName}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};let i=t.providers?.[e.profileName];if(i===void 0)return{message:`Provider profile "${e.profileName}" was not found.`,success:!1};let a={...i,model:e.model.id};try{await tc(e.profileName,a,n)}catch(t){return{message:`Could not switch to "${e.model.label}": ${t instanceof Error?t.message:String(t)}`,success:!1}}let o=n.settings.readTargetSettings(),s=n.settings.readMergedSettings();if(s.currentProvider!==t.currentProvider||JSON.stringify(s.providers?.[e.profileName])!==JSON.stringify(i))return{success:!1,message:`Provider settings changed while switching. Run /model again.`};let c=en(o,e.profileName,a),l=o.providers?.[e.profileName]!==void 0||s.providers?.[e.profileName]!==void 0?{...c,currentProvider:e.profileName}:Jt(c,e.profileName);return n.settings.writeTargetSettings(l),{message:`Model: ${e.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profileName}]}}function uc(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function dc(e){let t=uc();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)=>ic(t,n,e)}}var fc=class{name=`model`;getCommands(){return[uc()]}};function pc(e){return{name:`agent-command-model`,commandSources:[new fc],systemCommands:[dc(e)]}}const B=[{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 mc(e){return B.some(t=>t.mode===e)}function hc(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 gc(e,t){let n=e.getUserInteraction();if(!n)return;let r=B.map(({mode:e,description:n})=>({value:e,label:e===t?`${e} (current)`:e,description:n})),i=await n.ask(O(`sandbox`,`Sandbox mode`,r));return i.type===`answer`?i.values[0]:void 0}async function _c(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 gc(e,r.mode);if(i===void 0||i===``)return{message:hc(r),success:!0,data:{...r}};if(!mc(i))return{message:`Unknown sandbox mode "${i}". Valid: ${B.map(e=>e.mode).join(` | `)}`,success:!1};n.setMode(i);let a=n.status();return{message:`Sandbox mode set to: ${i}\n${hc(a)}`,success:!0,data:{...a}}}const vc=B.map(e=>e.mode).join(` | `);function yc(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:vc,subcommands:B.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function bc(){let e=yc();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:_c}}var xc=class{name=`sandbox`;getCommands(){return[yc()]}};function Sc(){return{name:`agent-command-sandbox`,commandSources:[new xc],systemCommands:[bc()]}}function Cc(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function wc(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
|
+
`)}function Tc(e,t){let n=e.getActiveOutputStyleId(),r=t.listOutputStyles();return{success:!0,message:wc(n,t),data:{outputStyles:r,active:n}}}async function Ec(e,t){let n=e.getUserInteraction();if(!n)return;let r=t.listOutputStyles().map(e=>({value:e.id,label:e.id,description:e.description})),i=await n.ask(O(`output-style`,`Select an output style`,r));return i.type===`answer`?i.values[0]:void 0}async function Dc(e,t){let n=Cc(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 Ec(e,n)??``,!r))return Tc(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 Oc(){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 kc(){let e=Oc();return{name:e.name,displayName:e.displayName,description:e.description,argumentHint:e.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Dc}}var Ac=class{name=`output-style`;getCommands(){return[Oc()]}};function jc(){return{name:`agent-command-output-style`,commandSources:[new Ac],systemCommands:[kc()]}}const Mc=/^[a-zA-Z0-9_-]{1,64}$/u;function Nc(e){let t=Object.entries(e).filter(([,e])=>(e??0)>0);return t.length===0?`none`:t.map(([e,t])=>`${e} ${t}`).join(`, `)}function Pc(e){let{counters:t}=e;return` ${e.grantId} ${e.principal} ${e.state} accepted ${t.accepted}; refused: ${Nc(t.refused)}; settled: ${Nc(t.settled)}`}async function Fc(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(Pc).join(`
|
|
53
|
+
`)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!Mc.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 Ic(){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 Lc(){let e=Ic();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)=>Fc(e,t)}}var Rc=class{name=`events`;getCommands(){return[Ic()]}};function zc(){return{name:`agent-command-events`,commandSources:[new Rc],systemCommands:[Lc()]}}function Bc(e){return e.liveness!==`dead`}function Vc(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?``:Uc(e)}${r}${n}`}function Hc(e){let t=e.locality===`same-host`?`on this machine`:`on another machine`;return` ${e.deviceId}${e.name?` ${e.name}`:``} ${t}`}function Uc(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 Wc(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 Gc(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 Kc(e,t){if(e.send===void 0)return{message:`This environment can discover other sessions but cannot address them.`,success:!1};let n=Wc(t);return n===void 0?{message:`Usage: /peers send <session-id> <message>. Run /peers for the session ids.`,success:!1}:Gc(await e.send(n.target,n.text),n.target)}async function qc(e,t,n){if(e.prepareFile===void 0)return{message:`This environment cannot send files to other sessions.`,success:!1};let r=Wc(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 Jc(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 qc(n,r.slice(i[0].length),e.getCwd?.()??``);let a=/^send(?=\s|$)/.exec(r);if(a!==null)return Kc(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(Hc).join(`
|
|
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(Bc);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=>Vc(e,c)).join(`
|
|
55
|
+
`)}`];o.length>0&&u.push(`Linked devices:\n${o.map(Hc).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
|
|
59
|
-
`)}async function
|
|
58
|
+
`)}\n\nSend to one: /peers send ${d} <message>\nSend a file: /peers send-file ${d} <path>`,success:!0}}function Yc(){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 Xc(){let e=Yc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Jc(e,t)}}var Zc=class{name=`peers`;getCommands(){return[Yc()]}};function Qc(){return{name:`agent-command-peers`,commandSources:[new Zc],systemCommands:[Xc()]}}function $c(){return{name:`permissions`,displayName:`Permissions`,description:v,source:`permissions`,argumentHint:y,subcommands:xe(`permissions`),modelInvocable:!1}}function el(){let e=$c();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:Js}}var tl=class{name=`permissions`;getCommands(){return[$c()]}};function nl(){return{name:`agent-command-permissions`,commandSources:[new tl],systemCommands:[el()]}}function rl(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
|
+
`)}async function il(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:
|
|
64
|
-
`)}`}):
|
|
65
|
-
`)}`,data:{plugins:e}}}catch(e){return{success:!1,message:`Plugin error: ${e instanceof Error?e.message:String(e)}`}}}function
|
|
66
|
-
`)}function
|
|
67
|
-
`),success:!0,data:{preset:r,unknownCommandModules:a.unknownCommandModules}}}function
|
|
68
|
-
`)}function
|
|
69
|
-
`)}function
|
|
70
|
-
`)||void 0;return hn(`provider-setup-${n.key}`,n.title,{description:a,placeholder:r,allowEmpty:n.defaultValue!==void 0||n.editOnly===!0&&n.required!==!0,masked:n.masked})}async function nu(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(tu(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Bl(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 ru(e,t,n,r){return nu(e,t,e=>iu(e,n,r),`Provider setup cancelled.`)}function iu(e,t,n){let r=t.settings.readTargetSettings(),i=Ee(e,{providerDefinitions:t.providerDefinitions,...t.env===void 0?{}:{env:t.env}});return t.settings.writeTargetSettings(xt(r,i)),n?{message:`Provider ${e.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profile}]}:{message:`Provider ${e.profile} configured. Restarting...`,success:!0,hostActions:[{...$l,message:`Provider setup restart`}]}}function au(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function ou(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:tt(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};if(n.settings.readMergedSettings().currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let i=e[t];try{on(t,i,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}})}catch(e){return{message:`Failed to switch to "${t}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=n.settings.readTargetSettings(),o=n.settings.readMergedSettings(),s=a.providers?.[t]!==void 0||o.providers?.[t]!==void 0?{...a,currentProvider:t}:Zt(a,t);return n.settings.writeTargetSettings(s),{message:`Switched to ${t} (${i.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t}]}}async function su(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=Il(r.type,n.providerDefinitions,{includeEditOnlySteps:!0,profileName:t,setCurrent:!1,initialValues:cu(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return nu(e,i,e=>lu(e,t,n),`Provider edit cancelled.`)}function cu(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function lu(e,t,n){let r=n.settings.readMergedSettings(),i=r.providers?.[t];if(!i)return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:a}=n;if(a?.requireApiKeyFromEnv&<(e.apiKey))return{message:tt(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=Ee(e,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(rn(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{hostActions:[{type:`provider-hot-swap`,profileName:t}]}:{}}}const uu={type:`session-restart`,reason:`other`};async function du(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=vu(t,Object.keys(r.providers)),a;for(;;){let r=await e.ask(hn(`provider-duplicate`,`Duplicate ${t} as`,{description:a,placeholder:i,allowEmpty:!0}));if(r.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let o=r.text??``,s=fu(o,i,n);if(s!==void 0){a=s;continue}return pu(t,o,i,n)}}function fu(e,t,n){let r=yu(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function pu(e,t,n,r){let i=r.settings.readMergedSettings().providers?.[e];if(!i)return{message:`Provider profile "${e}" was not found.`,success:!1};let a=yu(t,n),o=fu(a,n,r);return o===void 0?(r.settings.writeTargetSettings(rn(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}function mu(e,t,n,r){return n?e?.[n]?Object.keys(e).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:t===n?{message:`Cannot delete the profile in use. Switch to another profile first.`,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}:(r.settings.writeTargetSettings(He(r.settings.readTargetSettings(),n)),{message:`Provider profile deleted: ${n}.`,success:!0}):{message:`Provider profile "${n}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function hu(e,t,n){let r=n.settings.readMergedSettings().providers??{};return r[t]?Object.keys(r).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n.settings.readTargetSettings().providers?.[t]===void 0?{message:`Provider profile "${t}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:w(await e.ask(x(`provider-delete`,`Delete profile "${t}"?`)))?gu(e,t,n):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${t}" was not found.`,success:!1}}async function gu(e,t,n){let r=n.settings.readMergedSettings();if(r.currentProvider!==t)return n.settings.writeTargetSettings(He(n.settings.readTargetSettings(),t)),{message:`Provider profile deleted: ${t}.`,success:!0};let i=Object.entries(r.providers??{}).filter(([e])=>e!==t).map(([e,t])=>({value:e,label:au(e,t,r.currentProvider)})),a=await e.ask(T(`provider-delete-replacement`,`Replacement provider for ${t}`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:_u(t,a.values[0],n)}function _u(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=He(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,hostActions:[{...uu,message:`Provider delete restart`}]}}function vu(e,t){let n=Jt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function yu(e,t){return Jt(e.trim()||t)??``}const bu=`switch`,xu=`edit`,Su=`test`,Cu=`duplicate`,wu=`delete`;async function Tu(e,t,n,r){let i=Object.entries(n??{}).map(([e,n])=>({value:e,label:au(e,n,t)})),a=await e.ask(T(`provider-profile`,`Select provider profile`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Eu(e,a.values[0],r)}async function Eu(e,t,n){if(!n.settings.readMergedSettings().providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let r=await e.ask(T(`provider-profile-action`,`Provider profile: ${t}`,[{value:bu,label:`Switch`},{value:xu,label:`Edit`},{value:Su,label:`Test`},{value:Cu,label:`Duplicate`},{value:wu,label:`Delete`}]));return r.type!==`answer`||r.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Du(e,t,r.values[0],n)}async function Du(e,t,n,r){let i=r.settings.readMergedSettings();switch(n){case bu:return ou(i.providers,t,r);case xu:return su(e,t,r);case Su:return nn(i.currentProvider,i.providers,t,r);case Cu:return du(e,t,r);case wu:return hu(e,t,r);default:return{message:`Unknown provider profile action "${n}".`,success:!1}}}async function Ou(e,t,n){let r=e.getUserInteraction(),i=e.isSetupRequired?.()===!0,a=n.settings.readMergedSettings(),o=t.trim();if(o.length===0)return ku(r,a.currentProvider,a.providers,n);let s=o.split(/\s+/),[c=`current`,l]=s;return c===`list`?ku(r,a.currentProvider,a.providers,n):c===`current`||c===``?{message:ju(a.currentProvider,a.providers),success:!0}:c===`switch`?ou(a.providers,l,n):c===`test`?nn(a.currentProvider,a.providers,l,n):c===`edit`?r?l?su(r,l,n):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:c===`duplicate`?r?l?du(r,l,n):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:c===`delete`?l?!s.includes(`--confirmed`)&&r&&!w(await r.ask(x(`provider-delete`,`Delete profile "${l}"?`)))?{message:`Provider delete cancelled.`,success:!0}:mu(a.providers,a.currentProvider,l,n):{message:`Usage: provider delete <profile>`,success:!1}:c===`add`?Mu(r,l,n,i):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function ku(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Au(t,n),success:!0}:Tu(e,t,n,r)}function Au(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
|
|
72
|
-
`):`Current provider "${e}" was not found in providers.`}function
|
|
63
|
+
/plan revert return to drafting (re-blocks edits)`,success:!0};if(r===`status`){let t=e.getPlanState();return t?{message:rl(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 al(){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 ol(){let e=al();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:il}}var sl=class{name=`plan`;getCommands(){return[al()]}};function cl(){return{name:`agent-command-plan`,commandSources:[new sl],systemCommands:[ol()]}}function ll(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function V(e){return{success:!1,message:e}}function ul(e){return Bt(e)}const dl=`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 fl(e){return(e.getCommandSurfaceLocality?.()??`local`)===`remote`}async function H(e,t){let n=ul(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 pl(e,t){let{subcommand:n,subArgs:r}=ll(t);return n===`add`&&r.length>0?H(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?H(e,async e=>(await e.marketplaceRemove(r),`Removed marketplace "${r}" and uninstalled its plugins.`)):n===`update`&&r.length>0?H(e,async e=>(await e.marketplaceUpdate(r),`Updated marketplace "${r}".`)):n===`list`?H(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
|
+
`)}`}):V(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function ml(e,t,n,r){return t.length===0?Promise.resolve(V(n)):H(e,e=>Promise.resolve(r(e,t)))}function hl(){return{success:!0,message:`Opening plugin manager...`,uiIntents:[Le()]}}function gl(e,t){return fl(e)?Promise.resolve(V(dl)):ml(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function _l(e,t){return fl(e)?Promise.resolve(V(dl)):ml(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}async function vl(e){let t=ul(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 yl(e,t){return ml(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function bl(e,t){return ml(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function xl(e,t){let{subcommand:n,subArgs:r}=ll(t);switch(n){case``:case`manage`:return hl();case`list`:return vl(e);case`install`:return gl(e,r);case`uninstall`:return _l(e,r);case`enable`:return yl(e,r);case`disable`:return bl(e,r);case`marketplace`:return pl(e,r);default:return V(`Unknown plugin subcommand: ${n}`)}}async function Sl(e,t){return H(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 Cl(){return{name:`plugin`,displayName:`Plugins`,description:S,source:`plugin-manager`,modelInvocable:!1,argumentHint:x,subcommands:Se()}}function wl(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:te,source:`plugin-manager`,modelInvocable:!1}}function Tl(){let e=Cl();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:xl}}function El(){let e=wl();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Sl}}var Dl=class{name=`plugin-manager`;getCommands(){return[Cl(),wl()]}};function Ol(){return{name:`agent-command-plugin`,commandSources:[new Dl],systemCommands:[Tl(),El()]}}function kl(e){return e.getCommandHostAdapters?.().presetRegistry??Fn()}function Al(e){return e.getSession().getActivePresetId()}function jl(e,t){return[`Available presets:`,...t.listPresets().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
|
|
66
|
+
`)}function Ml(e,t){return`Unknown preset: ${e}. Available: ${t.listPresets().map(e=>e.id).join(`, `)}`}function Nl(e,t){let n=Al(e);return{message:jl(n,t),success:!0,data:{presets:t.listPresets(),active:n}}}async function Pl(e,t){let n=e.getUserInteraction();if(!n)return;let r=t.listPresets().map(e=>({value:e.id,label:e.id,description:e.description})),i=await n.ask(O(`preset`,`Select a preset`,r));return i.type===`answer`?i.values[0]:void 0}async function Fl(e,t){let n=kl(e),r=t.trim().split(/\s+/)[0];if(r===`list`||(r===void 0||r.length===0)&&(r=await Pl(e,n),r===void 0))return Nl(e,n);if(n.getPreset(r)===void 0)return{message:Ml(r,n),success:!1};let i=n.resolvePreset(r),a=await me(e,r,i),o=a.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: ${r}`,...o].join(`
|
|
67
|
+
`),success:!0,data:{preset:r,unknownCommandModules:a.unknownCommandModules}}}function Il(e=`preset`){return Fn().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function Ll(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:Il(`preset`),modelInvocable:!1}}function Rl(){let e=Ll();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:Fl}}var zl=class{name=`preset`;getCommands(){return[Ll()]}};function Bl(){return{name:`agent-command-preset`,commandSources:[new zl],systemCommands:[Rl()]}}function U(e,t,n={}){let r=Ql(e,t);return{type:e,steps:tu($l(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 Vl(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Jl(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
|
|
68
|
+
`)}function Hl(e,t){let n=e.trim(),r=n.length>0?n:`1`,i=Xl(r);if(i!==void 0){let e=t[i];if(e!==void 0)return e.type;throw Error(`Provider selection ${r} is out of range. Currently supported: ${E(t)}`)}let a=T(t,r);if(a===void 0)throw Error(`Unknown provider: ${r}. Currently supported: ${E(t)}`);return a.type}function Ul(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 Wl(e,t){let n=Ul(e),r=t.trim()||n.defaultValue||``,i=Zl(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:nu(a)}}async function Gl(e,t,n,r={}){let i=U(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=Ul(i),n=await t(Kl(e,i.setupHelpLinks),e.masked===!0),r=Wl(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 Kl(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Yl(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const ql={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Jl(e){let t=`${e.category===void 0?``:`${ql[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Yl(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${eu(e.kind)}: ${e.label} - ${e.url}`).join(`
|
|
69
|
+
`)}function Xl(e){if(/^\d+$/.test(e))return Number(e)-1}function Zl(e,t){if(e.required===!0&&t.length===0)return`Required`}function Ql(e,t){let n=T(t,e);if(n===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${E(t)}`);return n}function $l(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 eu(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function tu(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 nu(e){let t=e.profileName??Xt({type:e.type},{existingProfileNames:e.existingProfileNames}),n=e.values.apiKey;return{profile:t,type:e.type,model:e.values.model,...n!==void 0&&n.length>0&&{apiKey:n},...e.values.baseURL!==void 0&&{baseURL:e.values.baseURL},setCurrent:e.setCurrent??!0}}function ru(e,t){let n=Ul(e),r=n.masked===!0&&n.defaultValue!==void 0?`(unchanged)`:n.defaultValue,i=Yl(e.setupHelpLinks),a=[t,i.length>0?i:void 0].filter(e=>e!==void 0&&e.length>0).join(`
|
|
70
|
+
`)||void 0;return hn(`provider-setup-${n.key}`,n.title,{description:a,placeholder:r,allowEmpty:n.defaultValue!==void 0||n.editOnly===!0&&n.required!==!0,masked:n.masked})}async function iu(e,t,n,r,i){let a=t,o;for(;;){if(i?.aborted)return{message:r,success:!0};let t=await e.ask(ru(a,o),{signal:i});if(t.type===`cancelled`)return{message:r,success:!0};let s=Wl(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 au=0;const ou={"awaiting-approval":`Waiting for browser approval`,exchanging:`Completing browser authentication`,validating:`Checking the connection`,saving:`Finishing connection setup`};function W(e,t){return(T(t.providerDefinitions,e)?.connectionMethods?.length??0)>0}async function su(e,t,n,r,i=!1){let a=T(n.providerDefinitions,t.type),o=t.profileName??Xt({type:t.type},{existingProfileNames:t.existingProfileNames}),s=n.settings.readMergedSettings(),c=s.providers?.[o],l=JSON.stringify(c);if(n.orgPolicy?.allowedProviders&&!n.orgPolicy.allowedProviders.includes(o))return{success:!1,message:C(`Provider profile "${o}" is not allowed by your organization policy.`,n.orgPolicy.adminContact)};let u=(a?.connectionMethods??[]).filter(e=>n.orgPolicy?.requireApiKeyFromEnv!==!0||e===`api-key`),d=n.orgPolicy?.requireApiKeyFromEnv?C(`Your organization requires an environment reference such as $ENV:OPENROUTER_API_KEY.`,n.orgPolicy.adminContact):void 0;for(;;){let f=await e.ask(O(`provider-connection-method`,`Connect with ${a?.displayName??t.type}`,u.map(e=>({value:e,label:e===`api-key`?`API key`:`Browser`})),{description:d}));if(f.type!==`answer`)return cu();let p=f.values[0];if(p!==`api-key`&&p!==`browser`||!u.includes(p))return cu();let m;if(p===`api-key`){let t=await e.ask(hn(`provider-connection-key`,`API key or $ENV:VARIABLE_NAME`,{masked:!0,allowEmpty:!1}));if(t.type!==`answer`)return cu();if(m=t.text?.trim(),!m||n.orgPolicy?.requireApiKeyFromEnv&&!fn(m)){d=n.orgPolicy?.requireApiKeyFromEnv?C(`Enter an environment reference such as $ENV:OPENROUTER_API_KEY.`,n.orgPolicy.adminContact):`An API key is required.`;continue}if(fn(m)){let e=m.slice(cn.length).trim();if(!e||!(n.env??process.env)[e]?.trim()){d=`The environment reference is unset or invalid. Set its variable, then choose API key to try again.`;continue}}}let h=new AbortController,g,_=0,v=++au,y=()=>{g?.abort(),g=void 0},b=t=>{y();let n=new AbortController;g=n,e.ask(O(`provider-connection-progress-${v}-${++_}`,ou[t],[{value:`cancel`,label:`Cancel connection`}],{description:`Keep this session open. You can cancel and choose API key setup.`}),{signal:n.signal}).then(e=>{(e.type===`answer`||!n.signal.aborted)&&h.abort()}).catch(()=>{n.signal.aborted||h.abort()})},x,S=async(u,d)=>{y();let f=d??h.signal,p,g={...t,profileName:o,steps:t.steps.filter(e=>e.key!==`apiKey`&&e.key!==`baseURL`)};if(g.steps.length===0?p={profile:o,type:t.type,model:a?.defaults?.model,setCurrent:t.setCurrent??!0}:await iu(e,g,e=>(p=e,{success:!0,message:``}),`Provider connection cancelled.`,f),!p||f.aborted||h.signal.aborted)throw h.abort(),Error(`Provider connection cancelled.`);let _=n.settings.readMergedSettings();if(JSON.stringify(_.providers?.[o])!==l||_.currentProvider!==s.currentProvider)throw Error(`Provider connection changed while setup was pending.`);let v=u===void 0?{apiKeyEnv:m?.slice(cn.length).trim()}:{apiKeyRef:u},b=Ce({...p,...v},{providerDefinitions:n.providerDefinitions,env:n.env});if(i&&c!==void 0){let e={...c};delete e.apiKey,delete e.apiKeyRef,b.providers[o]={...e,...b.providers[o]}}n.settings.writeTargetSettings(vt(n.settings.readTargetSettings(),b));let S=s.currentProvider===o;x={success:!0,message:`Provider ${o} connected.`,...i?S?{hostActions:[{type:`session-restart`,reason:`other`,message:`Provider connection restart`}]}:{}:{hostActions:r?[{type:`provider-hot-swap`,profileName:o}]:[{type:`session-restart`,reason:`other`,message:`Provider setup restart`}]}}};try{if(m!==void 0&&fn(m))await S();else if(n.connectionHost===void 0){d=`Host connection support is unavailable. Choose API key and use an environment reference.`;continue}else await n.connectionHost.connect({type:t.type,profile:o,method:p,...m===void 0?{}:{apiKey:m},signal:h.signal,...p===`browser`?{onProgress:b}:{}},S);if(x===void 0)throw Error(`The host did not save a connection.`);return x}catch{let e=p===`browser`&&t.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(h.signal.aborted){d=`Connection cancelled. Choose a connection method to try again.${e}`;continue}return{success:!1,message:`Connection failed. Retry with ${i?`/provider reconnect ${o}`:`/provider add ${t.type}`} and choose ${t.type===`openrouter`?`an ordinary OpenRouter API key or Browser`:`API key or Browser`}.${e}`}}finally{y()}}}function cu(){return{success:!0,message:`Provider connection cancelled.`}}const lu={type:`session-restart`,reason:`other`};function uu(e,t){return U(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function du(e,t,n,r){return W(t.type,n)?su(e,t,n,r):iu(e,t,e=>fu(e,n,r),`Provider setup cancelled.`)}function fu(e,t,n){let r=t.settings.readTargetSettings(),i=Ce(e,{providerDefinitions:t.providerDefinitions,...t.env===void 0?{}:{env:t.env}});return t.settings.writeTargetSettings(vt(r,i)),n?{message:`Provider ${e.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profile}]}:{message:`Provider ${e.profile} configured. Restarting...`,success:!0,hostActions:[{...lu,message:`Provider setup restart`}]}}function pu(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}async function mu(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:C(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};let i=n.settings.readMergedSettings();if(i.currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let a=e[t];try{await tc(t,a,n)}catch(e){return{message:`Failed to switch to "${t}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let o=n.settings.readTargetSettings(),s=n.settings.readMergedSettings();if(s.currentProvider!==i.currentProvider||JSON.stringify(s.providers?.[t])!==JSON.stringify(a))return{success:!1,message:`Provider settings changed while switching. Run /provider switch again.`};let c=o.providers?.[t]!==void 0||s.providers?.[t]!==void 0?{...o,currentProvider:t}:Jt(o,t);return n.settings.writeTargetSettings(c),{message:`Switched to ${t} (${a.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t}]}}async function hu(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=U(r.type,n.providerDefinitions,{includeEditOnlySteps:!0,profileName:t,setCurrent:!1,initialValues:_u(r)}),W(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 iu(e,i,e=>vu(e,t,n),`Provider edit cancelled.`)}async function gu(e,t,n){let r=n.settings.readMergedSettings().providers?.[t];return r?.type?W(r.type,n)?su(e,U(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 _u(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function vu(e,t,n){let r=n.settings.readMergedSettings(),i=r.providers?.[t];if(!i)return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:a}=n;if(a?.requireApiKeyFromEnv&&ot(e.apiKey))return{message:C(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=Ce({...e,...e.apiKey===void 0&&i.apiKeyRef!==void 0?{apiKeyRef:i.apiKeyRef}:{},...e.apiKey===void 0&&i.apiKey!==void 0?{apiKey:i.apiKey}:{}},{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(en(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{hostActions:[{type:`provider-hot-swap`,profileName:t}]}:{}}}const yu={type:`session-restart`,reason:`other`};async function bu(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=Du(t,Object.keys(r.providers)),a;for(;;){let r=await e.ask(hn(`provider-duplicate`,`Duplicate ${t} as`,{description:a,placeholder:i,allowEmpty:!0}));if(r.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let o=r.text??``,s=xu(o,i,n);if(s!==void 0){a=s;continue}return Su(t,o,i,n)}}function xu(e,t,n){let r=Ou(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function Su(e,t,n,r){let i=r.settings.readMergedSettings().providers?.[e];if(!i)return{message:`Provider profile "${e}" was not found.`,success:!1};let a=Ou(t,n),o=xu(a,n,r);return o===void 0?(r.settings.writeTargetSettings(en(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}function Cu(e,t,n,r){return n?e?.[n]?Object.keys(e).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:t===n?{message:`Cannot delete the profile in use. Switch to another profile first.`,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}:(r.settings.writeTargetSettings(ze(r.settings.readTargetSettings(),n)),{message:`Provider profile deleted: ${n}.`,success:!0}):{message:`Provider profile "${n}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function wu(e,t,n){let r=n.settings.readMergedSettings().providers??{};return r[t]?Object.keys(r).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n.settings.readTargetSettings().providers?.[t]===void 0?{message:`Provider profile "${t}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:D(await e.ask(w(`provider-delete`,`Delete profile "${t}"?`)))?Tu(e,t,n):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${t}" was not found.`,success:!1}}async function Tu(e,t,n){let r=n.settings.readMergedSettings();if(r.currentProvider!==t)return n.settings.writeTargetSettings(ze(n.settings.readTargetSettings(),t)),{message:`Provider profile deleted: ${t}.`,success:!0};let i=Object.entries(r.providers??{}).filter(([e])=>e!==t).map(([e,t])=>({value:e,label:pu(e,t,r.currentProvider)})),a=await e.ask(O(`provider-delete-replacement`,`Replacement provider for ${t}`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:Eu(t,a.values[0],n)}function Eu(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=ze(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,hostActions:[{...yu,message:`Provider delete restart`}]}}function Du(e,t){let n=Gt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function Ou(e,t){return Gt(e.trim()||t)??``}const ku=`switch`,Au=`edit`,ju=`test`,Mu=`duplicate`,Nu=`delete`,Pu=`reconnect`;async function Fu(e,t,n,r){let i=Object.entries(n??{}).map(([e,n])=>({value:e,label:pu(e,n,t)})),a=await e.ask(O(`provider-profile`,`Select provider profile`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Iu(e,a.values[0],r)}async function Iu(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=await e.ask(O(`provider-profile-action`,`Provider profile: ${t}`,[{value:ku,label:`Switch`},{value:Au,label:`Edit`},...W(r.providers[t]?.type??``,n)?[{value:Pu,label:`Reconnect`}]:[],{value:ju,label:`Test`},{value:Mu,label:`Duplicate`},{value:Nu,label:`Delete`}]));return i.type!==`answer`||i.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Lu(e,t,i.values[0],n)}async function Lu(e,t,n,r){let i=r.settings.readMergedSettings();switch(n){case ku:return mu(i.providers,t,r);case Au:return hu(e,t,r);case Pu:return gu(e,t,r);case ju:return $t(i.currentProvider,i.providers,t,r);case Mu:return bu(e,t,r);case Nu:return wu(e,t,r);default:return{message:`Unknown provider profile action "${n}".`,success:!1}}}async function Ru(e,t,n){let r=e.getUserInteraction(),i=e.isSetupRequired?.()===!0,a=n.settings.readMergedSettings(),o=t.trim();if(o.length===0)return zu(r,a.currentProvider,a.providers,n);let s=o.split(/\s+/),[c=`current`,l]=s;return c===`list`?zu(r,a.currentProvider,a.providers,n):c===`current`||c===``?{message:Vu(a.currentProvider,a.providers),success:!0}:c===`switch`?mu(a.providers,l,n):c===`test`?$t(a.currentProvider,a.providers,l,n):c===`edit`?r?l?hu(r,l,n):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:c===`reconnect`?r?l?gu(r,l,n):{message:`Usage: /provider reconnect <profile>`,success:!1}:{message:`Provider reconnect requires an interactive session.`,success:!1}:c===`duplicate`?r?l?bu(r,l,n):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:c===`delete`?l?!s.includes(`--confirmed`)&&r&&!D(await r.ask(w(`provider-delete`,`Delete profile "${l}"?`)))?{message:`Provider delete cancelled.`,success:!0}:Cu(a.providers,a.currentProvider,l,n):{message:`Usage: provider delete <profile>`,success:!1}:c===`add`?Hu(r,l,n,i):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|reconnect <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function zu(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Bu(t,n),success:!0}:Fu(e,t,n,r)}function Bu(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 Vu(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 Hu(e,t,n,r){return t===void 0||t.length===0?e?Uu(e,n,r):{message:`Usage: provider add <type>. Supported: ${E(n.providerDefinitions)}`,success:!1}:T(n.providerDefinitions,t)===void 0?{message:`Usage: provider add <type>. Supported: ${E(n.providerDefinitions)}`,success:!1}:e?du(e,uu(t,n),n,r):{message:`Provider setup for "${t}" requires an interactive session.`,success:!1}}async function Uu(e,t,n){let r=t.providerDefinitions.map(e=>({value:e.type,label:Jl(e)})),i=await e.ask(O(`provider-type`,`Select provider`,r,{maxVisible:6}));if(i.type!==`answer`||i.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let a=i.values[0];return T(t.providerDefinitions,a)===void 0?{message:`Usage: provider add <type>. Supported: ${E(t.providerDefinitions)}`,success:!1}:du(e,uu(a,t),t,n)}function Wu(){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 Gu(){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:Wu(),example:`/provider switch production`}}var Ku=class{name=`provider`;getCommands(){return[Gu()]}};function qu(e){let t=Gu();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)=>Ru(t,n,e)}}function Ju(e){return{name:`agent-command-provider`,commandSources:[new Ku],systemCommands:[qu(e)]}}const Yu=`
|
|
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):
|
|
79
|
+
Choose [1-3] (default: 1): `;async function Xu(e,t,n=!1){let r=(await e(n?Yu.replace(` Choose [1-3]`,` 4. Connect with OpenRouter (Browser or API key)
|
|
80
|
+
|
|
81
|
+
Choose [1-4]`):Yu)).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 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
|
|
|
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`}):
|
|
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,24 +98,25 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
|
|
|
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`}}
|
|
100
|
-
`)}`,
|
|
101
|
-
`)
|
|
102
|
-
`),success:!0,data:{
|
|
103
|
-
`),success:!0,data:{
|
|
104
|
-
`),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function
|
|
105
|
-
`),success:!0,data:{target:
|
|
106
|
-
`)
|
|
107
|
-
`)}async function
|
|
108
|
-
`)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
`)}async function
|
|
112
|
-
`)
|
|
113
|
-
`):
|
|
114
|
-
`)
|
|
115
|
-
`)
|
|
116
|
-
`)
|
|
117
|
-
`)}function Tp(e){
|
|
118
|
-
`)}
|
|
101
|
+
`),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}function Zu(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 Qu(e,t,n,r,i){let a=await Xu(n,r,i.some(e=>e.type===`openrouter`)),o=ed(t),s=Object.keys(Mt(o.sources).providers??{}),c=td(o.stores,t.settingsScope),l;l=a.preselectedType===void 0?Hl(await n(Vl(i)),i):a.preselectedType;let u={providerDefinitions:i,env:t.env,connectionHost:t.connectionHost,orgPolicy:t.orgPolicy,settings:{readMergedSettings:()=>Mt(o.sources),readTargetSettings:()=>c.read(),writeTargetSettings:e=>c.write(e)}};if(W(l,u)){let e=t.interaction===void 0?i.map(e=>({...e,connectionMethods:e.connectionMethods?.filter(e=>e!==`browser`)})):i;t.interaction===void 0&&r.writeLine(`Browser connection is unavailable here. API key setup remains available.`);let a=await su(t.interaction??Zu(n),U(l,e,{existingProfileNames:s}),{...u,providerDefinitions:e},!1);if(!a.success)throw new ee(a.message);if(a.hostActions===void 0)return}else he(c,await Gl(l,n,i,{existingProfileNames:s}),{providerDefinitions:i,env:t.env});let d=await n(` Response language (ko/en/ja/zh, default: en): `);if(d){let e=c.read();e.language=d,c.write(e)}r.writeLine(`\n Config saved to ${c.displayName}\n`)}async function $u(e,t,n,r,i,a){let o=ed(t),s=Mt(o.sources);if(De(t.provider===void 0?s:{...s,currentProvider:t.provider},i,t.env??a.env)===`valid`||t.provider===void 0&&Lt(i,a.env)!==void 0)return;if(!(a.isInteractive??(()=>!1))())throw new ee(a.formatError(i));await Qu(e,nd({...t,env:t.env??a.env},o.stores),n,r,i);let c=Mt(o.sources);if(De(t.provider===void 0?c:{...c,currentProvider:t.provider},i,t.env??a.env)!==`valid`)throw new ee(a.formatError(i))}function ed(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 td(e,t){if(t===void 0)return Vt(e);let n=t===`user`?`user`:`project-local`,r=e.findLast(e=>e.scope===n);if(r!==void 0)return r;throw new fe(`No authorized ${n} settings store is available.`)}function nd(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:rd(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function rd(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 id="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 ad(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 od(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=ad(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\`: ${id}`,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\`: ${id}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function sd(){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 cd(){return M(sd(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>od(e,t)})}var ld=class{name=`remote-control`;getCommands(){return[sd()]}};function ud(){return{name:`agent-command-remote-control`,commandSources:[new ld],systemCommands:[cd()]}}function dd(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function fd(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function pd(){let e=fd();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:dd}}var md=class{name=`reset`;getCommands(){return[fd()]}};function hd(){return{name:`agent-command-reset`,commandSources:[new md],systemCommands:[pd()]}}function G(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function gd(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function _d(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${gd(e.prompt)}`):[`(no edit checkpoints)`]].join(`
|
|
104
|
+
`),success:!0,data:{count:e.length,checkpoints:[...e]}}}function vd(e){return e.length>0?e.join(`, `):`(none)`}function yd(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: ${gd(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${vd(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${vd(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
|
|
105
|
+
`),success:!0,data:{inspection:e}}}function bd(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 xd(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 Sd(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 K(e,t){return{message:e instanceof l?Sd(e,t):e instanceof Error?e.message:String(e),success:!1}}function Cd(e){try{return _d(mt(e))}catch(t){return K(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}function wd(e,t){if(!t)return G();try{return yd(tt(e,t))}catch(t){return K(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function Td(e,t){if(!t)return G();try{return bd(await Ht(e,t))}catch(t){return K(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function Ed(e,t){if(!t)return G();try{return xd(await Wt(e,t))}catch(t){return K(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function Dd(e,t){if(!t)return G();try{let n=await Ge(e,t);return{message:[`Forked a new branch from ${n.target.id} (the previous future is preserved).`,`Restored files: ${n.restoredFileCount}`].join(`
|
|
108
|
+
`),success:!0,data:{target:n.target,restoredFileCount:n.restoredFileCount}}}catch(t){return K(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}function Od(e,t){if(!t)return G();try{return Qt(e,t),{message:`Switched to checkpoint branch ${t}.`,success:!0}}catch(t){return K(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}function kd(e){try{let t=pt(e);return{message:t.length===0?`No checkpoint branches yet.`:`Branch tips:\n${t.map(e=>`- ${e}`).join(`
|
|
109
|
+
`)}`,success:!0,data:{branches:t}}}catch(t){return K(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function Ad(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?Cd(e):r===`inspect`?wd(e,n[1]):r===`restore`||r===`code`?Td(e,n[1]):r===`rollback`?Ed(e,n[1]):r===`fork`?Dd(e,n[1]):r===`switch`?Od(e,n[1]):r===`branches`?kd(e):G()}function jd(){return{name:`rewind`,displayName:`Rewind History`,description:oe,source:`rewind`,argumentHint:ae,modelInvocable:!1,safety:`write`,subcommands:we()}}function Md(){let e=jd();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:Ad}}var Nd=class{name=`rewind`;getCommands(){return[jd()]}};function Pd(){return{name:`agent-command-rewind`,commandSources:[new Nd],systemCommands:[Md()]}}function Fd(e,t){let n=Math.floor(Math.min(1800,t.milliseconds/2e3)),r=In(`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 Id=4096,q=new WeakMap,Ld=new Set([`second`,`seconds`,`minute`,`minutes`,`hour`,`hours`,`day`,`days`,`s`,`m`,`h`,`d`]),Rd=`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.`,zd={ui:void 0,source:`user`},J={s:1e3,m:6e4,h:36e5,d:864e5},Bd=[...Vd(60).map(e=>({cronExpression:e===60?`0 * * * * *`:`*/${e} * * * * *`,milliseconds:e*J.s,description:`${e}s`})),...Vd(60).filter(e=>e>1).map(e=>({cronExpression:e===60?`0 0 * * * *`:`0 */${e} * * * *`,milliseconds:e*J.m,description:`${e}m`})),...Vd(24).filter(e=>e>1).map(e=>({cronExpression:e===24?`0 0 0 * * *`:`0 0 */${e} * * *`,milliseconds:e*J.h,description:`${e}h`}))];function Vd(e){return Array.from({length:e},(e,t)=>t+1).filter(t=>e%t===0)}function Hd(e,t){let n=Number(e),r=J[t];if(!Number.isSafeInteger(n)||n<=0||r===void 0)return;let i=n*r;return Number.isSafeInteger(i)&&i<=J.d?i:void 0}function Ud(e){let t=e.length;for(;t>0&&/[a-z]/i.test(e[t-1]);)--t;let n=e.slice(t).toLowerCase();if(!Ld.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 Wd(e,t){let n=t&&t.length<=Id?t.trim():void 0;if(e===``)return;let r=/^(\d+)(s|m|h|d)$/i.exec(e);if(r&&n){let e=Hd(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=Hd(i[1],i[2].toLowerCase());return e&&t!==void 0&&!Ud(e)?{instruction:e,requestedMs:t}:void 0}let a=Ud(e);if(!a)return;let o=Hd(a.amount,a.unit[0]);return o===void 0?void 0:{instruction:a.instruction,requestedMs:o}}function Gd(e){return Bd.find(t=>t.milliseconds>=e)}function Y(e){return e.listSchedules().filter(e=>e.metadata?.sessionLoop===!0&&e.metadata?.sessionLoopSelfPaced!==!0&&e.status!==`cancelled`&&e.status!==`completed`&&e.status!==`failed`)}function X(e){return(e.listSelfPacedLoops?.()??[]).filter(e=>e.phase!==`stopped`&&e.phase!==`expired`)}function Z(e){let t=e.metadata?.sessionLoopId;return typeof t==`string`&&t.length>0?t:e.id}function Kd(e){let t=Y(e),n=X(e);return t.length+n.length===0?`No other active loops.`:[...t.map(e=>`- ${Z(e)} [${e.status}] ${e.label}`),...n.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`)].join(`
|
|
110
|
+
`)}async function qd(e,t,n){if(t.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:r}=t;if(!r)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 i=n.split(`
|
|
111
|
+
`)[0].trim()||n,a=await r.ask(O(`loop-start-default`,`Start a loop that keeps working on its own for up to 7 days? It will: ${i}`,[{value:`start`,label:`Start`},{value:`cancel`,label:`Cancel`}],{description:Kd(e)}));if(!(a.type===`answer`&&a.values.includes(`start`)))return{success:!0,message:`Loop not started.`}}async function Jd(e,t,n,r={},i=zd){let a=n.trim();return a===`list`?Yd(e,r):lt(a)?Xd(e,t,a):r.disabled?{success:!1,message:`Session loops are disabled by the host.`}:Zd(e,a,r,i)}function Yd(e,t){let n=Y(e),r=X(e);return{success:!0,message:(t.disabled?`Session loops are disabled by the host.
|
|
112
|
+
`:``)+(n.length+r.length===0?`No active loops.`:[...n.map(e=>`- ${Z(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(`
|
|
113
|
+
`)),data:{count:n.length+r.length}}}async function Xd(e,t,n){let r=/^stop\s+(\S+)$/.exec(n);if(!r)return{success:!1,message:Rd};let i=X(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=Y(e).find(e=>Z(e)===r[1]);return a?(await t(a.id,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${Z(a)}. An already-running turn may finish.`,data:{loopId:Z(a),taskId:a.id}}):{success:!1,message:`Active loop not found: ${r[1]}`}}async function Zd(e,t,n,r=zd){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=Wd(t,a);if(!o){if(/^\d+[a-z](?:\s|$)/i.test(t)||Ud(t))return{success:!1,message:Rd};let n=(t||a||``).trim();if(!n||t===``&&n.length>Id)return{success:!1,message:Rd};if(!e.createSelfPacedLoop)return{success:!1,message:`Self-paced loops require a persistent interactive session.`};if(i){let t=await qd(e,r,n);if(t)return t}let o=q.get(e)??0;if(Y(e).length+X(e).length+o>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};q.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=(q.get(e)??1)-1;t===0?q.delete(e):q.set(e,t)}}if(i){let t=await qd(e,r,o.instruction);if(t)return t}let s=q.get(e)??0;if(Y(e).length+X(e).length+s>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};let c=Gd(o.requestedMs),l=`Loop: ${o.instruction.slice(0,48)}`,u=`loop_${Ln()}`,d=Fd(u,c),f=Date.now(),p=new Date(f+o.requestedMs).toISOString(),m=new Date(f+6048e5).toISOString();q.set(e,s+1);let h;try{h=await e.spawnScheduledWake({label:l,cronExpression:d.cronExpression,agentInstruction:o.instruction,sessionLoop:!0,sessionLoopId:u,...i?{sessionLoopDefaultPrompt:!0}:{},sessionLoopFirstAllowedAt:p,sessionLoopExpiresAt:m})}finally{let t=(q.get(e)??1)-1;t===0?q.delete(e):q.set(e,t)}let g=c.milliseconds===o.requestedMs?``:` (rounded up)`,_=h.kind===`scheduled`&&h.nextFireAt&&h.nextFireAt>=p?` Next fire: ${h.nextFireAt}.`:``;return{success:!0,message:`Loop ${u} uses a ${c.description}${g} local-clock step with stable offset +${d.jitterSeconds}s; elapsed gaps can change with daylight saving. First eligible at or after ${p}.${_} Expires: ${m}. Stop with /loop stop ${u}.`,data:{loopId:u,taskId:h.id,requestedMs:o.requestedMs,cadenceLabel:c.description,cronExpression:d.cronExpression,jitterSeconds:d.jitterSeconds,firstAllowedAt:p,expiresAt:m}}}const Qd={s:1e3,m:6e4,h:36e5,d:864e5},Q=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function $d(e,t){let n=e.trim();if(n.length===0)return{ok:!1,error:Q};if(n.startsWith(`in `)){let e=n.slice(3).trim(),r=e.indexOf(` `);if(r===-1)return{ok:!1,error:`Missing instruction. ${Q}`};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}". ${Q}`};if(a.length===0)return{ok:!1,error:`Missing instruction. ${Q}`};let s=parseInt(o[1],10)*Qd[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. ${Q}`};let r=t[2].trim();return r.length===0?{ok:!1,error:`Missing instruction. ${Q}`}:{ok:!0,spec:{cronExpression:t[1].trim(),instruction:r,recurring:!0}}}return{ok:!1,error:Q}}function ef(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}const tf=`Usage: /schedule list | pause <id> | resume <id> | edit <id> <spec> (or a create spec: in <N><s|m|h|d> … | cron "<expr>" …)`;function nf(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 rf(e,t,n,r){if(t===`list`){let t=e.listSchedules();return{message:nf(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:tf,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:tf,success:!1};let o=$d(a,r);return o.ok?(await e.editSchedule(i,{cronExpression:o.spec.cronExpression,agentInstruction:o.spec.instruction,label:ef(`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 af(e,t,n=Date.now()){let r=t.trim(),i=r.indexOf(` `),a=await rf(e,(i===-1?r:r.slice(0,i)).toLowerCase(),i===-1?``:r.slice(i+1).trim(),n);if(a)return a;let o=$d(t,n);if(!o.ok)return{message:`${o.error}\n${tf}`,success:!1};let{cronExpression:s,instruction:c,recurring:l}=o.spec,u=await e.spawnScheduledWake({label:ef(`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 of(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 sf(e,t){let n=of(t);if(!n)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let r;try{r=await e.spawnMonitorWake({label:ef(`Monitor`,n.instruction),command:n.command,matchPattern:n.matchPattern,agentInstruction:n.instruction})}catch(e){if(e instanceof _)return{message:e.message,success:!1};throw e}return{message:`Monitoring \`${n.command}\` for /${n.matchPattern}/ — task ${r.id}.`,success:!0,data:{taskId:r.id,matchPattern:n.matchPattern}}}function cf(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function lf(){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 uf(){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 df(){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 ff(){let e=lf();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)=>af(cf(e),t)}}function pf(){let e=uf();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)=>sf(cf(e),t)}}function mf(e){let t=df();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)=>Jd(cf(t),(e,n)=>t.cancelBackgroundTask(e,n),n,e,{ui:t.getUserInteraction(),source:t.getCommandInvocationSource()})}}var hf=class{name=`schedule`;getCommands(){return[lf(),uf(),df()]}};function gf(e={}){return{name:`agent-command-schedule`,commandSources:[new hf],systemCommands:[ff(),pf(),mf(e)],sessionRequirements:[`runtime`]}}function _f(e,t,n){return un(e,t,n)}function vf(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function yf(e){return e.toLocaleString(`en-US`)}const bf=`Conversation cleared.`;function xf(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 Sf(e,t){let n=e.getUserInteraction();return n&&!D(await n.ask(w(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:(ke(e),{success:!0,message:bf})}function Cf(e,t){let n=Ct(t);return n===void 0?{success:!1,message:re}:{success:!0,message:`Session renamed to "${n}".`,data:{name:n},hostActions:[Ie(n)]}}function wf(){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},uiIntents:[Re()]}}function Tf(e){return e.getCommandHostAdapters?.().costBudget}const Ef=`Budget persistence is not available on this host (no cost-budget adapter was composed).`;function Df(e){return`Could not write the budget: ${e instanceof Error?e.message:String(e)}`}function Of(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?_f(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 kf(e){let t=e.getSession(),n=jt(e),r=t.getModelId(),i=Of(e.getSessionUsage(),r),a=[`Session: ${n.sessionId}`,`Messages: ${n.messageCount}`],o={sessionId:n.sessionId,messageCount:n.messageCount};if(i){a.push(`Tokens: ${yf(i.inputTokens)} input / ${yf(i.outputTokens)} output`),o.inputTokens=i.inputTokens,o.outputTokens=i.outputTokens;let t=i.costUsd;if(t!==void 0){let n=i.models.length>1?`mixed: ${i.models.join(`, `)}`:i.models[0]??``,r=i.partial?`; some usage could not be priced`:``;a.push(`Cost: ${vf(t)} (${n}${r})`),o.estimatedCostUsd=t,o.costModels=i.models,i.partial&&(o.costPartial=!0);let s=Tf(e)?.read();if(s?.monthly){let e=s.monthly-t,n=Math.min(100,Math.round(t/s.monthly*100));a.push(`Budget: ${vf(e)} remaining of ${vf(s.monthly)}/mo (${n}% used)`),o.budgetMonthly=s.monthly,o.budgetRemainingUsd=e}}}else a.push(`Tokens: not yet available (no turns completed)`);return{lines:a,data:o}}function Af(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=Tf(e);if(i===void 0)return{success:!1,message:Ef};if(t===`clear`){try{i.clear()}catch(e){return{success:!1,message:Df(e)}}return{success:!0,message:`Monthly budget cleared.`}}if(t===``){let e=i.read();return e?.monthly?{success:!0,message:`Monthly budget: ${vf(e.monthly)}`}:{success:!0,message:`No budget set. Use: /cost budget <amount>`}}if(r===void 0)return{success:!1,message:Ef};try{i.write({monthly:r})}catch(e){return{success:!1,message:Df(e)}}return{success:!0,message:`Monthly budget set to ${vf(r)}.`}}let{lines:r,data:i}=kf(e);return{success:!0,message:r.join(`
|
|
115
|
+
`),data:i}}function jf(e,t){let n=tn(e);return{success:n.validation.ok,message:Ye(n),data:{logFile:n.logFile,entryCount:n.entryCount,issueCount:n.validation.issues.length,ok:n.validation.ok}}}function Mf(){return{name:`clear`,displayName:`Clear History`,description:n,source:`session`,modelInvocable:!1,userInvocable:!0}}function Nf(){return{name:`rename`,displayName:`Rename Session`,description:ne,argumentHint:`<name>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function Pf(){return{name:`cd`,displayName:`Change Directory`,description:`Move this session to another working directory`,argumentHint:`<directory>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function Ff(){return{name:`resume`,displayName:`Resume Session`,description:ie,source:`session`,modelInvocable:!1,userInvocable:!0}}function If(){return{name:`cost`,displayName:`Session Cost`,description:r,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 Lf(){return{name:`validate-session`,displayName:`Validate Session`,description:de,source:`session`,modelInvocable:!1,userInvocable:!0}}function Rf(){return M(Mf(),{requiresPermission:!1,lifecycle:`inline`,execute:Sf})}function zf(){return M(Nf(),{requiresPermission:!1,lifecycle:`inline`,execute:Cf})}function Bf(){return M(Pf(),{requiresPermission:!1,lifecycle:`inline`,execute:xf})}function Vf(){return M(Ff(),{requiresPermission:!1,lifecycle:`inline`,execute:wf})}function Hf(){return M(If(),{requiresPermission:!1,lifecycle:`inline`,execute:Af})}function Uf(){return M(Lf(),{requiresPermission:!1,lifecycle:`inline`,execute:jf})}var Wf=class{name=`session`;getCommands(){return[Mf(),Nf(),Pf(),Ff(),If(),Lf()]}};function Gf(){return{name:`agent-command-session`,commandSources:[new Wf],systemCommands:[Rf(),zf(),Bf(),Vf(),Hf(),Uf()]}}function Kf(){return{name:`settings`,displayName:`Settings`,description:`Open settings — language, output style, preset, permissions and more`,source:`settings`,modelInvocable:!1}}function qf(){let e=Kf();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 Jf=class{name=`settings`;getCommands(){return[Kf()]}};function Yf(){return{name:`agent-command-settings`,commandSources:[new Jf],systemCommands:[qf()]}}function Xf(e){let t=mn({executable:e});return{command:t.command,interactiveArgs:t.interactiveArgs,commandArgs:e=>t.commandArgs(e)}}const Zf="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function Qf(e,t,n){if(!e.canHandoffTerminal())return{message:`An interactive shell is unavailable here (no interactive terminal).`,success:!1};let r=Xf(n),i=e.getCwd(),a=t.trim(),o=await e.runWithTerminal(async()=>a.length>0?P(r.command,r.commandArgs(a),i):P(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 $f(){return{name:`shell`,displayName:`Shell`,description:Zf,source:`shell`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function ep(e){let t=$f();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)=>Qf(t,n,e)}}var tp=class{name=`shell`;getCommands(){return[$f()]}};function np(e){return{name:`agent-command-shell`,commandSources:[new tp],systemCommands:[ep(e)]}}function rp(){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 ip(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 ap(){return{...rp(),semanticRole:`skillResourceRead`,requiresPermission:!1,lifecycle:`inline`,execute:ip}}const op=`List registered skills, or activate one by name`;function sp(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 cp(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${sp(e)}`}function lp(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(cp),``,`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 up(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 dp(e,t=``){let n=up(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:lp(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function fp(){return{name:`skills`,displayName:`Skills`,description:op,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 pp(){let e=fp();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:dp}}var mp=class{name=`skills`;getCommands(){return[fp(),rp()]}};function hp(e){let t=[new mp];return t.push(new ue(e.contributionSources,e.skillRoots??[])),{name:`agent-command-skills`,commandSources:t,systemCommands:[pp(),ap()]}}const gp=[`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 _p(e){let t=e.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[n,r]=t;return n===`on`&&r===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:n===`off`&&r===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:n===`reset`&&r===void 0?{success:!0,message:`Status line settings reset.`,patch:{...o}}:n===`git`&&r===`on`&&t.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:n===`git`&&r===`off`&&t.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:gp}}function vp(e,t){let n=_p(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function yp(){return{name:`statusline`,displayName:`Status Line`,description:ce,source:`statusline`,argumentHint:se,subcommands:Te(`statusline`),modelInvocable:!1}}function bp(){let e=yp();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:vp}}var xp=class{name=`statusline`;getCommands(){return[yp()]}};function Sp(){return{name:`agent-command-statusline`,commandSources:[new xp],systemCommands:[bp()]}}const Cp=`list | <theme-id> | syntax on|off | motion on|off`;function $(e){return e?`on`:`off`}function wp(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 Tp(e){return{success:!0,message:wp(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function Ep(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function Dp(e){if(e===`on`)return!0;if(e===`off`)return!1}function Op(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=Dp(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${Cp}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function kp(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 Ap(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 Tp(e);let r=Op(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${Cp}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return Ep(r.themeId,e);i.theme=a.id}return{success:!0,message:kp(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function jp(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:Cp,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var Mp=class{name=`theme`;getCommands(){return[jp()]}};function Np(e){let t=jp(),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)=>Ap(e,n)};return{name:`agent-command-theme`,commandSources:[new Mp],systemCommands:[n]}}const Pp=`Inspect user-local storage and memory state.`,Fp=`storage list [--format json] | memory set/list/inspect/disable/delete`,Ip=`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 Lp(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
|
|
120
|
+
`)}function Rp(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function zp(e,t,n){let r=await gt({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):Lp(r.items),success:!0,data:{list:r}}}async function Bp(e,t,n){let[r,i,a]=n.positional,o=await Yt({activeRepositoryRoot:e,storageRoot:t,category:Rp(r),key:i??``,value:a??``,summary:n.summary??``,source:n.source??``});return{message:`Stored user-local memory item ${o.category}/${o.key} at ${o.storageLocation}`,success:!0,data:{item:o}}}async function Vp(e,t,n){let[r,i]=n.positional,a=await it({activeRepositoryRoot:e,storageRoot:t,category:Rp(r),key:i??``});return{message:n.format===`json`?JSON.stringify(a,null,2):`${a.category}/${a.key}: ${a.summary}`,success:!0,data:{item:a}}}async function Hp(e,t,n){let[r,i]=n.positional,a=await Ve({activeRepositoryRoot:e,storageRoot:t,category:Rp(r),key:i??``});return{message:`Disabled user-local memory item ${a.category}/${a.key}`,success:!0,data:{item:a}}}async function Up(e,t,n){let[r,i]=n.positional,a=await Be({activeRepositoryRoot:e,storageRoot:t,category:Rp(r),key:i??``});return{message:`Deleted user-local memory item ${a.category}/${a.key}`,success:!0,data:{result:a}}}async function Wp(e,t,n){return(n.action??`list`)===`list`?zp(e,t,n):n.action===`set`?Bp(e,t,n):n.action===`inspect`?Vp(e,t,n):n.action===`disable`?Hp(e,t,n):n.action===`delete`?Up(e,t,n):{message:Ip,success:!1}}function Gp(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Kp(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 qp(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=Kp(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:Gp(n),summary:r,source:i}}function Jp(e){return e.trim().split(/\s+/).filter(Boolean)}function Yp(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
|
|
121
|
+
`)}async function Xp(e,t,n){if((n.action??`list`)!==`list`)return{message:Ip,success:!1};let r=await at({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):Yp(r.root,r.categories),success:!0,data:{root:r.root,categories:r.categories,inspection:r}}}async function Zp(e,t,n){return n.target===`storage`?Xp(e,t,n):n.target===`memory`?Wp(e,t,n):{message:Ip,success:!1}}function Qp(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function $p(e){try{return await Zp(e.cwd,e.storageRoot,qp(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:Qp(e instanceof Error?e.message:String(e)),success:!1}}}async function em(e,t,n){try{return await Zp(e.getCwd(),n,qp(Jp(t)))}catch(e){return{message:Qp(e instanceof Error?e.message:String(e)),success:!1}}}function tm(){return{name:`user-local`,displayName:`User Config`,description:Pp,source:`user-local`,argumentHint:Fp,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 nm(e){let t=tm();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)=>em(t,n,e)}}var rm=class{name=`user-local`;getCommands(){return[tm()]}};function im(e){return{name:`agent-command-user-local`,commandSources:[new rm],systemCommands:[nm(e)]}}function am(e,t,n){return Kt(e,t,n)}function om({cwd:e,userLocalStorageRoot:t,editorTemporaryDirectoryPrefix:n,contributionSources:r,skillRoots:i,providerDefinitions:a,providerSettingsAdapter:o,orgPolicy:s,keybindingsFilePort:c,themeCataloguePort:l,devicesPort:u,doctorInputs:d,doctorDisplay:f,formatForkResumeCommand:p,loopOptions:m,enabledCommandModules:h,disabledCommandModules:g,providerEnvironment:_,providerConnectionHost:v,providerCredentialResolver:y}){let b=[hp({contributionSources:r??[],skillRoots:i}),Vo(),pr(),Va(),ka(),nl(),ec(),Sc(),Bl(),jc(),Zo(),yr(),ro(p),Oo(),cl(),np(),Sa(n),xo(),Go(c),Np(l),...d===void 0?[]:[ha(d,void 0,f)],Gs(),As(),im(t),Tr(),Xr(),Ka(),Gf(),hd(),Pd(),gf(m),Sp(),Ol(),Yf(),Qc(),zc(),Io(),ud(),...u===void 0?[]:[si(u)],Ju({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s},..._===void 0?{}:{env:_},...v===void 0?{}:{connectionHost:v},...y===void 0?{}:{resolveCredential:y}}),pc({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s},..._===void 0?{}:{env:_},...y===void 0?{}:{resolveCredential:y}})],x=b.map(e=>e.name);return{modules:am(b,h,g),unknownModuleNames:We(x,h,g)}}function sm(e){let{shellExecutable:t,editorTemporaryDirectoryPrefix:n,keybindingsFile:r,themeCatalogue:i,enabledCommandModules:a,disabledCommandModules:o}=e,s=[[np(t),(e,n)=>Qf(e,n,t)],[Sa(n),(e,t)=>va(e,t,n)],[Go(r),e=>Uo(r,e)],[Np(i),(e,t)=>Ap(i,t)]],c=new Set(Kt(s.map(([e])=>e),a,o));return s.filter(([e])=>c.has(e)).flatMap(([e,t])=>(e.systemCommands??[]).map(e=>({name:e.name,execute:t})))}export{Ca as ADVISOR_SETTING_KEY,Oa as AdvisorCommandSource,fr as AgentCommandSource,vr as BackgroundCommandSource,bf as CLEAR_COMMAND_MESSAGE,wr as CompactCommandSource,Yr as ContextCommandSource,da as DoctorCommandSource,_a as EDITOR_COMMAND_DESCRIPTION,xa as EditorCommandSource,Ba as EffortCommandSource,Ga as ExitCommandSource,So as GOAL_COMMAND_DESCRIPTION,bo as GitCommandSource,Do as GoalCommandSource,Fo as HandoffCommandSource,Bo as HelpCommandSource,Wo as KeybindingsCommandSource,Xo as LanguageCommandSource,ks as MCPActivationCommandSource,Ws as MemoryCommandSource,$s as ModeCommandSource,fc as ModelCommandSource,Ac as OutputStyleCommandSource,tl as PermissionsCommandSource,Dl as PluginManagerCommandSource,zl as PresetCommandSource,Ku as ProviderCommandSource,ld as RemoteControlCommandSource,Nd as RewindCommandSource,B as SANDBOX_MODES,Zf as SHELL_COMMAND_DESCRIPTION,op as SKILLS_COMMAND_DESCRIPTION,gp as STATUSLINE_USAGE,Ui as STORAGE_REPAIR_ID,xc as SandboxCommandSource,hf as ScheduleCommandSource,Wf as SessionCommandSource,Jf as SettingsCommandSource,tp as ShellCommandSource,mp as SkillsCommandSource,xp as StatusLineCommandSource,Mp as ThemeCommandSource,Fp as USER_LOCAL_COMMAND_ARGUMENT_HINT,Pp as USER_LOCAL_COMMAND_DESCRIPTION,Ip as USER_LOCAL_COMMAND_USAGE,rm as UserLocalCommandSource,Yi as applyDoctorRepair,sa as buildDoctorReport,Ti as collectSettingsSecrets,Ea as createAdvisorCommandEntry,ka as createAdvisorCommandModule,ur as createAgentCommandEntry,pr as createAgentCommandModule,dr as createAgentSystemCommand,gr as createBackgroundCommandEntry,yr as createBackgroundCommandModule,Mf as createClearCommandEntry,Sr as createCompactCommandEntry,Tr as createCompactCommandModule,qr as createContextCommandEntry,Xr as createContextCommandModule,If as createCostCommandEntry,om as createDefaultCommandModules,si as createDevicesCommandModule,ua as createDoctorCommandEntry,ha as createDoctorCommandModule,ya as createEditorCommandEntry,Sa as createEditorCommandModule,Ra as createEffortCommandEntry,Va as createEffortCommandModule,Ua as createExitCommandEntry,Ka as createExitCommandModule,_o as createGitCommandEntry,xo as createGitCommandModule,Ne as createGitProcess,To as createGoalCommandEntry,Oo as createGoalCommandModule,No as createHandoffCommandEntry,Io as createHandoffCommandModule,Ro as createHelpCommandEntry,Vo as createHelpCommandModule,Ho as createKeybindingsCommandEntry,Go as createKeybindingsCommandModule,Jo as createLanguageCommandEntry,Zo as createLanguageCommandModule,df as createLoopCommandEntry,Es as createMCPActivationCommandEntry,As as createMCPActivationCommandModule,Hs as createMemoryCommandEntry,Gs as createMemoryCommandModule,Zs as createModeCommandEntry,ec as createModeCommandModule,uc as createModelCommandEntry,pc as createModelCommandModule,uf as createMonitorCommandEntry,fi as createNodeDoctorDeps,Oc as createOutputStyleCommandEntry,jc as createOutputStyleCommandModule,$c as createPermissionsCommandEntry,nl as createPermissionsCommandModule,cl as createPlanCommandModule,Cl as createPluginCommandEntry,Ol as createPluginCommandModule,Ll as createPresetCommandEntry,Bl as createPresetCommandModule,Gu as createProviderCommandEntry,Ju as createProviderCommandModule,U as createProviderSetupFlow,wl as createReloadPluginsCommandEntry,sd as createRemoteControlCommandEntry,ud as createRemoteControlCommandModule,Nf as createRenameCommandEntry,fd as createResetCommandEntry,hd as createResetCommandModule,Ff as createResumeCommandEntry,Pd as createRewindCommandModule,Sc as createSandboxCommandModule,lf as createScheduleCommandEntry,gf as createScheduleCommandModule,Gf as createSessionCommandModule,Kf as createSettingsCommandEntry,Yf as createSettingsCommandModule,$f as createShellCommandEntry,np as createShellCommandModule,fp as createSkillsCommandEntry,hp as createSkillsCommandModule,yp as createStatusLineCommandEntry,Sp as createStatusLineCommandModule,sm as createTerminalClientCommands,jp as createThemeCommandEntry,Np as createThemeCommandModule,tm as createUserLocalCommandEntry,im as createUserLocalCommandModule,Lf as createValidateSessionCommandEntry,Wi as doctorRepairAllowlist,$u as ensureProviderConfig,Ta as executeAdvisorCommand,or as executeAgentCommand,hr as executeBackgroundCommand,Sf as executeClearCommand,xr as executeCompactCommand,Rr as executeContextCommand,Af as executeCostCommand,va as executeEditorCommand,Ia as executeEffortCommand,Ha as executeExitCommand,vo as executeGitCommand,wo as executeGoalCommand,jo as executeHandoffCommand,Lo as executeHelpCommand,qo as executeLanguageCommand,Jd as executeLoopCommand,hs as executeMCPActivationCommand,Vs as executeMemoryCommand,Xs as executeModeCommand,ic as executeModelCommand,sf as executeMonitorCommand,Dc as executeOutputStyleCommand,Js as executePermissionsCommand,xl as executePluginCommand,Fl as executePresetCommand,Ru as executeProviderCommand,Sl as executeReloadPluginsCommand,od as executeRemoteControlCommand,Cf as executeRenameCommand,dd as executeResetCommand,wf as executeResumeCommand,Ad as executeRewindCommand,_c as executeSandboxCommand,af as executeScheduleCommand,Qf as executeShellCommand,dp as executeSkillsCommand,vp as executeStatusLineCommand,Ap as executeThemeCommand,em as executeUserLocalCommand,$p as executeUserLocalDirectCommand,jf as executeValidateSessionCommand,Jl as formatProviderSetupChoiceLabel,Yl as formatProviderSetupHelpLinks,Kl as formatProviderSetupPromptLabel,Vl as formatProviderSetupSelectionPrompt,hc as formatSandboxStatus,Ul as getProviderSetupStep,Qe as gitEnvironment,Gi as isDoctorRepairId,ns as mcpUnavailableServersNotice,Qo as mcpUserActionCommand,ts as mcpUserActionNotice,$d as parseScheduleSpec,Ji as planDoctorRepair,Ci as redactDiagnosticText,gi as renderDoctorReport,di as resolveCommandOnPath,ga as resolveEditor,Hl as resolveProviderSetupSelection,Xf as resolveShell,la as runDoctor,Gl as runProviderSetupPromptFlow,Qu as runProviderStartupSetup,P as spawnInherited,Wl as submitProviderSetupValue,Zl as validateProviderSetupValue};
|
|
119
122
|
//# sourceMappingURL=index.js.map
|