@robota-sdk/agent-command 3.0.0-beta.86 → 3.0.0-beta.87

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 (62) hide show
  1. package/CHANGELOG.md +53 -12
  2. package/README.md +6 -3
  3. package/dist/node/index.cjs +72 -70
  4. package/dist/node/index.d.cts +16 -8
  5. package/dist/node/index.d.cts.map +1 -1
  6. package/dist/node/index.d.ts +16 -8
  7. package/dist/node/index.d.ts.map +1 -1
  8. package/dist/node/index.js +51 -49
  9. package/dist/node/index.js.map +1 -1
  10. package/package.json +15 -13
  11. package/src/agent/__tests__/agent-command.test.ts +5 -5
  12. package/src/agent/agent-command-module.ts +1 -1
  13. package/src/background/__tests__/background-command-module.test.ts +6 -6
  14. package/src/default/__tests__/__snapshots__/model-exposure.test.ts.snap +15 -4
  15. package/src/default/__tests__/default-command-modules.test.ts +2 -2
  16. package/src/default/__tests__/model-exposure.test.ts +18 -5
  17. package/src/default/__tests__/org-policy-forwarding.test.ts +1 -1
  18. package/src/default/default-command-modules.ts +2 -2
  19. package/src/devices/devices-command-module.ts +1 -1
  20. package/src/doctor/__tests__/doctor-command-module.test.ts +10 -10
  21. package/src/doctor/__tests__/doctor-display-vocabulary.test.ts +1 -1
  22. package/src/doctor/__tests__/doctor-fixture.ts +14 -14
  23. package/src/doctor/__tests__/doctor-runner.test.ts +57 -57
  24. package/src/doctor/doctor-storage-probe.ts +1 -1
  25. package/src/doctor/doctor-types.ts +2 -2
  26. package/src/editor/__tests__/editor-command-functional.test.ts +1 -1
  27. package/src/fork/__tests__/fork-command.test.ts +1 -1
  28. package/src/fork/fork-command-module.ts +1 -1
  29. package/src/git/__tests__/git-command-module.test.ts +1 -1
  30. package/src/handoff/__tests__/handoff-command-module.test.ts +1 -1
  31. package/src/handoff/handoff-command-module.ts +1 -1
  32. package/src/keybindings/keybindings-command-module.ts +1 -1
  33. package/src/mcp-activation/__tests__/mcp-activation-command.test.ts +8 -8
  34. package/src/mcp-activation/__tests__/mcp-model-view.test.ts +43 -12
  35. package/src/mcp-activation/__tests__/mcp-skill-command.test.ts +141 -0
  36. package/src/mcp-activation/mcp-activation-command-module.ts +27 -2
  37. package/src/mcp-activation/mcp-activation-command.ts +149 -15
  38. package/src/mcp-activation/mcp-model-notice.ts +19 -5
  39. package/src/mcp-activation/mcp-model-status.ts +7 -2
  40. package/src/memory/__tests__/memory-command-module.test.ts +89 -16
  41. package/src/memory/memory-command-module.ts +4 -1
  42. package/src/memory/memory-command.ts +53 -1
  43. package/src/peers/__tests__/peers-command-module.test.ts +1 -1
  44. package/src/peers/peers-command-module.ts +1 -1
  45. package/src/permissions/__tests__/permissions-command-module.test.ts +4 -4
  46. package/src/plugin/__tests__/plugin-active-turn.test.ts +100 -0
  47. package/src/plugin/__tests__/plugin-command-module.test.ts +7 -7
  48. package/src/plugin/plugin-command-module.ts +4 -0
  49. package/src/provider/provider-startup.ts +4 -2
  50. package/src/remote-control/__tests__/remote-control-command.test.ts +2 -2
  51. package/src/rewind/__tests__/rewind-command-module.test.ts +4 -3
  52. package/src/rewind/rewind-command.ts +27 -21
  53. package/src/schedule/schedule-command-module.ts +1 -1
  54. package/src/session/__tests__/session-command-module.test.ts +2 -2
  55. package/src/skills/__tests__/skill-read-command.test.ts +64 -0
  56. package/src/skills/__tests__/skills-command-module.test.ts +2 -1
  57. package/src/skills/skill-read-command.ts +60 -0
  58. package/src/skills/skills-command-module.ts +3 -2
  59. package/src/terminal-client/__tests__/terminal-client-commands.test.ts +1 -1
  60. package/src/theme/__tests__/theme-command.test.ts +1 -1
  61. package/src/theme/theme-command-module.ts +1 -1
  62. package/src/user-local/__tests__/user-local-command.test.ts +16 -16
@@ -2,7 +2,7 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
2
2
  `),success:!0,data:{agents:t.length,jobs:n.length}}}function Qn(e){let t=[e.worktreePath?`worktree=${e.worktreePath}`:void 0,e.branchName?`branch=${e.branchName}`:void 0].filter(e=>e!==void 0),n=t.length>0?` ${t.join(` `)}`:``;return`${e.id} [${e.status}${n}] ${e.label} - ${e.promptPreview}`}async function $n(e,t){let n=Vn(t,Kn(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await Jn(e,n);if(`success`in r)return r;let{state:i}=r;return{message:`Started agent job: ${i.id}`,success:!0,data:{agentId:i.id,status:i.status}}}async function er(e,t){let n=t.includes(`--wait`)||!t.includes(`--detach`),r=Hn(t.filter(e=>e!==`--wait`&&e!==`--detach`),Kn(e));if(r.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let i=r.map(t=>qn(e,t.agentType)).find(e=>e!==void 0);if(i)return i;let a;try{a=await Promise.all(r.map(t=>e.spawnAgentJob(t)))}catch(e){return{message:Gn(e),success:!1}}let o=e.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:a.map(e=>e.id),label:`agent parallel`});if(n){let t=en(await e.waitBackgroundJobGroup(o.id));return{message:sr(t),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id,summary:t}}}return{message:[`Started agent jobs:`,...a.map(e=>`${e.label}: ${e.id}`)].join(`
