@robota-sdk/agent-command 3.0.0-beta.76 → 3.0.0-beta.77

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 (53) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +12 -6
  3. package/dist/node/index.cjs +38 -33
  4. package/dist/node/index.d.ts +68 -6
  5. package/dist/node/index.d.ts.map +1 -1
  6. package/dist/node/index.js +40 -35
  7. package/dist/node/index.js.map +1 -1
  8. package/package.json +7 -7
  9. package/src/agent/agent-command-parser.ts +1 -1
  10. package/src/agent/agent-command.ts +2 -1
  11. package/src/background/__tests__/background-command-module.test.ts +2 -5
  12. package/src/default/__tests__/default-command-modules.test.ts +5 -2
  13. package/src/default/default-command-modules.ts +6 -0
  14. package/src/editor/__tests__/editor-command-functional.test.ts +91 -0
  15. package/src/editor/editor-command-module.ts +47 -0
  16. package/src/editor/editor-command.ts +53 -0
  17. package/src/editor/index.ts +7 -0
  18. package/src/editor/resolve-editor.ts +21 -0
  19. package/src/exit/__tests__/exit-command-module.test.ts +21 -2
  20. package/src/exit/exit-command-module.ts +1 -10
  21. package/src/exit/exit-command.ts +15 -1
  22. package/src/goal/__tests__/goal-command.test.ts +75 -0
  23. package/src/goal/goal-command-module.ts +48 -0
  24. package/src/goal/goal-command.ts +70 -0
  25. package/src/goal/index.ts +6 -0
  26. package/src/index.ts +3 -0
  27. package/src/language/__tests__/language-command-module.test.ts +16 -0
  28. package/src/language/language-command-module.ts +1 -18
  29. package/src/language/language-command.ts +35 -9
  30. package/src/mode/__tests__/mode-command-module.test.ts +34 -0
  31. package/src/mode/mode-command-module.ts +1 -18
  32. package/src/mode/mode-command.ts +31 -8
  33. package/src/preset/__tests__/preset-command-module.test.ts +36 -0
  34. package/src/preset/preset-command-module.ts +1 -18
  35. package/src/preset/preset-command.ts +37 -8
  36. package/src/provider/__tests__/org-policy.test.ts +19 -13
  37. package/src/provider/__tests__/provider-command-module.test.ts +151 -80
  38. package/src/provider/__tests__/scripted-interaction.ts +28 -0
  39. package/src/provider/provider-command-execution.ts +67 -50
  40. package/src/provider/provider-command-module.ts +3 -19
  41. package/src/provider/provider-command-profile-lifecycle.ts +52 -72
  42. package/src/provider/provider-command-profile-operations.ts +15 -51
  43. package/src/provider/provider-command-profile.ts +44 -49
  44. package/src/provider/provider-command-setup.ts +56 -51
  45. package/src/session/__tests__/session-command-module.test.ts +38 -0
  46. package/src/session/session-command-module.ts +1 -10
  47. package/src/session/session-command.ts +14 -1
  48. package/src/shell/__tests__/shell-command-functional.test.ts +96 -0
  49. package/src/shell/index.ts +8 -0
  50. package/src/shell/resolve-shell.ts +25 -0
  51. package/src/shell/shell-command-module.ts +47 -0
  52. package/src/shell/shell-command.ts +44 -0
  53. package/src/shell/spawn-inherited.ts +32 -0
