@robota-sdk/agent-cli 3.0.0-beta.65 → 3.0.0-beta.67

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/dist/node/bin.js CHANGED
@@ -1,5 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import{execSync as e,fork as t}from"node:child_process";import{existsSync as n,lstatSync as r,mkdirSync as i,readFileSync as a,unlinkSync as o,writeFileSync as s}from"node:fs";import{dirname as c,isAbsolute as l,join as u,resolve as d}from"node:path";import{fileURLToPath as f}from"node:url";import{BundlePluginInstaller as p,BundlePluginLoader as m,DEFAULT_STATUS_LINE_COMMAND_SETTINGS as h,InteractiveSession as g,MarketplaceClient as _,PluginCommandSource as v,PluginSettingsStore as y,buildProviderSetupPatch as ee,checkSettingsDocument as b,createProjectSessionStore as te,findProviderDefinition as ne,getBuiltInAgent as re,mergeProviderPatch as ie,projectPaths as ae,readMergedProviderSettingsFromPaths as oe,readMergedProviderSettingsFromPaths as se,resolveActiveProvider as ce,resolveLatestSessionId as le,resolveSessionIdByIdOrName as ue,setCurrentProvider as de}from"@robota-sdk/agent-framework";import{createAgentCommandModule as fe,createBackgroundCommandModule as pe,createCompactCommandModule as me,createContextCommandModule as he,createExitCommandModule as ge,createHelpCommandModule as _e,createLanguageCommandModule as ve,createMemoryCommandModule as ye,createModeCommandModule as be,createModelCommandModule as xe,createPermissionsCommandModule as Se,createPluginCommandModule as Ce,createProviderCommandModule as we,createResetCommandModule as Te,createRewindCommandModule as Ee,createSessionCommandModule as De,createSettingsCommandModule as Oe,createSkillsCommandModule as ke,createStatusLineCommandModule as Ae,createUserLocalCommandModule as je,executeUserLocalDirectCommand as Me,formatProviderSetupSelectionPrompt as Ne,resolveProviderSetupSelection as Pe,runProviderSetupPromptFlow as Fe}from"@robota-sdk/agent-command";import{parseArgs as Ie}from"node:util";import{BackgroundTaskError as x,createBackgroundTaskLogPage as Le,createDefaultBackgroundTaskRunners as Re,createGitWorktreeIsolationAdapter as ze,createProviderFromConfig as Be,createWorktreeSubagentRunner as Ve}from"@robota-sdk/agent-executor";import{createAnthropicProviderDefinition as He}from"@robota-sdk/agent-provider/anthropic";import{createDeepSeekProviderDefinition as Ue}from"@robota-sdk/agent-provider/deepseek";import{createGemmaProviderDefinition as We}from"@robota-sdk/agent-provider/gemma";import{createGeminiProviderDefinition as Ge}from"@robota-sdk/agent-provider/gemini";import{createOpenAIProviderDefinition as Ke}from"@robota-sdk/agent-provider/openai";import{createQwenProviderDefinition as qe}from"@robota-sdk/agent-provider/qwen";import{formatSupportedProviderTypes as Je}from"@robota-sdk/agent-core";import{createHeadlessTransport as Ye}from"@robota-sdk/agent-transport/headless";import{WsTransport as Xe}from"@robota-sdk/agent-transport/ws";import{TuiTransport as Ze}from"@robota-sdk/agent-transport/tui";import{homedir as S}from"node:os";const C=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],w=[`text`,`json`,`stream-json`];function Qe(){process.stdout.write(`
2
+ import{applyProviderConfiguration as e,applyProviderSwitch as t,checkForCliUpdate as n,createAgentRuntime as r,createProjectSessionStore as i,createProviderFromSettings as a,formatCliUpdateCheckMessage as o,formatCliUpdateNotice as s,getStartupCliUpdateNotice as c,getUserSettingsPath as l,projectPaths as u,readMergedProviderSettings as d,readPackageVersion as f,readProviderSettings as p,readSettings as m,resetUserConfig as ee,resolveLatestSessionId as h,resolveProviderSettingsWriteTargetPath as g,resolveSessionIdByIdOrName as _,resolveSettingsPathForScope as v,shouldRunStartupCliUpdateCheck as te,writeSettings as y}from"@robota-sdk/agent-framework";import{createDefaultTransportRegistry as ne}from"@robota-sdk/agent-transport";import{PrintTerminal as b,createHeadlessTransport as x,promptInput as S}from"@robota-sdk/agent-transport/headless";import{readFileSync as C}from"node:fs";import{resolve as w}from"node:path";import{execSync as T}from"node:child_process";import{TuiTransport as E,createDefaultTuiCliAdapter as D}from"@robota-sdk/agent-transport/tui";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as j,reloadPluginCommandSource as M,runProviderStartupSetup as N}from"@robota-sdk/agent-command";import{createDefaultProviderDefinitions as P}from"@robota-sdk/agent-provider";import{formatSupportedProviderTypes as F}from"@robota-sdk/agent-core";import{parseArgs as I}from"node:util";import{createChildProcessSubagentRunnerFactory as L}from"@robota-sdk/agent-subagent-runner";function R(e,t){let n=C(w(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function z(e,t){let n=[];return t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile&&n.push(R(e,t.taskFile)),t.jsonSchema&&n.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),n.length>0?n.join(`
3
+
4
+ `):void 0}const B=`robota-cli`;function V(){return e=>T(e,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd()}async function H(e){let t=e.positional.join(` `).trim();if(!t&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);t=Buffer.concat(e).toString(`utf-8`).trim()}return t||(process.stderr.write(`Print mode (-p) requires a prompt argument.
5
+ `),process.exit(1)),t}async function U(e,t){let n=await H(e),r=z(t.cwd,e),i=V(),a=t.createSession({permissionMode:e.permissionMode??`bypassPermissions`,maxTurns:e.maxTurns,sessionStore:e.noSessionPersistence?void 0:t.sessionStore,sessionName:e.sessionName,bare:e.bare||void 0,allowedTools:e.allowedTools?e.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:r,systemPrompt:e.systemPrompt,shellExec:i,agentName:B}),o=x({outputFormat:e.outputFormat??`text`,prompt:n});a.attachTransport(o),await o.start(),await a.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(o.getExitCode())}async function W(e){let{runtime:t,version:n,commandSetup:r,providerSetup:i,sessionSetup:a,sessionOpts:o,startupUpdateNotice:s}=e;await new E({runtime:t,providerOverride:i.activeProfileName,providerType:i.providerSettings.name,modelId:i.modelId,language:o.language,permissionMode:o.permissionMode,maxTurns:o.maxTurns,version:n,resumeSessionId:a.resumeSessionId,showSessionPickerOnStart:a.showSessionPickerOnStart,forkSession:o.forkSession,sessionName:o.sessionName,shellExec:V(),startupUpdateNotice:s,cliAdapter:D({providerDefinitions:r.providerDefinitions,reloadPluginCommandSource:r.reloadPluginCommandSource}),agentName:B}).start()}function G(e){return{configure:e.configure,provider:e.provider,settingsScope:e.settingsScope,configureProvider:e.configureProvider,providerType:e.providerType,model:e.model,apiKey:e.apiKey,apiKeyEnv:e.apiKeyEnv,baseURL:e.baseURL,setCurrent:e.setCurrent,printMode:e.printMode,positional:e.positional}}function K(e){return{positional:e.positional,language:e.language,permissionMode:e.permissionMode,maxTurns:e.maxTurns,sessionName:e.sessionName,noSessionPersistence:e.noSessionPersistence,continueMode:e.continueMode,resumeId:e.resumeId,forkSession:e.forkSession,outputFormat:e.outputFormat,bare:e.bare,allowedTools:e.allowedTools,systemPrompt:e.systemPrompt,appendSystemPrompt:e.appendSystemPrompt,taskFile:e.taskFile,jsonSchema:e.jsonSchema}}function q(e){return{positional:e.positional,format:e.format,summary:e.summary,source:e.source}}function re(e){return{printMode:e.printMode,disableUpdateCheck:e.disableUpdateCheck}}function J(e,t={}){let n={settings:{read:()=>m(l()),write:e=>y(l(),e)},plugin:k(e)},r=t.providerDefinitions??P();return{commandHostAdapters:n,providerDefinitions:r,commandModules:[...O({cwd:e,providerDefinitions:r,providerSettingsAdapter:{readMergedSettings:()=>d(e),readTargetSettings:()=>m(g(e)),writeTargetSettings:t=>y(g(e),t)}}),...t.commandModules??[]],reloadPluginCommandSource:M}}function Y(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function X(n,r,i,a){let o=v(n,Y(r.settingsScope));return r.configureProvider?(e(o,oe(r),{providerDefinitions:a}),i.writeLine(`Provider profile saved to ${o}`),!r.printMode&&r.positional.length===0):r.provider&&r.setCurrent?(t(r.settingsScope===void 0?g(n):o,r.provider,{knownProviders:d(n).providers}),i.writeLine(`Current provider set to ${r.provider}`),!r.printMode&&r.positional.length===0):!1}async function ie(e,t,n,r,i,a){await A(e,{provider:t.provider,settingsScope:Y(t.settingsScope)},n,r,i,{formatError:se,isInteractive:()=>a})}async function ae(e,t,n,r,i){await N(e,{settingsScope:Y(t.settingsScope)},n,r,i)}function oe(e){let t=e.providerType??e.configureProvider;if(!e.configureProvider||!t)throw Error(`--configure-provider requires a provider profile and --type`);return{profile:e.configureProvider,type:t,...e.model!==void 0&&{model:e.model},...e.apiKey!==void 0&&{apiKey:e.apiKey},...e.apiKeyEnv!==void 0&&{apiKeyEnv:e.apiKeyEnv},...e.baseURL!==void 0&&{baseURL:e.baseURL},setCurrent:e.setCurrent}}function se(e){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${F(e)}`,...e.map(ce)].join(`
6
+ `)}function ce(e){return` ${[`robota --configure-provider ${e.type}`,`--type ${e.type}`,...e.defaults?.baseURL===void 0?[]:[`--base-url <url>`],`--model <model>`,...e.requiresApiKey===!0?[`--api-key-env <ENV_NAME>`]:[],`--set-current`].join(` `)}`}async function le(e,t,n,r,i){return t.configure?(await ae(e,t,S,r,n.providerDefinitions),{handled:!0}):X(e,t,r,n.providerDefinitions)?{handled:!0}:(await ie(e,t,S,r,n.providerDefinitions,i),{handled:!1})}const Z=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],Q=[`text`,`json`,`stream-json`];function ue(){return`
3
7
  Usage: robota [options] [-p <prompt>]
4
8
 
5
9
  Options:
@@ -27,21 +31,6 @@ Examples:
27
31
  robota -p "Hello" Print mode: send prompt and exit
28
32
  robota -p "Hello" --output-format json
29
33
  robota --continue Resume the last session
30
- `)}function $e(e){if(e!==void 0)return w.includes(e)||(process.stderr.write(`Invalid --output-format "${e}". Valid: ${w.join(` | `)}\n`),process.exit(1)),e}function et(e){if(e!==void 0)return C.includes(e)||(process.stderr.write(`Invalid --permission-mode "${e}". Valid: ${C.join(` | `)}\n`),process.exit(1)),e}function tt(e){if(e===void 0)return;let t=parseInt(e,10);return(isNaN(t)||t<=0)&&(process.stderr.write(`Invalid --max-turns "${e}". Must be a positive integer.\n`),process.exit(1)),t}function nt(){let{values:e,positionals:t}=Ie({allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},model:{type:`string`},language:{type:`string`},"permission-mode":{type:`string`},"max-turns":{type:`string`},"fork-session":{type:`boolean`,default:!1},name:{type:`string`,short:`n`},"output-format":{type:`string`},format:{type:`string`},summary:{type:`string`},source:{type:`string`},"system-prompt":{type:`string`},"append-system-prompt":{type:`string`},"task-file":{type:`string`},version:{type:`boolean`,default:!1},reset:{type:`boolean`,default:!1},bare:{type:`boolean`,default:!1},"allowed-tools":{type:`string`},"no-session-persistence":{type:`boolean`,default:!1},"json-schema":{type:`string`},configure:{type:`boolean`,default:!1},"configure-provider":{type:`string`},provider:{type:`string`},type:{type:`string`},"base-url":{type:`string`},"api-key":{type:`string`},"api-key-env":{type:`string`},"set-current":{type:`boolean`,default:!1},"settings-scope":{type:`string`},"check-update":{type:`boolean`,default:!1},"disable-update-check":{type:`boolean`,default:!1}}});return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,model:e.model,language:e.language,permissionMode:et(e[`permission-mode`]),maxTurns:tt(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:$e(e[`output-format`]),format:e.format,summary:e.summary,source:e.source,systemPrompt:e[`system-prompt`],appendSystemPrompt:e[`append-system-prompt`],taskFile:e[`task-file`],version:e.version??!1,reset:e.reset??!1,bare:e.bare??!1,allowedTools:e[`allowed-tools`],noSessionPersistence:e[`no-session-persistence`]??!1,jsonSchema:e[`json-schema`],configure:e.configure??!1,configureProvider:e[`configure-provider`],provider:e.provider,providerType:e.type,baseURL:e[`base-url`],apiKey:e[`api-key`],apiKeyEnv:e[`api-key-env`],setCurrent:e[`set-current`]??!1,settingsScope:e[`settings-scope`],checkUpdate:e[`check-update`]??!1,disableUpdateCheck:e[`disable-update-check`]??!1}}function T(){return u(process.env.HOME??process.env.USERPROFILE??`/`,`.robota`,`settings.json`)}function E(e){if(!n(e))return{};let t=a(e,`utf8`);try{return JSON.parse(t)}catch{return process.stderr.write(`Warning: corrupt settings file at ${e}, resetting to defaults\n`),{}}}function D(e,t){i(c(e),{recursive:!0}),s(e,JSON.stringify(t,null,2)+`
31
- `,`utf8`)}function O(e){return n(e)?(o(e),!0):!1}const k=[He(),Ke(),Ge(),We(),qe(),Ue()];function A(e){let t=rt();return[u(t,`.robota`,`settings.json`),u(t,`.claude`,`settings.json`),u(e,`.robota`,`settings.json`),u(e,`.robota`,`settings.local.json`),u(e,`.claude`,`settings.json`),u(e,`.claude`,`settings.local.json`)]}function rt(){return process.env.HOME??process.env.USERPROFILE??`/`}function j(e){return oe(A(e))}function M(e,t={}){let n=ce(j(e),t.providerOverride,N(t));if(n!==void 0)return n;throw Error("No provider configuration found. Run `robota` to set up.")}function it(e,t,n={}){let r=N(n),i=M(e,{...n,providerDefinitions:r}),a=t??i.model;return Be({...i,model:a},r)}function N(e){return e.providerDefinitions??k}function P(e,t={}){let n=t.settingsPaths??A(e),r=lt(n)??n[0];if(r===void 0)throw Error(`No settings path available for provider update`);return r}function F(e){return E(e)}function I(e,t,n={}){let r=ie(F(e),ee(t,n));return D(e,r),r}function at(e,t,n={}){let r=F(e),i=r.providers?.[t]!==void 0,a=n.knownProviders?.[t]!==void 0,o=i||a?{...r,currentProvider:t}:de(r,t);return D(e,o),o}function ot(e,t,n={}){let r=n.settingsPaths??A(e),i=se(r),a=n.providerOverride??i.currentProvider;if(typeof a!=`string`)throw Error(`Cannot update model: no active provider profile. Set "currentProvider" in settings.`);return st(r,a,t)}function st(e,t,n){let r=ct(e,t)??e[0];if(r===void 0)throw Error(`No settings path available for model update`);let i=F(r),a=i.providers??{},o=a[t]??{},s={...i,providers:{...a,[t]:{...o,model:n}}};return D(r,s),{settingsPath:r,settings:s,profileName:t}}function ct(e,t){for(let n=e.length-1;n>=0;--n){let r=e[n];if(r!==void 0&&F(r).providers?.[t]!==void 0)return r}}function lt(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&F(n).currentProvider!==void 0)return n}}function L(e,t){if(t===void 0||t===`user`)return T();if(t===`project-local`)return u(e,`.robota`,`settings.local.json`);throw Error(`Invalid --settings-scope "${t}". Valid: user | project-local`)}function ut(e,t,n=k){let r=L(e,t.settingsScope);return t.configureProvider?(I(r,ft(t),{providerDefinitions:n}),process.stdout.write(`Provider profile saved to ${r}\n`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(at(t.settingsScope===void 0?P(e):r,t.provider,{knownProviders:j(e).providers}),process.stdout.write(`Current provider set to ${t.provider}\n`),!t.printMode&&t.positional.length===0):!1}async function dt(e,t,n,r=k){let i=j(e);if(b(t.provider===void 0?i:{...i,currentProvider:t.provider},r)===`valid`)return;if(!ht())throw Error(z(r));await R(e,pt(e,t),n,r);let a=j(e);if(b(t.provider===void 0?a:{...a,currentProvider:t.provider},r)!==`valid`)throw Error(z(r))}async function R(e,t,n,r=k){let i=Pe(await n(Ne(r)),r),a=L(e,t.settingsScope);I(a,await Fe(i,n,r,{existingProfileNames:Object.keys(j(e).providers??{})}),{providerDefinitions:r});let o=await n(` Response language (ko/en/ja/zh, default: en): `);if(o){let e=E(a);e.language=o,D(a,e)}process.stdout.write(`\n Config saved to ${a}\n\n`)}function ft(e){let t=e.providerType??e.configureProvider;if(!e.configureProvider||!t)throw Error(`--configure-provider requires a provider profile and --type`);return{profile:e.configureProvider,type:t,...e.model!==void 0&&{model:e.model},...e.apiKey!==void 0&&{apiKey:e.apiKey},...e.apiKeyEnv!==void 0&&{apiKeyEnv:e.apiKeyEnv},...e.baseURL!==void 0&&{baseURL:e.baseURL},setCurrent:e.setCurrent}}function pt(e,t){if(t.settingsScope!==void 0||t.provider!==void 0)return t;let n=mt(A(e));if(n===void 0)return t;let r=u(e,`.robota`,`settings.json`),i=u(e,`.robota`,`settings.local.json`);return n===r||n===i?{...t,settingsScope:`project-local`}:t}function mt(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n!==void 0&&typeof E(n).currentProvider==`string`)return n}}function ht(){return process.stdin.isTTY===!0&&process.stdout.isTTY===!0}function z(e=k){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${Je(e)}`,...e.map(gt)].join(`
32
- `)}function gt(e){return` ${[`robota --configure-provider ${e.type}`,`--type ${e.type}`,...e.defaults?.baseURL===void 0?[]:[`--base-url <url>`],`--model <model>`,...e.requiresApiKey===!0?[`--api-key-env <ENV_NAME>`]:[],`--set-current`].join(` `)}`}var _t=class{entries=new Map;settingsPath;constructor(e){this.settingsPath=e}register(e){this.entries.set(e.name,e)}getAll(){let e=this.readTransportSettings();return Array.from(this.entries.values()).map(t=>({transport:t,config:this.resolveConfig(t,e[t.name])}))}getEnabled(){return this.getAll().filter(e=>e.config.enabled).map(e=>e.transport)}async setEnabled(e,t){let n=E(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},enabled:t},n.transports=r,D(this.settingsPath,n)}async setOptions(e,t){let n=E(this.settingsPath),r=n.transports??{};r[e]={...r[e]??{},options:t},n.transports=r,D(this.settingsPath,n)}async startAll(e){let t=this.getEnabled();for(let n of t)n.attach(e),await n.start()}async stopAll(){for(let e of this.entries.values())await e.stop()}resolveConfig(e,t){return{enabled:t?.enabled??e.defaultEnabled,options:t?.options??{}}}readTransportSettings(){let e=E(this.settingsPath).transports;return!e||typeof e!=`object`||Array.isArray(e)?{}:e}};function vt(e){return typeof e==`object`&&!!e}function B(e,t){return typeof e[t]==`string`}function yt(e){if(!vt(e)||!B(e,`type`))return!1;switch(e.type){case`ready`:return!0;case`text_delta`:return B(e,`delta`);case`tool_start`:return B(e,`toolName`);case`tool_end`:return B(e,`toolName`)&&typeof e.success==`boolean`;case`result`:return B(e,`output`);case`error`:return B(e,`message`);case`cancelled`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}function bt(e,t,n,r,i){switch(e.type){case`ready`:t();break;case`result`:n(e.output);break;case`error`:r(new x(`runner`,e.message));break;case`cancelled`:r(new x(`runner`,e.reason??`Subagent worker cancelled`));break;case`text_delta`:i?.({type:`background_task_text_delta`,delta:e.delta});break;case`tool_start`:i?.({type:`background_task_tool_start`,toolName:e.toolName,firstArg:xt(e.toolArgs)});break;case`tool_end`:i?.({type:`background_task_tool_end`,toolName:e.toolName,success:e.success});break;default:r(new x(`runner`,`Unhandled subagent worker message`))}}function xt(e){if(!e)return;let t=Object.values(e)[0];if(t!==void 0)return typeof t==`object`?JSON.stringify(t):String(t)}function V(e,t){return new Promise((n,r)=>{if(!e.connected){r(new x(`crash`,`Subagent worker IPC channel is closed`));return}e.send(t,e=>{if(e){r(e);return}n()})})}async function H(e,t){e.child.connected&&await V(e.child,{type:`cancel`,reason:t}).catch(()=>void 0),e.killTimer=setTimeout(()=>{e.child.killed||e.child.kill(`SIGTERM`)},e.killGraceMs)}function St(e){return new Promise((t,n)=>{new Ct(e,t,n).start()})}var Ct=class{options;resolve;reject;settled=!1;started=!1;timeoutTimer;constructor(e,t,n){this.options=e,this.resolve=t,this.reject=n,this.timeoutTimer=Tt(this.options.runtime,e=>this.rejectOnce(e))}start(){let{child:e}=this.options.runtime;e.on(`message`,this.onMessage),e.on(`error`,this.onError),e.on(`exit`,this.onExit),e.once(`spawn`,()=>{setImmediate(this.startWorker)})}startWorker=()=>{if(this.started)return;this.started=!0;let{child:e}=this.options.runtime;V(e,{type:`start`,payload:this.options.payload}).catch(e=>{this.rejectOnce(e instanceof Error?e:Error(String(e)))})};onMessage=e=>{if(!yt(e)){this.rejectOnce(new x(`runner`,`Received malformed subagent worker message`));return}let{job:t}=this.options.runtime;bt(e,this.startWorker,this.resolveOnce,this.rejectOnce,t.emit)};onError=e=>{this.rejectOnce(new x(`crash`,e.message))};onExit=(e,t)=>{this.settled||this.rejectOnce(new x(`crash`,Dt(e,t)))};resolveOnce=e=>{if(this.settled)return;this.settled=!0,this.clearTimers(),this.cleanup();let{runtime:t,resolveTranscriptPath:n}=this.options;this.resolve(Et(t.job,e,n))};rejectOnce=e=>{this.settled||(this.settled=!0,this.clearTimers(),this.cleanup(),this.reject(e))};clearTimers(){this.timeoutTimer&&clearTimeout(this.timeoutTimer),this.options.runtime.killTimer&&clearTimeout(this.options.runtime.killTimer)}cleanup(){let{child:e}=this.options.runtime;e.off(`message`,this.onMessage),e.off(`error`,this.onError),e.off(`exit`,this.onExit)}};function wt(e){let t=!1,n=()=>{};return{promise:new Promise((e,t)=>{n=t}),reject(r){t||(t=!0,n(new x(`runner`,r??`Subagent job cancelled: ${e}`)))}}}function Tt(e,t){if(e.job.request.timeoutMs)return setTimeout(()=>{H(e,`Subagent worker timed out`),t(new x(`timeout`,`Subagent worker timed out`))},e.job.request.timeoutMs)}function Et(e,t,n){let r=n(e);return{jobId:e.jobId,output:t,...r?{metadata:{transcriptPath:r,logPath:r}}:{}}}function Dt(e,t){return`Subagent worker exited before result: ${t===null?`exit code ${e===null?`unknown`:e}`:`signal ${t}`}`}function Ot(e={}){return t=>{let n=new kt(t,e);return e.worktreeIsolation===!1?n:Ve({runner:n,worktreeAdapter:e.worktreeAdapter??ze(),hooks:t.config.hooks,hookTypeExecutors:t.hookTypeExecutors})}}var kt=class{deps;workerPath;execArgv;killGraceMs;providerConfig;env;logsDir;constructor(e,t={}){this.deps=e,this.workerPath=t.workerPath??Nt(),this.execArgv=t.execArgv,this.killGraceMs=t.killGraceMs??2e3,this.providerConfig=t.providerConfig,this.env=t.env,this.logsDir=t.logsDir}start(e){let n=t(this.workerPath,[],{cwd:e.request.cwd,env:{...process.env,...this.env??{}},execArgv:this.execArgv??Pt(this.workerPath),stdio:[`ignore`,`ignore`,`ignore`,`ipc`]}),r={job:e,child:n,killGraceMs:this.killGraceMs},i=St({runtime:r,payload:this.createStartPayload(e),resolveTranscriptPath:e=>this.resolveTranscriptPath(e)}),a=wt(e.jobId);i.catch(()=>void 0);let o=Promise.race([i,a.promise]),s=this.resolveTranscriptPath(e);return{jobId:e.jobId,...n.pid!==void 0&&{pid:n.pid},...s!==void 0&&{transcriptPath:s,logPath:s},result:o,cancel:async e=>{a.reject(e),await H(r,e)},send:async e=>{await V(n,{type:`send`,prompt:e})},...s!==void 0&&{readLog:async t=>Ft(e.jobId,s,t)}}}createStartPayload(e){let t=At(e.request.type,this.deps.customAgentRegistry);return{jobId:e.jobId,request:e.request,agentDefinition:jt(t,e),parentConfig:this.deps.config,parentContext:this.deps.context,providerProfile:Mt(this.providerConfig,this.deps,e),permissionMode:this.deps.permissionMode,...this.logsDir?{logsDir:this.logsDir}:{}}}resolveTranscriptPath(e){if(this.logsDir)return u(this.logsDir,e.request.parentSessionId,`subagents`,`${e.jobId}.jsonl`)}};function At(e,t){let n=t?.(e)??re(e);if(!n)throw new x(`validation`,`Unknown agent type: ${e}`);return n}function jt(e,t){return{...e,...t.request.model?{model:t.request.model}:{},...t.request.allowedTools?{tools:t.request.allowedTools}:{},...t.request.disallowedTools?{disallowedTools:t.request.disallowedTools}:{}}}function Mt(e,t,n){let r=e??t.config.provider;return{profileName:t.config.currentProvider,type:r.name,model:n.request.model??r.model,apiKey:r.apiKey,baseURL:r.baseURL,timeout:r.timeout,options:r.options}}function Nt(){let e=process.argv[1]??``,t=e?c(e):process.cwd(),r=e.endsWith(`.ts`)||e.endsWith(`.tsx`)?`.ts`:`.js`,i=[u(t,`subagents`,`child-process-subagent-worker${r}`),u(t,`child-process-subagent-worker${r}`)];for(let e of i)if(n(e))return e;return i[0]}function Pt(e){return!e.endsWith(`.ts`)||process.execArgv.some(e=>e.includes(`tsx`))?process.execArgv:[...process.execArgv,`--import`,`tsx`]}function Ft(e,t,r){return n(t)?Le(e,a(t,`utf8`).split(/\r?\n/).filter(Boolean),r):{taskId:e,cursor:r,lines:[]}}function It(e,t){let n=U(e),r=U(t);if(n===void 0||r===void 0)return Math.sign(e.localeCompare(t));let i=G(n.major,r.major)||G(n.minor,r.minor)||G(n.patch,r.patch);return i===0?Rt(n.prerelease,r.prerelease):i}function Lt(e,t){return It(e,t)>0}function U(e){let[t,n]=(e.trim().replace(/^v/,``).split(`+`)[0]??``).split(`-`,2),[r,i,a]=t.split(`.`),o=W(r),s=W(i),c=W(a);if(!(o===void 0||s===void 0||c===void 0))return{major:o,minor:s,patch:c,prerelease:n?n.split(`.`):[]}}function W(e){if(!(e===void 0||!/^\d+$/.test(e)))return Number(e)}function G(e,t){return Math.sign(e-t)}function Rt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return 1;if(t.length===0)return-1;let n=Math.max(e.length,t.length);for(let r=0;r<n;r+=1){let n=e[r],i=t[r];if(n===void 0)return-1;if(i===void 0)return 1;let a=zt(n,i);if(a!==0)return a}return 0}function zt(e,t){let n=W(e),r=W(t);return n!==void 0&&r!==void 0?G(n,r):n===void 0?r===void 0?Math.sign(e.localeCompare(t)):1:-1}function Bt(e=process.env.HOME??process.env.USERPROFILE??`/`){return u(e,`.robota`,`update-check.json`)}function Vt(e){if(n(e))try{return Xt(JSON.parse(a(e,`utf8`)))}catch{return}}function Ht(e,t){i(c(e),{recursive:!0}),s(e,JSON.stringify(t,null,2)+`
33
- `,`utf8`)}async function K(e){if(e.disabled===!0)return{status:`skipped`,reason:`disabled`};let t=e.packageName??`@robota-sdk/agent-cli`,n=e.cachePath??Bt(),r=e.now??new Date,i=e.ttlMs??864e5;if(e.force!==!0){let a=Vt(n);if(a!==void 0&&qt(a,r,i,t))return Kt(a,e.currentVersion)}try{let i=await Jt({fetchImpl:e.fetchImpl??fetch,packageName:t,registryUrl:e.registryUrl??`https://registry.npmjs.org`,timeoutMs:e.timeoutMs??1500});return q(n,{packageName:t,checkedAt:r.toISOString(),currentVersion:e.currentVersion,latestVersion:i}),Y(e.currentVersion,i)}catch(i){let a=i instanceof Error?i.message:String(i);return q(n,{packageName:t,checkedAt:r.toISOString(),currentVersion:e.currentVersion,errorMessage:a}),{status:`error`,errorMessage:a}}}function q(e,t){try{Ht(e,t)}catch{}}async function Ut(e){let t=await K(e);return t.status===`update_available`?t.notice:void 0}function Wt(e){return e.printMode===!1&&e.disableUpdateCheck===!1}function J(e){return[`Robota update available: ${e.currentVersion} -> ${e.latestVersion}.`,`Run ${e.installCommand}`].join(` `)}function Gt(e){return e.status===`update_available`?J(e.notice):e.status===`current`?`Robota is up to date (${e.currentVersion}).`:e.status===`skipped`?`Robota update check skipped.`:`Robota update check failed: ${e.errorMessage}`}function Kt(e,t){return e.errorMessage===void 0?e.latestVersion===void 0?{status:`error`,errorMessage:`Cached update check has no latest version`}:Y(t,e.latestVersion):{status:`error`,errorMessage:e.errorMessage}}function Y(e,t){return Lt(t,e)?{status:`update_available`,notice:{currentVersion:e,latestVersion:t,installCommand:`npm install -g '@robota-sdk/agent-cli@latest'`}}:{status:`current`,currentVersion:e,latestVersion:t}}function qt(e,t,n,r){if(e.packageName!==r)return!1;let i=Date.parse(e.checkedAt);return Number.isFinite(i)?t.getTime()-i<n:!1}async function Jt(e){let t=new AbortController,n=setTimeout(()=>t.abort(),e.timeoutMs);try{let n=Yt(e.registryUrl,e.packageName),r=await e.fetchImpl(n,{headers:{accept:`application/json`},signal:t.signal});if(!r.ok)throw Error(`registry responded with HTTP ${r.status}`);let i=(await r.json())[`dist-tags`]?.latest;if(typeof i!=`string`||i.trim().length===0)throw Error(`registry metadata is missing dist-tags.latest`);return i}finally{clearTimeout(n)}}function Yt(e,t){return`${e.replace(/\/+$/,``)}/${encodeURIComponent(t)}`}function Xt(e){if(!Zt(e))return;let t=e;if(typeof t.packageName==`string`&&typeof t.checkedAt==`string`&&typeof t.currentVersion==`string`&&(t.latestVersion===void 0||typeof t.latestVersion==`string`)&&(t.errorMessage===void 0||typeof t.errorMessage==`string`))return{packageName:t.packageName,checkedAt:t.checkedAt,currentVersion:t.currentVersion,...t.latestVersion!==void 0&&{latestVersion:t.latestVersion},...t.errorMessage!==void 0&&{errorMessage:t.errorMessage}}}function Zt(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const X={...h};function Qt(e){let t=e.statusline;return en(t)?{enabled:typeof t.enabled==`boolean`?t.enabled:X.enabled,gitBranch:typeof t.gitBranch==`boolean`?t.gitBranch:X.gitBranch}:{...X}}function $t(e,t){let n=E(e),r={...Qt(n),...t};return n.statusline=r,D(e,n),r}function en(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!(e instanceof Date)}function tn(e){try{let t=nn(e);if(!t)return;let n=a(u(t,`HEAD`),`utf8`).trim();if(!n)return;if(n.startsWith(`ref: `)){let e=n.slice(5).trim();return e.startsWith(`refs/heads/`)?e.slice(11):e}return n.slice(0,7)}catch{return}}function nn(e){let t=d(e),n=c(t);for(;n!==t;){let e=Z(u(t,`.git`),t);if(e)return e;t=n,n=c(t)}return Z(u(t,`.git`),t)}function Z(e,t){if(!n(e))return;let i=r(e);if(i.isDirectory())return e;if(!i.isFile())return;let o=a(e,`utf8`).trim();if(!o.startsWith(`gitdir:`))return;let s=o.slice(7).trim();return l(s)?s:d(t,s)}const Q=`plugin`;function rn(){return process.env.HOME??S()}function $(e){let t=new m(u(rn(),`.robota`,`plugins`));try{let n=t.loadPluginsSync();return n.length===0?(e.replaceSource(Q),0):(e.replaceSource(Q,new v(n)),n.length)}catch{return e.replaceSource(Q),0}}function an(t){let n=S(),r=u(n,`.robota`,`plugins`),i=u(n,`.robota`,`settings.json`),a=(t,n)=>e(t,{timeout:n.timeout,stdio:n.stdio??`pipe`}),o=new y(i),s=new _({pluginsDir:r,exec:a});return{cwd:t,marketplace:s,installer:new p({pluginsDir:r,settingsStore:o,marketplaceClient:s,exec:a}),loader:new m(r),settingsStore:o}}async function on(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 sn(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 cn(t,n,r){let[i,a]=n.split(`@`);if(!i||!a)throw Error(`Plugin ID must be in format: name@marketplace`);if(r===`project`){await new p({pluginsDir:u(t.cwd,`.robota`,`plugins`),settingsStore:t.settingsStore,marketplaceClient:t.marketplace,exec:(t,n)=>e(t,{timeout:n.timeout,stdio:n.stdio??`pipe`})}).install(i,a);return}await t.installer.install(i,a)}async function ln(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 un(e){return e.marketplace.listMarketplaces().map(e=>({name:e.name,type:e.source.type}))}function dn(e){let t=an(e);return{listInstalled:()=>on(t),listAvailablePlugins:e=>sn(t,e),install:(e,n)=>cn(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=>ln(t,e),marketplaceUpdate:async e=>t.marketplace.updateMarketplace(e),marketplaceList:async()=>un(t),reloadPlugins:async()=>({loadedPluginCount:(await t.loader.loadAll()).length})}}async function fn(e,t){if(e.positional[0]!==`user-local`)return!1;let n=await Me({cwd:t,argv:e.positional.slice(1),format:e.format,summary:e.summary,source:e.source}),r=n.message.endsWith(`
34
- `)?n.message:`${n.message}\n`;return n.success||(process.stderr.write(r),process.exit(1)),process.stdout.write(r),!0}function pn(){return[{label:`plan`,value:`plan`,description:`Plan only, no execution`},{label:`default`,value:`default`,description:`Ask before risky actions`},{label:`acceptEdits`,value:`acceptEdits`,description:`Auto-approve file edits`},{label:`bypassPermissions`,value:`bypassPermissions`,description:`Skip all permission checks`}]}function mn(){return[{label:`ko Korean`,value:`ko`,description:`한국어`},{label:`en English`,value:`en`,description:`English`},{label:`ja Japanese`,value:`ja`,description:`日本語`},{label:`zh Chinese`,value:`zh`,description:`中文`}]}function hn(){return[{label:`current`,value:`current`,description:`Show current provider`},{label:`list`,value:`list`,description:`List available providers`},{label:`use`,value:`use`,description:`Switch to a provider`},{label:`add`,value:`add`,description:`Add a new provider`},{label:`test`,value:`test`,description:`Test provider connection`}]}const gn={agent:void 0,background:void 0,clear:{onMissingArgs:`confirm`,message:`Clear conversation history?`},compact:void 0,context:void 0,cost:void 0,exit:{onMissingArgs:`confirm`,message:`Exit the session?`},help:void 0,language:{onMissingArgs:`picker`,getItems:mn},memory:void 0,mode:{onMissingArgs:`picker`,getItems:pn},model:void 0,permissions:void 0,plugin:void 0,provider:{onMissingArgs:`picker`,getItems:hn},rename:void 0,reset:void 0,resume:void 0,rewind:void 0,settings:void 0,skills:void 0,statusline:void 0,"user-local":void 0,"validate-session":void 0};function _n(e){return gn[e]}function vn(){try{let e=c(f(import.meta.url)),t=[u(e,`..`,`..`,`package.json`),u(e,`..`,`package.json`)];for(let e of t)try{let t=a(e,`utf-8`),n=JSON.parse(t);if(n.version!==void 0&&n.name!==void 0)return n.version}catch{}return`0.0.0`}catch{return`0.0.0`}}function yn(e,t=!1){return new Promise((n,r)=>{process.stdout.write(e);let i=``,a=process.stdin,o=a.isRaw;if(!a.isTTY){r(Error(`Cannot prompt for input: stdin is not a TTY.
35
- Set your API key via environment variable instead:
36
- ANTHROPIC_API_KEY=<key> robota
37
- OPENAI_API_KEY=<key> robota`));return}a.setRawMode(!0),a.resume(),a.setEncoding(`utf8`);let s=e=>{for(let r of e)if(r===`\r`||r===`
38
- `){a.removeListener(`data`,s),a.setRawMode(o??!1),a.pause(),process.stdout.write(`
39
- `),n(i.trim());return}else r===``||r===`\b`?i.length>0&&(i=i.slice(0,-1),process.stdout.write(`\b \b`)):r===``?(a.removeListener(`data`,s),a.setRawMode(o??!1),a.pause(),process.stdout.write(`
40
- `),process.exit(0)):r.charCodeAt(0)>=32&&(i+=r,process.stdout.write(t?`*`:r))};a.on(`data`,s)})}function bn(e,t){let n=a(d(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function xn(){let e=T();O(e)?process.stdout.write(`Deleted ${e}\n`):process.stdout.write(`No user settings found.
41
- `)}function Sn({cwd:e,providerDefinitions:t}){return[ke({cwd:e}),_e(),fe(),xe({providerDefinitions:t,settings:{readMergedSettings:()=>j(e)}}),Se(),be(),ve(),pe(),ye(),je(),me(),he(),ge(),De(),Te(),Ee(),Ae(),Ce(),Oe(),we({providerDefinitions:t,settings:{readMergedSettings:()=>j(e),readTargetSettings:()=>E(P(e)),writeTargetSettings:t=>D(P(e),t)}})]}function Cn(e,t,n,r){let i={settings:{read:()=>E(T()),write:e=>D(T(),e)},plugin:dn(e)},a=n.providerDefinitions??k;return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...Sn({cwd:e,providerDefinitions:a}),...n.commandModules??[]],startupUpdateNoticePromise:Wt(t)?Ut({currentVersion:r}):void 0}}function wn(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(bn(e,t.taskFile))}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}return t.jsonSchema&&n.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),n.length>0?n.join(`
42
-
43
- `):void 0}async function Tn(t,n,r,i,a,o,s,c){let l=n.positional.join(` `).trim();if(!l&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);l=Buffer.concat(e).toString(`utf-8`).trim()}l||(process.stderr.write(`Print mode (-p) requires a prompt argument.
44
- `),process.exit(1));let u=wn(t,n);n.systemPrompt&&process.stderr.write(`Warning: --system-prompt is not yet functional and will be ignored.
45
- `);let d=new g({cwd:t,provider:r,permissionMode:n.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:n.allowedTools?n.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:u,backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),agentName:`robota-cli`}),f=Ye({outputFormat:n.outputFormat??`text`,prompt:l});d.attachTransport(f),await f.start(),await d.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(f.getExitCode())}async function En(t={}){let n=nt(),r=vn();if(n.help){Qe();return}if(n.version){process.stdout.write(`robota ${r}\n`);return}if(n.checkUpdate){let e=await K({currentVersion:r,force:!0}),t=Gt(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}if(n.reset){xn();return}let i=process.cwd();if(await fn(n,i))return;let{commandHostAdapters:a,providerDefinitions:o,commandModules:s,startupUpdateNoticePromise:c}=Cn(i,n,t,r);if(n.configure){await R(i,n,yn,o);return}if(ut(i,n,o))return;try{await dt(i,n,yn,o)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let l=n.provider?{providerOverride:n.provider,providerDefinitions:o}:{providerDefinitions:o},u=j(i);n.provider??u.currentProvider;let d=M(i,l),f=n.model??d.model,p=it(i,n.model,l),m=Re(),h=ae(i),g=Ot({providerConfig:{...d,model:f},logsDir:h.logs}),_=te(i),v,y=!1;if(n.continueMode?v=le(_,i):n.resumeId!==void 0&&(n.resumeId===``?y=!0:(v=ue(_,n.resumeId),v===void 0&&(process.stderr.write(`Session not found: ${n.resumeId}\n`),process.exit(1)))),n.printMode){await Tn(i,n,p,_,m,g,s,a);return}await new Ze({cwd:i,provider:p,providerOverride:n.provider,providerType:d.name,modelId:f,language:n.language,permissionMode:n.permissionMode,maxTurns:n.maxTurns,version:r,sessionStore:n.noSessionPersistence?void 0:_,resumeSessionId:v,showSessionPickerOnStart:y,forkSession:n.forkSession,sessionName:n.sessionName,backgroundTaskRunners:m,subagentRunnerFactory:g,commandModules:s,commandHostAdapters:a,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:c?c.then(e=>e?J(e):void 0):void 0,transportRegistry:On(),cliAdapter:Dn(o),reloadPluginCommandSource:$,agentName:`robota-cli`,resolveInteraction:_n}).start(),process.exit(0)}function Dn(e){return{getUserSettingsPath:()=>T(),readSettings:e=>E(e),writeSettings:(e,t)=>D(e,t),deleteSettings:e=>O(e),applyStatusLineSettings:(e,t)=>$t(e,t),reloadPluginCommandSource:e=>{$(e)},applyActiveModelChange:(e,t,n)=>(ot(e,t,n),{applied:!0}),getGitBranch:e=>tn(e),getProviderDisplayName:t=>ne(e,t)?.displayName??t}}function On(){let e=new _t(T());return e.register(new Xe),e}process.on(`uncaughtException`,e=>{let t=e.message??``;if(t.includes(`string-width`)||t.includes(`setCursorPosition`)||t.includes(`getStringWidth`)||t.includes(`slice`)||t.includes(`charCodeAt`)){process.stderr.write(`[robota] IME error suppressed: ${t}\n`);return}throw e}),En().catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(t+`
34
+ `}function de(e){if(e!==void 0){if(!Q.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${Q.join(` | `)}`);return e}}function fe(e){if(e!==void 0){if(!Z.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${Z.join(` | `)}`);return e}}function pe(e){if(e===void 0)return;let t=parseInt(e,10);if(isNaN(t)||t<=0)throw Error(`Invalid --max-turns "${e}". Must be a positive integer.`);return t}const me={allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},model:{type:`string`},language:{type:`string`},"permission-mode":{type:`string`},"max-turns":{type:`string`},"fork-session":{type:`boolean`,default:!1},name:{type:`string`,short:`n`},"output-format":{type:`string`},format:{type:`string`},summary:{type:`string`},source:{type:`string`},"system-prompt":{type:`string`},"append-system-prompt":{type:`string`},"task-file":{type:`string`},version:{type:`boolean`,default:!1},reset:{type:`boolean`,default:!1},bare:{type:`boolean`,default:!1},"allowed-tools":{type:`string`},"no-session-persistence":{type:`boolean`,default:!1},"json-schema":{type:`string`},configure:{type:`boolean`,default:!1},"configure-provider":{type:`string`},provider:{type:`string`},type:{type:`string`},"base-url":{type:`string`},"api-key":{type:`string`},"api-key-env":{type:`string`},"set-current":{type:`boolean`,default:!1},"settings-scope":{type:`string`},"check-update":{type:`boolean`,default:!1},"disable-update-check":{type:`boolean`,default:!1}}};function he(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,model:e.model,language:e.language,permissionMode:fe(e[`permission-mode`]),maxTurns:pe(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:de(e[`output-format`]),format:e.format,summary:e.summary,source:e.source,systemPrompt:e[`system-prompt`],appendSystemPrompt:e[`append-system-prompt`],taskFile:e[`task-file`],version:e.version??!1,reset:e.reset??!1,bare:e.bare??!1,allowedTools:e[`allowed-tools`],noSessionPersistence:e[`no-session-persistence`]??!1,jsonSchema:e[`json-schema`],configure:e.configure??!1,configureProvider:e[`configure-provider`],provider:e.provider,providerType:e.type,baseURL:e[`base-url`],apiKey:e[`api-key`],apiKeyEnv:e[`api-key-env`],setCurrent:e[`set-current`]??!1,settingsScope:e[`settings-scope`],checkUpdate:e[`check-update`]??!1,disableUpdateCheck:e[`disable-update-check`]??!1}}function ge(){let{values:e,positionals:t}=I(me);return he(e,t)}function _e(e){let t=ee();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}async function ve(e,t){if(e.help)return t.terminal.write(ue()),{handled:!0};if(e.version)return t.terminal.writeLine(`robota ${t.version}`),{handled:!0};if(e.checkUpdate){let e=await n({currentVersion:t.version,force:!0}),r=o(e);if(e.status===`error`)throw Error(r);return t.terminal.writeLine(r),{handled:!0}}return e.reset?(_e(t.terminal),{handled:!0}):{handled:!1}}function ye(e){return{subagentRunnerFactory:L({providerConfig:e.providerConfig,logsDir:e.logsDir})}}function be(e,t,n){let r=t.provider?{providerOverride:t.provider,providerDefinitions:n.providerDefinitions}:{providerDefinitions:n.providerDefinitions},i=p(e,r),o=t.model??i.model,s=a(e,t.model,r),c=t.provider??d(e).currentProvider,{subagentRunnerFactory:l}=ye({providerConfig:{...i,model:o},logsDir:u(e).logs});return{provider:s,providerSettings:i,modelId:o,activeProfileName:c,subagentRunnerFactory:l}}function $(e,t){let n=t.noSessionPersistence?void 0:i(e),r,a=!1;if(t.continueMode)r=h(n,e);else if(t.resumeId!==void 0){if(t.resumeId===``)a=!0;else if(r=_(n,t.resumeId),r===void 0)throw Error(`Session not found: ${t.resumeId}`)}return{sessionStore:n,resumeSessionId:r,showSessionPickerOnStart:a}}function xe(e,t){if(te(t))return c({currentVersion:e}).then(e=>e?s(e):void 0)}const Se=()=>f(import.meta.url);async function Ce(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await j({cwd:t,argv:e.positional.slice(1),format:e.format,summary:e.summary,source:e.source}),i=r.message.trimEnd();if(!r.success)throw Error(i);return n.writeLine(i),!0}function we(){try{return ge()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}async function Te(e={}){let t=we(),n=Se(),i=new b;if((await ve(t,{version:n,terminal:i})).handled)return;let a=process.cwd(),o=G(t),s=K(t);try{if(await Ce(q(t),a,i))return}catch(e){i.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let c=process.stdin.isTTY===!0&&process.stdout.isTTY===!0,l=J(a,e);if((await le(a,o,l,i,c)).handled)return;let u=be(a,o,l),d=$(a,s),f=r({cwd:a,provider:u.provider,commandModules:l.commandModules,commandHostAdapters:l.commandHostAdapters,reloadPluginCommandSource:l.reloadPluginCommandSource,subagentRunnerFactory:u.subagentRunnerFactory,sessionStore:d.sessionStore,transportRegistry:ne()});if(o.printMode){await U(s,f);return}await W({runtime:f,version:n,commandSetup:l,providerSetup:u,sessionSetup:d,sessionOpts:s,startupUpdateNotice:xe(n,re(t))}),process.exit(0)}process.on(`uncaughtException`,e=>{let t=e.message??``;if(t.includes(`string-width`)||t.includes(`setCursorPosition`)||t.includes(`getStringWidth`)||t.includes(`slice`)||t.includes(`charCodeAt`)){process.stderr.write(`[robota] IME error suppressed: ${t}\n`);return}throw e}),Te().catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(t+`
46
35
  `),process.exit(1)});export{};
47
36
  //# sourceMappingURL=bin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","names":["readMergedProviderSettingsFromPaths","isRecord"],"sources":["../../src/utils/cli-args.ts","../../src/utils/settings-io.ts","../../src/utils/provider-default-definitions.ts","../../src/utils/provider-factory.ts","../../src/utils/provider-configuration.ts","../../src/utils/provider-setup.ts","../../src/transports/transport-registry.ts","../../src/subagents/child-process-subagent-ipc.ts","../../src/subagents/child-process-subagent-transport.ts","../../src/subagents/child-process-subagent-runner-result.ts","../../src/subagents/child-process-subagent-runner.ts","../../src/utils/semver-compare.ts","../../src/utils/update-check.ts","../../src/utils/statusline-settings.ts","../../src/utils/git-branch.ts","../../src/plugins/plugin-command-source-loader.ts","../../src/plugins/plugin-command-adapter.ts","../../src/user-local-direct-command.ts","../../src/tui-interactions/registry.ts","../../src/cli.ts","../../src/bin.ts"],"sourcesContent":["/**\n * CLI argument parsing and validation.\n * Pure functions — no side effects beyond process.exit on validation failure.\n */\n\nimport { parseArgs } from 'node:util';\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nconst VALID_MODES: TPermissionMode[] = ['plan', 'default', 'acceptEdits', 'bypassPermissions'];\n\nconst VALID_OUTPUT_FORMATS = ['text', 'json', 'stream-json'] as const;\nexport type TOutputFormat = (typeof VALID_OUTPUT_FORMATS)[number];\n\nexport interface IParsedCliArgs {\n positional: string[];\n help: boolean;\n printMode: boolean;\n continueMode: boolean;\n resumeId: string | undefined;\n model: string | undefined;\n language: string | undefined;\n permissionMode: TPermissionMode | undefined;\n maxTurns: number | undefined;\n forkSession: boolean;\n sessionName: string | undefined;\n outputFormat: TOutputFormat | undefined;\n format: string | undefined;\n summary: string | undefined;\n source: string | undefined;\n systemPrompt: string | undefined;\n appendSystemPrompt: string | undefined;\n taskFile: string | undefined;\n version: boolean;\n reset: boolean;\n bare: boolean;\n allowedTools: string | undefined;\n noSessionPersistence: boolean;\n jsonSchema: string | undefined;\n configure: boolean;\n configureProvider: string | undefined;\n provider: string | undefined;\n providerType: string | undefined;\n baseURL: string | undefined;\n apiKey: string | undefined;\n apiKeyEnv: string | undefined;\n setCurrent: boolean;\n settingsScope: string | undefined;\n checkUpdate: boolean;\n disableUpdateCheck: boolean;\n}\n\n/** Print CLI usage help to stdout. */\nexport function printHelp(): void {\n process.stdout.write(`\nUsage: robota [options] [-p <prompt>]\n\nOptions:\n -p <prompt> Run in print (headless) mode with the given prompt\n --output-format <format> Output format: text | json | stream-json (default: text)\n --system-prompt <text> Override the system prompt for this session\n --append-system-prompt <t> Append text to the system prompt\n --language <lang> Language preference (e.g. ko, en)\n --no-session-persistence Disable session persistence for this run\n --model <model> Override model for this session\n --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions\n --max-turns <n> Maximum agent turns before stopping\n -c, --continue Continue the most recent session\n -r, --resume <id> Resume a session by ID or name\n -n, --name <name> Name for the new session\n --fork-session Fork the current session\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nExamples:\n robota Start interactive TUI session\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota --continue Resume the last session\n`);\n}\n\n/** Validate and return a TOutputFormat from a raw CLI string, or exit on error. */\nexport function parseOutputFormat(raw: string | undefined): TOutputFormat | undefined {\n if (raw === undefined) return undefined;\n if (!(VALID_OUTPUT_FORMATS as readonly string[]).includes(raw)) {\n process.stderr.write(\n `Invalid --output-format \"${raw}\". Valid: ${VALID_OUTPUT_FORMATS.join(' | ')}\\n`,\n );\n process.exit(1);\n }\n return raw as TOutputFormat;\n}\n\n/** Validate and return a TPermissionMode from a raw CLI string, or exit on error. */\nexport function parsePermissionMode(raw: string | undefined): TPermissionMode | undefined {\n if (raw === undefined) return undefined;\n if (!VALID_MODES.includes(raw as TPermissionMode)) {\n process.stderr.write(`Invalid --permission-mode \"${raw}\". Valid: ${VALID_MODES.join(' | ')}\\n`);\n process.exit(1);\n }\n return raw as TPermissionMode;\n}\n\n/** Validate and return a positive integer from a raw CLI string, or exit on error. */\nexport function parseMaxTurns(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = parseInt(raw, 10);\n if (isNaN(n) || n <= 0) {\n process.stderr.write(`Invalid --max-turns \"${raw}\". Must be a positive integer.\\n`);\n process.exit(1);\n }\n return n;\n}\n\n/** Parse and validate CLI arguments. */\nexport function parseCliArgs(): IParsedCliArgs {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h', default: false },\n p: { type: 'boolean', short: 'p', default: false },\n continue: { type: 'boolean', short: 'c', default: false },\n resume: { type: 'string', short: 'r' },\n model: { type: 'string' },\n language: { type: 'string' },\n 'permission-mode': { type: 'string' },\n 'max-turns': { type: 'string' },\n 'fork-session': { type: 'boolean', default: false },\n name: { type: 'string', short: 'n' },\n 'output-format': { type: 'string' },\n format: { type: 'string' },\n summary: { type: 'string' },\n source: { type: 'string' },\n 'system-prompt': { type: 'string' },\n 'append-system-prompt': { type: 'string' },\n 'task-file': { type: 'string' },\n version: { type: 'boolean', default: false },\n reset: { type: 'boolean', default: false },\n bare: { type: 'boolean', default: false },\n 'allowed-tools': { type: 'string' },\n 'no-session-persistence': { type: 'boolean', default: false },\n 'json-schema': { type: 'string' },\n configure: { type: 'boolean', default: false },\n 'configure-provider': { type: 'string' },\n provider: { type: 'string' },\n type: { type: 'string' },\n 'base-url': { type: 'string' },\n 'api-key': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'set-current': { type: 'boolean', default: false },\n 'settings-scope': { type: 'string' },\n 'check-update': { type: 'boolean', default: false },\n 'disable-update-check': { type: 'boolean', default: false },\n },\n });\n\n return {\n positional: positionals,\n help: values['help'] ?? false,\n printMode: values['p'] ?? false,\n continueMode: values['continue'] ?? false,\n resumeId: values['resume'],\n model: values['model'],\n language: values['language'],\n permissionMode: parsePermissionMode(values['permission-mode']),\n maxTurns: parseMaxTurns(values['max-turns']),\n forkSession: values['fork-session'] ?? false,\n sessionName: values['name'],\n outputFormat: parseOutputFormat(values['output-format']),\n format: values['format'],\n summary: values['summary'],\n source: values['source'],\n systemPrompt: values['system-prompt'],\n appendSystemPrompt: values['append-system-prompt'],\n taskFile: values['task-file'],\n version: values['version'] ?? false,\n reset: values['reset'] ?? false,\n bare: values['bare'] ?? false,\n allowedTools: values['allowed-tools'],\n noSessionPersistence: values['no-session-persistence'] ?? false,\n jsonSchema: values['json-schema'],\n configure: values['configure'] ?? false,\n configureProvider: values['configure-provider'],\n provider: values['provider'],\n providerType: values['type'],\n baseURL: values['base-url'],\n apiKey: values['api-key'],\n apiKeyEnv: values['api-key-env'],\n setCurrent: values['set-current'] ?? false,\n settingsScope: values['settings-scope'],\n checkUpdate: values['check-update'] ?? false,\n disableUpdateCheck: values['disable-update-check'] ?? false,\n };\n}\n","/**\n * Settings file I/O operations.\n * Handles reading, writing, and updating ~/.robota/settings.json.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { TUniversalValue } from '@robota-sdk/agent-core';\n\nexport type TSettingsData = Record<string, TUniversalValue>;\n\n/** Get the user-global settings file path */\nexport function getUserSettingsPath(): string {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? '/';\n return join(home, '.robota', 'settings.json');\n}\n\n/** Read settings from a JSON file. Returns empty object if file doesn't exist or is corrupt. */\nexport function readSettings(path: string): TSettingsData {\n if (!existsSync(path)) return {};\n const raw = readFileSync(path, 'utf8');\n try {\n return JSON.parse(raw) as TSettingsData;\n } catch {\n process.stderr.write(`Warning: corrupt settings file at ${path}, resetting to defaults\\n`);\n return {};\n }\n}\n\n/** Write settings to a JSON file, creating parent directories as needed. */\nexport function writeSettings(path: string, settings: TSettingsData): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(settings, null, 2) + '\\n', 'utf8');\n}\n\n/** Update the provider.model field in a settings file. */\nexport function updateModelInSettings(settingsPath: string, modelId: string): void {\n const settings = readSettings(settingsPath);\n const currentProvider = settings.currentProvider;\n const providers = settings.providers;\n if (typeof currentProvider === 'string' && isSettingsData(providers)) {\n const providerMap = providers as Record<string, TSettingsData | undefined>;\n providerMap[currentProvider] = {\n ...(isSettingsData(providerMap[currentProvider]) ? providerMap[currentProvider] : {}),\n model: modelId,\n };\n settings.providers = providerMap;\n } else {\n settings.provider = {\n ...(isSettingsData(settings.provider) ? settings.provider : {}),\n model: modelId,\n };\n }\n writeSettings(settingsPath, settings);\n}\n\nfunction isSettingsData(value: TUniversalValue): value is TSettingsData {\n return (\n value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)\n );\n}\n\n/** Delete a settings file if it exists. Returns true if deleted. */\nexport function deleteSettings(path: string): boolean {\n if (existsSync(path)) {\n unlinkSync(path);\n return true;\n }\n return false;\n}\n","import { createAnthropicProviderDefinition } from '@robota-sdk/agent-provider/anthropic';\nimport { createDeepSeekProviderDefinition } from '@robota-sdk/agent-provider/deepseek';\nimport { createGemmaProviderDefinition } from '@robota-sdk/agent-provider/gemma';\nimport { createGeminiProviderDefinition } from '@robota-sdk/agent-provider/gemini';\nimport { createOpenAIProviderDefinition } from '@robota-sdk/agent-provider/openai';\nimport { createQwenProviderDefinition } from '@robota-sdk/agent-provider/qwen';\nimport type { IProviderDefinition } from './provider-definition.js';\n\nexport const DEFAULT_PROVIDER_DEFINITIONS: readonly IProviderDefinition[] = [\n createAnthropicProviderDefinition(),\n createOpenAIProviderDefinition(),\n createGeminiProviderDefinition(),\n createGemmaProviderDefinition(),\n createQwenProviderDefinition(),\n createDeepSeekProviderDefinition(),\n];\n","/**\n * Provider factory — CLI entry point for provider construction.\n *\n * Business logic lives in @robota-sdk/agent-executor and @robota-sdk/agent-framework.\n * This file owns only: CLI path discovery, file I/O, and the assembly entry points.\n */\n\nimport { join } from 'node:path';\nimport type { IAIProvider } from '@robota-sdk/agent-core';\nimport { createProviderFromConfig, createProviderFromProfile } from '@robota-sdk/agent-executor';\nimport {\n readMergedProviderSettingsFromPaths,\n resolveActiveProvider,\n} from '@robota-sdk/agent-framework';\nimport type { TProviderSettingsDocument } from './provider-settings.js';\nimport { DEFAULT_PROVIDER_DEFINITIONS } from './provider-default-definitions.js';\nimport type { IProviderConfig, IProviderDefinition } from './provider-definition.js';\n\nexport type { IProviderConfig, IProviderDefinition } from './provider-definition.js';\nexport { createProviderFromConfig, createProviderFromProfile } from '@robota-sdk/agent-executor';\nexport {\n mergeProviders,\n mergeSettings,\n readMergedProviderSettingsFromPaths,\n resolveActiveProvider,\n} from '@robota-sdk/agent-framework';\n\nexport interface IReadProviderSettingsOptions {\n providerOverride?: string;\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport function getProviderSettingsPaths(cwd: string): string[] {\n const userHome = getUserHome();\n return [\n join(userHome, '.robota', 'settings.json'),\n join(userHome, '.claude', 'settings.json'),\n join(cwd, '.robota', 'settings.json'),\n join(cwd, '.robota', 'settings.local.json'),\n join(cwd, '.claude', 'settings.json'),\n join(cwd, '.claude', 'settings.local.json'),\n ];\n}\n\nfunction getUserHome(): string {\n return process.env.HOME ?? process.env.USERPROFILE ?? '/';\n}\n\nexport function readMergedProviderSettings(cwd: string): TProviderSettingsDocument {\n return readMergedProviderSettingsFromPaths(getProviderSettingsPaths(cwd));\n}\n\n/** Read provider settings from the settings file chain. */\nexport function readProviderSettings(\n cwd: string,\n options: IReadProviderSettingsOptions = {},\n): IProviderConfig {\n const merged = readMergedProviderSettings(cwd);\n const providerConfig = resolveActiveProvider(\n merged,\n options.providerOverride,\n getProviderDefinitions(options),\n );\n if (providerConfig !== undefined) {\n return providerConfig;\n }\n\n throw new Error('No provider configuration found. Run `robota` to set up.');\n}\n\n/** Create a provider instance from settings. */\nexport function createProviderFromSettings(\n cwd: string,\n modelOverride?: string,\n options: IReadProviderSettingsOptions = {},\n): IAIProvider {\n const providerDefinitions = getProviderDefinitions(options);\n const settings = readProviderSettings(cwd, { ...options, providerDefinitions });\n const model = modelOverride ?? settings.model;\n\n return createProviderFromConfig({ ...settings, model }, providerDefinitions);\n}\n\nfunction getProviderDefinitions(\n options: IReadProviderSettingsOptions,\n): readonly IProviderDefinition[] {\n return options.providerDefinitions ?? DEFAULT_PROVIDER_DEFINITIONS;\n}\n","import { readSettings, writeSettings } from './settings-io.js';\nimport {\n getProviderSettingsPaths,\n readMergedProviderSettingsFromPaths,\n} from './provider-factory.js';\nimport {\n buildProviderSetupPatch,\n mergeProviderPatch,\n setCurrentProvider,\n type IProviderProfileSettings,\n type IProviderSetupInput,\n type IProviderSettingsBuildOptions,\n type TProviderSettingsDocument,\n} from './provider-settings.js';\n\nexport interface IProviderSwitchOptions {\n knownProviders?: Record<string, IProviderProfileSettings>;\n}\n\nexport interface IActiveModelChangeOptions {\n settingsPaths?: readonly string[];\n providerOverride?: string | undefined;\n}\n\nexport interface IProviderSettingsWriteTargetOptions {\n settingsPaths?: readonly string[];\n}\n\nexport interface IActiveModelChangeResult {\n settingsPath: string;\n settings: TProviderSettingsDocument;\n profileName?: string;\n}\n\nexport function resolveProviderSettingsWriteTargetPath(\n cwd: string,\n options: IProviderSettingsWriteTargetOptions = {},\n): string {\n const settingsPaths = options.settingsPaths ?? getProviderSettingsPaths(cwd);\n const targetPath = findLastPathWithCurrentProvider(settingsPaths) ?? settingsPaths[0];\n if (targetPath === undefined) {\n throw new Error('No settings path available for provider update');\n }\n return targetPath;\n}\n\nfunction readProviderDocument(settingsPath: string): TProviderSettingsDocument {\n return readSettings(settingsPath) as TProviderSettingsDocument;\n}\n\nexport function applyProviderConfiguration(\n settingsPath: string,\n input: IProviderSetupInput,\n options: IProviderSettingsBuildOptions = {},\n): TProviderSettingsDocument {\n const settings = readProviderDocument(settingsPath);\n const patch = buildProviderSetupPatch(input, options);\n const next = mergeProviderPatch(settings, patch);\n writeSettings(settingsPath, next);\n return next;\n}\n\nexport function applyProviderSwitch(\n settingsPath: string,\n profileName: string,\n options: IProviderSwitchOptions = {},\n): TProviderSettingsDocument {\n const settings = readProviderDocument(settingsPath);\n const hasLocalProfile = settings.providers?.[profileName] !== undefined;\n const hasKnownProfile = options.knownProviders?.[profileName] !== undefined;\n const next =\n hasLocalProfile || hasKnownProfile\n ? { ...settings, currentProvider: profileName }\n : setCurrentProvider(settings, profileName);\n writeSettings(settingsPath, next);\n return next;\n}\n\nexport function applyActiveModelChange(\n cwd: string,\n modelId: string,\n options: IActiveModelChangeOptions = {},\n): IActiveModelChangeResult {\n const settingsPaths = options.settingsPaths ?? getProviderSettingsPaths(cwd);\n const merged = readMergedProviderSettingsFromPaths(settingsPaths);\n const activeProfileName = options.providerOverride ?? merged.currentProvider;\n\n if (typeof activeProfileName !== 'string') {\n throw new Error(\n 'Cannot update model: no active provider profile. Set \"currentProvider\" in settings.',\n );\n }\n\n return updateActiveProviderProfileModel(settingsPaths, activeProfileName, modelId);\n}\n\nfunction updateActiveProviderProfileModel(\n settingsPaths: readonly string[],\n profileName: string,\n modelId: string,\n): IActiveModelChangeResult {\n const settingsPath =\n findLastPathWithProviderProfile(settingsPaths, profileName) ?? settingsPaths[0];\n if (settingsPath === undefined) {\n throw new Error('No settings path available for model update');\n }\n\n const settings = readProviderDocument(settingsPath);\n const providers = settings.providers ?? {};\n const existing = providers[profileName] ?? {};\n const next: TProviderSettingsDocument = {\n ...settings,\n providers: {\n ...providers,\n [profileName]: {\n ...existing,\n model: modelId,\n },\n },\n };\n writeSettings(settingsPath, next);\n return { settingsPath, settings: next, profileName };\n}\n\nfunction findLastPathWithProviderProfile(\n settingsPaths: readonly string[],\n profileName: string,\n): string | undefined {\n for (let index = settingsPaths.length - 1; index >= 0; index -= 1) {\n const settingsPath = settingsPaths[index];\n if (settingsPath === undefined) continue;\n const settings = readProviderDocument(settingsPath);\n if (settings.providers?.[profileName] !== undefined) return settingsPath;\n }\n return undefined;\n}\n\nfunction findLastPathWithCurrentProvider(settingsPaths: readonly string[]): string | undefined {\n for (let index = settingsPaths.length - 1; index >= 0; index -= 1) {\n const settingsPath = settingsPaths[index];\n if (settingsPath === undefined) continue;\n const settings = readProviderDocument(settingsPath);\n if (settings.currentProvider !== undefined) return settingsPath;\n }\n return undefined;\n}\n","import { join } from 'node:path';\nimport { formatSupportedProviderTypes, type IProviderDefinition } from './provider-definition.js';\nimport type { IParsedCliArgs } from './cli-args.js';\nimport { checkSettingsDocument } from './settings-check.js';\nimport { getUserSettingsPath, readSettings, writeSettings } from './settings-io.js';\nimport {\n applyProviderConfiguration,\n applyProviderSwitch,\n resolveProviderSettingsWriteTargetPath,\n} from './provider-configuration.js';\nimport { getProviderSettingsPaths, readMergedProviderSettings } from './provider-factory.js';\nimport { DEFAULT_PROVIDER_DEFINITIONS } from './provider-default-definitions.js';\nimport { type IProviderSetupInput } from './provider-settings.js';\nimport {\n formatProviderSetupSelectionPrompt,\n resolveProviderSetupSelection,\n runProviderSetupPromptFlow,\n type TPromptInput,\n} from './provider-setup-flow.js';\n\nexport function getSettingsPathForScope(cwd: string, scope: string | undefined): string {\n if (scope === undefined || scope === 'user') {\n return getUserSettingsPath();\n }\n if (scope === 'project-local') {\n return join(cwd, '.robota', 'settings.local.json');\n }\n throw new Error(`Invalid --settings-scope \"${scope}\". Valid: user | project-local`);\n}\n\nexport function handleProviderConfigurationArgs(\n cwd: string,\n args: IParsedCliArgs,\n providerDefinitions: readonly IProviderDefinition[] = DEFAULT_PROVIDER_DEFINITIONS,\n): boolean {\n const settingsPath = getSettingsPathForScope(cwd, args.settingsScope);\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n process.stdout.write(`Provider profile saved to ${settingsPath}\\n`);\n return !args.printMode && args.positional.length === 0;\n }\n if (args.provider && args.setCurrent) {\n const switchSettingsPath =\n args.settingsScope === undefined ? resolveProviderSettingsWriteTargetPath(cwd) : settingsPath;\n applyProviderSwitch(switchSettingsPath, args.provider, {\n knownProviders: readMergedProviderSettings(cwd).providers,\n });\n process.stdout.write(`Current provider set to ${args.provider}\\n`);\n return !args.printMode && args.positional.length === 0;\n }\n return false;\n}\n\nexport async function ensureConfig(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n providerDefinitions: readonly IProviderDefinition[] = DEFAULT_PROVIDER_DEFINITIONS,\n): Promise<void> {\n const merged = readMergedProviderSettings(cwd);\n const selectedSettings =\n args.provider !== undefined ? { ...merged, currentProvider: args.provider } : merged;\n if (checkSettingsDocument(selectedSettings, providerDefinitions) === 'valid') {\n return;\n }\n if (!isInteractiveTerminal()) {\n throw new Error(formatMissingProviderConfigMessage(providerDefinitions));\n }\n await runInteractiveProviderSetup(\n cwd,\n selectStartupSetupArgs(cwd, args),\n promptInput,\n providerDefinitions,\n );\n const updated = readMergedProviderSettings(cwd);\n const updatedSettings =\n args.provider !== undefined ? { ...updated, currentProvider: args.provider } : updated;\n if (checkSettingsDocument(updatedSettings, providerDefinitions) !== 'valid') {\n throw new Error(formatMissingProviderConfigMessage(providerDefinitions));\n }\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n providerDefinitions: readonly IProviderDefinition[] = DEFAULT_PROVIDER_DEFINITIONS,\n): Promise<void> {\n const providerChoice = await promptInput(formatProviderSetupSelectionPrompt(providerDefinitions));\n const type = resolveProviderSetupSelection(providerChoice, providerDefinitions);\n const settingsPath = getSettingsPathForScope(cwd, args.settingsScope);\n const input = await runProviderSetupPromptFlow(type, promptInput, providerDefinitions, {\n existingProfileNames: Object.keys(readMergedProviderSettings(cwd).providers ?? {}),\n });\n applyProviderConfiguration(settingsPath, input, {\n providerDefinitions,\n });\n const language = await promptInput(' Response language (ko/en/ja/zh, default: en): ');\n if (language) {\n const settings = readSettings(settingsPath);\n settings.language = language;\n writeSettings(settingsPath, settings);\n }\n process.stdout.write(`\\n Config saved to ${settingsPath}\\n\\n`);\n}\n\nfunction buildSetupInputFromArgs(args: IParsedCliArgs): IProviderSetupInput {\n const type = args.providerType ?? args.configureProvider;\n if (!args.configureProvider || !type) {\n throw new Error('--configure-provider requires a provider profile and --type');\n }\n return {\n profile: args.configureProvider,\n type,\n ...(args.model !== undefined && { model: args.model }),\n ...(args.apiKey !== undefined && { apiKey: args.apiKey }),\n ...(args.apiKeyEnv !== undefined && { apiKeyEnv: args.apiKeyEnv }),\n ...(args.baseURL !== undefined && { baseURL: args.baseURL }),\n setCurrent: args.setCurrent,\n };\n}\n\nfunction selectStartupSetupArgs(cwd: string, args: IParsedCliArgs): IParsedCliArgs {\n if (args.settingsScope !== undefined || args.provider !== undefined) {\n return args;\n }\n\n const currentProviderPath = findHighestPriorityCurrentProviderPath(getProviderSettingsPaths(cwd));\n if (currentProviderPath === undefined) {\n return args;\n }\n\n const projectSettingsPath = join(cwd, '.robota', 'settings.json');\n const projectLocalSettingsPath = join(cwd, '.robota', 'settings.local.json');\n if (\n currentProviderPath === projectSettingsPath ||\n currentProviderPath === projectLocalSettingsPath\n ) {\n return { ...args, settingsScope: 'project-local' };\n }\n\n return args;\n}\n\nfunction findHighestPriorityCurrentProviderPath(\n settingsPaths: readonly string[],\n): string | undefined {\n for (let index = settingsPaths.length - 1; index >= 0; index -= 1) {\n const settingsPath = settingsPaths[index];\n if (settingsPath === undefined) continue;\n const settings = readSettings(settingsPath);\n if (typeof settings.currentProvider === 'string') {\n return settingsPath;\n }\n }\n return undefined;\n}\n\nfunction isInteractiveTerminal(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = DEFAULT_PROVIDER_DEFINITIONS,\n): string {\n return [\n 'No provider configuration found.',\n 'Run `robota --configure` in an interactive terminal, or configure a provider:',\n `Supported providers: ${formatSupportedProviderTypes(providerDefinitions)}`,\n ...providerDefinitions.map(formatConfigureProviderExample),\n ].join('\\n');\n}\n\nfunction formatConfigureProviderExample(definition: IProviderDefinition): string {\n const flags = [\n `robota --configure-provider ${definition.type}`,\n `--type ${definition.type}`,\n ...(definition.defaults?.baseURL !== undefined ? ['--base-url <url>'] : []),\n '--model <model>',\n ...(definition.requiresApiKey === true ? ['--api-key-env <ENV_NAME>'] : []),\n '--set-current',\n ];\n return ` ${flags.join(' ')}`;\n}\n","/**\n * TransportRegistry — manages IConfigurableTransport instances with settings-backed enable/disable.\n *\n * Settings file shape (under `transports` key in settings.json):\n * { \"ws\": { \"enabled\": true, \"options\": { \"port\": 7070 } } }\n */\n\nimport type { TUniversalValue } from '@robota-sdk/agent-core';\nimport type { IInteractiveSession } from '@robota-sdk/agent-framework';\nimport type {\n IConfigurableTransport,\n ITransportConfig,\n ITransportEntry,\n} from '@robota-sdk/agent-interface-transport';\nimport { readSettings, writeSettings, type TSettingsData } from '../utils/settings-io.js';\n\nexport class TransportRegistry {\n private readonly entries = new Map<string, IConfigurableTransport<IInteractiveSession>>();\n private readonly settingsPath: string;\n\n constructor(settingsPath: string) {\n this.settingsPath = settingsPath;\n }\n\n register(transport: IConfigurableTransport<IInteractiveSession>): void {\n this.entries.set(transport.name, transport);\n }\n\n getAll(): ITransportEntry<IInteractiveSession>[] {\n const saved = this.readTransportSettings();\n return Array.from(this.entries.values()).map((transport) => ({\n transport,\n config: this.resolveConfig(transport, saved[transport.name]),\n }));\n }\n\n getEnabled(): IConfigurableTransport<IInteractiveSession>[] {\n return this.getAll()\n .filter((e) => e.config.enabled)\n .map((e) => e.transport);\n }\n\n async setEnabled(name: string, enabled: boolean): Promise<void> {\n const settings = readSettings(this.settingsPath);\n const transports = (settings.transports ?? {}) as TSettingsData;\n const entry = (transports[name] ?? {}) as TSettingsData;\n transports[name] = { ...entry, enabled } as TSettingsData;\n settings.transports = transports;\n writeSettings(this.settingsPath, settings);\n }\n\n async setOptions(name: string, options: Record<string, TUniversalValue>): Promise<void> {\n const settings = readSettings(this.settingsPath);\n const transports = (settings.transports ?? {}) as TSettingsData;\n const entry = (transports[name] ?? {}) as TSettingsData;\n transports[name] = { ...entry, options: options as TSettingsData } as TSettingsData;\n settings.transports = transports;\n writeSettings(this.settingsPath, settings);\n }\n\n async startAll(session: IInteractiveSession): Promise<void> {\n const enabled = this.getEnabled();\n for (const transport of enabled) {\n transport.attach(session);\n await transport.start();\n }\n }\n\n async stopAll(): Promise<void> {\n for (const transport of this.entries.values()) {\n await transport.stop();\n }\n }\n\n private resolveConfig(\n transport: IConfigurableTransport<IInteractiveSession>,\n saved?: TSettingsData,\n ): ITransportConfig {\n const enabled = (saved?.enabled as boolean | undefined) ?? transport.defaultEnabled;\n const options = (saved?.options as Record<string, TUniversalValue> | undefined) ?? {};\n return { enabled, options };\n }\n\n private readTransportSettings(): Record<string, TSettingsData> {\n const settings = readSettings(this.settingsPath);\n const raw = settings.transports;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};\n return raw as Record<string, TSettingsData>;\n }\n}\n","import type { TPermissionMode, TToolArgs } from '@robota-sdk/agent-core';\nimport type {\n ISerializableProviderProfile,\n ISubagentSpawnRequest,\n} from '@robota-sdk/agent-executor';\nimport type { IAgentDefinition, IInProcessSubagentRunnerDeps } from '@robota-sdk/agent-framework';\n\nexport type TSubagentWorkerWireValue = string | number | boolean | null | undefined | object;\n\ntype TSubagentWorkerWireRecord = Record<string, TSubagentWorkerWireValue>;\n\nexport interface ISubagentWorkerStartPayload {\n jobId: string;\n request: ISubagentSpawnRequest;\n agentDefinition: IAgentDefinition;\n parentConfig: IInProcessSubagentRunnerDeps['config'];\n parentContext: IInProcessSubagentRunnerDeps['context'];\n providerProfile: ISerializableProviderProfile;\n permissionMode?: TPermissionMode;\n logsDir?: string;\n}\n\nexport interface ISubagentWorkerStartMessage {\n type: 'start';\n payload: ISubagentWorkerStartPayload;\n}\n\nexport interface ISubagentWorkerSendMessage {\n type: 'send';\n prompt: string;\n}\n\nexport interface ISubagentWorkerCancelMessage {\n type: 'cancel';\n reason?: string;\n}\n\nexport type TSubagentWorkerParentMessage =\n | ISubagentWorkerStartMessage\n | ISubagentWorkerSendMessage\n | ISubagentWorkerCancelMessage;\n\nexport interface ISubagentWorkerReadyMessage {\n type: 'ready';\n}\n\nexport interface ISubagentWorkerTextDeltaMessage {\n type: 'text_delta';\n delta: string;\n}\n\nexport interface ISubagentWorkerToolStartMessage {\n type: 'tool_start';\n toolName: string;\n toolArgs?: TToolArgs;\n}\n\nexport interface ISubagentWorkerToolEndMessage {\n type: 'tool_end';\n toolName: string;\n success: boolean;\n}\n\nexport interface ISubagentWorkerResultMessage {\n type: 'result';\n output: string;\n}\n\nexport interface ISubagentWorkerErrorMessage {\n type: 'error';\n message: string;\n}\n\nexport interface ISubagentWorkerCancelledMessage {\n type: 'cancelled';\n reason?: string;\n}\n\nexport type TSubagentWorkerChildMessage =\n | ISubagentWorkerReadyMessage\n | ISubagentWorkerTextDeltaMessage\n | ISubagentWorkerToolStartMessage\n | ISubagentWorkerToolEndMessage\n | ISubagentWorkerResultMessage\n | ISubagentWorkerErrorMessage\n | ISubagentWorkerCancelledMessage;\n\nfunction isRecord(value: TSubagentWorkerWireValue): value is TSubagentWorkerWireRecord {\n return typeof value === 'object' && value !== null;\n}\n\nfunction hasString(value: TSubagentWorkerWireRecord, key: string): boolean {\n return typeof value[key] === 'string';\n}\n\nfunction isStartPayload(value: TSubagentWorkerWireValue): value is ISubagentWorkerStartPayload {\n if (!isRecord(value)) return false;\n if (!hasString(value, 'jobId')) return false;\n if (!isRecord(value.request)) return false;\n if (!hasString(value.request, 'type')) return false;\n if (!hasString(value.request, 'prompt')) return false;\n if (!isRecord(value.agentDefinition)) return false;\n if (!hasString(value.agentDefinition, 'name')) return false;\n if (!hasString(value.agentDefinition, 'systemPrompt')) return false;\n if (!isRecord(value.parentConfig)) return false;\n if (!isRecord(value.parentContext)) return false;\n if (!isRecord(value.providerProfile)) return false;\n if (!hasString(value.providerProfile, 'type')) return false;\n return hasString(value.providerProfile, 'model');\n}\n\nexport function isSubagentWorkerParentMessage(\n value: TSubagentWorkerWireValue,\n): value is TSubagentWorkerParentMessage {\n if (!isRecord(value) || !hasString(value, 'type')) return false;\n switch (value.type) {\n case 'start':\n return isStartPayload(value.payload);\n case 'send':\n return hasString(value, 'prompt');\n case 'cancel':\n return value.reason === undefined || typeof value.reason === 'string';\n default:\n return false;\n }\n}\n\nexport function isSubagentWorkerChildMessage(\n value: TSubagentWorkerWireValue,\n): value is TSubagentWorkerChildMessage {\n if (!isRecord(value) || !hasString(value, 'type')) return false;\n switch (value.type) {\n case 'ready':\n return true;\n case 'text_delta':\n return hasString(value, 'delta');\n case 'tool_start':\n return hasString(value, 'toolName');\n case 'tool_end':\n return hasString(value, 'toolName') && typeof value.success === 'boolean';\n case 'result':\n return hasString(value, 'output');\n case 'error':\n return hasString(value, 'message');\n case 'cancelled':\n return value.reason === undefined || typeof value.reason === 'string';\n default:\n return false;\n }\n}\n","import type { ChildProcess } from 'node:child_process';\nimport type { TToolArgs } from '@robota-sdk/agent-core';\nimport {\n BackgroundTaskError,\n type ISubagentJobStart,\n type TBackgroundTaskRunnerEvent,\n} from '@robota-sdk/agent-executor';\nimport type {\n TSubagentWorkerChildMessage,\n TSubagentWorkerParentMessage,\n} from './child-process-subagent-ipc.js';\n\nexport interface IChildProcessRuntime {\n job: ISubagentJobStart;\n child: ChildProcess;\n killGraceMs: number;\n killTimer?: ReturnType<typeof setTimeout>;\n}\n\nexport function handleWorkerMessage(\n message: TSubagentWorkerChildMessage,\n startWorker: () => void,\n resolveOnce: (output: string) => void,\n rejectOnce: (error: Error) => void,\n emit?: (event: TBackgroundTaskRunnerEvent) => void,\n): void {\n switch (message.type) {\n case 'ready':\n startWorker();\n break;\n case 'result':\n resolveOnce(message.output);\n break;\n case 'error':\n rejectOnce(new BackgroundTaskError('runner', message.message));\n break;\n case 'cancelled':\n rejectOnce(new BackgroundTaskError('runner', message.reason ?? 'Subagent worker cancelled'));\n break;\n case 'text_delta':\n emit?.({ type: 'background_task_text_delta', delta: message.delta });\n break;\n case 'tool_start':\n emit?.({\n type: 'background_task_tool_start',\n toolName: message.toolName,\n firstArg: extractFirstArg(message.toolArgs),\n });\n break;\n case 'tool_end':\n emit?.({\n type: 'background_task_tool_end',\n toolName: message.toolName,\n success: message.success,\n });\n break;\n default:\n rejectOnce(new BackgroundTaskError('runner', 'Unhandled subagent worker message'));\n }\n}\n\nfunction extractFirstArg(toolArgs?: TToolArgs): string | undefined {\n if (!toolArgs) return undefined;\n const firstValue = Object.values(toolArgs)[0];\n if (firstValue === undefined) return undefined;\n return typeof firstValue === 'object' ? JSON.stringify(firstValue) : String(firstValue);\n}\n\nexport function sendWorkerMessage(\n child: ChildProcess,\n message: TSubagentWorkerParentMessage,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!child.connected) {\n reject(new BackgroundTaskError('crash', 'Subagent worker IPC channel is closed'));\n return;\n }\n child.send(message, (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n}\n\nexport async function cancelChildProcess(\n runtime: IChildProcessRuntime,\n reason?: string,\n): Promise<void> {\n if (runtime.child.connected) {\n await sendWorkerMessage(runtime.child, { type: 'cancel', reason }).catch(() => undefined);\n }\n runtime.killTimer = setTimeout(() => {\n if (!runtime.child.killed) {\n runtime.child.kill('SIGTERM');\n }\n }, runtime.killGraceMs);\n}\n","import {\n BackgroundTaskError,\n type ISubagentJobResult,\n type ISubagentJobStart,\n} from '@robota-sdk/agent-executor';\nimport {\n isSubagentWorkerChildMessage,\n type ISubagentWorkerStartPayload,\n type TSubagentWorkerWireValue,\n} from './child-process-subagent-ipc.js';\nimport {\n cancelChildProcess,\n handleWorkerMessage,\n sendWorkerMessage,\n type IChildProcessRuntime,\n} from './child-process-subagent-transport.js';\n\nexport interface ICancellationResult {\n promise: Promise<ISubagentJobResult>;\n reject(reason?: string): void;\n}\n\nexport interface IChildProcessSubagentResultOptions {\n runtime: IChildProcessRuntime;\n payload: ISubagentWorkerStartPayload;\n resolveTranscriptPath: (job: ISubagentJobStart) => string | undefined;\n}\n\nexport function createChildProcessSubagentResult(\n options: IChildProcessSubagentResultOptions,\n): Promise<ISubagentJobResult> {\n return new Promise<ISubagentJobResult>((resolve, reject) => {\n new ChildProcessSubagentResultController(options, resolve, reject).start();\n });\n}\n\nclass ChildProcessSubagentResultController {\n private settled = false;\n private started = false;\n private readonly timeoutTimer?: ReturnType<typeof setTimeout>;\n\n constructor(\n private readonly options: IChildProcessSubagentResultOptions,\n private readonly resolve: (result: ISubagentJobResult) => void,\n private readonly reject: (error: Error) => void,\n ) {\n this.timeoutTimer = createTimeoutTimer(this.options.runtime, (error) => this.rejectOnce(error));\n }\n\n start(): void {\n const { child } = this.options.runtime;\n child.on('message', this.onMessage);\n child.on('error', this.onError);\n child.on('exit', this.onExit);\n child.once('spawn', () => {\n setImmediate(this.startWorker);\n });\n }\n\n private readonly startWorker = (): void => {\n if (this.started) return;\n this.started = true;\n const { child } = this.options.runtime;\n void sendWorkerMessage(child, { type: 'start', payload: this.options.payload }).catch(\n (error) => {\n this.rejectOnce(error instanceof Error ? error : new Error(String(error)));\n },\n );\n };\n\n private readonly onMessage = (message: TSubagentWorkerWireValue): void => {\n if (!isSubagentWorkerChildMessage(message)) {\n this.rejectOnce(\n new BackgroundTaskError('runner', 'Received malformed subagent worker message'),\n );\n return;\n }\n const { job } = this.options.runtime;\n handleWorkerMessage(message, this.startWorker, this.resolveOnce, this.rejectOnce, job.emit);\n };\n\n private readonly onError = (error: Error): void => {\n this.rejectOnce(new BackgroundTaskError('crash', error.message));\n };\n\n private readonly onExit = (code: number | null, signal: NodeJS.Signals | null): void => {\n if (this.settled) return;\n this.rejectOnce(new BackgroundTaskError('crash', formatEarlyExitMessage(code, signal)));\n };\n\n private readonly resolveOnce = (output: string): void => {\n if (this.settled) return;\n this.settled = true;\n this.clearTimers();\n this.cleanup();\n const { runtime, resolveTranscriptPath } = this.options;\n this.resolve(toSubagentResult(runtime.job, output, resolveTranscriptPath));\n };\n\n private readonly rejectOnce = (error: Error): void => {\n if (this.settled) return;\n this.settled = true;\n this.clearTimers();\n this.cleanup();\n this.reject(error);\n };\n\n private clearTimers(): void {\n if (this.timeoutTimer) clearTimeout(this.timeoutTimer);\n if (this.options.runtime.killTimer) clearTimeout(this.options.runtime.killTimer);\n }\n\n private cleanup(): void {\n const { child } = this.options.runtime;\n child.off('message', this.onMessage);\n child.off('error', this.onError);\n child.off('exit', this.onExit);\n }\n}\n\nexport function createCancellationResult(jobId: string): ICancellationResult {\n let settled = false;\n let rejectFn: (error: Error) => void = () => {};\n const promise = new Promise<ISubagentJobResult>((_resolve, reject) => {\n rejectFn = reject;\n });\n return {\n promise,\n reject(reason?: string): void {\n if (settled) return;\n settled = true;\n rejectFn(new BackgroundTaskError('runner', reason ?? `Subagent job cancelled: ${jobId}`));\n },\n };\n}\n\nfunction createTimeoutTimer(\n runtime: IChildProcessRuntime,\n rejectOnce: (error: Error) => void,\n): ReturnType<typeof setTimeout> | undefined {\n if (!runtime.job.request.timeoutMs) return undefined;\n return setTimeout(() => {\n void cancelChildProcess(runtime, 'Subagent worker timed out');\n rejectOnce(new BackgroundTaskError('timeout', 'Subagent worker timed out'));\n }, runtime.job.request.timeoutMs);\n}\n\nfunction toSubagentResult(\n job: ISubagentJobStart,\n output: string,\n resolveTranscriptPath: (job: ISubagentJobStart) => string | undefined,\n): ISubagentJobResult {\n const transcriptPath = resolveTranscriptPath(job);\n return {\n jobId: job.jobId,\n output,\n ...(transcriptPath ? { metadata: { transcriptPath, logPath: transcriptPath } } : {}),\n };\n}\n\nfunction formatEarlyExitMessage(code: number | null, signal: NodeJS.Signals | null): string {\n const detail =\n signal !== null ? `signal ${signal}` : `exit code ${code === null ? 'unknown' : code}`;\n return `Subagent worker exited before result: ${detail}`;\n}\n","import { fork } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { IProviderConfig } from '@robota-sdk/agent-core';\nimport {\n BackgroundTaskError,\n createBackgroundTaskLogPage,\n createGitWorktreeIsolationAdapter,\n createWorktreeSubagentRunner,\n type IBackgroundTaskLogCursor,\n type IBackgroundTaskLogPage,\n type ISerializableProviderProfile,\n type ISubagentJobHandle,\n type ISubagentJobStart,\n type ISubagentRunner,\n type ISubagentWorktreeAdapter,\n} from '@robota-sdk/agent-executor';\nimport type {\n TSubagentRunnerFactory,\n IAgentDefinition,\n IInProcessSubagentRunnerDeps,\n} from '@robota-sdk/agent-framework';\nimport { getBuiltInAgent } from '@robota-sdk/agent-framework';\nimport type { ISubagentWorkerStartPayload } from './child-process-subagent-ipc.js';\nimport {\n createCancellationResult,\n createChildProcessSubagentResult,\n} from './child-process-subagent-runner-result.js';\nimport {\n cancelChildProcess,\n sendWorkerMessage,\n type IChildProcessRuntime,\n} from './child-process-subagent-transport.js';\n\nconst DEFAULT_KILL_GRACE_MS = 2_000;\n\nexport interface IChildProcessSubagentRunnerOptions {\n providerConfig?: IProviderConfig;\n workerPath?: string;\n execArgv?: string[];\n killGraceMs?: number;\n env?: NodeJS.ProcessEnv;\n worktreeIsolation?: boolean;\n worktreeAdapter?: ISubagentWorktreeAdapter;\n logsDir?: string;\n}\n\nexport function createChildProcessSubagentRunnerFactory(\n options: IChildProcessSubagentRunnerOptions = {},\n): TSubagentRunnerFactory {\n return (deps) => {\n const runner = new ChildProcessSubagentRunner(deps, options);\n if (options.worktreeIsolation === false) return runner;\n return createWorktreeSubagentRunner({\n runner,\n worktreeAdapter: options.worktreeAdapter ?? createGitWorktreeIsolationAdapter(),\n hooks: deps.config.hooks,\n hookTypeExecutors: deps.hookTypeExecutors,\n });\n };\n}\n\nexport class ChildProcessSubagentRunner implements ISubagentRunner {\n private readonly workerPath: string;\n private readonly execArgv?: string[];\n private readonly killGraceMs: number;\n private readonly providerConfig?: IProviderConfig;\n private readonly env?: NodeJS.ProcessEnv;\n private readonly logsDir?: string;\n\n constructor(\n private readonly deps: IInProcessSubagentRunnerDeps,\n options: IChildProcessSubagentRunnerOptions = {},\n ) {\n this.workerPath = options.workerPath ?? resolveDefaultWorkerPath();\n this.execArgv = options.execArgv;\n this.killGraceMs = options.killGraceMs ?? DEFAULT_KILL_GRACE_MS;\n this.providerConfig = options.providerConfig;\n this.env = options.env;\n this.logsDir = options.logsDir;\n }\n\n start(job: ISubagentJobStart): ISubagentJobHandle {\n const child = fork(this.workerPath, [], {\n cwd: job.request.cwd,\n env: { ...process.env, ...(this.env ?? {}) },\n execArgv: this.execArgv ?? resolveDefaultExecArgv(this.workerPath),\n stdio: ['ignore', 'ignore', 'ignore', 'ipc'],\n });\n const runtime: IChildProcessRuntime = {\n job,\n child,\n killGraceMs: this.killGraceMs,\n };\n const payload = this.createStartPayload(job);\n const workerResult = createChildProcessSubagentResult({\n runtime,\n payload,\n resolveTranscriptPath: (request) => this.resolveTranscriptPath(request),\n });\n const cancellation = createCancellationResult(job.jobId);\n void workerResult.catch(() => undefined);\n const result = Promise.race([workerResult, cancellation.promise]);\n const transcriptPath = this.resolveTranscriptPath(job);\n\n return {\n jobId: job.jobId,\n ...(child.pid !== undefined && { pid: child.pid }),\n ...(transcriptPath !== undefined && { transcriptPath, logPath: transcriptPath }),\n result,\n cancel: async (reason?: string) => {\n cancellation.reject(reason);\n await cancelChildProcess(runtime, reason);\n },\n send: async (prompt: string) => {\n await sendWorkerMessage(child, { type: 'send', prompt });\n },\n ...(transcriptPath !== undefined && {\n readLog: async (cursor?: IBackgroundTaskLogCursor) =>\n readTranscriptLog(job.jobId, transcriptPath, cursor),\n }),\n };\n }\n\n private createStartPayload(job: ISubagentJobStart): ISubagentWorkerStartPayload {\n const definition = resolveAgentDefinition(job.request.type, this.deps.customAgentRegistry);\n return {\n jobId: job.jobId,\n request: job.request,\n agentDefinition: applyRequestOverrides(definition, job),\n parentConfig: this.deps.config,\n parentContext: this.deps.context,\n providerProfile: createProviderProfile(this.providerConfig, this.deps, job),\n permissionMode: this.deps.permissionMode,\n ...(this.logsDir ? { logsDir: this.logsDir } : {}),\n };\n }\n\n private resolveTranscriptPath(job: ISubagentJobStart): string | undefined {\n if (!this.logsDir) return undefined;\n return join(this.logsDir, job.request.parentSessionId, 'subagents', `${job.jobId}.jsonl`);\n }\n}\n\nfunction resolveAgentDefinition(\n agentType: string,\n customRegistry?: (name: string) => IAgentDefinition | undefined,\n): IAgentDefinition {\n const definition = customRegistry?.(agentType) ?? getBuiltInAgent(agentType);\n if (!definition) {\n throw new BackgroundTaskError('validation', `Unknown agent type: ${agentType}`);\n }\n return definition;\n}\n\nfunction applyRequestOverrides(\n definition: IAgentDefinition,\n job: ISubagentJobStart,\n): IAgentDefinition {\n return {\n ...definition,\n ...(job.request.model ? { model: job.request.model } : {}),\n ...(job.request.allowedTools ? { tools: job.request.allowedTools } : {}),\n ...(job.request.disallowedTools ? { disallowedTools: job.request.disallowedTools } : {}),\n };\n}\n\nfunction createProviderProfile(\n providerConfig: IProviderConfig | undefined,\n deps: IInProcessSubagentRunnerDeps,\n job: ISubagentJobStart,\n): ISerializableProviderProfile {\n const provider = providerConfig ?? deps.config.provider;\n return {\n profileName: deps.config.currentProvider,\n type: provider.name,\n model: job.request.model ?? provider.model,\n apiKey: provider.apiKey,\n baseURL: provider.baseURL,\n timeout: provider.timeout,\n options: provider.options,\n };\n}\n\nfunction resolveDefaultWorkerPath(): string {\n const entryPoint = process.argv[1] ?? '';\n const entryDir = entryPoint ? dirname(entryPoint) : process.cwd();\n const extension = entryPoint.endsWith('.ts') || entryPoint.endsWith('.tsx') ? '.ts' : '.js';\n const candidates = [\n join(entryDir, 'subagents', `child-process-subagent-worker${extension}`),\n join(entryDir, `child-process-subagent-worker${extension}`),\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return candidates[0]!;\n}\n\nfunction resolveDefaultExecArgv(workerPath: string): string[] {\n if (!workerPath.endsWith('.ts')) {\n return process.execArgv;\n }\n if (process.execArgv.some((arg) => arg.includes('tsx'))) {\n return process.execArgv;\n }\n return [...process.execArgv, '--import', 'tsx'];\n}\n\nfunction readTranscriptLog(\n jobId: string,\n transcriptPath: string,\n cursor?: IBackgroundTaskLogCursor,\n): IBackgroundTaskLogPage {\n if (!existsSync(transcriptPath)) {\n return {\n taskId: jobId,\n cursor,\n lines: [],\n };\n }\n const lines = readFileSync(transcriptPath, 'utf8').split(/\\r?\\n/).filter(Boolean);\n return createBackgroundTaskLogPage(jobId, lines, cursor);\n}\n","interface IParsedSemver {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nexport function compareSemverVersions(left: string, right: string): number {\n const parsedLeft = parseSemver(left);\n const parsedRight = parseSemver(right);\n if (parsedLeft === undefined || parsedRight === undefined) {\n return Math.sign(left.localeCompare(right));\n }\n\n const coreCompare =\n compareNumber(parsedLeft.major, parsedRight.major) ||\n compareNumber(parsedLeft.minor, parsedRight.minor) ||\n compareNumber(parsedLeft.patch, parsedRight.patch);\n if (coreCompare !== 0) {\n return coreCompare;\n }\n\n return comparePrerelease(parsedLeft.prerelease, parsedRight.prerelease);\n}\n\nexport function isNewerSemverVersion(candidate: string, current: string): boolean {\n return compareSemverVersions(candidate, current) > 0;\n}\n\nfunction parseSemver(value: string): IParsedSemver | undefined {\n const normalized = value.trim().replace(/^v/, '').split('+')[0] ?? '';\n const [core, prereleaseText] = normalized.split('-', 2);\n const [majorText, minorText, patchText] = core.split('.');\n const major = parseNumericIdentifier(majorText);\n const minor = parseNumericIdentifier(minorText);\n const patch = parseNumericIdentifier(patchText);\n if (major === undefined || minor === undefined || patch === undefined) {\n return undefined;\n }\n return {\n major,\n minor,\n patch,\n prerelease: prereleaseText ? prereleaseText.split('.') : [],\n };\n}\n\nfunction parseNumericIdentifier(value: string | undefined): number | undefined {\n if (value === undefined || !/^\\d+$/.test(value)) {\n return undefined;\n }\n return Number(value);\n}\n\nfunction compareNumber(left: number, right: number): number {\n return Math.sign(left - right);\n}\n\nfunction comparePrerelease(left: string[], right: string[]): number {\n if (left.length === 0 && right.length === 0) {\n return 0;\n }\n if (left.length === 0) {\n return 1;\n }\n if (right.length === 0) {\n return -1;\n }\n const max = Math.max(left.length, right.length);\n for (let index = 0; index < max; index += 1) {\n const leftPart = left[index];\n const rightPart = right[index];\n if (leftPart === undefined) {\n return -1;\n }\n if (rightPart === undefined) {\n return 1;\n }\n const partCompare = comparePrereleaseIdentifier(leftPart, rightPart);\n if (partCompare !== 0) {\n return partCompare;\n }\n }\n return 0;\n}\n\nfunction comparePrereleaseIdentifier(left: string, right: string): number {\n const leftNumber = parseNumericIdentifier(left);\n const rightNumber = parseNumericIdentifier(right);\n if (leftNumber !== undefined && rightNumber !== undefined) {\n return compareNumber(leftNumber, rightNumber);\n }\n if (leftNumber !== undefined) {\n return -1;\n }\n if (rightNumber !== undefined) {\n return 1;\n }\n return Math.sign(left.localeCompare(right));\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { compareSemverVersions, isNewerSemverVersion } from './semver-compare.js';\n\nexport const CLI_UPDATE_PACKAGE_NAME = '@robota-sdk/agent-cli';\nexport const CLI_UPDATE_REGISTRY_URL = 'https://registry.npmjs.org';\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_HOUR = 60;\nconst SECONDS_PER_MINUTE = 60;\nconst MS_PER_SECOND = 1000;\nexport const CLI_UPDATE_CACHE_TTL_MS =\n HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;\nexport const CLI_UPDATE_TIMEOUT_MS = 1500;\n\nconst DEFAULT_INSTALL_COMMAND = \"npm install -g '@robota-sdk/agent-cli@latest'\";\n\nexport interface ICliUpdateNotice {\n currentVersion: string;\n latestVersion: string;\n installCommand: string;\n}\n\nexport interface IUpdateCheckCache {\n packageName: string;\n checkedAt: string;\n currentVersion: string;\n latestVersion?: string;\n errorMessage?: string;\n}\n\nexport type TCliUpdateCheckResult =\n | { status: 'skipped'; reason: 'disabled' }\n | { status: 'current'; currentVersion: string; latestVersion: string }\n | { status: 'update_available'; notice: ICliUpdateNotice }\n | { status: 'error'; errorMessage: string };\n\nexport interface ICheckForCliUpdateOptions {\n currentVersion: string;\n disabled?: boolean;\n force?: boolean;\n cachePath?: string;\n now?: Date;\n ttlMs?: number;\n timeoutMs?: number;\n registryUrl?: string;\n packageName?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface IStartupCliUpdatePolicyInput {\n printMode: boolean;\n disableUpdateCheck: boolean;\n}\n\ninterface INpmPackageMetadata {\n 'dist-tags'?: {\n latest?: TJsonValue;\n };\n}\nexport { compareSemverVersions, isNewerSemverVersion };\n\ntype TJsonValue =\n | string\n | number\n | boolean\n | null\n | readonly TJsonValue[]\n | { readonly [key: string]: TJsonValue };\n\nexport function getUserUpdateCheckCachePath(\n home = process.env.HOME ?? process.env.USERPROFILE ?? '/',\n): string {\n return join(home, '.robota', 'update-check.json');\n}\n\nexport function readUpdateCheckCache(path: string): IUpdateCheckCache | undefined {\n if (!existsSync(path)) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(readFileSync(path, 'utf8')) as TJsonValue;\n return parseUpdateCheckCache(parsed);\n } catch {\n return undefined;\n }\n}\n\nexport function writeUpdateCheckCache(path: string, cache: IUpdateCheckCache): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(cache, null, 2) + '\\n', 'utf8');\n}\n\nexport async function checkForCliUpdate(\n options: ICheckForCliUpdateOptions,\n): Promise<TCliUpdateCheckResult> {\n if (options.disabled === true) {\n return { status: 'skipped', reason: 'disabled' };\n }\n\n const packageName = options.packageName ?? CLI_UPDATE_PACKAGE_NAME;\n const cachePath = options.cachePath ?? getUserUpdateCheckCachePath();\n const now = options.now ?? new Date();\n const ttlMs = options.ttlMs ?? CLI_UPDATE_CACHE_TTL_MS;\n\n if (options.force !== true) {\n const cached = readUpdateCheckCache(cachePath);\n if (cached !== undefined && isFreshCache(cached, now, ttlMs, packageName)) {\n return resultFromCache(cached, options.currentVersion);\n }\n }\n\n try {\n const latestVersion = await fetchLatestVersion({\n fetchImpl: options.fetchImpl ?? fetch,\n packageName,\n registryUrl: options.registryUrl ?? CLI_UPDATE_REGISTRY_URL,\n timeoutMs: options.timeoutMs ?? CLI_UPDATE_TIMEOUT_MS,\n });\n tryWriteUpdateCheckCache(cachePath, {\n packageName,\n checkedAt: now.toISOString(),\n currentVersion: options.currentVersion,\n latestVersion,\n });\n return resultFromLatestVersion(options.currentVersion, latestVersion);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n tryWriteUpdateCheckCache(cachePath, {\n packageName,\n checkedAt: now.toISOString(),\n currentVersion: options.currentVersion,\n errorMessage,\n });\n return { status: 'error', errorMessage };\n }\n}\n\nfunction tryWriteUpdateCheckCache(path: string, cache: IUpdateCheckCache): void {\n try {\n writeUpdateCheckCache(path, cache);\n } catch {\n // Update checks are best-effort startup UX; cache I/O must not break CLI startup.\n }\n}\n\nexport async function getStartupCliUpdateNotice(\n options: ICheckForCliUpdateOptions,\n): Promise<ICliUpdateNotice | undefined> {\n const result = await checkForCliUpdate(options);\n return result.status === 'update_available' ? result.notice : undefined;\n}\n\nexport function shouldRunStartupCliUpdateCheck(input: IStartupCliUpdatePolicyInput): boolean {\n return input.printMode === false && input.disableUpdateCheck === false;\n}\n\nexport function formatCliUpdateNotice(notice: ICliUpdateNotice): string {\n return [\n `Robota update available: ${notice.currentVersion} -> ${notice.latestVersion}.`,\n `Run ${notice.installCommand}`,\n ].join(' ');\n}\n\nexport function formatCliUpdateCheckMessage(result: TCliUpdateCheckResult): string {\n if (result.status === 'update_available') {\n return formatCliUpdateNotice(result.notice);\n }\n if (result.status === 'current') {\n return `Robota is up to date (${result.currentVersion}).`;\n }\n if (result.status === 'skipped') {\n return 'Robota update check skipped.';\n }\n return `Robota update check failed: ${result.errorMessage}`;\n}\n\nfunction resultFromCache(cache: IUpdateCheckCache, currentVersion: string): TCliUpdateCheckResult {\n if (cache.errorMessage !== undefined) {\n return { status: 'error', errorMessage: cache.errorMessage };\n }\n if (cache.latestVersion === undefined) {\n return { status: 'error', errorMessage: 'Cached update check has no latest version' };\n }\n return resultFromLatestVersion(currentVersion, cache.latestVersion);\n}\n\nfunction resultFromLatestVersion(\n currentVersion: string,\n latestVersion: string,\n): TCliUpdateCheckResult {\n if (isNewerSemverVersion(latestVersion, currentVersion)) {\n return {\n status: 'update_available',\n notice: {\n currentVersion,\n latestVersion,\n installCommand: DEFAULT_INSTALL_COMMAND,\n },\n };\n }\n return { status: 'current', currentVersion, latestVersion };\n}\n\nfunction isFreshCache(\n cache: IUpdateCheckCache,\n now: Date,\n ttlMs: number,\n packageName: string,\n): boolean {\n if (cache.packageName !== packageName) {\n return false;\n }\n const checkedAt = Date.parse(cache.checkedAt);\n if (!Number.isFinite(checkedAt)) {\n return false;\n }\n return now.getTime() - checkedAt < ttlMs;\n}\n\nasync function fetchLatestVersion(options: {\n fetchImpl: typeof fetch;\n packageName: string;\n registryUrl: string;\n timeoutMs: number;\n}): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs);\n try {\n const packageUrl = buildPackageMetadataUrl(options.registryUrl, options.packageName);\n const response = await options.fetchImpl(packageUrl, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(`registry responded with HTTP ${response.status}`);\n }\n const metadata = (await response.json()) as INpmPackageMetadata;\n const latest = metadata['dist-tags']?.latest;\n if (typeof latest !== 'string' || latest.trim().length === 0) {\n throw new Error('registry metadata is missing dist-tags.latest');\n }\n return latest;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction buildPackageMetadataUrl(registryUrl: string, packageName: string): string {\n return `${registryUrl.replace(/\\/+$/, '')}/${encodeURIComponent(packageName)}`;\n}\n\nfunction parseUpdateCheckCache(value: TJsonValue): IUpdateCheckCache | undefined {\n if (!isJsonObject(value)) {\n return undefined;\n }\n const candidate = value;\n if (\n typeof candidate.packageName === 'string' &&\n typeof candidate.checkedAt === 'string' &&\n typeof candidate.currentVersion === 'string' &&\n (candidate.latestVersion === undefined || typeof candidate.latestVersion === 'string') &&\n (candidate.errorMessage === undefined || typeof candidate.errorMessage === 'string')\n ) {\n return {\n packageName: candidate.packageName,\n checkedAt: candidate.checkedAt,\n currentVersion: candidate.currentVersion,\n ...(candidate.latestVersion !== undefined && { latestVersion: candidate.latestVersion }),\n ...(candidate.errorMessage !== undefined && { errorMessage: candidate.errorMessage }),\n };\n }\n return undefined;\n}\n\nfunction isJsonObject(value: TJsonValue): value is { readonly [key: string]: TJsonValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { TUniversalValue } from '@robota-sdk/agent-core';\nimport type {\n IStatusLineCommandSettings,\n TStatusLineCommandSettingsPatch,\n} from '@robota-sdk/agent-framework';\nimport { DEFAULT_STATUS_LINE_COMMAND_SETTINGS } from '@robota-sdk/agent-framework';\nimport type { TSettingsData } from './settings-io.js';\nimport { readSettings, writeSettings } from './settings-io.js';\n\nexport type TStatusLineSettings = IStatusLineCommandSettings;\nexport type TStatusLineSettingsPatch = TStatusLineCommandSettingsPatch;\n\nconst DEFAULT_STATUS_LINE_SETTINGS: TStatusLineSettings = {\n ...DEFAULT_STATUS_LINE_COMMAND_SETTINGS,\n};\n\nexport function readStatusLineSettings(settings: TSettingsData): TStatusLineSettings {\n const raw = settings.statusline;\n if (!isRecord(raw)) {\n return { ...DEFAULT_STATUS_LINE_SETTINGS };\n }\n\n return {\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : DEFAULT_STATUS_LINE_SETTINGS.enabled,\n gitBranch:\n typeof raw.gitBranch === 'boolean' ? raw.gitBranch : DEFAULT_STATUS_LINE_SETTINGS.gitBranch,\n };\n}\n\nexport function applyStatusLineSettings(\n settingsPath: string,\n patch: TStatusLineSettingsPatch,\n): TStatusLineSettings {\n const settings = readSettings(settingsPath);\n const next = {\n ...readStatusLineSettings(settings),\n ...patch,\n };\n settings.statusline = next;\n writeSettings(settingsPath, settings);\n return next;\n}\n\nfunction isRecord(value: TUniversalValue): value is Record<string, TUniversalValue> {\n return (\n value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)\n );\n}\n","import { existsSync, lstatSync, readFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\n\nconst DETACHED_HEAD_LENGTH = 7;\n\nexport function resolveGitBranch(cwd: string): string | undefined {\n try {\n const gitDir = findGitDir(cwd);\n if (!gitDir) return undefined;\n\n const head = readFileSync(join(gitDir, 'HEAD'), 'utf8').trim();\n if (!head) return undefined;\n if (head.startsWith('ref: ')) {\n const ref = head.slice('ref: '.length).trim();\n const branchPrefix = 'refs/heads/';\n return ref.startsWith(branchPrefix) ? ref.slice(branchPrefix.length) : ref;\n }\n return head.slice(0, DETACHED_HEAD_LENGTH);\n } catch {\n return undefined;\n }\n}\n\nfunction findGitDir(start: string): string | undefined {\n let current = resolve(start);\n let parent = dirname(current);\n\n while (parent !== current) {\n const candidate = join(current, '.git');\n const resolved = resolveGitMetadata(candidate, current);\n if (resolved) return resolved;\n\n current = parent;\n parent = dirname(current);\n }\n\n const rootCandidate = join(current, '.git');\n return resolveGitMetadata(rootCandidate, current);\n}\n\nfunction resolveGitMetadata(candidate: string, repoDir: string): string | undefined {\n if (!existsSync(candidate)) return undefined;\n const stat = lstatSync(candidate);\n if (stat.isDirectory()) return candidate;\n if (!stat.isFile()) return undefined;\n\n const content = readFileSync(candidate, 'utf8').trim();\n const prefix = 'gitdir:';\n if (!content.startsWith(prefix)) return undefined;\n const rawPath = content.slice(prefix.length).trim();\n return isAbsolute(rawPath) ? rawPath : resolve(repoDir, rawPath);\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n BundlePluginLoader,\n CommandRegistry,\n PluginCommandSource,\n} from '@robota-sdk/agent-framework';\n\nconst PLUGIN_SOURCE_NAME = 'plugin';\n\nfunction getHomeDir(): string {\n return process.env.HOME ?? homedir();\n}\n\nexport function reloadPluginCommandSource(registry: CommandRegistry): number {\n const pluginsDir = join(getHomeDir(), '.robota', 'plugins');\n const loader = new BundlePluginLoader(pluginsDir);\n try {\n const plugins = loader.loadPluginsSync();\n if (plugins.length === 0) {\n registry.replaceSource(PLUGIN_SOURCE_NAME);\n return 0;\n }\n registry.replaceSource(PLUGIN_SOURCE_NAME, new PluginCommandSource(plugins));\n return plugins.length;\n } catch {\n registry.replaceSource(PLUGIN_SOURCE_NAME);\n return 0;\n }\n}\n","import { execSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n BundlePluginInstaller,\n BundlePluginLoader,\n MarketplaceClient,\n PluginSettingsStore,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICommandAvailablePlugin,\n ICommandInstalledPlugin,\n ICommandMarketplaceSource,\n ICommandPluginAdapter,\n IMarketplaceManifest,\n TPluginInstallScope,\n} from '@robota-sdk/agent-framework';\n\ninterface ICliPluginServices {\n cwd: string;\n marketplace: MarketplaceClient;\n installer: BundlePluginInstaller;\n loader: BundlePluginLoader;\n settingsStore: PluginSettingsStore;\n}\n\nfunction createCliPluginServices(cwd: string): ICliPluginServices {\n const home = homedir();\n const pluginsDir = join(home, '.robota', 'plugins');\n const userSettingsPath = join(home, '.robota', 'settings.json');\n\n const exec = (command: string, options: { timeout: number; stdio?: string }) =>\n execSync(command, {\n timeout: options.timeout,\n stdio: (options.stdio ?? 'pipe') as 'pipe' | 'inherit' | 'ignore',\n });\n\n const settingsStore = new PluginSettingsStore(userSettingsPath);\n const marketplace = new MarketplaceClient({ pluginsDir, exec });\n const installer = new BundlePluginInstaller({\n pluginsDir,\n settingsStore,\n marketplaceClient: marketplace,\n exec,\n });\n const loader = new BundlePluginLoader(pluginsDir);\n\n return {\n cwd,\n marketplace,\n installer,\n loader,\n settingsStore,\n };\n}\n\nasync function listInstalledPlugins(\n services: ICliPluginServices,\n): Promise<readonly ICommandInstalledPlugin[]> {\n const plugins = await services.loader.loadAll();\n const enabledMap = services.settingsStore.getEnabledPlugins();\n return plugins.map((plugin) => {\n const parts = plugin.pluginDir.split('/');\n const cacheIdx = parts.indexOf('cache');\n const marketplaceName = cacheIdx >= 0 ? (parts[cacheIdx + 1] ?? '') : '';\n const fullId = marketplaceName\n ? `${plugin.manifest.name}@${marketplaceName}`\n : plugin.manifest.name;\n return {\n name: fullId,\n description: plugin.manifest.description,\n enabled: enabledMap[fullId] !== false && enabledMap[plugin.manifest.name] !== false,\n };\n });\n}\n\nasync function listAvailablePlugins(\n services: ICliPluginServices,\n marketplaceName: string,\n): Promise<readonly ICommandAvailablePlugin[]> {\n let manifest: IMarketplaceManifest;\n try {\n manifest = services.marketplace.fetchManifest(marketplaceName);\n } catch {\n return [];\n }\n const installed = services.installer.getInstalledPlugins();\n const installedNames = new Set(Object.values(installed).map((record) => record.pluginName));\n return manifest.plugins.map((plugin) => ({\n name: plugin.name,\n description: plugin.description,\n installed: installedNames.has(plugin.name),\n }));\n}\n\nasync function installPlugin(\n services: ICliPluginServices,\n pluginId: string,\n scope?: TPluginInstallScope,\n): Promise<void> {\n const [name, marketplaceName] = pluginId.split('@');\n if (!name || !marketplaceName) {\n throw new Error('Plugin ID must be in format: name@marketplace');\n }\n if (scope === 'project') {\n const projectPluginsDir = join(services.cwd, '.robota', 'plugins');\n const projectExec = (command: string, options: { timeout: number; stdio?: string }) =>\n execSync(command, {\n timeout: options.timeout,\n stdio: (options.stdio ?? 'pipe') as 'pipe' | 'inherit' | 'ignore',\n });\n const projectInstaller = new BundlePluginInstaller({\n pluginsDir: projectPluginsDir,\n settingsStore: services.settingsStore,\n marketplaceClient: services.marketplace,\n exec: projectExec,\n });\n await projectInstaller.install(name, marketplaceName);\n return;\n }\n await services.installer.install(name, marketplaceName);\n}\n\nasync function removeMarketplace(services: ICliPluginServices, name: string): Promise<void> {\n const installedFromMarketplace = services.installer.getPluginsByMarketplace(name);\n for (const record of installedFromMarketplace) {\n await services.installer.uninstall(`${record.pluginName}@${record.marketplace}`);\n }\n services.marketplace.removeMarketplace(name);\n}\n\nfunction listMarketplaces(services: ICliPluginServices): readonly ICommandMarketplaceSource[] {\n return services.marketplace.listMarketplaces().map((marketplaceEntry) => ({\n name: marketplaceEntry.name,\n type: marketplaceEntry.source.type,\n }));\n}\n\nexport function createCliPluginCommandAdapter(cwd: string): ICommandPluginAdapter {\n const services = createCliPluginServices(cwd);\n return {\n listInstalled: () => listInstalledPlugins(services),\n listAvailablePlugins: (marketplaceName) => listAvailablePlugins(services, marketplaceName),\n install: (pluginId, scope) => installPlugin(services, pluginId, scope),\n uninstall: async (pluginId) => services.installer.uninstall(pluginId),\n enable: async (pluginId) => services.installer.enable(pluginId),\n disable: async (pluginId) => services.installer.disable(pluginId),\n marketplaceAdd: async (source) => {\n if (source.includes('/') && !source.includes(':')) {\n return services.marketplace.addMarketplace({ type: 'github', repo: source });\n }\n return services.marketplace.addMarketplace({ type: 'git', url: source });\n },\n marketplaceRemove: (name) => removeMarketplace(services, name),\n marketplaceUpdate: async (name) => services.marketplace.updateMarketplace(name),\n marketplaceList: async () => listMarketplaces(services),\n reloadPlugins: async () => ({\n loadedPluginCount: (await services.loader.loadAll()).length,\n }),\n };\n}\n","import { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n): Promise<boolean> {\n if (args.positional[0] !== 'user-local') {\n return false;\n }\n\n const result = await executeUserLocalDirectCommand({\n cwd,\n argv: args.positional.slice(1),\n format: args.format,\n summary: args.summary,\n source: args.source,\n });\n const output = result.message.endsWith('\\n') ? result.message : `${result.message}\\n`;\n if (!result.success) {\n process.stderr.write(output);\n process.exit(1);\n }\n process.stdout.write(output);\n return true;\n}\n","import type {\n ITuiCommandInteraction,\n ITuiPickerItem,\n TAnyTuiCommandInteraction,\n} from '@robota-sdk/agent-transport';\n\ntype TSystemCommandName =\n | 'agent'\n | 'background'\n | 'clear'\n | 'compact'\n | 'context'\n | 'cost'\n | 'exit'\n | 'help'\n | 'language'\n | 'memory'\n | 'mode'\n | 'model'\n | 'permissions'\n | 'plugin'\n | 'provider'\n | 'rename'\n | 'reset'\n | 'resume'\n | 'rewind'\n | 'settings'\n | 'skills'\n | 'statusline'\n | 'user-local'\n | 'validate-session';\n\nfunction getModeItems(): ITuiPickerItem[] {\n return [\n { label: 'plan', value: 'plan', description: 'Plan only, no execution' },\n { label: 'default', value: 'default', description: 'Ask before risky actions' },\n { label: 'acceptEdits', value: 'acceptEdits', description: 'Auto-approve file edits' },\n {\n label: 'bypassPermissions',\n value: 'bypassPermissions',\n description: 'Skip all permission checks',\n },\n ];\n}\n\nfunction getLanguageItems(): ITuiPickerItem[] {\n return [\n { label: 'ko Korean', value: 'ko', description: '한국어' },\n { label: 'en English', value: 'en', description: 'English' },\n { label: 'ja Japanese', value: 'ja', description: '日本語' },\n { label: 'zh Chinese', value: 'zh', description: '中文' },\n ];\n}\n\nfunction getProviderSubcommandItems(): ITuiPickerItem[] {\n return [\n { label: 'current', value: 'current', description: 'Show current provider' },\n { label: 'list', value: 'list', description: 'List available providers' },\n { label: 'use', value: 'use', description: 'Switch to a provider' },\n { label: 'add', value: 'add', description: 'Add a new provider' },\n { label: 'test', value: 'test', description: 'Test provider connection' },\n ];\n}\n\nexport const TUI_COMMAND_INTERACTIONS: Record<\n TSystemCommandName,\n TAnyTuiCommandInteraction | undefined\n> = {\n agent: undefined, // natural language args — free input\n background: undefined, // has subcommands — insert\n clear: { onMissingArgs: 'confirm', message: 'Clear conversation history?' },\n compact: undefined, // optional args — runs immediately\n context: undefined, // has subcommands — insert\n cost: undefined, // no args needed — runs immediately\n exit: { onMissingArgs: 'confirm', message: 'Exit the session?' },\n help: undefined, // no args needed — runs immediately\n language: { onMissingArgs: 'picker', getItems: getLanguageItems },\n memory: undefined, // has subcommands — insert\n mode: { onMissingArgs: 'picker', getItems: getModeItems },\n model: undefined, // runtime model list — handled via subcommand insert for now\n permissions: undefined, // has subcommands — insert\n plugin: undefined, // has subcommands — insert\n provider: { onMissingArgs: 'picker', getItems: getProviderSubcommandItems },\n rename: undefined, // needs text input — free input\n reset: undefined, // wizard — deferred\n resume: undefined, // picker requires session store — deferred\n rewind: undefined, // optional args — runs immediately\n settings: undefined, // has subcommands — insert\n skills: undefined, // free input\n statusline: undefined, // has subcommands — insert\n 'user-local': undefined, // has subcommands — insert\n 'validate-session': undefined, // no args needed — runs immediately\n};\n\nexport function resolveInteraction(commandName: string): TAnyTuiCommandInteraction | undefined {\n return TUI_COMMAND_INTERACTIONS[commandName as TSystemCommandName];\n}\n","/**\n * CLI entry point — parses arguments, creates provider, and starts the Ink TUI.\n *\n * CLI composes provider definitions. SDK owns everything else\n * (config, context, session, tools).\n */\n\nimport { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { IAIProvider } from '@robota-sdk/agent-core';\nimport { findProviderDefinition } from '@robota-sdk/agent-framework';\nimport type { IProviderDefinition } from '@robota-sdk/agent-framework';\nimport { createAgentCommandModule } from '@robota-sdk/agent-command';\nimport { createBackgroundCommandModule } from '@robota-sdk/agent-command';\nimport { createProviderCommandModule } from '@robota-sdk/agent-command';\nimport { createCompactCommandModule } from '@robota-sdk/agent-command';\nimport { createContextCommandModule } from '@robota-sdk/agent-command';\nimport { createExitCommandModule } from '@robota-sdk/agent-command';\nimport { createHelpCommandModule } from '@robota-sdk/agent-command';\nimport { createLanguageCommandModule } from '@robota-sdk/agent-command';\nimport { createMemoryCommandModule } from '@robota-sdk/agent-command';\nimport { createModelCommandModule } from '@robota-sdk/agent-command';\nimport { createPermissionsCommandModule } from '@robota-sdk/agent-command';\nimport { createPluginCommandModule } from '@robota-sdk/agent-command';\nimport { createResetCommandModule } from '@robota-sdk/agent-command';\nimport { createRewindCommandModule } from '@robota-sdk/agent-command';\nimport { createStatusLineCommandModule } from '@robota-sdk/agent-command';\nimport { createSessionCommandModule } from '@robota-sdk/agent-command';\nimport { createSkillsCommandModule } from '@robota-sdk/agent-command';\nimport { createUserLocalCommandModule } from '@robota-sdk/agent-command';\nimport { createModeCommandModule } from '@robota-sdk/agent-command';\nimport { createSettingsCommandModule } from '@robota-sdk/agent-command';\nimport {\n InteractiveSession,\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n getUserSettingsPath,\n deleteSettings,\n readSettings,\n writeSettings,\n} from './utils/settings-io.js';\nimport {\n createProviderFromSettings,\n readMergedProviderSettings,\n readProviderSettings,\n} from './utils/provider-factory.js';\nimport { DEFAULT_PROVIDER_DEFINITIONS } from './utils/provider-default-definitions.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './utils/provider-setup.js';\nimport { resolveProviderSettingsWriteTargetPath } from './utils/provider-configuration.js';\nimport { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';\nimport { WsTransport } from '@robota-sdk/agent-transport/ws';\nimport { TuiTransport } from '@robota-sdk/agent-transport/tui';\nimport type { ITuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { TransportRegistry } from './transports/transport-registry.js';\nimport {\n createDefaultBackgroundTaskRunners,\n type IBackgroundTaskRunner,\n} from '@robota-sdk/agent-executor';\nimport { createChildProcessSubagentRunnerFactory } from './subagents/index.js';\nimport {\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n getStartupCliUpdateNotice,\n shouldRunStartupCliUpdateCheck,\n} from './utils/update-check.js';\nimport type { ICliUpdateNotice } from './utils/update-check.js';\nimport { applyStatusLineSettings } from './utils/statusline-settings.js';\nimport { applyActiveModelChange } from './utils/provider-configuration.js';\nimport { resolveGitBranch } from './utils/git-branch.js';\nimport { reloadPluginCommandSource } from './plugins/plugin-command-source-loader.js';\nimport { createCliPluginCommandAdapter } from './plugins/plugin-command-adapter.js';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { resolveInteraction } from './tui-interactions/registry.js';\n\nconst PRINTABLE_ASCII_START = 32;\n\n/** Read version from package.json at runtime. */\nfunction readVersion(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const dir = dirname(thisFile);\n const candidates = [join(dir, '..', '..', 'package.json'), join(dir, '..', 'package.json')];\n\n for (const pkgPath of candidates) {\n try {\n const raw = readFileSync(pkgPath, 'utf-8');\n const pkg = JSON.parse(raw) as { version?: string; name?: string };\n if (pkg.version !== undefined && pkg.name !== undefined) {\n return pkg.version;\n }\n } catch {\n // try next candidate\n }\n }\n return '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\n/** Prompt for input in raw mode. Mask with asterisks if masked=true. */\nfunction promptInput(label: string, masked = false): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n process.stdout.write(label);\n let input = '';\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n if (!stdin.isTTY) {\n reject(\n new Error(\n 'Cannot prompt for input: stdin is not a TTY.\\n' +\n 'Set your API key via environment variable instead:\\n' +\n ' ANTHROPIC_API_KEY=<key> robota\\n' +\n ' OPENAI_API_KEY=<key> robota',\n ),\n );\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n const onData = (data: string): void => {\n for (const ch of data) {\n if (ch === '\\r' || ch === '\\n') {\n stdin.removeListener('data', onData);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stdout.write('\\n');\n resolve(input.trim());\n return;\n } else if (ch === '\\x7f' || ch === '\\b') {\n if (input.length > 0) {\n input = input.slice(0, -1);\n process.stdout.write('\\b \\b');\n }\n } else if (ch === '\\x03') {\n stdin.removeListener('data', onData);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stdout.write('\\n');\n process.exit(0);\n } else if (ch.charCodeAt(0) >= PRINTABLE_ASCII_START) {\n input += ch;\n process.stdout.write(masked ? '*' : ch);\n }\n }\n };\n stdin.on('data', onData);\n });\n}\n\nfunction readTaskFilePrompt(cwd: string, taskFile: string): string {\n const taskPath = resolve(cwd, taskFile);\n const content = readFileSync(taskPath, 'utf8').trim();\n if (content.length === 0) {\n throw new Error(`Task file is empty: ${taskFile}`);\n }\n return `Task file (${taskFile}):\\n${content}`;\n}\n\n/** Delete user settings and exit. */\nfunction resetConfig(): void {\n const userPath = getUserSettingsPath();\n if (deleteSettings(userPath)) {\n process.stdout.write(`Deleted ${userPath}\\n`);\n } else {\n process.stdout.write('No user settings found.\\n');\n }\n}\n\n/**\n * Main CLI orchestration function.\n */\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICreateDefaultCliCommandModulesOptions {\n cwd: string;\n providerDefinitions: readonly IProviderDefinition[];\n}\n\nexport function createDefaultCliCommandModules({\n cwd,\n providerDefinitions,\n}: ICreateDefaultCliCommandModulesOptions): readonly ICommandModule[] {\n return [\n createSkillsCommandModule({ cwd }),\n createHelpCommandModule(),\n createAgentCommandModule(),\n createModelCommandModule({\n providerDefinitions,\n settings: {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n },\n }),\n createPermissionsCommandModule(),\n createModeCommandModule(),\n createLanguageCommandModule(),\n createBackgroundCommandModule(),\n createMemoryCommandModule(),\n createUserLocalCommandModule(),\n createCompactCommandModule(),\n createContextCommandModule(),\n createExitCommandModule(),\n createSessionCommandModule(),\n createResetCommandModule(),\n createRewindCommandModule(),\n createStatusLineCommandModule(),\n createPluginCommandModule(),\n createSettingsCommandModule(),\n createProviderCommandModule({\n providerDefinitions,\n settings: {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n readTargetSettings: () =>\n readSettings(resolveProviderSettingsWriteTargetPath(cwd)) as TProviderSettingsDocument,\n writeTargetSettings: (settings) =>\n writeSettings(resolveProviderSettingsWriteTargetPath(cwd), settings),\n },\n }),\n ];\n}\n\ninterface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nfunction buildCommandSetup(\n cwd: string,\n args: IParsedCliArgs,\n options: IStartCliOptions,\n version: string,\n): ICliSetup {\n const commandHostAdapters: ICommandHostAdapters = {\n settings: {\n read: () => readSettings(getUserSettingsPath()),\n write: (settings) => writeSettings(getUserSettingsPath(), settings),\n },\n plugin: createCliPluginCommandAdapter(cwd),\n };\n const providerDefinitions = options.providerDefinitions ?? DEFAULT_PROVIDER_DEFINITIONS;\n const commandModules: readonly ICommandModule[] = [\n ...createDefaultCliCommandModules({ cwd, providerDefinitions }),\n ...(options.commandModules ?? []),\n ];\n const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n\nfunction buildAppendSystemPrompt(cwd: string, args: IParsedCliArgs): string | undefined {\n const appendParts: string[] = [];\n if (args.appendSystemPrompt) appendParts.push(args.appendSystemPrompt);\n if (args.taskFile) {\n try {\n appendParts.push(readTaskFilePrompt(cwd, args.taskFile));\n } catch (error) {\n // allow-fallback: terminal failure — task file read failure exits process\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n }\n if (args.jsonSchema)\n appendParts.push(\n `Respond with valid JSON only, matching this JSON schema:\\n${args.jsonSchema}`,\n );\n return appendParts.length > 0 ? appendParts.join('\\n\\n') : undefined;\n}\n\nasync function runPrintMode(\n cwd: string,\n args: IParsedCliArgs,\n provider: IAIProvider,\n sessionStore: ReturnType<typeof createProjectSessionStore>,\n backgroundTaskRunners: IBackgroundTaskRunner[],\n subagentRunnerFactory: ReturnType<typeof createChildProcessSubagentRunnerFactory>,\n commandModules: readonly ICommandModule[],\n commandHostAdapters: ICommandHostAdapters,\n): Promise<void> {\n let prompt = args.positional.join(' ').trim();\n\n // Stdin pipe: read from stdin if no positional args and stdin is piped\n if (!prompt && !process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n process.stderr.write('Print mode (-p) requires a prompt argument.\\n');\n process.exit(1);\n }\n\n const appendSystemPrompt = buildAppendSystemPrompt(cwd, args);\n\n // TODO: wire --system-prompt once IInteractiveSessionStandardOptions adds systemPrompt field\n if (args.systemPrompt) {\n process.stderr.write('Warning: --system-prompt is not yet functional and will be ignored.\\n');\n }\n\n const shellExec = (command: string) =>\n execSync(command, { timeout: 5000, encoding: 'utf-8', stdio: 'pipe' }).trimEnd();\n\n const session = new InteractiveSession({\n cwd,\n provider,\n permissionMode: args.permissionMode ?? 'bypassPermissions',\n maxTurns: args.maxTurns,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n sessionName: args.sessionName,\n bare: args.bare || undefined,\n allowedTools: args.allowedTools\n ? args.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n appendSystemPrompt,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n shellExec,\n agentName: 'robota-cli',\n });\n\n const transport = createHeadlessTransport({\n outputFormat: args.outputFormat ?? 'text',\n prompt,\n });\n session.attachTransport(transport);\n await transport.start();\n await session.shutdown({ reason: 'prompt_input_exit', message: 'Headless transport complete' });\n process.exit(transport.getExitCode());\n}\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n const args = parseCliArgs();\n const version = readVersion();\n\n if (args.help) {\n printHelp();\n return;\n }\n\n if (args.version) {\n process.stdout.write(`robota ${version}\\n`);\n return;\n }\n\n if (args.checkUpdate) {\n const result = await checkForCliUpdate({ currentVersion: version, force: true });\n const message = formatCliUpdateCheckMessage(result);\n if (result.status === 'error') {\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n }\n process.stdout.write(`${message}\\n`);\n return;\n }\n\n if (args.reset) {\n resetConfig();\n return;\n }\n\n const cwd = process.cwd();\n\n if (await runUserLocalDirectCommandIfRequested(args, cwd)) {\n return;\n }\n\n const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, providerDefinitions);\n } catch (error) {\n // allow-fallback: terminal failure — not a silent fallback\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n\n // CLI resolves the active provider profile through injected provider definitions.\n const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const activeProviderSettings = readMergedProviderSettings(cwd);\n const providerProfileName = args.provider ?? activeProviderSettings.currentProvider;\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider: IAIProvider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\n // Session management\n const sessionStore = createProjectSessionStore(cwd);\n let resumeSessionId: string | undefined;\n let showSessionPickerOnStart = false;\n\n if (args.continueMode) {\n resumeSessionId = resolveLatestSessionId(sessionStore, cwd);\n } else if (args.resumeId !== undefined) {\n if (args.resumeId === '') {\n showSessionPickerOnStart = true;\n } else {\n resumeSessionId = resolveSessionIdByIdOrName(sessionStore, args.resumeId);\n if (resumeSessionId === undefined) {\n process.stderr.write(`Session not found: ${args.resumeId}\\n`);\n process.exit(1);\n }\n }\n }\n\n if (args.printMode) {\n await runPrintMode(\n cwd,\n args,\n provider,\n sessionStore,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n );\n return;\n }\n\n // Interactive TUI mode (Ink)\n const tuiTransport = new TuiTransport({\n cwd,\n provider,\n providerOverride: args.provider,\n providerType: providerSettings.name,\n modelId,\n language: args.language,\n permissionMode: args.permissionMode,\n maxTurns: args.maxTurns,\n version,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n resumeSessionId,\n showSessionPickerOnStart,\n forkSession: args.forkSession,\n sessionName: args.sessionName,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n shellExec: (command: string) =>\n execSync(command, { timeout: 5000, encoding: 'utf-8', stdio: 'pipe' }).trimEnd(),\n startupUpdateNotice: startupUpdateNoticePromise\n ? startupUpdateNoticePromise.then((n) => (n ? formatCliUpdateNotice(n) : undefined))\n : undefined,\n transportRegistry: createTransportRegistry(),\n cliAdapter: createTuiCliAdapter(providerDefinitions),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\n resolveInteraction,\n });\n await tuiTransport.start();\n process.exit(0);\n}\n\nfunction createTuiCliAdapter(providerDefinitions: readonly IProviderDefinition[]): ITuiCliAdapter {\n return {\n getUserSettingsPath: () => getUserSettingsPath(),\n readSettings: (path) => readSettings(path),\n writeSettings: (path, settings) => writeSettings(path, settings),\n deleteSettings: (path) => deleteSettings(path),\n applyStatusLineSettings: (path, patch) => applyStatusLineSettings(path, patch),\n reloadPluginCommandSource: (registry) => {\n reloadPluginCommandSource(registry);\n },\n applyActiveModelChange: (cwd, modelId, options) => {\n applyActiveModelChange(cwd, modelId, options);\n return { applied: true };\n },\n getGitBranch: (cwd) => resolveGitBranch(cwd),\n getProviderDisplayName: (type) =>\n findProviderDefinition(providerDefinitions, type)?.displayName ?? type,\n };\n}\n\nfunction createTransportRegistry(): TransportRegistry {\n const registry = new TransportRegistry(getUserSettingsPath());\n registry.register(new WsTransport());\n return registry;\n}\n","#!/usr/bin/env node\n/**\n * Robota CLI binary entry point.\n *\n * Boots the CLI and handles any uncaught top-level errors gracefully.\n *\n * NOTE: Node.js version check and Terminal.app warning are injected as a\n * build-time banner in tsup.config.ts, ensuring they execute before any\n * ESM module is loaded (static imports are hoisted by the JS engine).\n */\nimport { startCli } from './cli.js';\nimport type { TUniversalValue } from '@robota-sdk/agent-core';\n\n// Last-resort crash prevention for IME-related errors only.\n// Korean IME in raw mode can cause errors that escape React/Ink.\n// Non-IME errors are re-thrown to preserve normal crash behavior.\nprocess.on('uncaughtException', (err) => {\n const msg = err.message ?? '';\n const isLikelyIME =\n msg.includes('string-width') ||\n msg.includes('setCursorPosition') ||\n msg.includes('getStringWidth') ||\n msg.includes('slice') ||\n msg.includes('charCodeAt');\n if (isLikelyIME) {\n process.stderr.write(`[robota] IME error suppressed: ${msg}\\n`);\n return;\n }\n // Re-throw non-IME errors — let them crash normally\n throw err;\n});\n\nstartCli().catch((err: Error | TUniversalValue) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(message + '\\n');\n process.exit(1);\n});\n"],"mappings":";myFAQA,MAAM,EAAiC,CAAC,OAAQ,UAAW,cAAe,mBAAmB,EAEvF,EAAuB,CAAC,OAAQ,OAAQ,aAAa,EA0C3D,SAAgB,IAAkB,CAChC,QAAQ,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BtB,CACD,CAGA,SAAgB,GAAkB,EAAoD,CAChF,OAAQ,IAAA,GAOZ,OANM,EAA2C,SAAS,CAAG,IAC3D,QAAQ,OAAO,MACb,4BAA4B,EAAI,YAAY,EAAqB,KAAK,KAAK,EAAE,GAC/E,EACA,QAAQ,KAAK,CAAC,GAET,CACT,CAGA,SAAgB,GAAoB,EAAsD,CACpF,OAAQ,IAAA,GAKZ,OAJK,EAAY,SAAS,CAAsB,IAC9C,QAAQ,OAAO,MAAM,8BAA8B,EAAI,YAAY,EAAY,KAAK,KAAK,EAAE,GAAG,EAC9F,QAAQ,KAAK,CAAC,GAET,CACT,CAGA,SAAgB,GAAc,EAA6C,CACzE,GAAI,IAAQ,IAAA,GAAW,OACvB,IAAM,EAAI,SAAS,EAAK,EAAE,EAK1B,OAJI,MAAM,CAAC,GAAK,GAAK,KACnB,QAAQ,OAAO,MAAM,wBAAwB,EAAI,iCAAiC,EAClF,QAAQ,KAAK,CAAC,GAET,CACT,CAGA,SAAgB,IAA+B,CAC7C,GAAM,CAAE,SAAQ,eAAgB,GAAU,CACxC,iBAAkB,GAClB,QAAS,CACP,KAAM,CAAE,KAAM,UAAW,MAAO,IAAK,QAAS,EAAM,EACpD,EAAG,CAAE,KAAM,UAAW,MAAO,IAAK,QAAS,EAAM,EACjD,SAAU,CAAE,KAAM,UAAW,MAAO,IAAK,QAAS,EAAM,EACxD,OAAQ,CAAE,KAAM,SAAU,MAAO,GAAI,EACrC,MAAO,CAAE,KAAM,QAAS,EACxB,SAAU,CAAE,KAAM,QAAS,EAC3B,kBAAmB,CAAE,KAAM,QAAS,EACpC,YAAa,CAAE,KAAM,QAAS,EAC9B,eAAgB,CAAE,KAAM,UAAW,QAAS,EAAM,EAClD,KAAM,CAAE,KAAM,SAAU,MAAO,GAAI,EACnC,gBAAiB,CAAE,KAAM,QAAS,EAClC,OAAQ,CAAE,KAAM,QAAS,EACzB,QAAS,CAAE,KAAM,QAAS,EAC1B,OAAQ,CAAE,KAAM,QAAS,EACzB,gBAAiB,CAAE,KAAM,QAAS,EAClC,uBAAwB,CAAE,KAAM,QAAS,EACzC,YAAa,CAAE,KAAM,QAAS,EAC9B,QAAS,CAAE,KAAM,UAAW,QAAS,EAAM,EAC3C,MAAO,CAAE,KAAM,UAAW,QAAS,EAAM,EACzC,KAAM,CAAE,KAAM,UAAW,QAAS,EAAM,EACxC,gBAAiB,CAAE,KAAM,QAAS,EAClC,yBAA0B,CAAE,KAAM,UAAW,QAAS,EAAM,EAC5D,cAAe,CAAE,KAAM,QAAS,EAChC,UAAW,CAAE,KAAM,UAAW,QAAS,EAAM,EAC7C,qBAAsB,CAAE,KAAM,QAAS,EACvC,SAAU,CAAE,KAAM,QAAS,EAC3B,KAAM,CAAE,KAAM,QAAS,EACvB,WAAY,CAAE,KAAM,QAAS,EAC7B,UAAW,CAAE,KAAM,QAAS,EAC5B,cAAe,CAAE,KAAM,QAAS,EAChC,cAAe,CAAE,KAAM,UAAW,QAAS,EAAM,EACjD,iBAAkB,CAAE,KAAM,QAAS,EACnC,eAAgB,CAAE,KAAM,UAAW,QAAS,EAAM,EAClD,uBAAwB,CAAE,KAAM,UAAW,QAAS,EAAM,CAC5D,CACF,CAAC,EAED,MAAO,CACL,WAAY,EACZ,KAAM,EAAO,MAAW,GACxB,UAAW,EAAO,GAAQ,GAC1B,aAAc,EAAO,UAAe,GACpC,SAAU,EAAO,OACjB,MAAO,EAAO,MACd,SAAU,EAAO,SACjB,eAAgB,GAAoB,EAAO,kBAAkB,EAC7D,SAAU,GAAc,EAAO,YAAY,EAC3C,YAAa,EAAO,iBAAmB,GACvC,YAAa,EAAO,KACpB,aAAc,GAAkB,EAAO,gBAAgB,EACvD,OAAQ,EAAO,OACf,QAAS,EAAO,QAChB,OAAQ,EAAO,OACf,aAAc,EAAO,iBACrB,mBAAoB,EAAO,wBAC3B,SAAU,EAAO,aACjB,QAAS,EAAO,SAAc,GAC9B,MAAO,EAAO,OAAY,GAC1B,KAAM,EAAO,MAAW,GACxB,aAAc,EAAO,iBACrB,qBAAsB,EAAO,2BAA6B,GAC1D,WAAY,EAAO,eACnB,UAAW,EAAO,WAAgB,GAClC,kBAAmB,EAAO,sBAC1B,SAAU,EAAO,SACjB,aAAc,EAAO,KACrB,QAAS,EAAO,YAChB,OAAQ,EAAO,WACf,UAAW,EAAO,eAClB,WAAY,EAAO,gBAAkB,GACrC,cAAe,EAAO,kBACtB,YAAa,EAAO,iBAAmB,GACvC,mBAAoB,EAAO,yBAA2B,EACxD,CACF,CCxLA,SAAgB,GAA8B,CAE5C,OAAO,EADM,QAAQ,IAAI,MAAQ,QAAQ,IAAI,aAAe,IAC1C,UAAW,eAAe,CAC9C,CAGA,SAAgB,EAAa,EAA6B,CACxD,GAAI,CAAC,EAAW,CAAI,EAAG,MAAO,CAAC,EAC/B,IAAM,EAAM,EAAa,EAAM,MAAM,EACrC,GAAI,CACF,OAAO,KAAK,MAAM,CAAG,CACvB,MAAQ,CAEN,OADA,QAAQ,OAAO,MAAM,qCAAqC,EAAK,0BAA0B,EAClF,CAAC,CACV,CACF,CAGA,SAAgB,EAAc,EAAc,EAA+B,CACzE,EAAU,EAAQ,CAAI,EAAG,CAAE,UAAW,EAAK,CAAC,EAC5C,EAAc,EAAM,KAAK,UAAU,EAAU,KAAM,CAAC,EAAI;EAAM,MAAM,CACtE,CA8BA,SAAgB,EAAe,EAAuB,CAKpD,OAJI,EAAW,CAAI,GACjB,EAAW,CAAI,EACR,IAEF,EACT,CC7DA,MAAa,EAA+D,CAC1E,GAAkC,EAClC,GAA+B,EAC/B,GAA+B,EAC/B,GAA8B,EAC9B,GAA6B,EAC7B,GAAiC,CACnC,ECiBA,SAAgB,EAAyB,EAAuB,CAC9D,IAAM,EAAW,GAAY,EAC7B,MAAO,CACL,EAAK,EAAU,UAAW,eAAe,EACzC,EAAK,EAAU,UAAW,eAAe,EACzC,EAAK,EAAK,UAAW,eAAe,EACpC,EAAK,EAAK,UAAW,qBAAqB,EAC1C,EAAK,EAAK,UAAW,eAAe,EACpC,EAAK,EAAK,UAAW,qBAAqB,CAC5C,CACF,CAEA,SAAS,IAAsB,CAC7B,OAAO,QAAQ,IAAI,MAAQ,QAAQ,IAAI,aAAe,GACxD,CAEA,SAAgB,EAA2B,EAAwC,CACjF,OAAO,GAAoC,EAAyB,CAAG,CAAC,CAC1E,CAGA,SAAgB,EACd,EACA,EAAwC,CAAC,EACxB,CAEjB,IAAM,EAAiB,GADR,EAA2B,CAEnC,EACL,EAAQ,iBACR,EAAuB,CAAO,CAChC,EACA,GAAI,IAAmB,IAAA,GACrB,OAAO,EAGT,MAAU,MAAM,0DAA0D,CAC5E,CAGA,SAAgB,GACd,EACA,EACA,EAAwC,CAAC,EAC5B,CACb,IAAM,EAAsB,EAAuB,CAAO,EACpD,EAAW,EAAqB,EAAK,CAAE,GAAG,EAAS,qBAAoB,CAAC,EACxE,EAAQ,GAAiB,EAAS,MAExC,OAAO,GAAyB,CAAE,GAAG,EAAU,OAAM,EAAG,CAAmB,CAC7E,CAEA,SAAS,EACP,EACgC,CAChC,OAAO,EAAQ,qBAAuB,CACxC,CCrDA,SAAgB,EACd,EACA,EAA+C,CAAC,EACxC,CACR,IAAM,EAAgB,EAAQ,eAAiB,EAAyB,CAAG,EACrE,EAAa,GAAgC,CAAa,GAAK,EAAc,GACnF,GAAI,IAAe,IAAA,GACjB,MAAU,MAAM,gDAAgD,EAElE,OAAO,CACT,CAEA,SAAS,EAAqB,EAAiD,CAC7E,OAAO,EAAa,CAAY,CAClC,CAEA,SAAgB,EACd,EACA,EACA,EAAyC,CAAC,EACf,CAG3B,IAAM,EAAO,GAFI,EAAqB,CAEC,EADzB,GAAwB,EAAO,CACC,CAAC,EAE/C,OADA,EAAc,EAAc,CAAI,EACzB,CACT,CAEA,SAAgB,GACd,EACA,EACA,EAAkC,CAAC,EACR,CAC3B,IAAM,EAAW,EAAqB,CAAY,EAC5C,EAAkB,EAAS,YAAY,KAAiB,IAAA,GACxD,EAAkB,EAAQ,iBAAiB,KAAiB,IAAA,GAC5D,EACJ,GAAmB,EACf,CAAE,GAAG,EAAU,gBAAiB,CAAY,EAC5C,GAAmB,EAAU,CAAW,EAE9C,OADA,EAAc,EAAc,CAAI,EACzB,CACT,CAEA,SAAgB,GACd,EACA,EACA,EAAqC,CAAC,EACZ,CAC1B,IAAM,EAAgB,EAAQ,eAAiB,EAAyB,CAAG,EACrE,EAASA,GAAoC,CAAa,EAC1D,EAAoB,EAAQ,kBAAoB,EAAO,gBAE7D,GAAI,OAAO,GAAsB,SAC/B,MAAU,MACR,qFACF,EAGF,OAAO,GAAiC,EAAe,EAAmB,CAAO,CACnF,CAEA,SAAS,GACP,EACA,EACA,EAC0B,CAC1B,IAAM,EACJ,GAAgC,EAAe,CAAW,GAAK,EAAc,GAC/E,GAAI,IAAiB,IAAA,GACnB,MAAU,MAAM,6CAA6C,EAG/D,IAAM,EAAW,EAAqB,CAAY,EAC5C,EAAY,EAAS,WAAa,CAAC,EACnC,EAAW,EAAU,IAAgB,CAAC,EACtC,EAAkC,CACtC,GAAG,EACH,UAAW,CACT,GAAG,GACF,GAAc,CACb,GAAG,EACH,MAAO,CACT,CACF,CACF,EAEA,OADA,EAAc,EAAc,CAAI,EACzB,CAAE,eAAc,SAAU,EAAM,aAAY,CACrD,CAEA,SAAS,GACP,EACA,EACoB,CACpB,IAAK,IAAI,EAAQ,EAAc,OAAS,EAAG,GAAS,EAAG,IAAY,CACjE,IAAM,EAAe,EAAc,GAC/B,OAAiB,IAAA,IACJ,EAAqB,CAC3B,EAAE,YAAY,KAAiB,IAAA,GAAW,OAAO,CAC9D,CAEF,CAEA,SAAS,GAAgC,EAAsD,CAC7F,IAAK,IAAI,EAAQ,EAAc,OAAS,EAAG,GAAS,EAAG,IAAY,CACjE,IAAM,EAAe,EAAc,GAC/B,OAAiB,IAAA,IACJ,EAAqB,CAC3B,EAAE,kBAAoB,IAAA,GAAW,OAAO,CACrD,CAEF,CC7HA,SAAgB,EAAwB,EAAa,EAAmC,CACtF,GAAI,IAAU,IAAA,IAAa,IAAU,OACnC,OAAO,EAAoB,EAE7B,GAAI,IAAU,gBACZ,OAAO,EAAK,EAAK,UAAW,qBAAqB,EAEnD,MAAU,MAAM,6BAA6B,EAAM,+BAA+B,CACpF,CAEA,SAAgB,GACd,EACA,EACA,EAAsD,EAC7C,CACT,IAAM,EAAe,EAAwB,EAAK,EAAK,aAAa,EAiBpE,OAhBI,EAAK,mBACP,EAA2B,EAAc,GAAwB,CAAI,EAAG,CACtE,qBACF,CAAC,EACD,QAAQ,OAAO,MAAM,6BAA6B,EAAa,GAAG,EAC3D,CAAC,EAAK,WAAa,EAAK,WAAW,SAAW,GAEnD,EAAK,UAAY,EAAK,YAGxB,GADE,EAAK,gBAAkB,IAAA,GAAY,EAAuC,CAAG,EAAI,EAC3C,EAAK,SAAU,CACrD,eAAgB,EAA2B,CAAG,EAAE,SAClD,CAAC,EACD,QAAQ,OAAO,MAAM,2BAA2B,EAAK,SAAS,GAAG,EAC1D,CAAC,EAAK,WAAa,EAAK,WAAW,SAAW,GAEhD,EACT,CAEA,eAAsB,GACpB,EACA,EACA,EACA,EAAsD,EACvC,CACf,IAAM,EAAS,EAA2B,CAAG,EAG7C,GAAI,EADF,EAAK,WAAa,IAAA,GAA4D,EAAhD,CAAE,GAAG,EAAQ,gBAAiB,EAAK,QAAS,EAChC,CAAmB,IAAM,QACnE,OAEF,GAAI,CAAC,GAAsB,EACzB,MAAU,MAAM,EAAmC,CAAmB,CAAC,EAEzE,MAAM,EACJ,EACA,GAAuB,EAAK,CAAI,EAChC,EACA,CACF,EACA,IAAM,EAAU,EAA2B,CAAG,EAG9C,GAAI,EADF,EAAK,WAAa,IAAA,GAA6D,EAAjD,CAAE,GAAG,EAAS,gBAAiB,EAAK,QAAS,EAClC,CAAmB,IAAM,QAClE,MAAU,MAAM,EAAmC,CAAmB,CAAC,CAE3E,CAEA,eAAsB,EACpB,EACA,EACA,EACA,EAAsD,EACvC,CAEf,IAAM,EAAO,GAA8B,MADd,EAAY,GAAmC,CAAmB,CAAC,EACrC,CAAmB,EACxE,EAAe,EAAwB,EAAK,EAAK,aAAa,EAIpE,EAA2B,EAAc,MAHrB,GAA2B,EAAM,EAAa,EAAqB,CACrF,qBAAsB,OAAO,KAAK,EAA2B,CAAG,EAAE,WAAa,CAAC,CAAC,CACnF,CAAC,EAC+C,CAC9C,qBACF,CAAC,EACD,IAAM,EAAW,MAAM,EAAY,kDAAkD,EACrF,GAAI,EAAU,CACZ,IAAM,EAAW,EAAa,CAAY,EAC1C,EAAS,SAAW,EACpB,EAAc,EAAc,CAAQ,CACtC,CACA,QAAQ,OAAO,MAAM,uBAAuB,EAAa,KAAK,CAChE,CAEA,SAAS,GAAwB,EAA2C,CAC1E,IAAM,EAAO,EAAK,cAAgB,EAAK,kBACvC,GAAI,CAAC,EAAK,mBAAqB,CAAC,EAC9B,MAAU,MAAM,6DAA6D,EAE/E,MAAO,CACL,QAAS,EAAK,kBACd,OACA,GAAI,EAAK,QAAU,IAAA,IAAa,CAAE,MAAO,EAAK,KAAM,EACpD,GAAI,EAAK,SAAW,IAAA,IAAa,CAAE,OAAQ,EAAK,MAAO,EACvD,GAAI,EAAK,YAAc,IAAA,IAAa,CAAE,UAAW,EAAK,SAAU,EAChE,GAAI,EAAK,UAAY,IAAA,IAAa,CAAE,QAAS,EAAK,OAAQ,EAC1D,WAAY,EAAK,UACnB,CACF,CAEA,SAAS,GAAuB,EAAa,EAAsC,CACjF,GAAI,EAAK,gBAAkB,IAAA,IAAa,EAAK,WAAa,IAAA,GACxD,OAAO,EAGT,IAAM,EAAsB,GAAuC,EAAyB,CAAG,CAAC,EAChG,GAAI,IAAwB,IAAA,GAC1B,OAAO,EAGT,IAAM,EAAsB,EAAK,EAAK,UAAW,eAAe,EAC1D,EAA2B,EAAK,EAAK,UAAW,qBAAqB,EAQ3E,OANE,IAAwB,GACxB,IAAwB,EAEjB,CAAE,GAAG,EAAM,cAAe,eAAgB,EAG5C,CACT,CAEA,SAAS,GACP,EACoB,CACpB,IAAK,IAAI,EAAQ,EAAc,OAAS,EAAG,GAAS,EAAG,IAAY,CACjE,IAAM,EAAe,EAAc,GAC/B,OAAiB,IAAA,IAEjB,OADa,EAAa,CACZ,EAAE,iBAAoB,SACtC,OAAO,CAEX,CAEF,CAEA,SAAS,IAAiC,CACxC,OAAO,QAAQ,MAAM,QAAU,IAAQ,QAAQ,OAAO,QAAU,EAClE,CAEA,SAAgB,EACd,EAAsD,EAC9C,CACR,MAAO,CACL,mCACA,gFACA,wBAAwB,GAA6B,CAAmB,IACxE,GAAG,EAAoB,IAAI,EAA8B,CAC3D,EAAE,KAAK;CAAI,CACb,CAEA,SAAS,GAA+B,EAAyC,CAS/E,MAAO,KAAK,CAPV,+BAA+B,EAAW,OAC1C,UAAU,EAAW,OACrB,GAAI,EAAW,UAAU,UAAY,IAAA,GAAmC,CAAC,EAAxB,CAAC,kBAAkB,EACpE,kBACA,GAAI,EAAW,iBAAmB,GAAO,CAAC,0BAA0B,EAAI,CAAC,EACzE,eAEc,EAAE,KAAK,GAAG,GAC5B,CCzKA,IAAa,GAAb,KAA+B,CAC7B,QAA2B,IAAI,IAC/B,aAEA,YAAY,EAAsB,CAChC,KAAK,aAAe,CACtB,CAEA,SAAS,EAA8D,CACrE,KAAK,QAAQ,IAAI,EAAU,KAAM,CAAS,CAC5C,CAEA,QAAiD,CAC/C,IAAM,EAAQ,KAAK,sBAAsB,EACzC,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAAE,IAAK,IAAe,CAC3D,YACA,OAAQ,KAAK,cAAc,EAAW,EAAM,EAAU,KAAK,CAC7D,EAAE,CACJ,CAEA,YAA4D,CAC1D,OAAO,KAAK,OAAO,EAChB,OAAQ,GAAM,EAAE,OAAO,OAAO,EAC9B,IAAK,GAAM,EAAE,SAAS,CAC3B,CAEA,MAAM,WAAW,EAAc,EAAiC,CAC9D,IAAM,EAAW,EAAa,KAAK,YAAY,EACzC,EAAc,EAAS,YAAc,CAAC,EAE5C,EAAW,GAAQ,CAAE,GADN,EAAW,IAAS,CAAC,EACL,SAAQ,EACvC,EAAS,WAAa,EACtB,EAAc,KAAK,aAAc,CAAQ,CAC3C,CAEA,MAAM,WAAW,EAAc,EAAyD,CACtF,IAAM,EAAW,EAAa,KAAK,YAAY,EACzC,EAAc,EAAS,YAAc,CAAC,EAE5C,EAAW,GAAQ,CAAE,GADN,EAAW,IAAS,CAAC,EACI,SAAyB,EACjE,EAAS,WAAa,EACtB,EAAc,KAAK,aAAc,CAAQ,CAC3C,CAEA,MAAM,SAAS,EAA6C,CAC1D,IAAM,EAAU,KAAK,WAAW,EAChC,IAAK,IAAM,KAAa,EACtB,EAAU,OAAO,CAAO,EACxB,MAAM,EAAU,MAAM,CAE1B,CAEA,MAAM,SAAyB,CAC7B,IAAK,IAAM,KAAa,KAAK,QAAQ,OAAO,EAC1C,MAAM,EAAU,KAAK,CAEzB,CAEA,cACE,EACA,EACkB,CAGlB,MAAO,CAAE,QAFQ,GAAO,SAAmC,EAAU,eAEnD,QADD,GAAO,SAA2D,CAAC,CAC1D,CAC5B,CAEA,uBAA+D,CAE7D,IAAM,EADW,EAAa,KAAK,YAChB,EAAE,WAErB,MADI,CAAC,GAAO,OAAO,GAAQ,UAAY,MAAM,QAAQ,CAAG,EAAU,CAAC,EAC5D,CACT,CACF,ECFA,SAASC,GAAS,EAAqE,CACrF,OAAO,OAAO,GAAU,YAAY,CACtC,CAEA,SAAS,EAAU,EAAkC,EAAsB,CACzE,OAAO,OAAO,EAAM,IAAS,QAC/B,CAkCA,SAAgB,GACd,EACsC,CACtC,GAAI,CAACA,GAAS,CAAK,GAAK,CAAC,EAAU,EAAO,MAAM,EAAG,MAAO,GAC1D,OAAQ,EAAM,KAAd,CACE,IAAK,QACH,MAAO,GACT,IAAK,aACH,OAAO,EAAU,EAAO,OAAO,EACjC,IAAK,aACH,OAAO,EAAU,EAAO,UAAU,EACpC,IAAK,WACH,OAAO,EAAU,EAAO,UAAU,GAAK,OAAO,EAAM,SAAY,UAClE,IAAK,SACH,OAAO,EAAU,EAAO,QAAQ,EAClC,IAAK,QACH,OAAO,EAAU,EAAO,SAAS,EACnC,IAAK,YACH,OAAO,EAAM,SAAW,IAAA,IAAa,OAAO,EAAM,QAAW,SAC/D,QACE,MAAO,EACX,CACF,CClIA,SAAgB,GACd,EACA,EACA,EACA,EACA,EACM,CACN,OAAQ,EAAQ,KAAhB,CACE,IAAK,QACH,EAAY,EACZ,MACF,IAAK,SACH,EAAY,EAAQ,MAAM,EAC1B,MACF,IAAK,QACH,EAAW,IAAI,EAAoB,SAAU,EAAQ,OAAO,CAAC,EAC7D,MACF,IAAK,YACH,EAAW,IAAI,EAAoB,SAAU,EAAQ,QAAU,2BAA2B,CAAC,EAC3F,MACF,IAAK,aACH,IAAO,CAAE,KAAM,6BAA8B,MAAO,EAAQ,KAAM,CAAC,EACnE,MACF,IAAK,aACH,IAAO,CACL,KAAM,6BACN,SAAU,EAAQ,SAClB,SAAU,GAAgB,EAAQ,QAAQ,CAC5C,CAAC,EACD,MACF,IAAK,WACH,IAAO,CACL,KAAM,2BACN,SAAU,EAAQ,SAClB,QAAS,EAAQ,OACnB,CAAC,EACD,MACF,QACE,EAAW,IAAI,EAAoB,SAAU,mCAAmC,CAAC,CACrF,CACF,CAEA,SAAS,GAAgB,EAA0C,CACjE,GAAI,CAAC,EAAU,OACf,IAAM,EAAa,OAAO,OAAO,CAAQ,EAAE,GACvC,OAAe,IAAA,GACnB,OAAO,OAAO,GAAe,SAAW,KAAK,UAAU,CAAU,EAAI,OAAO,CAAU,CACxF,CAEA,SAAgB,EACd,EACA,EACe,CACf,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,GAAI,CAAC,EAAM,UAAW,CACpB,EAAO,IAAI,EAAoB,QAAS,uCAAuC,CAAC,EAChF,MACF,CACA,EAAM,KAAK,EAAU,GAAU,CAC7B,GAAI,EAAO,CACT,EAAO,CAAK,EACZ,MACF,CACA,EAAQ,CACV,CAAC,CACH,CAAC,CACH,CAEA,eAAsB,EACpB,EACA,EACe,CACX,EAAQ,MAAM,WAChB,MAAM,EAAkB,EAAQ,MAAO,CAAE,KAAM,SAAU,QAAO,CAAC,EAAE,UAAY,IAAA,EAAS,EAE1F,EAAQ,UAAY,eAAiB,CAC9B,EAAQ,MAAM,QACjB,EAAQ,MAAM,KAAK,SAAS,CAEhC,EAAG,EAAQ,WAAW,CACxB,CCvEA,SAAgB,GACd,EAC6B,CAC7B,OAAO,IAAI,SAA6B,EAAS,IAAW,CAC1D,IAAI,GAAqC,EAAS,EAAS,CAAM,EAAE,MAAM,CAC3E,CAAC,CACH,CAEA,IAAM,GAAN,KAA2C,CAMtB,QACA,QACA,OAPnB,QAAkB,GAClB,QAAkB,GAClB,aAEA,YACE,EACA,EACA,EACA,CAHiB,KAAA,QAAA,EACA,KAAA,QAAA,EACA,KAAA,OAAA,EAEjB,KAAK,aAAe,GAAmB,KAAK,QAAQ,QAAU,GAAU,KAAK,WAAW,CAAK,CAAC,CAChG,CAEA,OAAc,CACZ,GAAM,CAAE,SAAU,KAAK,QAAQ,QAC/B,EAAM,GAAG,UAAW,KAAK,SAAS,EAClC,EAAM,GAAG,QAAS,KAAK,OAAO,EAC9B,EAAM,GAAG,OAAQ,KAAK,MAAM,EAC5B,EAAM,KAAK,YAAe,CACxB,aAAa,KAAK,WAAW,CAC/B,CAAC,CACH,CAEA,gBAA2C,CACzC,GAAI,KAAK,QAAS,OAClB,KAAK,QAAU,GACf,GAAM,CAAE,SAAU,KAAK,QAAQ,QAC/B,EAAuB,EAAO,CAAE,KAAM,QAAS,QAAS,KAAK,QAAQ,OAAQ,CAAC,EAAE,MAC7E,GAAU,CACT,KAAK,WAAW,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,CAAC,CAC3E,CACF,CACF,EAEA,UAA8B,GAA4C,CACxE,GAAI,CAAC,GAA6B,CAAO,EAAG,CAC1C,KAAK,WACH,IAAI,EAAoB,SAAU,4CAA4C,CAChF,EACA,MACF,CACA,GAAM,CAAE,OAAQ,KAAK,QAAQ,QAC7B,GAAoB,EAAS,KAAK,YAAa,KAAK,YAAa,KAAK,WAAY,EAAI,IAAI,CAC5F,EAEA,QAA4B,GAAuB,CACjD,KAAK,WAAW,IAAI,EAAoB,QAAS,EAAM,OAAO,CAAC,CACjE,EAEA,QAA2B,EAAqB,IAAwC,CAClF,KAAK,SACT,KAAK,WAAW,IAAI,EAAoB,QAAS,GAAuB,EAAM,CAAM,CAAC,CAAC,CACxF,EAEA,YAAgC,GAAyB,CACvD,GAAI,KAAK,QAAS,OAClB,KAAK,QAAU,GACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,GAAM,CAAE,UAAS,yBAA0B,KAAK,QAChD,KAAK,QAAQ,GAAiB,EAAQ,IAAK,EAAQ,CAAqB,CAAC,CAC3E,EAEA,WAA+B,GAAuB,CAChD,KAAK,UACT,KAAK,QAAU,GACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,OAAO,CAAK,EACnB,EAEA,aAA4B,CACtB,KAAK,cAAc,aAAa,KAAK,YAAY,EACjD,KAAK,QAAQ,QAAQ,WAAW,aAAa,KAAK,QAAQ,QAAQ,SAAS,CACjF,CAEA,SAAwB,CACtB,GAAM,CAAE,SAAU,KAAK,QAAQ,QAC/B,EAAM,IAAI,UAAW,KAAK,SAAS,EACnC,EAAM,IAAI,QAAS,KAAK,OAAO,EAC/B,EAAM,IAAI,OAAQ,KAAK,MAAM,CAC/B,CACF,EAEA,SAAgB,GAAyB,EAAoC,CAC3E,IAAI,EAAU,GACV,MAAyC,CAAC,EAI9C,MAAO,CACL,QAAA,IAJkB,SAA6B,EAAU,IAAW,CACpE,EAAW,CACb,CAEQ,EACN,OAAO,EAAuB,CACxB,IACJ,EAAU,GACV,EAAS,IAAI,EAAoB,SAAU,GAAU,2BAA2B,GAAO,CAAC,EAC1F,CACF,CACF,CAEA,SAAS,GACP,EACA,EAC2C,CACtC,KAAQ,IAAI,QAAQ,UACzB,OAAO,eAAiB,CACtB,EAAwB,EAAS,2BAA2B,EAC5D,EAAW,IAAI,EAAoB,UAAW,2BAA2B,CAAC,CAC5E,EAAG,EAAQ,IAAI,QAAQ,SAAS,CAClC,CAEA,SAAS,GACP,EACA,EACA,EACoB,CACpB,IAAM,EAAiB,EAAsB,CAAG,EAChD,MAAO,CACL,MAAO,EAAI,MACX,SACA,GAAI,EAAiB,CAAE,SAAU,CAAE,iBAAgB,QAAS,CAAe,CAAE,EAAI,CAAC,CACpF,CACF,CAEA,SAAS,GAAuB,EAAqB,EAAuC,CAG1F,MAAO,yCADL,IAAW,KAA4B,aAAa,IAAS,KAAO,UAAY,IAA9D,UAAU,KAEhC,CCrHA,SAAgB,GACd,EAA8C,CAAC,EACvB,CACxB,MAAQ,IAAS,CACf,IAAM,EAAS,IAAI,GAA2B,EAAM,CAAO,EAE3D,OADI,EAAQ,oBAAsB,GAAc,EACzC,GAA6B,CAClC,SACA,gBAAiB,EAAQ,iBAAmB,GAAkC,EAC9E,MAAO,EAAK,OAAO,MACnB,kBAAmB,EAAK,iBAC1B,CAAC,CACH,CACF,CAEA,IAAa,GAAb,KAAmE,CAS9C,KARnB,WACA,SACA,YACA,eACA,IACA,QAEA,YACE,EACA,EAA8C,CAAC,EAC/C,CAFiB,KAAA,KAAA,EAGjB,KAAK,WAAa,EAAQ,YAAc,GAAyB,EACjE,KAAK,SAAW,EAAQ,SACxB,KAAK,YAAc,EAAQ,aAAe,IAC1C,KAAK,eAAiB,EAAQ,eAC9B,KAAK,IAAM,EAAQ,IACnB,KAAK,QAAU,EAAQ,OACzB,CAEA,MAAM,EAA4C,CAChD,IAAM,EAAQ,EAAK,KAAK,WAAY,CAAC,EAAG,CACtC,IAAK,EAAI,QAAQ,IACjB,IAAK,CAAE,GAAG,QAAQ,IAAK,GAAI,KAAK,KAAO,CAAC,CAAG,EAC3C,SAAU,KAAK,UAAY,GAAuB,KAAK,UAAU,EACjE,MAAO,CAAC,SAAU,SAAU,SAAU,KAAK,CAC7C,CAAC,EACK,EAAgC,CACpC,MACA,QACA,YAAa,KAAK,WACpB,EAEM,EAAe,GAAiC,CACpD,UACA,QAHc,KAAK,mBAAmB,CAGhC,EACN,sBAAwB,GAAY,KAAK,sBAAsB,CAAO,CACxE,CAAC,EACK,EAAe,GAAyB,EAAI,KAAK,EACvD,EAAkB,UAAY,IAAA,EAAS,EACvC,IAAM,EAAS,QAAQ,KAAK,CAAC,EAAc,EAAa,OAAO,CAAC,EAC1D,EAAiB,KAAK,sBAAsB,CAAG,EAErD,MAAO,CACL,MAAO,EAAI,MACX,GAAI,EAAM,MAAQ,IAAA,IAAa,CAAE,IAAK,EAAM,GAAI,EAChD,GAAI,IAAmB,IAAA,IAAa,CAAE,iBAAgB,QAAS,CAAe,EAC9E,SACA,OAAQ,KAAO,IAAoB,CACjC,EAAa,OAAO,CAAM,EAC1B,MAAM,EAAmB,EAAS,CAAM,CAC1C,EACA,KAAM,KAAO,IAAmB,CAC9B,MAAM,EAAkB,EAAO,CAAE,KAAM,OAAQ,QAAO,CAAC,CACzD,EACA,GAAI,IAAmB,IAAA,IAAa,CAClC,QAAS,KAAO,IACd,GAAkB,EAAI,MAAO,EAAgB,CAAM,CACvD,CACF,CACF,CAEA,mBAA2B,EAAqD,CAC9E,IAAM,EAAa,GAAuB,EAAI,QAAQ,KAAM,KAAK,KAAK,mBAAmB,EACzF,MAAO,CACL,MAAO,EAAI,MACX,QAAS,EAAI,QACb,gBAAiB,GAAsB,EAAY,CAAG,EACtD,aAAc,KAAK,KAAK,OACxB,cAAe,KAAK,KAAK,QACzB,gBAAiB,GAAsB,KAAK,eAAgB,KAAK,KAAM,CAAG,EAC1E,eAAgB,KAAK,KAAK,eAC1B,GAAI,KAAK,QAAU,CAAE,QAAS,KAAK,OAAQ,EAAI,CAAC,CAClD,CACF,CAEA,sBAA8B,EAA4C,CACnE,QAAK,QACV,OAAO,EAAK,KAAK,QAAS,EAAI,QAAQ,gBAAiB,YAAa,GAAG,EAAI,MAAM,OAAO,CAC1F,CACF,EAEA,SAAS,GACP,EACA,EACkB,CAClB,IAAM,EAAa,IAAiB,CAAS,GAAK,GAAgB,CAAS,EAC3E,GAAI,CAAC,EACH,MAAM,IAAI,EAAoB,aAAc,uBAAuB,GAAW,EAEhF,OAAO,CACT,CAEA,SAAS,GACP,EACA,EACkB,CAClB,MAAO,CACL,GAAG,EACH,GAAI,EAAI,QAAQ,MAAQ,CAAE,MAAO,EAAI,QAAQ,KAAM,EAAI,CAAC,EACxD,GAAI,EAAI,QAAQ,aAAe,CAAE,MAAO,EAAI,QAAQ,YAAa,EAAI,CAAC,EACtE,GAAI,EAAI,QAAQ,gBAAkB,CAAE,gBAAiB,EAAI,QAAQ,eAAgB,EAAI,CAAC,CACxF,CACF,CAEA,SAAS,GACP,EACA,EACA,EAC8B,CAC9B,IAAM,EAAW,GAAkB,EAAK,OAAO,SAC/C,MAAO,CACL,YAAa,EAAK,OAAO,gBACzB,KAAM,EAAS,KACf,MAAO,EAAI,QAAQ,OAAS,EAAS,MACrC,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,QAAS,EAAS,QAClB,QAAS,EAAS,OACpB,CACF,CAEA,SAAS,IAAmC,CAC1C,IAAM,EAAa,QAAQ,KAAK,IAAM,GAChC,EAAW,EAAa,EAAQ,CAAU,EAAI,QAAQ,IAAI,EAC1D,EAAY,EAAW,SAAS,KAAK,GAAK,EAAW,SAAS,MAAM,EAAI,MAAQ,MAChF,EAAa,CACjB,EAAK,EAAU,YAAa,gCAAgC,GAAW,EACvE,EAAK,EAAU,gCAAgC,GAAW,CAC5D,EACA,IAAK,IAAM,KAAa,EACtB,GAAI,EAAW,CAAS,EACtB,OAAO,EAGX,OAAO,EAAW,EACpB,CAEA,SAAS,GAAuB,EAA8B,CAO5D,MANI,CAAC,EAAW,SAAS,KAAK,GAG1B,QAAQ,SAAS,KAAM,GAAQ,EAAI,SAAS,KAAK,CAAC,EAC7C,QAAQ,SAEV,CAAC,GAAG,QAAQ,SAAU,WAAY,KAAK,CAChD,CAEA,SAAS,GACP,EACA,EACA,EACwB,CASxB,OARK,EAAW,CAAc,EAQvB,GAA4B,EADrB,EAAa,EAAgB,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,OAC3B,EAAG,CAAM,EAP9C,CACL,OAAQ,EACR,SACA,MAAO,CAAC,CACV,CAIJ,CCzNA,SAAgB,GAAsB,EAAc,EAAuB,CACzE,IAAM,EAAa,EAAY,CAAI,EAC7B,EAAc,EAAY,CAAK,EACrC,GAAI,IAAe,IAAA,IAAa,IAAgB,IAAA,GAC9C,OAAO,KAAK,KAAK,EAAK,cAAc,CAAK,CAAC,EAG5C,IAAM,EACJ,EAAc,EAAW,MAAO,EAAY,KAAK,GACjD,EAAc,EAAW,MAAO,EAAY,KAAK,GACjD,EAAc,EAAW,MAAO,EAAY,KAAK,EAKnD,OAJI,IAAgB,EAIb,GAAkB,EAAW,WAAY,EAAY,UAAU,EAH7D,CAIX,CAEA,SAAgB,GAAqB,EAAmB,EAA0B,CAChF,OAAO,GAAsB,EAAW,CAAO,EAAI,CACrD,CAEA,SAAS,EAAY,EAA0C,CAE7D,GAAM,CAAC,EAAM,IADM,EAAM,KAAK,EAAE,QAAQ,KAAM,EAAE,EAAE,MAAM,GAAG,EAAE,IAAM,IACzB,MAAM,IAAK,CAAC,EAChD,CAAC,EAAW,EAAW,GAAa,EAAK,MAAM,GAAG,EAClD,EAAQ,EAAuB,CAAS,EACxC,EAAQ,EAAuB,CAAS,EACxC,EAAQ,EAAuB,CAAS,EAC1C,SAAU,IAAA,IAAa,IAAU,IAAA,IAAa,IAAU,IAAA,IAG5D,MAAO,CACL,QACA,QACA,QACA,WAAY,EAAiB,EAAe,MAAM,GAAG,EAAI,CAAC,CAC5D,CACF,CAEA,SAAS,EAAuB,EAA+C,CACzE,SAAU,IAAA,IAAa,CAAC,QAAQ,KAAK,CAAK,GAG9C,OAAO,OAAO,CAAK,CACrB,CAEA,SAAS,EAAc,EAAc,EAAuB,CAC1D,OAAO,KAAK,KAAK,EAAO,CAAK,CAC/B,CAEA,SAAS,GAAkB,EAAgB,EAAyB,CAClE,GAAI,EAAK,SAAW,GAAK,EAAM,SAAW,EACxC,MAAO,GAET,GAAI,EAAK,SAAW,EAClB,MAAO,GAET,GAAI,EAAM,SAAW,EACnB,MAAO,GAET,IAAM,EAAM,KAAK,IAAI,EAAK,OAAQ,EAAM,MAAM,EAC9C,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAK,GAAS,EAAG,CAC3C,IAAM,EAAW,EAAK,GAChB,EAAY,EAAM,GACxB,GAAI,IAAa,IAAA,GACf,MAAO,GAET,GAAI,IAAc,IAAA,GAChB,MAAO,GAET,IAAM,EAAc,GAA4B,EAAU,CAAS,EACnE,GAAI,IAAgB,EAClB,OAAO,CAEX,CACA,MAAO,EACT,CAEA,SAAS,GAA4B,EAAc,EAAuB,CACxE,IAAM,EAAa,EAAuB,CAAI,EACxC,EAAc,EAAuB,CAAK,EAUhD,OATI,IAAe,IAAA,IAAa,IAAgB,IAAA,GACvC,EAAc,EAAY,CAAW,EAE1C,IAAe,IAAA,GAGf,IAAgB,IAAA,GAGb,KAAK,KAAK,EAAK,cAAc,CAAK,CAAC,EAFjC,EAHA,EAMX,CC9BA,SAAgB,GACd,EAAO,QAAQ,IAAI,MAAQ,QAAQ,IAAI,aAAe,IAC9C,CACR,OAAO,EAAK,EAAM,UAAW,mBAAmB,CAClD,CAEA,SAAgB,GAAqB,EAA6C,CAC3E,KAAW,CAAI,EAGpB,GAAI,CAEF,OAAO,GADQ,KAAK,MAAM,EAAa,EAAM,MAAM,CACjB,CAAC,CACrC,MAAQ,CACN,MACF,CACF,CAEA,SAAgB,GAAsB,EAAc,EAAgC,CAClF,EAAU,EAAQ,CAAI,EAAG,CAAE,UAAW,EAAK,CAAC,EAC5C,EAAc,EAAM,KAAK,UAAU,EAAO,KAAM,CAAC,EAAI;EAAM,MAAM,CACnE,CAEA,eAAsB,EACpB,EACgC,CAChC,GAAI,EAAQ,WAAa,GACvB,MAAO,CAAE,OAAQ,UAAW,OAAQ,UAAW,EAGjD,IAAM,EAAc,EAAQ,aAAA,wBACtB,EAAY,EAAQ,WAAa,GAA4B,EAC7D,EAAM,EAAQ,KAAO,IAAI,KACzB,EAAQ,EAAQ,OAAA,MAEtB,GAAI,EAAQ,QAAU,GAAM,CAC1B,IAAM,EAAS,GAAqB,CAAS,EAC7C,GAAI,IAAW,IAAA,IAAa,GAAa,EAAQ,EAAK,EAAO,CAAW,EACtE,OAAO,GAAgB,EAAQ,EAAQ,cAAc,CAEzD,CAEA,GAAI,CACF,IAAM,EAAgB,MAAM,GAAmB,CAC7C,UAAW,EAAQ,WAAa,MAChC,cACA,YAAa,EAAQ,aAAA,6BACrB,UAAW,EAAQ,WAAA,IACrB,CAAC,EAOD,OANA,EAAyB,EAAW,CAClC,cACA,UAAW,EAAI,YAAY,EAC3B,eAAgB,EAAQ,eACxB,eACF,CAAC,EACM,EAAwB,EAAQ,eAAgB,CAAa,CACtE,OAAS,EAAO,CACd,IAAM,EAAe,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAO1E,OANA,EAAyB,EAAW,CAClC,cACA,UAAW,EAAI,YAAY,EAC3B,eAAgB,EAAQ,eACxB,cACF,CAAC,EACM,CAAE,OAAQ,QAAS,cAAa,CACzC,CACF,CAEA,SAAS,EAAyB,EAAc,EAAgC,CAC9E,GAAI,CACF,GAAsB,EAAM,CAAK,CACnC,MAAQ,CAER,CACF,CAEA,eAAsB,GACpB,EACuC,CACvC,IAAM,EAAS,MAAM,EAAkB,CAAO,EAC9C,OAAO,EAAO,SAAW,mBAAqB,EAAO,OAAS,IAAA,EAChE,CAEA,SAAgB,GAA+B,EAA8C,CAC3F,OAAO,EAAM,YAAc,IAAS,EAAM,qBAAuB,EACnE,CAEA,SAAgB,EAAsB,EAAkC,CACtE,MAAO,CACL,4BAA4B,EAAO,eAAe,MAAM,EAAO,cAAc,GAC7E,OAAO,EAAO,gBAChB,EAAE,KAAK,GAAG,CACZ,CAEA,SAAgB,GAA4B,EAAuC,CAUjF,OATI,EAAO,SAAW,mBACb,EAAsB,EAAO,MAAM,EAExC,EAAO,SAAW,UACb,yBAAyB,EAAO,eAAe,IAEpD,EAAO,SAAW,UACb,+BAEF,+BAA+B,EAAO,cAC/C,CAEA,SAAS,GAAgB,EAA0B,EAA+C,CAOhG,OANI,EAAM,eAAiB,IAAA,GAGvB,EAAM,gBAAkB,IAAA,GACnB,CAAE,OAAQ,QAAS,aAAc,2CAA4C,EAE/E,EAAwB,EAAgB,EAAM,aAAa,EALzD,CAAE,OAAQ,QAAS,aAAc,EAAM,YAAa,CAM/D,CAEA,SAAS,EACP,EACA,EACuB,CAWvB,OAVI,GAAqB,EAAe,CAAc,EAC7C,CACL,OAAQ,mBACR,OAAQ,CACN,iBACA,gBACA,eAAgB,+CAClB,CACF,EAEK,CAAE,OAAQ,UAAW,iBAAgB,eAAc,CAC5D,CAEA,SAAS,GACP,EACA,EACA,EACA,EACS,CACT,GAAI,EAAM,cAAgB,EACxB,MAAO,GAET,IAAM,EAAY,KAAK,MAAM,EAAM,SAAS,EAI5C,OAHK,OAAO,SAAS,CAAS,EAGvB,EAAI,QAAQ,EAAI,EAAY,EAF1B,EAGX,CAEA,eAAe,GAAmB,EAKd,CAClB,IAAM,EAAa,IAAI,gBACjB,EAAU,eAAiB,EAAW,MAAM,EAAG,EAAQ,SAAS,EACtE,GAAI,CACF,IAAM,EAAa,GAAwB,EAAQ,YAAa,EAAQ,WAAW,EAC7E,EAAW,MAAM,EAAQ,UAAU,EAAY,CACnD,QAAS,CAAE,OAAQ,kBAAmB,EACtC,OAAQ,EAAW,MACrB,CAAC,EACD,GAAI,CAAC,EAAS,GACZ,MAAU,MAAM,gCAAgC,EAAS,QAAQ,EAGnE,IAAM,GAAS,MADS,EAAS,KAAK,GACd,cAAc,OACtC,GAAI,OAAO,GAAW,UAAY,EAAO,KAAK,EAAE,SAAW,EACzD,MAAU,MAAM,+CAA+C,EAEjE,OAAO,CACT,QAAU,CACR,aAAa,CAAO,CACtB,CACF,CAEA,SAAS,GAAwB,EAAqB,EAA6B,CACjF,MAAO,GAAG,EAAY,QAAQ,OAAQ,EAAE,EAAE,GAAG,mBAAmB,CAAW,GAC7E,CAEA,SAAS,GAAsB,EAAkD,CAC/E,GAAI,CAAC,GAAa,CAAK,EACrB,OAEF,IAAM,EAAY,EAClB,GACE,OAAO,EAAU,aAAgB,UACjC,OAAO,EAAU,WAAc,UAC/B,OAAO,EAAU,gBAAmB,WACnC,EAAU,gBAAkB,IAAA,IAAa,OAAO,EAAU,eAAkB,YAC5E,EAAU,eAAiB,IAAA,IAAa,OAAO,EAAU,cAAiB,UAE3E,MAAO,CACL,YAAa,EAAU,YACvB,UAAW,EAAU,UACrB,eAAgB,EAAU,eAC1B,GAAI,EAAU,gBAAkB,IAAA,IAAa,CAAE,cAAe,EAAU,aAAc,EACtF,GAAI,EAAU,eAAiB,IAAA,IAAa,CAAE,aAAc,EAAU,YAAa,CACrF,CAGJ,CAEA,SAAS,GAAa,EAAoE,CACxF,OAAyB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,CAC5E,CCxQA,MAAM,EAAoD,CACxD,GAAG,CACL,EAEA,SAAgB,GAAuB,EAA8C,CACnF,IAAM,EAAM,EAAS,WAKrB,OAJK,GAAS,CAAG,EAIV,CACL,QAAS,OAAO,EAAI,SAAY,UAAY,EAAI,QAAU,EAA6B,QACvF,UACE,OAAO,EAAI,WAAc,UAAY,EAAI,UAAY,EAA6B,SACtF,EAPS,CAAE,GAAG,CAA6B,CAQ7C,CAEA,SAAgB,GACd,EACA,EACqB,CACrB,IAAM,EAAW,EAAa,CAAY,EACpC,EAAO,CACX,GAAG,GAAuB,CAAQ,EAClC,GAAG,CACL,EAGA,MAFA,GAAS,WAAa,EACtB,EAAc,EAAc,CAAQ,EAC7B,CACT,CAEA,SAAS,GAAS,EAAkE,CAClF,OACoB,OAAO,GAAU,YAAnC,GAA+C,CAAC,MAAM,QAAQ,CAAK,GAAK,EAAE,aAAiB,KAE/F,CC1CA,SAAgB,GAAiB,EAAiC,CAChE,GAAI,CACF,IAAM,EAAS,GAAW,CAAG,EAC7B,GAAI,CAAC,EAAQ,OAEb,IAAM,EAAO,EAAa,EAAK,EAAQ,MAAM,EAAG,MAAM,EAAE,KAAK,EAC7D,GAAI,CAAC,EAAM,OACX,GAAI,EAAK,WAAW,OAAO,EAAG,CAC5B,IAAM,EAAM,EAAK,MAAM,CAAc,EAAE,KAAK,EAE5C,OAAO,EAAI,WAAW,aAAY,EAAI,EAAI,MAAM,EAAmB,EAAI,CACzE,CACA,OAAO,EAAK,MAAM,EAAG,CAAoB,CAC3C,MAAQ,CACN,MACF,CACF,CAEA,SAAS,GAAW,EAAmC,CACrD,IAAI,EAAU,EAAQ,CAAK,EACvB,EAAS,EAAQ,CAAO,EAE5B,KAAO,IAAW,GAAS,CAEzB,IAAM,EAAW,EADC,EAAK,EAAS,MACY,EAAG,CAAO,EACtD,GAAI,EAAU,OAAO,EAErB,EAAU,EACV,EAAS,EAAQ,CAAO,CAC1B,CAGA,OAAO,EADe,EAAK,EAAS,MACE,EAAG,CAAO,CAClD,CAEA,SAAS,EAAmB,EAAmB,EAAqC,CAClF,GAAI,CAAC,EAAW,CAAS,EAAG,OAC5B,IAAM,EAAO,EAAU,CAAS,EAChC,GAAI,EAAK,YAAY,EAAG,OAAO,EAC/B,GAAI,CAAC,EAAK,OAAO,EAAG,OAEpB,IAAM,EAAU,EAAa,EAAW,MAAM,EAAE,KAAK,EAErD,GAAI,CAAC,EAAQ,WAAW,SAAM,EAAG,OACjC,IAAM,EAAU,EAAQ,MAAM,CAAa,EAAE,KAAK,EAClD,OAAO,EAAW,CAAO,EAAI,EAAU,EAAQ,EAAS,CAAO,CACjE,CC3CA,MAAM,EAAqB,SAE3B,SAAS,IAAqB,CAC5B,OAAO,QAAQ,IAAI,MAAQ,EAAQ,CACrC,CAEA,SAAgB,EAA0B,EAAmC,CAE3E,IAAM,EAAS,IAAI,EADA,EAAK,GAAW,EAAG,UAAW,SACF,CAAC,EAChD,GAAI,CACF,IAAM,EAAU,EAAO,gBAAgB,EAMvC,OALI,EAAQ,SAAW,GACrB,EAAS,cAAc,CAAkB,EAClC,IAET,EAAS,cAAc,EAAoB,IAAI,EAAoB,CAAO,CAAC,EACpE,EAAQ,OACjB,MAAQ,CAEN,OADA,EAAS,cAAc,CAAkB,EAClC,CACT,CACF,CCHA,SAAS,GAAwB,EAAiC,CAChE,IAAM,EAAO,EAAQ,EACf,EAAa,EAAK,EAAM,UAAW,SAAS,EAC5C,EAAmB,EAAK,EAAM,UAAW,eAAe,EAExD,GAAQ,EAAiB,IAC7B,EAAS,EAAS,CAChB,QAAS,EAAQ,QACjB,MAAQ,EAAQ,OAAS,MAC3B,CAAC,EAEG,EAAgB,IAAI,EAAoB,CAAgB,EACxD,EAAc,IAAI,EAAkB,CAAE,aAAY,MAAK,CAAC,EAS9D,MAAO,CACL,MACA,cACA,UAAA,IAXoB,EAAsB,CAC1C,aACA,gBACA,kBAAmB,EACnB,MACF,CAMU,EACR,OAAA,IANiB,EAAmB,CAM/B,EACL,eACF,CACF,CAEA,eAAe,GACb,EAC6C,CAC7C,IAAM,EAAU,MAAM,EAAS,OAAO,QAAQ,EACxC,EAAa,EAAS,cAAc,kBAAkB,EAC5D,OAAO,EAAQ,IAAK,GAAW,CAC7B,IAAM,EAAQ,EAAO,UAAU,MAAM,GAAG,EAClC,EAAW,EAAM,QAAQ,OAAO,EAChC,EAAkB,GAAY,EAAK,EAAM,EAAW,IAAM,GAAM,GAChE,EAAS,EACX,GAAG,EAAO,SAAS,KAAK,GAAG,IAC3B,EAAO,SAAS,KACpB,MAAO,CACL,KAAM,EACN,YAAa,EAAO,SAAS,YAC7B,QAAS,EAAW,KAAY,IAAS,EAAW,EAAO,SAAS,QAAU,EAChF,CACF,CAAC,CACH,CAEA,eAAe,GACb,EACA,EAC6C,CAC7C,IAAI,EACJ,GAAI,CACF,EAAW,EAAS,YAAY,cAAc,CAAe,CAC/D,MAAQ,CACN,MAAO,CAAC,CACV,CACA,IAAM,EAAY,EAAS,UAAU,oBAAoB,EACnD,EAAiB,IAAI,IAAI,OAAO,OAAO,CAAS,EAAE,IAAK,GAAW,EAAO,UAAU,CAAC,EAC1F,OAAO,EAAS,QAAQ,IAAK,IAAY,CACvC,KAAM,EAAO,KACb,YAAa,EAAO,YACpB,UAAW,EAAe,IAAI,EAAO,IAAI,CAC3C,EAAE,CACJ,CAEA,eAAe,GACb,EACA,EACA,EACe,CACf,GAAM,CAAC,EAAM,GAAmB,EAAS,MAAM,GAAG,EAClD,GAAI,CAAC,GAAQ,CAAC,EACZ,MAAU,MAAM,+CAA+C,EAEjE,GAAI,IAAU,UAAW,CAavB,MAAM,IANuB,EAAsB,CACjD,WAPwB,EAAK,EAAS,IAAK,UAAW,SAO1C,EACZ,cAAe,EAAS,cACxB,kBAAmB,EAAS,YAC5B,MATmB,EAAiB,IACpC,EAAS,EAAS,CAChB,QAAS,EAAQ,QACjB,MAAQ,EAAQ,OAAS,MAC3B,CAAC,CAMH,CACqB,EAAE,QAAQ,EAAM,CAAe,EACpD,MACF,CACA,MAAM,EAAS,UAAU,QAAQ,EAAM,CAAe,CACxD,CAEA,eAAe,GAAkB,EAA8B,EAA6B,CAC1F,IAAM,EAA2B,EAAS,UAAU,wBAAwB,CAAI,EAChF,IAAK,IAAM,KAAU,EACnB,MAAM,EAAS,UAAU,UAAU,GAAG,EAAO,WAAW,GAAG,EAAO,aAAa,EAEjF,EAAS,YAAY,kBAAkB,CAAI,CAC7C,CAEA,SAAS,GAAiB,EAAoE,CAC5F,OAAO,EAAS,YAAY,iBAAiB,EAAE,IAAK,IAAsB,CACxE,KAAM,EAAiB,KACvB,KAAM,EAAiB,OAAO,IAChC,EAAE,CACJ,CAEA,SAAgB,GAA8B,EAAoC,CAChF,IAAM,EAAW,GAAwB,CAAG,EAC5C,MAAO,CACL,kBAAqB,GAAqB,CAAQ,EAClD,qBAAuB,GAAoB,GAAqB,EAAU,CAAe,EACzF,SAAU,EAAU,IAAU,GAAc,EAAU,EAAU,CAAK,EACrE,UAAW,KAAO,IAAa,EAAS,UAAU,UAAU,CAAQ,EACpE,OAAQ,KAAO,IAAa,EAAS,UAAU,OAAO,CAAQ,EAC9D,QAAS,KAAO,IAAa,EAAS,UAAU,QAAQ,CAAQ,EAChE,eAAgB,KAAO,IACjB,EAAO,SAAS,GAAG,GAAK,CAAC,EAAO,SAAS,GAAG,EACvC,EAAS,YAAY,eAAe,CAAE,KAAM,SAAU,KAAM,CAAO,CAAC,EAEtE,EAAS,YAAY,eAAe,CAAE,KAAM,MAAO,IAAK,CAAO,CAAC,EAEzE,kBAAoB,GAAS,GAAkB,EAAU,CAAI,EAC7D,kBAAmB,KAAO,IAAS,EAAS,YAAY,kBAAkB,CAAI,EAC9E,gBAAiB,SAAY,GAAiB,CAAQ,EACtD,cAAe,UAAa,CAC1B,mBAAoB,MAAM,EAAS,OAAO,QAAQ,GAAG,MACvD,EACF,CACF,CC7JA,eAAsB,GACpB,EACA,EACkB,CAClB,GAAI,EAAK,WAAW,KAAO,aACzB,MAAO,GAGT,IAAM,EAAS,MAAM,GAA8B,CACjD,MACA,KAAM,EAAK,WAAW,MAAM,CAAC,EAC7B,OAAQ,EAAK,OACb,QAAS,EAAK,QACd,OAAQ,EAAK,MACf,CAAC,EACK,EAAS,EAAO,QAAQ,SAAS;CAAI,EAAI,EAAO,QAAU,GAAG,EAAO,QAAQ,IAMlF,OALK,EAAO,UACV,QAAQ,OAAO,MAAM,CAAM,EAC3B,QAAQ,KAAK,CAAC,GAEhB,QAAQ,OAAO,MAAM,CAAM,EACpB,EACT,CCOA,SAAS,IAAiC,CACxC,MAAO,CACL,CAAE,MAAO,OAAQ,MAAO,OAAQ,YAAa,yBAA0B,EACvE,CAAE,MAAO,UAAW,MAAO,UAAW,YAAa,0BAA2B,EAC9E,CAAE,MAAO,cAAe,MAAO,cAAe,YAAa,yBAA0B,EACrF,CACE,MAAO,oBACP,MAAO,oBACP,YAAa,4BACf,CACF,CACF,CAEA,SAAS,IAAqC,CAC5C,MAAO,CACL,CAAE,MAAO,aAAc,MAAO,KAAM,YAAa,KAAM,EACvD,CAAE,MAAO,cAAe,MAAO,KAAM,YAAa,SAAU,EAC5D,CAAE,MAAO,eAAgB,MAAO,KAAM,YAAa,KAAM,EACzD,CAAE,MAAO,cAAe,MAAO,KAAM,YAAa,IAAK,CACzD,CACF,CAEA,SAAS,IAA+C,CACtD,MAAO,CACL,CAAE,MAAO,UAAW,MAAO,UAAW,YAAa,uBAAwB,EAC3E,CAAE,MAAO,OAAQ,MAAO,OAAQ,YAAa,0BAA2B,EACxE,CAAE,MAAO,MAAO,MAAO,MAAO,YAAa,sBAAuB,EAClE,CAAE,MAAO,MAAO,MAAO,MAAO,YAAa,oBAAqB,EAChE,CAAE,MAAO,OAAQ,MAAO,OAAQ,YAAa,0BAA2B,CAC1E,CACF,CAEA,MAAa,GAGT,CACF,MAAO,IAAA,GACP,WAAY,IAAA,GACZ,MAAO,CAAE,cAAe,UAAW,QAAS,6BAA8B,EAC1E,QAAS,IAAA,GACT,QAAS,IAAA,GACT,KAAM,IAAA,GACN,KAAM,CAAE,cAAe,UAAW,QAAS,mBAAoB,EAC/D,KAAM,IAAA,GACN,SAAU,CAAE,cAAe,SAAU,SAAU,EAAiB,EAChE,OAAQ,IAAA,GACR,KAAM,CAAE,cAAe,SAAU,SAAU,EAAa,EACxD,MAAO,IAAA,GACP,YAAa,IAAA,GACb,OAAQ,IAAA,GACR,SAAU,CAAE,cAAe,SAAU,SAAU,EAA2B,EAC1E,OAAQ,IAAA,GACR,MAAO,IAAA,GACP,OAAQ,IAAA,GACR,OAAQ,IAAA,GACR,SAAU,IAAA,GACV,OAAQ,IAAA,GACR,WAAY,IAAA,GACZ,aAAc,IAAA,GACd,mBAAoB,IAAA,EACtB,EAEA,SAAgB,GAAmB,EAA4D,CAC7F,OAAO,GAAyB,EAClC,CCDA,SAAS,IAAsB,CAC7B,GAAI,CAEF,IAAM,EAAM,EADK,EAAc,OAAO,KAAK,GAChB,CAAC,EACtB,EAAa,CAAC,EAAK,EAAK,KAAM,KAAM,cAAc,EAAG,EAAK,EAAK,KAAM,cAAc,CAAC,EAE1F,IAAK,IAAM,KAAW,EACpB,GAAI,CACF,IAAM,EAAM,EAAa,EAAS,OAAO,EACnC,EAAM,KAAK,MAAM,CAAG,EAC1B,GAAI,EAAI,UAAY,IAAA,IAAa,EAAI,OAAS,IAAA,GAC5C,OAAO,EAAI,OAEf,MAAQ,CAER,CAEF,MAAO,OACT,MAAQ,CACN,MAAO,OACT,CACF,CAGA,SAAS,GAAY,EAAe,EAAS,GAAwB,CACnE,OAAO,IAAI,SAAiB,EAAS,IAAW,CAC9C,QAAQ,OAAO,MAAM,CAAK,EAC1B,IAAI,EAAQ,GACN,EAAQ,QAAQ,MAChB,EAAS,EAAM,MACrB,GAAI,CAAC,EAAM,MAAO,CAChB,EACM,MACF;;;8BAIF,CACF,EACA,MACF,CACA,EAAM,WAAW,EAAI,EACrB,EAAM,OAAO,EACb,EAAM,YAAY,MAAM,EACxB,IAAM,EAAU,GAAuB,CACrC,IAAK,IAAM,KAAM,EACf,GAAI,IAAO,MAAQ,IAAO;EAAM,CAC9B,EAAM,eAAe,OAAQ,CAAM,EACnC,EAAM,WAAW,GAAU,EAAK,EAChC,EAAM,MAAM,EACZ,QAAQ,OAAO,MAAM;CAAI,EACzB,EAAQ,EAAM,KAAK,CAAC,EACpB,MACF,MAAW,IAAO,KAAU,IAAO,KAC7B,EAAM,OAAS,IACjB,EAAQ,EAAM,MAAM,EAAG,EAAE,EACzB,QAAQ,OAAO,MAAM,OAAO,GAErB,IAAO,KAChB,EAAM,eAAe,OAAQ,CAAM,EACnC,EAAM,WAAW,GAAU,EAAK,EAChC,EAAM,MAAM,EACZ,QAAQ,OAAO,MAAM;CAAI,EACzB,QAAQ,KAAK,CAAC,GACL,EAAG,WAAW,CAAC,GAAK,KAC7B,GAAS,EACT,QAAQ,OAAO,MAAM,EAAS,IAAM,CAAE,EAG5C,EACA,EAAM,GAAG,OAAQ,CAAM,CACzB,CAAC,CACH,CAEA,SAAS,GAAmB,EAAa,EAA0B,CAEjE,IAAM,EAAU,EADC,EAAQ,EAAK,CACM,EAAG,MAAM,EAAE,KAAK,EACpD,GAAI,EAAQ,SAAW,EACrB,MAAU,MAAM,uBAAuB,GAAU,EAEnD,MAAO,cAAc,EAAS,MAAM,GACtC,CAGA,SAAS,IAAoB,CAC3B,IAAM,EAAW,EAAoB,EACjC,EAAe,CAAQ,EACzB,QAAQ,OAAO,MAAM,WAAW,EAAS,GAAG,EAE5C,QAAQ,OAAO,MAAM;CAA2B,CAEpD,CAeA,SAAgB,GAA+B,CAC7C,MACA,uBACoE,CACpE,MAAO,CACL,GAA0B,CAAE,KAAI,CAAC,EACjC,GAAwB,EACxB,GAAyB,EACzB,GAAyB,CACvB,sBACA,SAAU,CACR,uBAA0B,EAA2B,CAAG,CAC1D,CACF,CAAC,EACD,GAA+B,EAC/B,GAAwB,EACxB,GAA4B,EAC5B,GAA8B,EAC9B,GAA0B,EAC1B,GAA6B,EAC7B,GAA2B,EAC3B,GAA2B,EAC3B,GAAwB,EACxB,GAA2B,EAC3B,GAAyB,EACzB,GAA0B,EAC1B,GAA8B,EAC9B,GAA0B,EAC1B,GAA4B,EAC5B,GAA4B,CAC1B,sBACA,SAAU,CACR,uBAA0B,EAA2B,CAAG,EACxD,uBACE,EAAa,EAAuC,CAAG,CAAC,EAC1D,oBAAsB,GACpB,EAAc,EAAuC,CAAG,EAAG,CAAQ,CACvE,CACF,CAAC,CACH,CACF,CASA,SAAS,GACP,EACA,EACA,EACA,EACW,CACX,IAAM,EAA4C,CAChD,SAAU,CACR,SAAY,EAAa,EAAoB,CAAC,EAC9C,MAAQ,GAAa,EAAc,EAAoB,EAAG,CAAQ,CACpE,EACA,OAAQ,GAA8B,CAAG,CAC3C,EACM,EAAsB,EAAQ,qBAAuB,EAQ3D,MAAO,CAAE,sBAAqB,sBAAqB,eAAA,CANjD,GAAG,GAA+B,CAAE,MAAK,qBAAoB,CAAC,EAC9D,GAAI,EAAQ,gBAAkB,CAAC,CAK+B,EAAG,2BAHhC,GAA+B,CAAI,EAClE,GAA0B,CAAE,eAAgB,CAAQ,CAAC,EACrD,IAAA,EAC0F,CAChG,CAEA,SAAS,GAAwB,EAAa,EAA0C,CACtF,IAAM,EAAwB,CAAC,EAE/B,GADI,EAAK,oBAAoB,EAAY,KAAK,EAAK,kBAAkB,EACjE,EAAK,SACP,GAAI,CACF,EAAY,KAAK,GAAmB,EAAK,EAAK,QAAQ,CAAC,CACzD,OAAS,EAAO,CAEd,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,KAAK,CAAC,CAChB,CAMF,OAJI,EAAK,YACP,EAAY,KACV,6DAA6D,EAAK,YACpE,EACK,EAAY,OAAS,EAAI,EAAY,KAAK;;CAAM,EAAI,IAAA,EAC7D,CAEA,eAAe,GACb,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACe,CACf,IAAI,EAAS,EAAK,WAAW,KAAK,GAAG,EAAE,KAAK,EAG5C,GAAI,CAAC,GAAU,CAAC,QAAQ,MAAM,MAAO,CACnC,IAAM,EAAmB,CAAC,EAC1B,UAAW,IAAM,KAAS,QAAQ,MAChC,EAAO,KAAK,CAAe,EAE7B,EAAS,OAAO,OAAO,CAAM,EAAE,SAAS,OAAO,EAAE,KAAK,CACxD,CAEK,IACH,QAAQ,OAAO,MAAM;CAA+C,EACpE,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAqB,GAAwB,EAAK,CAAI,EAGxD,EAAK,cACP,QAAQ,OAAO,MAAM;CAAuE,EAM9F,IAAM,EAAU,IAAI,EAAmB,CACrC,MACA,WACA,eAAgB,EAAK,gBAAkB,oBACvC,SAAU,EAAK,SACf,aAAc,EAAK,qBAAuB,IAAA,GAAY,EACtD,YAAa,EAAK,YAClB,KAAM,EAAK,MAAQ,IAAA,GACnB,aAAc,EAAK,aACf,EAAK,aACF,MAAM,GAAG,EACT,IAAK,GAAM,EAAE,KAAK,CAAC,EACnB,OAAQ,GAAM,EAAE,OAAS,CAAC,EAC7B,IAAA,GACJ,qBACA,wBACA,wBACA,iBACA,sBACA,UAtBiB,GACjB,EAAS,EAAS,CAAE,QAAS,IAAM,SAAU,QAAS,MAAO,MAAO,CAAC,EAAE,QAAQ,EAsB/E,UAAW,YACb,CAAC,EAEK,EAAY,GAAwB,CACxC,aAAc,EAAK,cAAgB,OACnC,QACF,CAAC,EACD,EAAQ,gBAAgB,CAAS,EACjC,MAAM,EAAU,MAAM,EACtB,MAAM,EAAQ,SAAS,CAAE,OAAQ,oBAAqB,QAAS,6BAA8B,CAAC,EAC9F,QAAQ,KAAK,EAAU,YAAY,CAAC,CACtC,CAEA,eAAsB,GAAS,EAA4B,CAAC,EAAkB,CAC5E,IAAM,EAAO,GAAa,EACpB,EAAU,GAAY,EAE5B,GAAI,EAAK,KAAM,CACb,GAAU,EACV,MACF,CAEA,GAAI,EAAK,QAAS,CAChB,QAAQ,OAAO,MAAM,UAAU,EAAQ,GAAG,EAC1C,MACF,CAEA,GAAI,EAAK,YAAa,CACpB,IAAM,EAAS,MAAM,EAAkB,CAAE,eAAgB,EAAS,MAAO,EAAK,CAAC,EACzE,EAAU,GAA4B,CAAM,EAC9C,EAAO,SAAW,UACpB,QAAQ,OAAO,MAAM,GAAG,EAAQ,GAAG,EACnC,QAAQ,KAAK,CAAC,GAEhB,QAAQ,OAAO,MAAM,GAAG,EAAQ,GAAG,EACnC,MACF,CAEA,GAAI,EAAK,MAAO,CACd,GAAY,EACZ,MACF,CAEA,IAAM,EAAM,QAAQ,IAAI,EAExB,GAAI,MAAM,GAAqC,EAAM,CAAG,EACtD,OAGF,GAAM,CAAE,sBAAqB,sBAAqB,iBAAgB,8BAChE,GAAkB,EAAK,EAAM,EAAS,CAAO,EAE/C,GAAI,EAAK,UAAW,CAClB,MAAM,EAA4B,EAAK,EAAM,GAAa,CAAmB,EAC7E,MACF,CAEA,GAAI,GAAgC,EAAK,EAAM,CAAmB,EAChE,OAGF,GAAI,CACF,MAAM,GAAa,EAAK,EAAM,GAAa,CAAmB,CAChE,OAAS,EAAO,CAEd,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,KAAK,CAAC,CAChB,CAGA,IAAM,EAAkB,EAAK,SACzB,CAAE,iBAAkB,EAAK,SAAU,qBAAoB,EACvD,CAAE,qBAAoB,EACpB,EAAyB,EAA2B,CAAG,EACjC,EAAK,UAAY,EAAuB,gBACpE,IAAM,EAAmB,EAAqB,EAAK,CAAe,EAC5D,EAAU,EAAK,OAAS,EAAiB,MACzC,EAAwB,GAA2B,EAAK,EAAK,MAAO,CAAe,EACnF,EAAwB,GAAmC,EAC3D,EAAQ,GAAa,CAAG,EACxB,EAAwB,GAAwC,CACpE,eAAgB,CAAE,GAAG,EAAkB,MAAO,CAAQ,EACtD,QAAS,EAAM,IACjB,CAAC,EAGK,EAAe,GAA0B,CAAG,EAC9C,EACA,EAA2B,GAgB/B,GAdI,EAAK,aACP,EAAkB,GAAuB,EAAc,CAAG,EACjD,EAAK,WAAa,IAAA,KACvB,EAAK,WAAa,GACpB,EAA2B,IAE3B,EAAkB,GAA2B,EAAc,EAAK,QAAQ,EACpE,IAAoB,IAAA,KACtB,QAAQ,OAAO,MAAM,sBAAsB,EAAK,SAAS,GAAG,EAC5D,QAAQ,KAAK,CAAC,KAKhB,EAAK,UAAW,CAClB,MAAM,GACJ,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,EACA,MACF,CAiCA,MAAM,IA9BmB,GAAa,CACpC,MACA,WACA,iBAAkB,EAAK,SACvB,aAAc,EAAiB,KAC/B,UACA,SAAU,EAAK,SACf,eAAgB,EAAK,eACrB,SAAU,EAAK,SACf,UACA,aAAc,EAAK,qBAAuB,IAAA,GAAY,EACtD,kBACA,2BACA,YAAa,EAAK,YAClB,YAAa,EAAK,YAClB,wBACA,wBACA,iBACA,sBACA,UAAY,GACV,EAAS,EAAS,CAAE,QAAS,IAAM,SAAU,QAAS,MAAO,MAAO,CAAC,EAAE,QAAQ,EACjF,oBAAqB,EACjB,EAA2B,KAAM,GAAO,EAAI,EAAsB,CAAC,EAAI,IAAA,EAAU,EACjF,IAAA,GACJ,kBAAmB,GAAwB,EAC3C,WAAY,GAAoB,CAAmB,EACnD,4BACA,UAAW,aACX,qBACF,CACiB,EAAE,MAAM,EACzB,QAAQ,KAAK,CAAC,CAChB,CAEA,SAAS,GAAoB,EAAqE,CAChG,MAAO,CACL,wBAA2B,EAAoB,EAC/C,aAAe,GAAS,EAAa,CAAI,EACzC,eAAgB,EAAM,IAAa,EAAc,EAAM,CAAQ,EAC/D,eAAiB,GAAS,EAAe,CAAI,EAC7C,yBAA0B,EAAM,IAAU,GAAwB,EAAM,CAAK,EAC7E,0BAA4B,GAAa,CACvC,EAA0B,CAAQ,CACpC,EACA,wBAAyB,EAAK,EAAS,KACrC,GAAuB,EAAK,EAAS,CAAO,EACrC,CAAE,QAAS,EAAK,GAEzB,aAAe,GAAQ,GAAiB,CAAG,EAC3C,uBAAyB,GACvB,GAAuB,EAAqB,CAAI,GAAG,aAAe,CACtE,CACF,CAEA,SAAS,IAA6C,CACpD,IAAM,EAAW,IAAI,GAAkB,EAAoB,CAAC,EAE5D,OADA,EAAS,SAAS,IAAI,EAAa,EAC5B,CACT,CC9fA,QAAQ,GAAG,oBAAsB,GAAQ,CACvC,IAAM,EAAM,EAAI,SAAW,GAO3B,GALE,EAAI,SAAS,cAAc,GAC3B,EAAI,SAAS,mBAAmB,GAChC,EAAI,SAAS,gBAAgB,GAC7B,EAAI,SAAS,OAAO,GACpB,EAAI,SAAS,YAAY,EACV,CACf,QAAQ,OAAO,MAAM,kCAAkC,EAAI,GAAG,EAC9D,MACF,CAEA,MAAM,CACR,CAAC,EAED,GAAS,EAAE,MAAO,GAAiC,CACjD,IAAM,EAAU,aAAe,MAAQ,EAAI,QAAU,OAAO,CAAG,EAC/D,QAAQ,OAAO,MAAM,EAAU;CAAI,EACnC,QAAQ,KAAK,CAAC,CAChB,CAAC"}
1
+ {"version":3,"file":"bin.js","names":[],"sources":["../../src/startup/append-system-prompt.ts","../../src/constants.ts","../../src/modes/shell-exec.ts","../../src/modes/print-mode.ts","../../src/modes/tui-mode.ts","../../src/startup/args-to-options.ts","../../src/startup/command-setup.ts","../../src/startup/provider-startup.ts","../../src/startup/config-phase.ts","../../src/utils/cli-args.ts","../../src/startup/reset-config.ts","../../src/startup/preflight.ts","../../src/startup/subagent-setup.ts","../../src/startup/provider-setup.ts","../../src/startup/session-setup.ts","../../src/startup/update-notice.ts","../../src/startup/version.ts","../../src/user-local-direct-command.ts","../../src/cli.ts","../../src/bin.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport interface IAppendSystemPromptOptions {\n appendSystemPrompt?: string;\n taskFile?: string;\n jsonSchema?: string;\n}\n\nfunction readTaskFilePrompt(cwd: string, taskFile: string): string {\n const taskPath = resolve(cwd, taskFile);\n const content = readFileSync(taskPath, 'utf8').trim();\n if (content.length === 0) {\n throw new Error(`Task file is empty: ${taskFile}`);\n }\n return `Task file (${taskFile}):\\n${content}`;\n}\n\nexport function buildAppendSystemPrompt(\n cwd: string,\n opts: IAppendSystemPromptOptions,\n): string | undefined {\n const appendParts: string[] = [];\n if (opts.appendSystemPrompt) appendParts.push(opts.appendSystemPrompt);\n if (opts.taskFile) {\n appendParts.push(readTaskFilePrompt(cwd, opts.taskFile));\n }\n if (opts.jsonSchema)\n appendParts.push(\n `Respond with valid JSON only, matching this JSON schema:\\n${opts.jsonSchema}`,\n );\n return appendParts.length > 0 ? appendParts.join('\\n\\n') : undefined;\n}\n","export const AGENT_CLI_NAME = 'robota-cli';\n","import { execSync } from 'node:child_process';\n\nexport const SHELL_EXEC_TIMEOUT_MS = 5_000;\n\nexport function createShellExec(): (command: string) => string {\n return (command: string): string =>\n execSync(command, {\n timeout: SHELL_EXEC_TIMEOUT_MS,\n encoding: 'utf-8',\n stdio: 'pipe',\n }).trimEnd();\n}\n","import { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';\n\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\nimport { AGENT_CLI_NAME } from '../constants.js';\nimport { createShellExec } from './shell-exec.js';\n\nimport type { ISessionRunOptions } from '../startup/args-to-options.js';\nimport type { IAgentRuntime } from '@robota-sdk/agent-framework';\n\nasync function resolvePrompt(opts: ISessionRunOptions): Promise<string> {\n let prompt = opts.positional.join(' ').trim();\n\n if (!prompt && !process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n process.stderr.write('Print mode (-p) requires a prompt argument.\\n');\n process.exit(1);\n }\n\n return prompt;\n}\n\nexport async function runPrintMode(\n opts: ISessionRunOptions,\n runtime: IAgentRuntime,\n): Promise<void> {\n const prompt = await resolvePrompt(opts);\n const appendSystemPrompt = buildAppendSystemPrompt(runtime.cwd, opts);\n const shellExec = createShellExec();\n\n const session = runtime.createSession({\n permissionMode: opts.permissionMode ?? 'bypassPermissions',\n maxTurns: opts.maxTurns,\n sessionStore: opts.noSessionPersistence ? undefined : runtime.sessionStore,\n sessionName: opts.sessionName,\n bare: opts.bare || undefined,\n allowedTools: opts.allowedTools\n ? opts.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n appendSystemPrompt,\n systemPrompt: opts.systemPrompt,\n shellExec,\n agentName: AGENT_CLI_NAME,\n });\n\n const transport = createHeadlessTransport({\n outputFormat: opts.outputFormat ?? 'text',\n prompt,\n });\n session.attachTransport(transport);\n await transport.start();\n await session.shutdown({ reason: 'prompt_input_exit', message: 'Headless transport complete' });\n process.exit(transport.getExitCode());\n}\n","import { TuiTransport, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\n\nimport type { ISessionRunOptions } from '../startup/args-to-options.js';\nimport type { ICommandSetup } from '../startup/command-setup.js';\nimport type { IProviderSetup } from '../startup/provider-setup.js';\nimport type { ISessionSetup } from '../startup/session-setup.js';\nimport type { IAgentRuntime } from '@robota-sdk/agent-framework';\nimport { AGENT_CLI_NAME } from '../constants.js';\nimport { createShellExec } from './shell-exec.js';\n\nexport interface ITuiModeOptions {\n runtime: IAgentRuntime;\n version: string;\n commandSetup: ICommandSetup;\n providerSetup: IProviderSetup;\n sessionSetup: ISessionSetup;\n sessionOpts: ISessionRunOptions;\n startupUpdateNotice: Promise<string | undefined> | undefined;\n}\n\nexport async function runTuiMode(opts: ITuiModeOptions): Promise<void> {\n const {\n runtime,\n version,\n commandSetup,\n providerSetup,\n sessionSetup,\n sessionOpts,\n startupUpdateNotice,\n } = opts;\n\n const tuiTransport = new TuiTransport({\n runtime,\n providerOverride: providerSetup.activeProfileName,\n providerType: providerSetup.providerSettings.name,\n modelId: providerSetup.modelId,\n language: sessionOpts.language,\n permissionMode: sessionOpts.permissionMode,\n maxTurns: sessionOpts.maxTurns,\n version,\n resumeSessionId: sessionSetup.resumeSessionId,\n showSessionPickerOnStart: sessionSetup.showSessionPickerOnStart,\n forkSession: sessionOpts.forkSession,\n sessionName: sessionOpts.sessionName,\n shellExec: createShellExec(),\n startupUpdateNotice,\n cliAdapter: createDefaultTuiCliAdapter({\n providerDefinitions: commandSetup.providerDefinitions,\n reloadPluginCommandSource: commandSetup.reloadPluginCommandSource,\n }),\n agentName: AGENT_CLI_NAME,\n });\n\n await tuiTransport.start();\n}\n","import type { IParsedCliArgs, TOutputFormat } from '../utils/cli-args.js';\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nexport interface IConfigPhaseOptions {\n configure: boolean;\n provider?: string;\n settingsScope?: string;\n configureProvider?: string;\n providerType?: string;\n model?: string;\n apiKey?: string;\n apiKeyEnv?: string;\n baseURL?: string;\n setCurrent: boolean;\n printMode: boolean;\n positional: readonly string[];\n}\n\nexport interface ISessionRunOptions {\n positional: readonly string[];\n language?: string;\n permissionMode?: TPermissionMode;\n maxTurns?: number;\n sessionName?: string;\n noSessionPersistence: boolean;\n continueMode: boolean;\n resumeId?: string;\n forkSession: boolean;\n outputFormat?: TOutputFormat;\n bare: boolean;\n allowedTools?: string;\n systemPrompt?: string;\n appendSystemPrompt?: string;\n taskFile?: string;\n jsonSchema?: string;\n}\n\nexport interface IUserLocalCommandOptions {\n positional: readonly string[];\n format?: string;\n summary?: string;\n source?: string;\n}\n\nexport interface IStartupUpdatePolicyOptions {\n printMode: boolean;\n disableUpdateCheck: boolean;\n}\n\nexport function toConfigPhaseOptions(args: IParsedCliArgs): IConfigPhaseOptions {\n return {\n configure: args.configure,\n provider: args.provider,\n settingsScope: args.settingsScope,\n configureProvider: args.configureProvider,\n providerType: args.providerType,\n model: args.model,\n apiKey: args.apiKey,\n apiKeyEnv: args.apiKeyEnv,\n baseURL: args.baseURL,\n setCurrent: args.setCurrent,\n printMode: args.printMode,\n positional: args.positional,\n };\n}\n\nexport function toSessionRunOptions(args: IParsedCliArgs): ISessionRunOptions {\n return {\n positional: args.positional,\n language: args.language,\n permissionMode: args.permissionMode,\n maxTurns: args.maxTurns,\n sessionName: args.sessionName,\n noSessionPersistence: args.noSessionPersistence,\n continueMode: args.continueMode,\n resumeId: args.resumeId,\n forkSession: args.forkSession,\n outputFormat: args.outputFormat,\n bare: args.bare,\n allowedTools: args.allowedTools,\n systemPrompt: args.systemPrompt,\n appendSystemPrompt: args.appendSystemPrompt,\n taskFile: args.taskFile,\n jsonSchema: args.jsonSchema,\n };\n}\n\nexport function toUserLocalCommandOptions(args: IParsedCliArgs): IUserLocalCommandOptions {\n return {\n positional: args.positional,\n format: args.format,\n summary: args.summary,\n source: args.source,\n };\n}\n\nexport function toStartupUpdatePolicyOptions(args: IParsedCliArgs): IStartupUpdatePolicyOptions {\n return {\n printMode: args.printMode,\n disableUpdateCheck: args.disableUpdateCheck,\n };\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport type { CommandRegistry } from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n reloadPluginCommandSource,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICommandSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n reloadPluginCommandSource: (registry: CommandRegistry) => void;\n}\n\nexport function createCommandSetup(cwd: string, options: IStartCliOptions = {}): ICommandSetup {\n const commandHostAdapters: ICommandHostAdapters = {\n settings: {\n read: () => readSettings(getUserSettingsPath()),\n write: (settings) => writeSettings(getUserSettingsPath(), settings),\n },\n plugin: createDefaultPluginCommandAdapter(cwd),\n };\n const providerDefinitions = options.providerDefinitions ?? createDefaultProviderDefinitions();\n const providerSettingsAdapter = {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n readTargetSettings: () =>\n readSettings(resolveProviderSettingsWriteTargetPath(cwd)) as TProviderSettingsDocument,\n writeTargetSettings: (settings: TProviderSettingsDocument) =>\n writeSettings(resolveProviderSettingsWriteTargetPath(cwd), settings),\n };\n const commandModules: readonly ICommandModule[] = [\n ...createDefaultCommandModules({ cwd, providerDefinitions, providerSettingsAdapter }),\n ...(options.commandModules ?? []),\n ];\n return { commandHostAdapters, providerDefinitions, commandModules, reloadPluginCommandSource };\n}\n","import { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IConfigPhaseOptions } from './args-to-options.js';\nimport {\n applyProviderConfiguration,\n applyProviderSwitch,\n readMergedProviderSettings,\n resolveProviderSettingsWriteTargetPath,\n resolveSettingsPathForScope,\n} from '@robota-sdk/agent-framework';\nimport type { TSettingsScope } from '@robota-sdk/agent-framework';\nimport { type IProviderSetupInput } from '@robota-sdk/agent-framework';\nimport {\n ensureProviderConfig,\n runProviderStartupSetup,\n type TPromptInput,\n} from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nfunction validateSettingsScope(scope: string | undefined): TSettingsScope | undefined {\n if (scope === undefined || scope === 'user' || scope === 'project-local') {\n return scope as TSettingsScope | undefined;\n }\n throw new Error(`Invalid --settings-scope \"${scope}\". Valid: user | project-local`);\n}\n\nexport function handleProviderConfigurationArgs(\n cwd: string,\n opts: IConfigPhaseOptions,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[],\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(opts.settingsScope));\n if (opts.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromOptions(opts), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\n return !opts.printMode && opts.positional.length === 0;\n }\n if (opts.provider && opts.setCurrent) {\n const switchSettingsPath =\n opts.settingsScope === undefined ? resolveProviderSettingsWriteTargetPath(cwd) : settingsPath;\n applyProviderSwitch(switchSettingsPath, opts.provider, {\n knownProviders: readMergedProviderSettings(cwd).providers,\n });\n terminal.writeLine(`Current provider set to ${opts.provider}`);\n return !opts.printMode && opts.positional.length === 0;\n }\n return false;\n}\n\nexport async function ensureConfig(\n cwd: string,\n opts: IConfigPhaseOptions,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[],\n isInteractive: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: opts.provider, settingsScope: validateSettingsScope(opts.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive: () => isInteractive,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n opts: IConfigPhaseOptions,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[],\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(opts.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n );\n}\n\nfunction buildSetupInputFromOptions(opts: IConfigPhaseOptions): IProviderSetupInput {\n const type = opts.providerType ?? opts.configureProvider;\n if (!opts.configureProvider || !type) {\n throw new Error('--configure-provider requires a provider profile and --type');\n }\n return {\n profile: opts.configureProvider,\n type,\n ...(opts.model !== undefined && { model: opts.model }),\n ...(opts.apiKey !== undefined && { apiKey: opts.apiKey }),\n ...(opts.apiKeyEnv !== undefined && { apiKeyEnv: opts.apiKeyEnv }),\n ...(opts.baseURL !== undefined && { baseURL: opts.baseURL }),\n setCurrent: opts.setCurrent,\n };\n}\n\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[],\n): string {\n return [\n 'No provider configuration found.',\n 'Run `robota --configure` in an interactive terminal, or configure a provider:',\n `Supported providers: ${formatSupportedProviderTypes(providerDefinitions)}`,\n ...providerDefinitions.map(formatConfigureProviderExample),\n ].join('\\n');\n}\n\nfunction formatConfigureProviderExample(definition: IProviderDefinition): string {\n const flags = [\n `robota --configure-provider ${definition.type}`,\n `--type ${definition.type}`,\n ...(definition.defaults?.baseURL !== undefined ? ['--base-url <url>'] : []),\n '--model <model>',\n ...(definition.requiresApiKey === true ? ['--api-key-env <ENV_NAME>'] : []),\n '--set-current',\n ];\n return ` ${flags.join(' ')}`;\n}\n","import type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport { promptInput } from '@robota-sdk/agent-transport/headless';\nimport type { IConfigPhaseOptions } from './args-to-options.js';\nimport type { ICommandSetup } from './command-setup.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './provider-startup.js';\n\nexport type TConfigPhaseResult = { handled: true } | { handled: false };\n\nexport async function handleConfigPhase(\n cwd: string,\n opts: IConfigPhaseOptions,\n commandSetup: ICommandSetup,\n terminal: ITerminalOutput,\n isInteractive: boolean,\n): Promise<TConfigPhaseResult> {\n if (opts.configure) {\n await runInteractiveProviderSetup(\n cwd,\n opts,\n promptInput,\n terminal,\n commandSetup.providerDefinitions,\n );\n return { handled: true };\n }\n\n if (handleProviderConfigurationArgs(cwd, opts, terminal, commandSetup.providerDefinitions)) {\n return { handled: true };\n }\n\n await ensureConfig(\n cwd,\n opts,\n promptInput,\n terminal,\n commandSetup.providerDefinitions,\n isInteractive,\n );\n\n return { handled: false };\n}\n","/**\n * CLI argument parsing and validation.\n * Pure functions — throw on invalid input, no process.* side effects.\n */\n\nimport { parseArgs } from 'node:util';\n\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nconst VALID_MODES: TPermissionMode[] = ['plan', 'default', 'acceptEdits', 'bypassPermissions'];\n\nconst VALID_OUTPUT_FORMATS = ['text', 'json', 'stream-json'] as const;\nexport type TOutputFormat = (typeof VALID_OUTPUT_FORMATS)[number];\n\nexport interface IParsedCliArgs {\n positional: string[];\n help: boolean;\n printMode: boolean;\n continueMode: boolean;\n resumeId: string | undefined;\n model: string | undefined;\n language: string | undefined;\n permissionMode: TPermissionMode | undefined;\n maxTurns: number | undefined;\n forkSession: boolean;\n sessionName: string | undefined;\n outputFormat: TOutputFormat | undefined;\n format: string | undefined;\n summary: string | undefined;\n source: string | undefined;\n systemPrompt: string | undefined;\n appendSystemPrompt: string | undefined;\n taskFile: string | undefined;\n version: boolean;\n reset: boolean;\n bare: boolean;\n allowedTools: string | undefined;\n noSessionPersistence: boolean;\n jsonSchema: string | undefined;\n configure: boolean;\n configureProvider: string | undefined;\n provider: string | undefined;\n providerType: string | undefined;\n baseURL: string | undefined;\n apiKey: string | undefined;\n apiKeyEnv: string | undefined;\n setCurrent: boolean;\n settingsScope: string | undefined;\n checkUpdate: boolean;\n disableUpdateCheck: boolean;\n}\n\n/** Return CLI usage help text. */\nexport function printHelp(): string {\n return `\nUsage: robota [options] [-p <prompt>]\n\nOptions:\n -p <prompt> Run in print (headless) mode with the given prompt\n --output-format <format> Output format: text | json | stream-json (default: text)\n --system-prompt <text> Override the system prompt for this session\n --append-system-prompt <t> Append text to the system prompt\n --language <lang> Language preference (e.g. ko, en)\n --no-session-persistence Disable session persistence for this run\n --model <model> Override model for this session\n --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions\n --max-turns <n> Maximum agent turns before stopping\n -c, --continue Continue the most recent session\n -r, --resume <id> Resume a session by ID or name\n -n, --name <name> Name for the new session\n --fork-session Fork the current session\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nExamples:\n robota Start interactive TUI session\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota --continue Resume the last session\n`;\n}\n\n/** Validate and return a TOutputFormat from a raw CLI string, or throw on error. */\nexport function parseOutputFormat(raw: string | undefined): TOutputFormat | undefined {\n if (raw === undefined) return undefined;\n if (!(VALID_OUTPUT_FORMATS as readonly string[]).includes(raw)) {\n throw new Error(`Invalid --output-format \"${raw}\". Valid: ${VALID_OUTPUT_FORMATS.join(' | ')}`);\n }\n return raw as TOutputFormat;\n}\n\n/** Validate and return a TPermissionMode from a raw CLI string, or throw on error. */\nexport function parsePermissionMode(raw: string | undefined): TPermissionMode | undefined {\n if (raw === undefined) return undefined;\n if (!VALID_MODES.includes(raw as TPermissionMode)) {\n throw new Error(`Invalid --permission-mode \"${raw}\". Valid: ${VALID_MODES.join(' | ')}`);\n }\n return raw as TPermissionMode;\n}\n\n/** Validate and return a positive integer from a raw CLI string, or throw on error. */\nexport function parseMaxTurns(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = parseInt(raw, 10);\n if (isNaN(n) || n <= 0) {\n throw new Error(`Invalid --max-turns \"${raw}\". Must be a positive integer.`);\n }\n return n;\n}\n\nconst PARSE_ARGS_CONFIG = {\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h', default: false },\n p: { type: 'boolean', short: 'p', default: false },\n continue: { type: 'boolean', short: 'c', default: false },\n resume: { type: 'string', short: 'r' },\n model: { type: 'string' },\n language: { type: 'string' },\n 'permission-mode': { type: 'string' },\n 'max-turns': { type: 'string' },\n 'fork-session': { type: 'boolean', default: false },\n name: { type: 'string', short: 'n' },\n 'output-format': { type: 'string' },\n format: { type: 'string' },\n summary: { type: 'string' },\n source: { type: 'string' },\n 'system-prompt': { type: 'string' },\n 'append-system-prompt': { type: 'string' },\n 'task-file': { type: 'string' },\n version: { type: 'boolean', default: false },\n reset: { type: 'boolean', default: false },\n bare: { type: 'boolean', default: false },\n 'allowed-tools': { type: 'string' },\n 'no-session-persistence': { type: 'boolean', default: false },\n 'json-schema': { type: 'string' },\n configure: { type: 'boolean', default: false },\n 'configure-provider': { type: 'string' },\n provider: { type: 'string' },\n type: { type: 'string' },\n 'base-url': { type: 'string' },\n 'api-key': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'set-current': { type: 'boolean', default: false },\n 'settings-scope': { type: 'string' },\n 'check-update': { type: 'boolean', default: false },\n 'disable-update-check': { type: 'boolean', default: false },\n },\n} as const;\n\nfunction mapParsedValues(\n values: ReturnType<typeof parseArgs<typeof PARSE_ARGS_CONFIG>>['values'],\n positionals: string[],\n): IParsedCliArgs {\n return {\n positional: positionals,\n help: values['help'] ?? false,\n printMode: values['p'] ?? false,\n continueMode: values['continue'] ?? false,\n resumeId: values['resume'],\n model: values['model'],\n language: values['language'],\n permissionMode: parsePermissionMode(values['permission-mode']),\n maxTurns: parseMaxTurns(values['max-turns']),\n forkSession: values['fork-session'] ?? false,\n sessionName: values['name'],\n outputFormat: parseOutputFormat(values['output-format']),\n format: values['format'],\n summary: values['summary'],\n source: values['source'],\n systemPrompt: values['system-prompt'],\n appendSystemPrompt: values['append-system-prompt'],\n taskFile: values['task-file'],\n version: values['version'] ?? false,\n reset: values['reset'] ?? false,\n bare: values['bare'] ?? false,\n allowedTools: values['allowed-tools'],\n noSessionPersistence: values['no-session-persistence'] ?? false,\n jsonSchema: values['json-schema'],\n configure: values['configure'] ?? false,\n configureProvider: values['configure-provider'],\n provider: values['provider'],\n providerType: values['type'],\n baseURL: values['base-url'],\n apiKey: values['api-key'],\n apiKeyEnv: values['api-key-env'],\n setCurrent: values['set-current'] ?? false,\n settingsScope: values['settings-scope'],\n checkUpdate: values['check-update'] ?? false,\n disableUpdateCheck: values['disable-update-check'] ?? false,\n };\n}\n\n/** Parse and validate CLI arguments. */\nexport function parseCliArgs(): IParsedCliArgs {\n const { values, positionals } = parseArgs(PARSE_ARGS_CONFIG);\n return mapParsedValues(values, positionals);\n}\n","import { resetUserConfig } from '@robota-sdk/agent-framework';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nexport function runResetConfig(terminal: ITerminalOutput): void {\n const result = resetUserConfig();\n if (result.deleted) {\n terminal.writeLine(`Deleted ${result.path}`);\n } else {\n terminal.writeLine('No user settings found.');\n }\n}\n","import type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport { checkForCliUpdate, formatCliUpdateCheckMessage } from '@robota-sdk/agent-framework';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { printHelp } from '../utils/cli-args.js';\nimport { runResetConfig } from './reset-config.js';\n\nexport type TPreflightResult = { handled: true } | { handled: false };\n\nexport interface IPreflightContext {\n version: string;\n terminal: ITerminalOutput;\n}\n\nexport async function handlePreflightCommands(\n args: IParsedCliArgs,\n ctx: IPreflightContext,\n): Promise<TPreflightResult> {\n if (args.help) {\n ctx.terminal.write(printHelp());\n return { handled: true };\n }\n if (args.version) {\n ctx.terminal.writeLine(`robota ${ctx.version}`);\n return { handled: true };\n }\n if (args.checkUpdate) {\n const result = await checkForCliUpdate({ currentVersion: ctx.version, force: true });\n const message = formatCliUpdateCheckMessage(result);\n if (result.status === 'error') {\n throw new Error(message);\n }\n ctx.terminal.writeLine(message);\n return { handled: true };\n }\n if (args.reset) {\n runResetConfig(ctx.terminal);\n return { handled: true };\n }\n return { handled: false };\n}\n","import type { IProviderConfig } from '@robota-sdk/agent-core';\nimport type { TSubagentRunnerFactory } from '@robota-sdk/agent-framework';\nimport { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\n\nexport interface ISubagentSetupConfig {\n providerConfig: IProviderConfig;\n logsDir: string;\n}\n\nexport interface ISubagentSetup {\n subagentRunnerFactory: TSubagentRunnerFactory;\n}\n\nexport function createSubagentSetup(config: ISubagentSetupConfig): ISubagentSetup {\n return {\n subagentRunnerFactory: createChildProcessSubagentRunnerFactory({\n providerConfig: config.providerConfig,\n logsDir: config.logsDir,\n }),\n };\n}\n","import type { IAIProvider, IProviderConfig } from '@robota-sdk/agent-core';\nimport type { TSubagentRunnerFactory } from '@robota-sdk/agent-framework';\nimport {\n projectPaths,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n} from '@robota-sdk/agent-framework';\nimport type { IConfigPhaseOptions } from './args-to-options.js';\nimport type { ICommandSetup } from './command-setup.js';\nimport { createSubagentSetup } from './subagent-setup.js';\n\nexport interface IProviderSetup {\n provider: IAIProvider;\n providerSettings: IProviderConfig;\n modelId: string;\n activeProfileName: string | undefined;\n subagentRunnerFactory: TSubagentRunnerFactory;\n}\n\nexport function createProviderSetup(\n cwd: string,\n opts: IConfigPhaseOptions,\n commandSetup: ICommandSetup,\n): IProviderSetup {\n const providerOptions = opts.provider\n ? { providerOverride: opts.provider, providerDefinitions: commandSetup.providerDefinitions }\n : { providerDefinitions: commandSetup.providerDefinitions };\n\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = opts.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, opts.model, providerOptions);\n const activeProfileName = opts.provider ?? readMergedProviderSettings(cwd).currentProvider;\n\n const { subagentRunnerFactory } = createSubagentSetup({\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: projectPaths(cwd).logs,\n });\n\n return { provider, providerSettings, modelId, activeProfileName, subagentRunnerFactory };\n}\n","import type { IInteractiveSessionStore } from '@robota-sdk/agent-framework';\nimport {\n createProjectSessionStore,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n} from '@robota-sdk/agent-framework';\nimport type { ISessionRunOptions } from './args-to-options.js';\n\nexport interface ISessionSetup {\n sessionStore: IInteractiveSessionStore | undefined;\n resumeSessionId: string | undefined;\n showSessionPickerOnStart: boolean;\n}\n\nexport function createSessionSetup(cwd: string, opts: ISessionRunOptions): ISessionSetup {\n const sessionStore = opts.noSessionPersistence ? undefined : createProjectSessionStore(cwd);\n\n let resumeSessionId: string | undefined;\n let showSessionPickerOnStart = false;\n\n if (opts.continueMode) {\n resumeSessionId = resolveLatestSessionId(sessionStore, cwd);\n } else if (opts.resumeId !== undefined) {\n if (opts.resumeId === '') {\n showSessionPickerOnStart = true;\n } else {\n resumeSessionId = resolveSessionIdByIdOrName(sessionStore, opts.resumeId);\n if (resumeSessionId === undefined) {\n throw new Error(`Session not found: ${opts.resumeId}`);\n }\n }\n }\n\n return { sessionStore, resumeSessionId, showSessionPickerOnStart };\n}\n","import {\n shouldRunStartupCliUpdateCheck,\n getStartupCliUpdateNotice,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport type { IStartupUpdatePolicyOptions } from './args-to-options.js';\n\nexport function resolveStartupUpdateNotice(\n version: string,\n policy: IStartupUpdatePolicyOptions,\n): Promise<string | undefined> | undefined {\n if (!shouldRunStartupCliUpdateCheck(policy)) return undefined;\n return getStartupCliUpdateNotice({ currentVersion: version }).then((n) =>\n n ? formatCliUpdateNotice(n) : undefined,\n );\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\n","import { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IUserLocalCommandOptions } from './startup/args-to-options.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n opts: IUserLocalCommandOptions,\n cwd: string,\n terminal: ITerminalOutput,\n): Promise<boolean> {\n if (opts.positional[0] !== 'user-local') {\n return false;\n }\n\n const result = await executeUserLocalDirectCommand({\n cwd,\n argv: opts.positional.slice(1),\n format: opts.format,\n summary: opts.summary,\n source: opts.source,\n });\n const output = result.message.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","import { createAgentRuntime } from '@robota-sdk/agent-framework';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { PrintTerminal } from '@robota-sdk/agent-transport/headless';\n\nimport { runPrintMode } from './modes/print-mode.js';\nimport { runTuiMode } from './modes/tui-mode.js';\nimport {\n toConfigPhaseOptions,\n toSessionRunOptions,\n toUserLocalCommandOptions,\n toStartupUpdatePolicyOptions,\n} from './startup/args-to-options.js';\nimport { createCommandSetup } from './startup/command-setup.js';\nimport { handleConfigPhase } from './startup/config-phase.js';\nimport { handlePreflightCommands } from './startup/preflight.js';\nimport { createProviderSetup } from './startup/provider-setup.js';\nimport { createSessionSetup } from './startup/session-setup.js';\nimport { resolveStartupUpdateNotice } from './startup/update-notice.js';\nimport { readVersion } from './startup/version.js';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { parseCliArgs } from './utils/cli-args.js';\n\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport type { IStartCliOptions };\n\nfunction parseArgsOrExit(): IParsedCliArgs {\n try {\n return parseCliArgs();\n } catch (error) {\n // allow-fallback: argument validation errors are terminal — exit is the correct response\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n}\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n const args = parseArgsOrExit();\n const version = readVersion();\n const terminal = new PrintTerminal();\n\n // Layer 0: pre-flight — single point for all early-exit commands\n if ((await handlePreflightCommands(args, { version, terminal })).handled) return;\n\n const cwd = process.cwd();\n\n // Layer 1: IParsedCliArgs → typed option objects (boundary)\n const configPhaseOpts = toConfigPhaseOptions(args);\n const sessionOpts = toSessionRunOptions(args);\n\n try {\n if (await runUserLocalDirectCommandIfRequested(toUserLocalCommandOptions(args), cwd, terminal))\n return;\n } catch (error) {\n // allow-fallback: user-local command failure is terminal — exit is the correct response\n terminal.writeError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n // Layer 2: sub-layer assembly (same-level grouping)\n const isTTY = process.stdin.isTTY === true && process.stdout.isTTY === true;\n const commandSetup = createCommandSetup(cwd, options);\n const configPhase = await handleConfigPhase(cwd, configPhaseOpts, commandSetup, terminal, isTTY);\n if (configPhase.handled) return;\n\n const providerSetup = createProviderSetup(cwd, configPhaseOpts, commandSetup);\n const sessionSetup = createSessionSetup(cwd, sessionOpts);\n\n // Layer 3: runtime assembly\n const runtime = createAgentRuntime({\n cwd,\n provider: providerSetup.provider,\n commandModules: commandSetup.commandModules,\n commandHostAdapters: commandSetup.commandHostAdapters,\n reloadPluginCommandSource: commandSetup.reloadPluginCommandSource,\n subagentRunnerFactory: providerSetup.subagentRunnerFactory,\n sessionStore: sessionSetup.sessionStore,\n transportRegistry: createDefaultTransportRegistry(),\n });\n\n // Layer 4: mode / transport\n if (configPhaseOpts.printMode) {\n await runPrintMode(sessionOpts, runtime);\n return;\n }\n\n await runTuiMode({\n runtime,\n version,\n commandSetup,\n providerSetup,\n sessionSetup,\n sessionOpts,\n startupUpdateNotice: resolveStartupUpdateNotice(version, toStartupUpdatePolicyOptions(args)),\n });\n process.exit(0);\n}\n","#!/usr/bin/env node\n/**\n * Robota CLI binary entry point.\n *\n * Boots the CLI and handles any uncaught top-level errors gracefully.\n *\n * NOTE: Node.js version check and Terminal.app warning are injected as a\n * build-time banner in tsup.config.ts, ensuring they execute before any\n * ESM module is loaded (static imports are hoisted by the JS engine).\n */\nimport { startCli } from './cli.js';\n\n// Last-resort crash prevention for IME-related errors only.\n// Korean IME in raw mode can cause errors that escape React/Ink.\n// Non-IME errors are re-thrown to preserve normal crash behavior.\nprocess.on('uncaughtException', (err) => {\n const msg = err.message ?? '';\n const isLikelyIME =\n msg.includes('string-width') ||\n msg.includes('setCursorPosition') ||\n msg.includes('getStringWidth') ||\n msg.includes('slice') ||\n msg.includes('charCodeAt');\n if (isLikelyIME) {\n process.stderr.write(`[robota] IME error suppressed: ${msg}\\n`);\n return;\n }\n // Re-throw non-IME errors — let them crash normally\n throw err;\n});\n\nstartCli().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(message + '\\n');\n process.exit(1);\n});\n"],"mappings":"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"}