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

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 (64) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +71 -62
  3. package/dist/node/index.cjs +75 -72
  4. package/dist/node/index.d.cts +37 -45
  5. package/dist/node/index.d.cts.map +1 -1
  6. package/dist/node/index.d.ts +37 -45
  7. package/dist/node/index.d.ts.map +1 -1
  8. package/dist/node/index.js +78 -75
  9. package/dist/node/index.js.map +1 -1
  10. package/package.json +9 -8
  11. package/src/agent/__tests__/agent-command.test.ts +62 -0
  12. package/src/agent/agent-command-parser.ts +2 -2
  13. package/src/agent/agent-command.ts +20 -0
  14. package/src/default/__tests__/__snapshots__/model-exposure.test.ts.snap +2 -2
  15. package/src/default/__tests__/default-command-modules.test.ts +5 -4
  16. package/src/default/__tests__/model-exposure.test.ts +2 -0
  17. package/src/default/default-command-modules.ts +8 -0
  18. package/src/doctor/__tests__/doctor-fixture.ts +1 -0
  19. package/src/doctor/__tests__/doctor-runner.test.ts +26 -6
  20. package/src/doctor/doctor-extensions-probe.ts +36 -12
  21. package/src/effort/effort-command.test.ts +65 -2
  22. package/src/effort/effort-command.ts +19 -5
  23. package/src/git/__tests__/fake-git-port.ts +9 -2
  24. package/src/git/git-command-module.ts +3 -4
  25. package/src/git/git-commit.ts +6 -3
  26. package/src/git/index.ts +4 -1
  27. package/src/goal/goal-command.ts +3 -1
  28. package/src/index.ts +6 -0
  29. package/src/mcp-activation/__tests__/mcp-activation-command.test.ts +225 -1
  30. package/src/mcp-activation/mcp-activation-command-module.ts +6 -0
  31. package/src/mcp-activation/mcp-activation-command.ts +77 -2
  32. package/src/memory/__tests__/memory-command-module.test.ts +40 -2
  33. package/src/memory/__tests__/memory-command-unavailable.test.ts +63 -0
  34. package/src/memory/memory-command-module.ts +4 -2
  35. package/src/memory/memory-command.ts +42 -2
  36. package/src/mode/__tests__/mode-command-module.test.ts +40 -0
  37. package/src/mode/mode-command.ts +1 -1
  38. package/src/model/__tests__/model-command-module.test.ts +80 -0
  39. package/src/model/__tests__/model-command.test.ts +240 -0
  40. package/src/model/index.ts +6 -0
  41. package/src/model/model-command-module.ts +56 -0
  42. package/src/model/model-command.ts +223 -0
  43. package/src/plugin/__tests__/plugin-command-module.test.ts +84 -3
  44. package/src/plugin/plugin-command.ts +50 -8
  45. package/src/provider/__tests__/org-policy.test.ts +4 -0
  46. package/src/provider/__tests__/provider-command-module.test.ts +276 -14
  47. package/src/provider/__tests__/scripted-interaction.ts +12 -2
  48. package/src/provider/provider-command-execution.ts +54 -8
  49. package/src/provider/provider-command-profile-lifecycle.ts +48 -2
  50. package/src/provider/provider-command-profile-operations.ts +14 -0
  51. package/src/provider/provider-command-profile.ts +7 -4
  52. package/src/provider/provider-command-setup.ts +14 -1
  53. package/src/rewind/__tests__/rewind-command-module.test.ts +2 -1
  54. package/src/schedule/__tests__/loop-command-functional.test.ts +13 -0
  55. package/src/schedule/__tests__/loop-command.test.ts +238 -4
  56. package/src/schedule/loop-command.ts +95 -3
  57. package/src/schedule/schedule-command-module.ts +8 -4
  58. package/src/settings/settings-command-module.ts +2 -2
  59. package/src/git/__tests__/git-diff.test.ts +0 -125
  60. package/src/git/__tests__/git-process.test.ts +0 -221
  61. package/src/git/__tests__/git-status.test.ts +0 -117
  62. package/src/git/git-diff.ts +0 -129
  63. package/src/git/git-process.ts +0 -169
  64. package/src/git/git-status.ts +0 -134
