@robota-sdk/agent-command 3.0.0-beta.82 → 3.0.0-beta.83

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