3
3
  `),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id}}}async function tr(e,t){let[n]=t;if(!n)return{message:`Usage: agent wait GROUP_ID`,success:!1};let r=en(await e.waitBackgroundJobGroup(n));return{message:sr(r),success:!0,data:{groupId:n,summary:r}}}async function nr(e,t){let[n,r]=t;if(!n)return{message:`Usage: agent read AGENT_ID [OFFSET]`,success:!1};let i=r?{offset:Number.parseInt(r,10)}:void 0,a=await e.readBackgroundTaskLog(n,i),o=a.nextCursor?`\nNext offset: ${a.nextCursor.offset}`:``;return{message:a.lines.length>0?`${a.lines.join(`
4
4
  `)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function rr(e,t){let[n,...r]=t,i=r.join(` `).trim();return!n||!i?{message:`Usage: agent send AGENT_ID PROMPT`,success:!1}:(await e.sendAgentJob(n,i),{message:`Sent input to agent job: ${n}`,success:!0,data:{agentId:n}})}async function ir(e,t){let[n,...r]=t;return n?(await e.cancelAgentJob(n,r.join(` `)||void 0),{message:`Agent job stopped: ${n}`,success:!0,data:{agentId:n}}):{message:`Usage: agent stop AGENT_ID [REASON]`,success:!1}}async function ar(e,t){let[n]=t;return n?(await e.closeAgentJob(n),{message:`Agent job closed: ${n}`,success:!0,data:{agentId:n}}):{message:`Usage: agent close AGENT_ID`,success:!1}}async function or(e,t){try{if(t.trim()===``)return Yn();let[n=`list`,...r]=Rn(t);return n===`list`&&r.length===0?Zn(e):n===`run`?$n(e,r):n===`parallel`?er(e,r):n===`wait`?tr(e,r):n===`read`||n===`open`?nr(e,r):n===`send`?rr(e,r):n===`stop`||n===`cancel`?ir(e,r):n===`close`?ar(e,r):r.length===0&&Kn(e).has(n)?Xn(e,n):$n(e,[n,...r])}catch(e){return{message:Gn(e),success:!1}}}function sr(e){return[`Background job group ${e.groupId}: ${e.status} (${e.completed}/${e.total} completed, ${e.failed} failed, ${e.cancelled} cancelled, ${e.pending} pending)`,...e.lines].join(`
5
- `)}function cr(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function lr(){return[{name:`list`,description:`List available agents and active jobs`,source:`agent`},{name:`run`,description:`Start one background agent job`,source:`agent`},{name:`parallel`,description:`Run multiple agents in parallel`,source:`agent`},{name:`wait`,description:`Wait for a background agent group summary`,source:`agent`},{name:`read`,description:`Read an agent job log page`,source:`agent`},{name:`send`,description:`Send follow-up input to an agent job`,source:`agent`},{name:`stop`,description:`Cancel a running agent job`,source:`agent`},{name:`close`,description:`Dismiss a terminal agent job`,source:`agent`},{name:`open`,description:`Read an agent job log page (alias for read)`,source:`agent`}]}function ur(){return{name:`agent`,displayName:`Agent Jobs`,description:`Start and manage background subagent jobs`,modelDescription:[`Start and manage background subagent jobs.`,`Natural-language arguments start one background agent job.`,`When the user explicitly asks to create, run, spawn, delegate to, or use agents/subagents, start the requested agent command immediately and do not ask a follow-up question unless execution is impossible or unsafe.`,`If the target item is unspecified, include target selection inside the agent prompt instead of delaying execution.`,`The parallel form starts multiple background agent jobs as a wait_all group and returns a consolidated group summary unless --detach is present.`,`list, wait, read, send, stop, close, and open manage existing agent jobs.`,`Returns the started job id (or group summary), the job list, or the requested log page.`].join(` `),source:`agent`,modelInvocable:!0,argumentHint:`PROMPT | AGENT_NAME PROMPT | list | parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"] | wait GROUP_ID | read AGENT_ID [OFFSET] | send AGENT_ID PROMPT | stop AGENT_ID | close AGENT_ID`,safety:`background-agent`,subcommands:lr()}}function dr(){let e=ur();return{name:e.name,semanticRole:`subagentSpawn`,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>or(cr(e),t),...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands}}}var fr=class{name=`agent`;getCommands(){return[ur()]}};function pr(){return{name:`agent-command-agent`,commandSources:[new fr],systemCommands:[dr()],sessionRequirements:[`agent-runtime`]}}function mr(e){return e.trim().split(/\s+/).filter(Boolean)}async function hr(e,n){let[r=`list`,i,...a]=mr(n);if(r===`list`){let t=mt(e);return{message:Ye(t),success:!0,data:{count:t.length}}}if(!i)return{message:t,success:!1};if(r===`read`||r===`log`||r===`open`){let t=await At(e,i,St(a[0])),n=t.nextCursor?`\nNext offset: ${t.nextCursor.offset}`:``;return{message:t.lines.length>0?`${t.lines.join(`
5
+ `)}function cr(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function lr(){return[{name:`list`,description:`List available agents and active jobs`,source:`agent`},{name:`run`,description:`Start one background agent job`,source:`agent`},{name:`parallel`,description:`Run multiple agents in parallel`,source:`agent`},{name:`wait`,description:`Wait for a background agent group summary`,source:`agent`},{name:`read`,description:`Read an agent job log page`,source:`agent`},{name:`send`,description:`Send follow-up input to an agent job`,source:`agent`},{name:`stop`,description:`Cancel a running agent job`,source:`agent`},{name:`close`,description:`Dismiss a terminal agent job`,source:`agent`},{name:`open`,description:`Read an agent job log page (alias for read)`,source:`agent`}]}function ur(){return{name:`agent`,displayName:`Agent Jobs`,description:`Start and manage background subagent jobs`,modelDescription:[`Start and manage background subagent jobs.`,`Natural-language arguments start one background agent job.`,`When the user explicitly asks to create, run, spawn, delegate to, or use agents/subagents, start the requested agent command immediately and do not ask a follow-up question unless execution is impossible or unsafe.`,`If the target item is unspecified, include target selection inside the agent prompt instead of delaying execution.`,`The parallel form starts multiple background agent jobs as a wait_all group and returns a consolidated group summary unless --detach is present.`,`list, wait, read, send, stop, close, and open manage existing agent jobs.`,`Returns the started job id (or group summary), the job list, or the requested log page.`].join(` `),source:`agent`,modelInvocable:!0,argumentHint:`PROMPT | AGENT_NAME PROMPT | list | parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"] | wait GROUP_ID | read AGENT_ID [OFFSET] | send AGENT_ID PROMPT | stop AGENT_ID | close AGENT_ID`,safety:`background-agent`,subcommands:lr()}}function dr(){let e=ur();return{name:e.name,semanticRole:`subagentSpawn`,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>or(cr(e),t),...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands}}}var fr=class{name=`agent`;getCommands(){return[ur()]}};function pr(){return{name:`agent-command-agent`,commandSources:[new fr],systemCommands:[dr()],sessionRequirements:[`runtime`]}}function mr(e){return e.trim().split(/\s+/).filter(Boolean)}async function hr(e,n){let[r=`list`,i,...a]=mr(n);if(r===`list`){let t=mt(e);return{message:Ye(t),success:!0,data:{count:t.length}}}if(!i)return{message:t,success:!1};if(r===`read`||r===`log`||r===`open`){let t=await At(e,i,St(a[0])),n=t.nextCursor?`\nNext offset: ${t.nextCursor.offset}`:``;return{message:t.lines.length>0?`${t.lines.join(`
6
6
  `)}${n}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:t.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await ke(e,i,a.join(` `)||void 0),{message:`Background task cancelled: ${i}`,success:!0,data:{taskId:i}}):r===`close`||r===`dismiss`?(await Ne(e,i),{message:`Background task closed: ${i}`,success:!0,data:{taskId:i}}):{message:`Unknown background action: ${r}`,success:!1}}function gr(){return{name:`background`,displayName:`Background Tasks`,description:e,source:`background`,modelInvocable:!1,subcommands:be()}}function _r(){let e=gr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,subcommands:e.subcommands,execute:hr}}var vr=class{name=`background`;getCommands(){return[gr()]}};function yr(){return{name:`agent-command-background`,commandSources:[new vr],systemCommands:[_r()]}}function br(e){let t=e.trim();return t.length>0?t:void 0}async function xr(e,t){let{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}=await Pe(e,br(t)),o=i-a;return{message:[`Context compacted.`,` Removed messages: ${o} (${i>0?Math.round(o/i*100):0}% of total)`,` Context: ${Math.round(n.usedPercentage)}% → ${Math.round(r.usedPercentage)}%`].join(`
7
7
  `),success:!0,data:{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}}}function Sr(){return{name:`compact`,displayName:`Compact Context`,description:`Compress context window`,modelDescription:`Summarize older conversation turns to free context-window space. Use it when the context is nearly full (check with the context command) or before starting a large new task; optional instructions say what the summary must keep. Returns how many messages were removed and the context usage before and after.`,source:`compact`,modelInvocable:!0,argumentHint:`[instructions]`,safety:`write`,example:`/compact Summarize the current context`}}function Cr(){let e=Sr();return{name:e.name,semanticRole:`contextReduction`,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},example:e.example,requiresPermission:!1,userInvocable:!0,modelInvocable:e.modelInvocable,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`blocking`,execute:xr}}var wr=class{name=`compact`;getCommands(){return[Sr()]}};function Tr(){return{name:`agent-command-compact`,commandSources:[new wr],systemCommands:[Cr()]}}function Er(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function Dr(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${Er(e)} (${t})`}function Or(e){return Math.ceil(e/un)}function D(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${Or(e.byteLength).toLocaleString()} tokens`].join(` `)}function kr(e){try{return JSON.parse(e)}catch{return null}}function Ar(e){let t=kr(e);if(t===null)return``;let n=Object.values(t)[0],r=typeof n==`string`?n:JSON.stringify(n);return r.length>60?`${r.slice(0,60)}…`:r}function jr(e){let t=0,n=0,r=0,i=0,a=0,o=0,s=0;for(let c of e){let e=Math.ceil(JSON.stringify(c).length/un);c.role===`system`?t+=e:c.role===`user`?(n+=e,r++):c.role===`assistant`?(i+=e,a++):c.role===`tool`&&(o+=e,s++)}return{systemTokens:t,userTokens:n,userCount:r,assistantTokens:i,assistantCount:a,toolTokens:o,toolCallCount:s,totalTokens:t+n+i+o}}function Mr(e){return Pr(e.filter(e=>e.category===`chat`).map(e=>({type:e.type,data:e.data})))}function Nr(e){return Pr(e.map(e=>({type:e.role,data:e})))}function Pr(e){let t=new Map;for(let n of e){if(n.type!==`assistant`)continue;let e=n.data;for(let n of e.toolCalls??[])t.set(n.id,{name:n.function.name,firstArg:Ar(n.function.arguments)})}let n=0,r=0,i=new Map;for(let a of e)if(a.type===`user`)n++;else if(a.type===`tool`){let e=a.data,n=t.get(e.toolCallId??``),o=n?.name??`tool`,s=n?.firstArg??``;r++,i.set(`${o}:${s}`,{toolName:o,displayArg:s})}return{turnCount:n,toolResults:[...i.values()],totalToolCallCount:r}}function Fr(e,t,n){let r=`${e}${t>0?` — ~${t.toLocaleString()} tokens`:``}:`;return n.length===0?`${r}\n (none)`:[r,...n.map(e=>` ${e}`)].join(`
8
8
  `)}function Ir(e){let t=jt(e),n=Ot(e),r=kt(e),i=e.getSession().getHistory(),a=jr(i),o=e.getSession().getOfferedToolSchemas(),s=pn(o),c=Nr(i),l=ht(e),u=l.filter(e=>e.loadType===`system`),d=l.filter(e=>e.loadType===`manual`),f=l.filter(e=>e.loadType===`prompt-reference`),p=u.reduce((e,t)=>e+Or(t.byteLength),0),m=d.reduce((e,t)=>e+Or(t.byteLength),0),h=f.reduce((e,t)=>e+Or(t.byteLength),0),g=c.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${c.turnCount} turn${c.turnCount===1?``:`s`} | ~${a.totalTokens.toLocaleString()} tokens`,_=c.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),v=c.toolResults.length,y=c.totalToolCallCount,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(`
@@ -13,7 +13,7 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
13
13
  `),success:!0,data:{usedTokens:r.usedTokens,maxTokens:r.maxTokens,percentage:r.usedPercentage,autoCompactThreshold:i,autoCompactThresholdSource:a,references:s}}}async function zr(e,t){let[n,...r]=t;if(n===`list`)return r.length>0?{success:!1,message:O}:Ir(e);if(n===`add`)return Vr(e,r);if(n===`remove`)return Hr(e,r);if(n===`clear`){if(r.length>0)return{success:!1,message:O};let t=je(e);return{success:!0,message:`Context references cleared: ${t.removed.length} removed.`,data:{removed:t.removed}}}return n===`auto`?Br(e,r):{success:!1,message:O}}function Br(e,t){let[n,r]=t;if(r!==void 0)return{success:!1,message:O};if(n===void 0){let t=Ot(e),n=kt(e);return{success:!0,message:[Dr(t,n),O].join(`
14
14
  `),data:{autoCompactThreshold:t,autoCompactThresholdSource:n}}}if(n===`on`)return Ur(e,a,`enabled`);if(n===`off`)return Ur(e,!1,`disabled`);if(n===`reset`){let t=zt(e);return Xt(e,a,`default`),{success:!0,message:`Auto compact reset to default: ${Er(a)} (${Lr(t)}).`,data:{autoCompactThreshold:a,autoCompactThresholdSource:`default`,persisted:t}}}let i=Gr(n);return i.success?Ur(e,i.threshold,`threshold set`):{success:!1,message:`${i.message}\n${O}`}}async function Vr(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:O};let r=await ge(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(`
15
15
  `),data:{reference:r.reference,evicted:r.evicted}}:{success:!1,message:r.diagnostics.join(`
16
- `)||`Context reference not found: ${n}`,data:{diagnostics:r.diagnostics}}}function Hr(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:O};let r=Rt(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 Ur(e,t,n){let r=sn(e,t),i=r?`settings`:`session`;return Xt(e,t,i),{success:!0,message:Wr(n,t,r),data:{autoCompactThreshold:t,autoCompactThresholdSource:i,persisted:r}}}function Wr(e,t,n){let r=Lr(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${Er(t)} (${r}).`:`Auto compact threshold set to ${Er(t)} (${r}).`}function Gr(e){if(e.endsWith(`%`)){let t=Number(e.slice(0,-1));return!Number.isFinite(t)||t<=0||t>100?{success:!1,message:`Auto compact percentage must be greater than 0% and at most 100%.`}:{success:!0,threshold:t/100}}if(e.includes(`.`)){let t=Number(e);return!Number.isFinite(t)||t<=0||t>1?{success:!1,message:`Auto compact fraction must be greater than 0 and at most 1.`}:{success:!0,threshold:t}}return{success:!1,message:`Use a percentage such as 85% or a fraction such as 0.85.`}}function Kr(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function k(e,t){return{name:e.name,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,...e.example===void 0?{}:{example:e.example},...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands},...e.runner===void 0?{}:{runner:e.runner},...e.surfaces===void 0?{}:{surfaces:e.surfaces},...t.semanticRole===void 0?{}:{semanticRole:t.semanticRole},lifecycle:t.lifecycle,requiresPermission:t.requiresPermission,execute:t.execute}}function qr(){return{name:`context`,displayName:`Context References`,description:`Context window info, reference inventory, and auto-compact controls`,modelDescription:"Inspect the context window. Use it before a large task or before deciding to compact, or to see which files the user pinned into context. Bare returns used/max tokens and percentage, the auto-compact threshold, the pinned-reference summary and the turn count; `list` returns the per-category token breakdown and every pinned reference.",source:`context`,modelInvocable:!0,userInvocable:!0,argumentHint:`list | add <path> | remove <path> | clear | auto ...`,subcommands:[{name:`list`,description:`List loaded context references`,source:`context`,modelInvocable:!0},{name:`add`,description:`Add a file to active context references`,source:`context`,modelInvocable:!1},{name:`remove`,description:`Remove a context reference`,source:`context`,modelInvocable:!1},{name:`clear`,description:`Clear context references`,source:`context`,modelInvocable:!1},{name:`auto`,description:`Inspect or change auto-compact policy`,source:`context`,modelInvocable:!1}]}}function Jr(){return k(qr(),{requiresPermission:!1,lifecycle:`inline`,execute:Rr})}var Yr=class{name=`context`;getCommands(){return[qr()]}};function Xr(){return{name:`agent-command-context`,commandSources:[new Yr],systemCommands:[Jr()]}}function Zr(){return{name:`devices`,displayName:`Devices`,description:`Manage this device's identity among the user's devices: list the roster with the device mesh status (whether it is on, how this device finds the others, which are linked), create the identity and its recovery phrase (init, for the user's first device only: on a device of a user who already has others it makes a separate identity that can never link to them), enrol another device (add shows a one-time code; join on the new device reads it), revoke a device, or rotate the signing key from the phrase. A new identity or new lists take effect in the running session's device mesh at once. Operator-only; the phrase and the enrollment code are handled on the terminal only, and results carry only device ids and names.`,source:`devices`,modelInvocable:!1,userInvocable:!0,argumentHint:`[list|init [name]|add|join [name]|revoke <device-id>|recover]`,subcommands:[{name:`list`,description:`List your devices and the device mesh status`,source:`devices`},{name:`init`,description:`Create your device identity and recovery phrase, on your first device only (on another, a separate identity that can never link to your devices; use add/join there)`,source:`devices`,argumentHint:`[name]`},{name:`revoke`,description:`Revoke a device with the signing key`,source:`devices`,argumentHint:`<device-id>`},{name:`recover`,description:`Rotate the signing key from your recovery phrase`,source:`devices`},{name:`add`,description:`Enrol another device: show a one-time code for it`,source:`devices`},{name:`join`,description:`Join your devices with the code another device shows`,source:`devices`,argumentHint:`[name]`}]}}const Qr={"no-terminal":`This needs an interactive terminal; the recovery phrase is never shown or read anywhere else.`,"not-initialized":"This device has no identity yet. If 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 A(e){return e.slice(0,10)}function $r(e){return new Date(e).toISOString().slice(0,10)}function ei(e){return{success:!1,message:Qr[e]}}function ti(e){if(e.state===`off`)return["Device mesh: off. Set `transports.mesh.enabled` to true in your user settings to link your devices."];if(e.state===`failed`)return[`Device mesh: could not start: ${e.reason??`no reason was reported`}.`];let t=e.sources.length>0?`; finds devices by ${e.sources.join(`, `)}`:``,n=e.linked.map(e=>` ${A(e.deviceId)} ${e.name??``} ${e.locality===`same-host`?`on this machine`:`on another machine`}`);return[`Device mesh: ${e.state}${t}.`,...n.length>0?[`Linked now:`,...n]:[`No device is linked right now.`]]}function ni(e,t){if(e===void 0)return{success:!0,message:Qr[`not-initialized`]};let n=e.devices.map(e=>{let t=[...e.thisDevice?[`this device`]:[],...e.holdsSigningKey?[`holds the signing key`]:[]],n=t.length>0?` (${t.join(`, `)})`:``;return` ${A(e.deviceId)} ${e.name}${n} certificate expires ${$r(e.certificateExpiresAt)}`});return{success:!0,message:[`Devices of user ${A(e.userId)}:`,...n,`${e.revokedDeviceCount} revoked. Roster and revocation list valid until ${new Date(e.listsExpireAt).toISOString()}.`,...t===void 0?[]:ti(t)].join(`
16
+ `)||`Context reference not found: ${n}`,data:{diagnostics:r.diagnostics}}}function Hr(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:O};let r=Rt(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 Ur(e,t,n){let r=sn(e,t),i=r?`settings`:`session`;return Xt(e,t,i),{success:!0,message:Wr(n,t,r),data:{autoCompactThreshold:t,autoCompactThresholdSource:i,persisted:r}}}function Wr(e,t,n){let r=Lr(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${Er(t)} (${r}).`:`Auto compact threshold set to ${Er(t)} (${r}).`}function Gr(e){if(e.endsWith(`%`)){let t=Number(e.slice(0,-1));return!Number.isFinite(t)||t<=0||t>100?{success:!1,message:`Auto compact percentage must be greater than 0% and at most 100%.`}:{success:!0,threshold:t/100}}if(e.includes(`.`)){let t=Number(e);return!Number.isFinite(t)||t<=0||t>1?{success:!1,message:`Auto compact fraction must be greater than 0 and at most 1.`}:{success:!0,threshold:t}}return{success:!1,message:`Use a percentage such as 85% or a fraction such as 0.85.`}}function Kr(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function k(e,t){return{name:e.name,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,...e.example===void 0?{}:{example:e.example},...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety},...e.subcommands===void 0?{}:{subcommands:e.subcommands},...e.runner===void 0?{}:{runner:e.runner},...e.surfaces===void 0?{}:{surfaces:e.surfaces},...t.semanticRole===void 0?{}:{semanticRole:t.semanticRole},lifecycle:t.lifecycle,requiresPermission:t.requiresPermission,execute:t.execute}}function qr(){return{name:`context`,displayName:`Context References`,description:`Context window info, reference inventory, and auto-compact controls`,modelDescription:"Inspect the context window. Use it before a large task or before deciding to compact, or to see which files the user pinned into context. Bare returns used/max tokens and percentage, the auto-compact threshold, the pinned-reference summary and the turn count; `list` returns the per-category token breakdown and every pinned reference.",source:`context`,modelInvocable:!0,userInvocable:!0,argumentHint:`list | add <path> | remove <path> | clear | auto ...`,subcommands:[{name:`list`,description:`List loaded context references`,source:`context`,modelInvocable:!0},{name:`add`,description:`Add a file to active context references`,source:`context`,modelInvocable:!1},{name:`remove`,description:`Remove a context reference`,source:`context`,modelInvocable:!1},{name:`clear`,description:`Clear context references`,source:`context`,modelInvocable:!1},{name:`auto`,description:`Inspect or change auto-compact policy`,source:`context`,modelInvocable:!1}]}}function Jr(){return k(qr(),{requiresPermission:!1,lifecycle:`inline`,execute:Rr})}var Yr=class{name=`context`;getCommands(){return[qr()]}};function Xr(){return{name:`agent-command-context`,commandSources:[new Yr],systemCommands:[Jr()]}}function Zr(){return{name:`devices`,displayName:`Devices`,description:`Manage this device's identity among the user's devices: list the roster with the device mesh status (whether it is on, how this device finds the others, which are linked), create the identity and its recovery phrase (init, for the user's first device only: on a device of a user who already has others it makes a separate identity that can never link to them), enrol another device (add shows a one-time code; join on the new device reads it), revoke a device, or rotate the signing key from the phrase. A new identity or new lists take effect in the running session's device mesh at once. Operator-only; the phrase and the enrollment code are handled on the terminal only, and results carry only device ids and names.`,source:`devices`,modelInvocable:!1,userInvocable:!0,argumentHint:`[list|init [name]|add|join [name]|revoke <device-id>|recover]`,subcommands:[{name:`list`,description:`List your devices and the device mesh status`,source:`devices`},{name:`init`,description:`Create your device identity and recovery phrase, on your first device only (on another, a separate identity that can never link to your devices; use add/join there)`,source:`devices`,argumentHint:`[name]`},{name:`revoke`,description:`Revoke a device with the signing key`,source:`devices`,argumentHint:`<device-id>`},{name:`recover`,description:`Rotate the signing key from your recovery phrase`,source:`devices`},{name:`add`,description:`Enrol another device: show a one-time code for it`,source:`devices`},{name:`join`,description:`Join your devices with the code another device shows`,source:`devices`,argumentHint:`[name]`}]}}const Qr={"no-terminal":`This needs an interactive terminal; the recovery phrase is never shown or read anywhere else.`,"not-initialized":"This device has no identity yet. If your other devices are already linked, run `/devices add` there and `/devices join` here, typing the code it shows. Run `/devices init` only when setting up your first device: it creates a separate identity that cannot link to an existing device group.","already-initialized":"This device already has an identity. Use `/devices recover` to rotate its signing key.",cancelled:`Cancelled. Nothing was changed.`,"confirmation-failed":`The confirmation did not match. Nothing was changed.`,"phrase-invalid":`That is not a valid recovery phrase. Nothing was changed.`,"phrase-mismatch":`That phrase (with that passphrase) belongs to a different identity than this device. Nothing was changed.`,"no-signing-key":"This device does not hold the signing key. Revoke from a device that does, or `/devices recover`.","signing-key-expired":"The signing key on this device has expired. Run `/devices recover` to issue a new one.","unknown-device":`No device in the roster has that id.`,"ambiguous-device":`More than one device starts with that id; give more of it.`,"self-revocation":"This device cannot revoke itself. Revoke it from another device, or `/devices recover`.","changed-concurrently":`The device identity changed in another session while this was waiting. Nothing was changed; try again.`,"no-relay":"Enrolling a device needs a signaling relay. Set `transports.webrtc.options.relayUrl` in your settings on both devices.","code-invalid":`That is not an enrollment code. Nothing was changed.`,"code-on-command-line":"Do not put the code on the command line, where history keeps it. Run `/devices add` again on the other device for a new code, then `/devices join` here and type it at the prompt.","code-not-accepted":"No device accepted that code: it is wrong, expired or already used, or the connection was tampered with. Run `/devices add` on the other device for a new code.","enrollment-expired":`The code expired before a device joined. Nothing was changed.`,"too-many-attempts":"Too many attempts failed to prove the code, so it no longer works. Nothing was changed; run `/devices add` again.","enrollment-declined":`The enrollment was declined. Nothing was changed.`,"enrollment-timed-out":`Nobody answered in time. Nothing was changed.`,"enrollment-failed":`The signaling relay or the connection to the other device failed before the enrollment finished. Nothing was changed; try again.`};function A(e){return e.slice(0,10)}function $r(e){return new Date(e).toISOString().slice(0,10)}function ei(e){return{success:!1,message:Qr[e]}}function ti(e){if(e.state===`off`)return["Device mesh: off. Set `transports.mesh.enabled` to true in your user settings to link your devices."];if(e.state===`failed`)return[`Device mesh: could not start: ${e.reason??`no reason was reported`}.`];let t=e.sources.length>0?`; finds devices by ${e.sources.join(`, `)}`:``,n=e.linked.map(e=>` ${A(e.deviceId)} ${e.name??``} ${e.locality===`same-host`?`on this machine`:`on another machine`}`);return[`Device mesh: ${e.state}${t}.`,...n.length>0?[`Linked now:`,...n]:[`No device is linked right now.`]]}function ni(e,t){if(e===void 0)return{success:!0,message:Qr[`not-initialized`]};let n=e.devices.map(e=>{let t=[...e.thisDevice?[`this device`]:[],...e.holdsSigningKey?[`holds the signing key`]:[]],n=t.length>0?` (${t.join(`, `)})`:``;return` ${A(e.deviceId)} ${e.name}${n} certificate expires ${$r(e.certificateExpiresAt)}`});return{success:!0,message:[`Devices of user ${A(e.userId)}:`,...n,`${e.revokedDeviceCount} revoked. Roster and revocation list valid until ${new Date(e.listsExpireAt).toISOString()}.`,...t===void 0?[]:ti(t)].join(`
17
17
  `)}}function ri(e){return e.getCommandInvocationSource()===`user`}async function j(e,t,n){if(!e.canHandoffTerminal())return ei(`no-terminal`);try{let r=await e.runWithTerminal(t);return r.ok?{success:!0,message:n(r.value)}:ei(r.reason)}catch(e){return{success:!1,message:`Device identity operation failed: ${e instanceof Error?e.message:`unknown error`}`}}}async function ii(e,t,n){if(!ri(t))return{success:!1,message:"`/devices` runs only for the operator at this terminal, never from a remote surface or the model."};let r=n.trim(),i=r.indexOf(` `),a=(i===-1?r:r.slice(0,i)).toLowerCase(),o=i===-1?``:r.slice(i+1).trim();switch(a){case``:case`list`:try{return ni(await e.list(),e.meshStatus?.())}catch(e){return{success:!1,message:`Device identity could not be read: ${e instanceof Error?e.message:`unknown error`}`}}case`init`:return j(t,()=>e.init(o.length>0?{name:o}:{}),e=>[`Device identity created. This device: ${A(e.deviceId)}; user ${A(e.userId)}.`,`It holds signing key ${A(e.signingKeyId)}.`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`],`Keep the recovery phrase offline; it is the only way to recover this identity.`].join(`
18
18
  `));case`recover`:return j(t,()=>e.recover(),e=>[`Recovered. New signing key ${A(e.signingKeyId)}; ${e.revokedSigningKeyCount} old signing key(s) revoked.`,`This device (${A(e.deviceId)}) is certified again.`,...e.droppedDeviceCount>0?[`${e.droppedDeviceCount} other device(s) were certified by a retired signing key and must enrol again.`]:[]].join(`
19
19
  `));case`revoke`:return o.length===0?{success:!1,message:`Usage: /devices revoke <device-id>`}:j(t,()=>e.revoke(o),e=>`Revoked ${e.name} (${A(e.deviceId)}). A new roster and revocation list were issued.`);case`add`:return j(t,()=>e.add(),e=>[`Enrolled ${e.name} (${A(e.deviceId)}). A new roster was issued.`,...e.confirmed?[]:["The new device did not confirm it kept its identity; check `/devices` there."]].join(`
@@ -21,7 +21,7 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
21
21
  `));default:return{success:!1,message:`Unknown argument "${a}". Usage: /devices [list|init [name]|add|join [name]|revoke <device-id>|recover]`}}}var ai=class{name=`devices`;getCommands(){return[Zr()]}};function oi(e){let t=k(Zr(),{requiresPermission:!1,lifecycle:`inline`,execute:(t,n)=>ii(e,t,n)});return{name:`agent-command-devices`,commandSources:[new ai],systemCommands:[t]}}const si=3e3;function ci(e,t){return new Promise(n=>{let r=Date.now(),i=wn({host:e,port:t}),a=setTimeout(()=>{i.destroy(),n({reachable:!1,error:`timeout (${si/1e3}s)`})},si);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({reachable:!0,elapsedMs:Date.now()-r})}),i.on(`error`,e=>{clearTimeout(a),n({reachable:!1,error:e.message})})})}function li(e){if(!vn(e))return{exists:!1,isDirectory:!1,writable:!1};let t;try{t=Sn(e)}catch{return{exists:!0,isDirectory:!1,writable:!1}}let n=t.isDirectory(),r=t.mode&511,i=!1;try{gn(e,_n.W_OK),i=!0}catch{i=!1}return{exists:!0,isDirectory:n,writable:i,mode:r}}function ui(e,t=process.env){let n=e.trim().split(/\s+/)[0];if(n===void 0||n.length===0)return!1;if(On(n)||n.includes(`/`))return vn(n);let r=process.platform===`win32`?[``,`.exe`,`.cmd`,`.bat`]:[``];return(t.PATH??``).split(En).filter(e=>e.length>0).some(e=>r.some(t=>vn(kn(e,n+t))))}function di(e=process.env){return{probeEndpoint:ci,inspectPath:li,resolveCommand:t=>ui(t,e),ownerOnlyGuarantee:()=>jn()}}const fi={ok:`✓`,warn:`⚠`,fail:`✗`,"not-configured":`○`,"not-probed":`–`};function pi(e,t){let n=[` ${fi[e.status]} ${e.label} [${e.id}] ${e.status}${e.cause===void 0?``:`: ${e.cause}`}`];e.path!==void 0&&n.push(` path: ${e.path}`);for(let t of e.detail??[])n.push(` ${t}`);if(e.repair!==void 0){let r=t.formatRepairCommand?.(e.repair);n.push(` repair: ${r??`request repair for ${e.repair} through your host`}`)}return n}function mi(e,t){let n=t.productName?.trim();return e.failCount===0&&e.warnCount===0?n?`✓ All checks passed. ${n} is ready to use.`:`✓ All checks passed.`:e.failCount>0?n?`✗ ${e.failCount} issue(s) found. Fix the items above to use ${n}.`:`✗ ${e.failCount} issue(s) found. Fix the items above before use.`:n?`⚠ ${e.warnCount} warning(s). ${n} may work but check the items above.`:`⚠ ${e.warnCount} warning(s). Check the items above.`}function hi(e,t=`Doctor`,n={}){let r=[``,t,``,...e.checks.flatMap(e=>pi(e,n)),``,mi(e,n)];return e.repairable.length>0&&r.push(` repairable: ${e.repairable.join(`, `)} — ${n.repairOffer??`ask your host to apply a repair`}`),r.push(``),r}const M=`[redacted]`,gi=/(\b[a-z][a-z0-9+.-]{0,31}:\/\/)([^\s/@]+)@/gi,_i=/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,vi=/\b(?:sk-[A-Za-z0-9_-]{8,}|AIza[0-9A-Za-z_-]{20,}|ghp_[A-Za-z0-9]{20,}|xox[abprs]-[A-Za-z0-9-]{10,})\b/g,yi=/\.\.\."[^"]*"\.\.\./g;function bi(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function xi(e,t=[]){let n=e,r=new Set;for(let e of t)typeof e!=`string`||e.length<4||r.has(e)||(r.add(e),n=n.replace(new RegExp(bi(e),`g`),M));return n=n.replace(gi,`$1${M}@`),n=n.replace(_i,`$1 ${M}`),n=n.replace(vi,M),n}function Si(e){return e instanceof fe?`${e.name}: ${e.filePath} is not valid JSON (see the settings check)`:`${e.name}: ${e.message.replace(yi,`…`)}`}function Ci(e,t){let n=new Set,r=e=>{if(e!==void 0){if(e.startsWith(`$ENV:`)){let r=t[e.slice(5).trim()];r!==void 0&&n.add(r);return}n.add(e)}};for(let t of e)if(t!==void 0){r(t.provider?.apiKey);for(let e of Object.values(t.providers??{}))r(e.apiKey);for(let e of Object.values(t.env??{}))n.add(e)}return[...n]}function wi(e){let t=Tn(Dn(e.kind===`host`?e.path:e.relativePath)).replace(/^\./,``);return`settings.${e.scope}.${t}`}function Ti(e){let t=e.settingsSources.find(t=>t.kind===`host`&&t.path===e.userSettingsPath);return t===void 0?void 0:wi(t)}function Ei(e){let t=e.cause;if(t===void 0)return e.state;switch(t.state){case`unreadable`:return t.errno===void 0?`unreadable`:`unreadable (${t.errno})`;case`invalid-json`:return t.offset===void 0?`invalid-json`:`invalid-json at offset ${t.offset}`;case`schema-invalid`:return`schema-invalid: ${(t.issues??[]).map(e=>`${e.path} (${e.code})`).join(`, `)}`;default:return t.state}}function Di(e,t){return e.source.kind===`host`&&e.source.path===t.userSettingsPath&&e.state===`empty`}function Oi(e,t){let n=wi(e.source),r=e.source.kind===`host`?e.source.path:e.source.relativePath;if(e.state===`absent`)return{id:n,label:`Settings layer`,status:`not-configured`,path:r,cause:`absent`};if(e.state===`ok`)return{id:n,label:`Settings layer`,status:`ok`,path:r,cause:`ok`};let i=Di(e,t);return{id:n,label:`Settings layer`,status:`fail`,path:r,cause:Ei(e),detail:i?[`The file exists but holds nothing; rewriting it as {} loses no content.`]:[`Session start will refuse this configuration. Fix the file at the named path.`],...i?{repair:n}:{}}}function ki(e){let t=[...e.provenance.map(e=>`${e.key}: ${e.rule} ← ${e.contributors.join(` → `)}`),...e.hookSources.map((e,t)=>`settings hook ${t+1}: ${e.event}/${e.type} ← ${e.source}`)];return e.partial?{id:`settings.merge`,label:`Merged settings`,status:`warn`,cause:`partial — a present layer is broken; session start will refuse this configuration`,detail:t.length===0?[`(no key declared by a healthy layer)`]:t}:{id:`settings.merge`,label:`Merged settings`,status:`ok`,cause:`${e.provenance.length} key(s) from ${e.layers.filter(e=>e.state===`ok`).length} layer(s)`,detail:t.length===0?[`(no settings declared)`]:t}}function Ai(e){let t=at(e.settingsSources);return{inspection:t,checks:[...t.layers.map(t=>Oi(t,e)),ki(t)]}}function ji(e){let t=e.source===`env-default`?`env-default via ${e.sourceEnvVar??`environment`}`:`settings profile`;return{id:`provider.resolution`,label:`Provider`,status:`ok`,cause:`${e.name} (${e.model}) — ${t}`}}function Mi(e,t){let n=S(t.providerDefinitions,e.name),r=e.baseURL??n?.defaults?.baseURL;if(r!==void 0)try{let t=new URL(r),n=t.port===``?t.protocol===`http:`?80:443:Number(t.port);return{host:t.hostname,port:n,origin:e.baseURL===void 0?`definition defaults.baseURL`:`profile baseURL`}}catch{return}let i=n?.endpoint;return i===void 0?void 0:{...i,origin:`definition endpoint`}}async function Ni(e,t,n){let r=Mi(e,t);if(r===void 0)return{id:`provider.reachability`,label:`Provider reachability`,status:`warn`,cause:`not checked: ${e.name} declares no endpoint (no profile baseURL, defaults.baseURL or definition endpoint)`};let i=await n.probeEndpoint(r.host,r.port),a=`${r.host}:${r.port} (${r.origin})`;return i.reachable?{id:`provider.reachability`,label:`Provider reachability`,status:`ok`,cause:`${a} reachable in ${i.elapsedMs??0}ms`}:{id:`provider.reachability`,label:`Provider reachability`,status:`warn`,cause:`${a} unreachable: ${i.error??`connection failed`}`,detail:[`Check proxy settings, firewall, or the profile baseURL.`]}}async function Pi(e,t){let n;try{n=It(e.settingsSources,{providerDefinitions:e.providerDefinitions,env:{...e.env}})}catch(t){return{checks:[{id:`provider.resolution`,label:`Provider`,status:`fail`,cause:Si(t instanceof Error?t:Error(String(t))),detail:[e.diagnosticGuidance?.providerResolution??`Configure a provider or set its API key environment variable.`]}]}}return{checks:[ji(n),await Ni(n,e,t)],...n.apiKey===void 0?{}:{resolvedApiKey:n.apiKey}}}function Fi(e,t){let{root:n,sessions:r}=e.userStorage,i=[t.inspectPath(n),t.inspectPath(r)];return i.some(e=>!e.exists)?`missing`:i.some(e=>!e.isDirectory||!e.writable)?`unwritable`:t.ownerOnlyGuarantee()===`posix-mode`?i.some(e=>e.mode!==void 0&&(e.mode&63)!=0)?`too-open`:`ok`:`mode-not-probed`}function Ii(e,t){let{root:n,sessions:r}=e.userStorage,i={id:`storage.user`,label:`User storage`,path:n};switch(Fi(e,t)){case`missing`:return{...i,status:`warn`,cause:`not initialized (created on first write)`,detail:[n,r],repair:`storage.user`};case`unwritable`:return{...i,status:`fail`,cause:`exists but is not a writable directory`,detail:[n,r]};case`too-open`:return{...i,status:`warn`,cause:`not owner-only (mode allows group/other access)`,detail:[n,r],repair:`storage.user`};case`mode-not-probed`:return{...i,status:`not-probed`,cause:`owner-only mode is not asserted on this platform (windows-acl)`};default:return{...i,status:`ok`,cause:`writable, owner-only`}}}function Li(e,t){if(e.projectAccess.status!==`trusted`)return{id:`storage.project`,label:`Project storage`,status:`not-configured`,cause:`project sources are disabled in an untrusted workspace`};let n=e.projectStorageRoot;if(n===void 0)return{id:`storage.project`,label:`Project storage`,status:`not-configured`,cause:`the host names no project state root`};let r=t.inspectPath(n);return r.exists?r.isDirectory&&r.writable?{id:`storage.project`,label:`Project storage`,status:`ok`,path:n,cause:`writable`}:{id:`storage.project`,label:`Project storage`,status:`fail`,path:n,cause:`exists but is not a writable directory`}:{id:`storage.project`,label:`Project storage`,status:`not-configured`,path:n,cause:`absent (created on first write)`}}function Ri(e){let t=e.projectAccess;if(t.status===`trusted`)return{id:`workspace.trust`,label:`Workspace trust`,status:`ok`,path:t.identity.displayPath,cause:`trusted`};let n=t.cause===void 0?t.trustState:`${t.trustState}: ${t.cause.name}: ${t.cause.message}`;return{id:`workspace.trust`,label:`Workspace trust`,status:t.trustState===`store-unavailable`||t.trustState===`identity-unavailable`?`fail`:`warn`,...t.displayPath===void 0?{}:{path:t.displayPath},cause:n,detail:[e.diagnosticGuidance?.projectTrust??`Project sources are disabled. Approve this workspace with the host.`]}}function zi(e){let t=new Map,n=!1;for(let r of e.layers)for(let[e,i]of Object.entries(r.settings?.providers??{})){let r=t.get(e);r?.apiKey!==void 0&&i.baseURL!==void 0&&i.baseURL!==r.baseURL&&i.apiKey===void 0&&(n=!0),t.set(e,{baseURL:i.baseURL??r?.baseURL,apiKey:i.apiKey??r?.apiKey})}return n?{id:`provider.security`,label:`Provider security`,status:`warn`,cause:`provider endpoint quarantined; inherited credential removed (credential redacted)`}:void 0}function Bi(e,t,n){let r=zi(n);return[Ri(e),Ii(e,t),Li(e,t),...r===void 0?[]:[r]]}const Vi=`storage.user`;function Hi(e){let t=Ti(e);return t===void 0?[Vi]:[t,Vi]}function Ui(e,t){return Hi(t).includes(e)}function Wi(e,t){let n=at(t.settingsSources).layers.find(t=>wi(t.source)===e);return n===void 0||n.source.kind!==`host`?{ok:!1,reason:`${e}: no user settings layer in this composition`}:Di(n,t)?{ok:!0,plan:{id:e,description:`rewrite the empty user settings file as {}`,path:n.source.path}}:{ok:!1,reason:`${e}: state is ${n.state}; only an empty file is rewritten`}}function Gi(e,t){let n=Fi(e,t),{root:r}=e.userStorage;return n!==`missing`&&n!==`too-open`?{ok:!1,reason:`storage.user: state is ${n}; only a missing or too-open directory is repaired`}:{ok:!0,plan:{id:`storage.user`,description:`create the user store root and its sessions directory as owner-only directories`,path:r}}}function Ki(e,t,n){return Ui(e,t)?e===`storage.user`?Gi(t,n):Wi(e,t):{ok:!1,reason:`${e}: not a repairable check (allowlist: ${Hi(t).join(`, `)})`}}async function qi(e,t,n,r){let i=Ki(e,t,n);if(!i.ok)return{applied:!1,reason:i.reason};if(!await r(i.plan))return{applied:!1,reason:`${e}: repair not confirmed; nothing written`};let a=Ki(e,t,n);if(!a.ok)return{applied:!1,reason:`${a.reason} (state changed before the write)`};if(a.plan.id===`storage.user`){let{root:e,sessions:n}=t.userStorage;An(n,{withinRoot:e})}else ln(a.plan.path,{});return{applied:!0,plan:a.plan}}const Ji={"manifest-unreadable":`manifest could not be parsed`,"manifest-invalid":`manifest is not a valid plugin.json (name, version, description required)`,"load-failed":`plugin assets could not be loaded`};function Yi(e){let t=[],n=e.reduce((e,t)=>e+t.loaded.length,0),r=e.filter(e=>e.cacheDirPresent);t.push(r.length===0?{id:`plugins`,label:`Plugins`,status:`not-configured`,cause:`no plugin cache directory`,detail:e.map(e=>e.pluginsDir)}:{id:`plugins`,label:`Plugins`,status:`ok`,cause:`${n} plugin(s) loaded`,detail:r.map(e=>`${e.pluginsDir}: ${e.loaded.length} loaded, ${e.skipped.length} skipped`)});for(let n of e){for(let e of n.skipped)e.reason!==`disabled`&&t.push({id:`plugin.${e.pluginId}`,label:`Plugin`,status:`fail`,path:e.manifestPath,cause:Ji[e.reason]??e.reason,...e.detail===void 0?{}:{detail:[e.detail]}});for(let e of n.hookIssues)t.push({id:`plugin.${e.pluginId}.hooks`,label:`Plugin hooks`,status:`warn`,path:e.hooksPath,cause:`hooks.json fails the hooks schema: ${e.issues.map(e=>`${e.path} (${e.code})`).join(`, `)}`,detail:[`Report-only: the plugin still loads; these hooks may not run.`]})}return t}function Xi(e){let t=ot(e.contributionSources,e.skillRoots).roots.filter(e=>e.present),n=t.reduce((e,t)=>e+t.discovered.length,0),r=[t.length===0?{id:`skills`,label:`Skills and commands`,status:`not-configured`,cause:`no skill or command root present`}:{id:`skills`,label:`Skills and commands`,status:`ok`,cause:`${n} discovered`,detail:t.map(e=>`${e.sourceDisplayName}: ${e.root} (${e.discovered.length})`)}];for(let e of t)for(let t of e.skipped)r.push({id:`skill.${t.path}`,label:`Skill definition`,status:t.reason===`frontmatter-invalid`?`fail`:`warn`,path:`${e.sourceDisplayName}: ${t.path}`,cause:t.reason,...t.detail===void 0?{}:{detail:[t.detail]}});return r}function Zi(e,t){let n=[],r=e=>{if(e!==void 0)for(let t of Object.values(e))for(let e of t??[])for(let t of e.hooks??[])t.type===`command`&&typeof t.command==`string`&&n.push(t.command)};r(e.merged.hooks);for(let e of t)for(let t of e.loaded)r(t.hooks);return n}function Qi(e,t,n){let r=Zi(e,t),i=r.filter(e=>!n.resolveCommand(e));return[r.length===0?{id:`hooks`,label:`Hooks`,status:`not-configured`,cause:`no command hooks configured`}:i.length===0?{id:`hooks`,label:`Hooks`,status:`ok`,cause:`${r.length} command hook(s); every executable resolves`}:{id:`hooks`,label:`Hooks`,status:`warn`,cause:`${i.length} command hook executable(s) not found on PATH`,detail:i.map(e=>e.split(/\s+/)[0]??e)},{id:`hooks.execution`,label:`Hook execution`,status:`not-probed`,cause:`the doctor does not run hooks`}]}function $i(e,t){let n=`mcp.plugin.${e.pluginId}.${e.name}`,r=[`Declaration only: plugin .mcp.json is not a runtime source. Copy a supported definition to mcpServers in settings, then use /mcp approve <name>.`];if(e.transport===`stdio`&&e.command!==void 0)return t.resolveCommand(e.command)?{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`stdio command ${e.command} resolves`,detail:r}:{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`stdio command ${e.command} not found on PATH`,detail:[...r,...e.envKeys.length===0?[]:[`env keys: ${e.envKeys.join(`, `)}`]]};if(e.transport===`http`&&e.url!==void 0)try{return new URL(e.url),{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`url ${e.url}`,detail:r}}catch{return{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`url is not parseable`,detail:r}}return{id:n,label:`MCP declaration (plugin)`,status:`warn`,path:e.mcpPath,cause:`neither command nor url declared`,detail:r}}function ea(e,t,n){let r=[];if(e.mcpActivation===void 0)r.push({id:`mcp.activation`,label:`MCP activation`,status:`not-configured`,cause:`this CLI composes no MCP activation adapter`});else{let t=e.mcpActivation.list();r.push({id:`mcp.activation`,label:`MCP activation`,status:`ok`,cause:`${t.length} server(s) known`});for(let e of t)r.push({id:`mcp.${e.serverId}`,label:`MCP server`,status:e.allowed?`ok`:`warn`,cause:`${e.status} (${e.source}): ${e.reason}`})}for(let e of t){for(let t of e.mcpServers)r.push($i(t,n));for(let t of e.mcpFaults)r.push({id:`mcp.plugin.${t.pluginId}`,label:`MCP declaration (plugin)`,status:`warn`,path:t.mcpPath,cause:`.mcp.json ${t.reason}`})}return r.push({id:`mcp.connection`,label:`MCP connection`,status:`not-probed`,cause:`the doctor does not connect to MCP servers`}),r}function ta(e,t,n){let r,i;try{r=bt(e.pluginsDirs,{settingsPath:e.userSettingsPath})}catch(t){i=t instanceof Error?t.message:String(t),r=bt(e.pluginsDirs,{enabledPlugins:{}})}return[...Yi(r).map(e=>i!==void 0&&e.id===`plugins`?{...e,status:`fail`,cause:`no plugin loads: ${i}`}:e),...Xi(e),...Qi(n,r,t),...ea(e,r,t)]}function na(e,t,n){return{id:e,label:t,status:`fail`,cause:Si(n)}}async function ra(e,t,n,r){try{return r(await n())}catch(n){return[na(e,t,n instanceof Error?n:Error(String(n)))]}}function ia(e,t){let n=e=>xi(e,t);return{...e,label:n(e.label),...e.path===void 0?{}:{path:n(e.path)},...e.cause===void 0?{}:{cause:n(e.cause)},...e.detail===void 0?{}:{detail:e.detail.map(n)}}}function aa(e){let t=e.filter(e=>e.status===`fail`).length;return{checks:e,failCount:t,warnCount:e.filter(e=>e.status===`warn`).length,repairable:e.flatMap(e=>e.repair===void 0?[]:[e.repair]),exitCode:t===0?0:1}}function oa(e){try{let t=Ai(e);return{checks:t.checks,result:t}}catch(e){return{checks:[na(`settings`,`Settings`,e instanceof Error?e:Error(String(e)))]}}}async function sa(e,t){let n=[...e.hostChecks];e.compositionFailure!==void 0&&n.push(e.compositionFailure);let r=oa(e);n.push(...r.checks);let i=r.result?.inspection,a=Ci((i?.layers??[]).map(e=>e.settings),e.env);return n.push(...await ra(`provider`,`Provider`,()=>Pi(e,t),e=>(e.resolvedApiKey!==void 0&&a.push(e.resolvedApiKey),e.checks))),i!==void 0&&(n.push(...await ra(`storage`,`Storage`,()=>Bi(e,t,i),e=>e)),n.push(...await ra(`extensions`,`Extensions`,()=>ta(e,t,i),e=>e))),aa(n.map(e=>ia(e,a)))}function ca(){return{name:`doctor`,displayName:`Doctor`,description:"Diagnose configuration and runtime readiness; `repair <check-id>` applies an allowlisted fix",source:`doctor`,modelInvocable:!1,userInvocable:!0,argumentHint:`[repair <check-id>]`}}var la=class{name=`doctor`;getCommands(){return[ca()]}};async function ua(e,t){let n=e.getUserInteraction();if(n===void 0)return!1;let r=await n.ask(x(`doctor-repair:${t.id}`,`Repair ${t.id}?`,{description:`${t.description} (${t.path})`,defaultYes:!1}));return r.type===`answer`&&r.values[0]===`yes`}async function da(e,t,n,r,i){let a=await qi(e,t,n,e=>ua(r,e));if(!a.applied)return{success:!1,message:a.reason,data:{repair:e,applied:!1}};let o=await sa(t,n),s=o.checks.find(t=>t.id===e);return{success:!0,message:[`Repaired ${e}: ${a.plan.description}.`,...hi(o,`${i.title??`Doctor`} (after repair)`,i)].join(`
22
22
  `),data:{repair:e,applied:!0,status:s?.status,exitCode:o.exitCode}}}async function fa(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>`}:da(o,e,t,n,i);let s=await sa(e,t);return{success:s.failCount===0,message:hi(s,i.title,i).join(`
23
23
  `),data:{failCount:s.failCount,warnCount:s.warnCount,repairable:[...s.repairable]}}}function pa(e,t=di({...e.env}),n={}){let r=k(ca(),{requiresPermission:!1,lifecycle:`inline`,execute:(r,i)=>fa(e,t,r,i,n)});return{name:`agent-command-doctor`,commandSources:[new la],systemCommands:[r]}}function ma(){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=Pn(e,[...t],{cwd:n,stdio:`inherit`,env:process.env});a.on(`error`,i),a.on(`exit`,(e,t)=>{if(e!==null){r(e);return}if(t){let e=Mn.signals[t];r(128+(e??0));return}r(0)})})}const ha="Compose a message in $EDITOR (optionally pre-filled with `/editor <text>`), then return it.";async function ga(e,t,n=`agent-editor-`){if(!e.canHandoffTerminal())return{message:`An editor is unavailable here (no interactive terminal).`,success:!1};let r=ma(),i=yn(kn(Nn(),n)),a=kn(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=bn(a,`utf8`).replace(/\s+$/u,``);return n.length===0?{message:`Editor closed with empty content; nothing composed.`,success:!1}:{message:n,success:!0,data:{content:n}}}finally{xn(i,{recursive:!0,force:!0,maxRetries:3,retryDelay:20})}}function _a(){return{name:`editor`,displayName:`Editor`,description:ha,source:`editor`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function va(e){let t=_a();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)=>ga(t,n,e)}}var ya=class{name=`editor`;getCommands(){return[_a()]}};function ba(e){return{name:`agent-command-editor`,commandSources:[new ya],systemCommands:[va(e)]}}const xa=`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{[xa]:t,...n}=e;o.write(n)}else o.write({...e,[xa]:a.saved})}return{success:!0,message:a.message,data:{advisor:{...r.status()}}}}function wa(){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 Ta(){let e=wa();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Ca}}var Ea=class{name=`advisor`;getCommands(){return[wa()]}};function Da(){return{name:`agent-command-advisor`,commandSources:[new Ea],systemCommands:[Ta()]}}const Oa=[`auto`,...dn];function ka(e){return e.disposition===`not-applied`?`This model doesn't support effort levels, so it will use its default.`:`Effort: ${s[e.requested]}`}async function Aa(e){let t=e.getUserInteraction();if(t===void 0)return;let n=await t.ask(T(`effort`,`Select model effort`,Oa.map(e=>({value:e,label:s[e]}))));return wt(n.type===`answer`?n.values[0]:void 0,`/effort`)}function ja(e){let t=e.getCommandHostAdapters?.().effort;if(t!==void 0)return t.getResolution();let n=e.getSession().getModelEffort();return Vt({command:n,modelDefault:n===`auto`?`high`:n})}function Ma(e){return e.getCommandHostAdapters?.()??{}}function Na(e,t){let n=Ma(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 Pa(e,t){let n;try{n=wt(t.trim()||void 0,`/effort`),n===void 0&&(n=await Aa(e))}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}let r=ja(e);if(n===void 0)return{message:ka(r),success:!0,data:{effort:r}};let i=Ma(e).effort,a;try{a=i===void 0?Vt({command:n,modelDefault:r.effective}):await i.apply(n,e.getSession()),i===void 0&&await e.getSession().applyModelOptions({effort:n}),e.getCommandInvocationSource()===`user`&&Na(e,n)}catch(e){return{message:`Model effort was not applied: ${e instanceof Error?e.message:String(e)}`,success:!1}}return{message:ka(a),success:!0,data:{effort:a}}}const Fa=`auto | ${dn.join(` | `)}`;function Ia(){return{name:`effort`,displayName:`Model Effort`,description:`Show or change the model effort level`,source:`effort`,argumentHint:Fa,modelInvocable:!1}}function La(){let e=Ia();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Pa}}var Ra=class{name=`effort`;getCommands(){return[Ia()]}};function za(){return{name:`agent-command-effort`,commandSources:[new Ra],systemCommands:[La()]}}async function Ba(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:[Re()]}}function Va(){return{name:`exit`,displayName:`Exit Session`,description:c,source:`exit`,modelInvocable:!1}}function Ha(){let e=Va();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Ba}}var Ua=class{name=`exit`;getCommands(){return[Va()]}};function Wa(){return{name:`agent-command-exit`,commandSources:[new Ua],systemCommands:[Ha()]}}const Ga=`none`,P=`--same-dir`;function Ka(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0),n=t.find(e=>e.startsWith(`--`)&&e!==P);if(n!==void 0)return{error:`Unknown option: ${n}\nUsage: /fork [name] [${P}]`};let r=t.filter(e=>e!==P);return{name:r.length>0?r.join(` `):void 0,isolation:t.includes(P)?Ga:`worktree`}}function qa(e){return e instanceof Error?e.message:String(e)}function Ja(e,t,n){return[`Forked this conversation into "${e}" (${t}), running ${n===Ga?`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 Ya(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 Xa(e,t=``,n){let r=Ka(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: ${qa(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:Ja(a.name,e.id,r.isolation),success:!0,data:{sessionId:a.sessionId,name:a.name,taskId:e.id}}}catch(e){return{message:Ya(a,qa(e),n),success:!1}}}function Za(){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 Qa(e){let t=Za();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)=>Xa(t,n,e)}}var $a=class{name=`fork`;getCommands(){return[Za()]}};function eo(e){return{name:`agent-command-fork`,commandSources:[new $a],systemCommands:[Qa(e)],sessionRequirements:[`agent-runtime`]}}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 F(e){return{success:!1,message:e,data:{git:`commit`,committed:!1}}}async function ao(e){let t=await e.ask(hn(`git-commit-subject`,`Commit message`,{description:`Conventional Commits form: <type>[(scope)][!]: <description>`,placeholder:`feat: describe the change`}));if(t.type===`answer`)return 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:b(`diff --cached`,n)??`git failed`}};if(n.exitCode===1)return{staged:!0};let r=await e.run(u,{cwd:t}),i=b(`status`,r);if(i!==void 0||r.kind!==`exited`)return{staged:!1,result:{success:!1,message:i??`git status failed`}};let a=Dt(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:F("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:F(`Commit cancelled.`)};n=e}return{subject:n}}async function co(e,t,n,r,i){if(i===void 0)return{confirmed:!1,result:F(`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=b(`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
+ `)}function Ya(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 Xa(e,t=``,n){let r=Ka(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: ${qa(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:Ja(a.name,e.id,r.isolation),success:!0,data:{sessionId:a.sessionId,name:a.name,taskId:e.id}}}catch(e){return{message:Ya(a,qa(e),n),success:!1}}}function Za(){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 Qa(e){let t=Za();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)=>Xa(t,n,e)}}var $a=class{name=`fork`;getCommands(){return[Za()]}};function eo(e){return{name:`agent-command-fork`,commandSources:[new $a],systemCommands:[Qa(e)],sessionRequirements:[`runtime`]}}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 F(e){return{success:!1,message:e,data:{git:`commit`,committed:!1}}}async function ao(e){let t=await e.ask(hn(`git-commit-subject`,`Commit message`,{description:`Conventional Commits form: <type>[(scope)][!]: <description>`,placeholder:`feat: describe the change`}));if(t.type===`answer`)return 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:b(`diff --cached`,n)??`git failed`}};if(n.exitCode===1)return{staged:!0};let r=await e.run(u,{cwd:t}),i=b(`status`,r);if(i!==void 0||r.kind!==`exited`)return{staged:!1,result:{success:!1,message:i??`git status failed`}};let a=Dt(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:F("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:F(`Commit cancelled.`)};n=e}return{subject:n}}async function co(e,t,n,r,i){if(i===void 0)return{confirmed:!1,result:F(`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=b(`diff --cached --name-status`,a);if(o!==void 0||a.kind!==`exited`)return{confirmed:!1,result:{success:!1,message:o??`git failed`}};let s=a.stdout.split(`
25
25
  `).filter(e=>e.length>0).map(e=>e.replace(/\t/g,` `)),c=[`Message: ${n}`,...r.map(e=>`Warning: ${e}`),`Staged (${s.length}):`,...s.map(e=>` ${e}`)].join(`
26
26
  `);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:F(`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=b(`commit`,l);if(u!==void 0||l.kind!==`exited`)return{success:!1,message:u??`git commit failed`};let d=l.stdout.split(`
27
27
  `).find(e=>e.trim().length>0)??``;return{success:!0,message:`Committed: ${d.length>0?d:o}`,data:{git:`commit`,committed:!0,subject:o,files:c.files}}}const uo=`Usage: /git status | /git diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | /git commit [<subject>]`;function fo(e,t,n){return{name:e,description:t,source:`git`,modelInvocable:!1,...n?{argumentHint:n}:{}}}function po(){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:[fo(`status`,`Show the branch and the staged, unstaged and untracked paths`),fo(`diff`,`Show the unstaged diff, the staged diff, or a diff against one or two revisions`,`[--staged | <rev> | <a>..<b>] [-- <path> ...]`),fo(`commit`,`Commit the staged changes with a Conventional Commits subject, after confirming`,`[<subject>]`)]}}async function mo(e,t,n=Le()){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${uo}`}:Ke(n,s);case`diff`:return Ge(n,s,o);case`commit`:return lo(n,s,o,e.getUserInteraction());default:return{success:!1,message:a.length===0?uo:`Unknown /git verb "${a}".\n${uo}`}}}function ho(e){let t=po();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)=>mo(t,n,e)}}var go=class{name=`git`;getCommands(){return[po()]}};function _o(e={}){return{name:`agent-command-git`,commandSources:[new go],systemCommands:[ho(e.port??Le())]}}const vo=`Assign an autonomous goal the agent pursues across turns until satisfied.`;function yo(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(`
@@ -34,40 +34,42 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
34
34
  `+I(n.status())}:{success:!0,message:[`This session could move to:`,To(e),``,Eo().message??``].join(`
35
35
  `)}}let i=await n.destinations();if(!i.some(e=>e.deviceId===r))return{success:!1,message:`No reachable machine is called '${r}'.\n`+(i.length>0?`Reachable now:\n${To(i)}`:`None are reachable right now.`)+`\n${I(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${I(n.status())}`};let c=await s.ask({id:`handoff:${r}`,title:`Move this session to ${r}?`,description:[`What will NOT travel:`,...o].join(`
36
36
  `),options:[{value:`move`,label:`Move it to ${r}`},{value:`stay`,label:`Keep it here`}]});if(c.type!==`answer`||!c.values.includes(`move`))return{success:!0,message:`Hand-off cancelled.\n${I(n.status())}`};let l=[],u=await n.transfer(r,e=>{l.push(Oo(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`}.`,I(u)].join(`
37
- `)}}function Oo(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 ko(){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 Ao(){let e=ko();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Do(e,t)}}var jo=class{name=`handoff`;getCommands(){return[ko()]}};function Mo(){return{name:`agent-command-handoff`,commandSources:[new jo],systemCommands:[Ao()]}}function No(e,t){return{success:!0,message:Xe(e)}}function Po(){return{name:`help`,displayName:`Help`,description:d,source:`help`,modelInvocable:!1}}function Fo(){let e=Po();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:No}}var Io=class{name=`help`;getCommands(){return[Po()]}};function Lo(){return{name:`agent-command-help`,commandSources:[new Io],systemCommands:[Fo()]}}function Ro(){return{name:`keybindings`,displayName:`Keybindings`,description:`Open the contextual terminal keybindings file in $EDITOR`,source:`keybindings`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}async function zo(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=ma(),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 Bo=class{name=`keybindings`;getCommands(){return[Ro()]}};function Vo(e){let t=Ro(),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=>zo(e,t)};return{name:`agent-command-keybindings`,commandSources:[new Bo],systemCommands:[n]}}async function Ho(e){let t=e.getUserInteraction();if(!t)return;let n=xe().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:Ct(i)}async function Uo(e,t){let n=Ct(t);return n===void 0&&(n=await Ho(e),n===void 0)?{message:et(),success:!1}:{message:`Language set to "${n}".`,success:!0,data:{language:n},hostActions:[{type:`language-change`,language:n}]}}function Wo(){return{name:`language`,displayName:`Language`,description:p,source:`language`,argumentHint:f,subcommands:xe(`language`),modelInvocable:!1}}function Go(){let e=Wo();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:Uo}}var Ko=class{name=`language`;getCommands(){return[Wo()]}};function qo(){return{name:`agent-command-language`,commandSources:[new Ko],systemCommands:[Go()]}}function Jo(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 Yo={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 Xo(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 Zo(e,t,n=`session`){let r=t===`trust-workspace`||t===`sign-in`&&n===`terminal`?` in a terminal, then restart the session`:``;return`${Xo(e)} ${Yo[t]}, so its tools are unavailable. You cannot do this yourself; ask the user to run \`${Jo(e,t,n)}\`${r}.`}function Qo(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])=>`- ${Zo(e,t)}`)].join(`
38
- `)}function $o(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 es(e,t,n){let r=E(e.serverId),i=$o(e.status,t);return{...r===void 0?{}:{name:r},status:e.status,...t===void 0?{}:{oauth:t},...i===void 0?{}:{suggestCommand:Jo(e.serverId,i,n)}}}function ts(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 ns(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=>es(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(ts)];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(`
39
- `),success:!0,data:{servers:n,unreadableSources:r}}}function L(e){return e.getCommandHostAdapters?.().mcpActivation}const rs={"signed-in":`signed in`,"expired-refreshable":`token expired, will refresh`,"sign-in-required":`sign-in required`,"signed-out":`signed out`},is={refresh_token:`refresh token`,access_token:`access token`};function as(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 ${is[e.token]} was revoked`:`the ${is[e.token]} was not (${e.failure??`revocation-failed`}) and stays valid until it expires`).join(`; `)}}function R(e){return E(e)??`<server>`}function os(e){let t=R(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 ss(e,t){let n=e.displayName?` (${e.displayName})`:``,r=t===void 0?``:` — OAuth: ${rs[t]}${t===`sign-in-required`||t===`signed-out`?os(e.serverId):``}`;return` ${e.serverId}${n} — ${e.status} — ${e.source} — ${e.reason}${r}`}function cs(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 ls(e){let t=await e.oauthStatus?.()??[];return new Map(t.map(e=>[e.serverId,e.state]))}async function us(e){if(!e)return{message:`MCP activation management is not available in this environment.`,success:!0};let t=e.list(),n=await ls(e),r=e.sourceProblems?.()??[],i=r.length===0?[]:[`MCP source problems:\n${r.map(cs).join(`
40
- `)}`];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=>ss(e,n.get(e.serverId))).join(`
41
- `)}`,...i].join(`
37
+ `)}}function Oo(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 ko(){return{name:`handoff`,displayName:`Hand off`,description:"Push this conversation to another running session for the same user on this machine, or to another linked device, after the operator confirms what stays behind (uncommitted changes, running processes; credentials never travel). The receiving operator must also accept; the session arrives saved, not started, and this one ends once it is saved there. With no argument it lists the sessions and devices it could go to. User-only: the model cannot run it; when the user wants to continue this work in another session or on another device, suggest they run `/handoff <session-or-device-id>`.",source:`handoff`,modelInvocable:!1,userInvocable:!0,argumentHint:`[session-id]`}}function Ao(){let e=ko();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Do(e,t)}}var jo=class{name=`handoff`;getCommands(){return[ko()]}};function Mo(){return{name:`agent-command-handoff`,commandSources:[new jo],systemCommands:[Ao()]}}function No(e,t){return{success:!0,message:Xe(e)}}function Po(){return{name:`help`,displayName:`Help`,description:d,source:`help`,modelInvocable:!1}}function Fo(){let e=Po();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:No}}var Io=class{name=`help`;getCommands(){return[Po()]}};function Lo(){return{name:`agent-command-help`,commandSources:[new Io],systemCommands:[Fo()]}}function Ro(){return{name:`keybindings`,displayName:`Keybindings`,description:`Open the contextual terminal keybindings file in $EDITOR`,source:`keybindings`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}async function zo(e,t){if(!e)return{success:!1,message:`Key bindings are available in an interactive terminal. Run /keybindings there.`};if(!t.canHandoffTerminal())return{success:!1,message:`Keybindings editor is unavailable here.`};let n=await e.ensureFile(),r=ma(),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 Bo=class{name=`keybindings`;getCommands(){return[Ro()]}};function Vo(e){let t=Ro(),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=>zo(e,t)};return{name:`agent-command-keybindings`,commandSources:[new Bo],systemCommands:[n]}}async function Ho(e){let t=e.getUserInteraction();if(!t)return;let n=xe().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:Ct(i)}async function Uo(e,t){let n=Ct(t);return n===void 0&&(n=await Ho(e),n===void 0)?{message:et(),success:!1}:{message:`Language set to "${n}".`,success:!0,data:{language:n},hostActions:[{type:`language-change`,language:n}]}}function Wo(){return{name:`language`,displayName:`Language`,description:p,source:`language`,argumentHint:f,subcommands:xe(`language`),modelInvocable:!1}}function Go(){let e=Wo();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:Uo}}var Ko=class{name=`language`;getCommands(){return[Wo()]}};function qo(){return{name:`agent-command-language`,commandSources:[new Ko],systemCommands:[Go()]}}function Jo(e,t,n=`session`,r){let i=E(e)??`<server>`;switch(t){case`approve`:return`/mcp approve ${i}`;case`sign-in`:return n===`terminal`?r===void 0?void 0:`${r} mcp login ${i}`:`/mcp login ${i}`;case`trust-workspace`:return r===void 0?void 0:`${r} trust`}}const Yo={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 Xo(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 Zo(e,t,n=`session`,r){let i=t===`trust-workspace`||t===`sign-in`&&n===`terminal`?` in a terminal, then restart the session`:``,a=Jo(e,t,n,r),o=a===void 0?t===`trust-workspace`?`ask the user to trust this workspace in a terminal`:`ask the user to sign in from a terminal`:`ask the user to run \`${a}\`${i}`;return`${Xo(e)} ${Yo[t]}, so its tools are unavailable. You cannot do this yourself; ${o}.`}function Qo(e,t){if(e.size!==0)return[`MCP servers that did not start this session. Mention this only when the user needs one of these servers or its tools:`,...[...e].map(([e,n])=>`- ${Zo(e,n,`session`,t)}`)].join(`
38
+ `)}function $o(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 es(e,t,n,r){let i=E(e.serverId),a=$o(e.status,t);return{...i===void 0?{}:{name:i},status:e.status,...t===void 0?{}:{oauth:t},...a===void 0?{}:(()=>{let t=Jo(e.serverId,a,n,r);return t===void 0?{}:{suggestCommand:t}})()}}function ts(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 ns(e,t){if(!e)return{message:`MCP is not available in this environment.`,success:!0};let n=new Map((await e.oauthStatus?.()??[]).map(e=>[e.serverId,e.state])),r=e.list().map(r=>es(r,n.get(r.serverId),e.userActionSurface??`session`,t)),i=(e.sourceProblems?.()??[]).length,a=r.length===0?[`No MCP servers are configured.`]:[`MCP servers:`,...r.map(ts)];return i>0&&a.push(`${i} MCP configuration source(s) could not be read; the user can see which with \`/mcp status\`.`),{message:a.join(`
39
+ `),success:!0,data:{servers:r,unreadableSources:i}}}function L(e){return e.getCommandHostAdapters?.().mcpActivation}const rs={"signed-in":`signed in`,"expired-refreshable":`token expired, will refresh`,"sign-in-required":`sign-in required`,"signed-out":`signed out`},is={refresh_token:`refresh token`,access_token:`access token`};function as(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 ${is[e.token]} was revoked`:`the ${is[e.token]} was not (${e.failure??`revocation-failed`}) and stays valid until it expires`).join(`; `)}}function R(e){return E(e)??`<server>`}function os(e,t){let n=R(e),r=`run /mcp login ${n}, or ${t===void 0?`sign in from a terminal`:`run ${t} mcp login ${n} in a terminal`}`;return E(e)===void 0?` (${r}; its name cannot be shown safely here)`:` (${r})`}function ss(e,t,n){let r=e.displayName?` (${e.displayName})`:``,i=t===void 0?``:` — OAuth: ${rs[t]}${t===`sign-in-required`||t===`signed-out`?os(e.serverId,n):``}`;return` ${e.serverId}${r} — ${e.status} — ${e.source} — ${e.reason}${i}`}function cs(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 ls(e){let t=await e.oauthStatus?.()??[];return new Map(t.map(e=>[e.serverId,e.state]))}async function us(e,t){if(!e)return{message:`MCP activation management is not available in this environment.`,success:!0};let n=e.list(),r=await ls(e),i=e.sourceProblems?.()??[],a=i.length===0?[]:[`MCP source problems:\n${i.map(cs).join(`
40
+ `)}`];return n.length===0?{message:a.length===0?`No MCP definitions are registered.`:a[0],success:!0,data:{servers:[],sourceProblems:i}}:{message:[`MCP activation status:\n${n.map(e=>ss(e,r.get(e.serverId),t)).join(`
41
+ `)}`,...a].join(`
42
42
 
43
- `),success:!0,data:{servers:t.map(e=>({serverId:e.serverId,...e.displayName===void 0?{}:{displayName:e.displayName},source:e.source,status:e.status,allowed:e.allowed,provenanceId:e.provenanceId,definitionFingerprint:e.definitionFingerprint,securityIdentity:e.securityIdentity,...n.has(e.serverId)?{oauth:n.get(e.serverId)}:{},...e.connection===void 0?{}:{connection:e.connection},...e.connectionFailureReason===void 0?{}:{connectionFailureReason:e.connectionFailureReason},...e.toolNames===void 0?{}:{toolNames:e.toolNames}})),sourceProblems:r}}}async function ds(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`?us(L(e)):ns(L(e))}if(i===`login`)return vs(e,a);if(i===`reload`)return ps(e);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] | /mcp reload`,success:!1};if(!a)return{message:`Usage: /mcp ${i} <serverId>`,success:!1};let o=L(e);if(!o)return{message:`MCP activation management is not available in this environment.`,success:!0};if(i===`logout`)return fs(o,a);try{let t=await o[i](a),n={message:`MCP server ${a} is now ${t.status}. ${t.reason}`,success:t.status===`approved`||t.status===`rejected`||t.status===`revoked`,data:{serverId:t.serverId,status:t.status,allowed:t.allowed,source:t.source,provenanceId:t.provenanceId,definitionFingerprint:t.definitionFingerprint,securityIdentity:t.securityIdentity}};if(i!==`approve`||t.status!==`approved`||o.reload===void 0)return n;try{let t=await ps(e);return{...n,message:`${n.message} ${t.message}`,data:{...n.data,reload:t.data??{}}}}catch(e){let t=e instanceof Error?e.message:String(e);return{...n,message:`${n.message} Could not connect now: ${t}. Run /mcp reload to retry.`}}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}async function fs(e,t){if(e.oauthLogout===void 0||(await ls(e)).get(t)===void 0)return{message:`MCP server ${t} does not declare OAuth.`,success:!1};let n;try{n=await e.oauthLogout(t)}catch{return{message:`Signing out of MCP server ${t} failed.`,success:!1}}return{message:`${n.removed?`Signed out of MCP server ${t}`:`MCP server ${t} was not signed in`}; ${as(n)}.`,success:!0,data:{...n}}}async function ps(e){let t=L(e);if(!t)return{message:`MCP activation management is not available in this environment.`,success:!0};if(t.reload===void 0)return{message:`Reloading MCP servers is not available in this environment.`,success:!1};let n=await t.reload(),r=[];try{r=n.tools.length===0?[]:await e.getSession().addTools(n.tools)}finally{n.reloadToken!==void 0&&t.reloadToolsAdded?.(n.reloadToken,r)}let i=n.tools.length-r.length;return{message:`Reloaded MCP servers. ${[n.connectedServerIds.length===0?`No server newly connected.`:`Connected: ${n.connectedServerIds.join(`, `)}.`,n.failedServerIds.length===0?void 0:`Still not connected: ${n.failedServerIds.join(`, `)} (see /mcp status).`,i===0?void 0:`${i} of the new tools ${i===1?`was`:`were`} left out: the session already has a tool by that name.`].filter(e=>e!==void 0).join(` `)}`.trim(),success:!0,data:{connectedServerIds:n.connectedServerIds,failedServerIds:n.failedServerIds,tools:[...r]}}}let z=0;function ms(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{if(r.aborted)return`cancel`;z+=1;let i=await n.ask({id:`mcp-login-browser-${z}`,title:`Sign in to MCP server ${R(t)}`,description:`Your browser will open this URL; if it does not, open it yourself:\n${e.authorizationUrl}\n\nThe sign-in completes on its own once you approve in the browser.`,options:[{value:`open`,label:`Open my browser`},{value:`paste`,label:`Paste the redirect instead (browser on another machine)`},{value:`cancel`,label:`Cancel`}],maxSelect:1,default:{values:[`open`]}});if(i.type!==`answer`||r.aborted)return`cancel`;let a=i.values[0];return a===`open`||a===`paste`?a:`cancel`}}function hs(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{r.throwIfAborted(),z+=1;let i=await n.ask({id:`mcp-login-redirect-${z}`,title:`Sign in to MCP server ${R(t)}`,description:`Open this URL in a browser:\n${e.authorizationUrl}\n\nAfter you approve, the browser is sent to ${e.redirectUri}, which may not load. Copy the full address from its address bar and paste it here.`,allowFreeText:!0,masked:!0,placeholder:`Redirect URL (not shown)`});if(i.type!==`answer`||i.text===void 0||i.text.trim()===``)throw Error(`No redirect URL was pasted.`);return i.text}}function gs(e){let{serverId:t,failure:n}=e,r=R(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 _s(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 vs(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=R(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=L(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=hs(e,o),d=r?void 0:ms(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:gs(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:`${_s(o,f.connection,p.length)}${h}`,success:!0,data:{serverId:o,connection:f.connection??`not-connected`,tools:[...p],...m===0?{}:{dropped:m}}}}function ys(){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},{name:`reload`,description:`Retry connecting every MCP server that is not currently connected`,source:`mcp-activation`,modelInvocable:!1},...[`approve`,`reject`,`revoke`,`login`,`logout`].map(e=>({name:e,description:bs[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const bs={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 xs(){let e=ys();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},argumentHint:e.argumentHint,...e.subcommands===void 0?{}:{subcommands:e.subcommands},requiresPermission:!0,modelRequiresPermission:!1,userInvocable:!0,modelInvocable:!0,lifecycle:`inline`,execute:ds}}var Ss=class{name=`mcp-activation`;getCommands(){return[ys()]}};function Cs(){return{name:`agent-command-mcp-activation`,commandSources:[new Ss],systemCommands:[xs()]}}function B(){return{message:g,success:!1}}function ws(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Ts(e){try{return{ok:!0,store:Fe(e)}}catch(e){return{ok:!1,result:ws(e instanceof Error?e:String(e))}}}async function Es(e){let t=await e.list(),n=t.topics.length>0?t.topics.map(e=>`- ${e.name}: ${e.path}`).join(`
43
+ `),success:!0,data:{servers:n.map(e=>({serverId:e.serverId,...e.displayName===void 0?{}:{displayName:e.displayName},source:e.source,status:e.status,allowed:e.allowed,provenanceId:e.provenanceId,definitionFingerprint:e.definitionFingerprint,securityIdentity:e.securityIdentity,...r.has(e.serverId)?{oauth:r.get(e.serverId)}:{},...e.connection===void 0?{}:{connection:e.connection},...e.connectionFailureReason===void 0?{}:{connectionFailureReason:e.connectionFailureReason},...e.toolNames===void 0?{}:{toolNames:e.toolNames}})),sourceProblems:i}}}async function ds(e,t){let n=t.trim(),r=n.indexOf(` `),i=e.getCommandProductVocabulary?.()?.cliName,a=(r===-1?n:n.slice(0,r)).toLowerCase(),o=r===-1?``:n.slice(r+1).trim();if(a.startsWith(`skill-`))return ps(e,a,o);if(a===``||a===`status`||a===`list`){let t=e.getCommandInvocationSource?.();return t===`user`||t===`remote`?us(L(e),i):ns(L(e),i)}if(a===`login`)return xs(e,o);if(a===`reload`)return hs(e);if(a!==`approve`&&a!==`reject`&&a!==`revoke`&&a!==`logout`)return{message:`Unknown argument. Usage: /mcp [status] | /mcp <approve|reject|revoke|logout> <serverId> | /mcp login <serverId> [--no-browser] | /mcp reload`,success:!1};if(!o)return{message:`Usage: /mcp ${a} <serverId>`,success:!1};let s=L(e);if(!s)return{message:`MCP activation management is not available in this environment.`,success:!0};if(a===`logout`)return ms(s,o);try{let t=await s[a](o),n={message:`MCP server ${o} is now ${t.status}. ${t.reason}`,success:t.status===`approved`||t.status===`rejected`||t.status===`revoked`,data:{serverId:t.serverId,status:t.status,allowed:t.allowed,source:t.source,provenanceId:t.provenanceId,definitionFingerprint:t.definitionFingerprint,securityIdentity:t.securityIdentity}};if(a!==`approve`||t.status!==`approved`||s.reload===void 0)return n;try{let t=await hs(e);return{...n,message:`${n.message} ${t.message}`,data:{...n.data,reload:t.data??{}}}}catch(e){let t=e instanceof Error?e.message:String(e);return{...n,message:`${n.message} Could not connect now: ${t}. Run /mcp reload to retry.`}}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function fs(e){if(!e.startsWith(`[`))return e.split(/\s+/).filter(Boolean);try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(e=>typeof e==`string`)?t:void 0}catch{return}}async function ps(e,t,n){let r=e.getCommandInvocationSource?.(),i=r===`user`||r===`remote`&&e.getCommandSurfaceLocalityEvidence?.()===`local`;if(t!==`skill-list`&&!i)return{success:!1,message:`Only a known local user can inspect, approve or withdraw MCP skill instructions.`};let a=fs(n),o=t===`skill-list`?1:t===`skill-approve`?3:2;if(![`skill-list`,`skill-inspect`,`skill-approve`,`skill-withdraw`].includes(t)||!a||a.length!==o||a.some(e=>e.length===0))return{success:!1,message:`Usage: /mcp skill-list <server> | skill-inspect <server> <uri> | skill-approve <server> <uri> <fingerprint> | skill-withdraw <server> <uri>. JSON string arrays also accept opaque arguments.`};let s=L(e)?.skills;if(!s)return{success:!1,message:`MCP Skills are not available in this environment.`};let c=a[0],l=a[1];try{if(t===`skill-list`){let e=await s.list(c);return{success:!0,message:e.length===0?`No MCP skills are advertised.`:e.map(e=>`${e.name} — ${e.uri}\n${e.description}`+(e.invocationName?`\nInvoke skill: ${e.invocationName}`:``)+(e.unavailableReason?`\nUnavailable: ${e.unavailableReason}`:``)).join(`
44
+
45
+ `),data:{skills:e.map(e=>({serverId:e.serverId,uri:e.uri,name:e.name,description:e.description,...e.invocationName?{invocationName:e.invocationName}:{},...e.unavailableReason?{unavailableReason:e.unavailableReason}:{}}))}}}if(t===`skill-withdraw`)return s.withdraw(c,l,`user`),{success:!0,message:`MCP skill content consent withdrawn.`};let e=t===`skill-approve`?await s.approve(c,l,a[2],`user`):await s.inspect(c,l),n=[c,l,e.fingerprint],r=n.every(e=>/^[\w:./%-]+$/.test(e))?n.join(` `):JSON.stringify(n);return{success:!0,message:t===`skill-approve`?`MCP skill content consent saved; activation remains a separate action.`:`${e.content}\n\nFrontmatter: ${JSON.stringify(e.frontmatter)}\n\nApprove exactly this content: /mcp skill-approve ${r}`,data:{serverId:e.serverId,uri:e.uri,namespace:e.namespace,fingerprint:e.fingerprint,frontmatter:e.frontmatter,...t===`skill-inspect`?{content:e.content}:{}}}}catch{return{success:!1,message:`MCP skill request refused. Check /mcp status; run /mcp skill-inspect <server> <uri> before granting content consent.`}}}async function ms(e,t){if(e.oauthLogout===void 0||(await ls(e)).get(t)===void 0)return{message:`MCP server ${t} does not declare OAuth.`,success:!1};let n;try{n=await e.oauthLogout(t)}catch{return{message:`Signing out of MCP server ${t} failed.`,success:!1}}return{message:`${n.removed?`Signed out of MCP server ${t}`:`MCP server ${t} was not signed in`}; ${as(n)}.`,success:!0,data:{...n}}}async function hs(e){let t=L(e);if(!t)return{message:`MCP activation management is not available in this environment.`,success:!0};if(t.reload===void 0)return{message:`Reloading MCP servers is not available in this environment.`,success:!1};let n=await t.reload(),r=[];try{r=n.tools.length===0?[]:await e.getSession().addTools(n.tools)}finally{n.reloadToken!==void 0&&t.reloadToolsAdded?.(n.reloadToken,r)}let i=n.tools.length-r.length;return{message:`Reloaded MCP servers. ${[n.connectedServerIds.length===0?`No server newly connected.`:`Connected: ${n.connectedServerIds.join(`, `)}.`,n.failedServerIds.length===0?void 0:`Still not connected: ${n.failedServerIds.join(`, `)} (see /mcp status).`,i===0?void 0:`${i} of the new tools ${i===1?`was`:`were`} left out: the session already has a tool by that name.`].filter(e=>e!==void 0).join(` `)}`.trim(),success:!0,data:{connectedServerIds:n.connectedServerIds,failedServerIds:n.failedServerIds,tools:[...r]}}}let gs=0;function _s(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{if(r.aborted)return`cancel`;gs+=1;let i=await n.ask({id:`mcp-login-browser-${gs}`,title:`Sign in to MCP server ${R(t)}`,description:`Your browser will open this URL; if it does not, open it yourself:\n${e.authorizationUrl}\n\nThe sign-in completes on its own once you approve in the browser.`,options:[{value:`open`,label:`Open my browser`},{value:`paste`,label:`Paste the redirect instead (browser on another machine)`},{value:`cancel`,label:`Cancel`}],maxSelect:1,default:{values:[`open`]}});if(i.type!==`answer`||r.aborted)return`cancel`;let a=i.values[0];return a===`open`||a===`paste`?a:`cancel`}}function vs(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{r.throwIfAborted(),gs+=1;let i=await n.ask({id:`mcp-login-redirect-${gs}`,title:`Sign in to MCP server ${R(t)}`,description:`Open this URL in a browser:\n${e.authorizationUrl}\n\nAfter you approve, the browser is sent to ${e.redirectUri}, which may not load. Copy the full address from its address bar and paste it here.`,allowFreeText:!0,masked:!0,placeholder:`Redirect URL (not shown)`});if(i.type!==`answer`||i.text===void 0||i.text.trim()===``)throw Error(`No redirect URL was pasted.`);return i.text}}function ys(e,t){let{serverId:n,failure:r}=e,i=R(n);switch(r){case`not-oauth`:return`MCP server ${n} does not declare OAuth; there is nothing to sign in to.`;case`url-unset`:return`MCP server ${n} has an unset variable in its url.`;case`sign-in-in-progress`:return`A sign-in to MCP server ${n} is already in progress.`;case`prompt-unavailable`:return t===void 0?`Signing in without a browser needs a redirect URL pasted in a terminal, but no product command name is available in this session.`:`Signing in without a browser needs the redirect URL pasted here, and nothing here can ask for it; run ${t} mcp login ${i} --no-browser in a terminal.`;case`browser-failed`:return`Sign-in to MCP server ${n} failed (browser-failed): no browser could be opened. Run /mcp login ${i} --no-browser to paste the redirect instead.`;default:{let a=r===`token-exchange-failed`&&e.preRegisteredClient?t===void 0?` If its pre-registered client needs a secret, sign in from a terminal configured for this product.`:` If its pre-registered client needs a secret, run ${t} mcp login ${i} --client-secret in a terminal.`:``;return`Sign-in to MCP server ${n} failed (${r??`unexpected-error`}); nothing was changed.${a}`}}}function bs(e,t,n){switch(t){case`connected`:return n===0?`Signed in to MCP server ${e}; it is connected and offers no new tools.`:`Signed in to MCP server ${e}; ${n} of its tools ${n===1?`is`:`are`} available from your next message.`;case`recovered`:return`Signed in to MCP server ${e}; its tools work again.`;case`not-admitted`:return`Signed in to MCP server ${e}, but it is not approved for this session (see /mcp status).`;default:return`Signed in to MCP server ${e}, but it could not connect in this session; the next session connects it.`}}async function xs(e,t){let n=e.getCommandProductVocabulary?.()?.cliName,r=t.split(/\s+/).filter(e=>e!==``),i=r.includes(`--no-browser`),a=r.includes(`--client-secret`),o=r.filter(e=>e!==`--no-browser`&&e!==`--client-secret`),s=o[0];if(o.length!==1||s===void 0||s.startsWith(`-`))return{message:`Usage: /mcp login <serverId> [--no-browser]`,success:!1};let c=R(s);if(a)return{message:n===void 0?`A client secret is never typed into a session. Sign in from a terminal configured for this product.`:`A client secret is never typed into a session. Run ${n} mcp login ${c} --client-secret in a terminal.`,success:!1};let l=L(e);if(!l)return{message:`MCP activation management is not available in this environment.`,success:!0};if(l.oauthLogin===void 0)return{message:n===void 0?`Signing in is not available in this session; sign in from a terminal configured for this product.`:`Signing in is not available in this session; run ${n} mcp login ${c} in a terminal.`,success:!1};let u=new AbortController,d=vs(e,s),f=i?void 0:_s(e,s),p=await l.oauthLogin({serverId:s,noBrowser:i,signal:u.signal,...d===void 0?{}:{readRedirect:(e,t)=>d(e,t).catch(e=>{throw u.abort(),e})},...f===void 0?{}:{confirmBrowser:async(e,t)=>{let n=await f(e,t);return n===`cancel`&&u.abort(),n}}});if(p.failure!==void 0)return{message:ys(p,n),success:!1,data:{serverId:s,failure:p.failure}};let m=p.tools.length===0?[]:await e.getSession().addTools(p.tools);p.tools.length>0&&l.oauthToolsAdded?.(s,m);let h=p.tools.length-m.length,g=h===0?``:` ${h} of its tools ${h===1?`was`:`were`} left out: the session already has a tool by that name.`;return{message:`${bs(s,p.connection,m.length)}${g}`,success:!0,data:{serverId:s,connection:p.connection??`not-connected`,tools:[...m],...h===0?{}:{dropped:h}}}}function Ss(){return{name:`mcp`,displayName:`MCP activation`,description:`Show each MCP server's trust approval and OAuth sign-in state, or change one server: approve, reject or revoke its trust; sign in to it (login, which connects it in this session) or out of it (logout). Use when an MCP server is not approved, needs a sign-in, or should stop being used. List MCP Skills metadata, inspect exact instructions, approve their content fingerprint or withdraw content consent separately from server trust. Returns the status list, verified preview, or what the action did.`,modelDescription:`Show which MCP servers are configured and why any of them is unavailable. Use it when an MCP server or its tools are missing, a tool call reports that a server needs sign-in or approval, or the user asks about MCP servers. Returns one line per server: its name, activation state, sign-in state, and the command to suggest to the user when the server needs their approval, sign-in or workspace trust. Use skill-list <server> to discover advertised skill names, URIs and descriptions without loading instructions. Returns an invocation name for each supported skill; use the session skill activation command with that exact name when its workflow fits the task. If content consent is needed, ask the user to run /mcp skill-inspect <server> <uri> and approve the reviewed fingerprint. You cannot approve, inspect instructions, sign in or sign out yourself.`,argumentHint:`[status] | <approve|reject|revoke|logout> <server> | login <server> [--no-browser]`,source:`mcp-activation`,modelInvocable:!0,runsBare:!0,subcommands:[{name:`status`,description:`Show every MCP server’s name, activation state and sign-in state`,source:`mcp-activation`,modelInvocable:!0},{name:`skill-list`,description:`Discover MCP skill metadata and exact invocation names, or reasons they are unavailable, without activating instructions`,argumentHint:`<server>`,source:`mcp-activation`,modelInvocable:!0},...[`skill-inspect`,`skill-approve`,`skill-withdraw`].map(e=>({name:e,description:e===`skill-inspect`?`Review verified MCP skill instructions and frontmatter without activation`:e===`skill-approve`?`Grant consent for an exactly reviewed MCP skill content fingerprint`:`Withdraw MCP skill content consent`,argumentHint:e===`skill-approve`?`<server> <uri> <fingerprint>`:`<server> <uri>`,source:`mcp-activation`,modelInvocable:!1})),{name:`reload`,description:`Retry connecting every MCP server that is not currently connected`,source:`mcp-activation`,modelInvocable:!1},...[`approve`,`reject`,`revoke`,`login`,`logout`].map(e=>({name:e,description:Cs[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const Cs={approve:`Trust and activate an MCP server`,reject:`Refuse an MCP server`,revoke:`Withdraw an earlier approval`,login:`Sign in to an OAuth MCP server and connect it in this session`,logout:`Sign out of an OAuth MCP server and revoke its tokens`};function ws(){let e=Ss();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},argumentHint:e.argumentHint,...e.subcommands===void 0?{}:{subcommands:e.subcommands},requiresPermission:!0,modelRequiresPermission:!1,userInvocable:!0,modelInvocable:!0,lifecycle:`inline`,execute:ds}}var Ts=class{name=`mcp-activation`;getCommands(){return[Ss()]}};function Es(){return{name:`agent-command-mcp-activation`,commandSources:[new Ts],systemCommands:[ws()]}}function z(){return{message:g,success:!1}}function B(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Ds(e){try{return{ok:!0,store:Fe(e)}}catch(e){return{ok:!1,result:B(e instanceof Error?e:String(e))}}}async function Os(e){let t=await e.list(),n=t.topics.length>0?t.topics.map(e=>`- ${e.name}: ${e.path}`).join(`
44
46
  `):`(none)`;return{message:[`Memory index: ${t.indexPath}`,`Topics directory: ${t.topicsPath}`,`Topics:`,n].join(`
45
- `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function Ds(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 Os(e){let t=e[1],n=e[2],r=e.slice(3).join(` `).trim();if(!(!t||!ut(t)||!n||r.length===0))return{type:t,topic:n,text:r}}async function ks(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(`
46
- `),success:!0,data:{count:t.length}}}function As(e,t){Lt(e,t)}async function js(e,t,n){if(!n)return B();try{let{record:r,saved:i}=await ye(t,n);return As(e,{type:`memory_candidate_approved`,candidateId:r.id,topic:r.topic,reason:`approved-by-user`}),As(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 ws(e instanceof Error?e:String(e))}}async function Ms(e,t,n){if(!n)return B();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return As(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 ws(e instanceof Error?e:String(e))}}function Ns(e){let t=vt(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(`
47
- `),success:!0,data:{count:t.length,references:[...t]}}}function Ps(e){return((e.getCommandHostAdapters?.().permissionMode)?.getPermissionMode()??e.getSession?.().getPermissionMode())===`plan`}async function Fs(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`,i=Ts(e);if(!i.ok)return i.result;let a=i.store;if(r===`list`)return Es(a);if(r===`show`)return Ds(a,n[1]);if(r===`pending`)return ks(a);if(r===`approve`)return js(e,a,n[1]);if(r===`reject`)return Ms(e,a,n[1]);if(r===`used`)return Ns(e);if(r===`add`){if(e.getCommandInvocationSource()===`model`&&Ps(e))return{message:`Plan mode saves no memory. Save it after plan mode ends.`,success:!1};let t=Os(n);if(!t)return B();if(rt(t.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let r=await a.append(t);return{message:r.deduplicated?`${t.type} memory already exists in ${r.topicPath}`:`Saved ${t.type} memory to ${r.topicPath}`,success:!0,data:{indexPath:r.indexPath,topicPath:r.topicPath,topic:r.topic,deduplicated:r.deduplicated}}}return B()}function Is(){return{name:`memory`,displayName:`Memory`,description:h,modelDescription:"Read and write this project’s durable memory. Use `list` or `show [topic]` to look up stored conventions, preferences or references before asking the user again; `add <type> <topic> <text>` to save a durable preference, project convention, feedback item or reference worth reusing across sessions (never secrets, credentials or transient facts); `pending` to see candidates awaiting the user’s review; `used` to report which memory items informed this turn. Bare lists topics. In plan mode `add` is refused: save after plan mode ends. Returns the requested topics or entries, or a confirmation of what was saved. Approving or rejecting a pending candidate is the user’s review: suggest `/memory approve <id>` or `/memory reject <id>`.",source:`memory`,argumentHint:m,modelInvocable:!0,safety:`write`,subcommands:Se()}}function Ls(){let e=Is();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:Fs}}var Rs=class{name=`memory`;getCommands(){return[Is()]}};function zs(){return{name:`agent-command-memory`,commandSources:[new Rs],systemCommands:[Ls()]}}function Bs(e,t){try{cn(e,t);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function Vs(e,t){let n=Kt(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 Hs(e,t){let n=Tt(t);if(n===`retry`)return Vs(e,t);if(n!==void 0){if(!pt(n))return{message:$e(),success:!1};let t=Bs(e,n);if(t!==void 0)return t;let r=Nt(e);return{message:`Permission mode set to: ${n}\n${Ze(r)}`,success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}let r=Nt(e);return{message:Ze(r),success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}async function Us(e){let t=e.getUserInteraction();if(!t)return;let n=we().map(e=>({value:e.name,label:e.displayName??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 Ws(e,t){let n=Tt(t);if(n===void 0&&(n=await Us(e),n===void 0)){let t=Mt(e);return{message:`Current mode: ${t}`,success:!0,data:{mode:t}}}if(!pt(n))return{message:$e(),success:!1};let r=Bs(e,n);return r===void 0?{message:`Permission mode set to: ${n}`,success:!0,data:{mode:n}}:r}function Gs(){return{name:`mode`,displayName:`Interaction Mode`,description:ee,source:`mode`,argumentHint:y,subcommands:we(`mode`),modelInvocable:!1}}function Ks(){let e=Gs();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:Ws}}var qs=class{name=`mode`;getCommands(){return[Gs()]}};function Js(){return{name:`agent-command-mode`,commandSources:[new qs],systemCommands:[Ks()]}}function Ys(e,t){return e.getSession().getModelId()??t?.model??``}function Xs(e,t,n,r){let i=t.currentProvider===void 0?void 0:t.providers?.[t.currentProvider];return Ce(t.providers,t.currentProvider,Ys(e,i),n.providerDefinitions,r?n.orgPolicy?.allowedProviders:void 0)}async function Zs(e,t,n){let r=n.settings.readMergedSettings(),i=t.trim();if(i.length===0){let t=Xs(e,r,n,!0);return Qs(e.getUserInteraction(),t,e,n)}let a=Ht(Xs(e,r,n,!1),i);return a===void 0?{message:`Unknown model "${i}". Run /model to see the choices.`,success:!1}:a.profileName===r.currentProvider?tc(e,a,r,n):nc(a,r,n)}async function Qs(e,t,n,r){if(t.groups.length===0)return{message:`No provider profiles configured. Run /provider add to add one.`,success:!0};if(!e)return{message:$s(t),success:!0};let i=t.groups.flatMap(e=>e.models.map(n=>({value:n.id,label:ec(t,e.profileName,e.providerLabel,n)}))),a=await e.ask(T(`model`,`Select model`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Model selection cancelled.`,success:!0}:Zs(n,a.values[0],r)}function $s(e){let t=[];for(let n of e.groups){t.push(`${n.providerLabel} (${n.profileName})`);for(let r of n.models){let i=r.id===e.currentModel&&n.profileName===e.currentProfile?`*`:`-`;t.push(` ${i} ${r.label}`)}}return t.join(`
48
- `)}function ec(e,t,n,r){let i=r.id===e.currentModel&&t===e.currentProfile?`* `:``,a=e.groups.filter(e=>e.providerLabel===n).length>1?` (${t})`:``;return`${i}${n}: ${r.label}${a}`}async function tc(e,t,n,r){let i=t.profileName;try{await e.getSession().applyModelOptions({model:t.model.id})}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=r.settings.readTargetSettings(),o=n.providers?.[i]??a.providers?.[i]??{};return r.settings.writeTargetSettings(rn(a,i,{...o,model:t.model.id})),{message:`Model: ${t.model.label}`,success:!0}}function nc(e,t,n){let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(e.profileName))return{message:tt(`Provider "${e.profileName}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};let i=t.providers?.[e.profileName];if(i===void 0)return{message:`Provider profile "${e.profileName}" was not found.`,success:!1};let a={...i,model:e.model.id};try{on(e.profileName,a,{providerDefinitions:n.providerDefinitions})}catch(t){return{message:`Could not switch to "${e.model.label}": ${t instanceof Error?t.message:String(t)}`,success:!1}}let o=n.settings.readTargetSettings(),s=n.settings.readMergedSettings(),c=rn(o,e.profileName,a),l=o.providers?.[e.profileName]!==void 0||s.providers?.[e.profileName]!==void 0?{...c,currentProvider:e.profileName}:Zt(c,e.profileName);return n.settings.writeTargetSettings(l),{message:`Model: ${e.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profileName}]}}function rc(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function ic(e){let t=rc();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,lifecycle:`inline`,execute:(t,n)=>Zs(t,n,e)}}var ac=class{name=`model`;getCommands(){return[rc()]}};function oc(e){return{name:`agent-command-model`,commandSources:[new ac],systemCommands:[ic(e)]}}const V=[{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 sc(e){return V.some(t=>t.mode===e)}function cc(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 lc(e,t){let n=e.getUserInteraction();if(!n)return;let r=V.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 uc(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 lc(e,r.mode);if(i===void 0||i===``)return{message:cc(r),success:!0,data:{...r}};if(!sc(i))return{message:`Unknown sandbox mode "${i}". Valid: ${V.map(e=>e.mode).join(` | `)}`,success:!1};n.setMode(i);let a=n.status();return{message:`Sandbox mode set to: ${i}\n${cc(a)}`,success:!0,data:{...a}}}const dc=V.map(e=>e.mode).join(` | `);function fc(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:dc,subcommands:V.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function pc(){let e=fc();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:uc}}var mc=class{name=`sandbox`;getCommands(){return[fc()]}};function hc(){return{name:`agent-command-sandbox`,commandSources:[new mc],systemCommands:[pc()]}}function gc(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function _c(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 vc(e,t){let n=e.getActiveOutputStyleId(),r=t.listOutputStyles();return{success:!0,message:_c(n,t),data:{outputStyles:r,active:n}}}async function yc(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 bc(e,t){let n=gc(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 yc(e,n)??``,!r))return vc(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 xc(){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 Sc(){let e=xc();return{name:e.name,displayName:e.displayName,description:e.description,argumentHint:e.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:bc}}var Cc=class{name=`output-style`;getCommands(){return[xc()]}};function wc(){return{name:`agent-command-output-style`,commandSources:[new Cc],systemCommands:[Sc()]}}const Tc=/^[a-zA-Z0-9_-]{1,64}$/u;function Ec(e){let t=Object.entries(e).filter(([,e])=>(e??0)>0);return t.length===0?`none`:t.map(([e,t])=>`${e} ${t}`).join(`, `)}function Dc(e){let{counters:t}=e;return` ${e.grantId} ${e.principal} ${e.state} accepted ${t.accepted}; refused: ${Ec(t.refused)}; settled: ${Ec(t.settled)}`}async function Oc(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(Dc).join(`
51
- `)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!Tc.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 kc(){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 Ac(){let e=kc();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)=>Oc(e,t)}}var jc=class{name=`events`;getCommands(){return[kc()]}};function Mc(){return{name:`agent-command-events`,commandSources:[new jc],systemCommands:[Ac()]}}function Nc(e){return e.liveness!==`dead`}function Pc(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?``:Ic(e)}${r}${n}`}function Fc(e){let t=e.locality===`same-host`?`on this machine`:`on another machine`;return` ${e.deviceId}${e.name?` ${e.name}`:``} ${t}`}function Ic(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 Lc(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 Rc(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 zc(e,t){if(e.send===void 0)return{message:`This environment can discover other sessions but cannot address them.`,success:!1};let n=Lc(t);return n===void 0?{message:`Usage: /peers send <session-id> <message>. Run /peers for the session ids.`,success:!1}:Rc(await e.send(n.target,n.text),n.target)}async function Bc(e,t,n){if(e.prepareFile===void 0)return{message:`This environment cannot send files to other sessions.`,success:!1};let r=Lc(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 Vc(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 Bc(n,r.slice(i[0].length),e.getCwd?.()??``);let a=/^send(?=\s|$)/.exec(r);if(a!==null)return zc(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(Fc).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(Nc);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=>Pc(e,c)).join(`
53
- `)}`];o.length>0&&u.push(`Linked devices:\n${o.map(Fc).join(`
47
+ `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function ks(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 As(e){let t=e[1],n=e[2],r=e.slice(3).join(` `).trim();if(!(!t||!ut(t)||!n||r.length===0))return{type:t,topic:n,text:r}}async function js(e){let t=await e.listPending(`pending`);return{message:[`Pending memory candidates:`,...t.length>0?t.map(e=>`- ${e.id} ${e.type}/${e.topic} confidence=${e.confidence}: ${e.text}`):[`(no pending memory candidates)`]].join(`
48
+ `),success:!0,data:{count:t.length}}}function Ms(e,t){Lt(e,t)}async function Ns(e,t,n){if(!n)return z();try{let{record:r,saved:i}=await ye(t,n);return Ms(e,{type:`memory_candidate_approved`,candidateId:r.id,topic:r.topic,reason:`approved-by-user`}),Ms(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 B(e instanceof Error?e:String(e))}}async function Ps(e,t,n){if(!n)return z();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return Ms(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 B(e instanceof Error?e:String(e))}}function Fs(e){let t=vt(e);return{message:[`Used memory references:`,...t.length>0?t.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
49
+ `),success:!0,data:{count:t.length,references:[...t]}}}function Is(e){return((e.getCommandHostAdapters?.().permissionMode)?.getPermissionMode()??e.getSession?.().getPermissionMode())===`plan`}async function Ls(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`,i=e.getCommandInvocationSource();if((r===`correct`||r===`forget`)&&i!==`user`&&i!==`remote`)return{success:!1,message:`Memory correction and forgetting: only the user can run /memory correct or /memory forget.`};let a=Ds(e);if(!a.ok)return a.result;let o=a.store;if(r===`correct`||r===`forget`)try{if(r===`correct`){let e=As(n);if(!e)return z();if(rt(e.text))return{success:!1,message:`Refusing to save sensitive memory content.`};if(!o.replaceTopic)return{success:!1,message:`This memory backend does not support topic correction.`};let t=await o.replaceTopic(e);return{success:!0,message:`Replaced all active memory in ${t.topicPath}. Automatic additions to this topic now require user correction. Historical transcripts and backups remain.`,data:{...t}}}if(!n[1]||n.length!==2)return z();if(!o.forgetTopic)return{success:!1,message:`This memory backend does not support forgetting topics.`};let e=await o.forgetTopic(n[1]);return{success:!0,message:`Forgot active memory topic ${e.topic}. Source topic removed; automatic restoration is blocked. Historical transcripts and backups remain.`,data:{...e}}}catch(e){return B(e instanceof Error?e:String(e))}if(r===`list`)return Os(o);if(r===`show`)return ks(o,n[1]);if(r===`pending`)return js(o);if(r===`approve`)return Ns(e,o,n[1]);if(r===`reject`)return Ps(e,o,n[1]);if(r===`used`)return Fs(e);if(r===`add`){if(e.getCommandInvocationSource()===`model`&&Is(e))return{message:`Plan mode saves no memory. Save it after plan mode ends.`,success:!1};let t=As(n);if(!t)return z();if(rt(t.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let r;try{r=await o.append(t)}catch(e){return B(e instanceof Error?e:String(e))}return{message:r.deduplicated?`${t.type} memory already exists in ${r.topicPath}`:`Saved ${t.type} memory to ${r.topicPath}`,success:!0,data:{indexPath:r.indexPath,topicPath:r.topicPath,topic:r.topic,deduplicated:r.deduplicated}}}return z()}function Rs(){return{name:`memory`,displayName:`Memory`,description:h,modelDescription:"Read and write this project’s durable memory. Use `list` or `show [topic]` to look up stored conventions, preferences or references before asking the user again; `add <type> <topic> <text>` to save a durable preference, project convention, feedback item or reference worth reusing across sessions (never secrets, credentials or transient facts); `pending` to see candidates awaiting the user’s review; `used` to report which memory items informed this turn. Bare lists topics. In plan mode `add` is refused: save after plan mode ends. Returns the requested topics or entries, or a confirmation of what was saved. Approving or rejecting a pending candidate is the user’s review: suggest `/memory approve <id>` or `/memory reject <id>`. Correcting or forgetting saved knowledge is also user-only: suggest `/memory correct <type> <topic> <text>` to replace every entry in a topic or `/memory forget <topic>` to remove it from active recall. These operations block automatic restoration of that topic; historical transcripts and backups remain.",source:`memory`,argumentHint:m,modelInvocable:!0,safety:`write`,subcommands:Se()}}function zs(){let e=Rs();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:Ls}}var Bs=class{name=`memory`;getCommands(){return[Rs()]}};function Vs(){return{name:`agent-command-memory`,commandSources:[new Bs],systemCommands:[zs()]}}function Hs(e,t){try{cn(e,t);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function Us(e,t){let n=Kt(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 Ws(e,t){let n=Tt(t);if(n===`retry`)return Us(e,t);if(n!==void 0){if(!pt(n))return{message:$e(),success:!1};let t=Hs(e,n);if(t!==void 0)return t;let r=Nt(e);return{message:`Permission mode set to: ${n}\n${Ze(r)}`,success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}let r=Nt(e);return{message:Ze(r),success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}async function Gs(e){let t=e.getUserInteraction();if(!t)return;let n=we().map(e=>({value:e.name,label:e.displayName??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 Ks(e,t){let n=Tt(t);if(n===void 0&&(n=await Gs(e),n===void 0)){let t=Mt(e);return{message:`Current mode: ${t}`,success:!0,data:{mode:t}}}if(!pt(n))return{message:$e(),success:!1};let r=Hs(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:ee,source:`mode`,argumentHint:y,subcommands:we(`mode`),modelInvocable:!1}}function Js(){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:Ks}}var Ys=class{name=`mode`;getCommands(){return[qs()]}};function Xs(){return{name:`agent-command-mode`,commandSources:[new Ys],systemCommands:[Js()]}}function Zs(e,t){return e.getSession().getModelId()??t?.model??``}function Qs(e,t,n,r){let i=t.currentProvider===void 0?void 0:t.providers?.[t.currentProvider];return Ce(t.providers,t.currentProvider,Zs(e,i),n.providerDefinitions,r?n.orgPolicy?.allowedProviders:void 0)}async function $s(e,t,n){let r=n.settings.readMergedSettings(),i=t.trim();if(i.length===0){let t=Qs(e,r,n,!0);return ec(e.getUserInteraction(),t,e,n)}let a=Ht(Qs(e,r,n,!1),i);return a===void 0?{message:`Unknown model "${i}". Run /model to see the choices.`,success:!1}:a.profileName===r.currentProvider?rc(e,a,r,n):ic(a,r,n)}async function ec(e,t,n,r){if(t.groups.length===0)return{message:`No provider profiles configured. Run /provider add to add one.`,success:!0};if(!e)return{message:tc(t),success:!0};let i=t.groups.flatMap(e=>e.models.map(n=>({value:n.id,label:nc(t,e.profileName,e.providerLabel,n)}))),a=await e.ask(T(`model`,`Select model`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Model selection cancelled.`,success:!0}:$s(n,a.values[0],r)}function tc(e){let t=[];for(let n of e.groups){t.push(`${n.providerLabel} (${n.profileName})`);for(let r of n.models){let i=r.id===e.currentModel&&n.profileName===e.currentProfile?`*`:`-`;t.push(` ${i} ${r.label}`)}}return t.join(`
50
+ `)}function nc(e,t,n,r){let i=r.id===e.currentModel&&t===e.currentProfile?`* `:``,a=e.groups.filter(e=>e.providerLabel===n).length>1?` (${t})`:``;return`${i}${n}: ${r.label}${a}`}async function rc(e,t,n,r){let i=t.profileName;try{await e.getSession().applyModelOptions({model:t.model.id})}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=r.settings.readTargetSettings(),o=n.providers?.[i]??a.providers?.[i]??{};return r.settings.writeTargetSettings(rn(a,i,{...o,model:t.model.id})),{message:`Model: ${t.model.label}`,success:!0}}function ic(e,t,n){let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(e.profileName))return{message:tt(`Provider "${e.profileName}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};let i=t.providers?.[e.profileName];if(i===void 0)return{message:`Provider profile "${e.profileName}" was not found.`,success:!1};let a={...i,model:e.model.id};try{on(e.profileName,a,{providerDefinitions:n.providerDefinitions})}catch(t){return{message:`Could not switch to "${e.model.label}": ${t instanceof Error?t.message:String(t)}`,success:!1}}let o=n.settings.readTargetSettings(),s=n.settings.readMergedSettings(),c=rn(o,e.profileName,a),l=o.providers?.[e.profileName]!==void 0||s.providers?.[e.profileName]!==void 0?{...c,currentProvider:e.profileName}:Zt(c,e.profileName);return n.settings.writeTargetSettings(l),{message:`Model: ${e.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profileName}]}}function ac(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function oc(e){let t=ac();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,lifecycle:`inline`,execute:(t,n)=>$s(t,n,e)}}var sc=class{name=`model`;getCommands(){return[ac()]}};function cc(e){return{name:`agent-command-model`,commandSources:[new sc],systemCommands:[oc(e)]}}const V=[{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 lc(e){return V.some(t=>t.mode===e)}function uc(e){let t=[`Sandbox: ${e.mode}${e.backend===void 0?``:` (${e.backend})`}`];return e.unavailable!==void 0&&t.push(e.mode===`off`?`Not available here: ${e.unavailable}.`:`Cannot run here: ${e.unavailable}. Commands run unconfined.`),e.mode!==`off`&&e.unavailable===void 0&&(t.push(`Writes are limited to the workspace and temp directories; settings and git hooks stay read-only.`,`Network: ${e.network?`allowed`:`blocked`}.`),e.excludedCommands.length>0&&t.push(`Run unconfined: ${e.excludedCommands.join(`, `)}.`)),t.join(`
51
+ `)}async function dc(e,t){let n=e.getUserInteraction();if(!n)return;let r=V.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 fc(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 dc(e,r.mode);if(i===void 0||i===``)return{message:uc(r),success:!0,data:{...r}};if(!lc(i))return{message:`Unknown sandbox mode "${i}". Valid: ${V.map(e=>e.mode).join(` | `)}`,success:!1};n.setMode(i);let a=n.status();return{message:`Sandbox mode set to: ${i}\n${uc(a)}`,success:!0,data:{...a}}}const pc=V.map(e=>e.mode).join(` | `);function mc(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:pc,subcommands:V.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function hc(){let e=mc();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:fc}}var gc=class{name=`sandbox`;getCommands(){return[mc()]}};function _c(){return{name:`agent-command-sandbox`,commandSources:[new gc],systemCommands:[hc()]}}function vc(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function yc(e,t){return[`Available output styles:`,...t.listOutputStyles().map(t=>{let n=t.id===e?`* `:` `,r=t.tokenCost?` [input cost: ${t.tokenCost}]`:``;return`${n}${t.id} — ${t.name}: ${t.description}${r}`})].join(`
52
+ `)}function bc(e,t){let n=e.getActiveOutputStyleId(),r=t.listOutputStyles();return{success:!0,message:yc(n,t),data:{outputStyles:r,active:n}}}async function xc(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 Sc(e,t){let n=vc(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 xc(e,n)??``,!r))return bc(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 Cc(){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 wc(){let e=Cc();return{name:e.name,displayName:e.displayName,description:e.description,argumentHint:e.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Sc}}var Tc=class{name=`output-style`;getCommands(){return[Cc()]}};function Ec(){return{name:`agent-command-output-style`,commandSources:[new Tc],systemCommands:[wc()]}}const Dc=/^[a-zA-Z0-9_-]{1,64}$/u;function Oc(e){let t=Object.entries(e).filter(([,e])=>(e??0)>0);return t.length===0?`none`:t.map(([e,t])=>`${e} ${t}`).join(`, `)}function kc(e){let{counters:t}=e;return` ${e.grantId} ${e.principal} ${e.state} accepted ${t.accepted}; refused: ${Oc(t.refused)}; settled: ${Oc(t.settled)}`}async function Ac(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(kc).join(`
53
+ `)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!Dc.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 jc(){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 Mc(){let e=jc();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)=>Ac(e,t)}}var Nc=class{name=`events`;getCommands(){return[jc()]}};function Pc(){return{name:`agent-command-events`,commandSources:[new Nc],systemCommands:[Mc()]}}function Fc(e){return e.liveness!==`dead`}function Ic(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?``:Rc(e)}${r}${n}`}function Lc(e){let t=e.locality===`same-host`?`on this machine`:`on another machine`;return` ${e.deviceId}${e.name?` ${e.name}`:``} ${t}`}function Rc(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 zc(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 Vc(e,t){if(e.send===void 0)return{message:`This environment can discover other sessions but cannot address them.`,success:!1};let n=zc(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 Hc(e,t,n){if(e.prepareFile===void 0)return{message:`This environment cannot send files to other sessions.`,success:!1};let r=zc(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 Uc(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 Hc(n,r.slice(i[0].length),e.getCwd?.()??``);let a=/^send(?=\s|$)/.exec(r);if(a!==null)return Vc(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(Lc).join(`
54
+ `)}\n\n${e}\n\nSend to one: /peers send <device-id> <message>\nSend a file: /peers send-file <device-id> <path>`,success:!0}}let c=n.ownSessionId(),l=(n.listWithWorkspace===void 0?n.list():await n.listWithWorkspace()).filter(Fc);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=>Ic(e,c)).join(`
55
+ `)}`];o.length>0&&u.push(`Linked devices:\n${o.map(Lc).join(`
54
56
  `)}`);let d=o.length>0?`<session-or-device-id>`:`<session-id>`;return{message:`${u.join(`
55
57
 
56
- `)}\n\nSend to one: /peers send ${d} <message>\nSend a file: /peers send-file ${d} <path>`,success:!0}}function Hc(){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 Uc(){let e=Hc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Vc(e,t)}}var Wc=class{name=`peers`;getCommands(){return[Hc()]}};function Gc(){return{name:`agent-command-peers`,commandSources:[new Wc],systemCommands:[Uc()]}}function Kc(){return{name:`permissions`,displayName:`Permissions`,description:v,source:`permissions`,argumentHint:y,subcommands:we(`permissions`),modelInvocable:!1}}function qc(){let e=Kc();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:Hs}}var Jc=class{name=`permissions`;getCommands(){return[Kc()]}};function Yc(){return{name:`agent-command-permissions`,commandSources:[new Jc],systemCommands:[qc()]}}function Xc(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 Zc(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`help`)return{message:`Usage:
58
+ `)}\n\nSend to one: /peers send ${d} <message>\nSend a file: /peers send-file ${d} <path>`,success:!0}}function Wc(){return{name:`peers`,displayName:`Peers`,description:"List the other live sessions for this user on this host and the user's linked devices, send one a message, or send one a copy of a file. Returns the sessions and devices with the ids to address them by (linked devices even when local discovery is off and sessions on this host cannot be listed), or how a send ended. User-only: the model cannot run it; it answers a peer's message with its reply tool, and when the user wants to reach another session or device, suggest they run `/peers`.",source:`peers`,modelInvocable:!1}}function Gc(){let e=Wc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Uc(e,t)}}var Kc=class{name=`peers`;getCommands(){return[Wc()]}};function qc(){return{name:`agent-command-peers`,commandSources:[new Kc],systemCommands:[Gc()]}}function Jc(){return{name:`permissions`,displayName:`Permissions`,description:v,source:`permissions`,argumentHint:y,subcommands:we(`permissions`),modelInvocable:!1}}function Yc(){let e=Jc();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:Ws}}var Xc=class{name=`permissions`;getCommands(){return[Jc()]}};function Zc(){return{name:`agent-command-permissions`,commandSources:[new Xc],systemCommands:[Yc()]}}function Qc(e){let t=[`Plan: ${e.objective}`,`Phase: ${e.phase}${e.approvedAt?` (approved ${e.approvedAt})`:``}`];return e.steps.forEach((e,n)=>{t.push(` ${n+1}. [${e.status}] ${e.description}`)}),t.join(`
59
+ `)}async function $c(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`help`)return{message:`Usage:
58
60
  /plan <objective> draft a plan for review (stays read-only until approved)
59
61
  /plan status show the current plan and phase
60
62
  /plan approve approve the plan (edits auto-apply; shell stays confirmed)
61
- /plan revert return to drafting (re-blocks edits)`,success:!0};if(r===`status`){let t=e.getPlanState();return t?{message:Xc(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 $c(){let e=Qc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Zc}}var el=class{name=`plan`;getCommands(){return[Qc()]}};function tl(){return{name:`agent-command-plan`,commandSources:[new el],systemCommands:[$c()]}}function nl(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function H(e){return{success:!1,message:e}}function rl(e){return Ut(e)}const il=`Installing and uninstalling plugins runs code on this computer, so it only works from the desktop app or the page opened here — not from a remote device.`;function al(e){return(e.getCommandSurfaceLocality?.()??`local`)===`remote`}async function U(e,t){let n=rl(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 ol(e,t){let{subcommand:n,subArgs:r}=nl(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
- `)}`}):H(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function sl(e,t,n,r){return t.length===0?Promise.resolve(H(n)):U(e,e=>Promise.resolve(r(e,t)))}function cl(){return{success:!0,message:`Opening plugin manager...`,uiIntents:[Be()]}}function ll(e,t){return al(e)?Promise.resolve(H(il)):sl(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function ul(e,t){return al(e)?Promise.resolve(H(il)):sl(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}async function dl(e){let t=rl(e);if(t===void 0)return{success:!0,message:`Plugin management is not available.`,data:{plugins:[]}};try{let e=await t.listInstalled();return{success:!0,message:e.length===0?`No plugins are installed.`:`Installed plugins:\n${e.map(e=>` ${e.name}${e.enabled?``:` (disabled)`} — ${e.description}`).join(`
63
- `)}`,data:{plugins:e}}}catch(e){return{success:!1,message:`Plugin error: ${e instanceof Error?e.message:String(e)}`}}}function fl(e,t){return sl(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function pl(e,t){return sl(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function ml(e,t){let{subcommand:n,subArgs:r}=nl(t);switch(n){case``:case`manage`:return cl();case`list`:return dl(e);case`install`:return ll(e,r);case`uninstall`:return ul(e,r);case`enable`:return fl(e,r);case`disable`:return pl(e,r);case`marketplace`:return ol(e,r);default:return H(`Unknown plugin subcommand: ${n}`)}}async function hl(e,t){return U(e,async e=>{let t=await e.reloadPlugins();return`Reloaded ${t.loadedPluginCount===1?`1 plugin resource`:`${t.loadedPluginCount} plugin resources`}. Plugin commands and skills are active now; hook changes apply to new sessions.`}).then(e=>({...e,data:{...e.data,pluginRegistryReloaded:!0}}))}function gl(){return{name:`plugin`,displayName:`Plugins`,description:ne,source:`plugin-manager`,modelInvocable:!1,argumentHint:te,subcommands:Te()}}function _l(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:ie,source:`plugin-manager`,modelInvocable:!1}}function vl(){let e=gl();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:ml}}function yl(){let e=_l();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:hl}}var bl=class{name=`plugin-manager`;getCommands(){return[gl(),_l()]}};function xl(){return{name:`agent-command-plugin`,commandSources:[new bl],systemCommands:[vl(),yl()]}}function Sl(e){return e.getCommandHostAdapters?.().presetRegistry??Fn()}function Cl(e){return e.getSession().getActivePresetId()}function wl(e,t){return[`Available presets:`,...t.listPresets().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
64
- `)}function Tl(e,t){return`Unknown preset: ${e}. Available: ${t.listPresets().map(e=>e.id).join(`, `)}`}function El(e,t){let n=Cl(e);return{message:wl(n,t),success:!0,data:{presets:t.listPresets(),active:n}}}async function Dl(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 Ol(e,t){let n=Sl(e),r=t.trim().split(/\s+/)[0];if(r===`list`||(r===void 0||r.length===0)&&(r=await Dl(e,n),r===void 0))return El(e,n);if(n.getPreset(r)===void 0)return{message:Tl(r,n),success:!1};let i=n.resolvePreset(r),a=await _e(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(`
65
- `),success:!0,data:{preset:r,unknownCommandModules:a.unknownCommandModules}}}function kl(e=`preset`){return Fn().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function Al(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:kl(`preset`),modelInvocable:!1}}function jl(){let e=Al();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:Ol}}var Ml=class{name=`preset`;getCommands(){return[Al()]}};function Nl(){return{name:`agent-command-preset`,commandSources:[new Ml],systemCommands:[jl()]}}function Pl(e,t,n={}){let r=Kl(e,t);return{type:e,steps:Yl(ql(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 Fl(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Hl(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
66
- `)}function Il(e,t){let n=e.trim(),r=n.length>0?n:`1`,i=Wl(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 Ll(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 Rl(e,t){let n=Ll(e),r=t.trim()||n.defaultValue||``,i=Gl(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:Xl(a)}}async function zl(e,t,n,r={}){let i=Pl(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=Ll(i),n=await t(Bl(e,i.setupHelpLinks),e.masked===!0),r=Rl(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 Bl(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Ul(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Vl={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Hl(e){let t=`${e.category===void 0?``:`${Vl[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Ul(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${Jl(e.kind)}: ${e.label} - ${e.url}`).join(`
67
- `)}function Wl(e){if(/^\d+$/.test(e))return Number(e)-1}function Gl(e,t){if(e.required===!0&&t.length===0)return`Required`}function Kl(e,t){let n=S(t,e);if(n===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${C(t)}`);return n}function ql(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 Jl(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function Yl(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 Xl(e){let t=e.profileName??$t({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 Zl={type:`session-restart`,reason:`other`};function Ql(e,t){return Pl(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function $l(e,t){let n=Ll(e),r=n.masked===!0&&n.defaultValue!==void 0?`(unchanged)`:n.defaultValue,i=Ul(e.setupHelpLinks),a=[t,i.length>0?i:void 0].filter(e=>e!==void 0&&e.length>0).join(`
68
- `)||void 0;return hn(`provider-setup-${n.key}`,n.title,{description:a,placeholder:r,allowEmpty:n.defaultValue!==void 0,masked:n.masked})}async function eu(e,t,n,r){let i=t,a;for(;;){let t=await e.ask($l(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Rl(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 tu(e,t,n,r){return eu(e,t,e=>nu(e,n,r),`Provider setup cancelled.`)}function nu(e,t,n){let r=t.settings.readTargetSettings(),i=Ee(e,{providerDefinitions:t.providerDefinitions});return t.settings.writeTargetSettings(xt(r,i)),n?{message:`Provider ${e.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profile}]}:{message:`Provider ${e.profile} configured. Restarting...`,success:!0,hostActions:[{...Zl,message:`Provider setup restart`}]}}function ru(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function iu(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:tt(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};if(n.settings.readMergedSettings().currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let i=e[t];try{on(t,i,{providerDefinitions:n.providerDefinitions})}catch(e){return{message:`Failed to switch to "${t}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=n.settings.readTargetSettings(),o=n.settings.readMergedSettings(),s=a.providers?.[t]!==void 0||o.providers?.[t]!==void 0?{...a,currentProvider:t}:Zt(a,t);return n.settings.writeTargetSettings(s),{message:`Switched to ${t} (${i.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t}]}}async function au(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:ou(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return eu(e,i,e=>su(e,t,n),`Provider edit cancelled.`)}function ou(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function su(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&&lt(e.apiKey))return{message:tt(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=Ee(e,{providerDefinitions:n.providerDefinitions}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(rn(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{hostActions:[{type:`provider-hot-swap`,profileName:t}]}:{}}}const cu={type:`session-restart`,reason:`other`};async function lu(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=gu(t,Object.keys(r.providers)),a;for(;;){let r=await e.ask(hn(`provider-duplicate`,`Duplicate ${t} as`,{description:a,placeholder:i,allowEmpty:!0}));if(r.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let o=r.text??``,s=uu(o,i,n);if(s!==void 0){a=s;continue}return du(t,o,i,n)}}function uu(e,t,n){let r=_u(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function du(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=_u(t,n),o=uu(a,n,r);return o===void 0?(r.settings.writeTargetSettings(rn(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}function fu(e,t,n,r){return n?e?.[n]?Object.keys(e).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:t===n?{message:`Cannot delete the profile in use. Switch to another profile first.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(r.settings.writeTargetSettings(He(r.settings.readTargetSettings(),n)),{message:`Provider profile deleted: ${n}.`,success:!0}):{message:`Provider profile "${n}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function pu(e,t,n){let r=n.settings.readMergedSettings().providers??{};return r[t]?Object.keys(r).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n.settings.readTargetSettings().providers?.[t]===void 0?{message:`Provider profile "${t}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:w(await e.ask(x(`provider-delete`,`Delete profile "${t}"?`)))?mu(e,t,n):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${t}" was not found.`,success:!1}}async function mu(e,t,n){let r=n.settings.readMergedSettings();if(r.currentProvider!==t)return n.settings.writeTargetSettings(He(n.settings.readTargetSettings(),t)),{message:`Provider profile deleted: ${t}.`,success:!0};let i=Object.entries(r.providers??{}).filter(([e])=>e!==t).map(([e,t])=>({value:e,label:ru(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}:hu(t,a.values[0],n)}function hu(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=He(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,hostActions:[{...cu,message:`Provider delete restart`}]}}function gu(e,t){let n=Jt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function _u(e,t){return Jt(e.trim()||t)??``}const vu=`switch`,yu=`edit`,bu=`test`,xu=`duplicate`,Su=`delete`;async function Cu(e,t,n,r){let i=Object.entries(n??{}).map(([e,n])=>({value:e,label:ru(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}:wu(e,a.values[0],r)}async function wu(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:vu,label:`Switch`},{value:yu,label:`Edit`},{value:bu,label:`Test`},{value:xu,label:`Duplicate`},{value:Su,label:`Delete`}]));return r.type!==`answer`||r.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Tu(e,t,r.values[0],n)}async function Tu(e,t,n,r){let i=r.settings.readMergedSettings();switch(n){case vu:return iu(i.providers,t,r);case yu:return au(e,t,r);case bu:return nn(i.currentProvider,i.providers,t,r);case xu:return lu(e,t,r);case Su:return pu(e,t,r);default:return{message:`Unknown provider profile action "${n}".`,success:!1}}}async function Eu(e,t,n){let r=e.getUserInteraction(),i=e.isSetupRequired?.()===!0,a=n.settings.readMergedSettings(),o=t.trim();if(o.length===0)return Du(r,a.currentProvider,a.providers,n);let s=o.split(/\s+/),[c=`current`,l]=s;return c===`list`?Du(r,a.currentProvider,a.providers,n):c===`current`||c===``?{message:ku(a.currentProvider,a.providers),success:!0}:c===`switch`?iu(a.providers,l,n):c===`test`?nn(a.currentProvider,a.providers,l,n):c===`edit`?r?l?au(r,l,n):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:c===`duplicate`?r?l?lu(r,l,n):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:c===`delete`?l?!s.includes(`--confirmed`)&&r&&!w(await r.ask(x(`provider-delete`,`Delete profile "${l}"?`)))?{message:`Provider delete cancelled.`,success:!0}:fu(a.providers,a.currentProvider,l,n):{message:`Usage: provider delete <profile>`,success:!1}:c===`add`?Au(r,l,n,i):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function Du(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Ou(t,n),success:!0}:Cu(e,t,n,r)}function Ou(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(`
69
- `)}function ku(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(`
70
- `):`Current provider "${e}" was not found in providers.`}function Au(e,t,n,r){return t===void 0||t.length===0?e?ju(e,n,r):{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?tu(e,Ql(t,n),n,r):{message:`Provider setup for "${t}" requires an interactive session.`,success:!1}}async function ju(e,t,n){let r=t.providerDefinitions.map(e=>({value:e.type,label:Hl(e)})),i=await e.ask(T(`provider-type`,`Select provider`,r,{maxVisible:6}));if(i.type!==`answer`||i.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let a=i.values[0];return S(t.providerDefinitions,a)===void 0?{message:`Usage: provider add <type>. Supported: ${C(t.providerDefinitions)}`,success:!1}:tu(e,Ql(a,t),t,n)}function Mu(){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 Nu(){return{name:`provider`,displayName:`Provider Setup`,description:`Manage provider profiles`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | test [profile]`,subcommands:Mu(),example:`/provider switch production`}}var Pu=class{name=`provider`;getCommands(){return[Nu()]}};function Fu(e){let t=Nu();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)=>Eu(t,n,e)}}function Iu(e){return{name:`agent-command-provider`,commandSources:[new Pu],systemCommands:[Fu(e)]}}async function Lu(e,t){let n=(await e(`
63
+ /plan revert return to drafting (re-blocks edits)`,success:!0};if(r===`status`){let t=e.getPlanState();return t?{message:Qc(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 el(){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 tl(){let e=el();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:$c}}var nl=class{name=`plan`;getCommands(){return[el()]}};function rl(){return{name:`agent-command-plan`,commandSources:[new nl],systemCommands:[tl()]}}function il(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function H(e){return{success:!1,message:e}}function al(e){return Ut(e)}const ol=`Installing and uninstalling plugins runs code on this computer, so it only works from the desktop app or the page opened here — not from a remote device.`;function sl(e){return(e.getCommandSurfaceLocality?.()??`local`)===`remote`}async function U(e,t){let n=al(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 cl(e,t){let{subcommand:n,subArgs:r}=il(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(`
64
+ `)}`}):H(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function ll(e,t,n,r){return t.length===0?Promise.resolve(H(n)):U(e,e=>Promise.resolve(r(e,t)))}function ul(){return{success:!0,message:`Opening plugin manager...`,uiIntents:[Be()]}}function dl(e,t){return sl(e)?Promise.resolve(H(ol)):ll(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function fl(e,t){return sl(e)?Promise.resolve(H(ol)):ll(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}async function pl(e){let t=al(e);if(t===void 0)return{success:!0,message:`Plugin management is not available.`,data:{plugins:[]}};try{let e=await t.listInstalled();return{success:!0,message:e.length===0?`No plugins are installed.`:`Installed plugins:\n${e.map(e=>` ${e.name}${e.enabled?``:` (disabled)`} — ${e.description}`).join(`
65
+ `)}`,data:{plugins:e}}}catch(e){return{success:!1,message:`Plugin error: ${e instanceof Error?e.message:String(e)}`}}}function ml(e,t){return ll(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function hl(e,t){return ll(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function gl(e,t){let{subcommand:n,subArgs:r}=il(t);switch(n){case``:case`manage`:return ul();case`list`:return pl(e);case`install`:return dl(e,r);case`uninstall`:return fl(e,r);case`enable`:return ml(e,r);case`disable`:return hl(e,r);case`marketplace`:return cl(e,r);default:return H(`Unknown plugin subcommand: ${n}`)}}async function _l(e,t){return U(e,async e=>{let t=await e.reloadPlugins();return`Reloaded ${t.loadedPluginCount===1?`1 plugin resource`:`${t.loadedPluginCount} plugin resources`}. Plugin commands and skills are active now; hook changes apply to new sessions.`}).then(e=>({...e,data:{...e.data,pluginRegistryReloaded:!0}}))}function vl(){return{name:`plugin`,displayName:`Plugins`,description:ne,source:`plugin-manager`,modelInvocable:!1,argumentHint:te,subcommands:Te()}}function yl(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:ie,source:`plugin-manager`,modelInvocable:!1}}function bl(){let e=vl();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,canRunDuringTurn:e=>{let t=e.trim().split(/\s+/);return t.length===2&&[`disable`,`uninstall`].includes(t[0])},subcommands:e.subcommands,execute:gl}}function xl(){let e=yl();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:_l}}var Sl=class{name=`plugin-manager`;getCommands(){return[vl(),yl()]}};function Cl(){return{name:`agent-command-plugin`,commandSources:[new Sl],systemCommands:[bl(),xl()]}}function wl(e){return e.getCommandHostAdapters?.().presetRegistry??Fn()}function Tl(e){return e.getSession().getActivePresetId()}function El(e,t){return[`Available presets:`,...t.listPresets().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
66
+ `)}function Dl(e,t){return`Unknown preset: ${e}. Available: ${t.listPresets().map(e=>e.id).join(`, `)}`}function Ol(e,t){let n=Tl(e);return{message:El(n,t),success:!0,data:{presets:t.listPresets(),active:n}}}async function kl(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 Al(e,t){let n=wl(e),r=t.trim().split(/\s+/)[0];if(r===`list`||(r===void 0||r.length===0)&&(r=await kl(e,n),r===void 0))return Ol(e,n);if(n.getPreset(r)===void 0)return{message:Dl(r,n),success:!1};let i=n.resolvePreset(r),a=await _e(e,r,i),o=a.unknownCommandModules.map(({name:e,kind:t})=>`Preset command-module "${e}" (${t}) matched no module — expected the agent-command-* form; ignored.`);return{message:[`Switched to preset: ${r}`,...o].join(`
67
+ `),success:!0,data:{preset:r,unknownCommandModules:a.unknownCommandModules}}}function jl(e=`preset`){return Fn().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function Ml(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:jl(`preset`),modelInvocable:!1}}function Nl(){let e=Ml();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:Al}}var Pl=class{name=`preset`;getCommands(){return[Ml()]}};function Fl(){return{name:`agent-command-preset`,commandSources:[new Pl],systemCommands:[Nl()]}}function Il(e,t,n={}){let r=Jl(e,t);return{type:e,steps:Zl(Yl(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 Ll(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Wl(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
68
+ `)}function Rl(e,t){let n=e.trim(),r=n.length>0?n:`1`,i=Kl(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 zl(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 Bl(e,t){let n=zl(e),r=t.trim()||n.defaultValue||``,i=ql(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:Ql(a)}}async function Vl(e,t,n,r={}){let i=Il(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=zl(i),n=await t(Hl(e,i.setupHelpLinks),e.masked===!0),r=Bl(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 Hl(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Gl(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Ul={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Wl(e){let t=`${e.category===void 0?``:`${Ul[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Gl(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${Xl(e.kind)}: ${e.label} - ${e.url}`).join(`
69
+ `)}function Kl(e){if(/^\d+$/.test(e))return Number(e)-1}function ql(e,t){if(e.required===!0&&t.length===0)return`Required`}function Jl(e,t){let n=S(t,e);if(n===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${C(t)}`);return n}function Yl(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 Xl(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 Ql(e){let t=e.profileName??$t({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 $l={type:`session-restart`,reason:`other`};function eu(e,t){return Il(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function tu(e,t){let n=zl(e),r=n.masked===!0&&n.defaultValue!==void 0?`(unchanged)`:n.defaultValue,i=Gl(e.setupHelpLinks),a=[t,i.length>0?i:void 0].filter(e=>e!==void 0&&e.length>0).join(`
70
+ `)||void 0;return hn(`provider-setup-${n.key}`,n.title,{description:a,placeholder:r,allowEmpty:n.defaultValue!==void 0,masked:n.masked})}async function nu(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(tu(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Bl(i,t.text??``);if(o.status===`error`){a=o.message;continue}if(o.status===`complete`)return n(o.input);i=o.state,a=void 0}}function ru(e,t,n,r){return nu(e,t,e=>iu(e,n,r),`Provider setup cancelled.`)}function iu(e,t,n){let r=t.settings.readTargetSettings(),i=Ee(e,{providerDefinitions:t.providerDefinitions});return t.settings.writeTargetSettings(xt(r,i)),n?{message:`Provider ${e.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profile}]}:{message:`Provider ${e.profile} configured. Restarting...`,success:!0,hostActions:[{...$l,message:`Provider setup restart`}]}}function au(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function ou(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:tt(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};if(n.settings.readMergedSettings().currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let i=e[t];try{on(t,i,{providerDefinitions:n.providerDefinitions})}catch(e){return{message:`Failed to switch to "${t}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=n.settings.readTargetSettings(),o=n.settings.readMergedSettings(),s=a.providers?.[t]!==void 0||o.providers?.[t]!==void 0?{...a,currentProvider:t}:Zt(a,t);return n.settings.writeTargetSettings(s),{message:`Switched to ${t} (${i.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t}]}}async function su(e,t,n){let r=n.settings.readMergedSettings().providers?.[t];if(!r)return{message:`Provider profile "${t}" was not found.`,success:!1};if(!r.type)return{message:`Provider profile "${t}" is missing type.`,success:!1};let i;try{i=Il(r.type,n.providerDefinitions,{profileName:t,setCurrent:!1,initialValues:cu(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return nu(e,i,e=>lu(e,t,n),`Provider edit cancelled.`)}function cu(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function lu(e,t,n){let r=n.settings.readMergedSettings(),i=r.providers?.[t];if(!i)return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:a}=n;if(a?.requireApiKeyFromEnv&&lt(e.apiKey))return{message:tt(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=Ee(e,{providerDefinitions:n.providerDefinitions}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(rn(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{hostActions:[{type:`provider-hot-swap`,profileName:t}]}:{}}}const uu={type:`session-restart`,reason:`other`};async function du(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=vu(t,Object.keys(r.providers)),a;for(;;){let r=await e.ask(hn(`provider-duplicate`,`Duplicate ${t} as`,{description:a,placeholder:i,allowEmpty:!0}));if(r.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let o=r.text??``,s=fu(o,i,n);if(s!==void 0){a=s;continue}return pu(t,o,i,n)}}function fu(e,t,n){let r=yu(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function pu(e,t,n,r){let i=r.settings.readMergedSettings().providers?.[e];if(!i)return{message:`Provider profile "${e}" was not found.`,success:!1};let a=yu(t,n),o=fu(a,n,r);return o===void 0?(r.settings.writeTargetSettings(rn(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}function mu(e,t,n,r){return n?e?.[n]?Object.keys(e).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:t===n?{message:`Cannot delete the profile in use. Switch to another profile first.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(r.settings.writeTargetSettings(He(r.settings.readTargetSettings(),n)),{message:`Provider profile deleted: ${n}.`,success:!0}):{message:`Provider profile "${n}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function hu(e,t,n){let r=n.settings.readMergedSettings().providers??{};return r[t]?Object.keys(r).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n.settings.readTargetSettings().providers?.[t]===void 0?{message:`Provider profile "${t}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:w(await e.ask(x(`provider-delete`,`Delete profile "${t}"?`)))?gu(e,t,n):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${t}" was not found.`,success:!1}}async function gu(e,t,n){let r=n.settings.readMergedSettings();if(r.currentProvider!==t)return n.settings.writeTargetSettings(He(n.settings.readTargetSettings(),t)),{message:`Provider profile deleted: ${t}.`,success:!0};let i=Object.entries(r.providers??{}).filter(([e])=>e!==t).map(([e,t])=>({value:e,label:au(e,t,r.currentProvider)})),a=await e.ask(T(`provider-delete-replacement`,`Replacement provider for ${t}`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:_u(t,a.values[0],n)}function _u(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=He(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,hostActions:[{...uu,message:`Provider delete restart`}]}}function vu(e,t){let n=Jt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function yu(e,t){return Jt(e.trim()||t)??``}const bu=`switch`,xu=`edit`,Su=`test`,Cu=`duplicate`,wu=`delete`;async function Tu(e,t,n,r){let i=Object.entries(n??{}).map(([e,n])=>({value:e,label:au(e,n,t)})),a=await e.ask(T(`provider-profile`,`Select provider profile`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Eu(e,a.values[0],r)}async function Eu(e,t,n){if(!n.settings.readMergedSettings().providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let r=await e.ask(T(`provider-profile-action`,`Provider profile: ${t}`,[{value:bu,label:`Switch`},{value:xu,label:`Edit`},{value:Su,label:`Test`},{value:Cu,label:`Duplicate`},{value:wu,label:`Delete`}]));return r.type!==`answer`||r.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Du(e,t,r.values[0],n)}async function Du(e,t,n,r){let i=r.settings.readMergedSettings();switch(n){case bu:return ou(i.providers,t,r);case xu:return su(e,t,r);case Su:return nn(i.currentProvider,i.providers,t,r);case Cu:return du(e,t,r);case wu:return hu(e,t,r);default:return{message:`Unknown provider profile action "${n}".`,success:!1}}}async function Ou(e,t,n){let r=e.getUserInteraction(),i=e.isSetupRequired?.()===!0,a=n.settings.readMergedSettings(),o=t.trim();if(o.length===0)return ku(r,a.currentProvider,a.providers,n);let s=o.split(/\s+/),[c=`current`,l]=s;return c===`list`?ku(r,a.currentProvider,a.providers,n):c===`current`||c===``?{message:ju(a.currentProvider,a.providers),success:!0}:c===`switch`?ou(a.providers,l,n):c===`test`?nn(a.currentProvider,a.providers,l,n):c===`edit`?r?l?su(r,l,n):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:c===`duplicate`?r?l?du(r,l,n):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:c===`delete`?l?!s.includes(`--confirmed`)&&r&&!w(await r.ask(x(`provider-delete`,`Delete profile "${l}"?`)))?{message:`Provider delete cancelled.`,success:!0}:mu(a.providers,a.currentProvider,l,n):{message:`Usage: provider delete <profile>`,success:!1}:c===`add`?Mu(r,l,n,i):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function ku(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Au(t,n),success:!0}:Tu(e,t,n,r)}function Au(e,t){let n=Object.entries(t??{});return n.length===0?`No provider profiles configured.`:n.map(([t,n])=>`${t===e?`*`:`-`} ${t}: ${n.type??`unknown`} ${n.model??`(no model)`}`).join(`
71
+ `)}function ju(e,t){if(!e)return`No current provider configured.`;let n=t?.[e];return n?[`Current provider: ${e}`,`Type: ${n.type??`unknown`}`,`Model: ${n.model??`(no model)`}`,...n.baseURL?[`Base URL: ${n.baseURL}`]:[]].join(`
72
+ `):`Current provider "${e}" was not found in providers.`}function Mu(e,t,n,r){return t===void 0||t.length===0?e?Nu(e,n,r):{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?ru(e,eu(t,n),n,r):{message:`Provider setup for "${t}" requires an interactive session.`,success:!1}}async function Nu(e,t,n){let r=t.providerDefinitions.map(e=>({value:e.type,label:Wl(e)})),i=await e.ask(T(`provider-type`,`Select provider`,r,{maxVisible:6}));if(i.type!==`answer`||i.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let a=i.values[0];return S(t.providerDefinitions,a)===void 0?{message:`Usage: provider add <type>. Supported: ${C(t.providerDefinitions)}`,success:!1}:ru(e,eu(a,t),t,n)}function Pu(){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:Pu(),example:`/provider switch production`}}var Iu=class{name=`provider`;getCommands(){return[Fu()]}};function Lu(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)=>Ou(t,n,e)}}function Ru(e){return{name:`agent-command-provider`,commandSources:[new Iu],systemCommands:[Lu(e)]}}async function zu(e,t){let n=(await e(`
71
73
  Do you have an API key for an AI provider?
72
74
 
73
75
  1. Yes, I have an API key
@@ -94,24 +96,24 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
94
96
  When the server is running, come back here and press Enter to continue.
95
97
 
96
98
  ─────────────────────────────────────────────────────────────────────────────
97
- `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function Ru(e,t,n,r,i){let a=await Lu(n,r),o=Bu(t),s=Object.keys(Ft(o.sources).providers??{}),c=Vu(o.stores,t.settingsScope),l;l=a.preselectedType===void 0?Il(await n(Fl(i)),i):a.preselectedType,ve(c,await zl(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 zu(e,t,n,r,i,a){let o=Bu(t),s=Ft(o.sources);if(Ae(t.provider===void 0?s:{...s,currentProvider:t.provider},i)===`valid`||t.provider===void 0&&Bt(i,a.env)!==void 0)return;if(!(a.isInteractive??(()=>!1))())throw new re(a.formatError(i));await Ru(e,Hu(t,o.stores),n,r,i);let c=Ft(o.sources);if(Ae(t.provider===void 0?c:{...c,currentProvider:t.provider},i)!==`valid`)throw new re(a.formatError(i))}function Bu(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 Vu(e,t){if(t===void 0)return Wt(e);let n=t===`user`?`user`:`project-local`,r=e.findLast(e=>e.scope===n);if(r!==void 0)return r;throw new he(`No authorized ${n} settings store is available.`)}function Hu(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:Uu(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function Uu(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 Wu="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 Gu(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 Ku(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=Gu(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(`
98
- `)}`,success:!0}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}if(a===`revoke`){if(!n)return{message:`\`/remote-control revoke\`: ${Wu}`,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\`: ${Wu}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function qu(){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 Ju(){return k(qu(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>Ku(e,t)})}var Yu=class{name=`remote-control`;getCommands(){return[qu()]}};function Xu(){return{name:`agent-command-remote-control`,commandSources:[new Yu],systemCommands:[Ju()]}}function Zu(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function Qu(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function $u(){let e=Qu();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Zu}}var ed=class{name=`reset`;getCommands(){return[Qu()]}};function td(){return{name:`agent-command-reset`,commandSources:[new ed],systemCommands:[$u()]}}function W(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function nd(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function rd(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${nd(e.prompt)}`):[`(no edit checkpoints)`]].join(`
99
- `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function id(e){return e.length>0?e.join(`, `):`(none)`}function ad(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: ${nd(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${id(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${id(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
100
- `),success:!0,data:{inspection:e}}}function od(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
101
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function sd(e){return{message:[`Rolled back code through ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Removed checkpoints: ${e.removedCheckpointCount}`].join(`
102
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function cd(e){return e.reason===`restricted-workspace`?`Edit checkpoints need a trusted workspace: run robota trust --yes, then restart robota.`:e.message}function G(e){return{message:e instanceof l?cd(e):e instanceof Error?e.message:String(e),success:!1}}function ld(e){try{return rd(_t(e))}catch(e){return G(e instanceof Error?e:String(e))}}function ud(e,t){if(!t)return W();try{return ad(it(e,t))}catch(e){return G(e instanceof Error?e:String(e))}}async function dd(e,t){if(!t)return W();try{return od(await Gt(e,t))}catch(e){return G(e instanceof Error?e:String(e))}}async function fd(e,t){if(!t)return W();try{return sd(await qt(e,t))}catch(e){return G(e instanceof Error?e:String(e))}}async function pd(e,t){if(!t)return W();try{let n=await Je(e,t);return{message:[`Forked a new branch from ${n.target.id} (the previous future is preserved).`,`Restored files: ${n.restoredFileCount}`].join(`
103
- `),success:!0,data:{target:n.target,restoredFileCount:n.restoredFileCount}}}catch(e){return G(e instanceof Error?e:String(e))}}function md(e,t){if(!t)return W();try{return tn(e,t),{message:`Switched to checkpoint branch ${t}.`,success:!0}}catch(e){return G(e instanceof Error?e:String(e))}}function hd(e){try{let t=gt(e);return{message:t.length===0?`No checkpoint branches yet.`:`Branch tips:\n${t.map(e=>`- ${e}`).join(`
104
- `)}`,success:!0,data:{branches:t}}}catch(e){return G(e instanceof Error?e:String(e))}}async function gd(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?ld(e):r===`inspect`?ud(e,n[1]):r===`restore`||r===`code`?dd(e,n[1]):r===`rollback`?fd(e,n[1]):r===`fork`?pd(e,n[1]):r===`switch`?md(e,n[1]):r===`branches`?hd(e):W()}function _d(){return{name:`rewind`,displayName:`Rewind History`,description:le,source:`rewind`,argumentHint:ce,modelInvocable:!1,safety:`write`,subcommands:De()}}function vd(){let e=_d();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:gd}}var yd=class{name=`rewind`;getCommands(){return[_d()]}};function bd(){return{name:`agent-command-rewind`,commandSources:[new yd],systemCommands:[vd()]}}function xd(e,t){let n=Math.floor(Math.min(1800,t.milliseconds/2e3)),r=In(`sha256`).update(e).digest().readUInt32BE(0)%(n+1);if(r===0)return{cronExpression:t.cronExpression,jitterSeconds:r};let i=/^(\d+)(s|m|h)$/.exec(t.description);if(!i)throw Error(`Unsupported fixed-loop cadence for jitter.`);let a=Number(i[1]),o=i[2],s=r%60,c=Math.floor(r/60);return o===`s`?{cronExpression:a===60?`${r} * * * * *`:`${r}-59/${a} * * * * *`,jitterSeconds:r}:o===`m`?{cronExpression:a===60?`${s} ${c} * * * *`:`${s} ${c}-59/${a} * * * *`,jitterSeconds:r}:{cronExpression:a===24?`${s} ${c} 0 * * *`:`${s} ${c} */${a} * * *`,jitterSeconds:r}}const Sd=4096,K=new WeakMap,Cd=new Set([`second`,`seconds`,`minute`,`minutes`,`hour`,`hours`,`day`,`days`,`s`,`m`,`h`,`d`]),wd=`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.`,Td={ui:void 0,source:`user`},q={s:1e3,m:6e4,h:36e5,d:864e5},Ed=[...Dd(60).map(e=>({cronExpression:e===60?`0 * * * * *`:`*/${e} * * * * *`,milliseconds:e*q.s,description:`${e}s`})),...Dd(60).filter(e=>e>1).map(e=>({cronExpression:e===60?`0 0 * * * *`:`0 */${e} * * * *`,milliseconds:e*q.m,description:`${e}m`})),...Dd(24).filter(e=>e>1).map(e=>({cronExpression:e===24?`0 0 0 * * *`:`0 0 */${e} * * *`,milliseconds:e*q.h,description:`${e}h`}))];function Dd(e){return Array.from({length:e},(e,t)=>t+1).filter(t=>e%t===0)}function Od(e,t){let n=Number(e),r=q[t];if(!Number.isSafeInteger(n)||n<=0||r===void 0)return;let i=n*r;return Number.isSafeInteger(i)&&i<=q.d?i:void 0}function kd(e){let t=e.length;for(;t>0&&/[a-z]/i.test(e[t-1]);)--t;let n=e.slice(t).toLowerCase();if(!Cd.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 Ad(e,t){let n=t&&t.length<=Sd?t.trim():void 0;if(e===``)return;let r=/^(\d+)(s|m|h|d)$/i.exec(e);if(r&&n){let e=Od(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=Od(i[1],i[2].toLowerCase());return e&&t!==void 0&&!kd(e)?{instruction:e,requestedMs:t}:void 0}let a=kd(e);if(!a)return;let o=Od(a.amount,a.unit[0]);return o===void 0?void 0:{instruction:a.instruction,requestedMs:o}}function jd(e){return Ed.find(t=>t.milliseconds>=e)}function J(e){return e.listSchedules().filter(e=>e.metadata?.sessionLoop===!0&&e.metadata?.sessionLoopSelfPaced!==!0&&e.status!==`cancelled`&&e.status!==`completed`&&e.status!==`failed`)}function Y(e){return(e.listSelfPacedLoops?.()??[]).filter(e=>e.phase!==`stopped`&&e.phase!==`expired`)}function X(e){let t=e.metadata?.sessionLoopId;return typeof t==`string`&&t.length>0?t:e.id}function Md(e){let t=J(e),n=Y(e);return t.length+n.length===0?`No other active loops.`:[...t.map(e=>`- ${X(e)} [${e.status}] ${e.label}`),...n.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`)].join(`
105
- `)}async function Nd(e,t,n){if(t.source===`model`)return{success:!1,message:`Starting a loop with its built-in prompt needs a person to confirm it — ask the user to run /loop, or give your own prompt with /loop <prompt>.`};let{ui:r}=t;if(!r)return{success:!1,message:`A loop with the default maintenance prompt needs someone to confirm it. Start it from an interactive session, or give the loop its own prompt: /loop <prompt>`};let i=n.split(`
106
- `)[0].trim()||n,a=await r.ask(T(`loop-start-default`,`Start a loop that keeps working on its own for up to 7 days? It will: ${i}`,[{value:`start`,label:`Start`},{value:`cancel`,label:`Cancel`}],{description:Md(e)}));if(!(a.type===`answer`&&a.values.includes(`start`)))return{success:!0,message:`Loop not started.`}}async function Pd(e,t,n,r={},i=Td){let a=n.trim();return a===`list`?Fd(e,r):ft(a)?Id(e,t,a):r.disabled?{success:!1,message:`Session loops are disabled by the host.`}:Ld(e,a,r,i)}function Fd(e,t){let n=J(e),r=Y(e);return{success:!0,message:(t.disabled?`Session loops are disabled by the host.
99
+ `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function Bu(e,t,n,r,i){let a=await zu(n,r),o=Hu(t),s=Object.keys(Ft(o.sources).providers??{}),c=Uu(o.stores,t.settingsScope),l;l=a.preselectedType===void 0?Rl(await n(Ll(i)),i):a.preselectedType,ve(c,await Vl(l,n,i,{existingProfileNames:s}),{providerDefinitions:i,env:t.env});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=Hu(t),s=Ft(o.sources);if(Ae(t.provider===void 0?s:{...s,currentProvider:t.provider},i)===`valid`||t.provider===void 0&&Bt(i,a.env)!==void 0)return;if(!(a.isInteractive??(()=>!1))())throw new re(a.formatError(i));await Bu(e,Wu({...t,env:t.env??a.env},o.stores),n,r,i);let c=Ft(o.sources);if(Ae(t.provider===void 0?c:{...c,currentProvider:t.provider},i)!==`valid`)throw new re(a.formatError(i))}function Hu(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 Uu(e,t){if(t===void 0)return Wt(e);let n=t===`user`?`user`:`project-local`,r=e.findLast(e=>e.scope===n);if(r!==void 0)return r;throw new he(`No authorized ${n} settings store is available.`)}function Wu(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:Gu(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function Gu(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 Ku="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 qu(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 Ju(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=qu(t?.getStatus(),n);if(!t?.describeKeyStorage)return r;let i=t.describeKeyStorage()??`chosen when remote control is first enabled`;return{...r,message:`${r.message}\nHost key storage: ${i}`}}if(a===`devices`){let t=(e.getCommandHostAdapters?.().remoteControl)?.listDevices?.();return t?t.length===0?{message:`No trusted devices are enrolled yet.`,success:!0}:{message:`Trusted devices:\n${t.map(e=>` ${e.deviceId} ${e.label} (last seen ${e.lastSeenAt})`).join(`
100
+ `)}`,success:!0}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}if(a===`revoke`){if(!n)return{message:`\`/remote-control revoke\`: ${Ku}`,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\`: ${Ku}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function Yu(){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 Xu(){return k(Yu(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>Ju(e,t)})}var Zu=class{name=`remote-control`;getCommands(){return[Yu()]}};function Qu(){return{name:`agent-command-remote-control`,commandSources:[new Zu],systemCommands:[Xu()]}}function $u(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function ed(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function td(){let e=ed();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:$u}}var nd=class{name=`reset`;getCommands(){return[ed()]}};function rd(){return{name:`agent-command-reset`,commandSources:[new nd],systemCommands:[td()]}}function W(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function id(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function ad(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${id(e.prompt)}`):[`(no edit checkpoints)`]].join(`
101
+ `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function od(e){return e.length>0?e.join(`, `):`(none)`}function sd(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: ${id(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${od(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${od(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
102
+ `),success:!0,data:{inspection:e}}}function cd(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
103
+ `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function ld(e){return{message:[`Rolled back code through ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Removed checkpoints: ${e.removedCheckpointCount}`].join(`
104
+ `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function ud(e,t){return e.reason===`restricted-workspace`?t===void 0?`Edit checkpoints need a trusted workspace. Trust it from a terminal, then restart the session.`:`Edit checkpoints need a trusted workspace: run ${t} trust --yes, then restart ${t}.`:e.message}function G(e,t){return{message:e instanceof l?ud(e,t):e instanceof Error?e.message:String(e),success:!1}}function dd(e){try{return ad(_t(e))}catch(t){return G(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}function fd(e,t){if(!t)return W();try{return sd(it(e,t))}catch(t){return G(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function pd(e,t){if(!t)return W();try{return cd(await Gt(e,t))}catch(t){return G(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function md(e,t){if(!t)return W();try{return ld(await qt(e,t))}catch(t){return G(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function hd(e,t){if(!t)return W();try{let n=await Je(e,t);return{message:[`Forked a new branch from ${n.target.id} (the previous future is preserved).`,`Restored files: ${n.restoredFileCount}`].join(`
105
+ `),success:!0,data:{target:n.target,restoredFileCount:n.restoredFileCount}}}catch(t){return G(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}function gd(e,t){if(!t)return W();try{return tn(e,t),{message:`Switched to checkpoint branch ${t}.`,success:!0}}catch(t){return G(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}function _d(e){try{let t=gt(e);return{message:t.length===0?`No checkpoint branches yet.`:`Branch tips:\n${t.map(e=>`- ${e}`).join(`
106
+ `)}`,success:!0,data:{branches:t}}}catch(t){return G(t instanceof Error?t:String(t),e.getCommandProductVocabulary?.()?.cliName)}}async function vd(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?dd(e):r===`inspect`?fd(e,n[1]):r===`restore`||r===`code`?pd(e,n[1]):r===`rollback`?md(e,n[1]):r===`fork`?hd(e,n[1]):r===`switch`?gd(e,n[1]):r===`branches`?_d(e):W()}function yd(){return{name:`rewind`,displayName:`Rewind History`,description:le,source:`rewind`,argumentHint:ce,modelInvocable:!1,safety:`write`,subcommands:De()}}function bd(){let e=yd();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:vd}}var xd=class{name=`rewind`;getCommands(){return[yd()]}};function Sd(){return{name:`agent-command-rewind`,commandSources:[new xd],systemCommands:[bd()]}}function Cd(e,t){let n=Math.floor(Math.min(1800,t.milliseconds/2e3)),r=In(`sha256`).update(e).digest().readUInt32BE(0)%(n+1);if(r===0)return{cronExpression:t.cronExpression,jitterSeconds:r};let i=/^(\d+)(s|m|h)$/.exec(t.description);if(!i)throw Error(`Unsupported fixed-loop cadence for jitter.`);let a=Number(i[1]),o=i[2],s=r%60,c=Math.floor(r/60);return o===`s`?{cronExpression:a===60?`${r} * * * * *`:`${r}-59/${a} * * * * *`,jitterSeconds:r}:o===`m`?{cronExpression:a===60?`${s} ${c} * * * *`:`${s} ${c}-59/${a} * * * *`,jitterSeconds:r}:{cronExpression:a===24?`${s} ${c} 0 * * *`:`${s} ${c} */${a} * * *`,jitterSeconds:r}}const wd=4096,K=new WeakMap,Td=new Set([`second`,`seconds`,`minute`,`minutes`,`hour`,`hours`,`day`,`days`,`s`,`m`,`h`,`d`]),Ed=`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.`,Dd={ui:void 0,source:`user`},q={s:1e3,m:6e4,h:36e5,d:864e5},Od=[...kd(60).map(e=>({cronExpression:e===60?`0 * * * * *`:`*/${e} * * * * *`,milliseconds:e*q.s,description:`${e}s`})),...kd(60).filter(e=>e>1).map(e=>({cronExpression:e===60?`0 0 * * * *`:`0 */${e} * * * *`,milliseconds:e*q.m,description:`${e}m`})),...kd(24).filter(e=>e>1).map(e=>({cronExpression:e===24?`0 0 0 * * *`:`0 0 */${e} * * *`,milliseconds:e*q.h,description:`${e}h`}))];function kd(e){return Array.from({length:e},(e,t)=>t+1).filter(t=>e%t===0)}function Ad(e,t){let n=Number(e),r=q[t];if(!Number.isSafeInteger(n)||n<=0||r===void 0)return;let i=n*r;return Number.isSafeInteger(i)&&i<=q.d?i:void 0}function jd(e){let t=e.length;for(;t>0&&/[a-z]/i.test(e[t-1]);)--t;let n=e.slice(t).toLowerCase();if(!Td.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 Md(e,t){let n=t&&t.length<=wd?t.trim():void 0;if(e===``)return;let r=/^(\d+)(s|m|h|d)$/i.exec(e);if(r&&n){let e=Ad(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=Ad(i[1],i[2].toLowerCase());return e&&t!==void 0&&!jd(e)?{instruction:e,requestedMs:t}:void 0}let a=jd(e);if(!a)return;let o=Ad(a.amount,a.unit[0]);return o===void 0?void 0:{instruction:a.instruction,requestedMs:o}}function Nd(e){return Od.find(t=>t.milliseconds>=e)}function J(e){return e.listSchedules().filter(e=>e.metadata?.sessionLoop===!0&&e.metadata?.sessionLoopSelfPaced!==!0&&e.status!==`cancelled`&&e.status!==`completed`&&e.status!==`failed`)}function Y(e){return(e.listSelfPacedLoops?.()??[]).filter(e=>e.phase!==`stopped`&&e.phase!==`expired`)}function X(e){let t=e.metadata?.sessionLoopId;return typeof t==`string`&&t.length>0?t:e.id}function Pd(e){let t=J(e),n=Y(e);return t.length+n.length===0?`No other active loops.`:[...t.map(e=>`- ${X(e)} [${e.status}] ${e.label}`),...n.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`)].join(`
107
+ `)}async function Fd(e,t,n){if(t.source===`model`)return{success:!1,message:`Starting a loop with its built-in prompt needs a person to confirm it — ask the user to run /loop, or give your own prompt with /loop <prompt>.`};let{ui:r}=t;if(!r)return{success:!1,message:`A loop with the default maintenance prompt needs someone to confirm it. Start it from an interactive session, or give the loop its own prompt: /loop <prompt>`};let i=n.split(`
108
+ `)[0].trim()||n,a=await r.ask(T(`loop-start-default`,`Start a loop that keeps working on its own for up to 7 days? It will: ${i}`,[{value:`start`,label:`Start`},{value:`cancel`,label:`Cancel`}],{description:Pd(e)}));if(!(a.type===`answer`&&a.values.includes(`start`)))return{success:!0,message:`Loop not started.`}}async function Id(e,t,n,r={},i=Dd){let a=n.trim();return a===`list`?Ld(e,r):ft(a)?Rd(e,t,a):r.disabled?{success:!1,message:`Session loops are disabled by the host.`}:zd(e,a,r,i)}function Ld(e,t){let n=J(e),r=Y(e);return{success:!0,message:(t.disabled?`Session loops are disabled by the host.
107
109
  `:``)+(n.length+r.length===0?`No active loops.`:[...n.map(e=>`- ${X(e)} [${e.status}] ${e.label}`),...r.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`+(e.phase===`waiting`&&e.delaySeconds!==void 0&&e.reason?` — next ${e.delaySeconds}s: ${e.reason}`:``))].join(`
108
- `)),data:{count:n.length+r.length}}}async function Id(e,t,n){let r=/^stop\s+(\S+)$/.exec(n);if(!r)return{success:!1,message:wd};let i=Y(e).find(e=>e.loopId===r[1]);if(i)return e.stopSelfPacedLoop?(await e.stopSelfPacedLoop(i.loopId,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${i.loopId}. An already-running turn may finish.`,data:{loopId:i.loopId}}):{success:!1,message:`This host cannot stop self-paced loops.`};let a=J(e).find(e=>X(e)===r[1]);return a?(await t(a.id,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${X(a)}. An already-running turn may finish.`,data:{loopId:X(a),taskId:a.id}}):{success:!1,message:`Active loop not found: ${r[1]}`}}async function Ld(e,t,n,r=Td){let i=t===``||/^\d+(s|m|h|d)$/i.test(t),a=n.defaultPrompt;if(i&&n.resolveDefaultPrompt)try{a=n.resolveDefaultPrompt()}catch(e){return{success:!1,message:`Default loop prompt could not be loaded: ${e instanceof Error?e.message:String(e)}`}}let o=Ad(t,a);if(!o){if(/^\d+[a-z](?:\s|$)/i.test(t)||kd(t))return{success:!1,message:wd};let n=(t||a||``).trim();if(!n||t===``&&n.length>Sd)return{success:!1,message:wd};if(!e.createSelfPacedLoop)return{success:!1,message:`Self-paced loops require a persistent interactive session.`};if(i){let t=await Nd(e,r,n);if(t)return t}let o=K.get(e)??0;if(J(e).length+Y(e).length+o>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};K.set(e,o+1);try{let t=i?await e.createSelfPacedLoop(n,{useDefaultPrompt:!0}):await e.createSelfPacedLoop(n);return{success:!0,message:`Self-paced loop ${t.loopId} started. It will choose a 1–60 minute delay after each iteration and expires ${t.expiresAt}. Stop with /loop stop ${t.loopId}.`,data:{loopId:t.loopId,expiresAt:t.expiresAt}}}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}}if(i){let t=await Nd(e,r,o.instruction);if(t)return t}let s=K.get(e)??0;if(J(e).length+Y(e).length+s>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};let c=jd(o.requestedMs),l=`Loop: ${o.instruction.slice(0,48)}`,u=`loop_${Ln()}`,d=xd(u,c),f=Date.now(),p=new Date(f+o.requestedMs).toISOString(),m=new Date(f+6048e5).toISOString();K.set(e,s+1);let h;try{h=await e.spawnScheduledWake({label:l,cronExpression:d.cronExpression,agentInstruction:o.instruction,sessionLoop:!0,sessionLoopId:u,...i?{sessionLoopDefaultPrompt:!0}:{},sessionLoopFirstAllowedAt:p,sessionLoopExpiresAt:m})}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}let g=c.milliseconds===o.requestedMs?``:` (rounded up)`,_=h.kind===`scheduled`&&h.nextFireAt&&h.nextFireAt>=p?` Next fire: ${h.nextFireAt}.`:``;return{success:!0,message:`Loop ${u} uses a ${c.description}${g} local-clock step with stable offset +${d.jitterSeconds}s; elapsed gaps can change with daylight saving. First eligible at or after ${p}.${_} Expires: ${m}. Stop with /loop stop ${u}.`,data:{loopId:u,taskId:h.id,requestedMs:o.requestedMs,cadenceLabel:c.description,cronExpression:d.cronExpression,jitterSeconds:d.jitterSeconds,firstAllowedAt:p,expiresAt:m}}}const Rd={s:1e3,m:6e4,h:36e5,d:864e5},Z=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function zd(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)*Rd[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 Bd(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 Hd(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(`
109
- `)}async function Ud(e,t,n,r){if(t===`list`){let t=e.listSchedules();return{message:Hd(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=zd(a,r);return o.ok?(await e.editSchedule(i,{cronExpression:o.spec.cronExpression,agentInstruction:o.spec.instruction,label:Bd(`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 Wd(e,t,n=Date.now()){let r=t.trim(),i=r.indexOf(` `),a=await Ud(e,(i===-1?r:r.slice(0,i)).toLowerCase(),i===-1?``:r.slice(i+1).trim(),n);if(a)return a;let o=zd(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:Bd(`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 Gd(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 Kd(e,t){let n=Gd(t);if(!n)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let r;try{r=await e.spawnMonitorWake({label:Bd(`Monitor`,n.instruction),command:n.command,matchPattern:n.matchPattern,agentInstruction:n.instruction})}catch(e){if(e instanceof _)return{message:e.message,success:!1};throw e}return{message:`Monitoring \`${n.command}\` for /${n.matchPattern}/ — task ${r.id}.`,success:!0,data:{taskId:r.id,matchPattern:n.matchPattern}}}function qd(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function Jd(){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 Yd(){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 Xd(){return{name:`loop`,displayName:`Repeat Prompt`,description:`Repeat a prompt on a fixed cadence or let each iteration choose its next delay; list or stop active loops.`,modelDescription:"Repeat a prompt on a fixed cadence (`<N><s|m|h|d> <prompt>`) or self-paced (`<prompt>`: each iteration chooses its next delay or stops). Use it when the user asks for recurring work in this session, and always give your own prompt: any form that would fall back to the host's default maintenance prompt — bare `/loop` or an interval alone (`<N><s|m|h|d>`) — needs a person to confirm it and is always refused for you, whether or not one is attached. `list` shows active loops; `stop <id>` ends one, even mid-turn. Returns the loop id and its next fire time, the loop list, or a refusal naming the command to suggest.",source:`schedule`,argumentHint:`[prompt] | <N><s|m|h|d> [prompt] | <prompt> every <N> <unit> | list | stop <id>`,modelInvocable:!0,subcommands:[{name:`list`,description:`List active loops`,source:`schedule`},{name:`stop`,description:`Stop an active loop`,source:`schedule`,argumentHint:`<id>`}]}}function Zd(){let e=Jd();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)=>Wd(qd(e),t)}}function Qd(){let e=Yd();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)=>Kd(qd(e),t)}}function $d(e){let t=Xd();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)=>Pd(qd(t),(e,n)=>t.cancelBackgroundTask(e,n),n,e,{ui:t.getUserInteraction(),source:t.getCommandInvocationSource()})}}var ef=class{name=`schedule`;getCommands(){return[Jd(),Yd(),Xd()]}};function tf(e={}){return{name:`agent-command-schedule`,commandSources:[new ef],systemCommands:[Zd(),Qd(),$d(e)],sessionRequirements:[`agent-runtime`]}}function nf(e,t,n){return fn(e,t,n)}function Q(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function rf(e){return e.toLocaleString(`en-US`)}const af=`Conversation cleared.`;function of(e,t){let n=t.trim();return n===``?{success:!1,message:`Usage: /cd <directory>`}:{success:!0,message:``,hostActions:[{type:`workspace-move`,path:n}]}}async function sf(e,t){let n=e.getUserInteraction();return n&&!w(await n.ask(x(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:(Me(e),{success:!0,message:af})}function cf(e,t){let n=Et(t);return n===void 0?{success:!1,message:oe}:{success:!0,message:`Session renamed to "${n}".`,data:{name:n},hostActions:[ze(n)]}}function lf(){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},uiIntents:[Ve()]}}function uf(e){return e.getCommandHostAdapters?.().costBudget}const df=`Budget persistence is not available on this host (no cost-budget adapter was composed).`;function ff(e){return`Could not write the budget: ${e instanceof Error?e.message:String(e)}`}function pf(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?nf(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 mf(e){let t=e.getSession(),n=Pt(e),r=t.getModelId(),i=pf(e.getSessionUsage(),r),a=[`Session: ${n.sessionId}`,`Messages: ${n.messageCount}`],o={sessionId:n.sessionId,messageCount:n.messageCount};if(i){a.push(`Tokens: ${rf(i.inputTokens)} input / ${rf(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=uf(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 hf(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=uf(e);if(i===void 0)return{success:!1,message:df};if(t===`clear`){try{i.clear()}catch(e){return{success:!1,message:ff(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:df};try{i.write({monthly:r})}catch(e){return{success:!1,message:ff(e)}}return{success:!0,message:`Monthly budget set to ${Q(r)}.`}}let{lines:r,data:i}=mf(e);return{success:!0,message:r.join(`
110
- `),data:i}}function gf(e,t){let n=an(e);return{success:n.validation.ok,message:Qe(n),data:{logFile:n.logFile,entryCount:n.entryCount,issueCount:n.validation.issues.length,ok:n.validation.ok}}}function _f(){return{name:`clear`,displayName:`Clear History`,description:n,source:`session`,modelInvocable:!1,userInvocable:!0}}function vf(){return{name:`rename`,displayName:`Rename Session`,description:ae,argumentHint:`<name>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function yf(){return{name:`cd`,displayName:`Change Directory`,description:`Move this session to another working directory`,argumentHint:`<directory>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function bf(){return{name:`resume`,displayName:`Resume Session`,description:se,source:`session`,modelInvocable:!1,userInvocable:!0}}function xf(){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 Sf(){return{name:`validate-session`,displayName:`Validate Session`,description:me,source:`session`,modelInvocable:!1,userInvocable:!0}}function Cf(){return k(_f(),{requiresPermission:!1,lifecycle:`inline`,execute:sf})}function wf(){return k(vf(),{requiresPermission:!1,lifecycle:`inline`,execute:cf})}function Tf(){return k(yf(),{requiresPermission:!1,lifecycle:`inline`,execute:of})}function Ef(){return k(bf(),{requiresPermission:!1,lifecycle:`inline`,execute:lf})}function Df(){return k(xf(),{requiresPermission:!1,lifecycle:`inline`,execute:hf})}function Of(){return k(Sf(),{requiresPermission:!1,lifecycle:`inline`,execute:gf})}var kf=class{name=`session`;getCommands(){return[_f(),vf(),yf(),bf(),xf(),Sf()]}};function Af(){return{name:`agent-command-session`,commandSources:[new kf],systemCommands:[Cf(),wf(),Tf(),Ef(),Df(),Of()]}}function jf(){return{name:`settings`,displayName:`Settings`,description:`Open settings — language, output style, preset, permissions and more`,source:`settings`,modelInvocable:!1}}function Mf(){let e=jf();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 Nf=class{name=`settings`;getCommands(){return[jf()]}};function Pf(){return{name:`agent-command-settings`,commandSources:[new Nf],systemCommands:[Mf()]}}function Ff(e){let t=mn({executable:e});return{command:t.command,interactiveArgs:t.interactiveArgs,commandArgs:e=>t.commandArgs(e)}}const If="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function Lf(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?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 Rf(){return{name:`shell`,displayName:`Shell`,description:If,source:`shell`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function zf(e){let t=Rf();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)=>Lf(t,n,e)}}var Bf=class{name=`shell`;getCommands(){return[Rf()]}};function Vf(e){return{name:`agent-command-shell`,commandSources:[new Bf],systemCommands:[zf(e)]}}const Hf=`List registered skills, or activate one by name`;function Uf(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 Wf(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${Uf(e)}`}function Gf(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(`
111
- `):[`Registered skills:`,...e.map(Wf),``,`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(`
112
- `)}function Kf(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 qf(e,t=``){let n=Kf(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:Gf(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function Jf(){return{name:`skills`,displayName:`Skills`,description:Hf,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 Yf(){let e=Jf();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:qf}}var Xf=class{name=`skills`;getCommands(){return[Jf()]}};function Zf(e){let t=[new Xf];return t.push(new pe(e.contributionSources,e.skillRoots??[])),{name:`agent-command-skills`,commandSources:t,systemCommands:[Yf()]}}const Qf=[`Usage: /statusline on | off | reset | git on | git off`,`Fields: model, context, permission mode, message count, session name, thinking state, git branch.`].join(`
113
- `);function $f(e){let t=e.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[n,r]=t;return n===`on`&&r===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:n===`off`&&r===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:n===`reset`&&r===void 0?{success:!0,message:`Status line settings reset.`,patch:{...o}}:n===`git`&&r===`on`&&t.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:n===`git`&&r===`off`&&t.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:Qf}}function ep(e,t){let n=$f(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function tp(){return{name:`statusline`,displayName:`Status Line`,description:de,source:`statusline`,argumentHint:ue,subcommands:Oe(`statusline`),modelInvocable:!1}}function np(){let e=tp();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:ep}}var rp=class{name=`statusline`;getCommands(){return[tp()]}};function ip(){return{name:`agent-command-statusline`,commandSources:[new rp],systemCommands:[np()]}}const ap=`list | <theme-id> | syntax on|off | motion on|off`;function $(e){return e?`on`:`off`}function op(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(`
114
- `)}function sp(e){return{success:!0,message:op(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function cp(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function lp(e){if(e===`on`)return!0;if(e===`off`)return!1}function up(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=lp(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${ap}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function dp(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 fp(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 sp(e);let r=up(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${ap}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return cp(r.themeId,e);i.theme=a.id}return{success:!0,message:dp(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function pp(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:ap,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var mp=class{name=`theme`;getCommands(){return[pp()]}};function hp(e){let t=pp(),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)=>fp(e,n)};return{name:`agent-command-theme`,commandSources:[new mp],systemCommands:[n]}}const gp=`Inspect user-local storage and memory state.`,_p=`storage list [--format json] | memory set/list/inspect/disable/delete`,vp=`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 yp(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
115
- `)}function bp(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function xp(e,t,n){let r=await yt({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):yp(r.items),success:!0,data:{list:r}}}async function Sp(e,t,n){let[r,i,a]=n.positional,o=await Qt({activeRepositoryRoot:e,storageRoot:t,category:bp(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 Cp(e,t,n){let[r,i]=n.positional,a=await st({activeRepositoryRoot:e,storageRoot:t,category:bp(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 wp(e,t,n){let[r,i]=n.positional,a=await We({activeRepositoryRoot:e,storageRoot:t,category:bp(r),key:i??``});return{message:`Disabled user-local memory item ${a.category}/${a.key}`,success:!0,data:{item:a}}}async function Tp(e,t,n){let[r,i]=n.positional,a=await Ue({activeRepositoryRoot:e,storageRoot:t,category:bp(r),key:i??``});return{message:`Deleted user-local memory item ${a.category}/${a.key}`,success:!0,data:{result:a}}}async function Ep(e,t,n){return(n.action??`list`)===`list`?xp(e,t,n):n.action===`set`?Sp(e,t,n):n.action===`inspect`?Cp(e,t,n):n.action===`disable`?wp(e,t,n):n.action===`delete`?Tp(e,t,n):{message:vp,success:!1}}function Dp(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Op(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 kp(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=Op(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:Dp(n),summary:r,source:i}}function Ap(e){return e.trim().split(/\s+/).filter(Boolean)}function jp(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
116
- `)}async function Mp(e,t,n){if((n.action??`list`)!==`list`)return{message:vp,success:!1};let r=await ct({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):jp(r.root,r.categories),success:!0,data:{root:r.root,categories:r.categories,inspection:r}}}async function Np(e,t,n){return n.target===`storage`?Mp(e,t,n):n.target===`memory`?Ep(e,t,n):{message:vp,success:!1}}function Pp(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Fp(e){try{return await Np(e.cwd,e.storageRoot,kp(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:Pp(e instanceof Error?e.message:String(e)),success:!1}}}async function Ip(e,t,n){try{return await Np(e.getCwd(),n,kp(Ap(t)))}catch(e){return{message:Pp(e instanceof Error?e.message:String(e)),success:!1}}}function Lp(){return{name:`user-local`,displayName:`User Config`,description:gp,source:`user-local`,argumentHint:_p,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 Rp(e){let t=Lp();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)=>Ip(t,n,e)}}var zp=class{name=`user-local`;getCommands(){return[Lp()]}};function Bp(e){return{name:`agent-command-user-local`,commandSources:[new zp],systemCommands:[Rp(e)]}}function Vp(e,t,n){return Yt(e,t,n)}function Hp({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 _=[Zf({contributionSources:r??[],skillRoots:i}),Lo(),pr(),za(),Da(),Yc(),Js(),hc(),Nl(),wc(),qo(),yr(),eo(p),wo(),tl(),Vf(),ba(n),_o(),Vo(c),hp(l),...d===void 0?[]:[pa(d,void 0,f)],zs(),Cs(),Bp(t),Tr(),Xr(),Wa(),Af(),td(),bd(),tf(m),ip(),xl(),Pf(),Gc(),Mc(),Mo(),Xu(),...u===void 0?[]:[oi(u)],Iu({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s}}),oc({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s}})],v=_.map(e=>e.name);return{modules:Vp(_,h,g),unknownModuleNames:qe(v,h,g)}}function Up(e){let{shellExecutable:t,editorTemporaryDirectoryPrefix:n,keybindingsFile:r,themeCatalogue:i,enabledCommandModules:a,disabledCommandModules:o}=e,s=[[Vf(t),(e,n)=>Lf(e,n,t)],[ba(n),(e,t)=>ga(e,t,n)],[Vo(r),e=>zo(r,e)],[hp(i),(e,t)=>fp(i,t)]],c=new Set(Yt(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{xa as ADVISOR_SETTING_KEY,Ea as AdvisorCommandSource,fr as AgentCommandSource,vr as BackgroundCommandSource,af as CLEAR_COMMAND_MESSAGE,wr as CompactCommandSource,Yr as ContextCommandSource,la as DoctorCommandSource,ha as EDITOR_COMMAND_DESCRIPTION,ya as EditorCommandSource,Ra as EffortCommandSource,Ua as ExitCommandSource,vo as GOAL_COMMAND_DESCRIPTION,go as GitCommandSource,Co as GoalCommandSource,jo as HandoffCommandSource,Io as HelpCommandSource,Bo as KeybindingsCommandSource,Ko as LanguageCommandSource,Ss as MCPActivationCommandSource,Rs as MemoryCommandSource,qs as ModeCommandSource,ac as ModelCommandSource,Cc as OutputStyleCommandSource,Jc as PermissionsCommandSource,bl as PluginManagerCommandSource,Ml as PresetCommandSource,Pu as ProviderCommandSource,Yu as RemoteControlCommandSource,yd as RewindCommandSource,V as SANDBOX_MODES,If as SHELL_COMMAND_DESCRIPTION,Hf as SKILLS_COMMAND_DESCRIPTION,Qf as STATUSLINE_USAGE,Vi as STORAGE_REPAIR_ID,mc as SandboxCommandSource,ef as ScheduleCommandSource,kf as SessionCommandSource,Nf as SettingsCommandSource,Bf as ShellCommandSource,Xf as SkillsCommandSource,rp as StatusLineCommandSource,mp as ThemeCommandSource,_p as USER_LOCAL_COMMAND_ARGUMENT_HINT,gp as USER_LOCAL_COMMAND_DESCRIPTION,vp as USER_LOCAL_COMMAND_USAGE,zp as UserLocalCommandSource,qi as applyDoctorRepair,aa as buildDoctorReport,Ci as collectSettingsSecrets,wa as createAdvisorCommandEntry,Da as createAdvisorCommandModule,ur as createAgentCommandEntry,pr as createAgentCommandModule,dr as createAgentSystemCommand,gr as createBackgroundCommandEntry,yr as createBackgroundCommandModule,_f as createClearCommandEntry,Sr as createCompactCommandEntry,Tr as createCompactCommandModule,qr as createContextCommandEntry,Xr as createContextCommandModule,xf as createCostCommandEntry,Hp as createDefaultCommandModules,oi as createDevicesCommandModule,ca as createDoctorCommandEntry,pa as createDoctorCommandModule,_a as createEditorCommandEntry,ba as createEditorCommandModule,Ia as createEffortCommandEntry,za as createEffortCommandModule,Va as createExitCommandEntry,Wa as createExitCommandModule,po as createGitCommandEntry,_o as createGitCommandModule,Ie as createGitProcess,xo as createGoalCommandEntry,wo as createGoalCommandModule,ko as createHandoffCommandEntry,Mo as createHandoffCommandModule,Po as createHelpCommandEntry,Lo as createHelpCommandModule,Ro as createKeybindingsCommandEntry,Vo as createKeybindingsCommandModule,Wo as createLanguageCommandEntry,qo as createLanguageCommandModule,Xd as createLoopCommandEntry,ys as createMCPActivationCommandEntry,Cs as createMCPActivationCommandModule,Is as createMemoryCommandEntry,zs as createMemoryCommandModule,Gs as createModeCommandEntry,Js as createModeCommandModule,rc as createModelCommandEntry,oc as createModelCommandModule,Yd as createMonitorCommandEntry,di as createNodeDoctorDeps,xc as createOutputStyleCommandEntry,wc as createOutputStyleCommandModule,Kc as createPermissionsCommandEntry,Yc as createPermissionsCommandModule,tl as createPlanCommandModule,gl as createPluginCommandEntry,xl as createPluginCommandModule,Al as createPresetCommandEntry,Nl as createPresetCommandModule,Nu as createProviderCommandEntry,Iu as createProviderCommandModule,Pl as createProviderSetupFlow,_l as createReloadPluginsCommandEntry,qu as createRemoteControlCommandEntry,Xu as createRemoteControlCommandModule,vf as createRenameCommandEntry,Qu as createResetCommandEntry,td as createResetCommandModule,bf as createResumeCommandEntry,bd as createRewindCommandModule,hc as createSandboxCommandModule,Jd as createScheduleCommandEntry,tf as createScheduleCommandModule,Af as createSessionCommandModule,jf as createSettingsCommandEntry,Pf as createSettingsCommandModule,Rf as createShellCommandEntry,Vf as createShellCommandModule,Jf as createSkillsCommandEntry,Zf as createSkillsCommandModule,tp as createStatusLineCommandEntry,ip as createStatusLineCommandModule,Up as createTerminalClientCommands,pp as createThemeCommandEntry,hp as createThemeCommandModule,Lp as createUserLocalCommandEntry,Bp as createUserLocalCommandModule,Sf as createValidateSessionCommandEntry,Hi as doctorRepairAllowlist,zu as ensureProviderConfig,Ca as executeAdvisorCommand,or as executeAgentCommand,hr as executeBackgroundCommand,sf as executeClearCommand,xr as executeCompactCommand,Rr as executeContextCommand,hf as executeCostCommand,ga as executeEditorCommand,Pa as executeEffortCommand,Ba as executeExitCommand,mo as executeGitCommand,bo as executeGoalCommand,Do as executeHandoffCommand,No as executeHelpCommand,Uo as executeLanguageCommand,Pd as executeLoopCommand,ds as executeMCPActivationCommand,Fs as executeMemoryCommand,Ws as executeModeCommand,Zs as executeModelCommand,Kd as executeMonitorCommand,bc as executeOutputStyleCommand,Hs as executePermissionsCommand,ml as executePluginCommand,Ol as executePresetCommand,Eu as executeProviderCommand,hl as executeReloadPluginsCommand,Ku as executeRemoteControlCommand,cf as executeRenameCommand,Zu as executeResetCommand,lf as executeResumeCommand,gd as executeRewindCommand,uc as executeSandboxCommand,Wd as executeScheduleCommand,Lf as executeShellCommand,qf as executeSkillsCommand,ep as executeStatusLineCommand,fp as executeThemeCommand,Ip as executeUserLocalCommand,Fp as executeUserLocalDirectCommand,gf as executeValidateSessionCommand,Hl as formatProviderSetupChoiceLabel,Ul as formatProviderSetupHelpLinks,Bl as formatProviderSetupPromptLabel,Fl as formatProviderSetupSelectionPrompt,cc as formatSandboxStatus,Ll as getProviderSetupStep,nt as gitEnvironment,Ui as isDoctorRepairId,Qo as mcpUnavailableServersNotice,Jo as mcpUserActionCommand,Zo as mcpUserActionNotice,zd as parseScheduleSpec,Ki as planDoctorRepair,xi as redactDiagnosticText,hi as renderDoctorReport,ui as resolveCommandOnPath,ma as resolveEditor,Il as resolveProviderSetupSelection,Ff as resolveShell,sa as runDoctor,zl as runProviderSetupPromptFlow,Ru as runProviderStartupSetup,N as spawnInherited,Rl as submitProviderSetupValue,Gl as validateProviderSetupValue};
110
+ `)),data:{count:n.length+r.length}}}async function Rd(e,t,n){let r=/^stop\s+(\S+)$/.exec(n);if(!r)return{success:!1,message:Ed};let i=Y(e).find(e=>e.loopId===r[1]);if(i)return e.stopSelfPacedLoop?(await e.stopSelfPacedLoop(i.loopId,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${i.loopId}. An already-running turn may finish.`,data:{loopId:i.loopId}}):{success:!1,message:`This host cannot stop self-paced loops.`};let a=J(e).find(e=>X(e)===r[1]);return a?(await t(a.id,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${X(a)}. An already-running turn may finish.`,data:{loopId:X(a),taskId:a.id}}):{success:!1,message:`Active loop not found: ${r[1]}`}}async function zd(e,t,n,r=Dd){let i=t===``||/^\d+(s|m|h|d)$/i.test(t),a=n.defaultPrompt;if(i&&n.resolveDefaultPrompt)try{a=n.resolveDefaultPrompt()}catch(e){return{success:!1,message:`Default loop prompt could not be loaded: ${e instanceof Error?e.message:String(e)}`}}let o=Md(t,a);if(!o){if(/^\d+[a-z](?:\s|$)/i.test(t)||jd(t))return{success:!1,message:Ed};let n=(t||a||``).trim();if(!n||t===``&&n.length>wd)return{success:!1,message:Ed};if(!e.createSelfPacedLoop)return{success:!1,message:`Self-paced loops require a persistent interactive session.`};if(i){let t=await Fd(e,r,n);if(t)return t}let o=K.get(e)??0;if(J(e).length+Y(e).length+o>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};K.set(e,o+1);try{let t=i?await e.createSelfPacedLoop(n,{useDefaultPrompt:!0}):await e.createSelfPacedLoop(n);return{success:!0,message:`Self-paced loop ${t.loopId} started. It will choose a 1–60 minute delay after each iteration and expires ${t.expiresAt}. Stop with /loop stop ${t.loopId}.`,data:{loopId:t.loopId,expiresAt:t.expiresAt}}}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}}if(i){let t=await Fd(e,r,o.instruction);if(t)return t}let s=K.get(e)??0;if(J(e).length+Y(e).length+s>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};let c=Nd(o.requestedMs),l=`Loop: ${o.instruction.slice(0,48)}`,u=`loop_${Ln()}`,d=Cd(u,c),f=Date.now(),p=new Date(f+o.requestedMs).toISOString(),m=new Date(f+6048e5).toISOString();K.set(e,s+1);let h;try{h=await e.spawnScheduledWake({label:l,cronExpression:d.cronExpression,agentInstruction:o.instruction,sessionLoop:!0,sessionLoopId:u,...i?{sessionLoopDefaultPrompt:!0}:{},sessionLoopFirstAllowedAt:p,sessionLoopExpiresAt:m})}finally{let t=(K.get(e)??1)-1;t===0?K.delete(e):K.set(e,t)}let g=c.milliseconds===o.requestedMs?``:` (rounded up)`,_=h.kind===`scheduled`&&h.nextFireAt&&h.nextFireAt>=p?` Next fire: ${h.nextFireAt}.`:``;return{success:!0,message:`Loop ${u} uses a ${c.description}${g} local-clock step with stable offset +${d.jitterSeconds}s; elapsed gaps can change with daylight saving. First eligible at or after ${p}.${_} Expires: ${m}. Stop with /loop stop ${u}.`,data:{loopId:u,taskId:h.id,requestedMs:o.requestedMs,cadenceLabel:c.description,cronExpression:d.cronExpression,jitterSeconds:d.jitterSeconds,firstAllowedAt:p,expiresAt:m}}}const Bd={s:1e3,m:6e4,h:36e5,d:864e5},Z=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function Vd(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)*Bd[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 Hd(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}const Ud=`Usage: /schedule list | pause <id> | resume <id> | edit <id> <spec> (or a create spec: in <N><s|m|h|d> … | cron "<expr>" …)`;function Wd(e){return e.length===0?`No schedules.`:e.map(e=>{let t=e.kind===`scheduled`?e.schedule?.cronExpression??`(unknown)`:`(unknown)`,n=e.kind===`scheduled`&&e.nextFireAt?`next ${e.nextFireAt}`:`—`;return`- ${e.id} [${e.status}] ${t} — ${e.label} (${n})`}).join(`
111
+ `)}async function Gd(e,t,n,r){if(t===`list`){let t=e.listSchedules();return{message:Wd(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:Ud,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:Ud,success:!1};let o=Vd(a,r);return o.ok?(await e.editSchedule(i,{cronExpression:o.spec.cronExpression,agentInstruction:o.spec.instruction,label:Hd(`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 Kd(e,t,n=Date.now()){let r=t.trim(),i=r.indexOf(` `),a=await Gd(e,(i===-1?r:r.slice(0,i)).toLowerCase(),i===-1?``:r.slice(i+1).trim(),n);if(a)return a;let o=Vd(t,n);if(!o.ok)return{message:`${o.error}\n${Ud}`,success:!1};let{cronExpression:s,instruction:c,recurring:l}=o.spec,u=await e.spawnScheduledWake({label:Hd(`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 qd(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 Jd(e,t){let n=qd(t);if(!n)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let r;try{r=await e.spawnMonitorWake({label:Hd(`Monitor`,n.instruction),command:n.command,matchPattern:n.matchPattern,agentInstruction:n.instruction})}catch(e){if(e instanceof _)return{message:e.message,success:!1};throw e}return{message:`Monitoring \`${n.command}\` for /${n.matchPattern}/ — task ${r.id}.`,success:!0,data:{taskId:r.id,matchPattern:n.matchPattern}}}function Yd(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function Xd(){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 Qd(){return{name:`loop`,displayName:`Repeat Prompt`,description:`Repeat a prompt on a fixed cadence or let each iteration choose its next delay; list or stop active loops.`,modelDescription:"Repeat a prompt on a fixed cadence (`<N><s|m|h|d> <prompt>`) or self-paced (`<prompt>`: each iteration chooses its next delay or stops). Use it when the user asks for recurring work in this session, and always give your own prompt: any form that would fall back to the host's default maintenance prompt — bare `/loop` or an interval alone (`<N><s|m|h|d>`) — needs a person to confirm it and is always refused for you, whether or not one is attached. `list` shows active loops; `stop <id>` ends one, even mid-turn. Returns the loop id and its next fire time, the loop list, or a refusal naming the command to suggest.",source:`schedule`,argumentHint:`[prompt] | <N><s|m|h|d> [prompt] | <prompt> every <N> <unit> | list | stop <id>`,modelInvocable:!0,subcommands:[{name:`list`,description:`List active loops`,source:`schedule`},{name:`stop`,description:`Stop an active loop`,source:`schedule`,argumentHint:`<id>`}]}}function $d(){let e=Xd();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)=>Kd(Yd(e),t)}}function ef(){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)=>Jd(Yd(e),t)}}function tf(e){let t=Qd();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)=>Id(Yd(t),(e,n)=>t.cancelBackgroundTask(e,n),n,e,{ui:t.getUserInteraction(),source:t.getCommandInvocationSource()})}}var nf=class{name=`schedule`;getCommands(){return[Xd(),Zd(),Qd()]}};function rf(e={}){return{name:`agent-command-schedule`,commandSources:[new nf],systemCommands:[$d(),ef(),tf(e)],sessionRequirements:[`runtime`]}}function af(e,t,n){return fn(e,t,n)}function Q(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function of(e){return e.toLocaleString(`en-US`)}const sf=`Conversation cleared.`;function cf(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 lf(e,t){let n=e.getUserInteraction();return n&&!w(await n.ask(x(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:(Me(e),{success:!0,message:sf})}function uf(e,t){let n=Et(t);return n===void 0?{success:!1,message:oe}:{success:!0,message:`Session renamed to "${n}".`,data:{name:n},hostActions:[ze(n)]}}function df(){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},uiIntents:[Ve()]}}function ff(e){return e.getCommandHostAdapters?.().costBudget}const pf=`Budget persistence is not available on this host (no cost-budget adapter was composed).`;function mf(e){return`Could not write the budget: ${e instanceof Error?e.message:String(e)}`}function hf(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?af(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 gf(e){let t=e.getSession(),n=Pt(e),r=t.getModelId(),i=hf(e.getSessionUsage(),r),a=[`Session: ${n.sessionId}`,`Messages: ${n.messageCount}`],o={sessionId:n.sessionId,messageCount:n.messageCount};if(i){a.push(`Tokens: ${of(i.inputTokens)} input / ${of(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=ff(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 _f(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=ff(e);if(i===void 0)return{success:!1,message:pf};if(t===`clear`){try{i.clear()}catch(e){return{success:!1,message:mf(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:pf};try{i.write({monthly:r})}catch(e){return{success:!1,message:mf(e)}}return{success:!0,message:`Monthly budget set to ${Q(r)}.`}}let{lines:r,data:i}=gf(e);return{success:!0,message:r.join(`
112
+ `),data:i}}function vf(e,t){let n=an(e);return{success:n.validation.ok,message:Qe(n),data:{logFile:n.logFile,entryCount:n.entryCount,issueCount:n.validation.issues.length,ok:n.validation.ok}}}function yf(){return{name:`clear`,displayName:`Clear History`,description:n,source:`session`,modelInvocable:!1,userInvocable:!0}}function bf(){return{name:`rename`,displayName:`Rename Session`,description:ae,argumentHint:`<name>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function xf(){return{name:`cd`,displayName:`Change Directory`,description:`Move this session to another working directory`,argumentHint:`<directory>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function Sf(){return{name:`resume`,displayName:`Resume Session`,description:se,source:`session`,modelInvocable:!1,userInvocable:!0}}function Cf(){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 wf(){return{name:`validate-session`,displayName:`Validate Session`,description:me,source:`session`,modelInvocable:!1,userInvocable:!0}}function Tf(){return k(yf(),{requiresPermission:!1,lifecycle:`inline`,execute:lf})}function Ef(){return k(bf(),{requiresPermission:!1,lifecycle:`inline`,execute:uf})}function Df(){return k(xf(),{requiresPermission:!1,lifecycle:`inline`,execute:cf})}function Of(){return k(Sf(),{requiresPermission:!1,lifecycle:`inline`,execute:df})}function kf(){return k(Cf(),{requiresPermission:!1,lifecycle:`inline`,execute:_f})}function Af(){return k(wf(),{requiresPermission:!1,lifecycle:`inline`,execute:vf})}var jf=class{name=`session`;getCommands(){return[yf(),bf(),xf(),Sf(),Cf(),wf()]}};function Mf(){return{name:`agent-command-session`,commandSources:[new jf],systemCommands:[Tf(),Ef(),Df(),Of(),kf(),Af()]}}function Nf(){return{name:`settings`,displayName:`Settings`,description:`Open settings — language, output style, preset, permissions and more`,source:`settings`,modelInvocable:!1}}function Pf(){let e=Nf();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 Ff=class{name=`settings`;getCommands(){return[Nf()]}};function If(){return{name:`agent-command-settings`,commandSources:[new Ff],systemCommands:[Pf()]}}function Lf(e){let t=mn({executable:e});return{command:t.command,interactiveArgs:t.interactiveArgs,commandArgs:e=>t.commandArgs(e)}}const Rf="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function zf(e,t,n){if(!e.canHandoffTerminal())return{message:`An interactive shell is unavailable here (no interactive terminal).`,success:!1};let r=Lf(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 Bf(){return{name:`shell`,displayName:`Shell`,description:Rf,source:`shell`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function Vf(e){let t=Bf();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)=>zf(t,n,e)}}var Hf=class{name=`shell`;getCommands(){return[Bf()]}};function Uf(e){return{name:`agent-command-shell`,commandSources:[new Hf],systemCommands:[Vf(e)]}}function Wf(){return{name:`skill-read`,description:`Read a supporting file from a skill active in this execution`,modelDescription:`Read verified supporting bytes from a skill already activated in this execution. Use when its instructions refer to a resource in the returned manifest. Args are a JSON array ["<skill-name>", "<resource-uri>"]. Returns the verified URI, digest, size and text or base64 blob with optional MIME type. This does not activate nested skills or grant consent; unactivated skills, undeclared resources and ended executions are refused. Binary blobs are returned as encoded data, not a rendered image.`,argumentHint:`["<skill-name>", "<resource-uri>"]`,source:`skills`,userInvocable:!0,modelInvocable:!0,safety:`read-only`}}async function Gf(e,t=``){let n;try{n=JSON.parse(t)}catch{return{success:!1,message:`Use /skill-read ["<skill-name>", "<resource-uri>"]`}}if(!Array.isArray(n)||n.length!==2||n.some(e=>typeof e!=`string`||!e.length))return{success:!1,message:`Use /skill-read ["<skill-name>", "<resource-uri>"]`};if(!e.readSkillResource)return{success:!1,message:`This host does not provide active skill resource reads.`};try{let t=await e.readSkillResource(n[0],n[1]);return{success:!0,message:`Read verified skill resource: ${t.uri}`,data:{...t}}}catch(e){return{success:!1,message:`Skill resource read refused: ${e instanceof Error?e.message:`host refused the read`}`}}}function Kf(){return{...Wf(),semanticRole:`skillResourceRead`,requiresPermission:!1,lifecycle:`inline`,execute:Gf}}const qf=`List registered skills, or activate one by name`;function Jf(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 Yf(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${Jf(e)}`}function Xf(e){return e.length===0?[`No skills are registered for this session.`,``,`Skills are metadata until activated. Do not invent or imitate a skill workflow when no matching registered skill exists.`].join(`
113
+ `):[`Registered skills:`,...e.map(Yf),``,`Activation contract:`,`- Use /skills <skill-name> [args] to activate a matching skill.`,`- Treat /<skill-name> as a virtual alias for /skills <skill-name>.`,`- The system prompt Skills section is skill selection metadata.`,`- Treat descriptions as selection metadata only, not as loaded SKILL.md content.`,`- Do not answer by merely naming, recommending, or imitating a matching skill.`,`- If no listed skill matches the task, continue without claiming a skill was activated.`].join(`
114
+ `)}function Zf(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 Qf(e,t=``){let n=Zf(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:Xf(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function $f(){return{name:`skills`,displayName:`Skills`,description:qf,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 ep(){let e=$f();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:Qf}}var tp=class{name=`skills`;getCommands(){return[$f(),Wf()]}};function np(e){let t=[new tp];return t.push(new pe(e.contributionSources,e.skillRoots??[])),{name:`agent-command-skills`,commandSources:t,systemCommands:[ep(),Kf()]}}const rp=[`Usage: /statusline on | off | reset | git on | git off`,`Fields: model, context, permission mode, message count, session name, thinking state, git branch.`].join(`
115
+ `);function ip(e){let t=e.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[n,r]=t;return n===`on`&&r===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:n===`off`&&r===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:n===`reset`&&r===void 0?{success:!0,message:`Status line settings reset.`,patch:{...o}}:n===`git`&&r===`on`&&t.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:n===`git`&&r===`off`&&t.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:rp}}function ap(e,t){let n=ip(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function op(){return{name:`statusline`,displayName:`Status Line`,description:de,source:`statusline`,argumentHint:ue,subcommands:Oe(`statusline`),modelInvocable:!1}}function sp(){let e=op();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:ap}}var cp=class{name=`statusline`;getCommands(){return[op()]}};function lp(){return{name:`agent-command-statusline`,commandSources:[new cp],systemCommands:[sp()]}}const up=`list | <theme-id> | syntax on|off | motion on|off`;function $(e){return e?`on`:`off`}function dp(e){let{settings:t,reducedMotionPin:n}=e.getAppearance(),r=e.listThemes().map(e=>`${e.id===t.theme?`* `:` `}${e.id} — ${e.name} (${e.appearance}, ${e.source})`),i=n?`${$(n.reducedMotion)} for this run (pinned by ${n.tier}; saved ${$(t.reducedMotion)})`:$(t.reducedMotion);return[`Available themes:`,...r,``,`syntax highlighting: ${$(t.syntaxHighlighting)}`,`reduced motion: ${i}`].join(`
116
+ `)}function fp(e){return{success:!0,message:dp(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function pp(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function mp(e){if(e===`on`)return!0;if(e===`off`)return!1}function hp(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=mp(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${up}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function gp(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 _p(e,t){if(!e)return{success:!1,message:`Themes are available in an interactive terminal. Run /theme there.`};let n=t.trim().split(/\s+/u).filter(Boolean);if(n.length===0)return{success:!0,message:`Opening the theme picker...`,uiIntents:[{type:`show-theme-picker`}]};if(n.length===1&&n[0]===`list`)return fp(e);let r=hp(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${up}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return pp(r.themeId,e);i.theme=a.id}return{success:!0,message:gp(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function vp(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:up,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var yp=class{name=`theme`;getCommands(){return[vp()]}};function bp(e){let t=vp(),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)=>_p(e,n)};return{name:`agent-command-theme`,commandSources:[new yp],systemCommands:[n]}}const xp=`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 wp(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
117
+ `)}function Tp(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function Ep(e,t,n){let r=await yt({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):wp(r.items),success:!0,data:{list:r}}}async function Dp(e,t,n){let[r,i,a]=n.positional,o=await Qt({activeRepositoryRoot:e,storageRoot:t,category:Tp(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 Op(e,t,n){let[r,i]=n.positional,a=await st({activeRepositoryRoot:e,storageRoot:t,category:Tp(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 kp(e,t,n){let[r,i]=n.positional,a=await We({activeRepositoryRoot:e,storageRoot:t,category:Tp(r),key:i??``});return{message:`Disabled user-local memory item ${a.category}/${a.key}`,success:!0,data:{item:a}}}async function Ap(e,t,n){let[r,i]=n.positional,a=await Ue({activeRepositoryRoot:e,storageRoot:t,category:Tp(r),key:i??``});return{message:`Deleted user-local memory item ${a.category}/${a.key}`,success:!0,data:{result:a}}}async function jp(e,t,n){return(n.action??`list`)===`list`?Ep(e,t,n):n.action===`set`?Dp(e,t,n):n.action===`inspect`?Op(e,t,n):n.action===`disable`?kp(e,t,n):n.action===`delete`?Ap(e,t,n):{message:Cp,success:!1}}function Mp(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Np(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 Pp(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=Np(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:Mp(n),summary:r,source:i}}function Fp(e){return e.trim().split(/\s+/).filter(Boolean)}function Ip(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
118
+ `)}async function Lp(e,t,n){if((n.action??`list`)!==`list`)return{message:Cp,success:!1};let r=await ct({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):Ip(r.root,r.categories),success:!0,data:{root:r.root,categories:r.categories,inspection:r}}}async function Rp(e,t,n){return n.target===`storage`?Lp(e,t,n):n.target===`memory`?jp(e,t,n):{message:Cp,success:!1}}function zp(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Bp(e){try{return await Rp(e.cwd,e.storageRoot,Pp(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:zp(e instanceof Error?e.message:String(e)),success:!1}}}async function Vp(e,t,n){try{return await Rp(e.getCwd(),n,Pp(Fp(t)))}catch(e){return{message:zp(e instanceof Error?e.message:String(e)),success:!1}}}function Hp(){return{name:`user-local`,displayName:`User Config`,description:xp,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 Up(e){let t=Hp();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)=>Vp(t,n,e)}}var Wp=class{name=`user-local`;getCommands(){return[Hp()]}};function Gp(e){return{name:`agent-command-user-local`,commandSources:[new Wp],systemCommands:[Up(e)]}}function Kp(e,t,n){return Yt(e,t,n)}function qp({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 _=[np({contributionSources:r??[],skillRoots:i}),Lo(),pr(),za(),Da(),Zc(),Xs(),_c(),Fl(),Ec(),qo(),yr(),eo(p),wo(),rl(),Uf(),ba(n),_o(),Vo(c),bp(l),...d===void 0?[]:[pa(d,void 0,f)],Vs(),Es(),Gp(t),Tr(),Xr(),Wa(),Mf(),rd(),Sd(),rf(m),lp(),Cl(),If(),qc(),Pc(),Mo(),Qu(),...u===void 0?[]:[oi(u)],Ru({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s}}),cc({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s}})],v=_.map(e=>e.name);return{modules:Kp(_,h,g),unknownModuleNames:qe(v,h,g)}}function Jp(e){let{shellExecutable:t,editorTemporaryDirectoryPrefix:n,keybindingsFile:r,themeCatalogue:i,enabledCommandModules:a,disabledCommandModules:o}=e,s=[[Uf(t),(e,n)=>zf(e,n,t)],[ba(n),(e,t)=>ga(e,t,n)],[Vo(r),e=>zo(r,e)],[bp(i),(e,t)=>_p(i,t)]],c=new Set(Yt(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{xa as ADVISOR_SETTING_KEY,Ea as AdvisorCommandSource,fr as AgentCommandSource,vr as BackgroundCommandSource,sf as CLEAR_COMMAND_MESSAGE,wr as CompactCommandSource,Yr as ContextCommandSource,la as DoctorCommandSource,ha as EDITOR_COMMAND_DESCRIPTION,ya as EditorCommandSource,Ra as EffortCommandSource,Ua as ExitCommandSource,vo as GOAL_COMMAND_DESCRIPTION,go as GitCommandSource,Co as GoalCommandSource,jo as HandoffCommandSource,Io as HelpCommandSource,Bo as KeybindingsCommandSource,Ko as LanguageCommandSource,Ts as MCPActivationCommandSource,Bs as MemoryCommandSource,Ys as ModeCommandSource,sc as ModelCommandSource,Tc as OutputStyleCommandSource,Xc as PermissionsCommandSource,Sl as PluginManagerCommandSource,Pl as PresetCommandSource,Iu as ProviderCommandSource,Zu as RemoteControlCommandSource,xd as RewindCommandSource,V as SANDBOX_MODES,Rf as SHELL_COMMAND_DESCRIPTION,qf as SKILLS_COMMAND_DESCRIPTION,rp as STATUSLINE_USAGE,Vi as STORAGE_REPAIR_ID,gc as SandboxCommandSource,nf as ScheduleCommandSource,jf as SessionCommandSource,Ff as SettingsCommandSource,Hf as ShellCommandSource,tp as SkillsCommandSource,cp as StatusLineCommandSource,yp as ThemeCommandSource,Sp as USER_LOCAL_COMMAND_ARGUMENT_HINT,xp as USER_LOCAL_COMMAND_DESCRIPTION,Cp as USER_LOCAL_COMMAND_USAGE,Wp as UserLocalCommandSource,qi as applyDoctorRepair,aa as buildDoctorReport,Ci as collectSettingsSecrets,wa as createAdvisorCommandEntry,Da as createAdvisorCommandModule,ur as createAgentCommandEntry,pr as createAgentCommandModule,dr as createAgentSystemCommand,gr as createBackgroundCommandEntry,yr as createBackgroundCommandModule,yf as createClearCommandEntry,Sr as createCompactCommandEntry,Tr as createCompactCommandModule,qr as createContextCommandEntry,Xr as createContextCommandModule,Cf as createCostCommandEntry,qp as createDefaultCommandModules,oi as createDevicesCommandModule,ca as createDoctorCommandEntry,pa as createDoctorCommandModule,_a as createEditorCommandEntry,ba as createEditorCommandModule,Ia as createEffortCommandEntry,za as createEffortCommandModule,Va as createExitCommandEntry,Wa as createExitCommandModule,po as createGitCommandEntry,_o as createGitCommandModule,Ie as createGitProcess,xo as createGoalCommandEntry,wo as createGoalCommandModule,ko as createHandoffCommandEntry,Mo as createHandoffCommandModule,Po as createHelpCommandEntry,Lo as createHelpCommandModule,Ro as createKeybindingsCommandEntry,Vo as createKeybindingsCommandModule,Wo as createLanguageCommandEntry,qo as createLanguageCommandModule,Qd as createLoopCommandEntry,Ss as createMCPActivationCommandEntry,Es as createMCPActivationCommandModule,Rs as createMemoryCommandEntry,Vs as createMemoryCommandModule,qs as createModeCommandEntry,Xs as createModeCommandModule,ac as createModelCommandEntry,cc as createModelCommandModule,Zd as createMonitorCommandEntry,di as createNodeDoctorDeps,Cc as createOutputStyleCommandEntry,Ec as createOutputStyleCommandModule,Jc as createPermissionsCommandEntry,Zc as createPermissionsCommandModule,rl as createPlanCommandModule,vl as createPluginCommandEntry,Cl as createPluginCommandModule,Ml as createPresetCommandEntry,Fl as createPresetCommandModule,Fu as createProviderCommandEntry,Ru as createProviderCommandModule,Il as createProviderSetupFlow,yl as createReloadPluginsCommandEntry,Yu as createRemoteControlCommandEntry,Qu as createRemoteControlCommandModule,bf as createRenameCommandEntry,ed as createResetCommandEntry,rd as createResetCommandModule,Sf as createResumeCommandEntry,Sd as createRewindCommandModule,_c as createSandboxCommandModule,Xd as createScheduleCommandEntry,rf as createScheduleCommandModule,Mf as createSessionCommandModule,Nf as createSettingsCommandEntry,If as createSettingsCommandModule,Bf as createShellCommandEntry,Uf as createShellCommandModule,$f as createSkillsCommandEntry,np as createSkillsCommandModule,op as createStatusLineCommandEntry,lp as createStatusLineCommandModule,Jp as createTerminalClientCommands,vp as createThemeCommandEntry,bp as createThemeCommandModule,Hp as createUserLocalCommandEntry,Gp as createUserLocalCommandModule,wf as createValidateSessionCommandEntry,Hi as doctorRepairAllowlist,Vu as ensureProviderConfig,Ca as executeAdvisorCommand,or as executeAgentCommand,hr as executeBackgroundCommand,lf as executeClearCommand,xr as executeCompactCommand,Rr as executeContextCommand,_f as executeCostCommand,ga as executeEditorCommand,Pa as executeEffortCommand,Ba as executeExitCommand,mo as executeGitCommand,bo as executeGoalCommand,Do as executeHandoffCommand,No as executeHelpCommand,Uo as executeLanguageCommand,Id as executeLoopCommand,ds as executeMCPActivationCommand,Ls as executeMemoryCommand,Ks as executeModeCommand,$s as executeModelCommand,Jd as executeMonitorCommand,Sc as executeOutputStyleCommand,Ws as executePermissionsCommand,gl as executePluginCommand,Al as executePresetCommand,Ou as executeProviderCommand,_l as executeReloadPluginsCommand,Ju as executeRemoteControlCommand,uf as executeRenameCommand,$u as executeResetCommand,df as executeResumeCommand,vd as executeRewindCommand,fc as executeSandboxCommand,Kd as executeScheduleCommand,zf as executeShellCommand,Qf as executeSkillsCommand,ap as executeStatusLineCommand,_p as executeThemeCommand,Vp as executeUserLocalCommand,Bp as executeUserLocalDirectCommand,vf as executeValidateSessionCommand,Wl as formatProviderSetupChoiceLabel,Gl as formatProviderSetupHelpLinks,Hl as formatProviderSetupPromptLabel,Ll as formatProviderSetupSelectionPrompt,uc as formatSandboxStatus,zl as getProviderSetupStep,nt as gitEnvironment,Ui as isDoctorRepairId,Qo as mcpUnavailableServersNotice,Jo as mcpUserActionCommand,Zo as mcpUserActionNotice,Vd as parseScheduleSpec,Ki as planDoctorRepair,xi as redactDiagnosticText,hi as renderDoctorReport,ui as resolveCommandOnPath,ma as resolveEditor,Rl as resolveProviderSetupSelection,Lf as resolveShell,sa as runDoctor,Vl as runProviderSetupPromptFlow,Bu as runProviderStartupSetup,N as spawnInherited,Bl as submitProviderSetupValue,ql as validateProviderSetupValue};
117
119
  //# sourceMappingURL=index.js.map