@@ -1,29 +1,34 @@
1
- import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,BundlePluginInstaller as n,BundlePluginLoader as r,CLEAR_COMMAND_DESCRIPTION as i,COST_COMMAND_DESCRIPTION as a,DEFAULT_AUTO_COMPACT_THRESHOLD as o,DEFAULT_STATUS_LINE_COMMAND_SETTINGS as s,EXIT_COMMAND_DESCRIPTION as c,HELP_COMMAND_DESCRIPTION as l,LANGUAGE_COMMAND_ARGUMENT_HINT as ee,LANGUAGE_COMMAND_DESCRIPTION as te,MEMORY_COMMAND_ARGUMENT_HINT as ne,MEMORY_COMMAND_DESCRIPTION as re,MEMORY_COMMAND_USAGE as ie,MarketplaceClient as u,PERMISSIONS_COMMAND_DESCRIPTION as d,PERMISSION_MODE_ARGUMENT_HINT as f,PERMISSION_MODE_COMMAND_DESCRIPTION as ae,PLUGIN_COMMAND_ARGUMENT_HINT as oe,PLUGIN_COMMAND_DESCRIPTION as se,PluginCommandSource as ce,PluginSettingsStore as le,ProviderConfigError as ue,RELOAD_PLUGINS_COMMAND_DESCRIPTION as de,RENAME_COMMAND_DESCRIPTION as fe,RENAME_COMMAND_USAGE as pe,RESUME_COMMAND_DESCRIPTION as me,REWIND_COMMAND_ARGUMENT_HINT as he,REWIND_COMMAND_DESCRIPTION as ge,STATUSLINE_COMMAND_ARGUMENT_HINT as _e,STATUSLINE_COMMAND_DESCRIPTION as ve,SkillCommandSource as ye,VALIDATE_SESSION_COMMAND_DESCRIPTION as be,addCommandContextReference as xe,applyPresetToSession as Se,applyProviderConfiguration as Ce,buildBackgroundCommandSubcommands as we,buildLanguageCommandSubcommands as Te,buildMemoryCommandSubcommands as Ee,buildPermissionModeSubcommands as De,buildPluginCommandSubcommands as Oe,buildProviderSetupPatch as ke,buildRewindCommandSubcommands as Ae,buildStatusLineCommandSubcommands as je,cancelCommandBackgroundTask as Me,checkSettingsDocument as Ne,clearCommandContextReferences as Pe,clearConversationHistory as Fe,closeCommandBackgroundTask as Ie,compactCommandContext as Le,createCommandMemoryStores as Re,createPluginRegistryReloadRequestedEffect as ze,createPluginTuiRequestedEffect as Be,createSessionExitRequestedEffect as Ve,createSessionPickerRequestedEffect as He,createSessionRenamedEffect as Ue,deleteProviderProfile as We,deleteUserLocalMemoryItem as Ge,disableUserLocalMemoryItem as Ke,formatCommandBackgroundTaskList as qe,formatCommandHelpMessage as Je,formatCommandPermissionsMessage as Ye,formatCommandSessionReplayValidationReport as Xe,formatInvalidPermissionModeMessage as Ze,formatLanguageUsageMessage as Qe,formatOrgPolicyViolationMessage as $e,getProviderSettingsPaths as et,hasSensitiveCommandMemoryContent as tt,inspectCommandEditCheckpoint as nt,inspectUserLocalMemoryItem as rt,inspectUserLocalStorage as it,isApiKeyPlaintext as at,isCommandMemoryType as ot,isPermissionMode as st,listCommandBackgroundTasks as ct,listCommandContextReferences as lt,listCommandEditCheckpoints as ut,listCommandUsedMemoryReferences as dt,listUserLocalMemoryItems as ft,mergeProviderPatch as pt,parseCommandBackgroundLogCursor as mt,parseLanguageArgument as ht,parsePermissionModeArgument as gt,parseSessionNameArgument as _t,readAutoCompactThreshold as p,readAutoCompactThresholdSource as m,readCommandBackgroundTaskLog as vt,readCommandContextState as yt,readCommandPermissionMode as bt,readCommandPermissionsState as xt,readCommandSessionInfo as St,readMergedProviderSettings as Ct,readSettings as wt,recordCommandMemoryEvent as Tt,removeCommandContextReference as Et,resetAutoCompactThresholdSetting as Dt,resolveEnvDefaultProvider as Ot,resolvePluginCommandAdapter as kt,resolveSettingsPathForScope as At,restoreCommandEditCheckpoint as jt,rollbackCommandEditCheckpoint as Mt,sanitizeProviderProfileName as Nt,setCommandAutoCompactThreshold as Pt,setCurrentProvider as Ft,setUserLocalMemoryItem as It,suggestProviderProfileName as Lt,summarizeBackgroundJobGroup as Rt,testProviderProfileCommand as zt,upsertProviderProfile as Bt,validateCommandSessionReplayLog as Vt,writeAutoCompactThresholdSetting as Ht,writeCommandPermissionMode as Ut,writeSettings as Wt}from"@robota-sdk/agent-framework";import{CONTEXT_ESTIMATE_CHARS_PER_TOKEN as Gt,calculateModelCost as Kt,findProviderDefinition as qt,formatSupportedProviderTypes as h}from"@robota-sdk/agent-core";import{getPreset as Jt,listPresets as g,resolvePreset as Yt}from"@robota-sdk/agent-preset";import{join as _}from"node:path";import{existsSync as Xt,mkdirSync as Zt,readFileSync as Qt,writeFileSync as $t}from"node:fs";import{execSync as en}from"node:child_process";import{homedir as tn}from"node:os";const v=`general-purpose`;function nn(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 rn(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 y(e,t,n,r){return{agentType:t,label:n,mode:`background`,prompt:r,...e.model?{model:e.model}:{},...e.isolation?{isolation:e.isolation}:{}}}function an(e,t){let n=rn(e),[r,...i]=n.positional,a=n.agentType??v,o=n.positional;!n.agentType&&r&&t.has(r)&&(a=r,o=i);let s=o.join(` `).trim();if(s)return y(n,a,a,s)}function on(e,t){let n=rn(e);return n.positional.map(e=>sn(e,n,t)).filter(e=>e!==void 0)}function sn(e,t,n){let r=e.indexOf(`=`);if(r>0)return cn(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 y(t,t.agentType??(n.has(a)?a:v),a,o)}function cn(e,t,n,r){let i=t.indexOf(`:`);if(i===-1)return y(n,n.agentType??(r.has(e)?e:v),e,t);if(!(i===0||i===t.length-1))return y(n,t.slice(0,i),e,t.slice(i+1))}function b(e){return e instanceof Error?e.message:String(e)}function ln(e){return new Set(e.listAgentDefinitions().map(e=>e.name))}function un(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 dn(e,t){let n=un(e,t.agentType);if(n)return n;try{return{state:await e.spawnAgentJob(t)}}catch(e){return{message:b(e),success:!1}}}function fn(){return{message:``,effects:[{type:`agent-switcher-requested`}],success:!0}}async function pn(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=>` ${mn(e)}`)].join(`
2
- `),success:!0,data:{agents:t.length,jobs:n.length}}}function mn(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 hn(e,t){let n=an(t,ln(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await dn(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 gn(e,t){let n=t.includes(`--wait`)||!t.includes(`--detach`),r=on(t.filter(e=>e!==`--wait`&&e!==`--detach`),ln(e));if(r.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let i=r.map(t=>un(e,t.agentType)).find(e=>e!==void 0);if(i)return i;let a;try{a=await Promise.all(r.map(t=>e.spawnAgentJob(t)))}catch(e){return{message:b(e),success:!1}}let o=e.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:a.map(e=>e.id),label:`agent parallel`});if(n){let t=Rt(await e.waitBackgroundJobGroup(o.id));return{message:Cn(t),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id,summary:t}}}return{message:[`Started agent jobs:`,...a.map(e=>`${e.label}: ${e.id}`)].join(`
3
- `),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id}}}async function _n(e,t){let[n]=t;if(!n)return{message:`Usage: agent wait GROUP_ID`,success:!1};let r=Rt(await e.waitBackgroundJobGroup(n));return{message:Cn(r),success:!0,data:{groupId:n,summary:r}}}async function vn(e,t){let[n,r]=t;if(!n)return{message:`Usage: agent read AGENT_ID [OFFSET]`,success:!1};let i=r?{offset:Number.parseInt(r,10)}:void 0,a=await e.readBackgroundTaskLog(n,i),o=a.nextCursor?`\nNext offset: ${a.nextCursor.offset}`:``;return{message:a.lines.length>0?`${a.lines.join(`
4
- `)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function yn(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 bn(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 xn(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 Sn(e,t){try{if(t.trim()===``)return fn();let[n=`list`,...r]=nn(t);return n===`list`&&r.length===0?pn(e):n===`run`?hn(e,r):n===`parallel`?gn(e,r):n===`wait`?_n(e,r):n===`read`||n===`open`?vn(e,r):n===`send`?yn(e,r):n===`stop`||n===`cancel`?bn(e,r):n===`close`?xn(e,r):hn(e,[n,...r])}catch(e){return{message:b(e),success:!1}}}function Cn(e){return[`Background job group ${e.groupId}: ${e.status} (${e.completed}/${e.total} completed, ${e.failed} failed, ${e.cancelled} cancelled, ${e.pending} pending)`,...e.lines].join(`
5
- `)}function wn(e){let t=e.getAgentJobCapability?.();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function Tn(){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:`Focus an agent job detail view when supported`,source:`agent`}]}function x(){return{name:`agent`,displayName:`Agent Jobs`,description:[`Subagent jobs command.`,`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.`].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:Tn()}}function En(){let e=x();return{name:e.name,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>Sn(wn(e),t),...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety}}}var Dn=class{name=`agent`;getCommands(){return[x()]}};function On(){return{name:`agent-command-agent`,commandSources:[new Dn],systemCommands:[En()],sessionRequirements:[`agent-runtime`]}}function kn(e){return e.trim().split(/\s+/).filter(Boolean)}async function An(e,n){let[r=`list`,i,...a]=kn(n);if(r===`list`){let t=ct(e);return{message:qe(t),success:!0,data:{count:t.length}}}if(!i)return{message:t,success:!1};if(r===`read`||r===`log`||r===`open`){let t=await vt(e,i,mt(a[0])),n=t.nextCursor?`\nNext offset: ${t.nextCursor.offset}`:``;return{message:t.lines.length>0?`${t.lines.join(`
6
- `)}${n}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:t.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await Me(e,i,a.join(` `)||void 0),{message:`Background task cancelled: ${i}`,success:!0,data:{taskId:i}}):r===`close`||r===`dismiss`?(await Ie(e,i),{message:`Background task closed: ${i}`,success:!0,data:{taskId:i}}):{message:`Unknown background action: ${r}`,success:!1}}function S(){return{name:`background`,displayName:`Background Tasks`,description:e,source:`background`,modelInvocable:!1,subcommands:we()}}function jn(){let e=S();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,subcommands:e.subcommands,execute:An}}var Mn=class{name=`background`;getCommands(){return[S()]}};function Nn(){return{name:`agent-command-background`,commandSources:[new Mn],systemCommands:[jn()]}}function Pn(e){let t=e.trim();return t.length>0?t:void 0}async function Fn(e,t){let{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}=await Le(e,Pn(t)),o=i-a;return{message:[`Context compacted.`,` Removed messages: ${o} (${i>0?Math.round(o/i*100):0}% of total)`,` Context: ${Math.round(n.usedPercentage)}% → ${Math.round(r.usedPercentage)}%`].join(`
7
- `),success:!0,data:{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}}}function In(){return{name:`compact`,displayName:`Compact Context`,description:`Compress context window`,source:`compact`,modelInvocable:!0,argumentHint:`[instructions]`,safety:`write`,example:`/compact Summarize the current context`}}function Ln(){let e=In();return{name:e.name,displayName:e.displayName,description:e.description,example:e.example,requiresPermission:!1,userInvocable:!0,modelInvocable:e.modelInvocable,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`blocking`,execute:Fn}}var Rn=class{name=`compact`;getCommands(){return[In()]}};function zn(){return{name:`agent-command-compact`,commandSources:[new Rn],systemCommands:[Ln()]}}const C=[`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(`
8
- `);function w(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function Bn(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${w(e)} (${t})`}function Vn(e){return e?`settings`:`current session only`}async function Hn(e,t){let n=t.trim().split(/\s+/).filter(e=>e.length>0);if(n.length>0)return Un(e,n);let r=yt(e),i=p(e),a=m(e),o=er(e.getSession().getFullHistory()),s=lt(e);return{message:[`Context: ${r.usedTokens.toLocaleString()} / ${r.maxTokens.toLocaleString()} tokens (${Math.round(r.usedPercentage)}%)`,Bn(i,a),Xn(s),`History: ${o.turnCount} turn${o.turnCount===1?``:`s`}`].join(`
9
- `),success:!0,data:{usedTokens:r.usedTokens,maxTokens:r.maxTokens,percentage:r.usedPercentage,autoCompactThreshold:i,autoCompactThresholdSource:a,references:s}}}async function Un(e,t){let[n,...r]=t;if(n===`list`)return r.length>0?{success:!1,message:C}:nr(e);if(n===`add`)return Gn(e,r);if(n===`remove`)return Kn(e,r);if(n===`clear`){if(r.length>0)return{success:!1,message:C};let t=Pe(e);return{success:!0,message:`Context references cleared: ${t.removed.length} removed.`,data:{removed:t.removed}}}return n===`auto`?Wn(e,r):{success:!1,message:C}}function Wn(e,t){let[n,r]=t;if(r!==void 0)return{success:!1,message:C};if(n===void 0){let t=p(e),n=m(e);return{success:!0,message:[Bn(t,n),C].join(`
10
- `),data:{autoCompactThreshold:t,autoCompactThresholdSource:n}}}if(n===`on`)return qn(e,o,`enabled`);if(n===`off`)return qn(e,!1,`disabled`);if(n===`reset`){let t=Dt(e);return Pt(e,o,`default`),{success:!0,message:`Auto compact reset to default: ${w(o)} (${Vn(t)}).`,data:{autoCompactThreshold:o,autoCompactThresholdSource:`default`,persisted:t}}}let i=Yn(n);return i.success?qn(e,i.threshold,`threshold set`):{success:!1,message:`${i.message}\n${C}`}}async function Gn(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:C};let r=await xe(e,n);return r.reference?{success:!0,message:[`Context reference added: ${E(r.reference)}.`,...r.evicted.length>0?[`Evicted ${r.evicted.length} older context reference(s).`]:[]].join(`
1
+ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,BundlePluginInstaller as n,BundlePluginLoader as r,CLEAR_COMMAND_DESCRIPTION as i,COST_COMMAND_DESCRIPTION as a,DEFAULT_AUTO_COMPACT_THRESHOLD as o,DEFAULT_STATUS_LINE_COMMAND_SETTINGS as s,EXIT_COMMAND_DESCRIPTION as c,HELP_COMMAND_DESCRIPTION as l,LANGUAGE_COMMAND_ARGUMENT_HINT as ee,LANGUAGE_COMMAND_DESCRIPTION as te,MEMORY_COMMAND_ARGUMENT_HINT as ne,MEMORY_COMMAND_DESCRIPTION as u,MEMORY_COMMAND_USAGE as re,MarketplaceClient as d,PERMISSIONS_COMMAND_DESCRIPTION as f,PERMISSION_MODE_ARGUMENT_HINT as p,PERMISSION_MODE_COMMAND_DESCRIPTION as ie,PLUGIN_COMMAND_ARGUMENT_HINT as ae,PLUGIN_COMMAND_DESCRIPTION as oe,PluginCommandSource as se,PluginSettingsStore as ce,ProviderConfigError as le,RELOAD_PLUGINS_COMMAND_DESCRIPTION as ue,RENAME_COMMAND_DESCRIPTION as de,RENAME_COMMAND_USAGE as fe,RESUME_COMMAND_DESCRIPTION as pe,REWIND_COMMAND_ARGUMENT_HINT as me,REWIND_COMMAND_DESCRIPTION as he,STATUSLINE_COMMAND_ARGUMENT_HINT as ge,STATUSLINE_COMMAND_DESCRIPTION as _e,SkillCommandSource as ve,VALIDATE_SESSION_COMMAND_DESCRIPTION as ye,addCommandContextReference as be,applyPresetToSession as xe,applyProviderConfiguration as Se,buildBackgroundCommandSubcommands as Ce,buildLanguageCommandSubcommands as we,buildMemoryCommandSubcommands as Te,buildPermissionModeSubcommands as m,buildPluginCommandSubcommands as Ee,buildProviderSetupPatch as De,buildRewindCommandSubcommands as Oe,buildStatusLineCommandSubcommands as ke,cancelCommandBackgroundTask as Ae,checkSettingsDocument as je,clearCommandContextReferences as Me,clearConversationHistory as Ne,closeCommandBackgroundTask as Pe,compactCommandContext as Fe,createCommandMemoryStores as Ie,createPluginRegistryReloadRequestedEffect as Le,createPluginTuiRequestedEffect as Re,createSessionExitRequestedEffect as ze,createSessionPickerRequestedEffect as Be,createSessionRenamedEffect as Ve,deleteProviderProfile as He,deleteUserLocalMemoryItem as Ue,disableUserLocalMemoryItem as We,formatCommandBackgroundTaskList as Ge,formatCommandHelpMessage as Ke,formatCommandPermissionsMessage as qe,formatCommandSessionReplayValidationReport as Je,formatInvalidPermissionModeMessage as Ye,formatLanguageUsageMessage as Xe,formatOrgPolicyViolationMessage as Ze,getProviderSettingsPaths as Qe,hasSensitiveCommandMemoryContent as $e,inspectCommandEditCheckpoint as et,inspectUserLocalMemoryItem as tt,inspectUserLocalStorage as nt,isApiKeyPlaintext as rt,isCommandMemoryType as it,isPermissionMode as at,listCommandBackgroundTasks as ot,listCommandContextReferences as st,listCommandEditCheckpoints as ct,listCommandUsedMemoryReferences as lt,listUserLocalMemoryItems as ut,mergeProviderPatch as dt,parseCommandBackgroundLogCursor as ft,parseLanguageArgument as pt,parsePermissionModeArgument as mt,parseSessionNameArgument as ht,readAutoCompactThreshold as gt,readAutoCompactThresholdSource as _t,readCommandBackgroundTaskLog as vt,readCommandContextState as yt,readCommandPermissionMode as bt,readCommandPermissionsState as xt,readCommandSessionInfo as St,readMergedProviderSettings as Ct,readSettings as wt,recordCommandMemoryEvent as Tt,removeCommandContextReference as Et,resetAutoCompactThresholdSetting as Dt,resolveEnvDefaultProvider as Ot,resolvePluginCommandAdapter as kt,resolveSettingsPathForScope as At,restoreCommandEditCheckpoint as jt,rollbackCommandEditCheckpoint as Mt,sanitizeProviderProfileName as Nt,setCommandAutoCompactThreshold as Pt,setCurrentProvider as Ft,setUserLocalMemoryItem as It,suggestProviderProfileName as Lt,summarizeBackgroundJobGroup as Rt,testProviderProfileCommand as zt,upsertProviderProfile as Bt,validateCommandSessionReplayLog as Vt,writeAutoCompactThresholdSetting as Ht,writeCommandPermissionMode as Ut,writeSettings as Wt}from"@robota-sdk/agent-framework";import{CONTEXT_ESTIMATE_CHARS_PER_TOKEN as Gt,calculateModelCost as Kt,confirmAction as h,findProviderDefinition as g,formatSupportedProviderTypes as _,isConfirmed as v,resolvePlatformShell as qt,selectAction as y,textAction as Jt}from"@robota-sdk/agent-core";import{existsSync as Yt,mkdirSync as Xt,mkdtempSync as Zt,readFileSync as Qt,rmSync as $t,writeFileSync as b}from"node:fs";import{constants as en,homedir as tn,tmpdir as nn}from"node:os";import{join as x}from"node:path";import{execSync as rn,spawn as an}from"node:child_process";import{getPreset as on,listPresets as S,resolvePreset as sn}from"@robota-sdk/agent-preset";const C=`general-purpose`;function cn(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 ln(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 w(e,t,n,r){return{agentType:t,label:n,mode:`background`,prompt:r,...e.model?{model:e.model}:{},...e.isolation?{isolation:e.isolation}:{}}}function un(e,t){let n=ln(e),[r,...i]=n.positional,a=n.agentType??C,o=n.positional;!n.agentType&&r&&t.has(r)&&(a=r,o=i);let s=o.join(` `).trim();if(s)return w(n,a,a,s)}function dn(e,t){let n=ln(e);return n.positional.map(e=>fn(e,n,t)).filter(e=>e!==void 0)}function fn(e,t,n){let r=e.indexOf(`=`);if(r>0)return pn(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 w(t,t.agentType??(n.has(a)?a:C),a,o)}function pn(e,t,n,r){let i=t.indexOf(`:`);if(i===-1)return w(n,n.agentType??(r.has(e)?e:C),e,t);if(!(i===0||i===t.length-1))return w(n,t.slice(0,i),e,t.slice(i+1))}function T(e){return e instanceof Error?e.message:String(e)}function mn(e){return new Set(e.listAgentDefinitions().map(e=>e.name))}function hn(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 gn(e,t){let n=hn(e,t.agentType);if(n)return n;try{return{state:await e.spawnAgentJob(t)}}catch(e){return{message:T(e),success:!1}}}function _n(){return{message:``,effects:[{type:`agent-switcher-requested`}],success:!0}}async function vn(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=>` ${yn(e)}`)].join(`
2
+ `),success:!0,data:{agents:t.length,jobs:n.length}}}function yn(e){let t=[e.worktreePath?`worktree=${e.worktreePath}`:void 0,e.branchName?`branch=${e.branchName}`:void 0].filter(e=>e!==void 0),n=t.length>0?` ${t.join(` `)}`:``;return`${e.id} [${e.status}${n}] ${e.label} - ${e.promptPreview}`}async function bn(e,t){let n=un(t,mn(e));if(!n)return{message:`Usage: agent run [AGENT_NAME] [--agent AGENT_NAME] PROMPT`,success:!1};let r=await gn(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 xn(e,t){let n=t.includes(`--wait`)||!t.includes(`--detach`),r=dn(t.filter(e=>e!==`--wait`&&e!==`--detach`),mn(e));if(r.length===0)return{message:`Usage: agent parallel [--wait|--detach] LABEL:"PROMPT" [LABEL=AGENT_NAME:"PROMPT"]`,success:!1};let i=r.map(t=>hn(e,t.agentType)).find(e=>e!==void 0);if(i)return i;let a;try{a=await Promise.all(r.map(t=>e.spawnAgentJob(t)))}catch(e){return{message:T(e),success:!1}}let o=e.createBackgroundJobGroup({waitPolicy:`wait_all`,taskIds:a.map(e=>e.id),label:`agent parallel`});if(n){let t=Rt(await e.waitBackgroundJobGroup(o.id));return{message:On(t),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id,summary:t}}}return{message:[`Started agent jobs:`,...a.map(e=>`${e.label}: ${e.id}`)].join(`
3
+ `),success:!0,data:{agentIds:a.map(e=>e.id),groupId:o.id}}}async function Sn(e,t){let[n]=t;if(!n)return{message:`Usage: agent wait GROUP_ID`,success:!1};let r=Rt(await e.waitBackgroundJobGroup(n));return{message:On(r),success:!0,data:{groupId:n,summary:r}}}async function Cn(e,t){let[n,r]=t;if(!n)return{message:`Usage: agent read AGENT_ID [OFFSET]`,success:!1};let i=r?{offset:Number.parseInt(r,10)}:void 0,a=await e.readBackgroundTaskLog(n,i),o=a.nextCursor?`\nNext offset: ${a.nextCursor.offset}`:``;return{message:a.lines.length>0?`${a.lines.join(`
4
+ `)}${o}`:`No log lines: ${n}`,success:!0,data:{agentId:n,nextOffset:a.nextCursor?.offset}}}async function wn(e,t){let[n,...r]=t,i=r.join(` `).trim();return!n||!i?{message:`Usage: agent send AGENT_ID PROMPT`,success:!1}:(await e.sendAgentJob(n,i),{message:`Sent input to agent job: ${n}`,success:!0,data:{agentId:n}})}async function Tn(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 En(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 Dn(e,t){try{if(t.trim()===``)return _n();let[n=`list`,...r]=cn(t);return n===`list`&&r.length===0?vn(e):n===`run`?bn(e,r):n===`parallel`?xn(e,r):n===`wait`?Sn(e,r):n===`read`||n===`open`?Cn(e,r):n===`send`?wn(e,r):n===`stop`||n===`cancel`?Tn(e,r):n===`close`?En(e,r):bn(e,[n,...r])}catch(e){return{message:T(e),success:!1}}}function On(e){return[`Background job group ${e.groupId}: ${e.status} (${e.completed}/${e.total} completed, ${e.failed} failed, ${e.cancelled} cancelled, ${e.pending} pending)`,...e.lines].join(`
5
+ `)}function kn(e){let t=e.getAgentJobCapability?.();if(!t)throw Error(`Agent job capability is not available in this context.`);return t}function An(){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:`Focus an agent job detail view when supported`,source:`agent`}]}function E(){return{name:`agent`,displayName:`Agent Jobs`,description:[`Subagent jobs command.`,`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.`].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:An()}}function jn(){let e=E();return{name:e.name,...e.displayName===void 0?{}:{displayName:e.displayName},description:e.description,requiresPermission:!1,execute:(e,t)=>Dn(kn(e),t),...e.modelInvocable===void 0?{}:{modelInvocable:e.modelInvocable},...e.userInvocable===void 0?{}:{userInvocable:e.userInvocable},...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},...e.safety===void 0?{}:{safety:e.safety}}}var Mn=class{name=`agent`;getCommands(){return[E()]}};function Nn(){return{name:`agent-command-agent`,commandSources:[new Mn],systemCommands:[jn()],sessionRequirements:[`agent-runtime`]}}function Pn(e){return e.trim().split(/\s+/).filter(Boolean)}async function Fn(e,n){let[r=`list`,i,...a]=Pn(n);if(r===`list`){let t=ot(e);return{message:Ge(t),success:!0,data:{count:t.length}}}if(!i)return{message:t,success:!1};if(r===`read`||r===`log`||r===`open`){let t=await vt(e,i,ft(a[0])),n=t.nextCursor?`\nNext offset: ${t.nextCursor.offset}`:``;return{message:t.lines.length>0?`${t.lines.join(`
6
+ `)}${n}`:`No log lines: ${i}`,success:!0,data:{taskId:i,nextOffset:t.nextCursor?.offset}}}return r===`cancel`||r===`stop`?(await Ae(e,i,a.join(` `)||void 0),{message:`Background task cancelled: ${i}`,success:!0,data:{taskId:i}}):r===`close`||r===`dismiss`?(await Pe(e,i),{message:`Background task closed: ${i}`,success:!0,data:{taskId:i}}):{message:`Unknown background action: ${r}`,success:!1}}function D(){return{name:`background`,displayName:`Background Tasks`,description:e,source:`background`,modelInvocable:!1,subcommands:Ce()}}function In(){let e=D();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,subcommands:e.subcommands,execute:Fn}}var Ln=class{name=`background`;getCommands(){return[D()]}};function Rn(){return{name:`agent-command-background`,commandSources:[new Ln],systemCommands:[In()]}}function zn(e){let t=e.trim();return t.length>0?t:void 0}async function Bn(e,t){let{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}=await Fe(e,zn(t)),o=i-a;return{message:[`Context compacted.`,` Removed messages: ${o} (${i>0?Math.round(o/i*100):0}% of total)`,` Context: ${Math.round(n.usedPercentage)}% → ${Math.round(r.usedPercentage)}%`].join(`
7
+ `),success:!0,data:{before:n,after:r,beforeMessageCount:i,afterMessageCount:a}}}function O(){return{name:`compact`,displayName:`Compact Context`,description:`Compress context window`,source:`compact`,modelInvocable:!0,argumentHint:`[instructions]`,safety:`write`,example:`/compact Summarize the current context`}}function Vn(){let e=O();return{name:e.name,displayName:e.displayName,description:e.description,example:e.example,requiresPermission:!1,userInvocable:!0,modelInvocable:e.modelInvocable,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`blocking`,execute:Bn}}var Hn=class{name=`compact`;getCommands(){return[O()]}};function Un(){return{name:`agent-command-compact`,commandSources:[new Hn],systemCommands:[Vn()]}}const k=[`Usage: /context [list] | add <path> | remove <path> | clear | auto on | off | <percent> | reset`,`Examples: /context list, /context add AGENTS.md, /context remove AGENTS.md, /context auto 85%`].join(`
8
+ `);function A(e){return e===!1?`disabled`:`${Math.round(e*100)}%`}function j(e,t){return e===!1?`Auto compact: disabled (${t})`:`Auto compact: ${A(e)} (${t})`}function Wn(e){return e?`settings`:`current session only`}async function Gn(e,t){let n=t.trim().split(/\s+/).filter(e=>e.length>0);if(n.length>0)return Kn(e,n);let r=yt(e),i=gt(e),a=_t(e),o=nr(e.getSession().getFullHistory()),s=st(e);return{message:[`Context: ${r.usedTokens.toLocaleString()} / ${r.maxTokens.toLocaleString()} tokens (${Math.round(r.usedPercentage)}%)`,j(i,a),Qn(s),`History: ${o.turnCount} turn${o.turnCount===1?``:`s`}`].join(`
9
+ `),success:!0,data:{usedTokens:r.usedTokens,maxTokens:r.maxTokens,percentage:r.usedPercentage,autoCompactThreshold:i,autoCompactThresholdSource:a,references:s}}}async function Kn(e,t){let[n,...r]=t;if(n===`list`)return r.length>0?{success:!1,message:k}:rr(e);if(n===`add`)return Jn(e,r);if(n===`remove`)return Yn(e,r);if(n===`clear`){if(r.length>0)return{success:!1,message:k};let t=Me(e);return{success:!0,message:`Context references cleared: ${t.removed.length} removed.`,data:{removed:t.removed}}}return n===`auto`?qn(e,r):{success:!1,message:k}}function qn(e,t){let[n,r]=t;if(r!==void 0)return{success:!1,message:k};if(n===void 0){let t=gt(e),n=_t(e);return{success:!0,message:[j(t,n),k].join(`
10
+ `),data:{autoCompactThreshold:t,autoCompactThresholdSource:n}}}if(n===`on`)return M(e,o,`enabled`);if(n===`off`)return M(e,!1,`disabled`);if(n===`reset`){let t=Dt(e);return Pt(e,o,`default`),{success:!0,message:`Auto compact reset to default: ${A(o)} (${Wn(t)}).`,data:{autoCompactThreshold:o,autoCompactThresholdSource:`default`,persisted:t}}}let i=Zn(n);return i.success?M(e,i.threshold,`threshold set`):{success:!1,message:`${i.message}\n${k}`}}async function Jn(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:k};let r=await be(e,n);return r.reference?{success:!0,message:[`Context reference added: ${P(r.reference)}.`,...r.evicted.length>0?[`Evicted ${r.evicted.length} older context reference(s).`]:[]].join(`
11
11
  `),data:{reference:r.reference,evicted:r.evicted}}:{success:!1,message:r.diagnostics.join(`
12
- `)||`Context reference not found: ${n}`,data:{diagnostics:r.diagnostics}}}function Kn(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:C};let r=Et(e,n);return r.removed?{success:!0,message:`Context reference removed: ${E(r.removed)}.`,data:{removed:r.removed}}:{success:!1,message:`Context reference not found: ${n}`}}function qn(e,t,n){let r=Ht(e,t),i=r?`settings`:`session`;return Pt(e,t,i),{success:!0,message:Jn(n,t,r),data:{autoCompactThreshold:t,autoCompactThresholdSource:i,persisted:r}}}function Jn(e,t,n){let r=Vn(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${w(t)} (${r}).`:`Auto compact threshold set to ${w(t)} (${r}).`}function Yn(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 Xn(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function T(e){return Math.ceil(e/Gt)}function E(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${T(e.byteLength).toLocaleString()} tokens`].join(` `)}function Zn(e){try{return JSON.parse(e)}catch{return null}}function Qn(e){let t=Zn(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 $n(e){let t=0,n=0,r=0,i=0,a=0,o=0,s=0;for(let c of e){let e=Math.ceil(JSON.stringify(c).length/Gt);c.role===`system`?t+=e:c.role===`user`?(n+=e,r++):c.role===`assistant`?(i+=e,a++):c.role===`tool`&&(o+=e,s++)}return{systemTokens:t,userTokens:n,userCount:r,assistantTokens:i,assistantCount:a,toolTokens:o,toolCallCount:s,totalTokens:t+n+i+o}}function er(e){let t=new Map;for(let n of e){if(n.category!==`chat`||n.type!==`assistant`)continue;let e=n.data;for(let n of e.toolCalls??[])t.set(n.id,{name:n.function.name,firstArg:Qn(n.function.arguments)})}let n=0,r=0,i=new Map;for(let a of e)if(a.category===`chat`){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 tr(e,t,n){let r=`${e}${t>0?` — ~${t.toLocaleString()} tokens`:``}:`;return n.length===0?`${r}\n (none)`:[r,...n.map(e=>` ${e}`)].join(`
13
- `)}function nr(e){let t=yt(e),n=p(e),r=m(e),i=$n(e.getSession().getHistory()),a=er(e.getSession().getFullHistory()),o=lt(e),s=o.filter(e=>e.loadType===`system`),c=o.filter(e=>e.loadType===`manual`),l=o.filter(e=>e.loadType===`prompt-reference`),ee=s.reduce((e,t)=>e+T(t.byteLength),0),te=c.reduce((e,t)=>e+T(t.byteLength),0),ne=l.reduce((e,t)=>e+T(t.byteLength),0),re=a.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${a.turnCount} turn${a.turnCount===1?``:`s`} | ~${i.totalTokens.toLocaleString()} tokens`,ie=a.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),u=a.toolResults.length,d=a.totalToolCallCount,f=d===0?`Tool results (0): (none)`:u<d?`Tool results (${u} unique / ${d} calls, ~${i.toolTokens.toLocaleString()} tokens):`:`Tool results (${u}, ~${i.toolTokens.toLocaleString()} tokens):`,ae=a.turnCount===0?[]:[`User (${i.userCount}): ~${i.userTokens.toLocaleString()} tokens`,`Assistant (${i.assistantCount}): ~${i.assistantTokens.toLocaleString()} tokens`,...i.systemTokens>0?[`System messages: ~${i.systemTokens.toLocaleString()} tokens`]:[],d>0?[f,...ie.map(e=>` ${e}`)].join(`
14
- `):f],oe=a.turnCount===0?`${re}:\n (none)`:[`${re}:`,...ae.map(e=>` ${e}`)].join(`
15
- `);return{success:!0,message:[`Context: ${t.usedTokens.toLocaleString()} / ${t.maxTokens.toLocaleString()} tokens (${Math.round(t.usedPercentage)}%)`,Bn(n,r),``,tr(`System prompt (active every turn)`,ee,s.map(E)),``,oe,``,tr(`Manually added`,te,c.map(E)),``,tr(`Prompt references (@-syntax)`,ne,l.map(E))].join(`
16
- `),data:{references:o,history:{turnCount:a.turnCount,toolResults:a.toolResults}}}}function rr(){return{name:`context`,displayName:`Context References`,description:`Context window info, reference inventory, and auto-compact controls`,source:`context`,modelInvocable:!1,argumentHint:`list | add <path> | remove <path> | clear | auto ...`,subcommands:[{name:`list`,description:`List loaded context references`,source:`context`},{name:`add`,description:`Add a file to active context references`,source:`context`},{name:`remove`,description:`Remove a context reference`,source:`context`},{name:`clear`,description:`Clear context references`,source:`context`},{name:`auto`,description:`Inspect or change auto-compact policy`,source:`context`}]}}function ir(){let e=rr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,execute:Hn}}var ar=class{name=`context`;getCommands(){return[rr()]}};function or(){return{name:`agent-command-context`,commandSources:[new ar],systemCommands:[ir()]}}function sr(e,t){return{success:!0,message:`Exit requested.`,effects:[Ve()]}}function D(){return{name:`exit`,displayName:`Exit Session`,description:c,source:`exit`,modelInvocable:!1}}function cr(){let e=D();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:sr}}var lr=class{name=`exit`;getCommands(){return[D()]}};const ur={exit:{type:`confirm`,message:`Exit the session?`}};function dr(){return{name:`agent-command-exit`,commandSources:[new lr],systemCommands:[cr()],interactionHints:ur}}function fr(e,t){return{success:!0,message:Je(e)}}function O(){return{name:`help`,displayName:`Help`,description:l,source:`help`,modelInvocable:!1}}function pr(){let e=O();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:fr}}var mr=class{name=`help`;getCommands(){return[O()]}};function hr(){return{name:`agent-command-help`,commandSources:[new mr],systemCommands:[pr()]}}function gr(e,t){let n=ht(t);return n===void 0?{message:Qe(),success:!1}:{message:`Language set to "${n}".`,success:!0,data:{language:n},effects:[{type:`language-change-requested`,language:n}]}}function k(){return{name:`language`,displayName:`Language`,description:te,source:`language`,argumentHint:ee,subcommands:Te(`language`),modelInvocable:!1}}function _r(){let e=k();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:gr}}var vr=class{name=`language`;getCommands(){return[k()]}};const yr={language:{type:`pick`,getItems:()=>Te().map(e=>({label:`${e.name} ${e.description??``}`.trimEnd(),value:e.name,description:e.description}))}};function br(){return{name:`agent-command-language`,commandSources:[new vr],systemCommands:[_r()],interactionHints:yr}}function A(){return{message:ie,success:!1}}function xr(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Sr(e){let t=e.list(),n=t.topics.length>0?t.topics.map(e=>`- ${e.name}: ${e.path}`).join(`
12
+ `)||`Context reference not found: ${n}`,data:{diagnostics:r.diagnostics}}}function Yn(e,t){let n=t.join(` `).trim();if(!n)return{success:!1,message:k};let r=Et(e,n);return r.removed?{success:!0,message:`Context reference removed: ${P(r.removed)}.`,data:{removed:r.removed}}:{success:!1,message:`Context reference not found: ${n}`}}function M(e,t,n){let r=Ht(e,t),i=r?`settings`:`session`;return Pt(e,t,i),{success:!0,message:Xn(n,t,r),data:{autoCompactThreshold:t,autoCompactThresholdSource:i,persisted:r}}}function Xn(e,t,n){let r=Wn(n);return e===`disabled`?`Auto compact disabled (${r}).`:e===`enabled`?`Auto compact enabled at ${A(t)} (${r}).`:`Auto compact threshold set to ${A(t)} (${r}).`}function Zn(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 Qn(e){return`References: ${e.filter(e=>e.status===`active`).length} active, ${e.filter(e=>e.status===`observed`).length} observed`}function N(e){return Math.ceil(e/Gt)}function P(e){return[e.relativePath,`[${e.loadType}, ${e.status}]`,`~${N(e.byteLength).toLocaleString()} tokens`].join(` `)}function $n(e){try{return JSON.parse(e)}catch{return null}}function er(e){let t=$n(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 tr(e){let t=0,n=0,r=0,i=0,a=0,o=0,s=0;for(let c of e){let e=Math.ceil(JSON.stringify(c).length/Gt);c.role===`system`?t+=e:c.role===`user`?(n+=e,r++):c.role===`assistant`?(i+=e,a++):c.role===`tool`&&(o+=e,s++)}return{systemTokens:t,userTokens:n,userCount:r,assistantTokens:i,assistantCount:a,toolTokens:o,toolCallCount:s,totalTokens:t+n+i+o}}function nr(e){let t=new Map;for(let n of e){if(n.category!==`chat`||n.type!==`assistant`)continue;let e=n.data;for(let n of e.toolCalls??[])t.set(n.id,{name:n.function.name,firstArg:er(n.function.arguments)})}let n=0,r=0,i=new Map;for(let a of e)if(a.category===`chat`){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 F(e,t,n){let r=`${e}${t>0?` — ~${t.toLocaleString()} tokens`:``}:`;return n.length===0?`${r}\n (none)`:[r,...n.map(e=>` ${e}`)].join(`
13
+ `)}function rr(e){let t=yt(e),n=gt(e),r=_t(e),i=tr(e.getSession().getHistory()),a=nr(e.getSession().getFullHistory()),o=st(e),s=o.filter(e=>e.loadType===`system`),c=o.filter(e=>e.loadType===`manual`),l=o.filter(e=>e.loadType===`prompt-reference`),ee=s.reduce((e,t)=>e+N(t.byteLength),0),te=c.reduce((e,t)=>e+N(t.byteLength),0),ne=l.reduce((e,t)=>e+N(t.byteLength),0),u=a.turnCount===0?`Conversation history — 0 turns`:`Conversation history — ${a.turnCount} turn${a.turnCount===1?``:`s`} | ~${i.totalTokens.toLocaleString()} tokens`,re=a.toolResults.map(e=>`${e.toolName}${e.displayArg?`: ${e.displayArg}`:``}`),d=a.toolResults.length,f=a.totalToolCallCount,p=f===0?`Tool results (0): (none)`:d<f?`Tool results (${d} unique / ${f} calls, ~${i.toolTokens.toLocaleString()} tokens):`:`Tool results (${d}, ~${i.toolTokens.toLocaleString()} tokens):`,ie=a.turnCount===0?[]:[`User (${i.userCount}): ~${i.userTokens.toLocaleString()} tokens`,`Assistant (${i.assistantCount}): ~${i.assistantTokens.toLocaleString()} tokens`,...i.systemTokens>0?[`System messages: ~${i.systemTokens.toLocaleString()} tokens`]:[],f>0?[p,...re.map(e=>` ${e}`)].join(`
14
+ `):p],ae=a.turnCount===0?`${u}:\n (none)`:[`${u}:`,...ie.map(e=>` ${e}`)].join(`
15
+ `);return{success:!0,message:[`Context: ${t.usedTokens.toLocaleString()} / ${t.maxTokens.toLocaleString()} tokens (${Math.round(t.usedPercentage)}%)`,j(n,r),``,F(`System prompt (active every turn)`,ee,s.map(P)),``,ae,``,F(`Manually added`,te,c.map(P)),``,F(`Prompt references (@-syntax)`,ne,l.map(P))].join(`
16
+ `),data:{references:o,history:{turnCount:a.turnCount,toolResults:a.toolResults}}}}function I(){return{name:`context`,displayName:`Context References`,description:`Context window info, reference inventory, and auto-compact controls`,source:`context`,modelInvocable:!1,argumentHint:`list | add <path> | remove <path> | clear | auto ...`,subcommands:[{name:`list`,description:`List loaded context references`,source:`context`},{name:`add`,description:`Add a file to active context references`,source:`context`},{name:`remove`,description:`Remove a context reference`,source:`context`},{name:`clear`,description:`Clear context references`,source:`context`},{name:`auto`,description:`Inspect or change auto-compact policy`,source:`context`}]}}function ir(){let e=I();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,execute:Gn}}var ar=class{name=`context`;getCommands(){return[I()]}};function or(){return{name:`agent-command-context`,commandSources:[new ar],systemCommands:[ir()]}}function sr(){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 L(e,t,n){return new Promise((r,i)=>{let a=an(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=en.signals[t];r(128+(e??0));return}r(0)})})}const cr="Compose a message in $EDITOR (optionally pre-filled with `/editor <text>`), then return it.";async function lr(e,t){if(e.canHandoffTerminal?.()!==!0||e.runWithTerminal===void 0)return{message:`An editor is unavailable here (no interactive terminal).`,success:!1};let n=sr(),r=Zt(x(nn(),`robota-editor-`)),i=x(r,`message.md`);b(i,t??``,`utf8`);try{let t=await e.runWithTerminal(async()=>L(n.command,[...n.args,i],e.getCwd()));if(t!==0)return{message:`Editor exited without saving (code ${t}).`,success:!1,data:{exitCode:t}};let r=Qt(i,`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{$t(r,{recursive:!0,force:!0,maxRetries:3,retryDelay:20})}}function R(){return{name:`editor`,displayName:`Editor`,description:cr,source:`editor`,modelInvocable:!1}}function ur(){let e=R();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:lr}}var dr=class{name=`editor`;getCommands(){return[R()]}};function fr(){return{name:`agent-command-editor`,commandSources:[new dr],systemCommands:[ur()]}}async function pr(e,t){let n=e.getUserInteraction?.();return n&&!v(await n.ask(h(`exit`,`Exit the session?`)))?{success:!0,message:`Exit cancelled.`}:{success:!0,message:`Exit requested.`,effects:[ze()]}}function z(){return{name:`exit`,displayName:`Exit Session`,description:c,source:`exit`,modelInvocable:!1}}function mr(){let e=z();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:pr}}var hr=class{name=`exit`;getCommands(){return[z()]}};function gr(){return{name:`agent-command-exit`,commandSources:[new hr],systemCommands:[mr()]}}const _r=`Assign an autonomous goal the agent pursues across turns until satisfied.`;function vr(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(`
17
+ `)}async function yr(e,t){let n=t.trim(),r=n.split(/\s+/)[0]?.toLowerCase()??``;if(n.length===0||r===`help`)return{message:`Usage:
18
+ /goal <objective> assign a goal and pursue it autonomously
19
+ /goal status show the current goal and progress
20
+ /goal cancel stop the current goal`,success:!0};if(r===`status`){let t=e.getGoalState?.()??null;return t?{message:vr(t),success:!0,data:{status:t.status}}:{message:`No goal is set.`,success:!0}}if(r===`cancel`||r===`stop`){let t=e.cancelGoal?.()??null;return t?{message:`Goal cancelled: ${t.objective}`,success:!0}:{message:`No active goal to cancel.`,success:!1}}if(!e.setGoal)return{message:`Goal pursuit is not available in this session.`,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 B(){return{name:`goal`,displayName:`Autonomous Goal`,description:_r,source:`goal`,modelInvocable:!1}}function br(){let e=B();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:yr}}var xr=class{name=`goal`;getCommands(){return[B()]}};function Sr(){return{name:`agent-command-goal`,commandSources:[new xr],systemCommands:[br()]}}function Cr(e,t){return{success:!0,message:Ke(e)}}function V(){return{name:`help`,displayName:`Help`,description:l,source:`help`,modelInvocable:!1}}function wr(){let e=V();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Cr}}var Tr=class{name=`help`;getCommands(){return[V()]}};function Er(){return{name:`agent-command-help`,commandSources:[new Tr],systemCommands:[wr()]}}async function Dr(e){let t=e.getUserInteraction?.();if(!t)return;let n=we().map(e=>({value:e.name,label:e.name,description:e.description})),r=await t.ask(y(`language`,`Select language`,n)),i=r.type===`answer`?r.values[0]:void 0;return i===void 0?void 0:pt(i)}async function Or(e,t){let n=pt(t);return n===void 0&&(n=await Dr(e),n===void 0)?{message:Xe(),success:!1}:{message:`Language set to "${n}".`,success:!0,data:{language:n},effects:[{type:`language-change-requested`,language:n}]}}function H(){return{name:`language`,displayName:`Language`,description:te,source:`language`,argumentHint:ee,subcommands:we(`language`),modelInvocable:!1}}function kr(){let e=H();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:Or}}var Ar=class{name=`language`;getCommands(){return[H()]}};function jr(){return{name:`agent-command-language`,commandSources:[new Ar],systemCommands:[kr()]}}function U(){return{message:re,success:!1}}function Mr(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Nr(e){let t=e.list(),n=t.topics.length>0?t.topics.map(e=>`- ${e.name}: ${e.path}`).join(`
17
21
  `):`(none)`;return{message:[`Memory index: ${t.indexPath}`,`Topics directory: ${t.topicsPath}`,`Topics:`,n].join(`
18
- `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}function Cr(e,t){if(!t||t===`index`){let t=e.loadStartupMemory();return{message:t.content||`(empty memory index)`,success:!0,data:{path:t.path,lineCount:t.lineCount,truncated:t.truncated}}}return{message:e.readTopic(t)||`(empty memory topic: ${t})`,success:!0,data:{topic:t}}}function wr(e){let t=e[1],n=e[2],r=e.slice(3).join(` `).trim();if(!(!t||!ot(t)||!n||r.length===0))return{type:t,topic:n,text:r}}function Tr(e){let t=e.list(`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(`
19
- `),success:!0,data:{count:t.length}}}function j(e,t){Tt(e,t)}function Er(e,t,n,r){if(!r)return A();try{let i=t.mark(r,`approved`,`approved-by-user`),a=n.append(i),o=t.mark(r,`saved`,`approved-and-saved`);return j(e,{type:`memory_candidate_approved`,candidateId:o.id,topic:o.topic,reason:`approved-by-user`}),j(e,{type:`memory_candidate_saved`,candidateId:o.id,topic:o.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:o.status,topic:a.topic,topicPath:a.topicPath,deduplicated:a.deduplicated}}}catch(e){return xr(e instanceof Error?e:String(e))}}function Dr(e,t,n){if(!n)return A();try{let r=t.mark(n,`rejected`,`rejected-by-user`);return j(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 xr(e instanceof Error?e:String(e))}}function Or(e){let t=dt(e);return{message:[`Used memory references:`,...t.length>0?t.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
20
- `),success:!0,data:{count:t.length,references:[...t]}}}function kr(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`,i=Re(e);if(r===`list`)return Sr(i.project);if(r===`show`)return Cr(i.project,n[1]);if(r===`pending`)return Tr(i.pending);if(r===`approve`)return Er(e,i.pending,i.project,n[1]);if(r===`reject`)return Dr(e,i.pending,n[1]);if(r===`used`)return Or(e);if(r===`add`){let e=wr(n);if(!e)return A();if(tt(e.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let t=i.project.append(e);return{message:t.deduplicated?`${e.type} memory already exists in ${t.topicPath}`:`Saved ${e.type} memory to ${t.topicPath}`,success:!0,data:{indexPath:t.indexPath,topicPath:t.topicPath,topic:t.topic,deduplicated:t.deduplicated}}}return A()}function M(){return{name:`memory`,displayName:`Memory`,description:re,source:`memory`,argumentHint:ne,modelInvocable:!0,safety:`write`,subcommands:Ee()}}function Ar(){let e=M();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:kr}}var jr=class{name=`memory`;getCommands(){return[M()]}};function Mr(){return{name:`agent-command-memory`,commandSources:[new jr],systemCommands:[Ar()]}}function Nr(e,t){let n=gt(t);if(n===void 0){let t=bt(e);return{message:`Current mode: ${t}`,success:!0,data:{mode:t}}}return st(n)?(Ut(e,n),{message:`Permission mode set to: ${n}`,success:!0,data:{mode:n}}):{message:Ze(),success:!1}}function N(){return{name:`mode`,displayName:`Interaction Mode`,description:ae,source:`mode`,argumentHint:f,subcommands:De(`mode`),modelInvocable:!1}}function Pr(){let e=N();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:Nr}}var Fr=class{name=`mode`;getCommands(){return[N()]}};const Ir={mode:{type:`pick`,getItems:()=>De().map(e=>({label:e.name,value:e.name,description:e.description}))}};function Lr(){return{name:`agent-command-mode`,commandSources:[new Fr],systemCommands:[Pr()],interactionHints:Ir}}function Rr(e,t){let n=gt(t);if(n!==void 0){if(!st(n))return{message:Ze(),success:!1};Ut(e,n);let t=xt(e);return{message:`Permission mode set to: ${n}\n${Ye(t)}`,success:!0,data:{mode:t.mode,sessionAllowed:t.sessionAllowed}}}let r=xt(e);return{message:Ye(r),success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}function P(){return{name:`permissions`,displayName:`Permissions`,description:d,source:`permissions`,argumentHint:f,subcommands:De(`permissions`),modelInvocable:!1}}function zr(){let e=P();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:Rr}}var Br=class{name=`permissions`;getCommands(){return[P()]}};function Vr(){return{name:`agent-command-permissions`,commandSources:[new Br],systemCommands:[zr()]}}function Hr(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function F(e){return{success:!1,message:e}}function Ur(e){return kt(e)}async function I(e,t){let n=Ur(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 Wr(e,t){let{subcommand:n,subArgs:r}=Hr(t);return n===`add`&&r.length>0?I(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?I(e,async e=>(await e.marketplaceRemove(r),`Removed marketplace "${r}" and uninstalled its plugins.`)):n===`update`&&r.length>0?I(e,async e=>(await e.marketplaceUpdate(r),`Updated marketplace "${r}".`)):n===`list`?I(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(`
21
- `)}`}):F(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function L(e,t,n,r){return t.length===0?Promise.resolve(F(n)):I(e,e=>Promise.resolve(r(e,t)))}function Gr(){return{success:!0,message:`Opening plugin manager...`,effects:[Be()]}}function Kr(e,t){return L(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function qr(e,t){return L(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}function Jr(e,t){return L(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function Yr(e,t){return L(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function Xr(e,t){let{subcommand:n,subArgs:r}=Hr(t);switch(n){case``:case`manage`:return Gr();case`install`:return Kr(e,r);case`uninstall`:return qr(e,r);case`enable`:return Jr(e,r);case`disable`:return Yr(e,r);case`marketplace`:return Wr(e,r);default:return F(`Unknown plugin subcommand: ${n}`)}}async function Zr(e,t){return I(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,effects:[ze()]}:e)}function R(){return{name:`plugin`,displayName:`Plugins`,description:se,source:`plugin-manager`,modelInvocable:!1,argumentHint:oe,subcommands:Oe()}}function z(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:de,source:`plugin-manager`,modelInvocable:!1}}function Qr(){let e=R();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:Xr}}function $r(){let e=z();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Zr}}var ei=class{name=`plugin-manager`;getCommands(){return[R(),z()]}};function ti(){return{name:`agent-command-plugin`,commandSources:[new ei],systemCommands:[Qr(),$r()]}}function ni(e){return e.getSession().getActivePresetId?.()??`default`}function ri(e){return[`Available presets:`,...g().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
22
- `)}function ii(e){return`Unknown preset: ${e}. Available: ${g().map(e=>e.id).join(`, `)}`}async function ai(e,t){let n=t.trim().split(/\s+/)[0];if(n===void 0||n.length===0||n===`list`){let t=ni(e);return{message:ri(t),success:!0,data:{presets:g(),active:t}}}return Jt(n)===void 0?{message:ii(n),success:!1}:(await Se(e,n,Yt(n)),{message:`Switched to preset: ${n}`,success:!0,data:{preset:n}})}function oi(e=`preset`){return g().map(t=>({name:t.id,description:t.description,source:e}))}function B(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:oi(`preset`),modelInvocable:!1}}function si(){let e=B();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:ai}}var ci=class{name=`preset`;getCommands(){return[B()]}};const li={preset:{type:`pick`,getItems:()=>oi().map(e=>({label:e.name,value:e.name,description:e.description}))}};function ui(){return{name:`agent-command-preset`,commandSources:[new ci],systemCommands:[si()],interactionHints:li}}function V(e,t,n={}){let r=_i(e,t);return{type:e,steps:bi(vi(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 di(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${W(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
23
- `)}function fi(e,t){let n=e.trim(),r=n.length>0?n:`1`,i=gi(r);if(i!==void 0){let e=t[i];if(e!==void 0)return e.type;throw Error(`Provider selection ${r} is out of range. Currently supported: ${h(t)}`)}let a=qt(t,r);if(a===void 0)throw Error(`Unknown provider: ${r}. Currently supported: ${h(t)}`);return a.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 U(e,t){let n=H(e),r=t.trim()||n.defaultValue||``,i=K(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:xi(a)}}async function pi(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(mi(e,i.setupHelpLinks),e.masked===!0),r=U(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 mi(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=G(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const hi={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function W(e){let t=`${e.category===void 0?``:`${hi[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function G(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${yi(e.kind)}: ${e.label} - ${e.url}`).join(`
24
- `)}function gi(e){if(/^\d+$/.test(e))return Number(e)-1}function K(e,t){if(e.required===!0&&t.length===0)return`Required`}function _i(e,t){let n=qt(t,e);if(n===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${h(t)}`);return n}function vi(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 yi(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function bi(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 xi(e){let t=e.profileName??Lt({type:e.type},{existingProfileNames:e.existingProfileNames}),n=e.values.apiKey;return{profile:t,type:e.type,model:e.values.model,...n!==void 0&&n.length>0&&{apiKey:n},...e.values.baseURL!==void 0&&{baseURL:e.values.baseURL},setCurrent:e.setCurrent??!0}}const Si={type:`session-restart-requested`,reason:`other`};function Ci(e,t){return V(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function q(e,t){return{prompt:wi(e),submit:n=>Ei(e,n,t),cancel:()=>({message:`Provider setup cancelled.`,success:!0})}}function wi(e){let t=H(e),n=t.masked===!0&&t.defaultValue!==void 0?`(unchanged)`:t.defaultValue;return{kind:`text`,title:t.title,...Ti(e),...n===void 0?{}:{placeholder:n},...t.defaultValue===void 0?{}:{allowEmpty:!0},...t.masked===void 0?{}:{masked:t.masked},validate:e=>K(t,e)}}function Ti(e){let t=G(e.setupHelpLinks);return t.length>0?{description:t}:{}}function Ei(e,t,n){let r=U(e,t);return r.status===`error`?{message:r.message,success:!1,interaction:q(e,n)}:r.status===`complete`?Di(r.input,n):{message:``,success:!0,interaction:q(r.state,n)}}function Di(e,t){let n=t.settings.readTargetSettings(),r=ke(e,{providerDefinitions:t.providerDefinitions});return t.settings.writeTargetSettings(pt(n,r)),{message:`Provider ${e.profile} configured. Restarting...`,success:!0,effects:[{...Si,message:`Provider setup restart`}]}}function Oi(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function ki(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:$e(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};if(n.settings.readMergedSettings().currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let i=e[t],a=n.settings.readTargetSettings(),o=n.settings.readMergedSettings(),s=a.providers?.[t]!==void 0||o.providers?.[t]!==void 0?{...a,currentProvider:t}:Ft(a,t);return n.settings.writeTargetSettings(s),{message:`Switched to ${t} (${i.model??`unknown model`}). History preserved.`,success:!0,effects:[{type:`provider-hot-swap-requested`,profileName:t}]}}function Ai(e,t){let n=t.settings.readMergedSettings().providers?.[e];if(!n)return{message:`Provider profile "${e}" was not found.`,success:!1};if(!n.type)return{message:`Provider profile "${e}" is missing type.`,success:!1};try{let r=V(n.type,t.providerDefinitions,{profileName:e,setCurrent:!1,initialValues:ji(n)});return{message:`Provider edit requested: ${e}`,success:!0,interaction:Mi(r,e,t)}}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function ji(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function Mi(e,t,n){return{prompt:wi(e),submit:r=>Ni(e,t,r,n),cancel:()=>({message:`Provider edit cancelled.`,success:!0})}}function Ni(e,t,n,r){let i=U(e,n);return i.status===`error`?{message:i.message,success:!1,interaction:Mi(e,t,r)}:i.status===`complete`?Pi(i.input,t,r):{message:``,success:!0,interaction:Mi(i.state,t,r)}}function Pi(e,t,n){let r=n.settings.readMergedSettings(),i=r.providers?.[t];if(!i)return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:a}=n;if(a?.requireApiKeyFromEnv&&at(e.apiKey))return{message:$e(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=ke(e,{providerDefinitions:n.providerDefinitions}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(Bt(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{effects:[{type:`provider-hot-swap-requested`,profileName:t}]}:{}}}const Fi={type:`session-restart-requested`,reason:`other`};function Ii(e,t){let n=t.settings.readMergedSettings();if(!n.providers?.[e])return{message:`Provider profile "${e}" was not found.`,success:!1};let r=Wi(e,Object.keys(n.providers));return{message:`Provider duplicate requested: ${e}`,success:!0,interaction:Li(e,r,t)}}function Li(e,t,n){return{prompt:{kind:`text`,title:`Duplicate ${e} as`,placeholder:t,allowEmpty:!0,validate:e=>Ri(e,t,n)},submit:r=>zi(e,r,t,n),cancel:()=>({message:`Provider duplicate cancelled.`,success:!0})}}function Ri(e,t,n){let r=Gi(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function zi(e,t,n,r){let i=r.settings.readMergedSettings().providers?.[e];if(!i)return{message:`Provider profile "${e}" was not found.`,success:!1};let a=Gi(t,n),o=Ri(a,n,r);return o===void 0?(r.settings.writeTargetSettings(Bt(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}function Bi(e,t){let n=t.settings.readMergedSettings().providers??{};return n[e]?Object.keys(n).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:t.settings.readTargetSettings().providers?.[e]===void 0?{message:`Provider profile "${e}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:{message:`Provider delete requested: ${e}`,success:!0,interaction:Vi(e,t)}:{message:`Provider profile "${e}" was not found.`,success:!1}}function Vi(e,t){return{prompt:{kind:`choice`,title:`Delete provider profile ${e}?`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]},submit:n=>n===`yes`?Hi(e,t):{message:`Provider delete cancelled.`,success:!0},cancel:()=>({message:`Provider delete cancelled.`,success:!0})}}function Hi(e,t){let n=t.settings.readMergedSettings();if(n.currentProvider!==e)return t.settings.writeTargetSettings(We(t.settings.readTargetSettings(),e)),{message:`Provider profile deleted: ${e}.`,success:!0};let r=Object.entries(n.providers??{}).filter(([t])=>t!==e).map(([e,t])=>({value:e,label:Oi(e,t,n.currentProvider)}));return{message:`Select a replacement provider before deleting ${e}.`,success:!0,interaction:{prompt:{kind:`choice`,title:`Replacement provider for ${e}`,options:r,maxVisible:8},submit:n=>Ui(e,n,t),cancel:()=>({message:`Provider delete cancelled.`,success:!0})}}}function Ui(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=We(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,effects:[{...Fi,message:`Provider delete restart`}]}}function Wi(e,t){let n=Nt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function Gi(e,t){return Nt(e.trim()||t)??``}const Ki=`switch`,qi=`edit`,Ji=`test`,Yi=`duplicate`,Xi=`delete`,Zi=`cancel`;function Qi(e,t,n){return{prompt:{kind:`choice`,title:`Select provider profile`,options:Object.entries(t??{}).map(([t,n])=>({value:t,label:Oi(t,n,e)})),maxVisible:8},submit:e=>$i(e,n),cancel:()=>({message:`Provider profile selection cancelled.`,success:!0})}}function $i(e,t){return t.settings.readMergedSettings().providers?.[e]?{message:`Provider profile selected: ${e}`,success:!0,interaction:ea(e,t)}:{message:`Provider profile "${e}" was not found.`,success:!1}}function ea(e,t){return{prompt:{kind:`choice`,title:`Provider profile: ${e}`,options:[{value:Ki,label:`Switch`},{value:qi,label:`Edit`},{value:Ji,label:`Test`},{value:Yi,label:`Duplicate`},{value:Xi,label:`Delete`},{value:Zi,label:`Cancel`}]},submit:n=>ta(e,n,t),cancel:()=>({message:`Provider profile action cancelled.`,success:!0})}}async function ta(e,t,n){let r=n.settings.readMergedSettings();switch(t){case Ki:return ki(r.providers,e,n);case qi:return Ai(e,n);case Ji:return await zt(r.currentProvider,r.providers,e,n);case Yi:return Ii(e,n);case Xi:return Bi(e,n);case Zi:return{message:`Provider profile action cancelled.`,success:!0};default:return{message:`Unknown provider profile action "${t}".`,success:!1}}}async function na(e,t){let n=t.settings.readMergedSettings(),r=e.trim();if(r.length===0)return ra(n.currentProvider,n.providers,t);let[i=`current`,a]=r.split(/\s+/);return i===`list`?ra(n.currentProvider,n.providers,t):i===`current`||i===``?{message:aa(n.currentProvider,n.providers),success:!0}:i===`switch`?ki(n.providers,a,t):i===`test`?await zt(n.currentProvider,n.providers,a,t):i===`add`?oa(a,t):{message:`Usage: provider [current|list|switch <profile>|add <type>|test [profile]]`,success:!1}}function ra(e,t,n){let r=ia(e,t);return Object.keys(t??{}).length===0?{message:r,success:!0}:{message:r,success:!0,interaction:Qi(e,t,n)}}function ia(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(`
25
- `)}function aa(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(`
26
- `):`Current provider "${e}" was not found in providers.`}function oa(e,t){return e===void 0||e.length===0?{message:`Provider setup requested. Select a provider to continue.`,success:!0,interaction:sa(t)}:qt(t.providerDefinitions,e)===void 0?{message:`Usage: provider add <type>. Supported: ${h(t.providerDefinitions)}`,success:!1}:{message:`Provider setup requested: ${e}`,success:!0,interaction:q(Ci(e,t),t)}}function sa(e){return{prompt:{kind:`choice`,title:`Select provider`,options:e.providerDefinitions.map(e=>({value:e.type,label:W(e)})),maxVisible:6},submit:t=>{let n=Ci(t,e);return{message:`Provider setup requested: ${t}`,success:!0,interaction:q(n,e)}},cancel:()=>({message:`Provider setup cancelled.`,success:!0})}}function ca(){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 la(){return{name:`provider`,displayName:`Provider Setup`,description:`Manage provider profiles`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | test [profile]`,subcommands:ca(),example:`/provider switch production`}}var ua=class{name=`provider`;getCommands(){return[la()]}};function da(e){let t=la();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,execute:async(t,n)=>na(n,e)}}const fa={provider:{type:`pick`,getItems:()=>ca().map(e=>({label:e.name,value:e.name,description:e.description}))}};function pa(e){return{name:`agent-command-provider`,commandSources:[new ua],systemCommands:[da(e)],interactionHints:fa}}async function ma(e,t){let n=(await e(`
22
+ `),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}function Pr(e,t){if(!t||t===`index`){let t=e.loadStartupMemory();return{message:t.content||`(empty memory index)`,success:!0,data:{path:t.path,lineCount:t.lineCount,truncated:t.truncated}}}return{message:e.readTopic(t)||`(empty memory topic: ${t})`,success:!0,data:{topic:t}}}function Fr(e){let t=e[1],n=e[2],r=e.slice(3).join(` `).trim();if(!(!t||!it(t)||!n||r.length===0))return{type:t,topic:n,text:r}}function Ir(e){let t=e.list(`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(`
23
+ `),success:!0,data:{count:t.length}}}function W(e,t){Tt(e,t)}function Lr(e,t,n,r){if(!r)return U();try{let i=t.mark(r,`approved`,`approved-by-user`),a=n.append(i),o=t.mark(r,`saved`,`approved-and-saved`);return W(e,{type:`memory_candidate_approved`,candidateId:o.id,topic:o.topic,reason:`approved-by-user`}),W(e,{type:`memory_candidate_saved`,candidateId:o.id,topic:o.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:o.status,topic:a.topic,topicPath:a.topicPath,deduplicated:a.deduplicated}}}catch(e){return Mr(e instanceof Error?e:String(e))}}function Rr(e,t,n){if(!n)return U();try{let r=t.mark(n,`rejected`,`rejected-by-user`);return W(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 Mr(e instanceof Error?e:String(e))}}function zr(e){let t=lt(e);return{message:[`Used memory references:`,...t.length>0?t.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
24
+ `),success:!0,data:{count:t.length,references:[...t]}}}function Br(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`,i=Ie(e);if(r===`list`)return Nr(i.project);if(r===`show`)return Pr(i.project,n[1]);if(r===`pending`)return Ir(i.pending);if(r===`approve`)return Lr(e,i.pending,i.project,n[1]);if(r===`reject`)return Rr(e,i.pending,n[1]);if(r===`used`)return zr(e);if(r===`add`){let e=Fr(n);if(!e)return U();if($e(e.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let t=i.project.append(e);return{message:t.deduplicated?`${e.type} memory already exists in ${t.topicPath}`:`Saved ${e.type} memory to ${t.topicPath}`,success:!0,data:{indexPath:t.indexPath,topicPath:t.topicPath,topic:t.topic,deduplicated:t.deduplicated}}}return U()}function Vr(){return{name:`memory`,displayName:`Memory`,description:u,source:`memory`,argumentHint:ne,modelInvocable:!0,safety:`write`,subcommands:Te()}}function Hr(){let e=Vr();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:Br}}var Ur=class{name=`memory`;getCommands(){return[Vr()]}};function Wr(){return{name:`agent-command-memory`,commandSources:[new Ur],systemCommands:[Hr()]}}async function Gr(e){let t=e.getUserInteraction?.();if(!t)return;let n=m().map(e=>({value:e.name,label:e.name,description:e.description})),r=await t.ask(y(`mode`,`Select interaction mode`,n));return r.type===`answer`?r.values[0]:void 0}async function Kr(e,t){let n=mt(t);if(n===void 0&&(n=await Gr(e),n===void 0)){let t=bt(e);return{message:`Current mode: ${t}`,success:!0,data:{mode:t}}}return at(n)?(Ut(e,n),{message:`Permission mode set to: ${n}`,success:!0,data:{mode:n}}):{message:Ye(),success:!1}}function qr(){return{name:`mode`,displayName:`Interaction Mode`,description:ie,source:`mode`,argumentHint:p,subcommands:m(`mode`),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=`mode`;getCommands(){return[qr()]}};function Xr(){return{name:`agent-command-mode`,commandSources:[new Yr],systemCommands:[Jr()]}}function Zr(e,t){let n=mt(t);if(n!==void 0){if(!at(n))return{message:Ye(),success:!1};Ut(e,n);let t=xt(e);return{message:`Permission mode set to: ${n}\n${qe(t)}`,success:!0,data:{mode:t.mode,sessionAllowed:t.sessionAllowed}}}let r=xt(e);return{message:qe(r),success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}function Qr(){return{name:`permissions`,displayName:`Permissions`,description:f,source:`permissions`,argumentHint:p,subcommands:m(`permissions`),modelInvocable:!1}}function $r(){let e=Qr();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:Zr}}var ei=class{name=`permissions`;getCommands(){return[Qr()]}};function ti(){return{name:`agent-command-permissions`,commandSources:[new ei],systemCommands:[$r()]}}function ni(e){let t=e.trim().split(/\s+/).filter(e=>e.length>0);return{subcommand:t[0]??``,subArgs:t.slice(1).join(` `).trim()}}function ri(e){return{success:!1,message:e}}function ii(e){return kt(e)}async function G(e,t){let n=ii(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 ai(e,t){let{subcommand:n,subArgs:r}=ni(t);return n===`add`&&r.length>0?G(e,async e=>{let t=await e.marketplaceAdd(r);return`Added marketplace: "${t}" (from ${r})\nInstall plugins with: /plugin install <name>@${t}`}):n===`remove`&&r.length>0?G(e,async e=>(await e.marketplaceRemove(r),`Removed marketplace "${r}" and uninstalled its plugins.`)):n===`update`&&r.length>0?G(e,async e=>(await e.marketplaceUpdate(r),`Updated marketplace "${r}".`)):n===`list`?G(e,async e=>{let t=await e.marketplaceList();return t.length===0?`No marketplace sources configured.`:`Marketplace sources:\n${t.map(e=>` ${e.name} (${e.type})`).join(`
25
+ `)}`}):ri(`Usage: /plugin marketplace add <source> | remove <name> | update <name> | list`)}function K(e,t,n,r){return t.length===0?Promise.resolve(ri(n)):G(e,e=>Promise.resolve(r(e,t)))}function oi(){return{success:!0,message:`Opening plugin manager...`,effects:[Re()]}}function si(e,t){return K(e,t,`Usage: /plugin install <name>@<marketplace>`,async(e,t)=>(await e.install(t),`Installed plugin: ${t}`))}function ci(e,t){return K(e,t,`Usage: /plugin uninstall <name>@<marketplace>`,async(e,t)=>(await e.uninstall(t),`Uninstalled plugin: ${t}`))}function li(e,t){return K(e,t,`Usage: /plugin enable <name>@<marketplace>`,async(e,t)=>(await e.enable(t),`Enabled plugin: ${t}`))}function ui(e,t){return K(e,t,`Usage: /plugin disable <name>@<marketplace>`,async(e,t)=>(await e.disable(t),`Disabled plugin: ${t}`))}async function di(e,t){let{subcommand:n,subArgs:r}=ni(t);switch(n){case``:case`manage`:return oi();case`install`:return si(e,r);case`uninstall`:return ci(e,r);case`enable`:return li(e,r);case`disable`:return ui(e,r);case`marketplace`:return ai(e,r);default:return ri(`Unknown plugin subcommand: ${n}`)}}async function fi(e,t){return G(e,async e=>{let t=await e.reloadPlugins();return`Reloaded ${t.loadedPluginCount===1?`1 plugin resource`:`${t.loadedPluginCount} plugin resources`}.`}).then(e=>e.success?{...e,effects:[Le()]}:e)}function pi(){return{name:`plugin`,displayName:`Plugins`,description:oe,source:`plugin-manager`,modelInvocable:!1,argumentHint:ae,subcommands:Ee()}}function mi(){return{name:`reload-plugins`,displayName:`Reload Plugins`,description:ue,source:`plugin-manager`,modelInvocable:!1}}function hi(){let e=pi();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:di}}function gi(){let e=mi();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:fi}}var _i=class{name=`plugin-manager`;getCommands(){return[pi(),mi()]}};function vi(){return{name:`agent-command-plugin`,commandSources:[new _i],systemCommands:[hi(),gi()]}}function yi(e){return e.getSession().getActivePresetId?.()??`default`}function bi(e){return[`Available presets:`,...S().map(t=>`${t.id===e?`* `:` `}${t.id} — ${t.title}: ${t.description}`)].join(`
26
+ `)}function xi(e){return`Unknown preset: ${e}. Available: ${S().map(e=>e.id).join(`, `)}`}function Si(e){let t=yi(e);return{message:bi(t),success:!0,data:{presets:S(),active:t}}}async function Ci(e){let t=e.getUserInteraction?.();if(!t)return;let n=S().map(e=>({value:e.id,label:e.id,description:e.description})),r=await t.ask(y(`preset`,`Select a preset`,n));return r.type===`answer`?r.values[0]:void 0}async function wi(e,t){let n=t.trim().split(/\s+/)[0];if(n===`list`||(n===void 0||n.length===0)&&(n=await Ci(e),n===void 0))return Si(e);if(on(n)===void 0)return{message:xi(n),success:!1};let r=sn(n);return await xe(e,n,r),{message:`Switched to preset: ${n}`,success:!0,data:{preset:n}}}function Ti(e=`preset`){return S().map(t=>({name:t.id,description:t.description,source:e}))}function Ei(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:Ti(`preset`),modelInvocable:!1}}function Di(){let e=Ei();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:wi}}var Oi=class{name=`preset`;getCommands(){return[Ei()]}};function ki(){return{name:`agent-command-preset`,commandSources:[new Oi],systemCommands:[Di()]}}function q(e,t,n={}){let r=Bi(e,t);return{type:e,steps:Ui(Vi(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 Ai(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Ii(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
27
+ `)}function ji(e,t){let n=e.trim(),r=n.length>0?n:`1`,i=Ri(r);if(i!==void 0){let e=t[i];if(e!==void 0)return e.type;throw Error(`Provider selection ${r} is out of range. Currently supported: ${_(t)}`)}let a=g(t,r);if(a===void 0)throw Error(`Unknown provider: ${r}. Currently supported: ${_(t)}`);return a.type}function J(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 Mi(e,t){let n=J(e),r=t.trim()||n.defaultValue||``,i=zi(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:Wi(a)}}async function Ni(e,t,n,r={}){let i=q(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=J(i),n=await t(Pi(e,i.setupHelpLinks),e.masked===!0),r=Mi(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 Pi(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Li(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Fi={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Ii(e){let t=`${e.category===void 0?``:`${Fi[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Li(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${Hi(e.kind)}: ${e.label} - ${e.url}`).join(`
28
+ `)}function Ri(e){if(/^\d+$/.test(e))return Number(e)-1}function zi(e,t){if(e.required===!0&&t.length===0)return`Required`}function Bi(e,t){let n=g(t,e);if(n===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${_(t)}`);return n}function Vi(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 Hi(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function Ui(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 Wi(e){let t=e.profileName??Lt({type:e.type},{existingProfileNames:e.existingProfileNames}),n=e.values.apiKey;return{profile:t,type:e.type,model:e.values.model,...n!==void 0&&n.length>0&&{apiKey:n},...e.values.baseURL!==void 0&&{baseURL:e.values.baseURL},setCurrent:e.setCurrent??!0}}const Gi={type:`session-restart-requested`,reason:`other`};function Ki(e,t){return q(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function qi(e,t){let n=J(e),r=n.masked===!0&&n.defaultValue!==void 0?`(unchanged)`:n.defaultValue,i=Li(e.setupHelpLinks),a=[t,i.length>0?i:void 0].filter(e=>e!==void 0&&e.length>0).join(`
29
+ `)||void 0;return Jt(`provider-setup-${n.key}`,n.title,{description:a,placeholder:r,allowEmpty:n.defaultValue!==void 0,masked:n.masked})}async function Ji(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(qi(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Mi(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 Yi(e,t,n){return Ji(e,t,e=>Xi(e,n),`Provider setup cancelled.`)}function Xi(e,t){let n=t.settings.readTargetSettings(),r=De(e,{providerDefinitions:t.providerDefinitions});return t.settings.writeTargetSettings(dt(n,r)),{message:`Provider ${e.profile} configured. Restarting...`,success:!0,effects:[{...Gi,message:`Provider setup restart`}]}}function Zi(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function Qi(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:Ze(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};if(n.settings.readMergedSettings().currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let i=e[t],a=n.settings.readTargetSettings(),o=n.settings.readMergedSettings(),s=a.providers?.[t]!==void 0||o.providers?.[t]!==void 0?{...a,currentProvider:t}:Ft(a,t);return n.settings.writeTargetSettings(s),{message:`Switched to ${t} (${i.model??`unknown model`}). History preserved.`,success:!0,effects:[{type:`provider-hot-swap-requested`,profileName:t}]}}async function $i(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=q(r.type,n.providerDefinitions,{profileName:t,setCurrent:!1,initialValues:ea(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return Ji(e,i,e=>ta(e,t,n),`Provider edit cancelled.`)}function ea(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function ta(e,t,n){let r=n.settings.readMergedSettings(),i=r.providers?.[t];if(!i)return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:a}=n;if(a?.requireApiKeyFromEnv&&rt(e.apiKey))return{message:Ze(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=De(e,{providerDefinitions:n.providerDefinitions}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(Bt(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{effects:[{type:`provider-hot-swap-requested`,profileName:t}]}:{}}}const na={type:`session-restart-requested`,reason:`other`};async function ra(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=la(t,Object.keys(r.providers)),a;for(;;){let r=await e.ask(Jt(`provider-duplicate`,`Duplicate ${t} as`,{description:a,placeholder:i,allowEmpty:!0}));if(r.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let o=r.text??``,s=ia(o,i,n);if(s!==void 0){a=s;continue}return aa(t,o,i,n)}}function ia(e,t,n){let r=ua(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function aa(e,t,n,r){let i=r.settings.readMergedSettings().providers?.[e];if(!i)return{message:`Provider profile "${e}" was not found.`,success:!1};let a=ua(t,n),o=ia(a,n,r);return o===void 0?(r.settings.writeTargetSettings(Bt(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}async function oa(e,t,n){let r=n.settings.readMergedSettings().providers??{};return r[t]?Object.keys(r).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n.settings.readTargetSettings().providers?.[t]===void 0?{message:`Provider profile "${t}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:v(await e.ask(h(`provider-delete`,`Delete provider profile ${t}?`)))?sa(e,t,n):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${t}" was not found.`,success:!1}}async function sa(e,t,n){let r=n.settings.readMergedSettings();if(r.currentProvider!==t)return n.settings.writeTargetSettings(He(n.settings.readTargetSettings(),t)),{message:`Provider profile deleted: ${t}.`,success:!0};let i=Object.entries(r.providers??{}).filter(([e])=>e!==t).map(([e,t])=>({value:e,label:Zi(e,t,r.currentProvider)})),a=await e.ask(y(`provider-delete-replacement`,`Replacement provider for ${t}`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:ca(t,a.values[0],n)}function ca(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=He(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,effects:[{...na,message:`Provider delete restart`}]}}function la(e,t){let n=Nt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function ua(e,t){return Nt(e.trim()||t)??``}const da=`switch`,fa=`edit`,pa=`test`,ma=`duplicate`,ha=`delete`,ga=`cancel`;async function _a(e,t,n,r){let i=Object.entries(n??{}).map(([e,n])=>({value:e,label:Zi(e,n,t)})),a=await e.ask(y(`provider-profile`,`Select provider profile`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:va(e,a.values[0],r)}async function va(e,t,n){if(!n.settings.readMergedSettings().providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let r=await e.ask(y(`provider-profile-action`,`Provider profile: ${t}`,[{value:da,label:`Switch`},{value:fa,label:`Edit`},{value:pa,label:`Test`},{value:ma,label:`Duplicate`},{value:ha,label:`Delete`},{value:ga,label:`Cancel`}]));return r.type!==`answer`||r.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:ya(e,t,r.values[0],n)}async function ya(e,t,n,r){let i=r.settings.readMergedSettings();switch(n){case da:return Qi(i.providers,t,r);case fa:return $i(e,t,r);case pa:return zt(i.currentProvider,i.providers,t,r);case ma:return ra(e,t,r);case ha:return oa(e,t,r);case ga:return{message:`Provider profile action cancelled.`,success:!0};default:return{message:`Unknown provider profile action "${n}".`,success:!1}}}async function ba(e,t,n){let r=e.getUserInteraction?.(),i=n.settings.readMergedSettings(),a=t.trim();if(a.length===0)return xa(r,i.currentProvider,i.providers,n);let[o=`current`,s]=a.split(/\s+/);return o===`list`?xa(r,i.currentProvider,i.providers,n):o===`current`||o===``?{message:Ca(i.currentProvider,i.providers),success:!0}:o===`switch`?Qi(i.providers,s,n):o===`test`?zt(i.currentProvider,i.providers,s,n):o===`add`?wa(r,s,n):{message:`Usage: provider [current|list|switch <profile>|add <type>|test [profile]]`,success:!1}}function xa(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Sa(t,n),success:!0}:_a(e,t,n,r)}function Sa(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(`
30
+ `)}function Ca(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(`
31
+ `):`Current provider "${e}" was not found in providers.`}function wa(e,t,n){return t===void 0||t.length===0?e?Ta(e,n):{message:`Usage: provider add <type>. Supported: ${_(n.providerDefinitions)}`,success:!1}:g(n.providerDefinitions,t)===void 0?{message:`Usage: provider add <type>. Supported: ${_(n.providerDefinitions)}`,success:!1}:e?Yi(e,Ki(t,n),n):{message:`Provider setup for "${t}" requires an interactive session.`,success:!1}}async function Ta(e,t){let n=t.providerDefinitions.map(e=>({value:e.type,label:Ii(e)})),r=await e.ask(y(`provider-type`,`Select provider`,n,{maxVisible:6}));if(r.type!==`answer`||r.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let i=r.values[0];return g(t.providerDefinitions,i)===void 0?{message:`Usage: provider add <type>. Supported: ${_(t.providerDefinitions)}`,success:!1}:Yi(e,Ki(i,t),t)}function Ea(){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 Da(){return{name:`provider`,displayName:`Provider Setup`,description:`Manage provider profiles`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | test [profile]`,subcommands:Ea(),example:`/provider switch production`}}var Oa=class{name=`provider`;getCommands(){return[Da()]}};function ka(e){let t=Da();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)=>ba(t,n,e)}}function Aa(e){return{name:`agent-command-provider`,commandSources:[new Oa],systemCommands:[ka(e)]}}async function ja(e,t){let n=(await e(`
27
32
  Do you have an API key for an AI provider?
28
33
 
29
34
  1. Yes, I have an API key
@@ -50,15 +55,15 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,BundleP
50
55
  When the server is running, come back here and press Enter to continue.
51
56
 
52
57
  ─────────────────────────────────────────────────────────────────────────────
53
- `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function ha(e,t,n,r,i){let a=await ma(n,r),o=Object.keys(Ct(e).providers??{}),s=At(e,t.settingsScope),c;c=a.preselectedType===void 0?fi(await n(di(i)),i):a.preselectedType,Ce(s,await pi(c,n,i,{existingProfileNames:o}),{providerDefinitions:i});let l=await n(` Response language (ko/en/ja/zh, default: en): `);if(l){let e=wt(s);e.language=l,Wt(s,e)}r.writeLine(`\n Config saved to ${s}\n`)}async function ga(e,t,n,r,i,a){let o=Ct(e);if(Ne(t.provider===void 0?o:{...o,currentProvider:t.provider},i)===`valid`||t.provider===void 0&&Ot(i,a.env)!==void 0)return;if(!(a.isInteractive??(()=>!1))())throw new ue(a.formatError(i));await ha(e,_a(e,t),n,r,i);let s=Ct(e);if(Ne(t.provider===void 0?s:{...s,currentProvider:t.provider},i)!==`valid`)throw new ue(a.formatError(i))}function _a(e,t){if(t.settingsScope!==void 0||t.provider!==void 0)return t;let n=va(et(e));if(n===void 0)return t;let r=_(e,`.robota`,`settings.json`),i=_(e,`.robota`,`settings.local.json`);return n===r||n===i?{...t,settingsScope:`project-local`}:t}function va(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&typeof wt(n).currentProvider==`string`)return n}}function ya(e,t){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},effects:[{type:`settings-reset-requested`}]}}function ba(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function xa(){let e=ba();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:ya}}var Sa=class{name=`reset`;getCommands(){return[ba()]}};function Ca(){return{name:`agent-command-reset`,commandSources:[new Sa],systemCommands:[xa()]}}function J(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function wa(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function Ta(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${wa(e.prompt)}`):[`(no edit checkpoints)`]].join(`
54
- `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function Ea(e){return e.length>0?e.join(`, `):`(none)`}function Da(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: ${wa(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${Ea(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${Ea(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
55
- `),success:!0,data:{inspection:e}}}function Oa(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
56
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function ka(e){return{message:[`Rolled back code through ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Removed checkpoints: ${e.removedCheckpointCount}`].join(`
57
- `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function Aa(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function ja(e,t){if(!t)return J();try{return Da(nt(e,t))}catch(e){return Aa(e instanceof Error?e:String(e))}}async function Ma(e,t){if(!t)return J();try{return Oa(await jt(e,t))}catch(e){return Aa(e instanceof Error?e:String(e))}}async function Na(e,t){if(!t)return J();try{return ka(await Mt(e,t))}catch(e){return Aa(e instanceof Error?e:String(e))}}async function Pa(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?Ta(ut(e)):r===`inspect`?ja(e,n[1]):r===`restore`||r===`code`?Ma(e,n[1]):r===`rollback`?Na(e,n[1]):J()}function Fa(){return{name:`rewind`,displayName:`Rewind History`,description:ge,source:`rewind`,argumentHint:he,modelInvocable:!1,safety:`write`,subcommands:Ae()}}function Ia(){let e=Fa();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:Pa}}var La=class{name=`rewind`;getCommands(){return[Fa()]}};function Ra(){return{name:`agent-command-rewind`,commandSources:[new La],systemCommands:[Ia()]}}const za={s:1e3,m:6e4,h:36e5,d:864e5},Y=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function Ba(e,t){let n=e.trim();if(n.length===0)return{ok:!1,error:Y};if(n.startsWith(`in `)){let e=n.slice(3).trim(),r=e.indexOf(` `);if(r===-1)return{ok:!1,error:`Missing instruction. ${Y}`};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}". ${Y}`};if(a.length===0)return{ok:!1,error:`Missing instruction. ${Y}`};let s=parseInt(o[1],10)*za[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+(.+)$/.exec(e);if(!t)return{ok:!1,error:`cron form needs a quoted expression. ${Y}`};let r=t[2].trim();return r.length===0?{ok:!1,error:`Missing instruction. ${Y}`}:{ok:!0,spec:{cronExpression:t[1].trim(),instruction:r,recurring:!0}}}return{ok:!1,error:Y}}function Va(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}async function Ha(e,t,n=Date.now()){let r=Ba(t,n);if(!r.ok)return{message:r.error,success:!1};let{cronExpression:i,instruction:a,recurring:o}=r.spec,s=await e.spawnScheduledWake({label:Va(`Scheduled`,a),cronExpression:i,agentInstruction:a});return{message:`Scheduled wake (${o?`cron \`${i}\``:`once at ${i}`}): "${a}" — task ${s.id}.`,success:!0,data:{taskId:s.id,cronExpression:i,recurring:o}}}function Ua(e){let t=/^["']([^"']+)["']\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 Wa(e,t){let n=Ua(t);if(!n)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let r=await e.spawnMonitorWake({label:Va(`Monitor`,n.instruction),command:n.command,matchPattern:n.matchPattern,agentInstruction:n.instruction});return{message:`Monitoring \`${n.command}\` for /${n.matchPattern}/ — task ${r.id}.`,success:!0,data:{taskId:r.id,matchPattern:n.matchPattern}}}function Ga(e){let t=e.getAgentJobCapability?.();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function Ka(){return{name:`schedule`,displayName:`Schedule Wake`,description:`Schedule the agent to wake and run an instruction on a timer (one-shot or cron).`,source:`schedule`,argumentHint:`in <N><s|m|h|d> <instruction> | cron "<expr>" <instruction>`,modelInvocable:!0}}function qa(){return{name:`monitor`,displayName:`Monitor Process`,description:`Watch a process’s output and wake the agent when a line matches a pattern.`,source:`schedule`,argumentHint:`"<command>" "<pattern>" <instruction>`,modelInvocable:!0}}function Ja(){let e=Ka();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>Ha(Ga(e),t)}}function Ya(){let e=qa();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>Wa(Ga(e),t)}}var Xa=class{name=`schedule`;getCommands(){return[Ka(),qa()]}};function Za(){return{name:`agent-command-schedule`,commandSources:[new Xa],systemCommands:[Ja(),Ya()],sessionRequirements:[`agent-runtime`]}}function Qa(e,t,n){return Kt(e,t,n)}function X(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function $a(e){return e.toLocaleString(`en-US`)}const eo=`Conversation cleared.`;function to(e,t){return Fe(e),{success:!0,message:eo,effects:[{type:`conversation-history-cleared`}]}}function no(e,t){let n=_t(t);return n===void 0?{success:!1,message:pe}:{success:!0,message:`Session renamed to "${n}".`,data:{name:n},effects:[Ue(n)]}}function ro(e,t){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},effects:[He()]}}const io=`.robota/budget.json`;function ao(e){let t=_(e,io);if(!Xt(t))return;let n;try{n=Qt(t,`utf-8`)}catch{return}try{return JSON.parse(n)}catch{return}}function oo(e,t){Zt(_(e,`.robota`),{recursive:!0}),$t(_(e,io),JSON.stringify(t,null,2))}function so(e){let t=_(e,io);Xt(t)&&$t(t,`{}`)}function co(e){let t=e.getSession(),n=St(e),r=t.getSessionTokenUsage?.(),i=t.getModelId?.(),a=[`Session: ${n.sessionId}`,`Messages: ${n.messageCount}`],o={sessionId:n.sessionId,messageCount:n.messageCount};if(r){if(a.push(`Tokens: ${$a(r.inputTokens)} input / ${$a(r.outputTokens)} output`),o.inputTokens=r.inputTokens,o.outputTokens=r.outputTokens,i){let t=Qa(i,r.inputTokens,r.outputTokens);if(t!==void 0){a.push(`Cost: ${X(t)} (${i})`),o.estimatedCostUsd=t;let n=ao(e.getCwd());if(n?.monthly){let e=n.monthly-t,r=Math.min(100,Math.round(t/n.monthly*100));a.push(`Budget: ${X(e)} remaining of ${X(n.monthly)}/mo (${r}% used)`),o.budgetMonthly=n.monthly,o.budgetRemainingUsd=e}}}}else a.push(`Tokens: not yet available (no turns completed)`);return{lines:a,data:o}}function lo(e,t){let n=t.trim();if(n.startsWith(`budget`)){let t=n.slice(6).trim();if(t===`clear`)return so(e.getCwd()),{success:!0,message:`Monthly budget cleared.`};if(t===``){let t=ao(e.getCwd());return t?.monthly?{success:!0,message:`Monthly budget: ${X(t.monthly)}`}:{success:!0,message:`No budget set. Use: /cost budget <amount>`}}let r=parseFloat(t);return!Number.isFinite(r)||r<=0?{success:!1,message:`Usage: /cost budget <amount> (e.g. /cost budget 5.00)`}:(oo(e.getCwd(),{monthly:r}),{success:!0,message:`Monthly budget set to ${X(r)}.`})}let{lines:r,data:i}=co(e);return{success:!0,message:r.join(`
58
- `),data:i}}function uo(e,t){let n=Vt(e);return{success:n.validation.ok,message:Xe(n),data:{logFile:n.logFile,entryCount:n.entryCount,issueCount:n.validation.issues.length,ok:n.validation.ok}}}function fo(){return{name:`clear`,displayName:`Clear History`,description:i,source:`session`,modelInvocable:!1}}function po(){return{name:`rename`,displayName:`Rename Session`,description:fe,source:`session`,modelInvocable:!1}}function mo(){return{name:`resume`,displayName:`Resume Session`,description:me,source:`session`,modelInvocable:!1}}function ho(){return{name:`cost`,displayName:`Session Cost`,description:a,source:`session`,modelInvocable:!1}}function go(){return{name:`validate-session`,displayName:`Validate Session`,description:be,source:`session`,modelInvocable:!1}}function _o(){let e=fo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:to}}function vo(){let e=po();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:no}}function yo(){let e=mo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:ro}}function bo(){let e=ho();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:lo}}function xo(){let e=go();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:uo}}var So=class{name=`session`;getCommands(){return[fo(),po(),mo(),ho(),go()]}};const Co={clear:{type:`confirm`,message:`Clear conversation history?`}};function wo(){return{name:`agent-command-session`,commandSources:[new So],systemCommands:[_o(),vo(),yo(),bo(),xo()],interactionHints:Co}}function Z(){return{name:`settings`,displayName:`Settings`,description:`Open transport settings — enable/disable transports and configure options`,source:`settings`,modelInvocable:!1}}function To(){let e=Z();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...`,effects:[{type:`settings-tui-requested`}]})}}var Eo=class{name=`settings`;getCommands(){return[Z()]}};function Do(){return{name:`agent-command-settings`,commandSources:[new Eo],systemCommands:[To()]}}const Oo=`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. Slash syntax is a UI input/display concern; the SDK command identity is "skills".`;function ko(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 Ao(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${ko(e)}`}function jo(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(`
59
- `):[`Registered skills:`,...e.map(Ao),``,`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(`
60
- `)}function Mo(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 No(e,t=``){let n=Mo(t);if(n.action===`activate`&&n.skillName!==void 0){if(!e.executeSkillCommandByName)return{success:!1,message:`Skill activation is not available in this session.`};let t=`/${n.skillName}${n.skillArgs?` ${n.skillArgs}`:``}`;return await e.executeSkillCommandByName(n.skillName,n.skillArgs,{invocationSource:e.getCommandInvocationSource?.()??`user`,displayInput:t,rawInput:t})??{success:!1,message:`Unknown skill: ${n.skillName}`}}let r=e.listSkills?.()??[];return{success:!0,message:jo(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function Po(){return{name:`skills`,displayName:`Skills`,description:Oo,source:`skills`,modelInvocable:!0,userInvocable:!0,argumentHint:`[list | <skill-name> [args]]`,safety:`read-only`}}function Fo(){let e=Po();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`inline`,execute:No}}var Io=class{name=`skills`;getCommands(){return[Po()]}};function Lo(e){let t=[new Io];return t.push(new ye(e.cwd)),{name:`agent-command-skills`,commandSources:t,systemCommands:[Fo()]}}const Ro=[`Usage: /statusline on | off | reset | git on | git off`,`Fields: model, context, permission mode, message count, session name, thinking state, git branch.`].join(`
61
- `);function zo(e){let t=e.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[n,r]=t;return n===`on`&&r===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:n===`off`&&r===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:n===`reset`&&r===void 0?{success:!0,message:`Status line settings reset.`,patch:{...s}}:n===`git`&&r===`on`&&t.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:n===`git`&&r===`off`&&t.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:Ro}}function Bo(e,t){let n=zo(t);return n.success?{success:!0,message:n.message,effects:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function Vo(){return{name:`statusline`,displayName:`Status Line`,description:ve,source:`statusline`,argumentHint:_e,subcommands:je(`statusline`),modelInvocable:!1}}function Ho(){let e=Vo();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:Bo}}var Uo=class{name=`statusline`;getCommands(){return[Vo()]}};function Wo(){return{name:`agent-command-statusline`,commandSources:[new Uo],systemCommands:[Ho()]}}const Go=`Inspect Robota user-local storage and memory state.`,Ko=`storage list [--format json] | memory set/list/inspect/disable/delete`,Q=`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 qo(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
62
- `)}function $(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function Jo(e,t){let n=await ft({activeRepositoryRoot:e});return{message:t.format===`json`?JSON.stringify(n,null,2):qo(n.items),success:!0,data:{list:n}}}async function Yo(e,t){let[n,r,i]=t.positional,a=await It({activeRepositoryRoot:e,category:$(n),key:r??``,value:i??``,summary:t.summary??``,source:t.source??``});return{message:`Stored user-local memory item ${a.category}/${a.key} at ${a.storageLocation}`,success:!0,data:{item:a}}}async function Xo(e,t){let[n,r]=t.positional,i=await rt({activeRepositoryRoot:e,category:$(n),key:r??``});return{message:t.format===`json`?JSON.stringify(i,null,2):`${i.category}/${i.key}: ${i.summary}`,success:!0,data:{item:i}}}async function Zo(e,t){let[n,r]=t.positional,i=await Ke({activeRepositoryRoot:e,category:$(n),key:r??``});return{message:`Disabled user-local memory item ${i.category}/${i.key}`,success:!0,data:{item:i}}}async function Qo(e,t){let[n,r]=t.positional,i=await Ge({activeRepositoryRoot:e,category:$(n),key:r??``});return{message:`Deleted user-local memory item ${i.category}/${i.key}`,success:!0,data:{result:i}}}async function $o(e,t){return(t.action??`list`)===`list`?Jo(e,t):t.action===`set`?Yo(e,t):t.action===`inspect`?Xo(e,t):t.action===`disable`?Zo(e,t):t.action===`delete`?Qo(e,t):{message:Q,success:!1}}function es(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function ts(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 ns(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=ts(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:es(n),summary:r,source:i}}function rs(e){return e.trim().split(/\s+/).filter(Boolean)}function is(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
63
- `)}async function as(e,t){if((t.action??`list`)!==`list`)return{message:Q,success:!1};let n=await it({activeRepositoryRoot:e});return{message:t.format===`json`?JSON.stringify(n,null,2):is(n.root,n.categories),success:!0,data:{root:n.root,categories:n.categories,inspection:n}}}async function os(e,t){return t.target===`storage`?as(e,t):t.target===`memory`?$o(e,t):{message:Q,success:!1}}function ss(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function cs(e){try{return await os(e.cwd,ns(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:ss(e instanceof Error?e.message:String(e)),success:!1}}}async function ls(e,t){try{return await os(e.getCwd(),ns(rs(t)))}catch(e){return{message:ss(e instanceof Error?e.message:String(e)),success:!1}}}function us(){return{name:`user-local`,displayName:`User Config`,description:Go,source:`user-local`,argumentHint:Ko,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 ds(){let e=us();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:ls}}var fs=class{name=`user-local`;getCommands(){return[us()]}};function ps(){return{name:`agent-command-user-local`,commandSources:[new fs],systemCommands:[ds()]}}function ms(e,t,n){let r=e;if(t!==void 0){let e=new Set(t);r=r.filter(t=>e.has(t.name))}if(n!==void 0){let e=new Set(n);r=r.filter(t=>!e.has(t.name))}return r}function hs({cwd:e,providerDefinitions:t,providerSettingsAdapter:n,enabledCommandModules:r,disabledCommandModules:i}){return ms([Lo({cwd:e}),hr(),On(),Vr(),Lr(),ui(),br(),Nn(),Mr(),ps(),zn(),or(),dr(),wo(),Ca(),Ra(),Za(),Wo(),ti(),Do(),pa({providerDefinitions:t,settings:n})],r,i)}function gs(e){let t=tn(),i=_(t,`.robota`,`plugins`),a=_(t,`.robota`,`settings.json`),o=(e,t)=>en(e,{timeout:t.timeout,stdio:t.stdio??`pipe`}),s=new le(a),c=new u({pluginsDir:i,exec:o});return{cwd:e,marketplace:c,installer:new n({pluginsDir:i,settingsStore:s,marketplaceClient:c,exec:o}),loader:new r(i),settingsStore:s}}async function _s(e){let t=await e.loader.loadAll(),n=e.settingsStore.getEnabledPlugins();return t.map(e=>{let t=e.pluginDir.split(`/`),r=t.indexOf(`cache`),i=r>=0?t[r+1]??``:``,a=i?`${e.manifest.name}@${i}`:e.manifest.name;return{name:a,description:e.manifest.description,enabled:n[a]!==!1&&n[e.manifest.name]!==!1}})}async function vs(e,t){let n;try{n=e.marketplace.fetchManifest(t)}catch{return[]}let r=e.installer.getInstalledPlugins(),i=new Set(Object.values(r).map(e=>e.pluginName));return n.plugins.map(e=>({name:e.name,description:e.description,installed:i.has(e.name)}))}async function ys(e,t,r){let[i,a]=t.split(`@`);if(!i||!a)throw Error(`Plugin ID must be in format: name@marketplace`);if(r===`project`){await new n({pluginsDir:_(e.cwd,`.robota`,`plugins`),settingsStore:e.settingsStore,marketplaceClient:e.marketplace,exec:(e,t)=>en(e,{timeout:t.timeout,stdio:t.stdio??`pipe`})}).install(i,a);return}await e.installer.install(i,a)}async function bs(e,t){let n=e.installer.getPluginsByMarketplace(t);for(let t of n)await e.installer.uninstall(`${t.pluginName}@${t.marketplace}`);e.marketplace.removeMarketplace(t)}function xs(e){return e.marketplace.listMarketplaces().map(e=>({name:e.name,type:e.source.type}))}function Ss(e){let t=gs(e);return{listInstalled:()=>_s(t),listAvailablePlugins:e=>vs(t,e),install:(e,n)=>ys(t,e,n),uninstall:async e=>t.installer.uninstall(e),enable:async e=>t.installer.enable(e),disable:async e=>t.installer.disable(e),marketplaceAdd:async e=>e.includes(`/`)&&!e.includes(`:`)?t.marketplace.addMarketplace({type:`github`,repo:e}):t.marketplace.addMarketplace({type:`git`,url:e}),marketplaceRemove:e=>bs(t,e),marketplaceUpdate:async e=>t.marketplace.updateMarketplace(e),marketplaceList:async()=>xs(t),reloadPlugins:async()=>({loadedPluginCount:(await t.loader.loadAll()).length})}}const Cs=`plugin`;function ws(){return process.env.HOME??tn()}function Ts(e){let t=new r(_(ws(),`.robota`,`plugins`));try{let n=t.loadPluginsSync();return n.length===0?(e.replaceSource(Cs),0):(e.replaceSource(Cs,new ce(n)),n.length)}catch{return e.replaceSource(Cs),0}}export{Dn as AgentCommandSource,Mn as BackgroundCommandSource,eo as CLEAR_COMMAND_MESSAGE,Rn as CompactCommandSource,ar as ContextCommandSource,lr as ExitCommandSource,mr as HelpCommandSource,vr as LanguageCommandSource,jr as MemoryCommandSource,Fr as ModeCommandSource,Br as PermissionsCommandSource,ei as PluginManagerCommandSource,ci as PresetCommandSource,ua as ProviderCommandSource,La as RewindCommandSource,Oo as SKILLS_COMMAND_DESCRIPTION,Ro as STATUSLINE_USAGE,Xa as ScheduleCommandSource,So as SessionCommandSource,Eo as SettingsCommandSource,Io as SkillsCommandSource,Uo as StatusLineCommandSource,Ko as USER_LOCAL_COMMAND_ARGUMENT_HINT,Go as USER_LOCAL_COMMAND_DESCRIPTION,Q as USER_LOCAL_COMMAND_USAGE,fs as UserLocalCommandSource,x as createAgentCommandEntry,On as createAgentCommandModule,En as createAgentSystemCommand,S as createBackgroundCommandEntry,Nn as createBackgroundCommandModule,fo as createClearCommandEntry,In as createCompactCommandEntry,zn as createCompactCommandModule,rr as createContextCommandEntry,or as createContextCommandModule,ho as createCostCommandEntry,hs as createDefaultCommandModules,Ss as createDefaultPluginCommandAdapter,D as createExitCommandEntry,dr as createExitCommandModule,O as createHelpCommandEntry,hr as createHelpCommandModule,k as createLanguageCommandEntry,br as createLanguageCommandModule,M as createMemoryCommandEntry,Mr as createMemoryCommandModule,N as createModeCommandEntry,Lr as createModeCommandModule,qa as createMonitorCommandEntry,P as createPermissionsCommandEntry,Vr as createPermissionsCommandModule,R as createPluginCommandEntry,ti as createPluginCommandModule,B as createPresetCommandEntry,ui as createPresetCommandModule,la as createProviderCommandEntry,pa as createProviderCommandModule,V as createProviderSetupFlow,z as createReloadPluginsCommandEntry,po as createRenameCommandEntry,ba as createResetCommandEntry,Ca as createResetCommandModule,mo as createResumeCommandEntry,Ra as createRewindCommandModule,Ka as createScheduleCommandEntry,Za as createScheduleCommandModule,wo as createSessionCommandModule,Z as createSettingsCommandEntry,Do as createSettingsCommandModule,Po as createSkillsCommandEntry,Lo as createSkillsCommandModule,Vo as createStatusLineCommandEntry,Wo as createStatusLineCommandModule,us as createUserLocalCommandEntry,ps as createUserLocalCommandModule,go as createValidateSessionCommandEntry,ga as ensureProviderConfig,Sn as executeAgentCommand,An as executeBackgroundCommand,to as executeClearCommand,Fn as executeCompactCommand,Hn as executeContextCommand,lo as executeCostCommand,sr as executeExitCommand,fr as executeHelpCommand,gr as executeLanguageCommand,kr as executeMemoryCommand,Nr as executeModeCommand,Wa as executeMonitorCommand,Rr as executePermissionsCommand,Xr as executePluginCommand,ai as executePresetCommand,na as executeProviderCommand,Zr as executeReloadPluginsCommand,no as executeRenameCommand,ya as executeResetCommand,ro as executeResumeCommand,Pa as executeRewindCommand,Ha as executeScheduleCommand,No as executeSkillsCommand,Bo as executeStatusLineCommand,ls as executeUserLocalCommand,cs as executeUserLocalDirectCommand,uo as executeValidateSessionCommand,W as formatProviderSetupChoiceLabel,G as formatProviderSetupHelpLinks,mi as formatProviderSetupPromptLabel,di as formatProviderSetupSelectionPrompt,H as getProviderSetupStep,Ba as parseScheduleSpec,Ts as reloadPluginCommandSource,fi as resolveProviderSetupSelection,pi as runProviderSetupPromptFlow,ha as runProviderStartupSetup,U as submitProviderSetupValue,K as validateProviderSetupValue};
58
+ `),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function Ma(e,t,n,r,i){let a=await ja(n,r),o=Object.keys(Ct(e).providers??{}),s=At(e,t.settingsScope),c;c=a.preselectedType===void 0?ji(await n(Ai(i)),i):a.preselectedType,Se(s,await Ni(c,n,i,{existingProfileNames:o}),{providerDefinitions:i});let l=await n(` Response language (ko/en/ja/zh, default: en): `);if(l){let e=wt(s);e.language=l,Wt(s,e)}r.writeLine(`\n Config saved to ${s}\n`)}async function Na(e,t,n,r,i,a){let o=Ct(e);if(je(t.provider===void 0?o:{...o,currentProvider:t.provider},i)===`valid`||t.provider===void 0&&Ot(i,a.env)!==void 0)return;if(!(a.isInteractive??(()=>!1))())throw new le(a.formatError(i));await Ma(e,Pa(e,t),n,r,i);let s=Ct(e);if(je(t.provider===void 0?s:{...s,currentProvider:t.provider},i)!==`valid`)throw new le(a.formatError(i))}function Pa(e,t){if(t.settingsScope!==void 0||t.provider!==void 0)return t;let n=Fa(Qe(e));if(n===void 0)return t;let r=x(e,`.robota`,`settings.json`),i=x(e,`.robota`,`settings.local.json`);return n===r||n===i?{...t,settingsScope:`project-local`}:t}function Fa(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&typeof wt(n).currentProvider==`string`)return n}}function Ia(e,t){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},effects:[{type:`settings-reset-requested`}]}}function La(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function Ra(){let e=La();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Ia}}var za=class{name=`reset`;getCommands(){return[La()]}};function Ba(){return{name:`agent-command-reset`,commandSources:[new za],systemCommands:[Ra()]}}function Y(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function Va(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function Ha(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${Va(e.prompt)}`):[`(no edit checkpoints)`]].join(`
59
+ `),success:!0,data:{count:e.length,checkpoints:[...e]}}}function Ua(e){return e.length>0?e.join(`, `):`(none)`}function Wa(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: ${Va(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${Ua(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${Ua(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
60
+ `),success:!0,data:{inspection:e}}}function Ga(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
61
+ `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function Ka(e){return{message:[`Rolled back code through ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Removed checkpoints: ${e.removedCheckpointCount}`].join(`
62
+ `),success:!0,data:{target:e.target,restoredCheckpointCount:e.restoredCheckpointCount,restoredFileCount:e.restoredFileCount,removedCheckpointCount:e.removedCheckpointCount}}}function qa(e){return{message:e instanceof Error?e.message:String(e),success:!1}}function Ja(e,t){if(!t)return Y();try{return Wa(et(e,t))}catch(e){return qa(e instanceof Error?e:String(e))}}async function Ya(e,t){if(!t)return Y();try{return Ga(await jt(e,t))}catch(e){return qa(e instanceof Error?e:String(e))}}async function Xa(e,t){if(!t)return Y();try{return Ka(await Mt(e,t))}catch(e){return qa(e instanceof Error?e:String(e))}}async function Za(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`;return r===`list`?Ha(ct(e)):r===`inspect`?Ja(e,n[1]):r===`restore`||r===`code`?Ya(e,n[1]):r===`rollback`?Xa(e,n[1]):Y()}function Qa(){return{name:`rewind`,displayName:`Rewind History`,description:he,source:`rewind`,argumentHint:me,modelInvocable:!1,safety:`write`,subcommands:Oe()}}function $a(){let e=Qa();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:Za}}var eo=class{name=`rewind`;getCommands(){return[Qa()]}};function to(){return{name:`agent-command-rewind`,commandSources:[new eo],systemCommands:[$a()]}}const no={s:1e3,m:6e4,h:36e5,d:864e5},X=`Usage: /schedule in <N><s|m|h|d> <instruction> | /schedule cron "<expr>" <instruction>`;function ro(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)*no[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+(.+)$/.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 io(e,t){return`${e}: ${t.slice(0,48)}${t.length>48?`…`:``}`}async function ao(e,t,n=Date.now()){let r=ro(t,n);if(!r.ok)return{message:r.error,success:!1};let{cronExpression:i,instruction:a,recurring:o}=r.spec,s=await e.spawnScheduledWake({label:io(`Scheduled`,a),cronExpression:i,agentInstruction:a});return{message:`Scheduled wake (${o?`cron \`${i}\``:`once at ${i}`}): "${a}" — task ${s.id}.`,success:!0,data:{taskId:s.id,cronExpression:i,recurring:o}}}function oo(e){let t=/^["']([^"']+)["']\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 so(e,t){let n=oo(t);if(!n)return{message:`Usage: /monitor "<command>" "<pattern>" <instruction>`,success:!1};let r=await e.spawnMonitorWake({label:io(`Monitor`,n.instruction),command:n.command,matchPattern:n.matchPattern,agentInstruction:n.instruction});return{message:`Monitoring \`${n.command}\` for /${n.matchPattern}/ — task ${r.id}.`,success:!0,data:{taskId:r.id,matchPattern:n.matchPattern}}}function co(e){let t=e.getAgentJobCapability?.();if(!t)throw Error(`Scheduling requires an active agent runtime.`);return t}function lo(){return{name:`schedule`,displayName:`Schedule Wake`,description:`Schedule the agent to wake and run an instruction on a timer (one-shot or cron).`,source:`schedule`,argumentHint:`in <N><s|m|h|d> <instruction> | cron "<expr>" <instruction>`,modelInvocable:!0}}function uo(){return{name:`monitor`,displayName:`Monitor Process`,description:`Watch a process’s output and wake the agent when a line matches a pattern.`,source:`schedule`,argumentHint:`"<command>" "<pattern>" <instruction>`,modelInvocable:!0}}function fo(){let e=lo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>ao(co(e),t)}}function po(){let e=uo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,lifecycle:`inline`,execute:(e,t)=>so(co(e),t)}}var mo=class{name=`schedule`;getCommands(){return[lo(),uo()]}};function ho(){return{name:`agent-command-schedule`,commandSources:[new mo],systemCommands:[fo(),po()],sessionRequirements:[`agent-runtime`]}}function go(e,t,n){return Kt(e,t,n)}function Z(e){return e<.01?`$${e.toFixed(4)}`:e<1?`$${e.toFixed(3)}`:`$${e.toFixed(2)}`}function _o(e){return e.toLocaleString(`en-US`)}const vo=`Conversation cleared.`;async function yo(e,t){let n=e.getUserInteraction?.();return n&&!v(await n.ask(h(`clear`,`Clear conversation history?`)))?{success:!0,message:`Clear cancelled.`}:(Ne(e),{success:!0,message:vo,effects:[{type:`conversation-history-cleared`}]})}function bo(e,t){let n=ht(t);return n===void 0?{success:!1,message:fe}:{success:!0,message:`Session renamed to "${n}".`,data:{name:n},effects:[Ve(n)]}}function xo(e,t){return{success:!0,message:`Opening session picker...`,data:{triggerResumePicker:!0},effects:[Be()]}}const So=`.robota/budget.json`;function Co(e){let t=x(e,So);if(!Yt(t))return;let n;try{n=Qt(t,`utf-8`)}catch{return}try{return JSON.parse(n)}catch{return}}function wo(e,t){Xt(x(e,`.robota`),{recursive:!0}),b(x(e,So),JSON.stringify(t,null,2))}function To(e){let t=x(e,So);Yt(t)&&b(t,`{}`)}function Eo(e){let t=e.getSession(),n=St(e),r=t.getSessionTokenUsage?.(),i=t.getModelId?.(),a=[`Session: ${n.sessionId}`,`Messages: ${n.messageCount}`],o={sessionId:n.sessionId,messageCount:n.messageCount};if(r){if(a.push(`Tokens: ${_o(r.inputTokens)} input / ${_o(r.outputTokens)} output`),o.inputTokens=r.inputTokens,o.outputTokens=r.outputTokens,i){let t=go(i,r.inputTokens,r.outputTokens);if(t!==void 0){a.push(`Cost: ${Z(t)} (${i})`),o.estimatedCostUsd=t;let n=Co(e.getCwd());if(n?.monthly){let e=n.monthly-t,r=Math.min(100,Math.round(t/n.monthly*100));a.push(`Budget: ${Z(e)} remaining of ${Z(n.monthly)}/mo (${r}% used)`),o.budgetMonthly=n.monthly,o.budgetRemainingUsd=e}}}}else a.push(`Tokens: not yet available (no turns completed)`);return{lines:a,data:o}}function Do(e,t){let n=t.trim();if(n.startsWith(`budget`)){let t=n.slice(6).trim();if(t===`clear`)return To(e.getCwd()),{success:!0,message:`Monthly budget cleared.`};if(t===``){let t=Co(e.getCwd());return t?.monthly?{success:!0,message:`Monthly budget: ${Z(t.monthly)}`}:{success:!0,message:`No budget set. Use: /cost budget <amount>`}}let r=parseFloat(t);return!Number.isFinite(r)||r<=0?{success:!1,message:`Usage: /cost budget <amount> (e.g. /cost budget 5.00)`}:(wo(e.getCwd(),{monthly:r}),{success:!0,message:`Monthly budget set to ${Z(r)}.`})}let{lines:r,data:i}=Eo(e);return{success:!0,message:r.join(`
63
+ `),data:i}}function Oo(e,t){let n=Vt(e);return{success:n.validation.ok,message:Je(n),data:{logFile:n.logFile,entryCount:n.entryCount,issueCount:n.validation.issues.length,ok:n.validation.ok}}}function ko(){return{name:`clear`,displayName:`Clear History`,description:i,source:`session`,modelInvocable:!1}}function Ao(){return{name:`rename`,displayName:`Rename Session`,description:de,source:`session`,modelInvocable:!1}}function jo(){return{name:`resume`,displayName:`Resume Session`,description:pe,source:`session`,modelInvocable:!1}}function Mo(){return{name:`cost`,displayName:`Session Cost`,description:a,source:`session`,modelInvocable:!1}}function No(){return{name:`validate-session`,displayName:`Validate Session`,description:ye,source:`session`,modelInvocable:!1}}function Po(){let e=ko();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:yo}}function Fo(){let e=Ao();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:bo}}function Io(){let e=jo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:xo}}function Lo(){let e=Mo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Do}}function Ro(){let e=No();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Oo}}var zo=class{name=`session`;getCommands(){return[ko(),Ao(),jo(),Mo(),No()]}};function Bo(){return{name:`agent-command-session`,commandSources:[new zo],systemCommands:[Po(),Fo(),Io(),Lo(),Ro()]}}function Vo(){return{name:`settings`,displayName:`Settings`,description:`Open transport settings — enable/disable transports and configure options`,source:`settings`,modelInvocable:!1}}function Ho(){let e=Vo();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...`,effects:[{type:`settings-tui-requested`}]})}}var Uo=class{name=`settings`;getCommands(){return[Vo()]}};function Wo(){return{name:`agent-command-settings`,commandSources:[new Uo],systemCommands:[Ho()]}}function Go(){let e=qt();return{command:e.command,interactiveArgs:e.interactiveArgs,commandArgs:t=>e.commandArgs(t)}}const Ko="Drop to an interactive shell (or run `/shell <command>` interactively), then return to the agent.";async function qo(e,t){if(e.canHandoffTerminal?.()!==!0||e.runWithTerminal===void 0)return{message:`An interactive shell is unavailable here (no interactive terminal).`,success:!1};let n=Go(),r=e.getCwd(),i=t.trim(),a=await e.runWithTerminal(async()=>i.length>0?L(n.command,n.commandArgs(i),r):L(n.command,n.interactiveArgs,r));return{message:i.length>0?`Command exited (code ${a}).`:`Shell session ended (code ${a}).`,success:a===0,data:{exitCode:a}}}function Jo(){return{name:`shell`,displayName:`Shell`,description:Ko,source:`shell`,modelInvocable:!1}}function Yo(){let e=Jo();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:qo}}var Xo=class{name=`shell`;getCommands(){return[Jo()]}};function Zo(){return{name:`agent-command-shell`,commandSources:[new Xo],systemCommands:[Yo()]}}const Qo=`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. Slash syntax is a UI input/display concern; the SDK command identity is "skills".`;function $o(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 es(e){let t=e.argumentHint?` ${e.argumentHint}`:``;return`- ${e.name}${t}: ${e.description}${$o(e)}`}function ts(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(`
64
+ `):[`Registered skills:`,...e.map(es),``,`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(`
65
+ `)}function ns(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 rs(e,t=``){let n=ns(t);if(n.action===`activate`&&n.skillName!==void 0){if(!e.executeSkillCommandByName)return{success:!1,message:`Skill activation is not available in this session.`};let t=`/${n.skillName}${n.skillArgs?` ${n.skillArgs}`:``}`;return await e.executeSkillCommandByName(n.skillName,n.skillArgs,{invocationSource:e.getCommandInvocationSource?.()??`user`,displayInput:t,rawInput:t})??{success:!1,message:`Unknown skill: ${n.skillName}`}}let r=e.listSkills?.()??[];return{success:!0,message:ts(r),data:{skills:r,activationContract:{activateWith:`/skills <skill-name> [args]`,activationRequiredBeforeWorkflow:!0,metadataIsNotSkillContent:!0}}}}function is(){return{name:`skills`,displayName:`Skills`,description:Qo,source:`skills`,modelInvocable:!0,userInvocable:!0,argumentHint:`[list | <skill-name> [args]]`,safety:`read-only`}}function as(){let e=is();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,lifecycle:`inline`,execute:rs}}var os=class{name=`skills`;getCommands(){return[is()]}};function ss(e){let t=[new os];return t.push(new ve(e.cwd)),{name:`agent-command-skills`,commandSources:t,systemCommands:[as()]}}const cs=[`Usage: /statusline on | off | reset | git on | git off`,`Fields: model, context, permission mode, message count, session name, thinking state, git branch.`].join(`
66
+ `);function ls(e){let t=e.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[n,r]=t;return n===`on`&&r===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:n===`off`&&r===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:n===`reset`&&r===void 0?{success:!0,message:`Status line settings reset.`,patch:{...s}}:n===`git`&&r===`on`&&t.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:n===`git`&&r===`off`&&t.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:cs}}function us(e,t){let n=ls(t);return n.success?{success:!0,message:n.message,effects:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function ds(){return{name:`statusline`,displayName:`Status Line`,description:_e,source:`statusline`,argumentHint:ge,subcommands:ke(`statusline`),modelInvocable:!1}}function fs(){let e=ds();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:us}}var ps=class{name=`statusline`;getCommands(){return[ds()]}};function ms(){return{name:`agent-command-statusline`,commandSources:[new ps],systemCommands:[fs()]}}const hs=`Inspect Robota user-local storage and memory state.`,gs=`storage list [--format json] | memory set/list/inspect/disable/delete`,Q=`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 _s(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
67
+ `)}function $(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function vs(e,t){let n=await ut({activeRepositoryRoot:e});return{message:t.format===`json`?JSON.stringify(n,null,2):_s(n.items),success:!0,data:{list:n}}}async function ys(e,t){let[n,r,i]=t.positional,a=await It({activeRepositoryRoot:e,category:$(n),key:r??``,value:i??``,summary:t.summary??``,source:t.source??``});return{message:`Stored user-local memory item ${a.category}/${a.key} at ${a.storageLocation}`,success:!0,data:{item:a}}}async function bs(e,t){let[n,r]=t.positional,i=await tt({activeRepositoryRoot:e,category:$(n),key:r??``});return{message:t.format===`json`?JSON.stringify(i,null,2):`${i.category}/${i.key}: ${i.summary}`,success:!0,data:{item:i}}}async function xs(e,t){let[n,r]=t.positional,i=await We({activeRepositoryRoot:e,category:$(n),key:r??``});return{message:`Disabled user-local memory item ${i.category}/${i.key}`,success:!0,data:{item:i}}}async function Ss(e,t){let[n,r]=t.positional,i=await Ue({activeRepositoryRoot:e,category:$(n),key:r??``});return{message:`Deleted user-local memory item ${i.category}/${i.key}`,success:!0,data:{result:i}}}async function Cs(e,t){return(t.action??`list`)===`list`?vs(e,t):t.action===`set`?ys(e,t):t.action===`inspect`?bs(e,t):t.action===`disable`?xs(e,t):t.action===`delete`?Ss(e,t):{message:Q,success:!1}}function ws(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Ts(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 Es(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=Ts(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:ws(n),summary:r,source:i}}function Ds(e){return e.trim().split(/\s+/).filter(Boolean)}function Os(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
68
+ `)}async function ks(e,t){if((t.action??`list`)!==`list`)return{message:Q,success:!1};let n=await nt({activeRepositoryRoot:e});return{message:t.format===`json`?JSON.stringify(n,null,2):Os(n.root,n.categories),success:!0,data:{root:n.root,categories:n.categories,inspection:n}}}async function As(e,t){return t.target===`storage`?ks(e,t):t.target===`memory`?Cs(e,t):{message:Q,success:!1}}function js(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Ms(e){try{return await As(e.cwd,Es(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:js(e instanceof Error?e.message:String(e)),success:!1}}}async function Ns(e,t){try{return await As(e.getCwd(),Es(Ds(t)))}catch(e){return{message:js(e instanceof Error?e.message:String(e)),success:!1}}}function Ps(){return{name:`user-local`,displayName:`User Config`,description:hs,source:`user-local`,argumentHint:gs,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 Fs(){let e=Ps();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:Ns}}var Is=class{name=`user-local`;getCommands(){return[Ps()]}};function Ls(){return{name:`agent-command-user-local`,commandSources:[new Is],systemCommands:[Fs()]}}function Rs(e,t,n){let r=e;if(t!==void 0){let e=new Set(t);r=r.filter(t=>e.has(t.name))}if(n!==void 0){let e=new Set(n);r=r.filter(t=>!e.has(t.name))}return r}function zs({cwd:e,providerDefinitions:t,providerSettingsAdapter:n,enabledCommandModules:r,disabledCommandModules:i}){return Rs([ss({cwd:e}),Er(),Nn(),ti(),Xr(),ki(),jr(),Rn(),Sr(),Zo(),fr(),Wr(),Ls(),Un(),or(),gr(),Bo(),Ba(),to(),ho(),ms(),vi(),Wo(),Aa({providerDefinitions:t,settings:n})],r,i)}function Bs(e){let t=tn(),i=x(t,`.robota`,`plugins`),a=x(t,`.robota`,`settings.json`),o=(e,t)=>rn(e,{timeout:t.timeout,stdio:t.stdio??`pipe`}),s=new ce(a),c=new d({pluginsDir:i,exec:o});return{cwd:e,marketplace:c,installer:new n({pluginsDir:i,settingsStore:s,marketplaceClient:c,exec:o}),loader:new r(i),settingsStore:s}}async function Vs(e){let t=await e.loader.loadAll(),n=e.settingsStore.getEnabledPlugins();return t.map(e=>{let t=e.pluginDir.split(`/`),r=t.indexOf(`cache`),i=r>=0?t[r+1]??``:``,a=i?`${e.manifest.name}@${i}`:e.manifest.name;return{name:a,description:e.manifest.description,enabled:n[a]!==!1&&n[e.manifest.name]!==!1}})}async function Hs(e,t){let n;try{n=e.marketplace.fetchManifest(t)}catch{return[]}let r=e.installer.getInstalledPlugins(),i=new Set(Object.values(r).map(e=>e.pluginName));return n.plugins.map(e=>({name:e.name,description:e.description,installed:i.has(e.name)}))}async function Us(e,t,r){let[i,a]=t.split(`@`);if(!i||!a)throw Error(`Plugin ID must be in format: name@marketplace`);if(r===`project`){await new n({pluginsDir:x(e.cwd,`.robota`,`plugins`),settingsStore:e.settingsStore,marketplaceClient:e.marketplace,exec:(e,t)=>rn(e,{timeout:t.timeout,stdio:t.stdio??`pipe`})}).install(i,a);return}await e.installer.install(i,a)}async function Ws(e,t){let n=e.installer.getPluginsByMarketplace(t);for(let t of n)await e.installer.uninstall(`${t.pluginName}@${t.marketplace}`);e.marketplace.removeMarketplace(t)}function Gs(e){return e.marketplace.listMarketplaces().map(e=>({name:e.name,type:e.source.type}))}function Ks(e){let t=Bs(e);return{listInstalled:()=>Vs(t),listAvailablePlugins:e=>Hs(t,e),install:(e,n)=>Us(t,e,n),uninstall:async e=>t.installer.uninstall(e),enable:async e=>t.installer.enable(e),disable:async e=>t.installer.disable(e),marketplaceAdd:async e=>e.includes(`/`)&&!e.includes(`:`)?t.marketplace.addMarketplace({type:`github`,repo:e}):t.marketplace.addMarketplace({type:`git`,url:e}),marketplaceRemove:e=>Ws(t,e),marketplaceUpdate:async e=>t.marketplace.updateMarketplace(e),marketplaceList:async()=>Gs(t),reloadPlugins:async()=>({loadedPluginCount:(await t.loader.loadAll()).length})}}const qs=`plugin`;function Js(){return process.env.HOME??tn()}function Ys(e){let t=new r(x(Js(),`.robota`,`plugins`));try{let n=t.loadPluginsSync();return n.length===0?(e.replaceSource(qs),0):(e.replaceSource(qs,new se(n)),n.length)}catch{return e.replaceSource(qs),0}}export{Mn as AgentCommandSource,Ln as BackgroundCommandSource,vo as CLEAR_COMMAND_MESSAGE,Hn as CompactCommandSource,ar as ContextCommandSource,cr as EDITOR_COMMAND_DESCRIPTION,dr as EditorCommandSource,hr as ExitCommandSource,_r as GOAL_COMMAND_DESCRIPTION,xr as GoalCommandSource,Tr as HelpCommandSource,Ar as LanguageCommandSource,Ur as MemoryCommandSource,Yr as ModeCommandSource,ei as PermissionsCommandSource,_i as PluginManagerCommandSource,Oi as PresetCommandSource,Oa as ProviderCommandSource,eo as RewindCommandSource,Ko as SHELL_COMMAND_DESCRIPTION,Qo as SKILLS_COMMAND_DESCRIPTION,cs as STATUSLINE_USAGE,mo as ScheduleCommandSource,zo as SessionCommandSource,Uo as SettingsCommandSource,Xo as ShellCommandSource,os as SkillsCommandSource,ps as StatusLineCommandSource,gs as USER_LOCAL_COMMAND_ARGUMENT_HINT,hs as USER_LOCAL_COMMAND_DESCRIPTION,Q as USER_LOCAL_COMMAND_USAGE,Is as UserLocalCommandSource,E as createAgentCommandEntry,Nn as createAgentCommandModule,jn as createAgentSystemCommand,D as createBackgroundCommandEntry,Rn as createBackgroundCommandModule,ko as createClearCommandEntry,O as createCompactCommandEntry,Un as createCompactCommandModule,I as createContextCommandEntry,or as createContextCommandModule,Mo as createCostCommandEntry,zs as createDefaultCommandModules,Ks as createDefaultPluginCommandAdapter,R as createEditorCommandEntry,fr as createEditorCommandModule,z as createExitCommandEntry,gr as createExitCommandModule,B as createGoalCommandEntry,Sr as createGoalCommandModule,V as createHelpCommandEntry,Er as createHelpCommandModule,H as createLanguageCommandEntry,jr as createLanguageCommandModule,Vr as createMemoryCommandEntry,Wr as createMemoryCommandModule,qr as createModeCommandEntry,Xr as createModeCommandModule,uo as createMonitorCommandEntry,Qr as createPermissionsCommandEntry,ti as createPermissionsCommandModule,pi as createPluginCommandEntry,vi as createPluginCommandModule,Ei as createPresetCommandEntry,ki as createPresetCommandModule,Da as createProviderCommandEntry,Aa as createProviderCommandModule,q as createProviderSetupFlow,mi as createReloadPluginsCommandEntry,Ao as createRenameCommandEntry,La as createResetCommandEntry,Ba as createResetCommandModule,jo as createResumeCommandEntry,to as createRewindCommandModule,lo as createScheduleCommandEntry,ho as createScheduleCommandModule,Bo as createSessionCommandModule,Vo as createSettingsCommandEntry,Wo as createSettingsCommandModule,Jo as createShellCommandEntry,Zo as createShellCommandModule,is as createSkillsCommandEntry,ss as createSkillsCommandModule,ds as createStatusLineCommandEntry,ms as createStatusLineCommandModule,Ps as createUserLocalCommandEntry,Ls as createUserLocalCommandModule,No as createValidateSessionCommandEntry,Na as ensureProviderConfig,Dn as executeAgentCommand,Fn as executeBackgroundCommand,yo as executeClearCommand,Bn as executeCompactCommand,Gn as executeContextCommand,Do as executeCostCommand,lr as executeEditorCommand,pr as executeExitCommand,yr as executeGoalCommand,Cr as executeHelpCommand,Or as executeLanguageCommand,Br as executeMemoryCommand,Kr as executeModeCommand,so as executeMonitorCommand,Zr as executePermissionsCommand,di as executePluginCommand,wi as executePresetCommand,ba as executeProviderCommand,fi as executeReloadPluginsCommand,bo as executeRenameCommand,Ia as executeResetCommand,xo as executeResumeCommand,Za as executeRewindCommand,ao as executeScheduleCommand,qo as executeShellCommand,rs as executeSkillsCommand,us as executeStatusLineCommand,Ns as executeUserLocalCommand,Ms as executeUserLocalDirectCommand,Oo as executeValidateSessionCommand,Ii as formatProviderSetupChoiceLabel,Li as formatProviderSetupHelpLinks,Pi as formatProviderSetupPromptLabel,Ai as formatProviderSetupSelectionPrompt,J as getProviderSetupStep,ro as parseScheduleSpec,Ys as reloadPluginCommandSource,sr as resolveEditor,ji as resolveProviderSetupSelection,Go as resolveShell,Ni as runProviderSetupPromptFlow,Ma as runProviderStartupSetup,L as spawnInherited,Mi as submitProviderSetupValue,zi as validateProviderSetupValue};
64
69
  //# sourceMappingURL=index.js.map