@robota-sdk/agent-command 3.0.0-beta.88 → 3.0.0-beta.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/dist/node/index.cjs +4 -4
- package/dist/node/index.d.cts +6 -1
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.ts +6 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +4 -4
- package/dist/node/index.js.map +1 -1
- package/package.json +7 -7
- package/src/default/__tests__/provider-environment-forwarding.test.ts +98 -0
- package/src/default/default-command-modules.ts +8 -0
- package/src/model/__tests__/model-command.test.ts +25 -0
- package/src/model/model-command.ts +1 -0
- package/src/provider/__tests__/provider-command-module.test.ts +77 -0
- package/src/provider/provider-command-profile-operations.ts +5 -1
- package/src/provider/provider-command-setup.ts +1 -0
- package/src/provider/provider-startup.ts +2 -2
package/dist/node/index.js
CHANGED
|
@@ -47,7 +47,7 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
|
|
|
47
47
|
`),success:!0,data:{indexPath:t.indexPath,topicsPath:t.topicsPath,topicCount:t.topics.length}}}async function ks(e,t){if(!t||t===`index`){let t=await e.loadStartupMemory();return{message:t.content||`(empty memory index)`,success:!0,data:{path:t.path,lineCount:t.lineCount,truncated:t.truncated}}}return{message:await e.readTopic(t)||`(empty memory topic: ${t})`,success:!0,data:{topic:t}}}function As(e){let t=e[1],n=e[2],r=e.slice(3).join(` `).trim();if(!(!t||!ut(t)||!n||r.length===0))return{type:t,topic:n,text:r}}async function js(e){let t=await e.listPending(`pending`);return{message:[`Pending memory candidates:`,...t.length>0?t.map(e=>`- ${e.id} ${e.type}/${e.topic} confidence=${e.confidence}: ${e.text}`):[`(no pending memory candidates)`]].join(`
|
|
48
48
|
`),success:!0,data:{count:t.length}}}function Ms(e,t){Lt(e,t)}async function Ns(e,t,n){if(!n)return z();try{let{record:r,saved:i}=await ye(t,n);return Ms(e,{type:`memory_candidate_approved`,candidateId:r.id,topic:r.topic,reason:`approved-by-user`}),Ms(e,{type:`memory_candidate_saved`,candidateId:r.id,topic:r.topic,reason:i.deduplicated?`deduplicated`:`approved-and-saved`}),{message:i.deduplicated?`Saved memory candidate ${n} was already present in ${i.topicPath}`:`Saved memory candidate ${n} to ${i.topicPath}`,success:!0,data:{id:n,status:r.status,topic:i.topic,topicPath:i.topicPath,deduplicated:i.deduplicated}}}catch(e){return B(e instanceof Error?e:String(e))}}async function Ps(e,t,n){if(!n)return z();try{let r=await t.markPending(n,`rejected`,`rejected-by-user`);return Ms(e,{type:`memory_candidate_rejected`,candidateId:r.id,topic:r.topic,reason:`rejected-by-user`}),{message:`Rejected memory candidate ${n}`,success:!0,data:{id:n,status:r.status}}}catch(e){return B(e instanceof Error?e:String(e))}}function Fs(e){let t=vt(e);return{message:[`Used memory references:`,...t.length>0?t.map(e=>{let t=e.truncated?` truncated=true`:``;return`- ${e.topic} score=${e.score}${t}: ${e.path}`}):[`(no memory used in current turn)`]].join(`
|
|
49
49
|
`),success:!0,data:{count:t.length,references:[...t]}}}function Is(e){return((e.getCommandHostAdapters?.().permissionMode)?.getPermissionMode()??e.getSession?.().getPermissionMode())===`plan`}async function Ls(e,t){let n=t.trim().split(/\s+/).filter(Boolean),r=n[0]??`list`,i=e.getCommandInvocationSource();if((r===`correct`||r===`forget`)&&i!==`user`&&i!==`remote`)return{success:!1,message:`Memory correction and forgetting: only the user can run /memory correct or /memory forget.`};let a=Ds(e);if(!a.ok)return a.result;let o=a.store;if(r===`correct`||r===`forget`)try{if(r===`correct`){let e=As(n);if(!e)return z();if(rt(e.text))return{success:!1,message:`Refusing to save sensitive memory content.`};if(!o.replaceTopic)return{success:!1,message:`This memory backend does not support topic correction.`};let t=await o.replaceTopic(e);return{success:!0,message:`Replaced all active memory in ${t.topicPath}. Automatic additions to this topic now require user correction. Historical transcripts and backups remain.`,data:{...t}}}if(!n[1]||n.length!==2)return z();if(!o.forgetTopic)return{success:!1,message:`This memory backend does not support forgetting topics.`};let e=await o.forgetTopic(n[1]);return{success:!0,message:`Forgot active memory topic ${e.topic}. Source topic removed; automatic restoration is blocked. Historical transcripts and backups remain.`,data:{...e}}}catch(e){return B(e instanceof Error?e:String(e))}if(r===`list`)return Os(o);if(r===`show`)return ks(o,n[1]);if(r===`pending`)return js(o);if(r===`approve`)return Ns(e,o,n[1]);if(r===`reject`)return Ps(e,o,n[1]);if(r===`used`)return Fs(e);if(r===`add`){if(e.getCommandInvocationSource()===`model`&&Is(e))return{message:`Plan mode saves no memory. Save it after plan mode ends.`,success:!1};let t=As(n);if(!t)return z();if(rt(t.text))return{message:`Refusing to save sensitive memory content.`,success:!1};let r;try{r=await o.append(t)}catch(e){return B(e instanceof Error?e:String(e))}return{message:r.deduplicated?`${t.type} memory already exists in ${r.topicPath}`:`Saved ${t.type} memory to ${r.topicPath}`,success:!0,data:{indexPath:r.indexPath,topicPath:r.topicPath,topic:r.topic,deduplicated:r.deduplicated}}}return z()}function Rs(){return{name:`memory`,displayName:`Memory`,description:h,modelDescription:"Read and write this project’s durable memory. Use `list` or `show [topic]` to look up stored conventions, preferences or references before asking the user again; `add <type> <topic> <text>` to save a durable preference, project convention, feedback item or reference worth reusing across sessions (never secrets, credentials or transient facts); `pending` to see candidates awaiting the user’s review; `used` to report which memory items informed this turn. Bare lists topics. In plan mode `add` is refused: save after plan mode ends. Returns the requested topics or entries, or a confirmation of what was saved. Approving or rejecting a pending candidate is the user’s review: suggest `/memory approve <id>` or `/memory reject <id>`. Correcting or forgetting saved knowledge is also user-only: suggest `/memory correct <type> <topic> <text>` to replace every entry in a topic or `/memory forget <topic>` to remove it from active recall. These operations block automatic restoration of that topic; historical transcripts and backups remain.",source:`memory`,argumentHint:m,modelInvocable:!0,safety:`write`,subcommands:Se()}}function zs(){let e=Rs();return{name:e.name,displayName:e.displayName,description:e.description,...e.modelDescription===void 0?{}:{modelDescription:e.modelDescription},requiresPermission:!1,userInvocable:!0,modelInvocable:!0,argumentHint:e.argumentHint,safety:e.safety,subcommands:e.subcommands,execute:Ls}}var Bs=class{name=`memory`;getCommands(){return[Rs()]}};function Vs(){return{name:`agent-command-memory`,commandSources:[new Bs],systemCommands:[zs()]}}function Hs(e,t){try{cn(e,t);return}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}}function Us(e,t){let n=Kt(e,Number(t.trim().split(/\s+/)[1]));return n===void 0?{message:`Usage: /permissions retry <n>, where <n> numbers a call blocked by the auto-mode classifier in /permissions.`,success:!1}:{message:`${n.argument===void 0?n.toolName:`${n.toolName}(${n.argument})`} will run once, without the classifier, when the model tries it again.`,success:!0}}function Ws(e,t){let n=Tt(t);if(n===`retry`)return Us(e,t);if(n!==void 0){if(!pt(n))return{message:$e(),success:!1};let t=Hs(e,n);if(t!==void 0)return t;let r=Nt(e);return{message:`Permission mode set to: ${n}\n${Ze(r)}`,success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}let r=Nt(e);return{message:Ze(r),success:!0,data:{mode:r.mode,sessionAllowed:r.sessionAllowed}}}async function Gs(e){let t=e.getUserInteraction();if(!t)return;let n=we().map(e=>({value:e.name,label:e.displayName??e.name,description:e.description})),r=await t.ask(T(`mode`,`Select interaction mode`,n));return r.type===`answer`?r.values[0]:void 0}async function Ks(e,t){let n=Tt(t);if(n===void 0&&(n=await Gs(e),n===void 0)){let t=Mt(e);return{message:`Current mode: ${t}`,success:!0,data:{mode:t}}}if(!pt(n))return{message:$e(),success:!1};let r=Hs(e,n);return r===void 0?{message:`Permission mode set to: ${n}`,success:!0,data:{mode:n}}:r}function qs(){return{name:`mode`,displayName:`Interaction Mode`,description:ee,source:`mode`,argumentHint:y,subcommands:we(`mode`),modelInvocable:!1}}function Js(){let e=qs();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Ks}}var Ys=class{name=`mode`;getCommands(){return[qs()]}};function Xs(){return{name:`agent-command-mode`,commandSources:[new Ys],systemCommands:[Js()]}}function Zs(e,t){return e.getSession().getModelId()??t?.model??``}function Qs(e,t,n,r){let i=t.currentProvider===void 0?void 0:t.providers?.[t.currentProvider];return Ce(t.providers,t.currentProvider,Zs(e,i),n.providerDefinitions,r?n.orgPolicy?.allowedProviders:void 0)}async function $s(e,t,n){let r=n.settings.readMergedSettings(),i=t.trim();if(i.length===0){let t=Qs(e,r,n,!0);return ec(e.getUserInteraction(),t,e,n)}let a=Ht(Qs(e,r,n,!1),i);return a===void 0?{message:`Unknown model "${i}". Run /model to see the choices.`,success:!1}:a.profileName===r.currentProvider?rc(e,a,r,n):ic(a,r,n)}async function ec(e,t,n,r){if(t.groups.length===0)return{message:`No provider profiles configured. Run /provider add to add one.`,success:!0};if(!e)return{message:tc(t),success:!0};let i=t.groups.flatMap(e=>e.models.map(n=>({value:n.id,label:nc(t,e.profileName,e.providerLabel,n)}))),a=await e.ask(T(`model`,`Select model`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Model selection cancelled.`,success:!0}:$s(n,a.values[0],r)}function tc(e){let t=[];for(let n of e.groups){t.push(`${n.providerLabel} (${n.profileName})`);for(let r of n.models){let i=r.id===e.currentModel&&n.profileName===e.currentProfile?`*`:`-`;t.push(` ${i} ${r.label}`)}}return t.join(`
|
|
50
|
-
`)}function nc(e,t,n,r){let i=r.id===e.currentModel&&t===e.currentProfile?`* `:``,a=e.groups.filter(e=>e.providerLabel===n).length>1?` (${t})`:``;return`${i}${n}: ${r.label}${a}`}async function rc(e,t,n,r){let i=t.profileName;try{await e.getSession().applyModelOptions({model:t.model.id})}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=r.settings.readTargetSettings(),o=n.providers?.[i]??a.providers?.[i]??{};return r.settings.writeTargetSettings(rn(a,i,{...o,model:t.model.id})),{message:`Model: ${t.model.label}`,success:!0}}function ic(e,t,n){let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(e.profileName))return{message:tt(`Provider "${e.profileName}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};let i=t.providers?.[e.profileName];if(i===void 0)return{message:`Provider profile "${e.profileName}" was not found.`,success:!1};let a={...i,model:e.model.id};try{on(e.profileName,a,{providerDefinitions:n.providerDefinitions})}catch(t){return{message:`Could not switch to "${e.model.label}": ${t instanceof Error?t.message:String(t)}`,success:!1}}let o=n.settings.readTargetSettings(),s=n.settings.readMergedSettings(),c=rn(o,e.profileName,a),l=o.providers?.[e.profileName]!==void 0||s.providers?.[e.profileName]!==void 0?{...c,currentProvider:e.profileName}:Zt(c,e.profileName);return n.settings.writeTargetSettings(l),{message:`Model: ${e.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profileName}]}}function ac(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function oc(e){let t=ac();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,lifecycle:`inline`,execute:(t,n)=>$s(t,n,e)}}var sc=class{name=`model`;getCommands(){return[ac()]}};function cc(e){return{name:`agent-command-model`,commandSources:[new sc],systemCommands:[oc(e)]}}const V=[{mode:`auto-allow`,description:`Confine shell commands; confined ones run without a prompt`},{mode:`regular`,description:`Confine shell commands; prompts work as usual`},{mode:`off`,description:`Run shell commands on this machine, unconfined`}];function lc(e){return V.some(t=>t.mode===e)}function uc(e){let t=[`Sandbox: ${e.mode}${e.backend===void 0?``:` (${e.backend})`}`];return e.unavailable!==void 0&&t.push(e.mode===`off`?`Not available here: ${e.unavailable}.`:`Cannot run here: ${e.unavailable}. Commands run unconfined.`),e.mode!==`off`&&e.unavailable===void 0&&(t.push(`Writes are limited to the workspace and temp directories; settings and git hooks stay read-only.`,`Network: ${e.network?`allowed`:`blocked`}.`),e.excludedCommands.length>0&&t.push(`Run unconfined: ${e.excludedCommands.join(`, `)}.`)),t.join(`
|
|
50
|
+
`)}function nc(e,t,n,r){let i=r.id===e.currentModel&&t===e.currentProfile?`* `:``,a=e.groups.filter(e=>e.providerLabel===n).length>1?` (${t})`:``;return`${i}${n}: ${r.label}${a}`}async function rc(e,t,n,r){let i=t.profileName;try{await e.getSession().applyModelOptions({model:t.model.id})}catch(e){return{message:`Could not switch to "${t.model.label}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=r.settings.readTargetSettings(),o=n.providers?.[i]??a.providers?.[i]??{};return r.settings.writeTargetSettings(rn(a,i,{...o,model:t.model.id})),{message:`Model: ${t.model.label}`,success:!0}}function ic(e,t,n){let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(e.profileName))return{message:tt(`Provider "${e.profileName}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};let i=t.providers?.[e.profileName];if(i===void 0)return{message:`Provider profile "${e.profileName}" was not found.`,success:!1};let a={...i,model:e.model.id};try{on(e.profileName,a,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}})}catch(t){return{message:`Could not switch to "${e.model.label}": ${t instanceof Error?t.message:String(t)}`,success:!1}}let o=n.settings.readTargetSettings(),s=n.settings.readMergedSettings(),c=rn(o,e.profileName,a),l=o.providers?.[e.profileName]!==void 0||s.providers?.[e.profileName]!==void 0?{...c,currentProvider:e.profileName}:Zt(c,e.profileName);return n.settings.writeTargetSettings(l),{message:`Model: ${e.model.label}`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profileName}]}}function ac(){return{name:`model`,displayName:`Model`,description:`Show/change the model`,source:`model`,argumentHint:`[<id>]`,example:`/model claude-sonnet-4-6`,modelInvocable:!1}}function oc(e){let t=ac();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,lifecycle:`inline`,execute:(t,n)=>$s(t,n,e)}}var sc=class{name=`model`;getCommands(){return[ac()]}};function cc(e){return{name:`agent-command-model`,commandSources:[new sc],systemCommands:[oc(e)]}}const V=[{mode:`auto-allow`,description:`Confine shell commands; confined ones run without a prompt`},{mode:`regular`,description:`Confine shell commands; prompts work as usual`},{mode:`off`,description:`Run shell commands on this machine, unconfined`}];function lc(e){return V.some(t=>t.mode===e)}function uc(e){let t=[`Sandbox: ${e.mode}${e.backend===void 0?``:` (${e.backend})`}`];return e.unavailable!==void 0&&t.push(e.mode===`off`?`Not available here: ${e.unavailable}.`:`Cannot run here: ${e.unavailable}. Commands run unconfined.`),e.mode!==`off`&&e.unavailable===void 0&&(t.push(`Writes are limited to the workspace and temp directories; settings and git hooks stay read-only.`,`Network: ${e.network?`allowed`:`blocked`}.`),e.excludedCommands.length>0&&t.push(`Run unconfined: ${e.excludedCommands.join(`, `)}.`)),t.join(`
|
|
51
51
|
`)}async function dc(e,t){let n=e.getUserInteraction();if(!n)return;let r=V.map(({mode:e,description:n})=>({value:e,label:e===t?`${e} (current)`:e,description:n})),i=await n.ask(T(`sandbox`,`Sandbox mode`,r));return i.type===`answer`?i.values[0]:void 0}async function fc(e,t){let n=e.getCommandHostAdapters?.().sandbox;if(n===void 0)return{message:`This host has no OS sandbox.`,success:!1};let r=n.status(),i=t.trim().split(/\s+/)[0]||await dc(e,r.mode);if(i===void 0||i===``)return{message:uc(r),success:!0,data:{...r}};if(!lc(i))return{message:`Unknown sandbox mode "${i}". Valid: ${V.map(e=>e.mode).join(` | `)}`,success:!1};n.setMode(i);let a=n.status();return{message:`Sandbox mode set to: ${i}\n${uc(a)}`,success:!0,data:{...a}}}const pc=V.map(e=>e.mode).join(` | `);function mc(){return{name:`sandbox`,displayName:`Sandbox`,description:`Show or change how shell commands are confined`,source:`sandbox`,argumentHint:pc,subcommands:V.map(({mode:e,description:t})=>({name:e,description:t,source:`sandbox`})),modelInvocable:!1}}function hc(){let e=mc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:fc}}var gc=class{name=`sandbox`;getCommands(){return[mc()]}};function _c(){return{name:`agent-command-sandbox`,commandSources:[new gc],systemCommands:[hc()]}}function vc(e){return e.getCommandHostAdapters?.().outputStyleRegistry}function yc(e,t){return[`Available output styles:`,...t.listOutputStyles().map(t=>{let n=t.id===e?`* `:` `,r=t.tokenCost?` [input cost: ${t.tokenCost}]`:``;return`${n}${t.id} — ${t.name}: ${t.description}${r}`})].join(`
|
|
52
52
|
`)}function bc(e,t){let n=e.getActiveOutputStyleId(),r=t.listOutputStyles();return{success:!0,message:yc(n,t),data:{outputStyles:r,active:n}}}async function xc(e,t){let n=e.getUserInteraction();if(!n)return;let r=t.listOutputStyles().map(e=>({value:e.id,label:e.id,description:e.description})),i=await n.ask(T(`output-style`,`Select an output style`,r));return i.type===`answer`?i.values[0]:void 0}async function Sc(e,t){let n=vc(e);if(!n)return{success:!1,message:`Output styles are not available in this environment.`};let r=t.trim();if(r===`list`||!r&&(r=await xc(e,n)??``,!r))return bc(e,n);let i=n.getOutputStyle(r);return i?{success:!0,message:`Switching output style to ${i.name}...`,data:{outputStyle:i.id},hostActions:[{type:`output-style-change`,styleId:i.id}]}:{success:!1,message:`Unknown output style "${r}". Available: ${n.listOutputStyles().map(e=>e.id).join(`, `)||`(none)`}`}}function Cc(){return{name:`output-style`,displayName:`Output Style`,description:`List or switch the active provider-neutral response style`,argumentHint:`list | <style-id>`,source:`output-style`,userInvocable:!0,modelInvocable:!1}}function wc(){let e=Cc();return{name:e.name,displayName:e.displayName,description:e.description,argumentHint:e.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:Sc}}var Tc=class{name=`output-style`;getCommands(){return[Cc()]}};function Ec(){return{name:`agent-command-output-style`,commandSources:[new Tc],systemCommands:[wc()]}}const Dc=/^[a-zA-Z0-9_-]{1,64}$/u;function Oc(e){let t=Object.entries(e).filter(([,e])=>(e??0)>0);return t.length===0?`none`:t.map(([e,t])=>`${e} ${t}`).join(`, `)}function kc(e){let{counters:t}=e;return` ${e.grantId} ${e.principal} ${e.state} accepted ${t.accepted}; refused: ${Oc(t.refused)}; settled: ${Oc(t.settled)}`}async function Ac(e,t=``){let n=e.getCommandHostAdapters?.().externalEvents;if(!n)return{message:`This session holds no external event grant. Grants are given only when a session starts.`,success:!0};let[r,i,a]=t.trim().split(/\s+/u).filter(e=>e!==``);if(r===void 0){let e=n.list();return{message:e.length===0?`This session holds no external event grant.`:`External event grants:\n${e.map(kc).join(`
|
|
53
53
|
`)}\n\nWithdraw one: /events revoke <grant-id>`,success:!0}}return r!==`revoke`||i===void 0||a!==void 0||!Dc.test(i)?{message:`Usage: /events | /events revoke <grant-id>`,success:!1}:n.revoke(i)===`revoked`?{message:`Revoked external event grant ${i}. Later events for it are refused.`,success:!0}:{message:`This session holds no external event grant ${i}.`,success:!1}}function jc(){return{name:`events`,displayName:`Events`,description:"List this session's external event grants (each grant's label, whether it pins a subject or a client, whether it is open or revoked, and its counts of accepted, refused and settled events), or revoke one with `/events revoke <grant-id>`. Returns the grants, or whether the revocation took effect. User-only: the model cannot run it; when the user wants to stop events from outside, suggest `/events revoke <grant-id>`.",source:`events`,argumentHint:`[revoke <grant-id>]`,modelInvocable:!1}}function Mc(){let e=jc();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,...e.argumentHint===void 0?{}:{argumentHint:e.argumentHint},lifecycle:`inline`,execute:(e,t)=>Ac(e,t)}}var Nc=class{name=`events`;getCommands(){return[jc()]}};function Pc(){return{name:`agent-command-events`,commandSources:[new Nc],systemCommands:[Mc()]}}function Fc(e){return e.liveness!==`dead`}function Ic(e,t){let n=e.sessionId===t?` (this session)`:``,r=e.liveness===`unknown`?` liveness unknown`:``,i=e.status===`needs-input`?`needs input`:e.status??`unknown`;return` ${e.sessionId}${e.name?` ${e.name}`:``} status ${i}${n?``:Rc(e)}${r}${n}`}function Lc(e){let t=e.locality===`same-host`?`on this machine`:`on another machine`;return` ${e.deviceId}${e.name?` ${e.name}`:``} ${t}`}function Rc(e){if(e.workspaceClaim===`mismatched`)return` workspace claim mismatched, not believed`;switch(e.workspaceRelation){case void 0:return``;case`unknown`:return` workspace unknown`;default:return` ${e.workspaceRelation.replace(`-`,` `)}`}}function zc(e){let t=e.trim(),n=t.search(/\s/);if(n===-1)return;let r=t.slice(n).trim();if(r!==``)return{target:t.slice(0,n),text:r}}function Bc(e,t){let n=e.reason===void 0?``:` ${e.reason}`;switch(e.state){case`acknowledged`:case`delivered`:return{message:`Delivered to ${t}.`,success:!0};case`pending`:return{message:`${t} has the message; it is waiting behind work already running there.`,success:!0};case`duplicate`:return{message:`${t} had already seen that message.`,success:!0};default:return{message:`Not delivered to ${t}.${n}`,success:!1}}}async function Vc(e,t){if(e.send===void 0)return{message:`This environment can discover other sessions but cannot address them.`,success:!1};let n=zc(t);return n===void 0?{message:`Usage: /peers send <session-id> <message>. Run /peers for the session ids.`,success:!1}:Bc(await e.send(n.target,n.text),n.target)}async function Hc(e,t,n){if(e.prepareFile===void 0)return{message:`This environment cannot send files to other sessions.`,success:!1};let r=zc(t);if(r===void 0)return{message:`Usage: /peers send-file <session-id> <path>. Run /peers for the session ids.`,success:!1};let i=await e.prepareFile(r.target,r.text,{origin:`operator`,cwd:n});if(!i.ok)return{message:`Not sent: ${i.reason}`,success:!1};let{file:a}=i,o=await a.send();if(o.state===`delivered`||o.state===`acknowledged`)return{message:`Sent ${a.path} to ${r.target}: ${a.size} bytes, sha256 ${a.sha256}.`,success:!0};let s=o.reason===void 0?``:` ${o.reason}`;return{message:`${a.path} was not sent to ${r.target}.${s}`,success:!1}}async function Uc(e,t=``){let n=e.getCommandHostAdapters?.().localPeers;if(!n)return{message:`Local peer discovery is not available in this environment.`,success:!0};let r=t.trim(),i=/^send-file(?=\s|$)/.exec(r);if(i!==null)return Hc(n,r.slice(i[0].length),e.getCwd?.()??``);let a=/^send(?=\s|$)/.exec(r);if(a!==null)return Vc(n,r.slice(a[0].length));let o=n.listDevices?.()??[],s=n.localDiscoveryOff;if(s!==void 0){let e=`Sessions on this host are not listed: local peer discovery is off for this session (${s}).`;return{message:o.length===0?`${e}\nNo device is linked right now.`:`Linked devices:\n${o.map(Lc).join(`
|
|
@@ -67,7 +67,7 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
|
|
|
67
67
|
`),success:!0,data:{preset:r,unknownCommandModules:a.unknownCommandModules}}}function jl(e=`preset`){return Fn().listPresets().map(t=>({name:t.id,description:t.description,source:e}))}function Ml(){return{name:`preset`,displayName:`Agent Preset`,description:`List presets or switch the active preset`,source:`preset`,argumentHint:`list | <preset-id>`,subcommands:jl(`preset`),modelInvocable:!1}}function Nl(){let e=Ml();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:Al}}var Pl=class{name=`preset`;getCommands(){return[Ml()]}};function Fl(){return{name:`agent-command-preset`,commandSources:[new Pl],systemCommands:[Nl()]}}function Il(e,t,n={}){let r=Jl(e,t);return{type:e,steps:Zl(Yl(r),n.initialValues),setupHelpLinks:r.setupHelpLinks??[],stepIndex:0,values:{},existingProfileNames:n.existingProfileNames??[],...n.profileName===void 0?{}:{profileName:n.profileName},...n.setCurrent===void 0?{}:{setCurrent:n.setCurrent}}}function Ll(e){return e.length===0?` No providers are available.`:[` Select provider:`,...e.map((e,t)=>` ${t+1}. ${Wl(e)}`),` Provider [1-${e.length}] (default: 1): `].join(`
|
|
68
68
|
`)}function Rl(e,t){let n=e.trim(),r=n.length>0?n:`1`,i=Kl(r);if(i!==void 0){let e=t[i];if(e!==void 0)return e.type;throw Error(`Provider selection ${r} is out of range. Currently supported: ${C(t)}`)}let a=S(t,r);if(a===void 0)throw Error(`Unknown provider: ${r}. Currently supported: ${C(t)}`);return a.type}function zl(e){let t=e.steps[e.stepIndex];if(t===void 0)throw Error(`Provider setup step ${e.stepIndex} is out of range`);return t}function Bl(e,t){let n=zl(e),r=t.trim()||n.defaultValue||``,i=ql(n,r);if(i!==void 0)return{status:`error`,state:e,message:i};let a={...e,stepIndex:e.stepIndex+1,values:{...e.values,[n.key]:r}};return a.stepIndex<e.steps.length?{status:`next`,state:a}:{status:`complete`,input:Ql(a)}}async function Vl(e,t,n,r={}){let i=Il(e,n,r),a=i.steps.length;for(;i.stepIndex<a;){let e=zl(i),n=await t(Hl(e,i.setupHelpLinks),e.masked===!0),r=Bl(i,n);if(r.status===`complete`)return r.input;if(r.status===`error`)throw Error(r.message);i=r.state}throw Error(`Provider setup flow ended without completion`)}function Hl(e,t=[]){let n=e.defaultValue===void 0?``:` (default: ${e.defaultValue})`,r=Gl(t);return`${r.length>0?`${r}\n`:``} ${e.title}${n}: `}const Ul={"cloud-paid":`[Cloud/Paid]`,"cloud-free":`[Cloud/Free]`,"local-free":`[Local/Free]`};function Wl(e){let t=`${e.category===void 0?``:`${Ul[e.category]??``} `}${e.displayName===void 0?e.type:`${e.displayName} (${e.type})`}`;return e.description===void 0?t:`${t} — ${e.description}`}function Gl(e=[]){return e.length===0?``:e.map(e=>` Setup help: ${Xl(e.kind)}: ${e.label} - ${e.url}`).join(`
|
|
69
69
|
`)}function Kl(e){if(/^\d+$/.test(e))return Number(e)-1}function ql(e,t){if(e.required===!0&&t.length===0)return`Required`}function Jl(e,t){let n=S(t,e);if(n===void 0)throw Error(`Unknown provider: ${e}. Currently supported: ${C(t)}`);return n}function Yl(e){if(e.setupSteps!==void 0)return[...e.setupSteps];let t=[{key:`model`,title:`${e.type} model`,defaultValue:e.defaults?.model,required:e.defaults?.model===void 0}];return e.defaults?.baseURL!==void 0&&t.unshift({key:`baseURL`,title:`${e.type} base URL`,defaultValue:e.defaults.baseURL}),e.requiresApiKey===!0&&t.push({key:`apiKey`,title:`${e.type} API key`,defaultValue:e.defaults?.apiKey,required:e.defaults?.apiKey===void 0,masked:!0}),t}function Xl(e){return e===`api-key`?`API key`:e===`console`?`Console`:`Official`}function Zl(e,t){return t===void 0?[...e]:e.map(e=>{let n=t[e.key];return n===void 0?e:{...e,defaultValue:n,required:!1}})}function Ql(e){let t=e.profileName??$t({type:e.type},{existingProfileNames:e.existingProfileNames}),n=e.values.apiKey;return{profile:t,type:e.type,model:e.values.model,...n!==void 0&&n.length>0&&{apiKey:n},...e.values.baseURL!==void 0&&{baseURL:e.values.baseURL},setCurrent:e.setCurrent??!0}}const $l={type:`session-restart`,reason:`other`};function eu(e,t){return Il(e,t.providerDefinitions,{existingProfileNames:Object.keys(t.settings.readMergedSettings().providers??{})})}function tu(e,t){let n=zl(e),r=n.masked===!0&&n.defaultValue!==void 0?`(unchanged)`:n.defaultValue,i=Gl(e.setupHelpLinks),a=[t,i.length>0?i:void 0].filter(e=>e!==void 0&&e.length>0).join(`
|
|
70
|
-
`)||void 0;return hn(`provider-setup-${n.key}`,n.title,{description:a,placeholder:r,allowEmpty:n.defaultValue!==void 0,masked:n.masked})}async function nu(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(tu(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Bl(i,t.text??``);if(o.status===`error`){a=o.message;continue}if(o.status===`complete`)return n(o.input);i=o.state,a=void 0}}function ru(e,t,n,r){return nu(e,t,e=>iu(e,n,r),`Provider setup cancelled.`)}function iu(e,t,n){let r=t.settings.readTargetSettings(),i=Ee(e,{providerDefinitions:t.providerDefinitions});return t.settings.writeTargetSettings(xt(r,i)),n?{message:`Provider ${e.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profile}]}:{message:`Provider ${e.profile} configured. Restarting...`,success:!0,hostActions:[{...$l,message:`Provider setup restart`}]}}function au(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function ou(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:tt(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};if(n.settings.readMergedSettings().currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let i=e[t];try{on(t,i,{providerDefinitions:n.providerDefinitions})}catch(e){return{message:`Failed to switch to "${t}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=n.settings.readTargetSettings(),o=n.settings.readMergedSettings(),s=a.providers?.[t]!==void 0||o.providers?.[t]!==void 0?{...a,currentProvider:t}:Zt(a,t);return n.settings.writeTargetSettings(s),{message:`Switched to ${t} (${i.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t}]}}async function su(e,t,n){let r=n.settings.readMergedSettings().providers?.[t];if(!r)return{message:`Provider profile "${t}" was not found.`,success:!1};if(!r.type)return{message:`Provider profile "${t}" is missing type.`,success:!1};let i;try{i=Il(r.type,n.providerDefinitions,{profileName:t,setCurrent:!1,initialValues:cu(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return nu(e,i,e=>lu(e,t,n),`Provider edit cancelled.`)}function cu(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function lu(e,t,n){let r=n.settings.readMergedSettings(),i=r.providers?.[t];if(!i)return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:a}=n;if(a?.requireApiKeyFromEnv&<(e.apiKey))return{message:tt(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=Ee(e,{providerDefinitions:n.providerDefinitions}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(rn(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{hostActions:[{type:`provider-hot-swap`,profileName:t}]}:{}}}const uu={type:`session-restart`,reason:`other`};async function du(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=vu(t,Object.keys(r.providers)),a;for(;;){let r=await e.ask(hn(`provider-duplicate`,`Duplicate ${t} as`,{description:a,placeholder:i,allowEmpty:!0}));if(r.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let o=r.text??``,s=fu(o,i,n);if(s!==void 0){a=s;continue}return pu(t,o,i,n)}}function fu(e,t,n){let r=yu(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function pu(e,t,n,r){let i=r.settings.readMergedSettings().providers?.[e];if(!i)return{message:`Provider profile "${e}" was not found.`,success:!1};let a=yu(t,n),o=fu(a,n,r);return o===void 0?(r.settings.writeTargetSettings(rn(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}function mu(e,t,n,r){return n?e?.[n]?Object.keys(e).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:t===n?{message:`Cannot delete the profile in use. Switch to another profile first.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(r.settings.writeTargetSettings(He(r.settings.readTargetSettings(),n)),{message:`Provider profile deleted: ${n}.`,success:!0}):{message:`Provider profile "${n}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function hu(e,t,n){let r=n.settings.readMergedSettings().providers??{};return r[t]?Object.keys(r).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n.settings.readTargetSettings().providers?.[t]===void 0?{message:`Provider profile "${t}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:w(await e.ask(x(`provider-delete`,`Delete profile "${t}"?`)))?gu(e,t,n):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${t}" was not found.`,success:!1}}async function gu(e,t,n){let r=n.settings.readMergedSettings();if(r.currentProvider!==t)return n.settings.writeTargetSettings(He(n.settings.readTargetSettings(),t)),{message:`Provider profile deleted: ${t}.`,success:!0};let i=Object.entries(r.providers??{}).filter(([e])=>e!==t).map(([e,t])=>({value:e,label:au(e,t,r.currentProvider)})),a=await e.ask(T(`provider-delete-replacement`,`Replacement provider for ${t}`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:_u(t,a.values[0],n)}function _u(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=He(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,hostActions:[{...uu,message:`Provider delete restart`}]}}function vu(e,t){let n=Jt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function yu(e,t){return Jt(e.trim()||t)??``}const bu=`switch`,xu=`edit`,Su=`test`,Cu=`duplicate`,wu=`delete`;async function Tu(e,t,n,r){let i=Object.entries(n??{}).map(([e,n])=>({value:e,label:au(e,n,t)})),a=await e.ask(T(`provider-profile`,`Select provider profile`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Eu(e,a.values[0],r)}async function Eu(e,t,n){if(!n.settings.readMergedSettings().providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let r=await e.ask(T(`provider-profile-action`,`Provider profile: ${t}`,[{value:bu,label:`Switch`},{value:xu,label:`Edit`},{value:Su,label:`Test`},{value:Cu,label:`Duplicate`},{value:wu,label:`Delete`}]));return r.type!==`answer`||r.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Du(e,t,r.values[0],n)}async function Du(e,t,n,r){let i=r.settings.readMergedSettings();switch(n){case bu:return ou(i.providers,t,r);case xu:return su(e,t,r);case Su:return nn(i.currentProvider,i.providers,t,r);case Cu:return du(e,t,r);case wu:return hu(e,t,r);default:return{message:`Unknown provider profile action "${n}".`,success:!1}}}async function Ou(e,t,n){let r=e.getUserInteraction(),i=e.isSetupRequired?.()===!0,a=n.settings.readMergedSettings(),o=t.trim();if(o.length===0)return ku(r,a.currentProvider,a.providers,n);let s=o.split(/\s+/),[c=`current`,l]=s;return c===`list`?ku(r,a.currentProvider,a.providers,n):c===`current`||c===``?{message:ju(a.currentProvider,a.providers),success:!0}:c===`switch`?ou(a.providers,l,n):c===`test`?nn(a.currentProvider,a.providers,l,n):c===`edit`?r?l?su(r,l,n):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:c===`duplicate`?r?l?du(r,l,n):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:c===`delete`?l?!s.includes(`--confirmed`)&&r&&!w(await r.ask(x(`provider-delete`,`Delete profile "${l}"?`)))?{message:`Provider delete cancelled.`,success:!0}:mu(a.providers,a.currentProvider,l,n):{message:`Usage: provider delete <profile>`,success:!1}:c===`add`?Mu(r,l,n,i):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function ku(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Au(t,n),success:!0}:Tu(e,t,n,r)}function Au(e,t){let n=Object.entries(t??{});return n.length===0?`No provider profiles configured.`:n.map(([t,n])=>`${t===e?`*`:`-`} ${t}: ${n.type??`unknown`} ${n.model??`(no model)`}`).join(`
|
|
70
|
+
`)||void 0;return hn(`provider-setup-${n.key}`,n.title,{description:a,placeholder:r,allowEmpty:n.defaultValue!==void 0,masked:n.masked})}async function nu(e,t,n,r){let i=t,a;for(;;){let t=await e.ask(tu(i,a));if(t.type===`cancelled`)return{message:r,success:!0};let o=Bl(i,t.text??``);if(o.status===`error`){a=o.message;continue}if(o.status===`complete`)return n(o.input);i=o.state,a=void 0}}function ru(e,t,n,r){return nu(e,t,e=>iu(e,n,r),`Provider setup cancelled.`)}function iu(e,t,n){let r=t.settings.readTargetSettings(),i=Ee(e,{providerDefinitions:t.providerDefinitions,...t.env===void 0?{}:{env:t.env}});return t.settings.writeTargetSettings(xt(r,i)),n?{message:`Provider ${e.profile} configured.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:e.profile}]}:{message:`Provider ${e.profile} configured. Restarting...`,success:!0,hostActions:[{...$l,message:`Provider setup restart`}]}}function au(e,t,n){return`${e===n?`* `:``}${e}: ${t.type??`unknown`} ${t.model??`(no model)`}`}function ou(e,t,n){if(!t)return{message:`Usage: /provider switch <profile>`,success:!1};if(!e?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:r}=n;if(r?.allowedProviders&&!r.allowedProviders.includes(t))return{message:tt(`Provider "${t}" is not allowed by your organization policy. Allowed: ${r.allowedProviders.join(`, `)}.`,r.adminContact),success:!1};if(n.settings.readMergedSettings().currentProvider===t)return{message:`Already using provider "${t}".`,success:!0};let i=e[t];try{on(t,i,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}})}catch(e){return{message:`Failed to switch to "${t}": ${e instanceof Error?e.message:String(e)}`,success:!1}}let a=n.settings.readTargetSettings(),o=n.settings.readMergedSettings(),s=a.providers?.[t]!==void 0||o.providers?.[t]!==void 0?{...a,currentProvider:t}:Zt(a,t);return n.settings.writeTargetSettings(s),{message:`Switched to ${t} (${i.model??`unknown model`}). History preserved.`,success:!0,hostActions:[{type:`provider-hot-swap`,profileName:t}]}}async function su(e,t,n){let r=n.settings.readMergedSettings().providers?.[t];if(!r)return{message:`Provider profile "${t}" was not found.`,success:!1};if(!r.type)return{message:`Provider profile "${t}" is missing type.`,success:!1};let i;try{i=Il(r.type,n.providerDefinitions,{profileName:t,setCurrent:!1,initialValues:cu(r)})}catch(e){return{message:e instanceof Error?e.message:String(e),success:!1}}return nu(e,i,e=>lu(e,t,n),`Provider edit cancelled.`)}function cu(e){return{...typeof e.model==`string`?{model:e.model}:{},...typeof e.apiKey==`string`?{apiKey:e.apiKey}:{},...typeof e.baseURL==`string`?{baseURL:e.baseURL}:{}}}function lu(e,t,n){let r=n.settings.readMergedSettings(),i=r.providers?.[t];if(!i)return{message:`Provider profile "${t}" was not found.`,success:!1};let{orgPolicy:a}=n;if(a?.requireApiKeyFromEnv&<(e.apiKey))return{message:tt(`Your organization policy requires API keys to be stored as environment variable references ($ENV:VAR_NAME), not as plaintext.`,a.adminContact),success:!1};let o=n.settings.readTargetSettings(),s=Ee(e,{providerDefinitions:n.providerDefinitions,...n.env===void 0?{}:{env:n.env}}).providers[t];if(!s)return{message:`Provider profile "${t}" was not updated.`,success:!1};n.settings.writeTargetSettings(rn(o,t,{...i,...s}));let c=r.currentProvider===t;return{message:c?`Provider ${t} updated. Switching...`:`Provider ${t} updated.`,success:!0,...c?{hostActions:[{type:`provider-hot-swap`,profileName:t}]}:{}}}const uu={type:`session-restart`,reason:`other`};async function du(e,t,n){let r=n.settings.readMergedSettings();if(!r.providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let i=vu(t,Object.keys(r.providers)),a;for(;;){let r=await e.ask(hn(`provider-duplicate`,`Duplicate ${t} as`,{description:a,placeholder:i,allowEmpty:!0}));if(r.type===`cancelled`)return{message:`Provider duplicate cancelled.`,success:!0};let o=r.text??``,s=fu(o,i,n);if(s!==void 0){a=s;continue}return pu(t,o,i,n)}}function fu(e,t,n){let r=yu(e,t);if(r.length===0)return`Required`;if(n.settings.readMergedSettings().providers?.[r]!==void 0)return`Provider profile "${r}" already exists`}function pu(e,t,n,r){let i=r.settings.readMergedSettings().providers?.[e];if(!i)return{message:`Provider profile "${e}" was not found.`,success:!1};let a=yu(t,n),o=fu(a,n,r);return o===void 0?(r.settings.writeTargetSettings(rn(r.settings.readTargetSettings(),a,{...i})),{message:`Provider profile duplicated: ${e} -> ${a}.`,success:!0}):{message:o,success:!1}}function mu(e,t,n,r){return n?e?.[n]?Object.keys(e).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:t===n?{message:`Cannot delete the profile in use. Switch to another profile first.`,success:!1}:r.settings.readTargetSettings().providers?.[n]===void 0?{message:`Provider profile "${n}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:(r.settings.writeTargetSettings(He(r.settings.readTargetSettings(),n)),{message:`Provider profile deleted: ${n}.`,success:!0}):{message:`Provider profile "${n}" was not found.`,success:!1}:{message:`Usage: /provider delete <profile>`,success:!1}}async function hu(e,t,n){let r=n.settings.readMergedSettings().providers??{};return r[t]?Object.keys(r).length<=1?{message:`Cannot delete the only provider profile.`,success:!1}:n.settings.readTargetSettings().providers?.[t]===void 0?{message:`Provider profile "${t}" is not stored in the active write target; edit its source settings file or override it before deleting.`,success:!1}:w(await e.ask(x(`provider-delete`,`Delete profile "${t}"?`)))?gu(e,t,n):{message:`Provider delete cancelled.`,success:!0}:{message:`Provider profile "${t}" was not found.`,success:!1}}async function gu(e,t,n){let r=n.settings.readMergedSettings();if(r.currentProvider!==t)return n.settings.writeTargetSettings(He(n.settings.readTargetSettings(),t)),{message:`Provider profile deleted: ${t}.`,success:!0};let i=Object.entries(r.providers??{}).filter(([e])=>e!==t).map(([e,t])=>({value:e,label:au(e,t,r.currentProvider)})),a=await e.ask(T(`provider-delete-replacement`,`Replacement provider for ${t}`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider delete cancelled.`,success:!0}:_u(t,a.values[0],n)}function _u(e,t,n){if(n.settings.readMergedSettings().providers?.[t]===void 0||t===e)return{message:`Provider profile "${t}" was not found.`,success:!1};let r=He(n.settings.readTargetSettings(),e);return n.settings.writeTargetSettings({...r,currentProvider:t}),{message:`Provider profile deleted: ${e}. Restarting with ${t}...`,success:!0,hostActions:[{...uu,message:`Provider delete restart`}]}}function vu(e,t){let n=Jt(`${e}-copy`)??`provider-copy`;if(!t.includes(n))return n;for(let e=2;e<1e3;e+=1){let r=`${n}-${e}`;if(!t.includes(r))return r}return`${n}-${Date.now()}`}function yu(e,t){return Jt(e.trim()||t)??``}const bu=`switch`,xu=`edit`,Su=`test`,Cu=`duplicate`,wu=`delete`;async function Tu(e,t,n,r){let i=Object.entries(n??{}).map(([e,n])=>({value:e,label:au(e,n,t)})),a=await e.ask(T(`provider-profile`,`Select provider profile`,i,{maxVisible:8}));return a.type!==`answer`||a.values[0]===void 0?{message:`Provider profile selection cancelled.`,success:!0}:Eu(e,a.values[0],r)}async function Eu(e,t,n){if(!n.settings.readMergedSettings().providers?.[t])return{message:`Provider profile "${t}" was not found.`,success:!1};let r=await e.ask(T(`provider-profile-action`,`Provider profile: ${t}`,[{value:bu,label:`Switch`},{value:xu,label:`Edit`},{value:Su,label:`Test`},{value:Cu,label:`Duplicate`},{value:wu,label:`Delete`}]));return r.type!==`answer`||r.values[0]===void 0?{message:`Provider profile action cancelled.`,success:!0}:Du(e,t,r.values[0],n)}async function Du(e,t,n,r){let i=r.settings.readMergedSettings();switch(n){case bu:return ou(i.providers,t,r);case xu:return su(e,t,r);case Su:return nn(i.currentProvider,i.providers,t,r);case Cu:return du(e,t,r);case wu:return hu(e,t,r);default:return{message:`Unknown provider profile action "${n}".`,success:!1}}}async function Ou(e,t,n){let r=e.getUserInteraction(),i=e.isSetupRequired?.()===!0,a=n.settings.readMergedSettings(),o=t.trim();if(o.length===0)return ku(r,a.currentProvider,a.providers,n);let s=o.split(/\s+/),[c=`current`,l]=s;return c===`list`?ku(r,a.currentProvider,a.providers,n):c===`current`||c===``?{message:ju(a.currentProvider,a.providers),success:!0}:c===`switch`?ou(a.providers,l,n):c===`test`?nn(a.currentProvider,a.providers,l,n):c===`edit`?r?l?su(r,l,n):{message:`Usage: provider edit <profile>`,success:!1}:{message:`Provider edit requires an interactive session.`,success:!1}:c===`duplicate`?r?l?du(r,l,n):{message:`Usage: provider duplicate <profile>`,success:!1}:{message:`Provider duplicate requires an interactive session.`,success:!1}:c===`delete`?l?!s.includes(`--confirmed`)&&r&&!w(await r.ask(x(`provider-delete`,`Delete profile "${l}"?`)))?{message:`Provider delete cancelled.`,success:!0}:mu(a.providers,a.currentProvider,l,n):{message:`Usage: provider delete <profile>`,success:!1}:c===`add`?Mu(r,l,n,i):{message:`Usage: provider [current|list|switch <profile>|edit <profile>|duplicate <profile>|delete <profile>|add <type>|test [profile]]`,success:!1}}function ku(e,t,n,r){return!e||Object.keys(n??{}).length===0?{message:Au(t,n),success:!0}:Tu(e,t,n,r)}function Au(e,t){let n=Object.entries(t??{});return n.length===0?`No provider profiles configured.`:n.map(([t,n])=>`${t===e?`*`:`-`} ${t}: ${n.type??`unknown`} ${n.model??`(no model)`}`).join(`
|
|
71
71
|
`)}function ju(e,t){if(!e)return`No current provider configured.`;let n=t?.[e];return n?[`Current provider: ${e}`,`Type: ${n.type??`unknown`}`,`Model: ${n.model??`(no model)`}`,...n.baseURL?[`Base URL: ${n.baseURL}`]:[]].join(`
|
|
72
72
|
`):`Current provider "${e}" was not found in providers.`}function Mu(e,t,n,r){return t===void 0||t.length===0?e?Nu(e,n,r):{message:`Usage: provider add <type>. Supported: ${C(n.providerDefinitions)}`,success:!1}:S(n.providerDefinitions,t)===void 0?{message:`Usage: provider add <type>. Supported: ${C(n.providerDefinitions)}`,success:!1}:e?ru(e,eu(t,n),n,r):{message:`Provider setup for "${t}" requires an interactive session.`,success:!1}}async function Nu(e,t,n){let r=t.providerDefinitions.map(e=>({value:e.type,label:Wl(e)})),i=await e.ask(T(`provider-type`,`Select provider`,r,{maxVisible:6}));if(i.type!==`answer`||i.values[0]===void 0)return{message:`Provider setup cancelled.`,success:!0};let a=i.values[0];return S(t.providerDefinitions,a)===void 0?{message:`Usage: provider add <type>. Supported: ${C(t.providerDefinitions)}`,success:!1}:ru(e,eu(a,t),t,n)}function Pu(){return[{name:`current`,description:`Show current provider`,source:`provider`},{name:`list`,description:`List provider profiles`,source:`provider`},{name:`switch`,description:`Hot-swap to another provider profile`,source:`provider`},{name:`add`,description:`Configure a provider profile`,source:`provider`},{name:`test`,description:`Test provider profile`,source:`provider`}]}function Fu(){return{name:`provider`,displayName:`Provider Setup`,description:`Manage provider profiles`,source:`provider`,modelInvocable:!1,argumentHint:`current | list | switch <profile> | add [type] | test [profile]`,subcommands:Pu(),example:`/provider switch production`}}var Iu=class{name=`provider`;getCommands(){return[Fu()]}};function Lu(e){let t=Fu();return{name:t.name,displayName:t.displayName,description:t.description,example:t.example,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,subcommands:t.subcommands,lifecycle:`inline`,execute:(t,n)=>Ou(t,n,e)}}function Ru(e){return{name:`agent-command-provider`,commandSources:[new Iu],systemCommands:[Lu(e)]}}async function zu(e,t){let n=(await e(`
|
|
73
73
|
Do you have an API key for an AI provider?
|
|
@@ -96,7 +96,7 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
|
|
|
96
96
|
When the server is running, come back here and press Enter to continue.
|
|
97
97
|
|
|
98
98
|
─────────────────────────────────────────────────────────────────────────────
|
|
99
|
-
`),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function Bu(e,t,n,r,i){let a=await zu(n,r),o=Hu(t),s=Object.keys(Ft(o.sources).providers??{}),c=Uu(o.stores,t.settingsScope),l;l=a.preselectedType===void 0?Rl(await n(Ll(i)),i):a.preselectedType,ve(c,await Vl(l,n,i,{existingProfileNames:s}),{providerDefinitions:i,env:t.env});let u=await n(` Response language (ko/en/ja/zh, default: en): `);if(u){let e=c.read();e.language=u,c.write(e)}r.writeLine(`\n Config saved to ${c.displayName}\n`)}async function Vu(e,t,n,r,i,a){let o=Hu(t),s=Ft(o.sources);if(Ae(t.provider===void 0?s:{...s,currentProvider:t.provider},i)===`valid`||t.provider===void 0&&Bt(i,a.env)!==void 0)return;if(!(a.isInteractive??(()=>!1))())throw new re(a.formatError(i));await Bu(e,Wu({...t,env:t.env??a.env},o.stores),n,r,i);let c=Ft(o.sources);if(Ae(t.provider===void 0?c:{...c,currentProvider:t.provider},i)!==`valid`)throw new re(a.formatError(i))}function Hu(e){if(e.settingsSources===void 0||e.settingsStores===void 0)throw Error(`Provider startup requires host settings sources and stores.`);return{sources:e.settingsSources,stores:e.settingsStores}}function Uu(e,t){if(t===void 0)return Wt(e);let n=t===`user`?`user`:`project-local`,r=e.findLast(e=>e.scope===n);if(r!==void 0)return r;throw new he(`No authorized ${n} settings store is available.`)}function Wu(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:Gu(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function Gu(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&typeof n.read().currentProvider==`string`)return n}}const Ku="only the operator at this terminal can do this; a connected surface cannot pair, enroll or revoke devices. Run `/remote-control` on the host terminal.";function qu(e,t){if(!e)return{message:`Remote control is not available in this environment.`,success:!0};switch(e.state){case`off`:return{message:"Remote control is off. Use `/remote-control` to enable it.",success:!0};case`no-relay`:return{message:"Remote control is unavailable: no signaling relay is configured (set `transports.webrtc.options.relayUrl`).",success:!0};case`awaiting-pairing`:return{message:t?`Remote control is waiting for a device to pair.\nOpen: ${e.pairingUrl}`:`Remote control is waiting for a device to pair. The pairing link is shown only on the host terminal.`,success:!0};case`paired`:return{message:`Remote control is active — a device is paired.`,success:!0};default:return{message:`Remote control status is unknown.`,success:!0}}}function Ju(e,t){let n=e.getCommandInvocationSource()===`user`,r=t.trim(),i=r.indexOf(` `),a=(i===-1?r:r.slice(0,i)).toLowerCase(),o=i===-1?``:r.slice(i+1).trim();if(a===`status`){let t=e.getCommandHostAdapters?.().remoteControl,r=qu(t?.getStatus(),n);if(!t?.describeKeyStorage)return r;let i=t.describeKeyStorage()??`chosen when remote control is first enabled`;return{...r,message:`${r.message}\nHost key storage: ${i}`}}if(a===`devices`){let t=(e.getCommandHostAdapters?.().remoteControl)?.listDevices?.();return t?t.length===0?{message:`No trusted devices are enrolled yet.`,success:!0}:{message:`Trusted devices:\n${t.map(e=>` ${e.deviceId} ${e.label} (last seen ${e.lastSeenAt})`).join(`
|
|
99
|
+
`),await e(` Press Enter when LM Studio server is running: `),{path:`local`,preselectedType:`gemma`}):{path:`has-key`}}async function Bu(e,t,n,r,i){let a=await zu(n,r),o=Hu(t),s=Object.keys(Ft(o.sources).providers??{}),c=Uu(o.stores,t.settingsScope),l;l=a.preselectedType===void 0?Rl(await n(Ll(i)),i):a.preselectedType,ve(c,await Vl(l,n,i,{existingProfileNames:s}),{providerDefinitions:i,env:t.env});let u=await n(` Response language (ko/en/ja/zh, default: en): `);if(u){let e=c.read();e.language=u,c.write(e)}r.writeLine(`\n Config saved to ${c.displayName}\n`)}async function Vu(e,t,n,r,i,a){let o=Hu(t),s=Ft(o.sources);if(Ae(t.provider===void 0?s:{...s,currentProvider:t.provider},i,t.env??a.env)===`valid`||t.provider===void 0&&Bt(i,a.env)!==void 0)return;if(!(a.isInteractive??(()=>!1))())throw new re(a.formatError(i));await Bu(e,Wu({...t,env:t.env??a.env},o.stores),n,r,i);let c=Ft(o.sources);if(Ae(t.provider===void 0?c:{...c,currentProvider:t.provider},i,t.env??a.env)!==`valid`)throw new re(a.formatError(i))}function Hu(e){if(e.settingsSources===void 0||e.settingsStores===void 0)throw Error(`Provider startup requires host settings sources and stores.`);return{sources:e.settingsSources,stores:e.settingsStores}}function Uu(e,t){if(t===void 0)return Wt(e);let n=t===`user`?`user`:`project-local`,r=e.findLast(e=>e.scope===n);if(r!==void 0)return r;throw new he(`No authorized ${n} settings store is available.`)}function Wu(e,t){return e.settingsScope!==void 0||e.provider!==void 0?e:Gu(t)?.kind===`project`?{...e,settingsScope:`project-local`}:e}function Gu(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&typeof n.read().currentProvider==`string`)return n}}const Ku="only the operator at this terminal can do this; a connected surface cannot pair, enroll or revoke devices. Run `/remote-control` on the host terminal.";function qu(e,t){if(!e)return{message:`Remote control is not available in this environment.`,success:!0};switch(e.state){case`off`:return{message:"Remote control is off. Use `/remote-control` to enable it.",success:!0};case`no-relay`:return{message:"Remote control is unavailable: no signaling relay is configured (set `transports.webrtc.options.relayUrl`).",success:!0};case`awaiting-pairing`:return{message:t?`Remote control is waiting for a device to pair.\nOpen: ${e.pairingUrl}`:`Remote control is waiting for a device to pair. The pairing link is shown only on the host terminal.`,success:!0};case`paired`:return{message:`Remote control is active — a device is paired.`,success:!0};default:return{message:`Remote control status is unknown.`,success:!0}}}function Ju(e,t){let n=e.getCommandInvocationSource()===`user`,r=t.trim(),i=r.indexOf(` `),a=(i===-1?r:r.slice(0,i)).toLowerCase(),o=i===-1?``:r.slice(i+1).trim();if(a===`status`){let t=e.getCommandHostAdapters?.().remoteControl,r=qu(t?.getStatus(),n);if(!t?.describeKeyStorage)return r;let i=t.describeKeyStorage()??`chosen when remote control is first enabled`;return{...r,message:`${r.message}\nHost key storage: ${i}`}}if(a===`devices`){let t=(e.getCommandHostAdapters?.().remoteControl)?.listDevices?.();return t?t.length===0?{message:`No trusted devices are enrolled yet.`,success:!0}:{message:`Trusted devices:\n${t.map(e=>` ${e.deviceId} ${e.label} (last seen ${e.lastSeenAt})`).join(`
|
|
100
100
|
`)}`,success:!0}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}if(a===`revoke`){if(!n)return{message:`\`/remote-control revoke\`: ${Ku}`,success:!1};if(!o)return{message:`Usage: /remote-control revoke <deviceId>`,success:!1};let t=e.getCommandHostAdapters?.().remoteControl;return t?.revokeDevice?t.revokeDevice(o)?{message:`Revoked trusted device ${o}. It must re-pair to reconnect.`,success:!0}:{message:`No trusted device with id ${o}.`,success:!1}:{message:`Trusted-device reconnect is not available in this environment.`,success:!0}}return a===`stop`||a===`off`?{message:`Stopping remote control...`,success:!0,hostActions:[{type:`remote-control-stop`}]}:a===``||a===`enable`||a===`on`?n?{message:`Enabling remote control...`,success:!0,hostActions:[{type:`remote-control-enable`}]}:{message:`\`/remote-control enable\`: ${Ku}`,success:!1}:{message:`Unknown argument "${a}". Usage: /remote-control [enable|stop|status|devices|revoke <id>]`,success:!1}}function Yu(){return{name:`remote-control`,displayName:`Remote control`,description:`Enable P2P remote control (pair a device to co-drive this session), or check status. Pairing and revoking run only for the operator at the host terminal; a connected surface can stop remote control and read its status, without the pairing link.`,source:`remote-control`,modelInvocable:!1,userInvocable:!0,argumentHint:`[enable|stop|status|devices|revoke <device-id>]`,subcommands:[{name:`status`,description:`Show remote-control status`,source:`remote-control`},{name:`devices`,description:`List trusted devices`,source:`remote-control`},{name:`enable`,description:`Enable remote control and pair a device`,source:`remote-control`},{name:`stop`,description:`Stop remote control`,source:`remote-control`},{name:`revoke`,description:`Revoke a trusted device`,source:`remote-control`,argumentHint:`<device-id>`}]}}function Xu(){return k(Yu(),{requiresPermission:!1,lifecycle:`inline`,execute:(e,t)=>Ju(e,t)})}var Zu=class{name=`remote-control`;getCommands(){return[Yu()]}};function Qu(){return{name:`agent-command-remote-control`,commandSources:[new Zu],systemCommands:[Xu()]}}function $u(){return{success:!0,message:`Reset requested.`,data:{resetRequested:!0},hostActions:[{type:`settings-reset`}]}}function ed(){return{name:`reset`,displayName:`Reset Settings`,description:`Delete settings`,source:`reset`,modelInvocable:!1}}function td(){let e=ed();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!0,userInvocable:!0,modelInvocable:!1,lifecycle:`inline`,execute:$u}}var nd=class{name=`reset`;getCommands(){return[ed()]}};function rd(){return{name:`agent-command-reset`,commandSources:[new nd],systemCommands:[td()]}}function W(){return{message:`Usage: rewind [list] | rewind inspect <checkpoint-id> | rewind restore <checkpoint-id> | rewind code <checkpoint-id> | rewind rollback <checkpoint-id>`,success:!1}}function id(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=120?t:`${t.slice(0,117)}...`}function ad(e){return{message:[`Edit checkpoints:`,...e.length>0?e.map(e=>`- ${e.id} files=${e.fileCount} ${e.createdAt} ${id(e.prompt)}`):[`(no edit checkpoints)`]].join(`
|
|
101
101
|
`),success:!0,data:{count:e.length,checkpoints:[...e]}}}function od(e){return e.length>0?e.join(`, `):`(none)`}function sd(e){let t=e.capturedFiles.length>0?e.capturedFiles.map(e=>{let t=e.snapshotSizeBytes===void 0?``:` size=${e.snapshotSizeBytes}B`;return`- ${e.relativePath} action=${e.restoreAction} snapshot=${String(e.snapshotAvailable)}${t}`}):[`(no files captured)`];return{message:[`Checkpoint ${e.target.id}`,`Prompt: ${id(e.target.prompt)}`,`Captured files:`,...t,`Restore later checkpoints: files=${e.restoreToCheckpoint.fileCount} checkpoints=${od(e.restoreToCheckpoint.checkpointIds)}`,`Rollback through checkpoint: files=${e.rollbackThroughCheckpoint.fileCount} checkpoints=${od(e.rollbackThroughCheckpoint.checkpointIds)}`].join(`
|
|
102
102
|
`),success:!0,data:{inspection:e}}}function cd(e){return{message:[`Restored code to ${e.target.id}.`,`Restored files: ${e.restoredFileCount}`,`Rolled back checkpoints: ${e.restoredCheckpointCount}`].join(`
|
|
@@ -115,5 +115,5 @@ import{BACKGROUND_COMMAND_DESCRIPTION as e,BACKGROUND_COMMAND_USAGE as t,CLEAR_C
|
|
|
115
115
|
`);function ip(e){let t=e.trim().toLowerCase().split(/\s+/).filter(e=>e.length>0),[n,r]=t;return n===`on`&&r===void 0?{success:!0,message:`Status line enabled.`,patch:{enabled:!0}}:n===`off`&&r===void 0?{success:!0,message:`Status line disabled.`,patch:{enabled:!1}}:n===`reset`&&r===void 0?{success:!0,message:`Status line settings reset.`,patch:{...o}}:n===`git`&&r===`on`&&t.length===2?{success:!0,message:`Status line git branch shown.`,patch:{gitBranch:!0}}:n===`git`&&r===`off`&&t.length===2?{success:!0,message:`Status line git branch hidden.`,patch:{gitBranch:!1}}:{success:!1,message:rp}}function ap(e,t){let n=ip(t);return n.success?{success:!0,message:n.message,hostActions:[{type:`statusline-settings-patch`,patch:n.patch}]}:{success:!1,message:n.message}}function op(){return{name:`statusline`,displayName:`Status Line`,description:de,source:`statusline`,argumentHint:ue,subcommands:Oe(`statusline`),modelInvocable:!1}}function sp(){let e=op();return{name:e.name,displayName:e.displayName,description:e.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:e.argumentHint,subcommands:e.subcommands,lifecycle:`inline`,execute:ap}}var cp=class{name=`statusline`;getCommands(){return[op()]}};function lp(){return{name:`agent-command-statusline`,commandSources:[new cp],systemCommands:[sp()]}}const up=`list | <theme-id> | syntax on|off | motion on|off`;function $(e){return e?`on`:`off`}function dp(e){let{settings:t,reducedMotionPin:n}=e.getAppearance(),r=e.listThemes().map(e=>`${e.id===t.theme?`* `:` `}${e.id} — ${e.name} (${e.appearance}, ${e.source})`),i=n?`${$(n.reducedMotion)} for this run (pinned by ${n.tier}; saved ${$(t.reducedMotion)})`:$(t.reducedMotion);return[`Available themes:`,...r,``,`syntax highlighting: ${$(t.syntaxHighlighting)}`,`reduced motion: ${i}`].join(`
|
|
116
116
|
`)}function fp(e){return{success:!0,message:dp(e),data:{themes:e.listThemes().map(e=>({...e})),appearance:{...e.getAppearance().settings}}}}function pp(e,t){return{success:!1,message:`Unknown theme "${e}". Available: ${t.listThemes().map(e=>e.id).join(`, `)||`(none)`}`}}function mp(e){if(e===`on`)return!0;if(e===`off`)return!1}function hp(e){let t={},n=0,r;for(e[0]!==`syntax`&&e[0]!==`motion`&&(r=e[0],n=1);n<e.length;){let r=e[n],i=mp(e[n+1]);if(r!==`syntax`&&r!==`motion`||i===void 0)return{error:`Usage: /theme ${up}`};r===`syntax`?t.syntaxHighlighting=i:t.reducedMotion=!i,n+=2}return{patch:t,...r===void 0?{}:{themeId:r}}}function gp(e,t,n){let r=[];t&&r.push(`theme ${t.name}`),e.syntaxHighlighting!==void 0&&r.push(`syntax highlighting ${$(e.syntaxHighlighting)}`),e.reducedMotion!==void 0&&r.push(`motion ${$(!e.reducedMotion)}`);let i=r.length>0?`Applied: ${r.join(`, `)}.`:`Nothing to change.`;return e.reducedMotion!==void 0&&n.reducedMotionPin?`${i} Saved, but this run keeps reduced motion pinned by ${n.reducedMotionPin.tier}.`:i}function _p(e,t){if(!e)return{success:!1,message:`Themes are available in an interactive terminal. Run /theme there.`};let n=t.trim().split(/\s+/u).filter(Boolean);if(n.length===0)return{success:!0,message:`Opening the theme picker...`,uiIntents:[{type:`show-theme-picker`}]};if(n.length===1&&n[0]===`list`)return fp(e);let r=hp(n);if(r.error!==void 0||!r.patch)return{success:!1,message:r.error??`Usage: /theme ${up}`};let i={...r.patch},a;if(r.themeId!==void 0){if(a=e.getTheme(r.themeId),!a)return pp(r.themeId,e);i.theme=a.id}return{success:!0,message:gp(i,a,e.getAppearance()),data:{appearance:{...i}},hostActions:[{type:`appearance-settings-patch`,patch:i}]}}function vp(){return{name:`theme`,displayName:`Theme`,description:`List, preview or switch the terminal colour theme, and toggle syntax highlighting and motion`,argumentHint:up,source:`theme`,userInvocable:!0,modelInvocable:!1,runner:`client`,surfaces:[`terminal`]}}var yp=class{name=`theme`;getCommands(){return[vp()]}};function bp(e){let t=vp(),n={name:t.name,displayName:t.displayName,description:t.description,argumentHint:t.argumentHint,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,runner:t.runner,surfaces:t.surfaces,lifecycle:`inline`,execute:(t,n)=>_p(e,n)};return{name:`agent-command-theme`,commandSources:[new yp],systemCommands:[n]}}const xp=`Inspect user-local storage and memory state.`,Sp=`storage list [--format json] | memory set/list/inspect/disable/delete`,Cp=`Usage: user-local storage list [--format json] | user-local memory set <category> <key> <value> --summary <summary> --source <source> | user-local memory list [--format json] | user-local memory inspect <category> <key> [--format json] | user-local memory disable <category> <key> | user-local memory delete <category> <key>`;function wp(e){return e.length===0?`No user-local memory items.`:e.map(e=>`- ${e.category}/${e.key} (${e.enabled?`enabled`:`disabled`})`).join(`
|
|
117
117
|
`)}function Tp(e){if(e===void 0)throw Error(`User-local memory category is required.`);return e}async function Ep(e,t,n){let r=await yt({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):wp(r.items),success:!0,data:{list:r}}}async function Dp(e,t,n){let[r,i,a]=n.positional,o=await Qt({activeRepositoryRoot:e,storageRoot:t,category:Tp(r),key:i??``,value:a??``,summary:n.summary??``,source:n.source??``});return{message:`Stored user-local memory item ${o.category}/${o.key} at ${o.storageLocation}`,success:!0,data:{item:o}}}async function Op(e,t,n){let[r,i]=n.positional,a=await st({activeRepositoryRoot:e,storageRoot:t,category:Tp(r),key:i??``});return{message:n.format===`json`?JSON.stringify(a,null,2):`${a.category}/${a.key}: ${a.summary}`,success:!0,data:{item:a}}}async function kp(e,t,n){let[r,i]=n.positional,a=await We({activeRepositoryRoot:e,storageRoot:t,category:Tp(r),key:i??``});return{message:`Disabled user-local memory item ${a.category}/${a.key}`,success:!0,data:{item:a}}}async function Ap(e,t,n){let[r,i]=n.positional,a=await Ue({activeRepositoryRoot:e,storageRoot:t,category:Tp(r),key:i??``});return{message:`Deleted user-local memory item ${a.category}/${a.key}`,success:!0,data:{result:a}}}async function jp(e,t,n){return(n.action??`list`)===`list`?Ep(e,t,n):n.action===`set`?Dp(e,t,n):n.action===`inspect`?Op(e,t,n):n.action===`disable`?kp(e,t,n):n.action===`delete`?Ap(e,t,n):{message:Cp,success:!1}}function Mp(e){if(e===void 0||e===`text`)return`text`;if(e===`json`)return`json`;throw Error(`Unsupported user-local output format: ${e}`)}function Np(e,t,n){return e===`--format`?{format:t[n+1],nextIndex:n+1}:e.startsWith(`--format=`)?{format:e.slice(9),nextIndex:n}:e===`--summary`?{summary:t[n+1],nextIndex:n+1}:e.startsWith(`--summary=`)?{summary:e.slice(10),nextIndex:n}:e===`--source`?{source:t[n+1],nextIndex:n+1}:e.startsWith(`--source=`)?{source:e.slice(9),nextIndex:n}:null}function Pp(e,t={}){let n=t.format,r=t.summary,i=t.source,a=[];for(let t=0;t<e.length;t+=1){let o=e[t],s=Np(o,e,t);if(s!==null){n=s.format??n,r=s.summary??r,i=s.source??i,t=s.nextIndex;continue}a.push(o)}return{target:a[0],action:a[1],positional:a.slice(2),format:Mp(n),summary:r,source:i}}function Fp(e){return e.trim().split(/\s+/).filter(Boolean)}function Ip(e,t){let n=t.map(e=>`- ${e.category}`);return[`User-local storage root: ${e}`,`Categories:`,...n].join(`
|
|
118
|
-
`)}async function Lp(e,t,n){if((n.action??`list`)!==`list`)return{message:Cp,success:!1};let r=await ct({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):Ip(r.root,r.categories),success:!0,data:{root:r.root,categories:r.categories,inspection:r}}}async function Rp(e,t,n){return n.target===`storage`?Lp(e,t,n):n.target===`memory`?jp(e,t,n):{message:Cp,success:!1}}function zp(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Bp(e){try{return await Rp(e.cwd,e.storageRoot,Pp(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:zp(e instanceof Error?e.message:String(e)),success:!1}}}async function Vp(e,t,n){try{return await Rp(e.getCwd(),n,Pp(Fp(t)))}catch(e){return{message:zp(e instanceof Error?e.message:String(e)),success:!1}}}function Hp(){return{name:`user-local`,displayName:`User Config`,description:xp,source:`user-local`,argumentHint:Sp,modelInvocable:!1,safety:`read-only`,subcommands:[{name:`storage`,description:`Inspect user-local storage categories`,source:`user-local`},{name:`memory`,description:`Inspect and manage user-local memory items`,source:`user-local`}]}}function Up(e){let t=Hp();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,safety:t.safety,subcommands:t.subcommands,execute:(t,n)=>Vp(t,n,e)}}var Wp=class{name=`user-local`;getCommands(){return[Hp()]}};function Gp(e){return{name:`agent-command-user-local`,commandSources:[new Wp],systemCommands:[Up(e)]}}function Kp(e,t,n){return Yt(e,t,n)}function qp({cwd:e,userLocalStorageRoot:t,editorTemporaryDirectoryPrefix:n,contributionSources:r,skillRoots:i,providerDefinitions:a,providerSettingsAdapter:o,orgPolicy:s,keybindingsFilePort:c,themeCataloguePort:l,devicesPort:u,doctorInputs:d,doctorDisplay:f,formatForkResumeCommand:p,loopOptions:m,enabledCommandModules:h,disabledCommandModules:g}){let
|
|
118
|
+
`)}async function Lp(e,t,n){if((n.action??`list`)!==`list`)return{message:Cp,success:!1};let r=await ct({activeRepositoryRoot:e,storageRoot:t});return{message:n.format===`json`?JSON.stringify(r,null,2):Ip(r.root,r.categories),success:!0,data:{root:r.root,categories:r.categories,inspection:r}}}async function Rp(e,t,n){return n.target===`storage`?Lp(e,t,n):n.target===`memory`?jp(e,t,n):{message:Cp,success:!1}}function zp(e){return e.includes(`ENOENT`)?`User-local memory item not found.`:e}async function Bp(e){try{return await Rp(e.cwd,e.storageRoot,Pp(e.argv,{format:e.format,summary:e.summary,source:e.source}))}catch(e){return{message:zp(e instanceof Error?e.message:String(e)),success:!1}}}async function Vp(e,t,n){try{return await Rp(e.getCwd(),n,Pp(Fp(t)))}catch(e){return{message:zp(e instanceof Error?e.message:String(e)),success:!1}}}function Hp(){return{name:`user-local`,displayName:`User Config`,description:xp,source:`user-local`,argumentHint:Sp,modelInvocable:!1,safety:`read-only`,subcommands:[{name:`storage`,description:`Inspect user-local storage categories`,source:`user-local`},{name:`memory`,description:`Inspect and manage user-local memory items`,source:`user-local`}]}}function Up(e){let t=Hp();return{name:t.name,displayName:t.displayName,description:t.description,requiresPermission:!1,userInvocable:!0,modelInvocable:!1,argumentHint:t.argumentHint,safety:t.safety,subcommands:t.subcommands,execute:(t,n)=>Vp(t,n,e)}}var Wp=class{name=`user-local`;getCommands(){return[Hp()]}};function Gp(e){return{name:`agent-command-user-local`,commandSources:[new Wp],systemCommands:[Up(e)]}}function Kp(e,t,n){return Yt(e,t,n)}function qp({cwd:e,userLocalStorageRoot:t,editorTemporaryDirectoryPrefix:n,contributionSources:r,skillRoots:i,providerDefinitions:a,providerSettingsAdapter:o,orgPolicy:s,keybindingsFilePort:c,themeCataloguePort:l,devicesPort:u,doctorInputs:d,doctorDisplay:f,formatForkResumeCommand:p,loopOptions:m,enabledCommandModules:h,disabledCommandModules:g,providerEnvironment:_}){let v=[np({contributionSources:r??[],skillRoots:i}),Lo(),pr(),za(),Da(),Zc(),Xs(),_c(),Fl(),Ec(),qo(),yr(),eo(p),wo(),rl(),Uf(),ba(n),_o(),Vo(c),bp(l),...d===void 0?[]:[pa(d,void 0,f)],Vs(),Es(),Gp(t),Tr(),Xr(),Wa(),Mf(),rd(),Sd(),rf(m),lp(),Cl(),If(),qc(),Pc(),Mo(),Qu(),...u===void 0?[]:[oi(u)],Ru({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s},..._===void 0?{}:{env:_}}),cc({providerDefinitions:a,settings:o,...s===void 0?{}:{orgPolicy:s},..._===void 0?{}:{env:_}})],y=v.map(e=>e.name);return{modules:Kp(v,h,g),unknownModuleNames:qe(y,h,g)}}function Jp(e){let{shellExecutable:t,editorTemporaryDirectoryPrefix:n,keybindingsFile:r,themeCatalogue:i,enabledCommandModules:a,disabledCommandModules:o}=e,s=[[Uf(t),(e,n)=>zf(e,n,t)],[ba(n),(e,t)=>ga(e,t,n)],[Vo(r),e=>zo(r,e)],[bp(i),(e,t)=>_p(i,t)]],c=new Set(Yt(s.map(([e])=>e),a,o));return s.filter(([e])=>c.has(e)).flatMap(([e,t])=>(e.systemCommands??[]).map(e=>({name:e.name,execute:t})))}export{xa as ADVISOR_SETTING_KEY,Ea as AdvisorCommandSource,fr as AgentCommandSource,vr as BackgroundCommandSource,sf as CLEAR_COMMAND_MESSAGE,wr as CompactCommandSource,Yr as ContextCommandSource,la as DoctorCommandSource,ha as EDITOR_COMMAND_DESCRIPTION,ya as EditorCommandSource,Ra as EffortCommandSource,Ua as ExitCommandSource,vo as GOAL_COMMAND_DESCRIPTION,go as GitCommandSource,Co as GoalCommandSource,jo as HandoffCommandSource,Io as HelpCommandSource,Bo as KeybindingsCommandSource,Ko as LanguageCommandSource,Ts as MCPActivationCommandSource,Bs as MemoryCommandSource,Ys as ModeCommandSource,sc as ModelCommandSource,Tc as OutputStyleCommandSource,Xc as PermissionsCommandSource,Sl as PluginManagerCommandSource,Pl as PresetCommandSource,Iu as ProviderCommandSource,Zu as RemoteControlCommandSource,xd as RewindCommandSource,V as SANDBOX_MODES,Rf as SHELL_COMMAND_DESCRIPTION,qf as SKILLS_COMMAND_DESCRIPTION,rp as STATUSLINE_USAGE,Vi as STORAGE_REPAIR_ID,gc as SandboxCommandSource,nf as ScheduleCommandSource,jf as SessionCommandSource,Ff as SettingsCommandSource,Hf as ShellCommandSource,tp as SkillsCommandSource,cp as StatusLineCommandSource,yp as ThemeCommandSource,Sp as USER_LOCAL_COMMAND_ARGUMENT_HINT,xp as USER_LOCAL_COMMAND_DESCRIPTION,Cp as USER_LOCAL_COMMAND_USAGE,Wp as UserLocalCommandSource,qi as applyDoctorRepair,aa as buildDoctorReport,Ci as collectSettingsSecrets,wa as createAdvisorCommandEntry,Da as createAdvisorCommandModule,ur as createAgentCommandEntry,pr as createAgentCommandModule,dr as createAgentSystemCommand,gr as createBackgroundCommandEntry,yr as createBackgroundCommandModule,yf as createClearCommandEntry,Sr as createCompactCommandEntry,Tr as createCompactCommandModule,qr as createContextCommandEntry,Xr as createContextCommandModule,Cf as createCostCommandEntry,qp as createDefaultCommandModules,oi as createDevicesCommandModule,ca as createDoctorCommandEntry,pa as createDoctorCommandModule,_a as createEditorCommandEntry,ba as createEditorCommandModule,Ia as createEffortCommandEntry,za as createEffortCommandModule,Va as createExitCommandEntry,Wa as createExitCommandModule,po as createGitCommandEntry,_o as createGitCommandModule,Ie as createGitProcess,xo as createGoalCommandEntry,wo as createGoalCommandModule,ko as createHandoffCommandEntry,Mo as createHandoffCommandModule,Po as createHelpCommandEntry,Lo as createHelpCommandModule,Ro as createKeybindingsCommandEntry,Vo as createKeybindingsCommandModule,Wo as createLanguageCommandEntry,qo as createLanguageCommandModule,Qd as createLoopCommandEntry,Ss as createMCPActivationCommandEntry,Es as createMCPActivationCommandModule,Rs as createMemoryCommandEntry,Vs as createMemoryCommandModule,qs as createModeCommandEntry,Xs as createModeCommandModule,ac as createModelCommandEntry,cc as createModelCommandModule,Zd as createMonitorCommandEntry,di as createNodeDoctorDeps,Cc as createOutputStyleCommandEntry,Ec as createOutputStyleCommandModule,Jc as createPermissionsCommandEntry,Zc as createPermissionsCommandModule,rl as createPlanCommandModule,vl as createPluginCommandEntry,Cl as createPluginCommandModule,Ml as createPresetCommandEntry,Fl as createPresetCommandModule,Fu as createProviderCommandEntry,Ru as createProviderCommandModule,Il as createProviderSetupFlow,yl as createReloadPluginsCommandEntry,Yu as createRemoteControlCommandEntry,Qu as createRemoteControlCommandModule,bf as createRenameCommandEntry,ed as createResetCommandEntry,rd as createResetCommandModule,Sf as createResumeCommandEntry,Sd as createRewindCommandModule,_c as createSandboxCommandModule,Xd as createScheduleCommandEntry,rf as createScheduleCommandModule,Mf as createSessionCommandModule,Nf as createSettingsCommandEntry,If as createSettingsCommandModule,Bf as createShellCommandEntry,Uf as createShellCommandModule,$f as createSkillsCommandEntry,np as createSkillsCommandModule,op as createStatusLineCommandEntry,lp as createStatusLineCommandModule,Jp as createTerminalClientCommands,vp as createThemeCommandEntry,bp as createThemeCommandModule,Hp as createUserLocalCommandEntry,Gp as createUserLocalCommandModule,wf as createValidateSessionCommandEntry,Hi as doctorRepairAllowlist,Vu as ensureProviderConfig,Ca as executeAdvisorCommand,or as executeAgentCommand,hr as executeBackgroundCommand,lf as executeClearCommand,xr as executeCompactCommand,Rr as executeContextCommand,_f as executeCostCommand,ga as executeEditorCommand,Pa as executeEffortCommand,Ba as executeExitCommand,mo as executeGitCommand,bo as executeGoalCommand,Do as executeHandoffCommand,No as executeHelpCommand,Uo as executeLanguageCommand,Id as executeLoopCommand,ds as executeMCPActivationCommand,Ls as executeMemoryCommand,Ks as executeModeCommand,$s as executeModelCommand,Jd as executeMonitorCommand,Sc as executeOutputStyleCommand,Ws as executePermissionsCommand,gl as executePluginCommand,Al as executePresetCommand,Ou as executeProviderCommand,_l as executeReloadPluginsCommand,Ju as executeRemoteControlCommand,uf as executeRenameCommand,$u as executeResetCommand,df as executeResumeCommand,vd as executeRewindCommand,fc as executeSandboxCommand,Kd as executeScheduleCommand,zf as executeShellCommand,Qf as executeSkillsCommand,ap as executeStatusLineCommand,_p as executeThemeCommand,Vp as executeUserLocalCommand,Bp as executeUserLocalDirectCommand,vf as executeValidateSessionCommand,Wl as formatProviderSetupChoiceLabel,Gl as formatProviderSetupHelpLinks,Hl as formatProviderSetupPromptLabel,Ll as formatProviderSetupSelectionPrompt,uc as formatSandboxStatus,zl as getProviderSetupStep,nt as gitEnvironment,Ui as isDoctorRepairId,Qo as mcpUnavailableServersNotice,Jo as mcpUserActionCommand,Zo as mcpUserActionNotice,Vd as parseScheduleSpec,Ki as planDoctorRepair,xi as redactDiagnosticText,hi as renderDoctorReport,ui as resolveCommandOnPath,ma as resolveEditor,Rl as resolveProviderSetupSelection,Lf as resolveShell,sa as runDoctor,Vl as runProviderSetupPromptFlow,Bu as runProviderStartupSetup,N as spawnInherited,Bl as submitProviderSetupValue,ql as validateProviderSetupValue};
|
|
119
119
|
//# sourceMappingURL=index.js.map
|