@@ -1,72 +1,73 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@robota-sdk/agent-framework"),t=require("@robota-sdk/agent-core"),n=require("node:fs"),r=require("node:net"),i=require("node:path"),a=require("@robota-sdk/agent-core/node"),o=require("node:os"),s=require("node:child_process"),c=require("@robota-sdk/agent-preset"),l=require("node:crypto");const u=`general-purpose`;function d(e){let t=[],n=``,r,i=!1;for(let a of e){if(i){n+=a,i=!1;continue}if(r&&a===`\\`){i=!0;continue}if(r){a===r?r=void 0:n+=a;continue}if(a===`"`||a===`'`){r=a;continue}if(/\s/.test(a)){n.length>0&&(t.push(n),n=``);continue}n+=a}return n.length>0&&t.push(n),t}function f(e){let t=[],n,r,i;for(let a=0;a<e.length;a+=1){let o=e[a];if(o!==`--background`){if(o===`--agent`||o===`--type`||o===`-a`){n=e[a+1],a+=1;continue}if(o===`--model`){r=e[a+1],a+=1;continue}if(o===`--isolation`){let t=e[a+1];(t===`none`||t===`worktree`)&&(i=t),a+=1;continue}o!==void 0&&t.push(o)}}return{positional:t,...n?{agentType:n}:{},...r?{model:r}:{},...i?{isolation:i}:{}}}function p(e,t,n,r){return{agentType:t,label:n,mode:`background`,prompt:r,...e.model?{model:e.model}:{},...e.isolation?{isolation:e.isolation}:{}}}function m(e,t){let n=f(e),[r,...i]=n.positional,a=n.agentType??u,o=n.positional;!n.agentType&&r&&t.has(r)&&(a=r,o=i);let s=o.join(` `).trim();if(s)return p(n,a,a,s)}function h(e,t){let n=f(e);return n.positional.map(e=>g(e,n,t)).filter(e=>e!==void 0)}function g(e,t,n){let r=e.indexOf(`=`);if(r>0)return _(e.slice(0,r),e.slice(r+1),t,n);let i=e.indexOf(`:`);if(i<=0||i===e.length-1)return;let a=e.slice(0,i),o=e.slice(i+1);return p(t,t.agentType??(n.has(a)?a:u),a,o)}function _(e,t,n,r){let i=t.indexOf(`:`);if(i===-1)return p(n,n.agentType??(r.has(e)?e:u),e,t);if(i!==0&&i!==t.length-1)return p(n,t.slice(0,i),e,t.slice(i+1))}function v(e){return e instanceof Error?e.message:String(e)}function ee(e){return new Set(e.listAgentDefinitions().map(e=>e.name))}function y(e,t){let n=e.listAgentDefinitions();if(!n.some(e=>e.name===t))return{message:`Unknown agent type: ${t}\nAvailable agents: ${n.map(e=>e.name).join(`, `)}`,success:!1}}async function b(e,t){let n=y(e,t.agentType);if(n)return n;try{return{state:await e.spawnAgentJob(t)}}catch(e){return{message:v(e),success:!1}}}function te(){return{message:``,uiIntents:[{type:`show-agent-switcher`}],success:!0}}async function ne(e){let t=e.listAgentDefinitions(),n=e.listAgentJobs();return{message:[`Available agents:`,...t.map(e=>` ${e.name} - ${e.description}`),``,n.length===0?`No active agent jobs.`:`Agent jobs:`,...n.map(e=>` ${re(e)}`)].join(`
2
- `),success:!0,data:{agents:t.length,jobs:n.length}}}function re(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 ie(e,t){let n=m(t,ee(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await b(e,n);if(`success`in r)return r;let{state:i}=r;return{message:`Started agent job: ${i.id}`,success:!0,data:{agentId:i.id,status:i.status}}}async function ae(t,n){let r=n.includes(`--wait`)||!n.includes(`--detach`),i=h(n.filter(e=>e!==`--wait`&&e!==`--detach`),ee(t));if(i.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let a=i.map(e=>y(t,e.agentType)).find(e=>e!==void 0);if(a)return a;let o;try{o=await Promise.all(i.map(e=>t.spawnAgentJob(e)))}catch(e){return{message:v(e),success:!1}}let s=t.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:o.map(e=>e.id),label:`agent parallel`});if(r){let n=(0,e.summarizeBackgroundJobGroup)(await t.waitBackgroundJobGroup(s.id));return{message:fe(n),success:!0,data:{agentIds:o.map(e=>e.id),groupId:s.id,summary:n}}}return{message:[`Started agent jobs:`,...o.map(e=>`${e.label}: ${e.id}`)].join(`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@robota-sdk/agent-framework"),t=require("@robota-sdk/agent-core"),n=require("node:fs"),r=require("node:net"),i=require("node:path"),a=require("@robota-sdk/agent-core/node"),o=require("node:os"),s=require("node:child_process"),c=require("@robota-sdk/agent-preset"),l=require("node:crypto");function u(e){let t=[],n=``,r,i=!1;for(let a of e){if(i){n+=a,i=!1;continue}if(r&&a===`\\`){i=!0;continue}if(r){a===r?r=void 0:n+=a;continue}if(a===`"`||a===`'`){r=a;continue}if(/\s/.test(a)){n.length>0&&(t.push(n),n=``);continue}n+=a}return n.length>0&&t.push(n),t}function d(e){let t=[],n,r,i;for(let a=0;a<e.length;a+=1){let o=e[a];if(o!==`--background`){if(o===`--agent`||o===`--type`||o===`-a`){n=e[a+1],a+=1;continue}if(o===`--model`){r=e[a+1],a+=1;continue}if(o===`--isolation`){let t=e[a+1];(t===`none`||t===`worktree`)&&(i=t),a+=1;continue}o!==void 0&&t.push(o)}}return{positional:t,...n?{agentType:n}:{},...r?{model:r}:{},...i?{isolation:i}:{}}}function f(e,t,n,r){return{agentType:t,label:n,mode:`background`,prompt:r,...e.model?{model:e.model}:{},...e.isolation?{isolation:e.isolation}:{}}}function p(t,n){let r=d(t),[i,...a]=r.positional,o=r.agentType??e.DEFAULT_AGENT_TYPE,s=r.positional;!r.agentType&&i&&n.has(i)&&(o=i,s=a);let c=s.join(` `).trim();if(c)return f(r,o,o,c)}function m(e,t){let n=d(e);return n.positional.map(e=>h(e,n,t)).filter(e=>e!==void 0)}function h(t,n,r){let i=t.indexOf(`=`);if(i>0)return g(t.slice(0,i),t.slice(i+1),n,r);let a=t.indexOf(`:`);if(a<=0||a===t.length-1)return;let o=t.slice(0,a),s=t.slice(a+1);return f(n,n.agentType??(r.has(o)?o:e.DEFAULT_AGENT_TYPE),o,s)}function g(t,n,r,i){let a=n.indexOf(`:`);if(a===-1)return f(r,r.agentType??(i.has(t)?t:e.DEFAULT_AGENT_TYPE),t,n);if(a!==0&&a!==n.length-1)return f(r,n.slice(0,a),t,n.slice(a+1))}function _(e){return e instanceof Error?e.message:String(e)}function v(e){return new Set(e.listAgentDefinitions().map(e=>e.name))}function ee(e,t){let n=e.listAgentDefinitions();if(!n.some(e=>e.name===t))return{message:`Unknown agent type: ${t}\nAvailable agents: ${n.map(e=>e.name).join(`, `)}`,success:!1}}async function y(e,t){let n=ee(e,t.agentType);if(n)return n;try{return{state:await e.spawnAgentJob(t)}}catch(e){return{message:_(e),success:!1}}}function b(){return{message:``,uiIntents:[{type:`show-agent-switcher`}],success:!0}}function te(e,t){return e.setDefaultAgentType(t),{message:`Default agent: ${t}`,success:!0,data:{agentType:t}}}async function ne(e){let t=e.listAgentDefinitions(),n=e.listAgentJobs();return{message:[`Available agents:`,...t.map(e=>` ${e.name} - ${e.description}`),``,n.length===0?`No active agent jobs.`:`Agent jobs:`,...n.map(e=>` ${re(e)}`)].join(`
2
+ `),success:!0,data:{agents:t.length,jobs:n.length}}}function re(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 ie(e,t){let n=p(t,v(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await y(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 ae(t,n){let r=n.includes(`--wait`)||!n.includes(`--detach`),i=m(n.filter(e=>e!==`--wait`&&e!==`--detach`),v(t));if(i.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let a=i.map(e=>ee(t,e.agentType)).find(e=>e!==void 0);if(a)return a;let o;try{o=await Promise.all(i.map(e=>t.spawnAgentJob(e)))}catch(e){return{message:_(e),success:!1}}let s=t.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:o.map(e=>e.id),label:`agent parallel`});if(r){let n=(0,e.summarizeBackgroundJobGroup)(await t.waitBackgroundJobGroup(s.id));return{message:fe(n),success:!0,data:{agentIds:o.map(e=>e.id),groupId:s.id,summary:n}}}return{message:[`Started agent jobs:`,...o.map(e=>`${e.label}: ${e.id}`)].join(`
3
3
  `),success:!0,data:{agentIds:o.map(e=>e.id),groupId:s.id}}}async function oe(t,n){let[r]=n;if(!r)return{message:`Usage: agent wait GROUP_ID`,success:!1};let i=(0,e.summarizeBackgroundJobGroup)(await t.waitBackgroundJobGroup(r));return{message:fe(i),success:!0,data:{groupId:r,summary:i}}}async function se(e,t){let[n,r]=t;if(!n)return{message:`Usage: agent read AGENT_ID [OFFSET]`,success:!1};let i=r?{offset:Number.parseInt(r,10)}:void 0,a=await e.readBackgroundTaskLog(n,i),o=a.nextCursor?`\nNext offset: ${a.nextCursor.offset}`:``;return{message:a.lines.length>0?`${a.lines.join(`
4
- `)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function ce(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 le(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 ue(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 de(e,t){try{if(t.trim()===``)return te();let[n=`list`,...r]=d(t);return n===`list`&&r.length===0?ne(e):n===`run`?ie(e,r):n===`parallel`?ae(e,r):n===`wait`?oe(e,r):n===`read`||n===`open`?se(e,r):n===`send`?ce(e,r):n===`stop`||n===`cancel`?le(e,r):n===`close`?ue(e,r):ie(e,[n,...r])}catch(e){return{message:v(e),success:!1}}}function fe(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(`
4
+ `)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function ce(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 le(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 ue(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 de(e,t){try{if(t.trim()===``)return b();let[n=`list`,...r]=u(t);return n===`list`&&r.length===0?ne(e):n===`run`?ie(e,r):n===`parallel`?ae(e,r):n===`wait`?oe(e,r):n===`read`||n===`open`?se(e,r):n===`send`?ce(e,r):n===`stop`||n===`cancel`?le(e,r):n===`close`?ue(e,r):r.length===0&&v(e).has(n)?te(e,n):ie(e,[n,...r])}catch(e){return{message:_(e),success:!1}}}function fe(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
5
  `)}function pe(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function me(){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 he(){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:me()}}function ge(){let e=he();return{name:e.name,semanticRole:`subagentSpawn`,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>de(pe(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 _e=class{name=`agent`;getCommands(){return[he()]}};function ve(){return{name:`agent-command-agent`,commandSources:[new _e],systemCommands:[ge()],sessionRequirements:[`agent-runtime`]}}function ye(e){return e.trim().split(/\s+/).filter(Boolean)}async function be(t,n){let[r=`list`,i,...a]=ye(n);if(r===`list`){let n=(0,e.listCommandBackgroundTasks)(t);return{message:(0,e.formatCommandBackgroundTaskList)(n),success:!0,data:{count:n.length}}}if(!i)return{message:e.BACKGROUND_COMMAND_USAGE,success:!1};if(r===`read`||r===`log`||r===`open`){let n=await(0,e.readCommandBackgroundTaskLog)(t,i,(0,e.parseCommandBackgroundLogCursor)(a[0])),r=n.nextCursor?`\nNext offset: ${n.nextCursor.offset}`:``;return{message:n.lines.length>0?`${n.lines.join(`
6
6
  `)}${r}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:n.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await(0,e.cancelCommandBackgroundTask)(t,i,a.join(` `)||void 0),{message:`Background task cancelled: ${i}`,success:!0,data:{taskId:i}}):r===`close`||r===`dismiss`?(await(0,e.closeCommandBackgroundTask)(t,i),{message:`Background task closed: ${i}`,success:!0,data:{taskId:i}}):{message:`Unknown background action: ${r}`,success:!1}}function xe(){return{name:`background`,displayName:`Background Tasks`,description:e.BACKGROUND_COMMAND_DESCRIPTION,source:`background`,modelInvocable:!1,subcommands:(0,e.buildBackgroundCommandSubcommands)()}}function Se(){let e=xe();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,subcommands:e.subcommands,execute:be}}var Ce=class{name=`background`;getCommands(){return[xe()]}};function we(){return{name:`agent-command-background`,commandSources:[new Ce],systemCommands:[Se()]}}function Te(e){let t=e.trim();return t.length>0?t:void 0}async function Ee(t,n){let{before:r,after:i,beforeMessageCount:a,afterMessageCount:o}=await(0,e.compactCommandContext)(t,Te(n)),s=a-o;return{message:[`Context compacted.`,` Removed messages: ${s} (${a>0?Math.round(s/a*100):0}% of total)`,` Context: ${Math.round(r.usedPercentage)}% → ${Math.round(i.usedPercentage)}%`].join(`
7
- `),success:!0,data:{before:r,after:i,beforeMessageCount:a,afterMessageCount:o}}}function De(){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 Oe(){let e=De();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:Ee}}var ke=class{name=`compact`;getCommands(){return[De()]}};function Ae(){return{name:`agent-command-compact`,commandSources:[new ke],systemCommands:[Oe()]}}function x(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function je(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${x(e)} (${t})`}function S(e){return Math.ceil(e/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN)}function C(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${S(e.byteLength).toLocaleString()} tokens`].join(` `)}function Me(e){try{return JSON.parse(e)}catch{return null}}function Ne(e){let t=Me(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 Pe(e){let n=0,r=0,i=0,a=0,o=0,s=0,c=0;for(let l of e){let e=Math.ceil(JSON.stringify(l).length/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN);l.role===`system`?n+=e:l.role===`user`?(r+=e,i++):l.role===`assistant`?(a+=e,o++):l.role===`tool`&&(s+=e,c++)}return{systemTokens:n,userTokens:r,userCount:i,assistantTokens:a,assistantCount:o,toolTokens:s,toolCallCount:c,totalTokens:n+r+a+s}}function Fe(e){return Le(e.filter(e=>e.category===`chat`).map(e=>({type:e.type,data:e.data})))}function Ie(e){return Le(e.map(e=>({type:e.role,data:e})))}function Le(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:Ne(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 w(e,t,n){let r=`${e}${t>0?` — ~${t.toLocaleString()} tokens`:``}:`;return n.length===0?`${r}\n (none)`:[r,...n.map(e=>` ${e}`)].join(`
8
- `)}function Re(n){let r=(0,e.readCommandContextState)(n),i=(0,e.readAutoCompactThreshold)(n),a=(0,e.readAutoCompactThresholdSource)(n),o=n.getSession().getHistory(),s=Pe(o),c=n.getSession().getOfferedToolSchemas(),l=(0,t.estimateToolSchemaTokens)(c),u=Ie(o),d=(0,e.listCommandContextReferences)(n),f=d.filter(e=>e.loadType===`system`),p=d.filter(e=>e.loadType===`manual`),m=d.filter(e=>e.loadType===`prompt-reference`),h=f.reduce((e,t)=>e+S(t.byteLength),0),g=p.reduce((e,t)=>e+S(t.byteLength),0),_=m.reduce((e,t)=>e+S(t.byteLength),0),v=u.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${u.turnCount} turn${u.turnCount===1?``:`s`} | ~${s.totalTokens.toLocaleString()} tokens`,ee=u.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),y=u.toolResults.length,b=u.totalToolCallCount,te=b===0?`Tool results (0): (none)`:y<b?`Tool results (${y} unique / ${b} calls, ~${s.toolTokens.toLocaleString()} tokens):`:`Tool results (${y}, ~${s.toolTokens.toLocaleString()} tokens):`,ne=u.turnCount===0?[]:[`User (${s.userCount}): ~${s.userTokens.toLocaleString()} tokens`,`Assistant (${s.assistantCount}): ~${s.assistantTokens.toLocaleString()} tokens`,...s.systemTokens>0?[`System messages: ~${s.systemTokens.toLocaleString()} tokens`]:[],b>0?[te,...ee.map(e=>` ${e}`)].join(`
7
+ `),success:!0,data:{before:r,after:i,beforeMessageCount:a,afterMessageCount:o}}}function De(){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 Oe(){let e=De();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:Ee}}var ke=class{name=`compact`;getCommands(){return[De()]}};function Ae(){return{name:`agent-command-compact`,commandSources:[new ke],systemCommands:[Oe()]}}function x(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function je(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${x(e)} (${t})`}function S(e){return Math.ceil(e/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN)}function C(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${S(e.byteLength).toLocaleString()} tokens`].join(` `)}function Me(e){try{return JSON.parse(e)}catch{return null}}function Ne(e){let t=Me(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 Pe(e){let n=0,r=0,i=0,a=0,o=0,s=0,c=0;for(let l of e){let e=Math.ceil(JSON.stringify(l).length/t.CONTEXT_ESTIMATE_CHARS_PER_TOKEN);l.role===`system`?n+=e:l.role===`user`?(r+=e,i++):l.role===`assistant`?(a+=e,o++):l.role===`tool`&&(s+=e,c++)}return{systemTokens:n,userTokens:r,userCount:i,assistantTokens:a,assistantCount:o,toolTokens:s,toolCallCount:c,totalTokens:n+r+a+s}}function Fe(e){return Le(e.filter(e=>e.category===`chat`).map(e=>({type:e.type,data:e.data})))}function Ie(e){return Le(e.map(e=>({type:e.role,data:e})))}function Le(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:Ne(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 Re(e,t,n){let r=`${e}${t>0?` — ~${t.toLocaleString()} tokens`:``}:`;return n.length===0?`${r}\n (none)`:[r,...n.map(e=>` ${e}`)].join(`
8
+ `)}function ze(n){let r=(0,e.readCommandContextState)(n),i=(0,e.readAutoCompactThreshold)(n),a=(0,e.readAutoCompactThresholdSource)(n),o=n.getSession().getHistory(),s=Pe(o),c=n.getSession().getOfferedToolSchemas(),l=(0,t.estimateToolSchemaTokens)(c),u=Ie(o),d=(0,e.listCommandContextReferences)(n),f=d.filter(e=>e.loadType===`system`),p=d.filter(e=>e.loadType===`manual`),m=d.filter(e=>e.loadType===`prompt-reference`),h=f.reduce((e,t)=>e+S(t.byteLength),0),g=p.reduce((e,t)=>e+S(t.byteLength),0),_=m.reduce((e,t)=>e+S(t.byteLength),0),v=u.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${u.turnCount} turn${u.turnCount===1?``:`s`} | ~${s.totalTokens.toLocaleString()} tokens`,ee=u.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),y=u.toolResults.length,b=u.totalToolCallCount,te=b===0?`Tool results (0): (none)`:y<b?`Tool results (${y} unique / ${b} calls, ~${s.toolTokens.toLocaleString()} tokens):`:`Tool results (${y}, ~${s.toolTokens.toLocaleString()} tokens):`,ne=u.turnCount===0?[]:[`User (${s.userCount}): ~${s.userTokens.toLocaleString()} tokens`,`Assistant (${s.assistantCount}): ~${s.assistantTokens.toLocaleString()} tokens`,...s.systemTokens>0?[`System messages: ~${s.systemTokens.toLocaleString()} tokens`]:[],b>0?[te,...ee.map(e=>` ${e}`)].join(`
9
9
  `):te],re=u.turnCount===0?`${v}:\n (none)`:[`${v}:`,...ne.map(e=>` ${e}`)].join(`
10
- `);return{success:!0,message:[`Context: ${r.usedTokens.toLocaleString()} / ${r.maxTokens.toLocaleString()} tokens (${Math.round(r.usedPercentage)}%)`,je(i,a),``,w(`System prompt (active every turn)`,h,f.map(C)),``,w(`Tool schemas (sent every turn)`,l,c.map(e=>e.name)),``,re,``,w(`Manually added`,g,p.map(C)),``,w(`Prompt references (@-syntax)`,_,m.map(C))].join(`
11
- `),data:{references:d,history:{turnCount:u.turnCount,toolResults:u.toolResults},toolSchemaTokens:l}}}const T=[`Usage: /context [list] | add <path> | remove <path> | clear | auto on | off | <percent> | reset`,`Examples: /context list, /context add AGENTS.md, /context remove AGENTS.md, /context auto 85%`].join(`
12
- `);function ze(e){return e?`settings`:`current session only`}async function Be(t,n){let r=n.trim().split(/\s+/).filter(e=>e.length>0);if(r.length>0)return Ve(t,r);let i=(0,e.readCommandContextState)(t),a=(0,e.readAutoCompactThreshold)(t),o=(0,e.readAutoCompactThresholdSource)(t),s=Fe(t.getSession().getFullHistory()),c=(0,e.listCommandContextReferences)(t);return{message:[`Context: ${i.usedTokens.toLocaleString()} / ${i.maxTokens.toLocaleString()} tokens (${Math.round(i.usedPercentage)}%)`,je(a,o),Je(c),`History: ${s.turnCount} turn${s.turnCount===1?``:`s`}`].join(`
13
- `),success:!0,data:{usedTokens:i.usedTokens,maxTokens:i.maxTokens,percentage:i.usedPercentage,autoCompactThreshold:a,autoCompactThresholdSource:o,references:c}}}async function Ve(t,n){let[r,...i]=n;if(r===`list`)return i.length>0?{success:!1,message:T}:Re(t);if(r===`add`)return Ue(t,i);if(r===`remove`)return We(t,i);if(r===`clear`){if(i.length>0)return{success:!1,message:T};let n=(0,e.clearCommandContextReferences)(t);return{success:!0,message:`Context references cleared: ${n.removed.length} removed.`,data:{removed:n.removed}}}return r===`auto`?He(t,i):{success:!1,message:T}}function He(t,n){let[r,i]=n;if(i!==void 0)return{success:!1,message:T};if(r===void 0){let n=(0,e.readAutoCompactThreshold)(t),r=(0,e.readAutoCompactThresholdSource)(t);return{success:!0,message:[je(n,r),T].join(`
14
- `),data:{autoCompactThreshold:n,autoCompactThresholdSource:r}}}if(r===`on`)return Ge(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`enabled`);if(r===`off`)return Ge(t,!1,`disabled`);if(r===`reset`){let n=(0,e.resetAutoCompactThresholdSetting)(t);return(0,e.setCommandAutoCompactThreshold)(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`default`),{success:!0,message:`Auto compact reset to default: ${x(e.DEFAULT_AUTO_COMPACT_THRESHOLD)} (${ze(n)}).`,data:{autoCompactThreshold:e.DEFAULT_AUTO_COMPACT_THRESHOLD,autoCompactThresholdSource:`default`,persisted:n}}}let a=qe(r);return a.success?Ge(t,a.threshold,`threshold set`):{success:!1,message:`${a.message}\n${T}`}}async function Ue(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:T};let i=await(0,e.addCommandContextReference)(t,r);return i.reference?{success:!0,message:[`Context reference added: ${C(i.reference)}.`,...i.evicted.length>0?[`Evicted ${i.evicted.length} older context reference(s).`]:[]].join(`
10
+ `);return{success:!0,message:[`Context: ${r.usedTokens.toLocaleString()} / ${r.maxTokens.toLocaleString()} tokens (${Math.round(r.usedPercentage)}%)`,je(i,a),``,Re(`System prompt (active every turn)`,h,f.map(C)),``,Re(`Tool schemas (sent every turn)`,l,c.map(e=>e.name)),``,re,``,Re(`Manually added`,g,p.map(C)),``,Re(`Prompt references (@-syntax)`,_,m.map(C))].join(`
11
+ `),data:{references:d,history:{turnCount:u.turnCount,toolResults:u.toolResults},toolSchemaTokens:l}}}const w=[`Usage: /context [list] | add <path> | remove <path> | clear | auto on | off | <percent> | reset`,`Examples: /context list, /context add AGENTS.md, /context remove AGENTS.md, /context auto 85%`].join(`
12
+ `);function Be(e){return e?`settings`:`current session only`}async function Ve(t,n){let r=n.trim().split(/\s+/).filter(e=>e.length>0);if(r.length>0)return He(t,r);let i=(0,e.readCommandContextState)(t),a=(0,e.readAutoCompactThreshold)(t),o=(0,e.readAutoCompactThresholdSource)(t),s=Fe(t.getSession().getFullHistory()),c=(0,e.listCommandContextReferences)(t);return{message:[`Context: ${i.usedTokens.toLocaleString()} / ${i.maxTokens.toLocaleString()} tokens (${Math.round(i.usedPercentage)}%)`,je(a,o),Ye(c),`History: ${s.turnCount} turn${s.turnCount===1?``:`s`}`].join(`
13
+ `),success:!0,data:{usedTokens:i.usedTokens,maxTokens:i.maxTokens,percentage:i.usedPercentage,autoCompactThreshold:a,autoCompactThresholdSource:o,references:c}}}async function He(t,n){let[r,...i]=n;if(r===`list`)return i.length>0?{success:!1,message:w}:ze(t);if(r===`add`)return We(t,i);if(r===`remove`)return Ge(t,i);if(r===`clear`){if(i.length>0)return{success:!1,message:w};let n=(0,e.clearCommandContextReferences)(t);return{success:!0,message:`Context references cleared: ${n.removed.length} removed.`,data:{removed:n.removed}}}return r===`auto`?Ue(t,i):{success:!1,message:w}}function Ue(t,n){let[r,i]=n;if(i!==void 0)return{success:!1,message:w};if(r===void 0){let n=(0,e.readAutoCompactThreshold)(t),r=(0,e.readAutoCompactThresholdSource)(t);return{success:!0,message:[je(n,r),w].join(`
14
+ `),data:{autoCompactThreshold:n,autoCompactThresholdSource:r}}}if(r===`on`)return Ke(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`enabled`);if(r===`off`)return Ke(t,!1,`disabled`);if(r===`reset`){let n=(0,e.resetAutoCompactThresholdSetting)(t);return(0,e.setCommandAutoCompactThreshold)(t,e.DEFAULT_AUTO_COMPACT_THRESHOLD,`default`),{success:!0,message:`Auto compact reset to default: ${x(e.DEFAULT_AUTO_COMPACT_THRESHOLD)} (${Be(n)}).`,data:{autoCompactThreshold:e.DEFAULT_AUTO_COMPACT_THRESHOLD,autoCompactThresholdSource:`default`,persisted:n}}}let a=Je(r);return a.success?Ke(t,a.threshold,`threshold set`):{success:!1,message:`${a.message}\n${w}`}}async function We(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:w};let i=await(0,e.addCommandContextReference)(t,r);return i.reference?{success:!0,message:[`Context reference added: ${C(i.reference)}.`,...i.evicted.length>0?[`Evicted ${i.evicted.length} older context reference(s).`]:[]].join(`
15
15
  `),data:{reference:i.reference,evicted:i.evicted}}:{success:!1,message:i.diagnostics.join(`
16
- `)||`Context reference not found: ${r}`,data:{diagnostics:i.diagnostics}}}function We(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:T};let i=(0,e.removeCommandContextReference)(t,r);return i.removed?{success:!0,message:`Context reference removed: ${C(i.removed)}.`,data:{removed:i.removed}}:{success:!1,message:`Context reference not found: ${r}`}}function Ge(t,n,r){let i=(0,e.writeAutoCompactThresholdSetting)(t,n),a=i?`settings`:`session`;return(0,e.setCommandAutoCompactThreshold)(t,n,a),{success:!0,message:Ke(r,n,i),data:{autoCompactThreshold:n,autoCompactThresholdSource:a,persisted:i}}}function Ke(e,t,n){let r=ze(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${x(t)} (${r}).`:`Auto compact threshold set to ${x(t)} (${r}).`}function qe(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 Je(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function E(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 Ye(){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 Xe(){return E(Ye(),{requiresPermission:!1,lifecycle:`inline`,execute:Be})}var Ze=class{name=`context`;getCommands(){return[Ye()]}};function Qe(){return{name:`agent-command-context`,commandSources:[new Ze],systemCommands:[Xe()]}}function $e(){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 et={"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 D(e){return e.slice(0,10)}function tt(e){return new Date(e).toISOString().slice(0,10)}function nt(e){return{success:!1,message:et[e]}}function rt(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=>` ${D(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 it(e,t){if(e===void 0)return{success:!0,message:et[`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` ${D(e.deviceId)} ${e.name}${n} certificate expires ${tt(e.certificateExpiresAt)}`});return{success:!0,message:[`Devices of user ${D(e.userId)}:`,...n,`${e.revokedDeviceCount} revoked. Roster and revocation list valid until ${new Date(e.listsExpireAt).toISOString()}.`,...t===void 0?[]:rt(t)].join(`
17
- `)}}function at(e){return e.getCommandInvocationSource()===`user`}async function O(e,t,n){if(!e.canHandoffTerminal())return nt(`no-terminal`);try{let r=await e.runWithTerminal(t);return r.ok?{success:!0,message:n(r.value)}:nt(r.reason)}catch(e){return{success:!1,message:`Device identity operation failed: ${e instanceof Error?e.message:`unknown error`}`}}}async function ot(e,t,n){if(!at(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 it(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 O(t,()=>e.init(o.length>0?{name:o}:{}),e=>[`Device identity created. This device: ${D(e.deviceId)}; user ${D(e.userId)}.`,`It holds signing key ${D(e.signingKeyId)}.`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`],`Keep the recovery phrase offline; it is the only way to recover this identity.`].join(`
18
- `));case`recover`:return O(t,()=>e.recover(),e=>[`Recovered. New signing key ${D(e.signingKeyId)}; ${e.revokedSigningKeyCount} old signing key(s) revoked.`,`This device (${D(e.deviceId)}) is certified again.`,...e.droppedDeviceCount>0?[`${e.droppedDeviceCount} other device(s) were certified by a retired signing key and must enrol again.`]:[]].join(`
19
- `));case`revoke`:return o.length===0?{success:!1,message:`Usage: /devices revoke <device-id>`}:O(t,()=>e.revoke(o),e=>`Revoked ${e.name} (${D(e.deviceId)}). A new roster and revocation list were issued.`);case`add`:return O(t,()=>e.add(),e=>[`Enrolled ${e.name} (${D(e.deviceId)}). A new roster was issued.`,...e.confirmed?[]:["The new device did not confirm it kept its identity; check `/devices` there."]].join(`
20
- `));case`join`:return O(t,()=>e.join(o.length>0?{name:o}:{}),e=>[`Joined the devices of user ${D(e.userId)}. This device: ${e.name} (${D(e.deviceId)}).`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`]].join(`
21
- `));default:return{success:!1,message:`Unknown argument "${a}". Usage: /devices [list|init [name]|add|join [name]|revoke <device-id>|recover]`}}}var st=class{name=`devices`;getCommands(){return[$e()]}};function ct(e){let t=E($e(),{requiresPermission:!1,lifecycle:`inline`,execute:(t,n)=>ot(e,t,n)});return{name:`agent-command-devices`,commandSources:[new st],systemCommands:[t]}}const lt=3e3;function ut(e,t){return new Promise(n=>{let i=Date.now(),a=(0,r.createConnection)({host:e,port:t}),o=setTimeout(()=>{a.destroy(),n({reachable:!1,error:`timeout (${lt/1e3}s)`})},lt);a.on(`connect`,()=>{clearTimeout(o),a.destroy(),n({reachable:!0,elapsedMs:Date.now()-i})}),a.on(`error`,e=>{clearTimeout(o),n({reachable:!1,error:e.message})})})}function dt(e){if(!(0,n.existsSync)(e))return{exists:!1,isDirectory:!1,writable:!1};let t;try{t=(0,n.statSync)(e)}catch{return{exists:!0,isDirectory:!1,writable:!1}}let r=t.isDirectory(),i=t.mode&511,a=!1;try{(0,n.accessSync)(e,n.constants.W_OK),a=!0}catch{a=!1}return{exists:!0,isDirectory:r,writable:a,mode:i}}function ft(e,t=process.env){let r=e.trim().split(/\s+/)[0];if(r===void 0||r.length===0)return!1;if((0,i.isAbsolute)(r)||r.includes(`/`))return(0,n.existsSync)(r);let a=process.platform===`win32`?[``,`.exe`,`.cmd`,`.bat`]:[``];return(t.PATH??``).split(i.delimiter).filter(e=>e.length>0).some(e=>a.some(t=>(0,n.existsSync)((0,i.join)(e,r+t))))}function pt(e=process.env){return{probeEndpoint:ut,inspectPath:dt,resolveCommand:t=>ft(t,e),ownerOnlyGuarantee:()=>(0,a.ownerOnlyGuarantee)()}}const mt={ok:`✓`,warn:`⚠`,fail:`✗`,"not-configured":`○`,"not-probed":`–`};function ht(e,t){let n=[` ${mt[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 gt(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 _t(e,t=`Doctor`,n={}){let r=[``,t,``,...e.checks.flatMap(e=>ht(e,n)),``,gt(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 vt=`[redacted]`,yt=/(\b[a-z][a-z0-9+.-]{0,31}:\/\/)([^\s/@]+)@/gi,bt=/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,xt=/\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,St=/\.\.\."[^"]*"\.\.\./g;function Ct(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function wt(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(Ct(e),`g`),vt));return n=n.replace(yt,`$1${vt}@`),n=n.replace(bt,`$1 ${vt}`),n=n.replace(xt,vt),n}function Tt(t){return t instanceof e.SettingsParseError?`${t.name}: ${t.filePath} is not valid JSON (see the settings check)`:`${t.name}: ${t.message.replace(St,`…`)}`}function Et(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 Dt(e){let t=(0,i.basename)((0,i.dirname)(e.kind===`host`?e.path:e.relativePath)).replace(/^\./,``);return`settings.${e.scope}.${t}`}function Ot(e){let t=e.settingsSources.find(t=>t.kind===`host`&&t.path===e.userSettingsPath);return t===void 0?void 0:Dt(t)}function kt(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 At(e,t){return e.source.kind===`host`&&e.source.path===t.userSettingsPath&&e.state===`empty`}function jt(e,t){let n=Dt(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=At(e,t);return{id:n,label:`Settings layer`,status:`fail`,path:r,cause:kt(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 Mt(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 Nt(t){let n=(0,e.inspectSettingsLayers)(t.settingsSources);return{inspection:n,checks:[...n.layers.map(e=>jt(e,t)),Mt(n)]}}function Pt(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 Ft(e,n){let r=(0,t.findProviderDefinition)(n.providerDefinitions,e.name),i=e.baseURL??r?.defaults?.baseURL;if(i!==void 0)try{let t=new URL(i),n=t.port===``?t.protocol===`http:`?80:443:Number(t.port);return{host:t.hostname,port:n,origin:e.baseURL===void 0?`definition defaults.baseURL`:`profile baseURL`}}catch{return}let a=r?.endpoint;return a===void 0?void 0:{...a,origin:`definition endpoint`}}async function It(e,t,n){let r=Ft(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 Lt(t,n){let r;try{r=(0,e.readProviderSettings)(t.settingsSources,{providerDefinitions:t.providerDefinitions,env:{...t.env}})}catch(e){return{checks:[{id:`provider.resolution`,label:`Provider`,status:`fail`,cause:Tt(e instanceof Error?e:Error(String(e))),detail:[t.diagnosticGuidance?.providerResolution??`Configure a provider or set its API key environment variable.`]}]}}return{checks:[Pt(r),await It(r,t,n)],...r.apiKey===void 0?{}:{resolvedApiKey:r.apiKey}}}function Rt(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 zt(e,t){let{root:n,sessions:r}=e.userStorage,i={id:`storage.user`,label:`User storage`,path:n};switch(Rt(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 Bt(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 Vt(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 Ht(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 Ut(e,t,n){let r=Ht(n);return[Vt(e),zt(e,t),Bt(e,t),...r===void 0?[]:[r]]}const Wt=`storage.user`;function Gt(e){let t=Ot(e);return t===void 0?[Wt]:[t,Wt]}function Kt(e,t){return Gt(t).includes(e)}function qt(t,n){let r=(0,e.inspectSettingsLayers)(n.settingsSources).layers.find(e=>Dt(e.source)===t);return r===void 0||r.source.kind!==`host`?{ok:!1,reason:`${t}: no user settings layer in this composition`}:At(r,n)?{ok:!0,plan:{id:t,description:`rewrite the empty user settings file as {}`,path:r.source.path}}:{ok:!1,reason:`${t}: state is ${r.state}; only an empty file is rewritten`}}function Jt(e,t){let n=Rt(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 Yt(e,t,n){return Kt(e,t)?e===`storage.user`?Jt(t,n):qt(e,t):{ok:!1,reason:`${e}: not a repairable check (allowlist: ${Gt(t).join(`, `)})`}}async function Xt(t,n,r,i){let o=Yt(t,n,r);if(!o.ok)return{applied:!1,reason:o.reason};if(!await i(o.plan))return{applied:!1,reason:`${t}: repair not confirmed; nothing written`};let s=Yt(t,n,r);if(!s.ok)return{applied:!1,reason:`${s.reason} (state changed before the write)`};if(s.plan.id===`storage.user`){let{root:e,sessions:t}=n.userStorage;(0,a.ensureOwnerOnlyDirectory)(t,{withinRoot:e})}else(0,e.writeSettings)(s.plan.path,{});return{applied:!0,plan:s.plan}}const Zt={"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 Qt(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:Zt[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 $t(t){let n=(0,e.inspectSkillSources)(t.contributionSources,t.skillRoots).roots.filter(e=>e.present),r=n.reduce((e,t)=>e+t.discovered.length,0),i=[n.length===0?{id:`skills`,label:`Skills and commands`,status:`not-configured`,cause:`no skill or command root present`}:{id:`skills`,label:`Skills and commands`,status:`ok`,cause:`${r} discovered`,detail:n.map(e=>`${e.sourceDisplayName}: ${e.root} (${e.discovered.length})`)}];for(let e of n)for(let t of e.skipped)i.push({id:`skill.${t.path}`,label:`Skill definition`,status:t.reason===`frontmatter-invalid`?`fail`:`warn`,path:`${e.sourceDisplayName}: ${t.path}`,cause:t.reason,...t.detail===void 0?{}:{detail:[t.detail]}});return i}function en(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 tn(e,t,n){let r=en(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 nn(e,t){let n=`mcp.plugin.${e.pluginId}.${e.name}`;if(e.transport===`stdio`&&e.command!==void 0)return t.resolveCommand(e.command)?{id:n,label:`MCP server (plugin)`,status:`ok`,path:e.mcpPath,cause:`stdio command ${e.command} resolves`}:{id:n,label:`MCP server (plugin)`,status:`warn`,path:e.mcpPath,cause:`stdio command ${e.command} not found on PATH`,detail:e.envKeys.length===0?[]:[`env keys: ${e.envKeys.join(`, `)}`]};if(e.transport===`http`&&e.url!==void 0)try{return new URL(e.url),{id:n,label:`MCP server (plugin)`,status:`ok`,path:e.mcpPath,cause:`url ${e.url}`}}catch{return{id:n,label:`MCP server (plugin)`,status:`warn`,path:e.mcpPath,cause:`url is not parseable`}}return{id:n,label:`MCP server (plugin)`,status:`warn`,path:e.mcpPath,cause:`neither command nor url declared`}}function rn(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(nn(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 an(t,n,r){let i=(0,e.loadHostBundlePluginInspectionFromScopes)(t.pluginsDirs,{settingsPath:t.userSettingsPath});return[...Qt(i),...$t(t),...tn(r,i,n),...rn(t,i,n)]}function on(e,t,n){return{id:e,label:t,status:`fail`,cause:Tt(n)}}async function sn(e,t,n,r){try{return r(await n())}catch(n){return[on(e,t,n instanceof Error?n:Error(String(n)))]}}function cn(e,t){let n=e=>wt(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 ln(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 un(e){try{let t=Nt(e);return{checks:t.checks,result:t}}catch(e){return{checks:[on(`settings`,`Settings`,e instanceof Error?e:Error(String(e)))]}}}async function dn(e,t){let n=[...e.hostChecks];e.compositionFailure!==void 0&&n.push(e.compositionFailure);let r=un(e);n.push(...r.checks);let i=r.result?.inspection,a=Et((i?.layers??[]).map(e=>e.settings),e.env);return n.push(...await sn(`provider`,`Provider`,()=>Lt(e,t),e=>(e.resolvedApiKey!==void 0&&a.push(e.resolvedApiKey),e.checks))),i!==void 0&&(n.push(...await sn(`storage`,`Storage`,()=>Ut(e,t,i),e=>e)),n.push(...await sn(`extensions`,`Extensions`,()=>an(e,t,i),e=>e))),ln(n.map(e=>cn(e,a)))}function fn(){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 pn=class{name=`doctor`;getCommands(){return[fn()]}};async function mn(e,n){let r=e.getUserInteraction();if(r===void 0)return!1;let i=await r.ask((0,t.confirmAction)(`doctor-repair:${n.id}`,`Repair ${n.id}?`,{description:`${n.description} (${n.path})`,defaultYes:!1}));return i.type===`answer`&&i.values[0]===`yes`}async function hn(e,t,n,r,i){let a=await Xt(e,t,n,e=>mn(r,e));if(!a.applied)return{success:!1,message:a.reason,data:{repair:e,applied:!1}};let o=await dn(t,n),s=o.checks.find(t=>t.id===e);return{success:!0,message:[`Repaired ${e}: ${a.plan.description}.`,..._t(o,`${i.title??`Doctor`} (after repair)`,i)].join(`
22
- `),data:{repair:e,applied:!0,status:s?.status,exitCode:o.exitCode}}}async function gn(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>`}:hn(o,e,t,n,i);let s=await dn(e,t);return{success:s.failCount===0,message:_t(s,i.title,i).join(`
23
- `),data:{failCount:s.failCount,warnCount:s.warnCount,repairable:[...s.repairable]}}}function _n(e,t=pt({...e.env}),n={}){let r=E(fn(),{requiresPermission:!1,lifecycle:`inline`,execute:(r,i)=>gn(e,t,r,i,n)});return{name:`agent-command-doctor`,commandSources:[new pn],systemCommands:[r]}}function vn(){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 k(e,t,n){return new Promise((r,i)=>{let a=(0,s.spawn)(e,[...t],{cwd:n,stdio:`inherit`,env:process.env});a.on(`error`,i),a.on(`exit`,(e,t)=>{if(e!==null){r(e);return}if(t){let e=o.constants.signals[t];r(128+(e??0));return}r(0)})})}const yn="Compose a message in $EDITOR (optionally pre-filled with `/editor <text>`), then return it.";async function bn(e,t,r=`agent-editor-`){if(!e.canHandoffTerminal())return{message:`An editor is unavailable here (no interactive terminal).`,success:!1};let a=vn(),s=(0,n.mkdtempSync)((0,i.join)((0,o.tmpdir)(),r)),c=(0,i.join)(s,`message.md`);(0,n.writeFileSync)(c,t??``,`utf8`);try{let t=await e.runWithTerminal(async()=>k(a.command,[...a.args,c],e.getCwd()));if(t!==0)return{message:`Editor exited without saving (code ${t}).`,success:!1,data:{exitCode:t}};let r=(0,n.readFileSync)(c,`utf8`).replace(/\s+$/u,``);return r.length===0?{message:`Editor closed with empty content; nothing composed.`,success:!1}:{message:r,success:!0,data:{content:r}}}finally{(0,n.rmSync)(s,{recursive:!0,force:!0,maxRetries:3,retryDelay:20})}}function xn(){return{name:`editor`,displayName:`Editor`,description:yn,source:`editor`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function Sn(e){let t=xn();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)=>bn(t,n,e)}}var Cn=class{name=`editor`;getCommands(){return[xn()]}};function wn(e){return{name:`agent-command-editor`,commandSources:[new Cn],systemCommands:[Sn(e)]}}const Tn=`advisorModel`;function En(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 Dn(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:En(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{[Tn]:t,...n}=e;o.write(n)}else o.write({...e,[Tn]:a.saved})}return{success:!0,message:a.message,data:{advisor:{...r.status()}}}}function On(){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 kn(){let e=On();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Dn}}var An=class{name=`advisor`;getCommands(){return[On()]}};function jn(){return{name:`agent-command-advisor`,commandSources:[new An],systemCommands:[kn()]}}const Mn=[`auto`,...t.MODEL_EFFORT_VALUES];function Nn(e){return`Model effort: requested=${e.requested}, effective=${e.effective}, source=${e.source}, disposition=${e.disposition}.`}async function Pn(n){let r=n.getUserInteraction();if(r===void 0)return;let i=await r.ask((0,t.selectAction)(`effort`,`Select model effort`,Mn.map(e=>({value:e,label:e}))));return(0,e.parseModelEffort)(i.type===`answer`?i.values[0]:void 0,`/effort`)}function Fn(t){let n=t.getCommandHostAdapters?.().effort;if(n!==void 0)return n.getResolution();let r=t.getSession().getModelEffort();return(0,e.resolveModelEffort)({command:r,modelDefault:r===`auto`?`high`:r})}function In(e){return e.getCommandHostAdapters?.()??{}}function Ln(e,t){let n=In(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 Rn(t,n){let r;try{r=(0,e.parseModelEffort)(n.trim()||void 0,`/effort`),r===void 0&&(r=await Pn(t))}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}let i=Fn(t);if(r===void 0)return{message:Nn(i),success:!0,data:{effort:i}};let a=In(t).effort,o;try{o=a===void 0?(0,e.resolveModelEffort)({command:r,modelDefault:i.effective}):await a.apply(r,t.getSession()),a===void 0&&await t.getSession().applyModelOptions({effort:r}),t.getCommandInvocationSource()===`user`&&Ln(t,r)}catch(e){return{message:`Model effort was not applied: ${e instanceof Error?e.message:String(e)}`,success:!1}}return{message:Nn(o),success:!0,data:{effort:o}}}const zn=`auto | ${t.MODEL_EFFORT_VALUES.join(` | `)}`;function Bn(){return{name:`effort`,displayName:`Model Effort`,description:`Show or change the model effort level`,source:`effort`,argumentHint:zn,modelInvocable:!1}}function Vn(){let e=Bn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Rn}}var Hn=class{name=`effort`;getCommands(){return[Bn()]}};function Un(){return{name:`agent-command-effort`,commandSources:[new Hn],systemCommands:[Vn()]}}async function Wn(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`exit`,`Exit the session?`)))?{success:!0,message:`Exit cancelled.`}:{success:!0,message:`Exit requested.`,hostActions:[(0,e.createSessionExitHostAction)()]}}function Gn(){return{name:`exit`,displayName:`Exit Session`,description:e.EXIT_COMMAND_DESCRIPTION,source:`exit`,modelInvocable:!1}}function Kn(){let e=Gn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Wn}}var qn=class{name=`exit`;getCommands(){return[Gn()]}};function Jn(){return{name:`agent-command-exit`,commandSources:[new qn],systemCommands:[Kn()]}}const Yn=`none`,A=`--same-dir`;function Xn(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0),n=t.find(e=>e.startsWith(`--`)&&e!==A);if(n!==void 0)return{error:`Unknown option: ${n}\nUsage: /fork [name] [${A}]`};let r=t.filter(e=>e!==A);return{name:r.length>0?r.join(` `):void 0,isolation:t.includes(A)?Yn:`worktree`}}function Zn(e){return e instanceof Error?e.message:String(e)}function Qn(e,t,n){return[`Forked this conversation into "${e}" (${t}), running ${n===Yn?`in this directory`:`in its own worktree`}.`,`The fork is a copy: this session keeps going, and the two are separate records.`,`See its progress with /background list. Attaching from the background panel points this`,`terminal at the copy as it was forked; the fork's own turns stay in its task transcript.`].join(`
24
- `)}function $n(e,t,n){let r=n?.(e.sessionId);return`The fork "${e.name}" was written (${e.sessionId}) but its background job could not start: ${t}\n${r===void 0?`Resume the saved session through your host.`:`Resume it in a new terminal with: ${r}`}`}async function er(e,t=``,n){let r=Xn(t);if(`error`in r)return{message:r.error,success:!1};let i=e.getAgentJobCapability();if(!i)return{message:`This session cannot start background jobs, so it cannot run a fork.`,success:!1};let a;try{a=await e.forkSession(r.name===void 0?{}:{name:r.name})}catch(e){return{message:`Could not fork this session: ${Zn(e)}`,success:!1}}try{let e=await i.spawnAgentJob({agentType:`general-purpose`,label:a.name,mode:`background`,prompt:`Continue.`,isolation:r.isolation,resumeSessionId:a.sessionId});return{message:Qn(a.name,e.id,r.isolation),success:!0,data:{sessionId:a.sessionId,name:a.name,taskId:e.id}}}catch(e){return{message:$n(a,Zn(e),n),success:!1}}}function tr(){return{name:`fork`,displayName:`Fork Session`,description:`Copy this conversation into a new background session and keep working here. The fork inherits the whole conversation and the assembled system prompt; it is a copy, so nothing it does reaches this session and it never merges back.`,source:`fork`,modelInvocable:!1,argumentHint:`[name] [--same-dir]`}}function nr(e){let t=tr();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,...t.argumentHint===void 0?{}:{argumentHint:t.argumentHint},execute:(t,n)=>er(t,n,e)}}var rr=class{name=`fork`;getCommands(){return[tr()]}};function ir(e){return{name:`agent-command-fork`,commandSources:[new rr],systemCommands:[nr(e)],sessionRequirements:[`agent-runtime`]}}const ar=[`GIT_DIR`,`GIT_WORK_TREE`,`GIT_INDEX_FILE`,`GIT_OBJECT_DIRECTORY`,`GIT_ALTERNATE_OBJECT_DIRECTORIES`,`GIT_COMMON_DIR`,`GIT_PREFIX`,`GIT_NAMESPACE`];function or(e=process.env){let t={};for(let[n,r]of Object.entries(e))ar.includes(n)||(t[n]=r);return t}function j(e,t){return{kind:`failed`,reason:e,detail:t}}function sr(e){return o.constants.signals[e]??0}function cr(e,t,n,r){return e===null?{kind:`exited`,stdout:t,stderr:n,exitCode:0}:r.signal?.aborted===!0||e.name===`AbortError`?j(`aborted`,`the run was aborted before git exited`):e.code===`ERR_CHILD_PROCESS_STDIO_MAXBUFFER`?j(`output-too-large`,`git produced more than 16 MiB of output and was stopped`):e.killed===!0?j(`timeout`,`git did not exit within ${r.timeoutMs} ms and was stopped`):typeof e.code==`number`?{kind:`exited`,stdout:t,stderr:n,exitCode:e.code}:e.signal?{kind:`exited`,stdout:t,stderr:n,exitCode:128+sr(e.signal)}:j(`not-found`,`${r.executable} could not be run (${String(e.code??e.message)})`)}function lr(e={}){let t=e.executable??`git`;return{run(n,r){let i=r.timeoutMs??12e4,a=or(e.env??process.env);return new Promise(e=>{(0,s.execFile)(t,[...n],{cwd:r.cwd,env:a,shell:!1,encoding:`utf8`,timeout:i,maxBuffer:16777216,windowsHide:!0,...r.signal?{signal:r.signal}:{}},(n,a,o)=>e(cr(n,a,o,{executable:t,timeoutMs:i,signal:r.signal}))).stdin?.end()})}}}function M(e,t){if(t.kind===`failed`)return`git ${e} failed: ${t.detail}`;if(t.exitCode===0)return;let n=t.stderr.trim();return n.length>0?`git ${e} failed (exit ${t.exitCode}): ${n}`:`git ${e} failed (exit ${t.exitCode})`}const ur=[`status`,`--porcelain=v2`,`-z`,`--branch`],dr=/^1 (\S\S) \S+ \S+ \S+ \S+ \S+ \S+ ([^]*)$/,fr=/^2 (\S\S) \S+ \S+ \S+ \S+ \S+ \S+ \S+ ([^]*)$/,pr=/^u \S\S \S+ \S+ \S+ \S+ \S+ \S+ \S+ \S+ ([^]*)$/;function mr(e,t,n){t[0]!==`.`&&e.staged.push(n),t[1]!==`.`&&e.unstaged.push(n)}function hr(e,t){t.startsWith(`# branch.head `)?e.branch=t.slice(14):t.startsWith(`# branch.oid `)&&(e.unborn=t.slice(13)===`(initial)`)}function gr(e,t,n){if(t.startsWith(`# `))return hr(e,t),0;if(t.startsWith(`? `))return e.untracked.push(t.slice(2)),0;if(t.startsWith(`1 `)){let n=dr.exec(t);return n&&mr(e,n[1]??`..`,n[2]??``),0}if(t.startsWith(`2 `)){let r=fr.exec(t);return r&&mr(e,r[1]??`..`,`${r[2]??``} (from ${n??``})`),1}if(t.startsWith(`u `)){let n=pr.exec(t);n&&e.conflicted.push(n[1]??``)}return 0}function _r(e){let t=e.split(`\0`),n={branch:void 0,unborn:!1,staged:[],unstaged:[],untracked:[],conflicted:[]};for(let e=0;e<t.length;e+=1){let r=t[e]??``;r.length!==0&&(e+=gr(n,r,t[e+1]))}return n}function N(e,t){return`${e} (${t.length}):${t.length>0?` ${t.join(`, `)}`:``}`}function vr(e){let t=[e.branch===void 0?`No branch information`:e.branch===`(detached)`?`HEAD detached`:`On branch ${e.branch}${e.unborn?` (no commits yet)`:``}`,N(`staged`,e.staged),N(`unstaged`,e.unstaged),N(`untracked`,e.untracked)];return e.conflicted.length>0&&t.push(N(`conflicted`,e.conflicted)),t.join(`
25
- `)}async function yr(e,t){let n=await e.run(ur,{cwd:t}),r=M(`status`,n);if(r!==void 0||n.kind!==`exited`)return{success:!1,message:r??`git status failed`};let i=_r(n.stdout);return{success:!0,message:vr(i),data:{git:`status`,...i}}}const br=[`build`,`chore`,`ci`,`docs`,`feat`,`fix`,`perf`,`refactor`,`revert`,`style`,`test`],xr=/^([^\s():!]+)(\(([^\s()]+)\))?(!)?: (.*)$/;function Sr(e){if(e.trim().length===0)return{ok:!1,reason:`the subject is empty`};if(e.indexOf(`: `)===-1)return{ok:!1,reason:"the subject has no `: ` type separator — the form is `<type>[(scope)][!]: <description>`"};let t=xr.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 br.includes(n)||r.push(`type "${n}" is not one of the conventional types (${br.join(`, `)})`),e.length>72&&r.push(`the subject is ${e.length} characters; 72 is the conventional limit`),e.endsWith(`.`)&&r.push(`the subject ends with a period`),{ok:!0,warnings:r}}function Cr(e){let t=e.trim();return t===`-m`?``:(t.startsWith(`-m `)&&(t=t.slice(3).trim()),t.length>=2&&(t.startsWith(`"`)||t.startsWith(`'`))&&t.endsWith(t[0]??``)&&(t=t.slice(1,-1).trim()),t)}function P(e){return{success:!1,message:e,data:{git:`commit`,committed:!1}}}async function wr(e){let n=await e.ask((0,t.textAction)(`git-commit-subject`,`Commit message`,{description:`Conventional Commits form: <type>[(scope)][!]: <description>`,placeholder:`feat: describe the change`}));if(n.type===`answer`)return Cr(n.text??n.values[0]??``)}async function Tr(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:M(`diff --cached`,n)??`git failed`}};if(n.exitCode===1)return{staged:!0};let r=await e.run(ur,{cwd:t}),i=M(`status`,r);if(i!==void 0||r.kind!==`exited`)return{staged:!1,result:{success:!1,message:i??`git status failed`}};let a=_r(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 Er(e,t){let n=Cr(e);if(n.length===0){if(t===void 0)return{result:P("Commit cancelled: a commit message was needed and none could be asked for (no interactive session). Run `/git commit <subject>`.")};let e=await wr(t);if(e===void 0||e.length===0)return{result:P(`Commit cancelled.`)};n=e}return{subject:n}}async function Dr(e,n,r,i,a){if(a===void 0)return{confirmed:!1,result:P(`Commit cancelled: a confirmation was needed and none could be asked for (no interactive session).`)};let o=await e.run([`diff`,`--cached`,`--name-status`],{cwd:n}),s=M(`diff --cached --name-status`,o);if(s!==void 0||o.kind!==`exited`)return{confirmed:!1,result:{success:!1,message:s??`git failed`}};let c=o.stdout.split(`
26
- `).filter(e=>e.length>0).map(e=>e.replace(/\t/g,` `)),l=[`Message: ${r}`,...i.map(e=>`Warning: ${e}`),`Staged (${c.length}):`,...c.map(e=>` ${e}`)].join(`
27
- `);return(0,t.isConfirmed)(await a.ask((0,t.confirmAction)(`git-commit`,`Commit ${c.length} staged file(s)?`,{description:l,defaultYes:!1})))?{confirmed:!0,files:c}:{confirmed:!1,result:P(`Commit cancelled.`)}}async function Or(e,t,n,r){let i=await Tr(e,t);if(!i.staged)return i.result;let a=await Er(n,r);if(!(`subject`in a))return a.result;let{subject:o}=a,s=Sr(o);if(!s.ok)return{success:!1,message:`Commit refused: ${s.reason}.`,data:{git:`commit`,committed:!1,subject:o}};let c=await Dr(e,t,o,s.warnings,r);if(!c.confirmed)return c.result;let l=await e.run([`commit`,`-m`,o],{cwd:t}),u=M(`commit`,l);if(u!==void 0||l.kind!==`exited`)return{success:!1,message:u??`git commit failed`};let d=l.stdout.split(`
28
- `).find(e=>e.trim().length>0)??``;return{success:!0,message:`Committed: ${d.length>0?d:o}`,data:{git:`commit`,committed:!0,subject:o,files:c.files}}}function F(e){return{ok:!1,message:`${e}\nUsage: /git diff [--staged | <rev> | <a>..<b>] [-- <path> ...] — other git flags are not accepted here.`}}function kr(e){let t=e.indexOf(`--`),n=t===-1?e:e.slice(0,t),r=t===-1?[]:e.slice(t+1);if(t!==-1&&r.length===0)return F("`--` must be followed by a path.");let i=n.find(e=>e.startsWith(`-`)&&e!==`--staged`);if(i!==void 0)return F(`\`${i}\` is not accepted.`);if(n.length>1)return F(`Too many arguments: ${n.join(` `)}.`);let a=n[0];if(a===void 0)return{ok:!0,args:{target:{kind:`worktree`},paths:r}};if(a===`--staged`)return{ok:!0,args:{target:{kind:`staged`},paths:r}};if(a.includes(`..`)){if(a.includes(`...`))return F(`\`${a}\` is not a \`<a>..<b>\` range.`);let e=a.split(`..`),[t,n]=e;return e.length!==2||!t||!n?F(`\`${a}\` is not a \`<a>..<b>\` range.`):{ok:!0,args:{target:{kind:`range`,from:t,to:n},paths:r}}}return{ok:!0,args:{target:{kind:`revision`,revision:a},paths:r}}}function Ar(e){switch(e.kind){case`revision`:return[e.revision];case`range`:return[e.from,e.to];default:return[]}}function jr(e){let t=[`diff`];switch(e.target.kind){case`staged`:t.push(`--staged`);break;case`revision`:t.push(`--end-of-options`,e.target.revision);break;case`range`:t.push(`--end-of-options`,`${e.target.from}..${e.target.to}`);break;default:break}return e.paths.length>0&&t.push(`--`,...e.paths),t}function Mr(e){return[`rev-parse`,`--verify`,`--quiet`,`--end-of-options`,`${e}^{commit}`]}function Nr(e){return e.split(/\s+/).filter(e=>e.length>0)}async function Pr(e,t,n){let r=kr(Nr(n));if(!r.ok)return{success:!1,message:r.message};for(let n of Ar(r.args.target)){let r=await e.run(Mr(n),{cwd:t});if(r.kind===`failed`)return{success:!1,message:M(`rev-parse`,r)??`git failed`};if(r.exitCode!==0)return{success:!1,message:`Unknown revision: ${n}`}}let i=await e.run(jr(r.args),{cwd:t}),a=M(`diff`,i);if(a!==void 0||i.kind!==`exited`)return{success:!1,message:a??`git diff failed`};let o=i.stdout.replace(/\n$/,``);return{success:!0,message:o.length>0?o:`No differences.`,data:{git:`diff`,target:r.args.target,paths:r.args.paths}}}const Fr=`Usage: /git status | /git diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | /git commit [<subject>]`;function Ir(e,t,n){return{name:e,description:t,source:`git`,modelInvocable:!1,...n?{argumentHint:n}:{}}}function Lr(){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:[Ir(`status`,`Show the branch and the staged, unstaged and untracked paths`),Ir(`diff`,`Show the unstaged diff, the staged diff, or a diff against one or two revisions`,`[--staged | <rev> | <a>..<b>] [-- <path> ...]`),Ir(`commit`,`Commit the staged changes with a Conventional Commits subject, after confirming`,`[<subject>]`)]}}async function Rr(e,t,n=lr()){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${Fr}`}:yr(n,s);case`diff`:return Pr(n,s,o);case`commit`:return Or(n,s,o,e.getUserInteraction());default:return{success:!1,message:a.length===0?Fr:`Unknown /git verb "${a}".\n${Fr}`}}}function zr(e){let t=Lr();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)=>Rr(t,n,e)}}var Br=class{name=`git`;getCommands(){return[Lr()]}};function Vr(e={}){return{name:`agent-command-git`,commandSources:[new Br],systemCommands:[zr(e.port??lr())]}}const Hr=`Assign an autonomous goal the agent pursues across turns until satisfied.`;function Ur(e){let t=[`Goal: ${e.objective}`,`Status: ${e.status}${e.stopReason?` (${e.stopReason})`:``}`,`Iterations: ${e.iterations} / ${e.maxIterations}`],n=e.progress[e.progress.length-1];return n?.reason&&t.push(`Latest: ${n.reason}`),t.join(`
29
- `)}async function Wr(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`help`)return{message:`Usage:
16
+ `)||`Context reference not found: ${r}`,data:{diagnostics:i.diagnostics}}}function Ge(t,n){let r=n.join(` `).trim();if(!r)return{success:!1,message:w};let i=(0,e.removeCommandContextReference)(t,r);return i.removed?{success:!0,message:`Context reference removed: ${C(i.removed)}.`,data:{removed:i.removed}}:{success:!1,message:`Context reference not found: ${r}`}}function Ke(t,n,r){let i=(0,e.writeAutoCompactThresholdSetting)(t,n),a=i?`settings`:`session`;return(0,e.setCommandAutoCompactThreshold)(t,n,a),{success:!0,message:qe(r,n,i),data:{autoCompactThreshold:n,autoCompactThresholdSource:a,persisted:i}}}function qe(e,t,n){let r=Be(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${x(t)} (${r}).`:`Auto compact threshold set to ${x(t)} (${r}).`}function Je(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 Ye(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function T(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 Xe(){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 Ze(){return T(Xe(),{requiresPermission:!1,lifecycle:`inline`,execute:Ve})}var Qe=class{name=`context`;getCommands(){return[Xe()]}};function $e(){return{name:`agent-command-context`,commandSources:[new Qe],systemCommands:[Ze()]}}function et(){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 tt={"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 E(e){return e.slice(0,10)}function nt(e){return new Date(e).toISOString().slice(0,10)}function rt(e){return{success:!1,message:tt[e]}}function it(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=>` ${E(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 at(e,t){if(e===void 0)return{success:!0,message:tt[`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` ${E(e.deviceId)} ${e.name}${n} certificate expires ${nt(e.certificateExpiresAt)}`});return{success:!0,message:[`Devices of user ${E(e.userId)}:`,...n,`${e.revokedDeviceCount} revoked. Roster and revocation list valid until ${new Date(e.listsExpireAt).toISOString()}.`,...t===void 0?[]:it(t)].join(`
17
+ `)}}function ot(e){return e.getCommandInvocationSource()===`user`}async function D(e,t,n){if(!e.canHandoffTerminal())return rt(`no-terminal`);try{let r=await e.runWithTerminal(t);return r.ok?{success:!0,message:n(r.value)}:rt(r.reason)}catch(e){return{success:!1,message:`Device identity operation failed: ${e instanceof Error?e.message:`unknown error`}`}}}async function st(e,t,n){if(!ot(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 at(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 D(t,()=>e.init(o.length>0?{name:o}:{}),e=>[`Device identity created. This device: ${E(e.deviceId)}; user ${E(e.userId)}.`,`It holds signing key ${E(e.signingKeyId)}.`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`],`Keep the recovery phrase offline; it is the only way to recover this identity.`].join(`
18
+ `));case`recover`:return D(t,()=>e.recover(),e=>[`Recovered. New signing key ${E(e.signingKeyId)}; ${e.revokedSigningKeyCount} old signing key(s) revoked.`,`This device (${E(e.deviceId)}) is certified again.`,...e.droppedDeviceCount>0?[`${e.droppedDeviceCount} other device(s) were certified by a retired signing key and must enrol again.`]:[]].join(`
19
+ `));case`revoke`:return o.length===0?{success:!1,message:`Usage: /devices revoke <device-id>`}:D(t,()=>e.revoke(o),e=>`Revoked ${e.name} (${E(e.deviceId)}). A new roster and revocation list were issued.`);case`add`:return D(t,()=>e.add(),e=>[`Enrolled ${e.name} (${E(e.deviceId)}). A new roster was issued.`,...e.confirmed?[]:["The new device did not confirm it kept its identity; check `/devices` there."]].join(`
20
+ `));case`join`:return D(t,()=>e.join(o.length>0?{name:o}:{}),e=>[`Joined the devices of user ${E(e.userId)}. This device: ${e.name} (${E(e.deviceId)}).`,...e.keyStorage===void 0?[]:[`Private keys are kept in: ${e.keyStorage}.`]].join(`
21
+ `));default:return{success:!1,message:`Unknown argument "${a}". Usage: /devices [list|init [name]|add|join [name]|revoke <device-id>|recover]`}}}var ct=class{name=`devices`;getCommands(){return[et()]}};function lt(e){let t=T(et(),{requiresPermission:!1,lifecycle:`inline`,execute:(t,n)=>st(e,t,n)});return{name:`agent-command-devices`,commandSources:[new ct],systemCommands:[t]}}const ut=3e3;function dt(e,t){return new Promise(n=>{let i=Date.now(),a=(0,r.createConnection)({host:e,port:t}),o=setTimeout(()=>{a.destroy(),n({reachable:!1,error:`timeout (${ut/1e3}s)`})},ut);a.on(`connect`,()=>{clearTimeout(o),a.destroy(),n({reachable:!0,elapsedMs:Date.now()-i})}),a.on(`error`,e=>{clearTimeout(o),n({reachable:!1,error:e.message})})})}function ft(e){if(!(0,n.existsSync)(e))return{exists:!1,isDirectory:!1,writable:!1};let t;try{t=(0,n.statSync)(e)}catch{return{exists:!0,isDirectory:!1,writable:!1}}let r=t.isDirectory(),i=t.mode&511,a=!1;try{(0,n.accessSync)(e,n.constants.W_OK),a=!0}catch{a=!1}return{exists:!0,isDirectory:r,writable:a,mode:i}}function pt(e,t=process.env){let r=e.trim().split(/\s+/)[0];if(r===void 0||r.length===0)return!1;if((0,i.isAbsolute)(r)||r.includes(`/`))return(0,n.existsSync)(r);let a=process.platform===`win32`?[``,`.exe`,`.cmd`,`.bat`]:[``];return(t.PATH??``).split(i.delimiter).filter(e=>e.length>0).some(e=>a.some(t=>(0,n.existsSync)((0,i.join)(e,r+t))))}function mt(e=process.env){return{probeEndpoint:dt,inspectPath:ft,resolveCommand:t=>pt(t,e),ownerOnlyGuarantee:()=>(0,a.ownerOnlyGuarantee)()}}const ht={ok:`✓`,warn:`⚠`,fail:`✗`,"not-configured":`○`,"not-probed":`–`};function gt(e,t){let n=[` ${ht[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 _t(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 vt(e,t=`Doctor`,n={}){let r=[``,t,``,...e.checks.flatMap(e=>gt(e,n)),``,_t(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 O=`[redacted]`,yt=/(\b[a-z][a-z0-9+.-]{0,31}:\/\/)([^\s/@]+)@/gi,bt=/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,xt=/\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,St=/\.\.\."[^"]*"\.\.\./g;function Ct(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function wt(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(Ct(e),`g`),O));return n=n.replace(yt,`$1${O}@`),n=n.replace(bt,`$1 ${O}`),n=n.replace(xt,O),n}function Tt(t){return t instanceof e.SettingsParseError?`${t.name}: ${t.filePath} is not valid JSON (see the settings check)`:`${t.name}: ${t.message.replace(St,`…`)}`}function Et(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 Dt(e){let t=(0,i.basename)((0,i.dirname)(e.kind===`host`?e.path:e.relativePath)).replace(/^\./,``);return`settings.${e.scope}.${t}`}function Ot(e){let t=e.settingsSources.find(t=>t.kind===`host`&&t.path===e.userSettingsPath);return t===void 0?void 0:Dt(t)}function kt(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 At(e,t){return e.source.kind===`host`&&e.source.path===t.userSettingsPath&&e.state===`empty`}function jt(e,t){let n=Dt(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=At(e,t);return{id:n,label:`Settings layer`,status:`fail`,path:r,cause:kt(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 Mt(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 Nt(t){let n=(0,e.inspectSettingsLayers)(t.settingsSources);return{inspection:n,checks:[...n.layers.map(e=>jt(e,t)),Mt(n)]}}function Pt(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 Ft(e,n){let r=(0,t.findProviderDefinition)(n.providerDefinitions,e.name),i=e.baseURL??r?.defaults?.baseURL;if(i!==void 0)try{let t=new URL(i),n=t.port===``?t.protocol===`http:`?80:443:Number(t.port);return{host:t.hostname,port:n,origin:e.baseURL===void 0?`definition defaults.baseURL`:`profile baseURL`}}catch{return}let a=r?.endpoint;return a===void 0?void 0:{...a,origin:`definition endpoint`}}async function It(e,t,n){let r=Ft(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 Lt(t,n){let r;try{r=(0,e.readProviderSettings)(t.settingsSources,{providerDefinitions:t.providerDefinitions,env:{...t.env}})}catch(e){return{checks:[{id:`provider.resolution`,label:`Provider`,status:`fail`,cause:Tt(e instanceof Error?e:Error(String(e))),detail:[t.diagnosticGuidance?.providerResolution??`Configure a provider or set its API key environment variable.`]}]}}return{checks:[Pt(r),await It(r,t,n)],...r.apiKey===void 0?{}:{resolvedApiKey:r.apiKey}}}function Rt(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 zt(e,t){let{root:n,sessions:r}=e.userStorage,i={id:`storage.user`,label:`User storage`,path:n};switch(Rt(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 Bt(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 Vt(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 Ht(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 Ut(e,t,n){let r=Ht(n);return[Vt(e),zt(e,t),Bt(e,t),...r===void 0?[]:[r]]}const Wt=`storage.user`;function Gt(e){let t=Ot(e);return t===void 0?[Wt]:[t,Wt]}function Kt(e,t){return Gt(t).includes(e)}function qt(t,n){let r=(0,e.inspectSettingsLayers)(n.settingsSources).layers.find(e=>Dt(e.source)===t);return r===void 0||r.source.kind!==`host`?{ok:!1,reason:`${t}: no user settings layer in this composition`}:At(r,n)?{ok:!0,plan:{id:t,description:`rewrite the empty user settings file as {}`,path:r.source.path}}:{ok:!1,reason:`${t}: state is ${r.state}; only an empty file is rewritten`}}function Jt(e,t){let n=Rt(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 Yt(e,t,n){return Kt(e,t)?e===`storage.user`?Jt(t,n):qt(e,t):{ok:!1,reason:`${e}: not a repairable check (allowlist: ${Gt(t).join(`, `)})`}}async function Xt(t,n,r,i){let o=Yt(t,n,r);if(!o.ok)return{applied:!1,reason:o.reason};if(!await i(o.plan))return{applied:!1,reason:`${t}: repair not confirmed; nothing written`};let s=Yt(t,n,r);if(!s.ok)return{applied:!1,reason:`${s.reason} (state changed before the write)`};if(s.plan.id===`storage.user`){let{root:e,sessions:t}=n.userStorage;(0,a.ensureOwnerOnlyDirectory)(t,{withinRoot:e})}else(0,e.writeSettings)(s.plan.path,{});return{applied:!0,plan:s.plan}}const Zt={"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 Qt(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:Zt[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 $t(t){let n=(0,e.inspectSkillSources)(t.contributionSources,t.skillRoots).roots.filter(e=>e.present),r=n.reduce((e,t)=>e+t.discovered.length,0),i=[n.length===0?{id:`skills`,label:`Skills and commands`,status:`not-configured`,cause:`no skill or command root present`}:{id:`skills`,label:`Skills and commands`,status:`ok`,cause:`${r} discovered`,detail:n.map(e=>`${e.sourceDisplayName}: ${e.root} (${e.discovered.length})`)}];for(let e of n)for(let t of e.skipped)i.push({id:`skill.${t.path}`,label:`Skill definition`,status:t.reason===`frontmatter-invalid`?`fail`:`warn`,path:`${e.sourceDisplayName}: ${t.path}`,cause:t.reason,...t.detail===void 0?{}:{detail:[t.detail]}});return i}function en(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 tn(e,t,n){let r=en(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 nn(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 rn(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(nn(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 an(t,n,r){let i,a;try{i=(0,e.loadHostBundlePluginInspectionFromScopes)(t.pluginsDirs,{settingsPath:t.userSettingsPath})}catch(n){a=n instanceof Error?n.message:String(n),i=(0,e.loadHostBundlePluginInspectionFromScopes)(t.pluginsDirs,{enabledPlugins:{}})}return[...Qt(i).map(e=>a!==void 0&&e.id===`plugins`?{...e,status:`fail`,cause:`no plugin loads: ${a}`}:e),...$t(t),...tn(r,i,n),...rn(t,i,n)]}function on(e,t,n){return{id:e,label:t,status:`fail`,cause:Tt(n)}}async function sn(e,t,n,r){try{return r(await n())}catch(n){return[on(e,t,n instanceof Error?n:Error(String(n)))]}}function cn(e,t){let n=e=>wt(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 ln(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 un(e){try{let t=Nt(e);return{checks:t.checks,result:t}}catch(e){return{checks:[on(`settings`,`Settings`,e instanceof Error?e:Error(String(e)))]}}}async function dn(e,t){let n=[...e.hostChecks];e.compositionFailure!==void 0&&n.push(e.compositionFailure);let r=un(e);n.push(...r.checks);let i=r.result?.inspection,a=Et((i?.layers??[]).map(e=>e.settings),e.env);return n.push(...await sn(`provider`,`Provider`,()=>Lt(e,t),e=>(e.resolvedApiKey!==void 0&&a.push(e.resolvedApiKey),e.checks))),i!==void 0&&(n.push(...await sn(`storage`,`Storage`,()=>Ut(e,t,i),e=>e)),n.push(...await sn(`extensions`,`Extensions`,()=>an(e,t,i),e=>e))),ln(n.map(e=>cn(e,a)))}function fn(){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 pn=class{name=`doctor`;getCommands(){return[fn()]}};async function mn(e,n){let r=e.getUserInteraction();if(r===void 0)return!1;let i=await r.ask((0,t.confirmAction)(`doctor-repair:${n.id}`,`Repair ${n.id}?`,{description:`${n.description} (${n.path})`,defaultYes:!1}));return i.type===`answer`&&i.values[0]===`yes`}async function hn(e,t,n,r,i){let a=await Xt(e,t,n,e=>mn(r,e));if(!a.applied)return{success:!1,message:a.reason,data:{repair:e,applied:!1}};let o=await dn(t,n),s=o.checks.find(t=>t.id===e);return{success:!0,message:[`Repaired ${e}: ${a.plan.description}.`,...vt(o,`${i.title??`Doctor`} (after repair)`,i)].join(`
22
+ `),data:{repair:e,applied:!0,status:s?.status,exitCode:o.exitCode}}}async function gn(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>`}:hn(o,e,t,n,i);let s=await dn(e,t);return{success:s.failCount===0,message:vt(s,i.title,i).join(`
23
+ `),data:{failCount:s.failCount,warnCount:s.warnCount,repairable:[...s.repairable]}}}function _n(e,t=mt({...e.env}),n={}){let r=T(fn(),{requiresPermission:!1,lifecycle:`inline`,execute:(r,i)=>gn(e,t,r,i,n)});return{name:`agent-command-doctor`,commandSources:[new pn],systemCommands:[r]}}function vn(){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 k(e,t,n){return new Promise((r,i)=>{let a=(0,s.spawn)(e,[...t],{cwd:n,stdio:`inherit`,env:process.env});a.on(`error`,i),a.on(`exit`,(e,t)=>{if(e!==null){r(e);return}if(t){let e=o.constants.signals[t];r(128+(e??0));return}r(0)})})}const yn="Compose a message in $EDITOR (optionally pre-filled with `/editor <text>`), then return it.";async function bn(e,t,r=`agent-editor-`){if(!e.canHandoffTerminal())return{message:`An editor is unavailable here (no interactive terminal).`,success:!1};let a=vn(),s=(0,n.mkdtempSync)((0,i.join)((0,o.tmpdir)(),r)),c=(0,i.join)(s,`message.md`);(0,n.writeFileSync)(c,t??``,`utf8`);try{let t=await e.runWithTerminal(async()=>k(a.command,[...a.args,c],e.getCwd()));if(t!==0)return{message:`Editor exited without saving (code ${t}).`,success:!1,data:{exitCode:t}};let r=(0,n.readFileSync)(c,`utf8`).replace(/\s+$/u,``);return r.length===0?{message:`Editor closed with empty content; nothing composed.`,success:!1}:{message:r,success:!0,data:{content:r}}}finally{(0,n.rmSync)(s,{recursive:!0,force:!0,maxRetries:3,retryDelay:20})}}function xn(){return{name:`editor`,displayName:`Editor`,description:yn,source:`editor`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function Sn(e){let t=xn();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)=>bn(t,n,e)}}var Cn=class{name=`editor`;getCommands(){return[xn()]}};function wn(e){return{name:`agent-command-editor`,commandSources:[new Cn],systemCommands:[Sn(e)]}}const Tn=`advisorModel`;function En(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 Dn(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:En(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{[Tn]:t,...n}=e;o.write(n)}else o.write({...e,[Tn]:a.saved})}return{success:!0,message:a.message,data:{advisor:{...r.status()}}}}function On(){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 kn(){let e=On();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Dn}}var An=class{name=`advisor`;getCommands(){return[On()]}};function jn(){return{name:`agent-command-advisor`,commandSources:[new An],systemCommands:[kn()]}}const Mn=[`auto`,...t.MODEL_EFFORT_VALUES];function Nn(t){return t.disposition===`not-applied`?`This model doesn't support effort levels, so it will use its default.`:`Effort: ${e.EFFORT_LEVEL_LABELS[t.requested]}`}async function Pn(n){let r=n.getUserInteraction();if(r===void 0)return;let i=await r.ask((0,t.selectAction)(`effort`,`Select model effort`,Mn.map(t=>({value:t,label:e.EFFORT_LEVEL_LABELS[t]}))));return(0,e.parseModelEffort)(i.type===`answer`?i.values[0]:void 0,`/effort`)}function Fn(t){let n=t.getCommandHostAdapters?.().effort;if(n!==void 0)return n.getResolution();let r=t.getSession().getModelEffort();return(0,e.resolveModelEffort)({command:r,modelDefault:r===`auto`?`high`:r})}function In(e){return e.getCommandHostAdapters?.()??{}}function Ln(e,t){let n=In(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 Rn(t,n){let r;try{r=(0,e.parseModelEffort)(n.trim()||void 0,`/effort`),r===void 0&&(r=await Pn(t))}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}let i=Fn(t);if(r===void 0)return{message:Nn(i),success:!0,data:{effort:i}};let a=In(t).effort,o;try{o=a===void 0?(0,e.resolveModelEffort)({command:r,modelDefault:i.effective}):await a.apply(r,t.getSession()),a===void 0&&await t.getSession().applyModelOptions({effort:r}),t.getCommandInvocationSource()===`user`&&Ln(t,r)}catch(e){return{message:`Model effort was not applied: ${e instanceof Error?e.message:String(e)}`,success:!1}}return{message:Nn(o),success:!0,data:{effort:o}}}const zn=`auto | ${t.MODEL_EFFORT_VALUES.join(` | `)}`;function Bn(){return{name:`effort`,displayName:`Model Effort`,description:`Show or change the model effort level`,source:`effort`,argumentHint:zn,modelInvocable:!1}}function Vn(){let e=Bn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,lifecycle:`inline`,execute:Rn}}var Hn=class{name=`effort`;getCommands(){return[Bn()]}};function Un(){return{name:`agent-command-effort`,commandSources:[new Hn],systemCommands:[Vn()]}}async function Wn(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`exit`,`Exit the session?`)))?{success:!0,message:`Exit cancelled.`}:{success:!0,message:`Exit requested.`,hostActions:[(0,e.createSessionExitHostAction)()]}}function Gn(){return{name:`exit`,displayName:`Exit Session`,description:e.EXIT_COMMAND_DESCRIPTION,source:`exit`,modelInvocable:!1}}function Kn(){let e=Gn();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Wn}}var qn=class{name=`exit`;getCommands(){return[Gn()]}};function Jn(){return{name:`agent-command-exit`,commandSources:[new qn],systemCommands:[Kn()]}}const Yn=`none`,A=`--same-dir`;function Xn(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0),n=t.find(e=>e.startsWith(`--`)&&e!==A);if(n!==void 0)return{error:`Unknown option: ${n}\nUsage: /fork [name] [${A}]`};let r=t.filter(e=>e!==A);return{name:r.length>0?r.join(` `):void 0,isolation:t.includes(A)?Yn:`worktree`}}function Zn(e){return e instanceof Error?e.message:String(e)}function Qn(e,t,n){return[`Forked this conversation into "${e}" (${t}), running ${n===Yn?`in this directory`:`in its own worktree`}.`,`The fork is a copy: this session keeps going, and the two are separate records.`,`See its progress with /background list. Attaching from the background panel points this`,`terminal at the copy as it was forked; the fork's own turns stay in its task transcript.`].join(`
24
+ `)}function $n(e,t,n){let r=n?.(e.sessionId);return`The fork "${e.name}" was written (${e.sessionId}) but its background job could not start: ${t}\n${r===void 0?`Resume the saved session through your host.`:`Resume it in a new terminal with: ${r}`}`}async function er(e,t=``,n){let r=Xn(t);if(`error`in r)return{message:r.error,success:!1};let i=e.getAgentJobCapability();if(!i)return{message:`This session cannot start background jobs, so it cannot run a fork.`,success:!1};let a;try{a=await e.forkSession(r.name===void 0?{}:{name:r.name})}catch(e){return{message:`Could not fork this session: ${Zn(e)}`,success:!1}}try{let e=await i.spawnAgentJob({agentType:`general-purpose`,label:a.name,mode:`background`,prompt:`Continue.`,isolation:r.isolation,resumeSessionId:a.sessionId});return{message:Qn(a.name,e.id,r.isolation),success:!0,data:{sessionId:a.sessionId,name:a.name,taskId:e.id}}}catch(e){return{message:$n(a,Zn(e),n),success:!1}}}function tr(){return{name:`fork`,displayName:`Fork Session`,description:`Copy this conversation into a new background session and keep working here. The fork inherits the whole conversation and the assembled system prompt; it is a copy, so nothing it does reaches this session and it never merges back.`,source:`fork`,modelInvocable:!1,argumentHint:`[name] [--same-dir]`}}function nr(e){let t=tr();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,...t.argumentHint===void 0?{}:{argumentHint:t.argumentHint},execute:(t,n)=>er(t,n,e)}}var rr=class{name=`fork`;getCommands(){return[tr()]}};function ir(e){return{name:`agent-command-fork`,commandSources:[new rr],systemCommands:[nr(e)],sessionRequirements:[`agent-runtime`]}}const ar=[`build`,`chore`,`ci`,`docs`,`feat`,`fix`,`perf`,`refactor`,`revert`,`style`,`test`],or=/^([^\s():!]+)(\(([^\s()]+)\))?(!)?: (.*)$/;function sr(e){if(e.trim().length===0)return{ok:!1,reason:`the subject is empty`};if(e.indexOf(`: `)===-1)return{ok:!1,reason:"the subject has no `: ` type separator — the form is `<type>[(scope)][!]: <description>`"};let t=or.exec(e);if(!t)return{ok:!1,reason:"the part before `: ` must be a type word with an optional `(scope)` and `!` — the form is `<type>[(scope)][!]: <description>`"};let n=t[1]??``;if((t[5]??``).trim().length===0)return{ok:!1,reason:"the description after `: ` is empty"};let r=[];return ar.includes(n)||r.push(`type "${n}" is not one of the conventional types (${ar.join(`, `)})`),e.length>72&&r.push(`the subject is ${e.length} characters; 72 is the conventional limit`),e.endsWith(`.`)&&r.push(`the subject ends with a period`),{ok:!0,warnings:r}}function cr(e){let t=e.trim();return t===`-m`?``:(t.startsWith(`-m `)&&(t=t.slice(3).trim()),t.length>=2&&(t.startsWith(`"`)||t.startsWith(`'`))&&t.endsWith(t[0]??``)&&(t=t.slice(1,-1).trim()),t)}function j(e){return{success:!1,message:e,data:{git:`commit`,committed:!1}}}async function lr(e){let n=await e.ask((0,t.textAction)(`git-commit-subject`,`Commit message`,{description:`Conventional Commits form: <type>[(scope)][!]: <description>`,placeholder:`feat: describe the change`}));if(n.type===`answer`)return cr(n.text??n.values[0]??``)}async function ur(t,n){let r=await t.run([`diff`,`--cached`,`--quiet`],{cwd:n});if(r.kind===`failed`||r.exitCode!==0&&r.exitCode!==1)return{staged:!1,result:{success:!1,message:(0,e.gitFailureMessage)(`diff --cached`,r)??`git failed`}};if(r.exitCode===1)return{staged:!0};let i=await t.run(e.GIT_STATUS_ARGS,{cwd:n}),a=(0,e.gitFailureMessage)(`status`,i);if(a!==void 0||i.kind!==`exited`)return{staged:!1,result:{success:!1,message:a??`git status failed`}};let o=(0,e.parseStatusPorcelainV2)(i.stdout);return{staged:!1,result:{success:!1,message:`Nothing is staged (${o.unstaged.length} unstaged, ${o.untracked.length} untracked). Stage files with \`git add\` or \`/shell git add ...\` and run \`/git commit\` again.`,data:{git:`commit`,committed:!1,unstaged:o.unstaged.length,untracked:o.untracked.length}}}}async function dr(e,t){let n=cr(e);if(n.length===0){if(t===void 0)return{result:j("Commit cancelled: a commit message was needed and none could be asked for (no interactive session). Run `/git commit <subject>`.")};let e=await lr(t);if(e===void 0||e.length===0)return{result:j(`Commit cancelled.`)};n=e}return{subject:n}}async function fr(n,r,i,a,o){if(o===void 0)return{confirmed:!1,result:j(`Commit cancelled: a confirmation was needed and none could be asked for (no interactive session).`)};let s=await n.run([`diff`,`--cached`,`--name-status`],{cwd:r}),c=(0,e.gitFailureMessage)(`diff --cached --name-status`,s);if(c!==void 0||s.kind!==`exited`)return{confirmed:!1,result:{success:!1,message:c??`git failed`}};let l=s.stdout.split(`
25
+ `).filter(e=>e.length>0).map(e=>e.replace(/\t/g,` `)),u=[`Message: ${i}`,...a.map(e=>`Warning: ${e}`),`Staged (${l.length}):`,...l.map(e=>` ${e}`)].join(`
26
+ `);return(0,t.isConfirmed)(await o.ask((0,t.confirmAction)(`git-commit`,`Commit ${l.length} staged file(s)?`,{description:u,defaultYes:!1})))?{confirmed:!0,files:l}:{confirmed:!1,result:j(`Commit cancelled.`)}}async function pr(t,n,r,i){let a=await ur(t,n);if(!a.staged)return a.result;let o=await dr(r,i);if(!(`subject`in o))return o.result;let{subject:s}=o,c=sr(s);if(!c.ok)return{success:!1,message:`Commit refused: ${c.reason}.`,data:{git:`commit`,committed:!1,subject:s}};let l=await fr(t,n,s,c.warnings,i);if(!l.confirmed)return l.result;let u=await t.run([`commit`,`-m`,s],{cwd:n}),d=(0,e.gitFailureMessage)(`commit`,u);if(d!==void 0||u.kind!==`exited`)return{success:!1,message:d??`git commit failed`};let f=u.stdout.split(`
27
+ `).find(e=>e.trim().length>0)??``;return{success:!0,message:`Committed: ${f.length>0?f:s}`,data:{git:`commit`,committed:!0,subject:s,files:l.files}}}const mr=`Usage: /git status | /git diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | /git commit [<subject>]`;function hr(e,t,n){return{name:e,description:t,source:`git`,modelInvocable:!1,...n?{argumentHint:n}:{}}}function gr(){return{name:`git`,displayName:`Git`,description:`Show the git status, view a diff, or commit the staged changes after confirming`,source:`git`,modelInvocable:!1,argumentHint:`status | diff [--staged | <rev> | <a>..<b>] [-- <path> ...] | commit [<subject>]`,subcommands:[hr(`status`,`Show the branch and the staged, unstaged and untracked paths`),hr(`diff`,`Show the unstaged diff, the staged diff, or a diff against one or two revisions`,`[--staged | <rev> | <a>..<b>] [-- <path> ...]`),hr(`commit`,`Commit the staged changes with a Conventional Commits subject, after confirming`,`[<subject>]`)]}}async function _r(t,n,r=(0,e.createGitProcess)()){let i=n.trim(),a=i.search(/\s/),o=a===-1?i:i.slice(0,a),s=a===-1?``:i.slice(a+1).trim(),c=t.getCwd();switch(o){case`status`:return s.length>0?{success:!1,message:`\`/git status\` takes no arguments.\n${mr}`}:(0,e.executeGitStatus)(r,c);case`diff`:return(0,e.executeGitDiff)(r,c,s);case`commit`:return pr(r,c,s,t.getUserInteraction());default:return{success:!1,message:o.length===0?mr:`Unknown /git verb "${o}".\n${mr}`}}}function vr(e){let t=gr();return{name:t.name,displayName:t.displayName,description:t.description,argumentHint:t.argumentHint,example:`/git status`,subcommands:t.subcommands,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`blocking`,execute:(t,n)=>_r(t,n,e)}}var yr=class{name=`git`;getCommands(){return[gr()]}};function br(t={}){return{name:`agent-command-git`,commandSources:[new yr],systemCommands:[vr(t.port??(0,e.createGitProcess)())]}}const xr=`Assign an autonomous goal the agent pursues across turns until satisfied.`;function Sr(e){let t=[`Goal: ${e.objective}`,`Status: ${e.status}${e.stopReason?` (${e.stopReason})`:``}`,`Iterations: ${e.iterations} / ${e.maxIterations}`],n=e.progress[e.progress.length-1];return n?.reason&&t.push(`Latest: ${n.reason}`),t.join(`
28
+ `)}async function Cr(t,n){let r=n.trim(),i=r.split(/\s+/)[0]?.toLowerCase()??``;if(r.length===0||i===`help`)return{message:`Usage:
30
29
  /goal <objective> assign a goal and pursue it autonomously
31
30
  /goal status show the current goal and progress
32
- /goal cancel stop the current goal`,success:!0};if(r===`status`){let t=e.getGoalState();return t?{message:Ur(t),success:!0,data:{status:t.status}}:{message:`No goal is set.`,success:!0}}if(r===`cancel`||r===`stop`){let t=e.cancelGoal();return t?{message:`Goal cancelled: ${t.objective}`,success:!0}:{message:`No active goal to cancel.`,success:!1}}let i;try{i=await e.setGoal(n)}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return{message:`Goal set — pursuing autonomously (up to ${i.maxIterations} iterations):\n${i.objective}`,success:!0,data:{goalId:i.id}}}function Gr(){return{name:`goal`,displayName:`Autonomous Goal`,description:Hr,source:`goal`,modelInvocable:!1}}function Kr(){let e=Gr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Wr}}var qr=class{name=`goal`;getCommands(){return[Gr()]}};function Jr(){return{name:`agent-command-goal`,commandSources:[new qr],systemCommands:[Kr()]}}function I(e){return e.stillMine?`This session is still on this machine, and still yours to use.`:`This session now belongs to the destination, and this one ends.`}function Yr(e){return e.map(e=>` ${e.deviceId}${e.name?` ${e.name}`:``}`).join(`
33
- `)}function Xr(){return{success:!0,message:[`Usage:`,` /handoff list where this session could move to`,` /handoff <session-or-device-id> move it there, after confirming what stays behind`].join(`
34
- `)}}async function Zr(e,t){let n=e.getCommandHostAdapters?.().handoff;if(n===void 0)return{success:!1,message:`This session has no hand-off carrier, so it cannot be moved to another machine. Nothing changed — the session is still here.`};let r=t.trim();if(r===``||r===`help`){let e=await n.destinations();return e.length===0?{success:!0,message:`No other machine is reachable for a hand-off right now.
35
- `+I(n.status())}:{success:!0,message:[`This session could move to:`,Yr(e),``,Xr().message??``].join(`
36
- `)}}let i=await n.destinations();if(!i.some(e=>e.deviceId===r))return{success:!1,message:`No reachable machine is called '${r}'.\n`+(i.length>0?`Reachable now:\n${Yr(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(`
37
- `),options:[{value:`move`,label:`Move it to ${r}`},{value:`stay`,label:`Keep it here`}]});if(c.type!==`answer`||!c.values.includes(`move`))return{success:!0,message:`Hand-off cancelled.\n${I(n.status())}`};let l=[],u=await n.transfer(r,e=>{l.push(Qr(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(`
38
- `)}}function Qr(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 $r(){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 ei(){let e=$r();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Zr(e,t)}}var ti=class{name=`handoff`;getCommands(){return[$r()]}};function ni(){return{name:`agent-command-handoff`,commandSources:[new ti],systemCommands:[ei()]}}function ri(t,n){return{success:!0,message:(0,e.formatCommandHelpMessage)(t)}}function ii(){return{name:`help`,displayName:`Help`,description:e.HELP_COMMAND_DESCRIPTION,source:`help`,modelInvocable:!1}}function ai(){let e=ii();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:ri}}var oi=class{name=`help`;getCommands(){return[ii()]}};function si(){return{name:`agent-command-help`,commandSources:[new oi],systemCommands:[ai()]}}function ci(){return{name:`keybindings`,displayName:`Keybindings`,description:`Open the contextual terminal keybindings file in $EDITOR`,source:`keybindings`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}async function li(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=vn(),i=await t.runWithTerminal(()=>k(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 ui=class{name=`keybindings`;getCommands(){return[ci()]}};function di(e){let t=ci(),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=>li(e,t)};return{name:`agent-command-keybindings`,commandSources:[new ui],systemCommands:[n]}}async function fi(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildLanguageCommandSubcommands)().map(e=>({value:e.name,label:e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`language`,`Select language`,i)),o=a.type===`answer`?a.values[0]:void 0;return o===void 0?void 0:(0,e.parseLanguageArgument)(o)}async function pi(t,n){let r=(0,e.parseLanguageArgument)(n);return r===void 0&&(r=await fi(t),r===void 0)?{message:(0,e.formatLanguageUsageMessage)(),success:!1}:{message:`Language set to "${r}".`,success:!0,data:{language:r},hostActions:[{type:`language-change`,language:r}]}}function mi(){return{name:`language`,displayName:`Language`,description:e.LANGUAGE_COMMAND_DESCRIPTION,source:`language`,argumentHint:e.LANGUAGE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildLanguageCommandSubcommands)(`language`),modelInvocable:!1}}function hi(){let e=mi();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:pi}}var gi=class{name=`language`;getCommands(){return[mi()]}};function _i(){return{name:`agent-command-language`,commandSources:[new gi],systemCommands:[hi()]}}function vi(e,n,r=`session`){let i=(0,t.shellArgumentForDisplay)(e)??`<server>`;switch(n){case`approve`:return`/mcp approve ${i}`;case`sign-in`:return r===`terminal`?`robota mcp login ${i}`:`/mcp login ${i}`;case`trust-workspace`:return`robota trust`}}const yi={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 bi(e){let n=(0,t.shellArgumentForDisplay)(e);return n===void 0?"An MCP server (its name cannot be shown here; `/mcp status` lists it)":`MCP server "${n}"`}function xi(e,t,n=`session`){let r=t===`trust-workspace`||t===`sign-in`&&n===`terminal`?` in a terminal, then restart the session`:``;return`${bi(e)} ${yi[t]}, so its tools are unavailable. You cannot do this yourself; ask the user to run \`${vi(e,t,n)}\`${r}.`}function Si(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])=>`- ${xi(e,t)}`)].join(`
39
- `)}function Ci(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 wi(e,n,r){let i=(0,t.shellArgumentForDisplay)(e.serverId),a=Ci(e.status,n);return{...i===void 0?{}:{name:i},status:e.status,...n===void 0?{}:{oauth:n},...a===void 0?{}:{suggestCommand:vi(e.serverId,a,r)}}}function Ti(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 Ei(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=>wi(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(Ti)];return r>0&&i.push(`${r} MCP configuration source(s) could not be read; the user can see which with \`/mcp status\`.`),{message:i.join(`
40
- `),success:!0,data:{servers:n,unreadableSources:r}}}function L(e){return e.getCommandHostAdapters?.().mcpActivation}const Di={"signed-in":`signed in`,"expired-refreshable":`token expired, will refresh`,"sign-in-required":`sign-in required`,"signed-out":`signed out`},Oi={refresh_token:`refresh token`,access_token:`access token`};function ki(e){let t=e.revocationFailure??`revocation-failed`;switch(e.revocation){case`revoked`:return`the tokens were revoked`;case`not-attempted`:return`there were no tokens to revoke`;case`unsupported`:return`the authorization server offers no token revocation; the tokens stay valid until they expire`;case`failed`:return`token revocation failed (${t}); the tokens stay valid until they expire`;case`partial`:return(e.tokens??[]).map(e=>e.revoked?`the ${Oi[e.token]} was revoked`:`the ${Oi[e.token]} was not (${e.failure??`revocation-failed`}) and stays valid until it expires`).join(`; `)}}function R(e){return(0,t.shellArgumentForDisplay)(e)??`<server>`}function Ai(e){let n=R(e),r=`run /mcp login ${n}, or robota mcp login ${n} in a terminal`;return(0,t.shellArgumentForDisplay)(e)===void 0?` (${r}; its name cannot be shown safely here)`:` (${r})`}function ji(e,t){let n=e.displayName?` (${e.displayName})`:``,r=t===void 0?``:` — OAuth: ${Di[t]}${t===`sign-in-required`||t===`signed-out`?Ai(e.serverId):``}`;return` ${e.serverId}${n} — ${e.status} — ${e.source} — ${e.reason}${r}`}function Mi(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 Ni(e){let t=await e.oauthStatus?.()??[];return new Map(t.map(e=>[e.serverId,e.state]))}async function Pi(e){if(!e)return{message:`MCP activation management is not available in this environment.`,success:!0};let t=e.list(),n=await Ni(e),r=e.sourceProblems?.()??[],i=r.length===0?[]:[`MCP source problems:\n${r.map(Mi).join(`
41
- `)}`];return t.length===0?{message:i.length===0?`No MCP definitions are registered.`:i[0],success:!0,data:{servers:[],sourceProblems:r}}:{message:[`MCP activation status:\n${t.map(e=>ji(e,n.get(e.serverId))).join(`
31
+ /goal cancel stop the current goal`,success:!0};if(i===`status`){let e=t.getGoalState();return e?{message:Sr(e),success:!0,data:{status:e.status}}:{message:`No goal is set.`,success:!0}}if((0,e.isGoalCancelVerb)(r)){let e=t.cancelGoal();return e?{message:`Goal cancelled: ${e.objective}`,success:!0}:{message:`No active goal to cancel.`,success:!1}}let a;try{a=await t.setGoal(r)}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return{message:`Goal set — pursuing autonomously (up to ${a.maxIterations} iterations):\n${a.objective}`,success:!0,data:{goalId:a.id}}}function wr(){return{name:`goal`,displayName:`Autonomous Goal`,description:xr,source:`goal`,modelInvocable:!1}}function Tr(){let e=wr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Cr}}var Er=class{name=`goal`;getCommands(){return[wr()]}};function Dr(){return{name:`agent-command-goal`,commandSources:[new Er],systemCommands:[Tr()]}}function M(e){return e.stillMine?`This session is still on this machine, and still yours to use.`:`This session now belongs to the destination, and this one ends.`}function Or(e){return e.map(e=>` ${e.deviceId}${e.name?` ${e.name}`:``}`).join(`
32
+ `)}function kr(){return{success:!0,message:[`Usage:`,` /handoff list where this session could move to`,` /handoff <session-or-device-id> move it there, after confirming what stays behind`].join(`
33
+ `)}}async function Ar(e,t){let n=e.getCommandHostAdapters?.().handoff;if(n===void 0)return{success:!1,message:`This session has no hand-off carrier, so it cannot be moved to another machine. Nothing changed — the session is still here.`};let r=t.trim();if(r===``||r===`help`){let e=await n.destinations();return e.length===0?{success:!0,message:`No other machine is reachable for a hand-off right now.
34
+ `+M(n.status())}:{success:!0,message:[`This session could move to:`,Or(e),``,kr().message??``].join(`
35
+ `)}}let i=await n.destinations();if(!i.some(e=>e.deviceId===r))return{success:!1,message:`No reachable machine is called '${r}'.\n`+(i.length>0?`Reachable now:\n${Or(i)}`:`None are reachable right now.`)+`\n${M(n.status())}`};let a=await n.staysBehind(),o=[a.uncommittedChanges?` - uncommitted changes in the working tree stay on THIS machine`:null,a.subprocesses>0?` - ${a.subprocesses} running process(es) stay on THIS machine and will not be reachable there`:null,` - the destination uses ITS OWN provider credential; credentials are never transferred`].filter(e=>e!==null),s=e.getUserInteraction?.();if(s===void 0)return{success:!1,message:`A hand-off needs a person to confirm what stays behind, and no interactive session is attached.\n${M(n.status())}`};let c=await s.ask({id:`handoff:${r}`,title:`Move this session to ${r}?`,description:[`What will NOT travel:`,...o].join(`
36
+ `),options:[{value:`move`,label:`Move it to ${r}`},{value:`stay`,label:`Keep it here`}]});if(c.type!==`answer`||!c.values.includes(`move`))return{success:!0,message:`Hand-off cancelled.\n${M(n.status())}`};let l=[],u=await n.transfer(r,e=>{l.push(jr(e,r))});return{success:u.state===`done`,message:[...l,u.state===`done`?`Hand-off complete. ${r} saved this session and has not started it; resume it there.`:`Hand-off stopped: ${u.reason??`no reason was reported`}.`,M(u)].join(`
37
+ `)}}function jr(e,t){switch(e.state){case`offered`:return`Offering the session to ${t}...`;case`sending`:return`Sending the session...`;case`awaiting-confirmation`:return`Sent. Waiting for ${t} to confirm it has the session on disk — until it does, this machine keeps it.`;case`done`:return`${t} confirmed it has the session.`;case`stopped`:return`Stopped: ${e.reason??`no reason was reported`}.`;default:return``}}function Mr(){return{name:`handoff`,displayName:`Hand off`,description:"Push this conversation to another running 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 Nr(){let e=Mr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Ar(e,t)}}var Pr=class{name=`handoff`;getCommands(){return[Mr()]}};function Fr(){return{name:`agent-command-handoff`,commandSources:[new Pr],systemCommands:[Nr()]}}function Ir(t,n){return{success:!0,message:(0,e.formatCommandHelpMessage)(t)}}function Lr(){return{name:`help`,displayName:`Help`,description:e.HELP_COMMAND_DESCRIPTION,source:`help`,modelInvocable:!1}}function Rr(){let e=Lr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Ir}}var zr=class{name=`help`;getCommands(){return[Lr()]}};function Br(){return{name:`agent-command-help`,commandSources:[new zr],systemCommands:[Rr()]}}function Vr(){return{name:`keybindings`,displayName:`Keybindings`,description:`Open the contextual terminal keybindings file in $EDITOR`,source:`keybindings`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}async function Hr(e,t){if(!e)return{success:!1,message:`Key bindings 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=vn(),i=await t.runWithTerminal(()=>k(r.command,[...r.args,n],t.getCwd()));return i===0?{success:!0,message:`Opened keybindings: ${n}`,data:{path:n}}:{success:!1,message:`Keybindings editor exited with code ${i}.`,data:{path:n,exitCode:i}}}var Ur=class{name=`keybindings`;getCommands(){return[Vr()]}};function Wr(e){let t=Vr(),n={name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:t=>Hr(e,t)};return{name:`agent-command-keybindings`,commandSources:[new Ur],systemCommands:[n]}}async function Gr(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildLanguageCommandSubcommands)().map(e=>({value:e.name,label:e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`language`,`Select language`,i)),o=a.type===`answer`?a.values[0]:void 0;return o===void 0?void 0:(0,e.parseLanguageArgument)(o)}async function Kr(t,n){let r=(0,e.parseLanguageArgument)(n);return r===void 0&&(r=await Gr(t),r===void 0)?{message:(0,e.formatLanguageUsageMessage)(),success:!1}:{message:`Language set to "${r}".`,success:!0,data:{language:r},hostActions:[{type:`language-change`,language:r}]}}function qr(){return{name:`language`,displayName:`Language`,description:e.LANGUAGE_COMMAND_DESCRIPTION,source:`language`,argumentHint:e.LANGUAGE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildLanguageCommandSubcommands)(`language`),modelInvocable:!1}}function Jr(){let e=qr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Kr}}var Yr=class{name=`language`;getCommands(){return[qr()]}};function Xr(){return{name:`agent-command-language`,commandSources:[new Yr],systemCommands:[Jr()]}}function Zr(e,n,r=`session`){let i=(0,t.shellArgumentForDisplay)(e)??`<server>`;switch(n){case`approve`:return`/mcp approve ${i}`;case`sign-in`:return r===`terminal`?`robota mcp login ${i}`:`/mcp login ${i}`;case`trust-workspace`:return`robota trust`}}const Qr={approve:`is waiting for the user’s approval`,"sign-in":`needs the user to sign in`,"trust-workspace":`needs the user to trust this workspace`};function $r(e){let n=(0,t.shellArgumentForDisplay)(e);return n===void 0?"An MCP server (its name cannot be shown here; `/mcp status` lists it)":`MCP server "${n}"`}function ei(e,t,n=`session`){let r=t===`trust-workspace`||t===`sign-in`&&n===`terminal`?` in a terminal, then restart the session`:``;return`${$r(e)} ${Qr[t]}, so its tools are unavailable. You cannot do this yourself; ask the user to run \`${Zr(e,t,n)}\`${r}.`}function ti(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])=>`- ${ei(e,t)}`)].join(`
38
+ `)}function ni(e,t){if(e===`pending`||e===`stale`)return`approve`;if(e===`untrusted`)return`trust-workspace`;if(e===`approved`&&(t===`sign-in-required`||t===`signed-out`))return`sign-in`}function ri(e,n,r){let i=(0,t.shellArgumentForDisplay)(e.serverId),a=ni(e.status,n);return{...i===void 0?{}:{name:i},status:e.status,...n===void 0?{}:{oauth:n},...a===void 0?{}:{suggestCommand:Zr(e.serverId,a,r)}}}function ii(e){let t=e.name??`(name not shown)`,n=e.oauth===void 0?``:` — sign-in: ${e.oauth}`,r=e.suggestCommand===void 0?``:` — ask the user to run \`${e.suggestCommand}\``;return` ${t} — ${e.status}${n}${r}`}async function ai(e){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=>ri(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(ii)];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 N(e){return e.getCommandHostAdapters?.().mcpActivation}const oi={"signed-in":`signed in`,"expired-refreshable":`token expired, will refresh`,"sign-in-required":`sign-in required`,"signed-out":`signed out`},si={refresh_token:`refresh token`,access_token:`access token`};function ci(e){let t=e.revocationFailure??`revocation-failed`;switch(e.revocation){case`revoked`:return`the tokens were revoked`;case`not-attempted`:return`there were no tokens to revoke`;case`unsupported`:return`the authorization server offers no token revocation; the tokens stay valid until they expire`;case`failed`:return`token revocation failed (${t}); the tokens stay valid until they expire`;case`partial`:return(e.tokens??[]).map(e=>e.revoked?`the ${si[e.token]} was revoked`:`the ${si[e.token]} was not (${e.failure??`revocation-failed`}) and stays valid until it expires`).join(`; `)}}function P(e){return(0,t.shellArgumentForDisplay)(e)??`<server>`}function li(e){let n=P(e),r=`run /mcp login ${n}, or robota mcp login ${n} in a terminal`;return(0,t.shellArgumentForDisplay)(e)===void 0?` (${r}; its name cannot be shown safely here)`:` (${r})`}function ui(e,t){let n=e.displayName?` (${e.displayName})`:``,r=t===void 0?``:` — OAuth: ${oi[t]}${t===`sign-in-required`||t===`signed-out`?li(e.serverId):``}`;return` ${e.serverId}${n} — ${e.status} — ${e.source} — ${e.reason}${r}`}function di(e){let t=e.blockedServerNames??[],n=t.length===0?``:` Blocked until fixed: ${t.join(`, `)}.`;return` ${e.source} (${e.origin}) could not be read: ${e.reason}.${n}`}async function fi(e){let t=await e.oauthStatus?.()??[];return new Map(t.map(e=>[e.serverId,e.state]))}async function pi(e){if(!e)return{message:`MCP activation management is not available in this environment.`,success:!0};let t=e.list(),n=await fi(e),r=e.sourceProblems?.()??[],i=r.length===0?[]:[`MCP source problems:\n${r.map(di).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=>ui(e,n.get(e.serverId))).join(`
42
41
  `)}`,...i].join(`
43
42
 
44
- `),success:!0,data:{servers:t.map(e=>({serverId:e.serverId,source:e.source,status:e.status,allowed:e.allowed,provenanceId:e.provenanceId,definitionFingerprint:e.definitionFingerprint,securityIdentity:e.securityIdentity,...n.has(e.serverId)?{oauth:n.get(e.serverId)}:{}})),sourceProblems:r}}}async function Fi(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`?Pi(L(e)):Ei(L(e))}if(i===`login`)return Vi(e,a);if(i!==`approve`&&i!==`reject`&&i!==`revoke`&&i!==`logout`)return{message:`Unknown argument. Usage: /mcp [status] | /mcp <approve|reject|revoke|logout> <serverId> | /mcp login <serverId> [--no-browser]`,success:!1};if(!a)return{message:`Usage: /mcp ${i} <serverId>`,success:!1};let o=L(e);if(!o)return{message:`MCP activation management is not available in this environment.`,success:!0};if(i===`logout`)return Ii(o,a);try{let e=await o[i](a);return{message:`MCP server ${a} is now ${e.status}. ${e.reason}`,success:e.status===`approved`||e.status===`rejected`||e.status===`revoked`,data:{serverId:e.serverId,status:e.status,allowed:e.allowed,source:e.source,provenanceId:e.provenanceId,definitionFingerprint:e.definitionFingerprint,securityIdentity:e.securityIdentity}}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}async function Ii(e,t){if(e.oauthLogout===void 0||(await Ni(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`}; ${ki(n)}.`,success:!0,data:{...n}}}let z=0;function Li(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 Ri(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 zi(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 Bi(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 Vi(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=Ri(e,o),d=r?void 0:Li(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:zi(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:`${Bi(o,f.connection,p.length)}${h}`,success:!0,data:{serverId:o,connection:f.connection??`not-connected`,tools:[...p],...m===0?{}:{dropped:m}}}}function Hi(){return{name:`mcp`,displayName:`MCP activation`,description:`Show each MCP server's trust approval and OAuth sign-in state, or change one server: approve, reject or revoke its trust; sign in to it (login, which connects it in this session) or out of it (logout). Use when an MCP server is not approved, needs a sign-in, or should stop being used. Returns the status list, or what the one action did.`,modelDescription:`Show which MCP servers are configured and why any of them is unavailable. Use it when an MCP server or its tools are missing, a tool call reports that a server needs sign-in or approval, or the user asks about MCP servers. Returns one line per server: its name, activation state, sign-in state, and the command to suggest to the user when the server needs their approval, sign-in or workspace trust. You cannot approve, sign in or sign out yourself.`,argumentHint:`[status] | <approve|reject|revoke|logout> <server> | login <server> [--no-browser]`,source:`mcp-activation`,modelInvocable:!0,runsBare:!0,subcommands:[{name:`status`,description:`Show every MCP server’s name, activation state and sign-in state`,source:`mcp-activation`,modelInvocable:!0},...[`approve`,`reject`,`revoke`,`login`,`logout`].map(e=>({name:e,description:Ui[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const Ui={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 Wi(){let e=Hi();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:Fi}}var Gi=class{name=`mcp-activation`;getCommands(){return[Hi()]}};function Ki(){return{name:`agent-command-mcp-activation`,commandSources:[new Gi],systemCommands:[Wi()]}}function B(){return{message:e.MEMORY_COMMAND_USAGE,success:!1}}function qi(e){return{message:e instanceof Error?e.message:String(e),success:!1}}async function Ji(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: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 mi(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`?pi(N(e)):ai(N(e))}if(i===`login`)return xi(e,a);if(i===`reload`)return gi(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=N(e);if(!o)return{message:`MCP activation management is not available in this environment.`,success:!0};if(i===`logout`)return hi(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 gi(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 hi(e,t){if(e.oauthLogout===void 0||(await fi(e)).get(t)===void 0)return{message:`MCP server ${t} does not declare OAuth.`,success:!1};let n;try{n=await e.oauthLogout(t)}catch{return{message:`Signing out of MCP server ${t} failed.`,success:!1}}return{message:`${n.removed?`Signed out of MCP server ${t}`:`MCP server ${t} was not signed in`}; ${ci(n)}.`,success:!0,data:{...n}}}async function gi(e){let t=N(e);if(!t)return{message:`MCP activation management is not available in this environment.`,success:!0};if(t.reload===void 0)return{message:`Reloading MCP servers is not available in this environment.`,success:!1};let n=await t.reload(),r=[];try{r=n.tools.length===0?[]:await e.getSession().addTools(n.tools)}finally{n.reloadToken!==void 0&&t.reloadToolsAdded?.(n.reloadToken,r)}let i=n.tools.length-r.length;return{message:`Reloaded MCP servers. ${[n.connectedServerIds.length===0?`No server newly connected.`:`Connected: ${n.connectedServerIds.join(`, `)}.`,n.failedServerIds.length===0?void 0:`Still not connected: ${n.failedServerIds.join(`, `)} (see /mcp status).`,i===0?void 0:`${i} of the new tools ${i===1?`was`:`were`} left out: the session already has a tool by that name.`].filter(e=>e!==void 0).join(` `)}`.trim(),success:!0,data:{connectedServerIds:n.connectedServerIds,failedServerIds:n.failedServerIds,tools:[...r]}}}let F=0;function _i(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{if(r.aborted)return`cancel`;F+=1;let i=await n.ask({id:`mcp-login-browser-${F}`,title:`Sign in to MCP server ${P(t)}`,description:`Your browser will open this URL; if it does not, open it yourself:\n${e.authorizationUrl}\n\nThe sign-in completes on its own once you approve in the browser.`,options:[{value:`open`,label:`Open my browser`},{value:`paste`,label:`Paste the redirect instead (browser on another machine)`},{value:`cancel`,label:`Cancel`}],maxSelect:1,default:{values:[`open`]}});if(i.type!==`answer`||r.aborted)return`cancel`;let a=i.values[0];return a===`open`||a===`paste`?a:`cancel`}}function vi(e,t){let n=e.getUserInteraction();if(n!==void 0)return async(e,r)=>{r.throwIfAborted(),F+=1;let i=await n.ask({id:`mcp-login-redirect-${F}`,title:`Sign in to MCP server ${P(t)}`,description:`Open this URL in a browser:\n${e.authorizationUrl}\n\nAfter you approve, the browser is sent to ${e.redirectUri}, which may not load. Copy the full address from its address bar and paste it here.`,allowFreeText:!0,masked:!0,placeholder:`Redirect URL (not shown)`});if(i.type!==`answer`||i.text===void 0||i.text.trim()===``)throw Error(`No redirect URL was pasted.`);return i.text}}function yi(e){let{serverId:t,failure:n}=e,r=P(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 bi(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 xi(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=P(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=N(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=vi(e,o),d=r?void 0:_i(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:yi(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:`${bi(o,f.connection,p.length)}${h}`,success:!0,data:{serverId:o,connection:f.connection??`not-connected`,tools:[...p],...m===0?{}:{dropped:m}}}}function Si(){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:Ci[e],argumentHint:e===`login`?`<server> [--no-browser]`:`<server>`,source:`mcp-activation`,modelInvocable:!1}))]}}const Ci={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 wi(){let e=Si();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},argumentHint:e.argumentHint,...e.subcommands===void 0?{}:{subcommands:e.subcommands},requiresPermission:!0,modelRequiresPermission:!1,userInvocable:!0,modelInvocable:!0,lifecycle:`inline`,execute:mi}}var Ti=class{name=`mcp-activation`;getCommands(){return[Si()]}};function Ei(){return{name:`agent-command-mcp-activation`,commandSources:[new Ti],systemCommands:[wi()]}}function I(){return{message:e.MEMORY_COMMAND_USAGE,success:!1}}function Di(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Oi(t){try{return{ok:!0,store:(0,e.createCommandMemoryStores)(t)}}catch(e){return{ok:!1,result:Di(e instanceof Error?e:String(e))}}}async function ki(e){let t=await e.list(),n=t.topics.length>0?t.topics.map(e=>`- ${e.name}: ${e.path}`).join(`
45
44
  `):`(none)`;return{message:[`Memory index: ${t.indexPath}`,`Topics directory: ${t.topicsPath}`,`Topics:`,n].join(`
46
- `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function Yi(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 Xi(t){let n=t[1],r=t[2],i=t.slice(3).join(` `).trim();if(!(!n||!(0,e.isCommandMemoryType)(n)||!r||i.length===0))return{type:n,topic:r,text:i}}async function Zi(e){let t=await e.listPending(`pending`);return{message:[`Pending memory candidates:`,...t.length>0?t.map(e=>`- ${e.id} ${e.type}/${e.topic} confidence=${e.confidence}: ${e.text}`):[`(no pending memory candidates)`]].join(`
47
- `),success:!0,data:{count:t.length}}}function Qi(t,n){(0,e.recordCommandMemoryEvent)(t,n)}async function $i(t,n,r){if(!r)return B();try{let{record:i,saved:a}=await(0,e.approvePendingMemoryCandidate)(n,r);return Qi(t,{type:`memory_candidate_approved`,candidateId:i.id,topic:i.topic,reason:`approved-by-user`}),Qi(t,{type:`memory_candidate_saved`,candidateId:i.id,topic:i.topic,reason:a.deduplicated?`deduplicated`:`approved-and-saved`}),{message:a.deduplicated?`Saved memory candidate ${r} was already present in ${a.topicPath}`:`Saved memory candidate ${r} to ${a.topicPath}`,success:!0,data:{id:r,status:i.status,topic:a.topic,topicPath:a.topicPath,deduplicated:a.deduplicated}}}catch(e){return qi(e instanceof Error?e:String(e))}}async function ea(e,t,n){if(!n)return B();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return Qi(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 qi(e instanceof Error?e:String(e))}}function ta(t){let n=(0,e.listCommandUsedMemoryReferences)(t);return{message:[`Used memory references:`,...n.length>0?n.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
48
- `),success:!0,data:{count:n.length,references:[...n]}}}async function na(t,n){let r=n.trim().split(/\s+/).filter(Boolean),i=r[0]??`list`,a=(0,e.createCommandMemoryStores)(t);if(i===`list`)return Ji(a);if(i===`show`)return Yi(a,r[1]);if(i===`pending`)return Zi(a);if(i===`approve`)return $i(t,a,r[1]);if(i===`reject`)return ea(t,a,r[1]);if(i===`used`)return ta(t);if(i===`add`){let t=Xi(r);if(!t)return B();if((0,e.hasSensitiveCommandMemoryContent)(t.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let n=await a.append(t);return{message:n.deduplicated?`${t.type} memory already exists in ${n.topicPath}`:`Saved ${t.type} memory to ${n.topicPath}`,success:!0,data:{indexPath:n.indexPath,topicPath:n.topicPath,topic:n.topic,deduplicated:n.deduplicated}}}return B()}function ra(){return{name:`memory`,displayName:`Memory`,description:e.MEMORY_COMMAND_DESCRIPTION,modelDescription:"Read and write this project’s durable memory. Use `list` or `show [topic]` to look up stored conventions, preferences or references before asking the user again; `add <type> <topic> <text>` to save a durable preference, project convention, feedback item or reference worth reusing across sessions (never secrets, credentials or transient facts); `pending` to see candidates awaiting the user’s review; `used` to report which memory items informed this turn. Bare lists topics. 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:e.MEMORY_COMMAND_ARGUMENT_HINT,modelInvocable:!0,safety:`write`,subcommands:(0,e.buildMemoryCommandSubcommands)()}}function ia(){let e=ra();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:na}}var aa=class{name=`memory`;getCommands(){return[ra()]}};function oa(){return{name:`agent-command-memory`,commandSources:[new aa],systemCommands:[ia()]}}function sa(t,n){try{(0,e.writeCommandPermissionMode)(t,n);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function ca(t,n){let r=(0,e.retryCommandPermissionDenial)(t,Number(n.trim().split(/\s+/)[1]));return r===void 0?{message:`Usage: /permissions retry <n>, where <n> numbers a call blocked by the auto-mode classifier in /permissions.`,success:!1}:{message:`${r.argument===void 0?r.toolName:`${r.toolName}(${r.argument})`} will run once, without the classifier, when the model tries it again.`,success:!0}}function la(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===`retry`)return ca(t,n);if(r!==void 0){if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let n=sa(t,r);if(n!==void 0)return n;let i=(0,e.readCommandPermissionsState)(t);return{message:`Permission mode set to: ${r}\n${(0,e.formatCommandPermissionsMessage)(i)}`,success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}let i=(0,e.readCommandPermissionsState)(t);return{message:(0,e.formatCommandPermissionsMessage)(i),success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}async function ua(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildPermissionModeSubcommands)().map(e=>({value:e.name,label:e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`mode`,`Select interaction mode`,i));return a.type===`answer`?a.values[0]:void 0}async function da(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===void 0&&(r=await ua(t),r===void 0)){let n=(0,e.readCommandPermissionMode)(t);return{message:`Current mode: ${n}`,success:!0,data:{mode:n}}}if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let i=sa(t,r);return i===void 0?{message:`Permission mode set to: ${r}`,success:!0,data:{mode:r}}:i}function fa(){return{name:`mode`,displayName:`Interaction Mode`,description:e.PERMISSION_MODE_COMMAND_DESCRIPTION,source:`mode`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`mode`),modelInvocable:!1}}function pa(){let e=fa();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:da}}var ma=class{name=`mode`;getCommands(){return[fa()]}};function ha(){return{name:`agent-command-mode`,commandSources:[new ma],systemCommands:[pa()]}}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 ga(e){return V.some(t=>t.mode===e)}function _a(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 va(e,n){let r=e.getUserInteraction();if(!r)return;let i=V.map(({mode:e,description:t})=>({value:e,label:e===n?`${e} (current)`:e,description:t})),a=await r.ask((0,t.selectAction)(`sandbox`,`Sandbox mode`,i));return a.type===`answer`?a.values[0]:void 0}async function ya(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 va(e,r.mode);if(i===void 0||i===``)return{message:_a(r),success:!0,data:{...r}};if(!ga(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${_a(a)}`,success:!0,data:{...a}}}const ba=V.map(e=>e.mode).join(` | `);function xa(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:ba,subcommands:V.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function Sa(){let e=xa();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:ya}}var Ca=class{name=`sandbox`;getCommands(){return[xa()]}};function wa(){return{name:`agent-command-sandbox`,commandSources:[new Ca],systemCommands:[Sa()]}}function Ta(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function Ea(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 Da(e,t){let n=e.getActiveOutputStyleId(),r=t.listOutputStyles();return{success:!0,message:Ea(n,t),data:{outputStyles:r,active:n}}}async function Oa(e,n){let r=e.getUserInteraction();if(!r)return;let i=n.listOutputStyles().map(e=>({value:e.id,label:e.id,description:e.description})),a=await r.ask((0,t.selectAction)(`output-style`,`Select an output style`,i));return a.type===`answer`?a.values[0]:void 0}async function ka(e,t){let n=Ta(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 Oa(e,n)??``,!r))return Da(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 Aa(){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 ja(){let e=Aa();return{name:e.name,displayName:e.displayName,description:e.description,argumentHint:e.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:ka}}var Ma=class{name=`output-style`;getCommands(){return[Aa()]}};function Na(){return{name:`agent-command-output-style`,commandSources:[new Ma],systemCommands:[ja()]}}const Pa=/^[a-zA-Z0-9_-]{1,64}$/u;function Fa(e){let t=Object.entries(e).filter(([,e])=>(e??0)>0);return t.length===0?`none`:t.map(([e,t])=>`${e} ${t}`).join(`, `)}function Ia(e){let{counters:t}=e;return` ${e.grantId} ${e.principal} ${e.state} accepted ${t.accepted}; refused: ${Fa(t.refused)}; settled: ${Fa(t.settled)}`}async function La(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(Ia).join(`
51
- `)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!Pa.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 Ra(){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 za(){let e=Ra();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)=>La(e,t)}}var Ba=class{name=`events`;getCommands(){return[Ra()]}};function Va(){return{name:`agent-command-events`,commandSources:[new Ba],systemCommands:[za()]}}function Ha(e){return e.liveness!==`dead`}function Ua(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?``:Ga(e)}${r}${n}`}function Wa(e){let t=e.locality===`same-host`?`on this machine`:`on another machine`;return` ${e.deviceId}${e.name?` ${e.name}`:``} ${t}`}function Ga(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 Ka(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 qa(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 Ja(e,t){if(e.send===void 0)return{message:`This environment can discover other sessions but cannot address them.`,success:!1};let n=Ka(t);return n===void 0?{message:`Usage: /peers send <session-id> <message>. Run /peers for the session ids.`,success:!1}:qa(await e.send(n.target,n.text),n.target)}async function Ya(e,t,n){if(e.prepareFile===void 0)return{message:`This environment cannot send files to other sessions.`,success:!1};let r=Ka(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 Xa(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 Ya(n,r.slice(i[0].length),e.getCwd?.()??``);let a=/^send(?=\s|$)/.exec(r);if(a!==null)return Ja(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(Wa).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(Ha);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=>Ua(e,c)).join(`
53
- `)}`];o.length>0&&u.push(`Linked devices:\n${o.map(Wa).join(`
45
+ `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function Ai(e,t){if(!t||t===`index`){let t=await e.loadStartupMemory();return{message:t.content||`(empty memory index)`,success:!0,data:{path:t.path,lineCount:t.lineCount,truncated:t.truncated}}}return{message:await e.readTopic(t)||`(empty memory topic: ${t})`,success:!0,data:{topic:t}}}function ji(t){let n=t[1],r=t[2],i=t.slice(3).join(` `).trim();if(!(!n||!(0,e.isCommandMemoryType)(n)||!r||i.length===0))return{type:n,topic:r,text:i}}async function Mi(e){let t=await e.listPending(`pending`);return{message:[`Pending memory candidates:`,...t.length>0?t.map(e=>`- ${e.id} ${e.type}/${e.topic} confidence=${e.confidence}: ${e.text}`):[`(no pending memory candidates)`]].join(`
46
+ `),success:!0,data:{count:t.length}}}function Ni(t,n){(0,e.recordCommandMemoryEvent)(t,n)}async function Pi(t,n,r){if(!r)return I();try{let{record:i,saved:a}=await(0,e.approvePendingMemoryCandidate)(n,r);return Ni(t,{type:`memory_candidate_approved`,candidateId:i.id,topic:i.topic,reason:`approved-by-user`}),Ni(t,{type:`memory_candidate_saved`,candidateId:i.id,topic:i.topic,reason:a.deduplicated?`deduplicated`:`approved-and-saved`}),{message:a.deduplicated?`Saved memory candidate ${r} was already present in ${a.topicPath}`:`Saved memory candidate ${r} to ${a.topicPath}`,success:!0,data:{id:r,status:i.status,topic:a.topic,topicPath:a.topicPath,deduplicated:a.deduplicated}}}catch(e){return Di(e instanceof Error?e:String(e))}}async function Fi(e,t,n){if(!n)return I();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return Ni(e,{type:`memory_candidate_rejected`,candidateId:r.id,topic:r.topic,reason:`rejected-by-user`}),{message:`Rejected memory candidate ${n}`,success:!0,data:{id:n,status:r.status}}}catch(e){return Di(e instanceof Error?e:String(e))}}function Ii(t){let n=(0,e.listCommandUsedMemoryReferences)(t);return{message:[`Used memory references:`,...n.length>0?n.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
47
+ `),success:!0,data:{count:n.length,references:[...n]}}}function Li(e){return((e.getCommandHostAdapters?.().permissionMode)?.getPermissionMode()??e.getSession?.().getPermissionMode())===`plan`}async function Ri(t,n){let r=n.trim().split(/\s+/).filter(Boolean),i=r[0]??`list`,a=Oi(t);if(!a.ok)return a.result;let o=a.store;if(i===`list`)return ki(o);if(i===`show`)return Ai(o,r[1]);if(i===`pending`)return Mi(o);if(i===`approve`)return Pi(t,o,r[1]);if(i===`reject`)return Fi(t,o,r[1]);if(i===`used`)return Ii(t);if(i===`add`){if(t.getCommandInvocationSource()===`model`&&Li(t))return{message:`Plan mode saves no memory. Save it after plan mode ends.`,success:!1};let n=ji(r);if(!n)return I();if((0,e.hasSensitiveCommandMemoryContent)(n.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let i=await o.append(n);return{message:i.deduplicated?`${n.type} memory already exists in ${i.topicPath}`:`Saved ${n.type} memory to ${i.topicPath}`,success:!0,data:{indexPath:i.indexPath,topicPath:i.topicPath,topic:i.topic,deduplicated:i.deduplicated}}}return I()}function zi(){return{name:`memory`,displayName:`Memory`,description:e.MEMORY_COMMAND_DESCRIPTION,modelDescription:"Read and write this project’s durable memory. Use `list` or `show [topic]` to look up stored conventions, preferences or references before asking the user again; `add <type> <topic> <text>` to save a durable preference, project convention, feedback item or reference worth reusing across sessions (never secrets, credentials or transient facts); `pending` to see candidates awaiting the user’s review; `used` to report which memory items informed this turn. Bare lists topics. In plan mode `add` is refused: save after plan mode ends. Returns the requested topics or entries, or a confirmation of what was saved. Approving or rejecting a pending candidate is the user’s review: suggest `/memory approve <id>` or `/memory reject <id>`.",source:`memory`,argumentHint:e.MEMORY_COMMAND_ARGUMENT_HINT,modelInvocable:!0,safety:`write`,subcommands:(0,e.buildMemoryCommandSubcommands)()}}function Bi(){let e=zi();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:Ri}}var Vi=class{name=`memory`;getCommands(){return[zi()]}};function Hi(){return{name:`agent-command-memory`,commandSources:[new Vi],systemCommands:[Bi()]}}function Ui(t,n){try{(0,e.writeCommandPermissionMode)(t,n);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function Wi(t,n){let r=(0,e.retryCommandPermissionDenial)(t,Number(n.trim().split(/\s+/)[1]));return r===void 0?{message:`Usage: /permissions retry <n>, where <n> numbers a call blocked by the auto-mode classifier in /permissions.`,success:!1}:{message:`${r.argument===void 0?r.toolName:`${r.toolName}(${r.argument})`} will run once, without the classifier, when the model tries it again.`,success:!0}}function Gi(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===`retry`)return Wi(t,n);if(r!==void 0){if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let n=Ui(t,r);if(n!==void 0)return n;let i=(0,e.readCommandPermissionsState)(t);return{message:`Permission mode set to: ${r}\n${(0,e.formatCommandPermissionsMessage)(i)}`,success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}let i=(0,e.readCommandPermissionsState)(t);return{message:(0,e.formatCommandPermissionsMessage)(i),success:!0,data:{mode:i.mode,sessionAllowed:i.sessionAllowed}}}async function Ki(n){let r=n.getUserInteraction();if(!r)return;let i=(0,e.buildPermissionModeSubcommands)().map(e=>({value:e.name,label:e.displayName??e.name,description:e.description})),a=await r.ask((0,t.selectAction)(`mode`,`Select interaction mode`,i));return a.type===`answer`?a.values[0]:void 0}async function qi(t,n){let r=(0,e.parsePermissionModeArgument)(n);if(r===void 0&&(r=await Ki(t),r===void 0)){let n=(0,e.readCommandPermissionMode)(t);return{message:`Current mode: ${n}`,success:!0,data:{mode:n}}}if(!(0,e.isPermissionMode)(r))return{message:(0,e.formatInvalidPermissionModeMessage)(),success:!1};let i=Ui(t,r);return i===void 0?{message:`Permission mode set to: ${r}`,success:!0,data:{mode:r}}:i}function Ji(){return{name:`mode`,displayName:`Interaction Mode`,description:e.PERMISSION_MODE_COMMAND_DESCRIPTION,source:`mode`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`mode`),modelInvocable:!1}}function Yi(){let e=Ji();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:qi}}var Xi=class{name=`mode`;getCommands(){return[Ji()]}};function Zi(){return{name:`agent-command-mode`,commandSources:[new Xi],systemCommands:[Yi()]}}function Qi(e,t){return e.getSession().getModelId()??t?.model??``}function $i(t,n,r,i){let a=n.currentProvider===void 0?void 0:n.providers?.[n.currentProvider];return(0,e.buildModelListSnapshot)(n.providers,n.currentProvider,Qi(t,a),r.providerDefinitions,i?r.orgPolicy?.allowedProviders:void 0)}async function ea(t,n,r){let i=r.settings.readMergedSettings(),a=n.trim();if(a.length===0){let e=$i(t,i,r,!0);return ta(t.getUserInteraction(),e,t,r)}let o=(0,e.resolveModelListSelection)($i(t,i,r,!1),a);return o===void 0?{message:`Unknown model "${a}". Run /model to see the choices.`,success:!1}:o.profileName===i.currentProvider?ia(t,o,i,r):aa(o,i,r)}async function ta(e,n,r,i){if(n.groups.length===0)return{message:`No provider profiles configured. Run /provider add to add one.`,success:!0};if(!e)return{message:na(n),success:!0};let a=n.groups.flatMap(e=>e.models.map(t=>({value:t.id,label:ra(n,e.profileName,e.providerLabel,t)}))),o=await e.ask((0,t.selectAction)(`model`,`Select model`,a,{maxVisible:8}));return o.type!==`answer`||o.values[0]===void 0?{message:`Model selection cancelled.`,success:!0}:ea(r,o.values[0],i)}function na(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 ra(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 ia(t,n,r,i){let a=n.profileName;try{await t.getSession().applyModelOptions({model:n.model.id})}catch(e){return{message:`Could not switch to "${n.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let o=i.settings.readTargetSettings(),s=r.providers?.[a]??o.providers?.[a]??{};return i.settings.writeTargetSettings((0,e.upsertProviderProfile)(o,a,{...s,model:n.model.id})),{message:`Model: ${n.model.label}`,success:!0}}function aa(t,n,r){let{orgPolicy:i}=r;if(i?.allowedProviders&&!i.allowedProviders.includes(t.profileName))return{message:(0,e.formatOrgPolicyViolationMessage)(`Provider "${t.profileName}" is not allowed by your organization policy. Allowed: ${i.allowedProviders.join(`, `)}.`,i.adminContact),success:!1};let a=n.providers?.[t.profileName];if(a===void 0)return{message:`Provider profile "${t.profileName}" was not found.`,success:!1};let o={...a,model:t.model.id};try{(0,e.validateProviderProfile)(t.profileName,o,{providerDefinitions:r.providerDefinitions})}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let s=r.settings.readTargetSettings(),c=r.settings.readMergedSettings(),l=(0,e.upsertProviderProfile)(s,t.profileName,o),u=s.providers?.[t.profileName]!==void 0||c.providers?.[t.profileName]!==void 0?{...l,currentProvider:t.profileName}:(0,e.setCurrentProvider)(l,t.profileName);return r.settings.writeTargetSettings(u),{message:`Model: ${t.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t.profileName}]}}function oa(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function sa(e){let t=oa();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)=>ea(t,n,e)}}var ca=class{name=`model`;getCommands(){return[oa()]}};function la(e){return{name:`agent-command-model`,commandSources:[new ca],systemCommands:[sa(e)]}}const L=[{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 ua(e){return L.some(t=>t.mode===e)}function da(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 fa(e,n){let r=e.getUserInteraction();if(!r)return;let i=L.map(({mode:e,description:t})=>({value:e,label:e===n?`${e} (current)`:e,description:t})),a=await r.ask((0,t.selectAction)(`sandbox`,`Sandbox mode`,i));return a.type===`answer`?a.values[0]:void 0}async function pa(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 fa(e,r.mode);if(i===void 0||i===``)return{message:da(r),success:!0,data:{...r}};if(!ua(i))return{message:`Unknown sandbox mode "${i}". Valid: ${L.map(e=>e.mode).join(` | `)}`,success:!1};n.setMode(i);let a=n.status();return{message:`Sandbox mode set to: ${i}\n${da(a)}`,success:!0,data:{...a}}}const ma=L.map(e=>e.mode).join(` | `);function ha(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:ma,subcommands:L.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function ga(){let e=ha();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:pa}}var _a=class{name=`sandbox`;getCommands(){return[ha()]}};function va(){return{name:`agent-command-sandbox`,commandSources:[new _a],systemCommands:[ga()]}}function ya(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function ba(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 xa(e,t){let n=e.getActiveOutputStyleId(),r=t.listOutputStyles();return{success:!0,message:ba(n,t),data:{outputStyles:r,active:n}}}async function Sa(e,n){let r=e.getUserInteraction();if(!r)return;let i=n.listOutputStyles().map(e=>({value:e.id,label:e.id,description:e.description})),a=await r.ask((0,t.selectAction)(`output-style`,`Select an output style`,i));return a.type===`answer`?a.values[0]:void 0}async function Ca(e,t){let n=ya(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 Sa(e,n)??``,!r))return xa(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 wa(){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 Ta(){let e=wa();return{name:e.name,displayName:e.displayName,description:e.description,argumentHint:e.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Ca}}var Ea=class{name=`output-style`;getCommands(){return[wa()]}};function Da(){return{name:`agent-command-output-style`,commandSources:[new Ea],systemCommands:[Ta()]}}const Oa=/^[a-zA-Z0-9_-]{1,64}$/u;function ka(e){let t=Object.entries(e).filter(([,e])=>(e??0)>0);return t.length===0?`none`:t.map(([e,t])=>`${e} ${t}`).join(`, `)}function Aa(e){let{counters:t}=e;return` ${e.grantId} ${e.principal} ${e.state} accepted ${t.accepted}; refused: ${ka(t.refused)}; settled: ${ka(t.settled)}`}async function ja(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(Aa).join(`
51
+ `)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!Oa.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 Ma(){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 Na(){let e=Ma();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)=>ja(e,t)}}var Pa=class{name=`events`;getCommands(){return[Ma()]}};function Fa(){return{name:`agent-command-events`,commandSources:[new Pa],systemCommands:[Na()]}}function Ia(e){return e.liveness!==`dead`}function La(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?``:za(e)}${r}${n}`}function Ra(e){let t=e.locality===`same-host`?`on this machine`:`on another machine`;return` ${e.deviceId}${e.name?` ${e.name}`:``} ${t}`}function za(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 Ba(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 Va(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 Ha(e,t){if(e.send===void 0)return{message:`This environment can discover other sessions but cannot address them.`,success:!1};let n=Ba(t);return n===void 0?{message:`Usage: /peers send <session-id> <message>. Run /peers for the session ids.`,success:!1}:Va(await e.send(n.target,n.text),n.target)}async function Ua(e,t,n){if(e.prepareFile===void 0)return{message:`This environment cannot send files to other sessions.`,success:!1};let r=Ba(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 Wa(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 Ua(n,r.slice(i[0].length),e.getCwd?.()??``);let a=/^send(?=\s|$)/.exec(r);if(a!==null)return Ha(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(Ra).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(Ia);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=>La(e,c)).join(`
53
+ `)}`];o.length>0&&u.push(`Linked devices:\n${o.map(Ra).join(`
54
54
  `)}`);let d=o.length>0?`<session-or-device-id>`:`<session-id>`;return{message:`${u.join(`
55
55
 
56
- `)}\n\nSend to one: /peers send ${d} <message>\nSend a file: /peers send-file ${d} <path>`,success:!0}}function Za(){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 Qa(){let e=Za();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Xa(e,t)}}var $a=class{name=`peers`;getCommands(){return[Za()]}};function eo(){return{name:`agent-command-peers`,commandSources:[new $a],systemCommands:[Qa()]}}function to(){return{name:`permissions`,displayName:`Permissions`,description:e.PERMISSIONS_COMMAND_DESCRIPTION,source:`permissions`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`permissions`),modelInvocable:!1}}function no(){let e=to();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:la}}var ro=class{name=`permissions`;getCommands(){return[to()]}};function io(){return{name:`agent-command-permissions`,commandSources:[new ro],systemCommands:[no()]}}function ao(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 oo(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`help`)return{message:`Usage:
56
+ `)}\n\nSend to one: /peers send ${d} <message>\nSend a file: /peers send-file ${d} <path>`,success:!0}}function Ga(){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 Ka(){let e=Ga();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:(e,t)=>Wa(e,t)}}var qa=class{name=`peers`;getCommands(){return[Ga()]}};function Ja(){return{name:`agent-command-peers`,commandSources:[new qa],systemCommands:[Ka()]}}function Ya(){return{name:`permissions`,displayName:`Permissions`,description:e.PERMISSIONS_COMMAND_DESCRIPTION,source:`permissions`,argumentHint:e.PERMISSION_MODE_ARGUMENT_HINT,subcommands:(0,e.buildPermissionModeSubcommands)(`permissions`),modelInvocable:!1}}function Xa(){let e=Ya();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Gi}}var Za=class{name=`permissions`;getCommands(){return[Ya()]}};function Qa(){return{name:`agent-command-permissions`,commandSources:[new Za],systemCommands:[Xa()]}}function $a(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 eo(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`help`)return{message:`Usage:
58
58
  /plan <objective> draft a plan for review (stays read-only until approved)
59
59
  /plan status show the current plan and phase
60
60
  /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:ao(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 so(){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 co(){let e=so();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:oo}}var lo=class{name=`plan`;getCommands(){return[so()]}};function uo(){return{name:`agent-command-plan`,commandSources:[new lo],systemCommands:[co()]}}function fo(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function po(e){return{success:!1,message:e}}function mo(t){return(0,e.resolvePluginCommandAdapter)(t)}async function H(e,t){let n=mo(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 ho(e,t){let{subcommand:n,subArgs:r}=fo(t);return n===`add`&&r.length>0?H(e,async e=>{let t=await e.marketplaceAdd(r);return`Added marketplace: "${t}" (from ${r})\nInstall plugins with: /plugin install <name>@${t}`}):n===`remove`&&r.length>0?H(e,async e=>(await e.marketplaceRemove(r),`Removed marketplace "${r}" and uninstalled its plugins.`)):n===`update`&&r.length>0?H(e,async e=>(await e.marketplaceUpdate(r),`Updated marketplace "${r}".`)):n===`list`?H(e,async e=>{let t=await e.marketplaceList();return t.length===0?`No marketplace sources configured.`:`Marketplace sources:\n${t.map(e=>` ${e.name} (${e.type})`).join(`
62
- `)}`}):po(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function U(e,t,n,r){return t.length===0?Promise.resolve(po(n)):H(e,e=>Promise.resolve(r(e,t)))}function go(){return{success:!0,message:`Opening plugin manager...`,uiIntents:[(0,e.createShowPluginManagerIntent)()]}}function _o(e,t){return U(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function vo(e,t){return U(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}function yo(e,t){return U(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function bo(e,t){return U(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function xo(e,t){let{subcommand:n,subArgs:r}=fo(t);switch(n){case``:case`manage`:return go();case`install`:return _o(e,r);case`uninstall`:return vo(e,r);case`enable`:return yo(e,r);case`disable`:return bo(e,r);case`marketplace`:return ho(e,r);default:return po(`Unknown plugin subcommand: ${n}`)}}async function So(e,t){return H(e,async e=>{let t=await e.reloadPlugins();return`Reloaded ${t.loadedPluginCount===1?`1 plugin resource`:`${t.loadedPluginCount} plugin resources`}.`}).then(e=>e.success?{...e,data:{...e.data,pluginRegistryReloaded:!0}}:e)}function Co(){return{name:`plugin`,displayName:`Plugins`,description:e.PLUGIN_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1,argumentHint:e.PLUGIN_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildPluginCommandSubcommands)()}}function wo(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:e.RELOAD_PLUGINS_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1}}function To(){let e=Co();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:xo}}function Eo(){let e=wo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:So}}var Do=class{name=`plugin-manager`;getCommands(){return[Co(),wo()]}};function Oo(){return{name:`agent-command-plugin`,commandSources:[new Do],systemCommands:[To(),Eo()]}}function ko(e){return e.getCommandHostAdapters?.().presetRegistry??(0,c.createPresetRegistry)()}function Ao(e){return e.getSession().getActivePresetId()}function jo(e,t){return[`Available presets:`,...t.listPresets().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
63
- `)}function Mo(e,t){return`Unknown preset: ${e}. Available: ${t.listPresets().map(e=>e.id).join(`, `)}`}function No(e,t){let n=Ao(e);return{message:jo(n,t),success:!0,data:{presets:t.listPresets(),active:n}}}async function Po(e,n){let r=e.getUserInteraction();if(!r)return;let i=n.listPresets().map(e=>({value:e.id,label:e.id,description:e.description})),a=await r.ask((0,t.selectAction)(`preset`,`Select a preset`,i));return a.type===`answer`?a.values[0]:void 0}async function Fo(t,n){let r=ko(t),i=n.trim().split(/\s+/)[0];if(i===`list`||(i===void 0||i.length===0)&&(i=await Po(t,r),i===void 0))return No(t,r);if(r.getPreset(i)===void 0)return{message:Mo(i,r),success:!1};let a=r.resolvePreset(i),o=await(0,e.applyPresetToSession)(t,i,a),s=o.unknownCommandModules.map(({name:e,kind:t})=>`Preset command-module "${e}" (${t}) matched no module — expected the agent-command-* form; ignored.`);return{message:[`Switched to preset: ${i}`,...s].join(`
64
- `),success:!0,data:{preset:i,unknownCommandModules:o.unknownCommandModules}}}function Io(e=`preset`){return(0,c.createPresetRegistry)().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function Lo(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:Io(`preset`),modelInvocable:!1}}function Ro(){let e=Lo();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:Fo}}var zo=class{name=`preset`;getCommands(){return[Lo()]}};function Bo(){return{name:`agent-command-preset`,commandSources:[new zo],systemCommands:[Ro()]}}function W(e,t,n={}){let r=Zo(e,t);return{type:e,steps:es(Qo(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 Vo(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${qo(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
65
- `)}function Ho(e,n){let r=e.trim(),i=r.length>0?r:`1`,a=Yo(i);if(a!==void 0){let e=n[a];if(e!==void 0)return e.type;throw Error(`Provider selection ${i} is out of range. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`)}let o=(0,t.findProviderDefinition)(n,i);if(o===void 0)throw Error(`Unknown provider: ${i}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return o.type}function G(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 Uo(e,t){let n=G(e),r=t.trim()||n.defaultValue||``,i=Xo(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:ts(a)}}async function Wo(e,t,n,r={}){let i=W(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=G(i),n=await t(Go(e,i.setupHelpLinks),e.masked===!0),r=Uo(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 Go(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Jo(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Ko={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function qo(e){let t=`${e.category===void 0?``:`${Ko[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Jo(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${$o(e.kind)}: ${e.label} - ${e.url}`).join(`
66
- `)}function Yo(e){if(/^\d+$/.test(e))return Number(e)-1}function Xo(e,t){if(e.required===!0&&t.length===0)return`Required`}function Zo(e,n){let r=(0,t.findProviderDefinition)(n,e);if(r===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return r}function Qo(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 $o(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function es(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 ts(t){let n=t.profileName??(0,e.suggestProviderProfileName)({type:t.type},{existingProfileNames:t.existingProfileNames}),r=t.values.apiKey;return{profile:n,type:t.type,model:t.values.model,...r!==void 0&&r.length>0&&{apiKey:r},...t.values.baseURL!==void 0&&{baseURL:t.values.baseURL},setCurrent:t.setCurrent??!0}}const ns={type:`session-restart`,reason:`other`};function rs(e,t){return W(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function is(e,n){let r=G(e),i=r.masked===!0&&r.defaultValue!==void 0?`(unchanged)`:r.defaultValue,a=Jo(e.setupHelpLinks),o=[n,a.length>0?a:void 0].filter(e=>e!==void 0&&e.length>0).join(`
67
- `)||void 0;return(0,t.textAction)(`provider-setup-${r.key}`,r.title,{description:o,placeholder:i,allowEmpty:r.defaultValue!==void 0,masked:r.masked})}async function as(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(is(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Uo(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 os(e,t,n){return as(e,t,e=>ss(e,n),`Provider setup cancelled.`)}function ss(t,n){let r=n.settings.readTargetSettings(),i=(0,e.buildProviderSetupPatch)(t,{providerDefinitions:n.providerDefinitions});return n.settings.writeTargetSettings((0,e.mergeProviderPatch)(r,i)),{message:`Provider ${t.profile} configured. Restarting...`,success:!0,hostActions:[{...ns,message:`Provider setup restart`}]}}function cs(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function ls(t,n,r){if(!n)return{message:`Usage: /provider switch <profile>`,success:!1};if(!t?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:i}=r;if(i?.allowedProviders&&!i.allowedProviders.includes(n))return{message:(0,e.formatOrgPolicyViolationMessage)(`Provider "${n}" is not allowed by your organization policy. Allowed: ${i.allowedProviders.join(`, `)}.`,i.adminContact),success:!1};if(r.settings.readMergedSettings().currentProvider===n)return{message:`Already using provider "${n}".`,success:!0};let a=t[n],o=r.settings.readTargetSettings(),s=r.settings.readMergedSettings(),c=o.providers?.[n]!==void 0||s.providers?.[n]!==void 0?{...o,currentProvider:n}:(0,e.setCurrentProvider)(o,n);return r.settings.writeTargetSettings(c),{message:`Switched to ${n} (${a.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:n}]}}async function us(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=W(r.type,n.providerDefinitions,{profileName:t,setCurrent:!1,initialValues:ds(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return as(e,i,e=>fs(e,t,n),`Provider edit cancelled.`)}function ds(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function fs(t,n,r){let i=r.settings.readMergedSettings(),a=i.providers?.[n];if(!a)return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:o}=r;if(o?.requireApiKeyFromEnv&&(0,e.isApiKeyPlaintext)(t.apiKey))return{message:(0,e.formatOrgPolicyViolationMessage)(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,o.adminContact),success:!1};let s=r.settings.readTargetSettings(),c=(0,e.buildProviderSetupPatch)(t,{providerDefinitions:r.providerDefinitions}).providers[n];if(!c)return{message:`Provider profile "${n}" was not updated.`,success:!1};r.settings.writeTargetSettings((0,e.upsertProviderProfile)(s,n,{...a,...c}));let l=i.currentProvider===n;return{message:l?`Provider ${n} updated. Switching...`:`Provider ${n} updated.`,success:!0,...l?{hostActions:[{type:`provider-hot-swap`,profileName:n}]}:{}}}const ps={type:`session-restart`,reason:`other`};async function ms(e,n,r){let i=r.settings.readMergedSettings();if(!i.providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let a=bs(n,Object.keys(i.providers)),o;for(;;){let i=await e.ask((0,t.textAction)(`provider-duplicate`,`Duplicate ${n} as`,{description:o,placeholder:a,allowEmpty:!0}));if(i.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let s=i.text??``,c=hs(s,a,r);if(c!==void 0){o=c;continue}return gs(n,s,a,r)}}function hs(e,t,n){let r=xs(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function gs(t,n,r,i){let a=i.settings.readMergedSettings().providers?.[t];if(!a)return{message:`Provider profile "${t}" was not found.`,success:!1};let o=xs(n,r),s=hs(o,r,i);return s===void 0?(i.settings.writeTargetSettings((0,e.upsertProviderProfile)(i.settings.readTargetSettings(),o,{...a})),{message:`Provider profile duplicated: ${t} -> ${o}.`,success:!0}):{message:s,success:!1}}async function _s(e,n,r){let i=r.settings.readMergedSettings().providers??{};return i[n]?Object.keys(i).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(0,t.isConfirmed)(await e.ask((0,t.confirmAction)(`provider-delete`,`Delete provider profile ${n}?`)))?vs(e,n,r):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${n}" was not found.`,success:!1}}async function vs(n,r,i){let a=i.settings.readMergedSettings();if(a.currentProvider!==r)return i.settings.writeTargetSettings((0,e.deleteProviderProfile)(i.settings.readTargetSettings(),r)),{message:`Provider profile deleted: ${r}.`,success:!0};let o=Object.entries(a.providers??{}).filter(([e])=>e!==r).map(([e,t])=>({value:e,label:cs(e,t,a.currentProvider)})),s=await n.ask((0,t.selectAction)(`provider-delete-replacement`,`Replacement provider for ${r}`,o,{maxVisible:8}));return s.type!==`answer`||s.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:ys(r,s.values[0],i)}function ys(t,n,r){if(r.settings.readMergedSettings().providers?.[n]===void 0||n===t)return{message:`Provider profile "${n}" was not found.`,success:!1};let i=(0,e.deleteProviderProfile)(r.settings.readTargetSettings(),t);return r.settings.writeTargetSettings({...i,currentProvider:n}),{message:`Provider profile deleted: ${t}. Restarting with ${n}...`,success:!0,hostActions:[{...ps,message:`Provider delete restart`}]}}function bs(t,n){let r=(0,e.sanitizeProviderProfileName)(`${t}-copy`)??`provider-copy`;if(!n.includes(r))return r;for(let e=2;e<1e3;e+=1){let t=`${r}-${e}`;if(!n.includes(t))return t}return`${r}-${Date.now()}`}function xs(t,n){return(0,e.sanitizeProviderProfileName)(t.trim()||n)??``}const Ss=`switch`,Cs=`edit`,ws=`test`,Ts=`duplicate`,Es=`delete`,Ds=`cancel`;async function Os(e,n,r,i){let a=Object.entries(r??{}).map(([e,t])=>({value:e,label:cs(e,t,n)})),o=await e.ask((0,t.selectAction)(`provider-profile`,`Select provider profile`,a,{maxVisible:8}));return o.type!==`answer`||o.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:ks(e,o.values[0],i)}async function ks(e,n,r){if(!r.settings.readMergedSettings().providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let i=await e.ask((0,t.selectAction)(`provider-profile-action`,`Provider profile: ${n}`,[{value:Ss,label:`Switch`},{value:Cs,label:`Edit`},{value:ws,label:`Test`},{value:Ts,label:`Duplicate`},{value:Es,label:`Delete`},{value:Ds,label:`Cancel`}]));return i.type!==`answer`||i.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:As(e,n,i.values[0],r)}async function As(t,n,r,i){let a=i.settings.readMergedSettings();switch(r){case Ss:return ls(a.providers,n,i);case Cs:return us(t,n,i);case ws:return(0,e.testProviderProfileCommand)(a.currentProvider,a.providers,n,i);case Ts:return ms(t,n,i);case Es:return _s(t,n,i);case Ds:return{message:`Provider profile action cancelled.`,success:!0};default:return{message:`Unknown provider profile action "${r}".`,success:!1}}}async function js(t,n,r){let i=t.getUserInteraction(),a=r.settings.readMergedSettings(),o=n.trim();if(o.length===0)return Ms(i,a.currentProvider,a.providers,r);let[s=`current`,c]=o.split(/\s+/);return s===`list`?Ms(i,a.currentProvider,a.providers,r):s===`current`||s===``?{message:Ps(a.currentProvider,a.providers),success:!0}:s===`switch`?ls(a.providers,c,r):s===`test`?(0,e.testProviderProfileCommand)(a.currentProvider,a.providers,c,r):s===`add`?Fs(i,c,r):{message:`Usage: provider [current|list|switch <profile>|add <type>|test [profile]]`,success:!1}}function Ms(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Ns(t,n),success:!0}:Os(e,t,n,r)}function Ns(e,t){let n=Object.entries(t??{});return n.length===0?`No provider profiles configured.`:n.map(([t,n])=>`${t===e?`*`:`-`} ${t}: ${n.type??`unknown`} ${n.model??`(no model)`}`).join(`
68
- `)}function Ps(e,t){if(!e)return`No current provider configured.`;let n=t?.[e];return n?[`Current provider: ${e}`,`Type: ${n.type??`unknown`}`,`Model: ${n.model??`(no model)`}`,...n.baseURL?[`Base URL: ${n.baseURL}`]:[]].join(`
69
- `):`Current provider "${e}" was not found in providers.`}function Fs(e,n,r){return n===void 0||n.length===0?e?Is(e,r):{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:(0,t.findProviderDefinition)(r.providerDefinitions,n)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:e?os(e,rs(n,r),r):{message:`Provider setup for "${n}" requires an interactive session.`,success:!1}}async function Is(e,n){let r=n.providerDefinitions.map(e=>({value:e.type,label:qo(e)})),i=await e.ask((0,t.selectAction)(`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(0,t.findProviderDefinition)(n.providerDefinitions,a)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(n.providerDefinitions)}`,success:!1}:os(e,rs(a,n),n)}function Ls(){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 Rs(){return{name:`provider`,displayName:`Provider Setup`,description:`Manage provider profiles`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | test [profile]`,subcommands:Ls(),example:`/provider switch production`}}var zs=class{name=`provider`;getCommands(){return[Rs()]}};function Bs(e){let t=Rs();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)=>js(t,n,e)}}function Vs(e){return{name:`agent-command-provider`,commandSources:[new zs],systemCommands:[Bs(e)]}}async function Hs(e,t){let n=(await e(`
61
+ /plan revert return to drafting (re-blocks edits)`,success:!0};if(r===`status`){let t=e.getPlanState();return t?{message:$a(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 to(){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 no(){let e=to();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:eo}}var ro=class{name=`plan`;getCommands(){return[to()]}};function io(){return{name:`agent-command-plan`,commandSources:[new ro],systemCommands:[no()]}}function ao(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function R(e){return{success:!1,message:e}}function oo(t){return(0,e.resolvePluginCommandAdapter)(t)}const so=`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 co(e){return(e.getCommandSurfaceLocality?.()??`local`)===`remote`}async function z(e,t){let n=oo(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 lo(e,t){let{subcommand:n,subArgs:r}=ao(t);return n===`add`&&r.length>0?z(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?z(e,async e=>(await e.marketplaceRemove(r),`Removed marketplace "${r}" and uninstalled its plugins.`)):n===`update`&&r.length>0?z(e,async e=>(await e.marketplaceUpdate(r),`Updated marketplace "${r}".`)):n===`list`?z(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
+ `)}`}):R(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function B(e,t,n,r){return t.length===0?Promise.resolve(R(n)):z(e,e=>Promise.resolve(r(e,t)))}function uo(){return{success:!0,message:`Opening plugin manager...`,uiIntents:[(0,e.createShowPluginManagerIntent)()]}}function fo(e,t){return co(e)?Promise.resolve(R(so)):B(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function po(e,t){return co(e)?Promise.resolve(R(so)):B(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}async function mo(e){let t=oo(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 ho(e,t){return B(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function go(e,t){return B(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function _o(e,t){let{subcommand:n,subArgs:r}=ao(t);switch(n){case``:case`manage`:return uo();case`list`:return mo(e);case`install`:return fo(e,r);case`uninstall`:return po(e,r);case`enable`:return ho(e,r);case`disable`:return go(e,r);case`marketplace`:return lo(e,r);default:return R(`Unknown plugin subcommand: ${n}`)}}async function vo(e,t){return z(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 yo(){return{name:`plugin`,displayName:`Plugins`,description:e.PLUGIN_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1,argumentHint:e.PLUGIN_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildPluginCommandSubcommands)()}}function bo(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:e.RELOAD_PLUGINS_COMMAND_DESCRIPTION,source:`plugin-manager`,modelInvocable:!1}}function xo(){let e=yo();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:_o}}function So(){let e=bo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:vo}}var Co=class{name=`plugin-manager`;getCommands(){return[yo(),bo()]}};function wo(){return{name:`agent-command-plugin`,commandSources:[new Co],systemCommands:[xo(),So()]}}function To(e){return e.getCommandHostAdapters?.().presetRegistry??(0,c.createPresetRegistry)()}function Eo(e){return e.getSession().getActivePresetId()}function Do(e,t){return[`Available presets:`,...t.listPresets().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
64
+ `)}function Oo(e,t){return`Unknown preset: ${e}. Available: ${t.listPresets().map(e=>e.id).join(`, `)}`}function ko(e,t){let n=Eo(e);return{message:Do(n,t),success:!0,data:{presets:t.listPresets(),active:n}}}async function Ao(e,n){let r=e.getUserInteraction();if(!r)return;let i=n.listPresets().map(e=>({value:e.id,label:e.id,description:e.description})),a=await r.ask((0,t.selectAction)(`preset`,`Select a preset`,i));return a.type===`answer`?a.values[0]:void 0}async function jo(t,n){let r=To(t),i=n.trim().split(/\s+/)[0];if(i===`list`||(i===void 0||i.length===0)&&(i=await Ao(t,r),i===void 0))return ko(t,r);if(r.getPreset(i)===void 0)return{message:Oo(i,r),success:!1};let a=r.resolvePreset(i),o=await(0,e.applyPresetToSession)(t,i,a),s=o.unknownCommandModules.map(({name:e,kind:t})=>`Preset command-module "${e}" (${t}) matched no module — expected the agent-command-* form; ignored.`);return{message:[`Switched to preset: ${i}`,...s].join(`
65
+ `),success:!0,data:{preset:i,unknownCommandModules:o.unknownCommandModules}}}function Mo(e=`preset`){return(0,c.createPresetRegistry)().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function No(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:Mo(`preset`),modelInvocable:!1}}function Po(){let e=No();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:jo}}var Fo=class{name=`preset`;getCommands(){return[No()]}};function Io(){return{name:`agent-command-preset`,commandSources:[new Fo],systemCommands:[Po()]}}function V(e,t,n={}){let r=qo(e,t);return{type:e,steps:Xo(Jo(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 Lo(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Uo(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
66
+ `)}function Ro(e,n){let r=e.trim(),i=r.length>0?r:`1`,a=Go(i);if(a!==void 0){let e=n[a];if(e!==void 0)return e.type;throw Error(`Provider selection ${i} is out of range. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`)}let o=(0,t.findProviderDefinition)(n,i);if(o===void 0)throw Error(`Unknown provider: ${i}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return o.type}function H(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 zo(e,t){let n=H(e),r=t.trim()||n.defaultValue||``,i=Ko(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:Zo(a)}}async function Bo(e,t,n,r={}){let i=V(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=H(i),n=await t(Vo(e,i.setupHelpLinks),e.masked===!0),r=zo(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 Vo(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Wo(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Ho={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Uo(e){let t=`${e.category===void 0?``:`${Ho[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Wo(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${Yo(e.kind)}: ${e.label} - ${e.url}`).join(`
67
+ `)}function Go(e){if(/^\d+$/.test(e))return Number(e)-1}function Ko(e,t){if(e.required===!0&&t.length===0)return`Required`}function qo(e,n){let r=(0,t.findProviderDefinition)(n,e);if(r===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${(0,t.formatSupportedProviderTypes)(n)}`);return r}function Jo(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 Yo(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function Xo(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 Zo(t){let n=t.profileName??(0,e.suggestProviderProfileName)({type:t.type},{existingProfileNames:t.existingProfileNames}),r=t.values.apiKey;return{profile:n,type:t.type,model:t.values.model,...r!==void 0&&r.length>0&&{apiKey:r},...t.values.baseURL!==void 0&&{baseURL:t.values.baseURL},setCurrent:t.setCurrent??!0}}const Qo={type:`session-restart`,reason:`other`};function $o(e,t){return V(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function es(e,n){let r=H(e),i=r.masked===!0&&r.defaultValue!==void 0?`(unchanged)`:r.defaultValue,a=Wo(e.setupHelpLinks),o=[n,a.length>0?a:void 0].filter(e=>e!==void 0&&e.length>0).join(`
68
+ `)||void 0;return(0,t.textAction)(`provider-setup-${r.key}`,r.title,{description:o,placeholder:i,allowEmpty:r.defaultValue!==void 0,masked:r.masked})}async function ts(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(es(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=zo(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 ns(e,t,n,r){return ts(e,t,e=>rs(e,n,r),`Provider setup cancelled.`)}function rs(t,n,r){let i=n.settings.readTargetSettings(),a=(0,e.buildProviderSetupPatch)(t,{providerDefinitions:n.providerDefinitions});return n.settings.writeTargetSettings((0,e.mergeProviderPatch)(i,a)),r?{message:`Provider ${t.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t.profile}]}:{message:`Provider ${t.profile} configured. Restarting...`,success:!0,hostActions:[{...Qo,message:`Provider setup restart`}]}}function is(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function as(t,n,r){if(!n)return{message:`Usage: /provider switch <profile>`,success:!1};if(!t?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:i}=r;if(i?.allowedProviders&&!i.allowedProviders.includes(n))return{message:(0,e.formatOrgPolicyViolationMessage)(`Provider "${n}" is not allowed by your organization policy. Allowed: ${i.allowedProviders.join(`, `)}.`,i.adminContact),success:!1};if(r.settings.readMergedSettings().currentProvider===n)return{message:`Already using provider "${n}".`,success:!0};let a=t[n];try{(0,e.validateProviderProfile)(n,a,{providerDefinitions:r.providerDefinitions})}catch(e){return{message:`Failed to switch to "${n}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let o=r.settings.readTargetSettings(),s=r.settings.readMergedSettings(),c=o.providers?.[n]!==void 0||s.providers?.[n]!==void 0?{...o,currentProvider:n}:(0,e.setCurrentProvider)(o,n);return r.settings.writeTargetSettings(c),{message:`Switched to ${n} (${a.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:n}]}}async function os(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=V(r.type,n.providerDefinitions,{profileName:t,setCurrent:!1,initialValues:ss(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return ts(e,i,e=>cs(e,t,n),`Provider edit cancelled.`)}function ss(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function cs(t,n,r){let i=r.settings.readMergedSettings(),a=i.providers?.[n];if(!a)return{message:`Provider profile "${n}" was not found.`,success:!1};let{orgPolicy:o}=r;if(o?.requireApiKeyFromEnv&&(0,e.isApiKeyPlaintext)(t.apiKey))return{message:(0,e.formatOrgPolicyViolationMessage)(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,o.adminContact),success:!1};let s=r.settings.readTargetSettings(),c=(0,e.buildProviderSetupPatch)(t,{providerDefinitions:r.providerDefinitions}).providers[n];if(!c)return{message:`Provider profile "${n}" was not updated.`,success:!1};r.settings.writeTargetSettings((0,e.upsertProviderProfile)(s,n,{...a,...c}));let l=i.currentProvider===n;return{message:l?`Provider ${n} updated. Switching...`:`Provider ${n} updated.`,success:!0,...l?{hostActions:[{type:`provider-hot-swap`,profileName:n}]}:{}}}const ls={type:`session-restart`,reason:`other`};async function us(e,n,r){let i=r.settings.readMergedSettings();if(!i.providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let a=_s(n,Object.keys(i.providers)),o;for(;;){let i=await e.ask((0,t.textAction)(`provider-duplicate`,`Duplicate ${n} as`,{description:o,placeholder:a,allowEmpty:!0}));if(i.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let s=i.text??``,c=ds(s,a,r);if(c!==void 0){o=c;continue}return fs(n,s,a,r)}}function ds(e,t,n){let r=vs(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function fs(t,n,r,i){let a=i.settings.readMergedSettings().providers?.[t];if(!a)return{message:`Provider profile "${t}" was not found.`,success:!1};let o=vs(n,r),s=ds(o,r,i);return s===void 0?(i.settings.writeTargetSettings((0,e.upsertProviderProfile)(i.settings.readTargetSettings(),o,{...a})),{message:`Provider profile duplicated: ${t} -> ${o}.`,success:!0}):{message:s,success:!1}}function ps(t,n,r,i){return r?t?.[r]?Object.keys(t).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n===r?{message:`Cannot delete the profile in use. Switch to another profile first.`,success:!1}:i.settings.readTargetSettings().providers?.[r]===void 0?{message:`Provider profile "${r}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(i.settings.writeTargetSettings((0,e.deleteProviderProfile)(i.settings.readTargetSettings(),r)),{message:`Provider profile deleted: ${r}.`,success:!0}):{message:`Provider profile "${r}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function ms(e,n,r){let i=r.settings.readMergedSettings().providers??{};return i[n]?Object.keys(i).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(0,t.isConfirmed)(await e.ask((0,t.confirmAction)(`provider-delete`,`Delete profile "${n}"?`)))?hs(e,n,r):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${n}" was not found.`,success:!1}}async function hs(n,r,i){let a=i.settings.readMergedSettings();if(a.currentProvider!==r)return i.settings.writeTargetSettings((0,e.deleteProviderProfile)(i.settings.readTargetSettings(),r)),{message:`Provider profile deleted: ${r}.`,success:!0};let o=Object.entries(a.providers??{}).filter(([e])=>e!==r).map(([e,t])=>({value:e,label:is(e,t,a.currentProvider)})),s=await n.ask((0,t.selectAction)(`provider-delete-replacement`,`Replacement provider for ${r}`,o,{maxVisible:8}));return s.type!==`answer`||s.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:gs(r,s.values[0],i)}function gs(t,n,r){if(r.settings.readMergedSettings().providers?.[n]===void 0||n===t)return{message:`Provider profile "${n}" was not found.`,success:!1};let i=(0,e.deleteProviderProfile)(r.settings.readTargetSettings(),t);return r.settings.writeTargetSettings({...i,currentProvider:n}),{message:`Provider profile deleted: ${t}. Restarting with ${n}...`,success:!0,hostActions:[{...ls,message:`Provider delete restart`}]}}function _s(t,n){let r=(0,e.sanitizeProviderProfileName)(`${t}-copy`)??`provider-copy`;if(!n.includes(r))return r;for(let e=2;e<1e3;e+=1){let t=`${r}-${e}`;if(!n.includes(t))return t}return`${r}-${Date.now()}`}function vs(t,n){return(0,e.sanitizeProviderProfileName)(t.trim()||n)??``}const ys=`switch`,bs=`edit`,xs=`test`,Ss=`duplicate`,Cs=`delete`;async function ws(e,n,r,i){let a=Object.entries(r??{}).map(([e,t])=>({value:e,label:is(e,t,n)})),o=await e.ask((0,t.selectAction)(`provider-profile`,`Select provider profile`,a,{maxVisible:8}));return o.type!==`answer`||o.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Ts(e,o.values[0],i)}async function Ts(e,n,r){if(!r.settings.readMergedSettings().providers?.[n])return{message:`Provider profile "${n}" was not found.`,success:!1};let i=await e.ask((0,t.selectAction)(`provider-profile-action`,`Provider profile: ${n}`,[{value:ys,label:`Switch`},{value:bs,label:`Edit`},{value:xs,label:`Test`},{value:Ss,label:`Duplicate`},{value:Cs,label:`Delete`}]));return i.type!==`answer`||i.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Es(e,n,i.values[0],r)}async function Es(t,n,r,i){let a=i.settings.readMergedSettings();switch(r){case ys:return as(a.providers,n,i);case bs:return os(t,n,i);case xs:return(0,e.testProviderProfileCommand)(a.currentProvider,a.providers,n,i);case Ss:return us(t,n,i);case Cs:return ms(t,n,i);default:return{message:`Unknown provider profile action "${r}".`,success:!1}}}async function Ds(n,r,i){let a=n.getUserInteraction(),o=n.isSetupRequired?.()===!0,s=i.settings.readMergedSettings(),c=r.trim();if(c.length===0)return Os(a,s.currentProvider,s.providers,i);let l=c.split(/\s+/),[u=`current`,d]=l;return u===`list`?Os(a,s.currentProvider,s.providers,i):u===`current`||u===``?{message:As(s.currentProvider,s.providers),success:!0}:u===`switch`?as(s.providers,d,i):u===`test`?(0,e.testProviderProfileCommand)(s.currentProvider,s.providers,d,i):u===`edit`?a?d?os(a,d,i):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:u===`duplicate`?a?d?us(a,d,i):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:u===`delete`?d?!l.includes(`--confirmed`)&&a&&!(0,t.isConfirmed)(await a.ask((0,t.confirmAction)(`provider-delete`,`Delete profile "${d}"?`)))?{message:`Provider delete cancelled.`,success:!0}:ps(s.providers,s.currentProvider,d,i):{message:`Usage: provider delete <profile>`,success:!1}:u===`add`?js(a,d,i,o):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function Os(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:ks(t,n),success:!0}:ws(e,t,n,r)}function ks(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 As(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 js(e,n,r,i){return n===void 0||n.length===0?e?Ms(e,r,i):{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:(0,t.findProviderDefinition)(r.providerDefinitions,n)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(r.providerDefinitions)}`,success:!1}:e?ns(e,$o(n,r),r,i):{message:`Provider setup for "${n}" requires an interactive session.`,success:!1}}async function Ms(e,n,r){let i=n.providerDefinitions.map(e=>({value:e.type,label:Uo(e)})),a=await e.ask((0,t.selectAction)(`provider-type`,`Select provider`,i,{maxVisible:6}));if(a.type!==`answer`||a.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let o=a.values[0];return(0,t.findProviderDefinition)(n.providerDefinitions,o)===void 0?{message:`Usage: provider add <type>. Supported: ${(0,t.formatSupportedProviderTypes)(n.providerDefinitions)}`,success:!1}:ns(e,$o(o,n),n,r)}function Ns(){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 Ps(){return{name:`provider`,displayName:`Provider Setup`,description:`Manage provider profiles`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | test [profile]`,subcommands:Ns(),example:`/provider switch production`}}var Fs=class{name=`provider`;getCommands(){return[Ps()]}};function Is(e){let t=Ps();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)=>Ds(t,n,e)}}function Ls(e){return{name:`agent-command-provider`,commandSources:[new Fs],systemCommands:[Is(e)]}}async function Rs(e,t){let n=(await e(`
70
71
  Do you have an API key for an AI provider?
71
72
 
72
73
  1. Yes, I have an API key
@@ -93,21 +94,23 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require
93
94
  When the server is running, come back here and press Enter to continue.
94
95
 
95
96
  ─────────────────────────────────────────────────────────────────────────────
96
- `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function Us(t,n,r,i,a){let o=await Hs(r,i),s=Gs(n),c=Object.keys((0,e.readMergedProviderSettings)(s.sources).providers??{}),l=Ks(s.stores,n.settingsScope),u;u=o.preselectedType===void 0?Ho(await r(Vo(a)),a):o.preselectedType,(0,e.applyProviderConfiguration)(l,await Wo(u,r,a,{existingProfileNames:c}),{providerDefinitions:a});let d=await r(` Response language (ko/en/ja/zh, default: en): `);if(d){let e=l.read();e.language=d,l.write(e)}i.writeLine(`\n Config saved to ${l.displayName}\n`)}async function Ws(t,n,r,i,a,o){let s=Gs(n),c=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?c:{...c,currentProvider:n.provider},a)===`valid`||n.provider===void 0&&(0,e.resolveEnvDefaultProvider)(a,o.env)!==void 0)return;if(!(o.isInteractive??(()=>!1))())throw new e.ProviderConfigError(o.formatError(a));await Us(t,qs(n,s.stores),r,i,a);let l=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?l:{...l,currentProvider:n.provider},a)!==`valid`)throw new e.ProviderConfigError(o.formatError(a))}function Gs(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 Ks(t,n){if(n===void 0)return(0,e.resolveProviderSettingsWriteTarget)(t);let r=n===`user`?`user`:`project-local`,i=t.findLast(e=>e.scope===r);if(i!==void 0)return i;throw new e.WorkspaceAuthorityRequiredError(`No authorized ${r} settings store is available.`)}function qs(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:Js(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function Js(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 Ys="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 Xs(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 Zs(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=Xs(t?.getStatus(),n);if(!t?.describeKeyStorage)return r;let i=t.describeKeyStorage()??`chosen when remote control is first enabled`;return{...r,message:`${r.message}\nHost key storage: ${i}`}}if(a===`devices`){let t=(e.getCommandHostAdapters?.().remoteControl)?.listDevices?.();return t?t.length===0?{message:`No trusted devices are enrolled yet.`,success:!0}:{message:`Trusted devices:\n${t.map(e=>` ${e.deviceId} ${e.label} (last seen ${e.lastSeenAt})`).join(`
97
- `)}`,success:!0}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}if(a===`revoke`){if(!n)return{message:`\`/remote-control revoke\`: ${Ys}`,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\`: ${Ys}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function Qs(){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 $s(){return E(Qs(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>Zs(e,t)})}var ec=class{name=`remote-control`;getCommands(){return[Qs()]}};function tc(){return{name:`agent-command-remote-control`,commandSources:[new ec],systemCommands:[$s()]}}function nc(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function rc(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function ic(){let e=rc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:nc}}var ac=class{name=`reset`;getCommands(){return[rc()]}};function oc(){return{name:`agent-command-reset`,commandSources:[new ac],systemCommands:[ic()]}}function K(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function sc(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function cc(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${sc(e.prompt)}`):[`(no edit checkpoints)`]].join(`
98
- `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function lc(e){return e.length>0?e.join(`, `):`(none)`}function uc(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: ${sc(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${lc(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${lc(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
99
- `),success:!0,data:{inspection:e}}}function dc(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
100
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function fc(e){return{message:[`Rolled back code through ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Removed checkpoints: ${e.removedCheckpointCount}`].join(`
101
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function pc(e){return e.reason===`restricted-workspace`?`Edit checkpoints need a trusted workspace: run robota trust --yes, then restart robota.`:e.message}function q(t){return{message:t instanceof e.EditCheckpointsUnavailableError?pc(t):t instanceof Error?t.message:String(t),success:!1}}function mc(t){try{return cc((0,e.listCommandEditCheckpoints)(t))}catch(e){return q(e instanceof Error?e:String(e))}}function hc(t,n){if(!n)return K();try{return uc((0,e.inspectCommandEditCheckpoint)(t,n))}catch(e){return q(e instanceof Error?e:String(e))}}async function gc(t,n){if(!n)return K();try{return dc(await(0,e.restoreCommandEditCheckpoint)(t,n))}catch(e){return q(e instanceof Error?e:String(e))}}async function _c(t,n){if(!n)return K();try{return fc(await(0,e.rollbackCommandEditCheckpoint)(t,n))}catch(e){return q(e instanceof Error?e:String(e))}}async function vc(t,n){if(!n)return K();try{let r=await(0,e.forkCommandEditCheckpoint)(t,n);return{message:[`Forked a new branch from ${r.target.id} (the previous future is preserved).`,`Restored files: ${r.restoredFileCount}`].join(`
102
- `),success:!0,data:{target:r.target,restoredFileCount:r.restoredFileCount}}}catch(e){return q(e instanceof Error?e:String(e))}}function yc(t,n){if(!n)return K();try{return(0,e.switchCommandEditCheckpointBranch)(t,n),{message:`Switched to checkpoint branch ${n}.`,success:!0}}catch(e){return q(e instanceof Error?e:String(e))}}function bc(t){try{let n=(0,e.listCommandEditCheckpointBranches)(t);return{message:n.length===0?`No checkpoint branches yet.`:`Branch tips:\n${n.map(e=>`- ${e}`).join(`
103
- `)}`,success:!0,data:{branches:n}}}catch(e){return q(e instanceof Error?e:String(e))}}async function xc(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?mc(e):r===`inspect`?hc(e,n[1]):r===`restore`||r===`code`?gc(e,n[1]):r===`rollback`?_c(e,n[1]):r===`fork`?vc(e,n[1]):r===`switch`?yc(e,n[1]):r===`branches`?bc(e):K()}function Sc(){return{name:`rewind`,displayName:`Rewind History`,description:e.REWIND_COMMAND_DESCRIPTION,source:`rewind`,argumentHint:e.REWIND_COMMAND_ARGUMENT_HINT,modelInvocable:!1,safety:`write`,subcommands:(0,e.buildRewindCommandSubcommands)()}}function Cc(){let e=Sc();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:xc}}var wc=class{name=`rewind`;getCommands(){return[Sc()]}};function Tc(){return{name:`agent-command-rewind`,commandSources:[new wc],systemCommands:[Cc()]}}function Ec(e,t){let n=Math.floor(Math.min(1800,t.milliseconds/2e3)),r=(0,l.createHash)(`sha256`).update(e).digest().readUInt32BE(0)%(n+1);if(r===0)return{cronExpression:t.cronExpression,jitterSeconds:r};let i=/^(\d+)(s|m|h)$/.exec(t.description);if(!i)throw Error(`Unsupported fixed-loop cadence for jitter.`);let a=Number(i[1]),o=i[2],s=r%60,c=Math.floor(r/60);return o===`s`?{cronExpression:a===60?`${r} * * * * *`:`${r}-59/${a} * * * * *`,jitterSeconds:r}:o===`m`?{cronExpression:a===60?`${s} ${c} * * * *`:`${s} ${c}-59/${a} * * * *`,jitterSeconds:r}:{cronExpression:a===24?`${s} ${c} 0 * * *`:`${s} ${c} */${a} * * *`,jitterSeconds:r}}const Dc=4096,J=new WeakMap,Oc=new Set([`second`,`seconds`,`minute`,`minutes`,`hour`,`hours`,`day`,`days`,`s`,`m`,`h`,`d`]),kc=`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.`,Y={s:1e3,m:6e4,h:36e5,d:864e5},Ac=[...jc(60).map(e=>({cronExpression:e===60?`0 * * * * *`:`*/${e} * * * * *`,milliseconds:e*Y.s,description:`${e}s`})),...jc(60).filter(e=>e>1).map(e=>({cronExpression:e===60?`0 0 * * * *`:`0 */${e} * * * *`,milliseconds:e*Y.m,description:`${e}m`})),...jc(24).filter(e=>e>1).map(e=>({cronExpression:e===24?`0 0 0 * * *`:`0 0 */${e} * * *`,milliseconds:e*Y.h,description:`${e}h`}))];function jc(e){return Array.from({length:e},(e,t)=>t+1).filter(t=>e%t===0)}function Mc(e,t){let n=Number(e),r=Y[t];if(!Number.isSafeInteger(n)||n<=0||r===void 0)return;let i=n*r;return Number.isSafeInteger(i)&&i<=Y.d?i:void 0}function Nc(e){let t=e.length;for(;t>0&&/[a-z]/i.test(e[t-1]);)--t;let n=e.slice(t).toLowerCase();if(!Oc.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 Pc(e,t){let n=t&&t.length<=Dc?t.trim():void 0;if(e===``)return;let r=/^(\d+)(s|m|h|d)$/i.exec(e);if(r&&n){let e=Mc(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=Mc(i[1],i[2].toLowerCase());return e&&t!==void 0&&!Nc(e)?{instruction:e,requestedMs:t}:void 0}let a=Nc(e);if(!a)return;let o=Mc(a.amount,a.unit[0]);return o===void 0?void 0:{instruction:a.instruction,requestedMs:o}}function Fc(e){return Ac.find(t=>t.milliseconds>=e)}function X(e){return e.listSchedules().filter(e=>e.metadata?.sessionLoop===!0&&e.metadata?.sessionLoopSelfPaced!==!0&&e.status!==`cancelled`&&e.status!==`completed`&&e.status!==`failed`)}function Ic(e){return(e.listSelfPacedLoops?.()??[]).filter(e=>e.phase!==`stopped`&&e.phase!==`expired`)}function Lc(e){let t=e.metadata?.sessionLoopId;return typeof t==`string`&&t.length>0?t:e.id}async function Rc(e,t,n,r={}){let i=n.trim();return i===`list`?zc(e,r):/^stop(?:\s|$)/.test(i)?Bc(e,t,i):r.disabled?{success:!1,message:`Session loops are disabled by the host.`}:Vc(e,i,r)}function zc(e,t){let n=X(e),r=Ic(e);return{success:!0,message:(t.disabled?`Session loops are disabled by the host.
104
- `:``)+(n.length+r.length===0?`No active loops.`:[...n.map(e=>`- ${Lc(e)} [${e.status}] ${e.label}`),...r.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`+(e.phase===`waiting`&&e.delaySeconds!==void 0&&e.reason?` — next ${e.delaySeconds}s: ${e.reason}`:``))].join(`
105
- `)),data:{count:n.length+r.length}}}async function Bc(e,t,n){let r=/^stop\s+(\S+)$/.exec(n);if(!r)return{success:!1,message:kc};let i=Ic(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=X(e).find(e=>Lc(e)===r[1]);return a?(await t(a.id,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${Lc(a)}. An already-running turn may finish.`,data:{loopId:Lc(a),taskId:a.id}}):{success:!1,message:`Active loop not found: ${r[1]}`}}async function Vc(e,t,n){let r=t===``||/^\d+(s|m|h|d)$/i.test(t),i=n.defaultPrompt;if(r&&n.resolveDefaultPrompt)try{i=n.resolveDefaultPrompt()}catch(e){return{success:!1,message:`Default loop prompt could not be loaded: ${e instanceof Error?e.message:String(e)}`}}let a=Pc(t,i);if(!a){if(/^\d+[a-z](?:\s|$)/i.test(t)||Nc(t))return{success:!1,message:kc};let n=(t||i||``).trim();if(!n||t===``&&n.length>Dc)return{success:!1,message:kc};if(!e.createSelfPacedLoop)return{success:!1,message:`Self-paced loops require a persistent interactive session.`};let a=J.get(e)??0;if(X(e).length+Ic(e).length+a>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};J.set(e,a+1);try{let t=r?await e.createSelfPacedLoop(n,{useDefaultPrompt:!0}):await e.createSelfPacedLoop(n);return{success:!0,message:`Self-paced loop ${t.loopId} started. It will choose a 1–60 minute delay after each iteration and expires ${t.expiresAt}. Stop with /loop stop ${t.loopId}.`,data:{loopId:t.loopId,expiresAt:t.expiresAt}}}finally{let t=(J.get(e)??1)-1;t===0?J.delete(e):J.set(e,t)}}let o=J.get(e)??0;if(X(e).length+Ic(e).length+o>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};let s=Fc(a.requestedMs),c=`Loop: ${a.instruction.slice(0,48)}`,u=`loop_${(0,l.randomUUID)()}`,d=Ec(u,s),f=Date.now(),p=new Date(f+a.requestedMs).toISOString(),m=new Date(f+6048e5).toISOString();J.set(e,o+1);let h;try{h=await e.spawnScheduledWake({label:c,cronExpression:d.cronExpression,agentInstruction:a.instruction,sessionLoop:!0,sessionLoopId:u,...r?{sessionLoopDefaultPrompt:!0}:{},sessionLoopFirstAllowedAt:p,sessionLoopExpiresAt:m})}finally{let t=(J.get(e)??1)-1;t===0?J.delete(e):J.set(e,t)}let g=s.milliseconds===a.requestedMs?``:` (rounded up)`,_=h.kind===`scheduled`&&h.nextFireAt&&h.nextFireAt>=p?` Next fire: ${h.nextFireAt}.`:``;return{success:!0,message:`Loop ${u} uses a ${s.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:a.requestedMs,cadenceLabel:s.description,cronExpression:d.cronExpression,jitterSeconds:d.jitterSeconds,firstAllowedAt:p,expiresAt:m}}}const Hc={s:1e3,m:6e4,h:36e5,d:864e5},Z=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function Uc(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)*Hc[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 Wc(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}const Gc=`Usage: /schedule list | pause <id> | resume <id> | edit <id> <spec> (or a create spec: in <N><s|m|h|d> … | cron "<expr>" …)`;function Kc(e){return e.length===0?`No schedules.`:e.map(e=>{let t=e.kind===`scheduled`?e.schedule?.cronExpression??`(unknown)`:`(unknown)`,n=e.kind===`scheduled`&&e.nextFireAt?`next ${e.nextFireAt}`:`—`;return`- ${e.id} [${e.status}] ${t} — ${e.label} (${n})`}).join(`
106
- `)}async function qc(e,t,n,r){if(t===`list`){let t=e.listSchedules();return{message:Kc(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:Gc,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:Gc,success:!1};let o=Uc(a,r);return o.ok?(await e.editSchedule(i,{cronExpression:o.spec.cronExpression,agentInstruction:o.spec.instruction,label:Wc(`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 Jc(e,t,n=Date.now()){let r=t.trim(),i=r.indexOf(` `),a=await qc(e,(i===-1?r:r.slice(0,i)).toLowerCase(),i===-1?``:r.slice(i+1).trim(),n);if(a)return a;let o=Uc(t,n);if(!o.ok)return{message:`${o.error}\n${Gc}`,success:!1};let{cronExpression:s,instruction:c,recurring:l}=o.spec,u=await e.spawnScheduledWake({label:Wc(`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 Yc(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 Xc(t,n){let r=Yc(n);if(!r)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let i;try{i=await t.spawnMonitorWake({label:Wc(`Monitor`,r.instruction),command:r.command,matchPattern:r.matchPattern,agentInstruction:r.instruction})}catch(t){if(t instanceof e.MonitorCommandRefusedError)return{message:t.message,success:!1};throw t}return{message:`Monitoring \`${r.command}\` for /${r.matchPattern}/ — task ${i.id}.`,success:!0,data:{taskId:i.id,matchPattern:r.matchPattern}}}function Zc(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function Qc(){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 $c(){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 el(){return{name:`loop`,displayName:`Repeat Prompt`,description:`Repeat a prompt on a fixed cadence or let each iteration choose its next delay; list or stop active loops.`,modelDescription:"Repeat a prompt on a fixed cadence (`<N><s|m|h|d> [prompt]`) or self-paced (bare or prompt only: each iteration chooses its next delay or stops). Use it when the user asks for recurring work in this session. `list` shows active loops; `stop <id>` ends one. Returns the loop id and its next fire time, or the loop list.",source:`schedule`,argumentHint:`[prompt] | <N><s|m|h|d> [prompt] | <prompt> every <N> <unit> | list | stop <id>`,modelInvocable:!0,subcommands:[{name:`list`,description:`List active loops`,source:`schedule`},{name:`stop`,description:`Stop an active loop`,source:`schedule`,argumentHint:`<id>`}]}}function tl(){let e=Qc();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)=>Jc(Zc(e),t)}}function nl(){let e=$c();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)=>Xc(Zc(e),t)}}function rl(e){let t=el();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)=>Rc(Zc(t),(e,n)=>t.cancelBackgroundTask(e,n),n,e)}}var il=class{name=`schedule`;getCommands(){return[Qc(),$c(),el()]}};function al(e={}){return{name:`agent-command-schedule`,commandSources:[new il],systemCommands:[tl(),nl(),rl(e)],sessionRequirements:[`agent-runtime`]}}function ol(e,n,r){return(0,t.calculateModelCost)(e,n,r)}function Q(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function sl(e){return e.toLocaleString(`en-US`)}const cl=`Conversation cleared.`;function ll(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 ul(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:((0,e.clearConversationHistory)(n),{success:!0,message:cl})}function dl(t,n){let r=(0,e.parseSessionNameArgument)(n);return r===void 0?{success:!1,message:e.RENAME_COMMAND_USAGE}:{success:!0,message:`Session renamed to "${r}".`,data:{name:r},hostActions:[(0,e.createSessionRenameHostAction)(r)]}}function fl(){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},uiIntents:[(0,e.createShowSessionPickerIntent)()]}}function pl(e){return e.getCommandHostAdapters?.().costBudget}const ml=`Budget persistence is not available on this host (no cost-budget adapter was composed).`;function hl(e){return`Could not write the budget: ${e instanceof Error?e.message:String(e)}`}function gl(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?ol(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 _l(t){let n=t.getSession(),r=(0,e.readCommandSessionInfo)(t),i=n.getModelId(),a=gl(t.getSessionUsage(),i),o=[`Session: ${r.sessionId}`,`Messages: ${r.messageCount}`],s={sessionId:r.sessionId,messageCount:r.messageCount};if(a){o.push(`Tokens: ${sl(a.inputTokens)} input / ${sl(a.outputTokens)} output`),s.inputTokens=a.inputTokens,s.outputTokens=a.outputTokens;let e=a.costUsd;if(e!==void 0){let n=a.models.length>1?`mixed: ${a.models.join(`, `)}`:a.models[0]??``,r=a.partial?`; some usage could not be priced`:``;o.push(`Cost: ${Q(e)} (${n}${r})`),s.estimatedCostUsd=e,s.costModels=a.models,a.partial&&(s.costPartial=!0);let i=pl(t)?.read();if(i?.monthly){let t=i.monthly-e,n=Math.min(100,Math.round(e/i.monthly*100));o.push(`Budget: ${Q(t)} remaining of ${Q(i.monthly)}/mo (${n}% used)`),s.budgetMonthly=i.monthly,s.budgetRemainingUsd=t}}}else o.push(`Tokens: not yet available (no turns completed)`);return{lines:o,data:s}}function vl(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=pl(e);if(i===void 0)return{success:!1,message:ml};if(t===`clear`){try{i.clear()}catch(e){return{success:!1,message:hl(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:ml};try{i.write({monthly:r})}catch(e){return{success:!1,message:hl(e)}}return{success:!0,message:`Monthly budget set to ${Q(r)}.`}}let{lines:r,data:i}=_l(e);return{success:!0,message:r.join(`
107
- `),data:i}}function yl(t,n){let r=(0,e.validateCommandSessionReplayLog)(t);return{success:r.validation.ok,message:(0,e.formatCommandSessionReplayValidationReport)(r),data:{logFile:r.logFile,entryCount:r.entryCount,issueCount:r.validation.issues.length,ok:r.validation.ok}}}function bl(){return{name:`clear`,displayName:`Clear History`,description:e.CLEAR_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function xl(){return{name:`rename`,displayName:`Rename Session`,description:e.RENAME_COMMAND_DESCRIPTION,argumentHint:`<name>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function Sl(){return{name:`cd`,displayName:`Change Directory`,description:`Move this session to another working directory`,argumentHint:`<directory>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function Cl(){return{name:`resume`,displayName:`Resume Session`,description:e.RESUME_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function wl(){return{name:`cost`,displayName:`Session Cost`,description:e.COST_COMMAND_DESCRIPTION,modelDescription:"Report this session’s token usage and estimated cost. Use it before an expensive step (a large refactor, many subagents) or when the user asks what the session has cost. Returns the message count, input/output token totals and the estimated USD cost, with the remaining monthly budget when one is set. Setting or clearing the budget is the user’s decision: suggest `/cost budget <amount>`.",argumentHint:`[budget [<amount>|clear]]`,runsBare:!0,source:`session`,modelInvocable:!0,userInvocable:!0,subcommands:[{name:`budget`,description:`Show, set, or clear the monthly budget`,argumentHint:`[<amount>|clear]`,source:`session`,modelInvocable:!1}]}}function Tl(){return{name:`validate-session`,displayName:`Validate Session`,description:e.VALIDATE_SESSION_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function El(){return E(bl(),{requiresPermission:!1,lifecycle:`inline`,execute:ul})}function Dl(){return E(xl(),{requiresPermission:!1,lifecycle:`inline`,execute:dl})}function Ol(){return E(Sl(),{requiresPermission:!1,lifecycle:`inline`,execute:ll})}function kl(){return E(Cl(),{requiresPermission:!1,lifecycle:`inline`,execute:fl})}function Al(){return E(wl(),{requiresPermission:!1,lifecycle:`inline`,execute:vl})}function jl(){return E(Tl(),{requiresPermission:!1,lifecycle:`inline`,execute:yl})}var Ml=class{name=`session`;getCommands(){return[bl(),xl(),Sl(),Cl(),wl(),Tl()]}};function Nl(){return{name:`agent-command-session`,commandSources:[new Ml],systemCommands:[El(),Dl(),Ol(),kl(),Al(),jl()]}}function Pl(){return{name:`settings`,displayName:`Settings`,description:`Open transport settings — enable/disable transports and configure options`,source:`settings`,modelInvocable:!1}}function Fl(){let e=Pl();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 Il=class{name=`settings`;getCommands(){return[Pl()]}};function Ll(){return{name:`agent-command-settings`,commandSources:[new Il],systemCommands:[Fl()]}}function Rl(e){let n=(0,t.resolvePlatformShell)({executable:e});return{command:n.command,interactiveArgs:n.interactiveArgs,commandArgs:e=>n.commandArgs(e)}}const zl="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function Bl(e,t,n){if(!e.canHandoffTerminal())return{message:`An interactive shell is unavailable here (no interactive terminal).`,success:!1};let r=Rl(n),i=e.getCwd(),a=t.trim(),o=await e.runWithTerminal(async()=>a.length>0?k(r.command,r.commandArgs(a),i):k(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 Vl(){return{name:`shell`,displayName:`Shell`,description:zl,source:`shell`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function Hl(e){let t=Vl();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)=>Bl(t,n,e)}}var Ul=class{name=`shell`;getCommands(){return[Vl()]}};function Wl(e){return{name:`agent-command-shell`,commandSources:[new Ul],systemCommands:[Hl(e)]}}const Gl=`List registered skills, or activate one by name`;function Kl(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 ql(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${Kl(e)}`}function Jl(e){return e.length===0?[`No skills are registered for this session.`,``,`Skills are metadata until activated. Do not invent or imitate a skill workflow when no matching registered skill exists.`].join(`
108
- `):[`Registered skills:`,...e.map(ql),``,`Activation contract:`,`- Use /skills <skill-name> [args] to activate a matching skill.`,`- Treat /<skill-name> as a virtual alias for /skills <skill-name>.`,`- The system prompt Skills section is skill selection metadata.`,`- Treat descriptions as selection metadata only, not as loaded SKILL.md content.`,`- Do not answer by merely naming, recommending, or imitating a matching skill.`,`- If no listed skill matches the task, continue without claiming a skill was activated.`].join(`
109
- `)}function Yl(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 Xl(e,t=``){let n=Yl(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:Jl(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function Zl(){return{name:`skills`,displayName:`Skills`,description:Gl,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 Ql(){let e=Zl();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:Xl}}var $l=class{name=`skills`;getCommands(){return[Zl()]}};function eu(t){let n=[new $l];return n.push(new e.SkillCommandSource(t.contributionSources,t.skillRoots??[])),{name:`agent-command-skills`,commandSources:n,systemCommands:[Ql()]}}const tu=[`Usage: /statusline on | off | reset | git on | git off`,`Fields: model, context, permission mode, message count, session name, thinking state, git branch.`].join(`
110
- `);function nu(t){let n=t.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[r,i]=n;return r===`on`&&i===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:r===`off`&&i===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:r===`reset`&&i===void 0?{success:!0,message:`Status line settings reset.`,patch:{...e.DEFAULT_STATUS_LINE_COMMAND_SETTINGS}}:r===`git`&&i===`on`&&n.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:r===`git`&&i===`off`&&n.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:tu}}function ru(e,t){let n=nu(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function iu(){return{name:`statusline`,displayName:`Status Line`,description:e.STATUSLINE_COMMAND_DESCRIPTION,source:`statusline`,argumentHint:e.STATUSLINE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildStatusLineCommandSubcommands)(`statusline`),modelInvocable:!1}}function au(){let e=iu();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:ru}}var ou=class{name=`statusline`;getCommands(){return[iu()]}};function su(){return{name:`agent-command-statusline`,commandSources:[new ou],systemCommands:[au()]}}const cu=`list | <theme-id> | syntax on|off | motion on|off`;function $(e){return e?`on`:`off`}function lu(e){let{settings:t,reducedMotionPin:n}=e.getAppearance(),r=e.listThemes().map(e=>`${e.id===t.theme?`* `:` `}${e.id} — ${e.name} (${e.appearance}, ${e.source})`),i=n?`${$(n.reducedMotion)} for this run (pinned by ${n.tier}; saved ${$(t.reducedMotion)})`:$(t.reducedMotion);return[`Available themes:`,...r,``,`syntax highlighting: ${$(t.syntaxHighlighting)}`,`reduced motion: ${i}`].join(`
111
- `)}function uu(e){return{success:!0,message:lu(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function du(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function fu(e){if(e===`on`)return!0;if(e===`off`)return!1}function pu(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=fu(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${cu}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function mu(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 hu(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 uu(e);let r=pu(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${cu}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return du(r.themeId,e);i.theme=a.id}return{success:!0,message:mu(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function gu(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:cu,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var _u=class{name=`theme`;getCommands(){return[gu()]}};function vu(e){let t=gu(),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)=>hu(e,n)};return{name:`agent-command-theme`,commandSources:[new _u],systemCommands:[n]}}const yu=`Inspect user-local storage and memory state.`,bu=`storage list [--format json] | memory set/list/inspect/disable/delete`,xu=`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 Su(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
112
- `)}function Cu(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function wu(t,n,r){let i=await(0,e.listUserLocalMemoryItems)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):Su(i.items),success:!0,data:{list:i}}}async function Tu(t,n,r){let[i,a,o]=r.positional,s=await(0,e.setUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Cu(i),key:a??``,value:o??``,summary:r.summary??``,source:r.source??``});return{message:`Stored user-local memory item ${s.category}/${s.key} at ${s.storageLocation}`,success:!0,data:{item:s}}}async function Eu(t,n,r){let[i,a]=r.positional,o=await(0,e.inspectUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Cu(i),key:a??``});return{message:r.format===`json`?JSON.stringify(o,null,2):`${o.category}/${o.key}: ${o.summary}`,success:!0,data:{item:o}}}async function Du(t,n,r){let[i,a]=r.positional,o=await(0,e.disableUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Cu(i),key:a??``});return{message:`Disabled user-local memory item ${o.category}/${o.key}`,success:!0,data:{item:o}}}async function Ou(t,n,r){let[i,a]=r.positional,o=await(0,e.deleteUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:Cu(i),key:a??``});return{message:`Deleted user-local memory item ${o.category}/${o.key}`,success:!0,data:{result:o}}}async function ku(e,t,n){return(n.action??`list`)===`list`?wu(e,t,n):n.action===`set`?Tu(e,t,n):n.action===`inspect`?Eu(e,t,n):n.action===`disable`?Du(e,t,n):n.action===`delete`?Ou(e,t,n):{message:xu,success:!1}}function Au(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function ju(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 Mu(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=ju(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:Au(n),summary:r,source:i}}function Nu(e){return e.trim().split(/\s+/).filter(Boolean)}function Pu(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
113
- `)}async function Fu(t,n,r){if((r.action??`list`)!==`list`)return{message:xu,success:!1};let i=await(0,e.inspectUserLocalStorage)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):Pu(i.root,i.categories),success:!0,data:{root:i.root,categories:i.categories,inspection:i}}}async function Iu(e,t,n){return n.target===`storage`?Fu(e,t,n):n.target===`memory`?ku(e,t,n):{message:xu,success:!1}}function Lu(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Ru(e){try{return await Iu(e.cwd,e.storageRoot,Mu(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:Lu(e instanceof Error?e.message:String(e)),success:!1}}}async function zu(e,t,n){try{return await Iu(e.getCwd(),n,Mu(Nu(t)))}catch(e){return{message:Lu(e instanceof Error?e.message:String(e)),success:!1}}}function Bu(){return{name:`user-local`,displayName:`User Config`,description:yu,source:`user-local`,argumentHint:bu,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 Vu(e){let t=Bu();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)=>zu(t,n,e)}}var Hu=class{name=`user-local`;getCommands(){return[Bu()]}};function Uu(e){return{name:`agent-command-user-local`,commandSources:[new Hu],systemCommands:[Vu(e)]}}function Wu(t,n,r){return(0,e.selectCommandModules)(t,n,r)}function Gu({cwd:t,userLocalStorageRoot:n,editorTemporaryDirectoryPrefix:r,contributionSources:i,skillRoots:a,providerDefinitions:o,providerSettingsAdapter:s,orgPolicy:c,keybindingsFilePort:l,themeCataloguePort:u,devicesPort:d,doctorInputs:f,doctorDisplay:p,formatForkResumeCommand:m,loopOptions:h,enabledCommandModules:g,disabledCommandModules:_}){let v=[eu({contributionSources:i??[],skillRoots:a}),si(),ve(),Un(),jn(),io(),ha(),wa(),Bo(),Na(),_i(),we(),ir(m),Jr(),uo(),Wl(),wn(r),Vr(),di(l),vu(u),...f===void 0?[]:[_n(f,void 0,p)],oa(),Ki(),Uu(n),Ae(),Qe(),Jn(),Nl(),oc(),Tc(),al(h),su(),Oo(),Ll(),eo(),Va(),ni(),tc(),...d===void 0?[]:[ct(d)],Vs({providerDefinitions:o,settings:s,...c===void 0?{}:{orgPolicy:c}})],ee=v.map(e=>e.name);return{modules:Wu(v,g,_),unknownModuleNames:(0,e.findUnknownModuleNames)(ee,g,_)}}function Ku(t){let{shellExecutable:n,editorTemporaryDirectoryPrefix:r,keybindingsFile:i,themeCatalogue:a,enabledCommandModules:o,disabledCommandModules:s}=t,c=[[Wl(n),(e,t)=>Bl(e,t,n)],[wn(r),(e,t)=>bn(e,t,r)],[di(i),e=>li(i,e)],[vu(a),(e,t)=>hu(a,t)]],l=new Set((0,e.selectCommandModules)(c.map(([e])=>e),o,s));return c.filter(([e])=>l.has(e)).flatMap(([e,t])=>(e.systemCommands??[]).map(e=>({name:e.name,execute:t})))}exports.ADVISOR_SETTING_KEY=Tn,exports.AdvisorCommandSource=An,exports.AgentCommandSource=_e,exports.BackgroundCommandSource=Ce,exports.CLEAR_COMMAND_MESSAGE=cl,exports.CompactCommandSource=ke,exports.ContextCommandSource=Ze,exports.DoctorCommandSource=pn,exports.EDITOR_COMMAND_DESCRIPTION=yn,exports.EditorCommandSource=Cn,exports.EffortCommandSource=Hn,exports.ExitCommandSource=qn,exports.GOAL_COMMAND_DESCRIPTION=Hr,exports.GitCommandSource=Br,exports.GoalCommandSource=qr,exports.HandoffCommandSource=ti,exports.HelpCommandSource=oi,exports.KeybindingsCommandSource=ui,exports.LanguageCommandSource=gi,exports.MCPActivationCommandSource=Gi,exports.MemoryCommandSource=aa,exports.ModeCommandSource=ma,exports.OutputStyleCommandSource=Ma,exports.PermissionsCommandSource=ro,exports.PluginManagerCommandSource=Do,exports.PresetCommandSource=zo,exports.ProviderCommandSource=zs,exports.RemoteControlCommandSource=ec,exports.RewindCommandSource=wc,exports.SANDBOX_MODES=V,exports.SHELL_COMMAND_DESCRIPTION=zl,exports.SKILLS_COMMAND_DESCRIPTION=Gl,exports.STATUSLINE_USAGE=tu,exports.STORAGE_REPAIR_ID=Wt,exports.SandboxCommandSource=Ca,exports.ScheduleCommandSource=il,exports.SessionCommandSource=Ml,exports.SettingsCommandSource=Il,exports.ShellCommandSource=Ul,exports.SkillsCommandSource=$l,exports.StatusLineCommandSource=ou,exports.ThemeCommandSource=_u,exports.USER_LOCAL_COMMAND_ARGUMENT_HINT=bu,exports.USER_LOCAL_COMMAND_DESCRIPTION=yu,exports.USER_LOCAL_COMMAND_USAGE=xu,exports.UserLocalCommandSource=Hu,exports.applyDoctorRepair=Xt,exports.buildDoctorReport=ln,exports.collectSettingsSecrets=Et,exports.createAdvisorCommandEntry=On,exports.createAdvisorCommandModule=jn,exports.createAgentCommandEntry=he,exports.createAgentCommandModule=ve,exports.createAgentSystemCommand=ge,exports.createBackgroundCommandEntry=xe,exports.createBackgroundCommandModule=we,exports.createClearCommandEntry=bl,exports.createCompactCommandEntry=De,exports.createCompactCommandModule=Ae,exports.createContextCommandEntry=Ye,exports.createContextCommandModule=Qe,exports.createCostCommandEntry=wl,exports.createDefaultCommandModules=Gu,exports.createDevicesCommandModule=ct,exports.createDoctorCommandEntry=fn,exports.createDoctorCommandModule=_n,exports.createEditorCommandEntry=xn,exports.createEditorCommandModule=wn,exports.createEffortCommandEntry=Bn,exports.createEffortCommandModule=Un,exports.createExitCommandEntry=Gn,exports.createExitCommandModule=Jn,exports.createGitCommandEntry=Lr,exports.createGitCommandModule=Vr,exports.createGitProcess=lr,exports.createGoalCommandEntry=Gr,exports.createGoalCommandModule=Jr,exports.createHandoffCommandEntry=$r,exports.createHandoffCommandModule=ni,exports.createHelpCommandEntry=ii,exports.createHelpCommandModule=si,exports.createKeybindingsCommandEntry=ci,exports.createKeybindingsCommandModule=di,exports.createLanguageCommandEntry=mi,exports.createLanguageCommandModule=_i,exports.createLoopCommandEntry=el,exports.createMCPActivationCommandEntry=Hi,exports.createMCPActivationCommandModule=Ki,exports.createMemoryCommandEntry=ra,exports.createMemoryCommandModule=oa,exports.createModeCommandEntry=fa,exports.createModeCommandModule=ha,exports.createMonitorCommandEntry=$c,exports.createNodeDoctorDeps=pt,exports.createOutputStyleCommandEntry=Aa,exports.createOutputStyleCommandModule=Na,exports.createPermissionsCommandEntry=to,exports.createPermissionsCommandModule=io,exports.createPlanCommandModule=uo,exports.createPluginCommandEntry=Co,exports.createPluginCommandModule=Oo,exports.createPresetCommandEntry=Lo,exports.createPresetCommandModule=Bo,exports.createProviderCommandEntry=Rs,exports.createProviderCommandModule=Vs,exports.createProviderSetupFlow=W,exports.createReloadPluginsCommandEntry=wo,exports.createRemoteControlCommandEntry=Qs,exports.createRemoteControlCommandModule=tc,exports.createRenameCommandEntry=xl,exports.createResetCommandEntry=rc,exports.createResetCommandModule=oc,exports.createResumeCommandEntry=Cl,exports.createRewindCommandModule=Tc,exports.createSandboxCommandModule=wa,exports.createScheduleCommandEntry=Qc,exports.createScheduleCommandModule=al,exports.createSessionCommandModule=Nl,exports.createSettingsCommandEntry=Pl,exports.createSettingsCommandModule=Ll,exports.createShellCommandEntry=Vl,exports.createShellCommandModule=Wl,exports.createSkillsCommandEntry=Zl,exports.createSkillsCommandModule=eu,exports.createStatusLineCommandEntry=iu,exports.createStatusLineCommandModule=su,exports.createTerminalClientCommands=Ku,exports.createThemeCommandEntry=gu,exports.createThemeCommandModule=vu,exports.createUserLocalCommandEntry=Bu,exports.createUserLocalCommandModule=Uu,exports.createValidateSessionCommandEntry=Tl,exports.doctorRepairAllowlist=Gt,exports.ensureProviderConfig=Ws,exports.executeAdvisorCommand=Dn,exports.executeAgentCommand=de,exports.executeBackgroundCommand=be,exports.executeClearCommand=ul,exports.executeCompactCommand=Ee,exports.executeContextCommand=Be,exports.executeCostCommand=vl,exports.executeEditorCommand=bn,exports.executeEffortCommand=Rn,exports.executeExitCommand=Wn,exports.executeGitCommand=Rr,exports.executeGoalCommand=Wr,exports.executeHandoffCommand=Zr,exports.executeHelpCommand=ri,exports.executeLanguageCommand=pi,exports.executeLoopCommand=Rc,exports.executeMCPActivationCommand=Fi,exports.executeMemoryCommand=na,exports.executeModeCommand=da,exports.executeMonitorCommand=Xc,exports.executeOutputStyleCommand=ka,exports.executePermissionsCommand=la,exports.executePluginCommand=xo,exports.executePresetCommand=Fo,exports.executeProviderCommand=js,exports.executeReloadPluginsCommand=So,exports.executeRemoteControlCommand=Zs,exports.executeRenameCommand=dl,exports.executeResetCommand=nc,exports.executeResumeCommand=fl,exports.executeRewindCommand=xc,exports.executeSandboxCommand=ya,exports.executeScheduleCommand=Jc,exports.executeShellCommand=Bl,exports.executeSkillsCommand=Xl,exports.executeStatusLineCommand=ru,exports.executeThemeCommand=hu,exports.executeUserLocalCommand=zu,exports.executeUserLocalDirectCommand=Ru,exports.executeValidateSessionCommand=yl,exports.formatProviderSetupChoiceLabel=qo,exports.formatProviderSetupHelpLinks=Jo,exports.formatProviderSetupPromptLabel=Go,exports.formatProviderSetupSelectionPrompt=Vo,exports.formatSandboxStatus=_a,exports.getProviderSetupStep=G,exports.gitEnvironment=or,exports.isDoctorRepairId=Kt,exports.mcpUnavailableServersNotice=Si,exports.mcpUserActionCommand=vi,exports.mcpUserActionNotice=xi,exports.parseScheduleSpec=Uc,exports.planDoctorRepair=Yt,exports.redactDiagnosticText=wt,exports.renderDoctorReport=_t,exports.resolveCommandOnPath=ft,exports.resolveEditor=vn,exports.resolveProviderSetupSelection=Ho,exports.resolveShell=Rl,exports.runDoctor=dn,exports.runProviderSetupPromptFlow=Wo,exports.runProviderStartupSetup=Us,exports.spawnInherited=k,exports.submitProviderSetupValue=Uo,exports.validateProviderSetupValue=Xo;
97
+ `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function zs(t,n,r,i,a){let o=await Rs(r,i),s=Vs(n),c=Object.keys((0,e.readMergedProviderSettings)(s.sources).providers??{}),l=Hs(s.stores,n.settingsScope),u;u=o.preselectedType===void 0?Ro(await r(Lo(a)),a):o.preselectedType,(0,e.applyProviderConfiguration)(l,await Bo(u,r,a,{existingProfileNames:c}),{providerDefinitions:a});let d=await r(` Response language (ko/en/ja/zh, default: en): `);if(d){let e=l.read();e.language=d,l.write(e)}i.writeLine(`\n Config saved to ${l.displayName}\n`)}async function Bs(t,n,r,i,a,o){let s=Vs(n),c=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?c:{...c,currentProvider:n.provider},a)===`valid`||n.provider===void 0&&(0,e.resolveEnvDefaultProvider)(a,o.env)!==void 0)return;if(!(o.isInteractive??(()=>!1))())throw new e.ProviderConfigError(o.formatError(a));await zs(t,Us(n,s.stores),r,i,a);let l=(0,e.readMergedProviderSettings)(s.sources);if((0,e.checkSettingsDocument)(n.provider===void 0?l:{...l,currentProvider:n.provider},a)!==`valid`)throw new e.ProviderConfigError(o.formatError(a))}function Vs(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 Hs(t,n){if(n===void 0)return(0,e.resolveProviderSettingsWriteTarget)(t);let r=n===`user`?`user`:`project-local`,i=t.findLast(e=>e.scope===r);if(i!==void 0)return i;throw new e.WorkspaceAuthorityRequiredError(`No authorized ${r} settings store is available.`)}function Us(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:Ws(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function Ws(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 Gs="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 Ks(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 qs(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=Ks(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\`: ${Gs}`,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\`: ${Gs}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function Js(){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 Ys(){return T(Js(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>qs(e,t)})}var Xs=class{name=`remote-control`;getCommands(){return[Js()]}};function Zs(){return{name:`agent-command-remote-control`,commandSources:[new Xs],systemCommands:[Ys()]}}function Qs(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function $s(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function ec(){let e=$s();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Qs}}var tc=class{name=`reset`;getCommands(){return[$s()]}};function nc(){return{name:`agent-command-reset`,commandSources:[new tc],systemCommands:[ec()]}}function U(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function rc(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function ic(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${rc(e.prompt)}`):[`(no edit checkpoints)`]].join(`
99
+ `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function ac(e){return e.length>0?e.join(`, `):`(none)`}function oc(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: ${rc(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${ac(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${ac(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
100
+ `),success:!0,data:{inspection:e}}}function sc(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 cc(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 lc(e){return e.reason===`restricted-workspace`?`Edit checkpoints need a trusted workspace: run robota trust --yes, then restart robota.`:e.message}function W(t){return{message:t instanceof e.EditCheckpointsUnavailableError?lc(t):t instanceof Error?t.message:String(t),success:!1}}function uc(t){try{return ic((0,e.listCommandEditCheckpoints)(t))}catch(e){return W(e instanceof Error?e:String(e))}}function dc(t,n){if(!n)return U();try{return oc((0,e.inspectCommandEditCheckpoint)(t,n))}catch(e){return W(e instanceof Error?e:String(e))}}async function fc(t,n){if(!n)return U();try{return sc(await(0,e.restoreCommandEditCheckpoint)(t,n))}catch(e){return W(e instanceof Error?e:String(e))}}async function pc(t,n){if(!n)return U();try{return cc(await(0,e.rollbackCommandEditCheckpoint)(t,n))}catch(e){return W(e instanceof Error?e:String(e))}}async function mc(t,n){if(!n)return U();try{let r=await(0,e.forkCommandEditCheckpoint)(t,n);return{message:[`Forked a new branch from ${r.target.id} (the previous future is preserved).`,`Restored files: ${r.restoredFileCount}`].join(`
103
+ `),success:!0,data:{target:r.target,restoredFileCount:r.restoredFileCount}}}catch(e){return W(e instanceof Error?e:String(e))}}function hc(t,n){if(!n)return U();try{return(0,e.switchCommandEditCheckpointBranch)(t,n),{message:`Switched to checkpoint branch ${n}.`,success:!0}}catch(e){return W(e instanceof Error?e:String(e))}}function gc(t){try{let n=(0,e.listCommandEditCheckpointBranches)(t);return{message:n.length===0?`No checkpoint branches yet.`:`Branch tips:\n${n.map(e=>`- ${e}`).join(`
104
+ `)}`,success:!0,data:{branches:n}}}catch(e){return W(e instanceof Error?e:String(e))}}async function _c(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?uc(e):r===`inspect`?dc(e,n[1]):r===`restore`||r===`code`?fc(e,n[1]):r===`rollback`?pc(e,n[1]):r===`fork`?mc(e,n[1]):r===`switch`?hc(e,n[1]):r===`branches`?gc(e):U()}function vc(){return{name:`rewind`,displayName:`Rewind History`,description:e.REWIND_COMMAND_DESCRIPTION,source:`rewind`,argumentHint:e.REWIND_COMMAND_ARGUMENT_HINT,modelInvocable:!1,safety:`write`,subcommands:(0,e.buildRewindCommandSubcommands)()}}function yc(){let e=vc();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:_c}}var bc=class{name=`rewind`;getCommands(){return[vc()]}};function xc(){return{name:`agent-command-rewind`,commandSources:[new bc],systemCommands:[yc()]}}function Sc(e,t){let n=Math.floor(Math.min(1800,t.milliseconds/2e3)),r=(0,l.createHash)(`sha256`).update(e).digest().readUInt32BE(0)%(n+1);if(r===0)return{cronExpression:t.cronExpression,jitterSeconds:r};let i=/^(\d+)(s|m|h)$/.exec(t.description);if(!i)throw Error(`Unsupported fixed-loop cadence for jitter.`);let a=Number(i[1]),o=i[2],s=r%60,c=Math.floor(r/60);return o===`s`?{cronExpression:a===60?`${r} * * * * *`:`${r}-59/${a} * * * * *`,jitterSeconds:r}:o===`m`?{cronExpression:a===60?`${s} ${c} * * * *`:`${s} ${c}-59/${a} * * * *`,jitterSeconds:r}:{cronExpression:a===24?`${s} ${c} 0 * * *`:`${s} ${c} */${a} * * *`,jitterSeconds:r}}const Cc=4096,G=new WeakMap,wc=new Set([`second`,`seconds`,`minute`,`minutes`,`hour`,`hours`,`day`,`days`,`s`,`m`,`h`,`d`]),Tc=`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.`,Ec={ui:void 0,source:`user`},K={s:1e3,m:6e4,h:36e5,d:864e5},Dc=[...Oc(60).map(e=>({cronExpression:e===60?`0 * * * * *`:`*/${e} * * * * *`,milliseconds:e*K.s,description:`${e}s`})),...Oc(60).filter(e=>e>1).map(e=>({cronExpression:e===60?`0 0 * * * *`:`0 */${e} * * * *`,milliseconds:e*K.m,description:`${e}m`})),...Oc(24).filter(e=>e>1).map(e=>({cronExpression:e===24?`0 0 0 * * *`:`0 0 */${e} * * *`,milliseconds:e*K.h,description:`${e}h`}))];function Oc(e){return Array.from({length:e},(e,t)=>t+1).filter(t=>e%t===0)}function kc(e,t){let n=Number(e),r=K[t];if(!Number.isSafeInteger(n)||n<=0||r===void 0)return;let i=n*r;return Number.isSafeInteger(i)&&i<=K.d?i:void 0}function Ac(e){let t=e.length;for(;t>0&&/[a-z]/i.test(e[t-1]);)--t;let n=e.slice(t).toLowerCase();if(!wc.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 jc(e,t){let n=t&&t.length<=Cc?t.trim():void 0;if(e===``)return;let r=/^(\d+)(s|m|h|d)$/i.exec(e);if(r&&n){let e=kc(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=kc(i[1],i[2].toLowerCase());return e&&t!==void 0&&!Ac(e)?{instruction:e,requestedMs:t}:void 0}let a=Ac(e);if(!a)return;let o=kc(a.amount,a.unit[0]);return o===void 0?void 0:{instruction:a.instruction,requestedMs:o}}function Mc(e){return Dc.find(t=>t.milliseconds>=e)}function q(e){return e.listSchedules().filter(e=>e.metadata?.sessionLoop===!0&&e.metadata?.sessionLoopSelfPaced!==!0&&e.status!==`cancelled`&&e.status!==`completed`&&e.status!==`failed`)}function J(e){return(e.listSelfPacedLoops?.()??[]).filter(e=>e.phase!==`stopped`&&e.phase!==`expired`)}function Y(e){let t=e.metadata?.sessionLoopId;return typeof t==`string`&&t.length>0?t:e.id}function Nc(e){let t=q(e),n=J(e);return t.length+n.length===0?`No other active loops.`:[...t.map(e=>`- ${Y(e)} [${e.status}] ${e.label}`),...n.map(e=>`- ${e.loopId} [${e.phase}] Loop: ${e.instruction}`)].join(`
105
+ `)}async function Pc(e,n,r){if(n.source===`model`)return{success:!1,message:`Starting a loop with its built-in prompt needs a person to confirm it — ask the user to run /loop, or give your own prompt with /loop <prompt>.`};let{ui:i}=n;if(!i)return{success:!1,message:`A loop with the default maintenance prompt needs someone to confirm it. Start it from an interactive session, or give the loop its own prompt: /loop <prompt>`};let a=r.split(`
106
+ `)[0].trim()||r,o=await i.ask((0,t.selectAction)(`loop-start-default`,`Start a loop that keeps working on its own for up to 7 days? It will: ${a}`,[{value:`start`,label:`Start`},{value:`cancel`,label:`Cancel`}],{description:Nc(e)}));if(!(o.type===`answer`&&o.values.includes(`start`)))return{success:!0,message:`Loop not started.`}}async function Fc(t,n,r,i={},a=Ec){let o=r.trim();return o===`list`?Ic(t,i):(0,e.isLoopStopVerb)(o)?Lc(t,n,o):i.disabled?{success:!1,message:`Session loops are disabled by the host.`}:Rc(t,o,i,a)}function Ic(e,t){let n=q(e),r=J(e);return{success:!0,message:(t.disabled?`Session loops are disabled by the host.
107
+ `:``)+(n.length+r.length===0?`No active loops.`:[...n.map(e=>`- ${Y(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 Lc(e,t,n){let r=/^stop\s+(\S+)$/.exec(n);if(!r)return{success:!1,message:Tc};let i=J(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=q(e).find(e=>Y(e)===r[1]);return a?(await t(a.id,`Loop stopped by user`),{success:!0,message:`Loop stopped: ${Y(a)}. An already-running turn may finish.`,data:{loopId:Y(a),taskId:a.id}}):{success:!1,message:`Active loop not found: ${r[1]}`}}async function Rc(e,t,n,r=Ec){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=jc(t,a);if(!o){if(/^\d+[a-z](?:\s|$)/i.test(t)||Ac(t))return{success:!1,message:Tc};let n=(t||a||``).trim();if(!n||t===``&&n.length>Cc)return{success:!1,message:Tc};if(!e.createSelfPacedLoop)return{success:!1,message:`Self-paced loops require a persistent interactive session.`};if(i){let t=await Pc(e,r,n);if(t)return t}let o=G.get(e)??0;if(q(e).length+J(e).length+o>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};G.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=(G.get(e)??1)-1;t===0?G.delete(e):G.set(e,t)}}if(i){let t=await Pc(e,r,o.instruction);if(t)return t}let s=G.get(e)??0;if(q(e).length+J(e).length+s>=3)return{success:!1,message:`At most 3 active loops are allowed. Stop one before creating another.`};let c=Mc(o.requestedMs),u=`Loop: ${o.instruction.slice(0,48)}`,d=`loop_${(0,l.randomUUID)()}`,f=Sc(d,c),p=Date.now(),m=new Date(p+o.requestedMs).toISOString(),h=new Date(p+6048e5).toISOString();G.set(e,s+1);let g;try{g=await e.spawnScheduledWake({label:u,cronExpression:f.cronExpression,agentInstruction:o.instruction,sessionLoop:!0,sessionLoopId:d,...i?{sessionLoopDefaultPrompt:!0}:{},sessionLoopFirstAllowedAt:m,sessionLoopExpiresAt:h})}finally{let t=(G.get(e)??1)-1;t===0?G.delete(e):G.set(e,t)}let _=c.milliseconds===o.requestedMs?``:` (rounded up)`,v=g.kind===`scheduled`&&g.nextFireAt&&g.nextFireAt>=m?` Next fire: ${g.nextFireAt}.`:``;return{success:!0,message:`Loop ${d} uses a ${c.description}${_} local-clock step with stable offset +${f.jitterSeconds}s; elapsed gaps can change with daylight saving. First eligible at or after ${m}.${v} Expires: ${h}. Stop with /loop stop ${d}.`,data:{loopId:d,taskId:g.id,requestedMs:o.requestedMs,cadenceLabel:c.description,cronExpression:f.cronExpression,jitterSeconds:f.jitterSeconds,firstAllowedAt:m,expiresAt:h}}}const zc={s:1e3,m:6e4,h:36e5,d:864e5},X=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function Bc(e,t){let n=e.trim();if(n.length===0)return{ok:!1,error:X};if(n.startsWith(`in `)){let e=n.slice(3).trim(),r=e.indexOf(` `);if(r===-1)return{ok:!1,error:`Missing instruction. ${X}`};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}". ${X}`};if(a.length===0)return{ok:!1,error:`Missing instruction. ${X}`};let s=parseInt(o[1],10)*zc[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. ${X}`};let r=t[2].trim();return r.length===0?{ok:!1,error:`Missing instruction. ${X}`}:{ok:!0,spec:{cronExpression:t[1].trim(),instruction:r,recurring:!0}}}return{ok:!1,error:X}}function Vc(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}const Hc=`Usage: /schedule list | pause <id> | resume <id> | edit <id> <spec> (or a create spec: in <N><s|m|h|d> … | cron "<expr>" …)`;function Uc(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 Wc(e,t,n,r){if(t===`list`){let t=e.listSchedules();return{message:Uc(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:Hc,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:Hc,success:!1};let o=Bc(a,r);return o.ok?(await e.editSchedule(i,{cronExpression:o.spec.cronExpression,agentInstruction:o.spec.instruction,label:Vc(`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 Gc(e,t,n=Date.now()){let r=t.trim(),i=r.indexOf(` `),a=await Wc(e,(i===-1?r:r.slice(0,i)).toLowerCase(),i===-1?``:r.slice(i+1).trim(),n);if(a)return a;let o=Bc(t,n);if(!o.ok)return{message:`${o.error}\n${Hc}`,success:!1};let{cronExpression:s,instruction:c,recurring:l}=o.spec,u=await e.spawnScheduledWake({label:Vc(`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 Kc(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 qc(t,n){let r=Kc(n);if(!r)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let i;try{i=await t.spawnMonitorWake({label:Vc(`Monitor`,r.instruction),command:r.command,matchPattern:r.matchPattern,agentInstruction:r.instruction})}catch(t){if(t instanceof e.MonitorCommandRefusedError)return{message:t.message,success:!1};throw t}return{message:`Monitoring \`${r.command}\` for /${r.matchPattern}/ — task ${i.id}.`,success:!0,data:{taskId:i.id,matchPattern:r.matchPattern}}}function Jc(e){let t=e.getAgentJobCapability();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function Yc(){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 Xc(){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 Zc(){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 Qc(){let e=Yc();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)=>Gc(Jc(e),t)}}function $c(){let e=Xc();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)=>qc(Jc(e),t)}}function el(e){let t=Zc();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)=>Fc(Jc(t),(e,n)=>t.cancelBackgroundTask(e,n),n,e,{ui:t.getUserInteraction(),source:t.getCommandInvocationSource()})}}var tl=class{name=`schedule`;getCommands(){return[Yc(),Xc(),Zc()]}};function nl(e={}){return{name:`agent-command-schedule`,commandSources:[new tl],systemCommands:[Qc(),$c(),el(e)],sessionRequirements:[`agent-runtime`]}}function rl(e,n,r){return(0,t.calculateModelCost)(e,n,r)}function Z(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function il(e){return e.toLocaleString(`en-US`)}const al=`Conversation cleared.`;function ol(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 sl(n,r){let i=n.getUserInteraction();return i&&!(0,t.isConfirmed)(await i.ask((0,t.confirmAction)(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:((0,e.clearConversationHistory)(n),{success:!0,message:al})}function cl(t,n){let r=(0,e.parseSessionNameArgument)(n);return r===void 0?{success:!1,message:e.RENAME_COMMAND_USAGE}:{success:!0,message:`Session renamed to "${r}".`,data:{name:r},hostActions:[(0,e.createSessionRenameHostAction)(r)]}}function ll(){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},uiIntents:[(0,e.createShowSessionPickerIntent)()]}}function ul(e){return e.getCommandHostAdapters?.().costBudget}const dl=`Budget persistence is not available on this host (no cost-budget adapter was composed).`;function fl(e){return`Could not write the budget: ${e instanceof Error?e.message:String(e)}`}function pl(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?rl(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 ml(t){let n=t.getSession(),r=(0,e.readCommandSessionInfo)(t),i=n.getModelId(),a=pl(t.getSessionUsage(),i),o=[`Session: ${r.sessionId}`,`Messages: ${r.messageCount}`],s={sessionId:r.sessionId,messageCount:r.messageCount};if(a){o.push(`Tokens: ${il(a.inputTokens)} input / ${il(a.outputTokens)} output`),s.inputTokens=a.inputTokens,s.outputTokens=a.outputTokens;let e=a.costUsd;if(e!==void 0){let n=a.models.length>1?`mixed: ${a.models.join(`, `)}`:a.models[0]??``,r=a.partial?`; some usage could not be priced`:``;o.push(`Cost: ${Z(e)} (${n}${r})`),s.estimatedCostUsd=e,s.costModels=a.models,a.partial&&(s.costPartial=!0);let i=ul(t)?.read();if(i?.monthly){let t=i.monthly-e,n=Math.min(100,Math.round(e/i.monthly*100));o.push(`Budget: ${Z(t)} remaining of ${Z(i.monthly)}/mo (${n}% used)`),s.budgetMonthly=i.monthly,s.budgetRemainingUsd=t}}}else o.push(`Tokens: not yet available (no turns completed)`);return{lines:o,data:s}}function hl(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=ul(e);if(i===void 0)return{success:!1,message:dl};if(t===`clear`){try{i.clear()}catch(e){return{success:!1,message:fl(e)}}return{success:!0,message:`Monthly budget cleared.`}}if(t===``){let e=i.read();return e?.monthly?{success:!0,message:`Monthly budget: ${Z(e.monthly)}`}:{success:!0,message:`No budget set. Use: /cost budget <amount>`}}if(r===void 0)return{success:!1,message:dl};try{i.write({monthly:r})}catch(e){return{success:!1,message:fl(e)}}return{success:!0,message:`Monthly budget set to ${Z(r)}.`}}let{lines:r,data:i}=ml(e);return{success:!0,message:r.join(`
110
+ `),data:i}}function gl(t,n){let r=(0,e.validateCommandSessionReplayLog)(t);return{success:r.validation.ok,message:(0,e.formatCommandSessionReplayValidationReport)(r),data:{logFile:r.logFile,entryCount:r.entryCount,issueCount:r.validation.issues.length,ok:r.validation.ok}}}function _l(){return{name:`clear`,displayName:`Clear History`,description:e.CLEAR_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function vl(){return{name:`rename`,displayName:`Rename Session`,description:e.RENAME_COMMAND_DESCRIPTION,argumentHint:`<name>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function yl(){return{name:`cd`,displayName:`Change Directory`,description:`Move this session to another working directory`,argumentHint:`<directory>`,source:`session`,modelInvocable:!1,userInvocable:!0}}function bl(){return{name:`resume`,displayName:`Resume Session`,description:e.RESUME_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function xl(){return{name:`cost`,displayName:`Session Cost`,description:e.COST_COMMAND_DESCRIPTION,modelDescription:"Report this session’s token usage and estimated cost. Use it before an expensive step (a large refactor, many subagents) or when the user asks what the session has cost. Returns the message count, input/output token totals and the estimated USD cost, with the remaining monthly budget when one is set. Setting or clearing the budget is the user’s decision: suggest `/cost budget <amount>`.",argumentHint:`[budget [<amount>|clear]]`,runsBare:!0,source:`session`,modelInvocable:!0,userInvocable:!0,subcommands:[{name:`budget`,description:`Show, set, or clear the monthly budget`,argumentHint:`[<amount>|clear]`,source:`session`,modelInvocable:!1}]}}function Sl(){return{name:`validate-session`,displayName:`Validate Session`,description:e.VALIDATE_SESSION_COMMAND_DESCRIPTION,source:`session`,modelInvocable:!1,userInvocable:!0}}function Cl(){return T(_l(),{requiresPermission:!1,lifecycle:`inline`,execute:sl})}function wl(){return T(vl(),{requiresPermission:!1,lifecycle:`inline`,execute:cl})}function Tl(){return T(yl(),{requiresPermission:!1,lifecycle:`inline`,execute:ol})}function El(){return T(bl(),{requiresPermission:!1,lifecycle:`inline`,execute:ll})}function Dl(){return T(xl(),{requiresPermission:!1,lifecycle:`inline`,execute:hl})}function Ol(){return T(Sl(),{requiresPermission:!1,lifecycle:`inline`,execute:gl})}var kl=class{name=`session`;getCommands(){return[_l(),vl(),yl(),bl(),xl(),Sl()]}};function Al(){return{name:`agent-command-session`,commandSources:[new kl],systemCommands:[Cl(),wl(),Tl(),El(),Dl(),Ol()]}}function jl(){return{name:`settings`,displayName:`Settings`,description:`Open settings — language, output style, preset, permissions and more`,source:`settings`,modelInvocable:!1}}function Ml(){let e=jl();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 Nl=class{name=`settings`;getCommands(){return[jl()]}};function Pl(){return{name:`agent-command-settings`,commandSources:[new Nl],systemCommands:[Ml()]}}function Fl(e){let n=(0,t.resolvePlatformShell)({executable:e});return{command:n.command,interactiveArgs:n.interactiveArgs,commandArgs:e=>n.commandArgs(e)}}const Il="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function Ll(e,t,n){if(!e.canHandoffTerminal())return{message:`An interactive shell is unavailable here (no interactive terminal).`,success:!1};let r=Fl(n),i=e.getCwd(),a=t.trim(),o=await e.runWithTerminal(async()=>a.length>0?k(r.command,r.commandArgs(a),i):k(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 Rl(){return{name:`shell`,displayName:`Shell`,description:Il,source:`shell`,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}function zl(e){let t=Rl();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)=>Ll(t,n,e)}}var Bl=class{name=`shell`;getCommands(){return[Rl()]}};function Vl(e){return{name:`agent-command-shell`,commandSources:[new Bl],systemCommands:[zl(e)]}}const Hl=`List registered skills, or activate one by name`;function Ul(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 Wl(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${Ul(e)}`}function Gl(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(Wl),``,`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 Kl(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 ql(e,t=``){let n=Kl(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:Gl(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function Jl(){return{name:`skills`,displayName:`Skills`,description:Hl,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 Yl(){let e=Jl();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:ql}}var Xl=class{name=`skills`;getCommands(){return[Jl()]}};function Zl(t){let n=[new Xl];return n.push(new e.SkillCommandSource(t.contributionSources,t.skillRoots??[])),{name:`agent-command-skills`,commandSources:n,systemCommands:[Yl()]}}const Ql=[`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 $l(t){let n=t.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[r,i]=n;return r===`on`&&i===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:r===`off`&&i===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:r===`reset`&&i===void 0?{success:!0,message:`Status line settings reset.`,patch:{...e.DEFAULT_STATUS_LINE_COMMAND_SETTINGS}}:r===`git`&&i===`on`&&n.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:r===`git`&&i===`off`&&n.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:Ql}}function eu(e,t){let n=$l(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function tu(){return{name:`statusline`,displayName:`Status Line`,description:e.STATUSLINE_COMMAND_DESCRIPTION,source:`statusline`,argumentHint:e.STATUSLINE_COMMAND_ARGUMENT_HINT,subcommands:(0,e.buildStatusLineCommandSubcommands)(`statusline`),modelInvocable:!1}}function nu(){let e=tu();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:eu}}var ru=class{name=`statusline`;getCommands(){return[tu()]}};function iu(){return{name:`agent-command-statusline`,commandSources:[new ru],systemCommands:[nu()]}}const au=`list | <theme-id> | syntax on|off | motion on|off`;function Q(e){return e?`on`:`off`}function ou(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?`${Q(n.reducedMotion)} for this run (pinned by ${n.tier}; saved ${Q(t.reducedMotion)})`:Q(t.reducedMotion);return[`Available themes:`,...r,``,`syntax highlighting: ${Q(t.syntaxHighlighting)}`,`reduced motion: ${i}`].join(`
114
+ `)}function su(e){return{success:!0,message:ou(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function cu(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function lu(e){if(e===`on`)return!0;if(e===`off`)return!1}function uu(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=lu(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${au}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function du(e,t,n){let r=[];t&&r.push(`theme ${t.name}`),e.syntaxHighlighting!==void 0&&r.push(`syntax highlighting ${Q(e.syntaxHighlighting)}`),e.reducedMotion!==void 0&&r.push(`motion ${Q(!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 fu(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 su(e);let r=uu(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${au}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return cu(r.themeId,e);i.theme=a.id}return{success:!0,message:du(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function pu(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:au,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var mu=class{name=`theme`;getCommands(){return[pu()]}};function hu(e){let t=pu(),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)=>fu(e,n)};return{name:`agent-command-theme`,commandSources:[new mu],systemCommands:[n]}}const gu=`Inspect user-local storage and memory state.`,_u=`storage list [--format json] | memory set/list/inspect/disable/delete`,vu=`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 yu(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
115
+ `)}function $(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function bu(t,n,r){let i=await(0,e.listUserLocalMemoryItems)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):yu(i.items),success:!0,data:{list:i}}}async function xu(t,n,r){let[i,a,o]=r.positional,s=await(0,e.setUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:$(i),key:a??``,value:o??``,summary:r.summary??``,source:r.source??``});return{message:`Stored user-local memory item ${s.category}/${s.key} at ${s.storageLocation}`,success:!0,data:{item:s}}}async function Su(t,n,r){let[i,a]=r.positional,o=await(0,e.inspectUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:$(i),key:a??``});return{message:r.format===`json`?JSON.stringify(o,null,2):`${o.category}/${o.key}: ${o.summary}`,success:!0,data:{item:o}}}async function Cu(t,n,r){let[i,a]=r.positional,o=await(0,e.disableUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:$(i),key:a??``});return{message:`Disabled user-local memory item ${o.category}/${o.key}`,success:!0,data:{item:o}}}async function wu(t,n,r){let[i,a]=r.positional,o=await(0,e.deleteUserLocalMemoryItem)({activeRepositoryRoot:t,storageRoot:n,category:$(i),key:a??``});return{message:`Deleted user-local memory item ${o.category}/${o.key}`,success:!0,data:{result:o}}}async function Tu(e,t,n){return(n.action??`list`)===`list`?bu(e,t,n):n.action===`set`?xu(e,t,n):n.action===`inspect`?Su(e,t,n):n.action===`disable`?Cu(e,t,n):n.action===`delete`?wu(e,t,n):{message:vu,success:!1}}function Eu(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Du(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 Ou(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=Du(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:Eu(n),summary:r,source:i}}function ku(e){return e.trim().split(/\s+/).filter(Boolean)}function Au(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
116
+ `)}async function ju(t,n,r){if((r.action??`list`)!==`list`)return{message:vu,success:!1};let i=await(0,e.inspectUserLocalStorage)({activeRepositoryRoot:t,storageRoot:n});return{message:r.format===`json`?JSON.stringify(i,null,2):Au(i.root,i.categories),success:!0,data:{root:i.root,categories:i.categories,inspection:i}}}async function Mu(e,t,n){return n.target===`storage`?ju(e,t,n):n.target===`memory`?Tu(e,t,n):{message:vu,success:!1}}function Nu(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Pu(e){try{return await Mu(e.cwd,e.storageRoot,Ou(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:Nu(e instanceof Error?e.message:String(e)),success:!1}}}async function Fu(e,t,n){try{return await Mu(e.getCwd(),n,Ou(ku(t)))}catch(e){return{message:Nu(e instanceof Error?e.message:String(e)),success:!1}}}function Iu(){return{name:`user-local`,displayName:`User Config`,description:gu,source:`user-local`,argumentHint:_u,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 Lu(e){let t=Iu();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)=>Fu(t,n,e)}}var Ru=class{name=`user-local`;getCommands(){return[Iu()]}};function zu(e){return{name:`agent-command-user-local`,commandSources:[new Ru],systemCommands:[Lu(e)]}}function Bu(t,n,r){return(0,e.selectCommandModules)(t,n,r)}function Vu({cwd:t,userLocalStorageRoot:n,editorTemporaryDirectoryPrefix:r,contributionSources:i,skillRoots:a,providerDefinitions:o,providerSettingsAdapter:s,orgPolicy:c,keybindingsFilePort:l,themeCataloguePort:u,devicesPort:d,doctorInputs:f,doctorDisplay:p,formatForkResumeCommand:m,loopOptions:h,enabledCommandModules:g,disabledCommandModules:_}){let v=[Zl({contributionSources:i??[],skillRoots:a}),Br(),ve(),Un(),jn(),Qa(),Zi(),va(),Io(),Da(),Xr(),we(),ir(m),Dr(),io(),Vl(),wn(r),br(),Wr(l),hu(u),...f===void 0?[]:[_n(f,void 0,p)],Hi(),Ei(),zu(n),Ae(),$e(),Jn(),Al(),nc(),xc(),nl(h),iu(),wo(),Pl(),Ja(),Fa(),Fr(),Zs(),...d===void 0?[]:[lt(d)],Ls({providerDefinitions:o,settings:s,...c===void 0?{}:{orgPolicy:c}}),la({providerDefinitions:o,settings:s,...c===void 0?{}:{orgPolicy:c}})],ee=v.map(e=>e.name);return{modules:Bu(v,g,_),unknownModuleNames:(0,e.findUnknownModuleNames)(ee,g,_)}}function Hu(t){let{shellExecutable:n,editorTemporaryDirectoryPrefix:r,keybindingsFile:i,themeCatalogue:a,enabledCommandModules:o,disabledCommandModules:s}=t,c=[[Vl(n),(e,t)=>Ll(e,t,n)],[wn(r),(e,t)=>bn(e,t,r)],[Wr(i),e=>Hr(i,e)],[hu(a),(e,t)=>fu(a,t)]],l=new Set((0,e.selectCommandModules)(c.map(([e])=>e),o,s));return c.filter(([e])=>l.has(e)).flatMap(([e,t])=>(e.systemCommands??[]).map(e=>({name:e.name,execute:t})))}exports.ADVISOR_SETTING_KEY=Tn,exports.AdvisorCommandSource=An,exports.AgentCommandSource=_e,exports.BackgroundCommandSource=Ce,exports.CLEAR_COMMAND_MESSAGE=al,exports.CompactCommandSource=ke,exports.ContextCommandSource=Qe,exports.DoctorCommandSource=pn,exports.EDITOR_COMMAND_DESCRIPTION=yn,exports.EditorCommandSource=Cn,exports.EffortCommandSource=Hn,exports.ExitCommandSource=qn,exports.GOAL_COMMAND_DESCRIPTION=xr,exports.GitCommandSource=yr,exports.GoalCommandSource=Er,exports.HandoffCommandSource=Pr,exports.HelpCommandSource=zr,exports.KeybindingsCommandSource=Ur,exports.LanguageCommandSource=Yr,exports.MCPActivationCommandSource=Ti,exports.MemoryCommandSource=Vi,exports.ModeCommandSource=Xi,exports.ModelCommandSource=ca,exports.OutputStyleCommandSource=Ea,exports.PermissionsCommandSource=Za,exports.PluginManagerCommandSource=Co,exports.PresetCommandSource=Fo,exports.ProviderCommandSource=Fs,exports.RemoteControlCommandSource=Xs,exports.RewindCommandSource=bc,exports.SANDBOX_MODES=L,exports.SHELL_COMMAND_DESCRIPTION=Il,exports.SKILLS_COMMAND_DESCRIPTION=Hl,exports.STATUSLINE_USAGE=Ql,exports.STORAGE_REPAIR_ID=Wt,exports.SandboxCommandSource=_a,exports.ScheduleCommandSource=tl,exports.SessionCommandSource=kl,exports.SettingsCommandSource=Nl,exports.ShellCommandSource=Bl,exports.SkillsCommandSource=Xl,exports.StatusLineCommandSource=ru,exports.ThemeCommandSource=mu,exports.USER_LOCAL_COMMAND_ARGUMENT_HINT=_u,exports.USER_LOCAL_COMMAND_DESCRIPTION=gu,exports.USER_LOCAL_COMMAND_USAGE=vu,exports.UserLocalCommandSource=Ru,exports.applyDoctorRepair=Xt,exports.buildDoctorReport=ln,exports.collectSettingsSecrets=Et,exports.createAdvisorCommandEntry=On,exports.createAdvisorCommandModule=jn,exports.createAgentCommandEntry=he,exports.createAgentCommandModule=ve,exports.createAgentSystemCommand=ge,exports.createBackgroundCommandEntry=xe,exports.createBackgroundCommandModule=we,exports.createClearCommandEntry=_l,exports.createCompactCommandEntry=De,exports.createCompactCommandModule=Ae,exports.createContextCommandEntry=Xe,exports.createContextCommandModule=$e,exports.createCostCommandEntry=xl,exports.createDefaultCommandModules=Vu,exports.createDevicesCommandModule=lt,exports.createDoctorCommandEntry=fn,exports.createDoctorCommandModule=_n,exports.createEditorCommandEntry=xn,exports.createEditorCommandModule=wn,exports.createEffortCommandEntry=Bn,exports.createEffortCommandModule=Un,exports.createExitCommandEntry=Gn,exports.createExitCommandModule=Jn,exports.createGitCommandEntry=gr,exports.createGitCommandModule=br,Object.defineProperty(exports,"createGitProcess",{enumerable:!0,get:function(){return e.createGitProcess}}),exports.createGoalCommandEntry=wr,exports.createGoalCommandModule=Dr,exports.createHandoffCommandEntry=Mr,exports.createHandoffCommandModule=Fr,exports.createHelpCommandEntry=Lr,exports.createHelpCommandModule=Br,exports.createKeybindingsCommandEntry=Vr,exports.createKeybindingsCommandModule=Wr,exports.createLanguageCommandEntry=qr,exports.createLanguageCommandModule=Xr,exports.createLoopCommandEntry=Zc,exports.createMCPActivationCommandEntry=Si,exports.createMCPActivationCommandModule=Ei,exports.createMemoryCommandEntry=zi,exports.createMemoryCommandModule=Hi,exports.createModeCommandEntry=Ji,exports.createModeCommandModule=Zi,exports.createModelCommandEntry=oa,exports.createModelCommandModule=la,exports.createMonitorCommandEntry=Xc,exports.createNodeDoctorDeps=mt,exports.createOutputStyleCommandEntry=wa,exports.createOutputStyleCommandModule=Da,exports.createPermissionsCommandEntry=Ya,exports.createPermissionsCommandModule=Qa,exports.createPlanCommandModule=io,exports.createPluginCommandEntry=yo,exports.createPluginCommandModule=wo,exports.createPresetCommandEntry=No,exports.createPresetCommandModule=Io,exports.createProviderCommandEntry=Ps,exports.createProviderCommandModule=Ls,exports.createProviderSetupFlow=V,exports.createReloadPluginsCommandEntry=bo,exports.createRemoteControlCommandEntry=Js,exports.createRemoteControlCommandModule=Zs,exports.createRenameCommandEntry=vl,exports.createResetCommandEntry=$s,exports.createResetCommandModule=nc,exports.createResumeCommandEntry=bl,exports.createRewindCommandModule=xc,exports.createSandboxCommandModule=va,exports.createScheduleCommandEntry=Yc,exports.createScheduleCommandModule=nl,exports.createSessionCommandModule=Al,exports.createSettingsCommandEntry=jl,exports.createSettingsCommandModule=Pl,exports.createShellCommandEntry=Rl,exports.createShellCommandModule=Vl,exports.createSkillsCommandEntry=Jl,exports.createSkillsCommandModule=Zl,exports.createStatusLineCommandEntry=tu,exports.createStatusLineCommandModule=iu,exports.createTerminalClientCommands=Hu,exports.createThemeCommandEntry=pu,exports.createThemeCommandModule=hu,exports.createUserLocalCommandEntry=Iu,exports.createUserLocalCommandModule=zu,exports.createValidateSessionCommandEntry=Sl,exports.doctorRepairAllowlist=Gt,exports.ensureProviderConfig=Bs,exports.executeAdvisorCommand=Dn,exports.executeAgentCommand=de,exports.executeBackgroundCommand=be,exports.executeClearCommand=sl,exports.executeCompactCommand=Ee,exports.executeContextCommand=Ve,exports.executeCostCommand=hl,exports.executeEditorCommand=bn,exports.executeEffortCommand=Rn,exports.executeExitCommand=Wn,exports.executeGitCommand=_r,exports.executeGoalCommand=Cr,exports.executeHandoffCommand=Ar,exports.executeHelpCommand=Ir,exports.executeLanguageCommand=Kr,exports.executeLoopCommand=Fc,exports.executeMCPActivationCommand=mi,exports.executeMemoryCommand=Ri,exports.executeModeCommand=qi,exports.executeModelCommand=ea,exports.executeMonitorCommand=qc,exports.executeOutputStyleCommand=Ca,exports.executePermissionsCommand=Gi,exports.executePluginCommand=_o,exports.executePresetCommand=jo,exports.executeProviderCommand=Ds,exports.executeReloadPluginsCommand=vo,exports.executeRemoteControlCommand=qs,exports.executeRenameCommand=cl,exports.executeResetCommand=Qs,exports.executeResumeCommand=ll,exports.executeRewindCommand=_c,exports.executeSandboxCommand=pa,exports.executeScheduleCommand=Gc,exports.executeShellCommand=Ll,exports.executeSkillsCommand=ql,exports.executeStatusLineCommand=eu,exports.executeThemeCommand=fu,exports.executeUserLocalCommand=Fu,exports.executeUserLocalDirectCommand=Pu,exports.executeValidateSessionCommand=gl,exports.formatProviderSetupChoiceLabel=Uo,exports.formatProviderSetupHelpLinks=Wo,exports.formatProviderSetupPromptLabel=Vo,exports.formatProviderSetupSelectionPrompt=Lo,exports.formatSandboxStatus=da,exports.getProviderSetupStep=H,Object.defineProperty(exports,"gitEnvironment",{enumerable:!0,get:function(){return e.gitEnvironment}}),exports.isDoctorRepairId=Kt,exports.mcpUnavailableServersNotice=ti,exports.mcpUserActionCommand=Zr,exports.mcpUserActionNotice=ei,exports.parseScheduleSpec=Bc,exports.planDoctorRepair=Yt,exports.redactDiagnosticText=wt,exports.renderDoctorReport=vt,exports.resolveCommandOnPath=pt,exports.resolveEditor=vn,exports.resolveProviderSetupSelection=Ro,exports.resolveShell=Fl,exports.runDoctor=dn,exports.runProviderSetupPromptFlow=Bo,exports.runProviderStartupSetup=zs,exports.spawnInherited=k,exports.submitProviderSetupValue=zo,exports.validateProviderSetupValue=Ko;