@robota-sdk/agent-cli 3.0.0-beta.70 → 3.0.0-beta.72

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,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  ;(function(){var v=parseInt(process.versions.node.split('.')[0],10);if(v<22){process.stderr.write('\n✗ Node.js 22+ is required (current: '+process.version+')\n\nUpgrade:\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22\n Download: https://nodejs.org/en/download\n\n');process.exit(1);}})();
3
- import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{applyProviderConfiguration as i,applyProviderSwitch as a,checkForCliUpdate as o,createProjectSessionStore as s,createProviderFromSettings as c,formatCliUpdateCheckMessage as l,formatCliUpdateNotice as u,getStartupCliUpdateNotice as d,getUserSettingsPath as f,projectPaths as p,readMergedProviderSettings as m,readPackageVersion as h,readProviderSettings as g,readSettings as _,resetUserConfig as v,resolveLatestSessionId as y,resolveProviderSettingsWriteTargetPath as b,resolveSessionIdByIdOrName as x,resolveSettingsPathForScope as S,shouldRunStartupCliUpdateCheck as C,writeSettings as w}from"@robota-sdk/agent-framework";import{parseArgs as T}from"node:util";import{formatSupportedProviderTypes as E}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as D}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as ee,reloadPluginCommandSource as j,runProviderStartupSetup as M}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as N,renderApp as P}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as F}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as I}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as L,getDefaultSubagentWorkerPath as R}from"@robota-sdk/agent-subagent-runner";import{readFileSync as z}from"node:fs";import{resolve as B}from"node:path";const V=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],H=[`text`,`json`,`stream-json`];function U(){return`
3
+ import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{applyProviderConfiguration as i,applyProviderSwitch as a,checkForCliUpdate as o,createProjectSessionStore as s,createProviderFromSettings as c,formatCliUpdateCheckMessage as l,formatCliUpdateNotice as u,getStartupCliUpdateNotice as d,getUserSettingsPath as f,projectPaths as p,readMergedProviderSettings as m,readPackageVersion as h,readProviderSettings as g,readSettings as _,resetUserConfig as v,resolveLatestSessionId as ee,resolveProviderSettingsWriteTargetPath as y,resolveSessionIdByIdOrName as b,resolveSettingsPathForScope as x,shouldRunStartupCliUpdateCheck as S,userPaths as C,writeSettings as w}from"@robota-sdk/agent-framework";import{parseArgs as T}from"node:util";import{formatSupportedProviderTypes as E}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as D}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as te,reloadPluginCommandSource as j,runProviderStartupSetup as ne}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as re,renderApp as ie}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as ae}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as oe}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as se,getDefaultSubagentWorkerPath as M}from"@robota-sdk/agent-subagent-runner";import{readFileSync as N,readdirSync as P}from"node:fs";import{join as F,resolve as I}from"node:path";const L=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],R=[`text`,`json`,`stream-json`];function z(){return`
4
4
  Usage: robota [options] [-p <prompt>]
5
5
 
6
6
  Options:
@@ -37,15 +37,22 @@ Examples:
37
37
  robota --task-file task.md Run task from file (appended to system prompt)
38
38
  robota --dry-run "Refactor the auth module" Show plan without modifying files
39
39
  robota --continue Resume the last session
40
- `}function W(e){if(e!==void 0){if(!H.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${H.join(` | `)}`);return e}}function G(e){if(e!==void 0){if(!V.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${V.join(` | `)}`);return e}}function K(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 te={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`},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`},"denied-tools":{type:`string`},model:{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},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function q(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:G(e[`permission-mode`]),maxTurns:K(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:W(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`],deniedTools:e[`denied-tools`],model:e.model,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,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function J(){let{values:e,positionals:t}=T(te);return q(e,t)}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(e,t,n,r=D()){let o=S(e,Y(t.settingsScope));return t.configureProvider?(i(o,ne(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(a(t.settingsScope===void 0?b(e):o,t.provider,{knownProviders:m(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function Z(e,t,n,r,i=D(),a){await A(e,{provider:t.provider,settingsScope:Y(t.settingsScope)},n,r,i,{formatError:re,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function Q(e,t,n,r,i=D()){await M(e,{settingsScope:Y(t.settingsScope)},n,r,i)}function ne(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 re(e=D()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${E(e)}`,...e.map(ie)].join(`
41
- `)}function ie(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 ae(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await ee({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}const oe=()=>h(import.meta.url);function $(e){let t=v();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function se(e,t,n,r){let i={settings:{read:()=>_(f()),write:e=>w(f(),e)},plugin:k(e)},a=n.providerDefinitions??D();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...O({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>m(e),readTargetSettings:()=>_(b(e)),writeTargetSettings:t=>w(b(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:C(t)?d({currentVersion:r}):void 0}}function ce(e,t){let n=z(B(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function le(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(ce(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(`
40
+ `}function B(e){if(e!==void 0){if(!R.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${R.join(` | `)}`);return e}}function V(e){if(e!==void 0){if(!L.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${L.join(` | `)}`);return e}}function H(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 U={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`},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`},"denied-tools":{type:`string`},model:{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},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function W(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:V(e[`permission-mode`]),maxTurns:H(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:B(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`],deniedTools:e[`denied-tools`],model:e.model,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,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function G(){let{values:e,positionals:t}=T(U);return W(e,t)}function K(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function ce(e,t,n,r=D()){let o=x(e,K(t.settingsScope));return t.configureProvider?(i(o,de(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(a(t.settingsScope===void 0?y(e):o,t.provider,{knownProviders:m(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function le(e,t,n,r,i=D(),a){await A(e,{provider:t.provider,settingsScope:K(t.settingsScope)},n,r,i,{formatError:fe,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function ue(e,t,n,r,i=D()){await ne(e,{settingsScope:K(t.settingsScope)},n,r,i)}function de(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 fe(e=D()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${E(e)}`,...e.map(pe)].join(`
41
+ `)}function pe(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 me(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await te({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 q(e){let t=N(e,`utf-8`);return JSON.parse(t)}function he(e,t){return new Date(t).getTime()-new Date(e).getTime()}function ge(e){let t=[],n=0,r=0;for(;r<e.length;){let i=e[r];if(!i){r++;continue}if(i.category===`chat`&&i.type===`user`){n++;let a=i.timestamp,o=!1,s=null,c=r+1;for(;c<e.length;){let r=e[c];if(!r){c++;continue}if(r.category===`chat`&&r.type===`user`)break;if(r.category===`event`&&r.type===`tool-start`){o?s!==null&&t.push(J(`llm_between_tools`,`tool-end`,`tool-start`,s,r.timestamp,n)):(t.push(J(`user_to_first_tool`,`user`,`tool-start`,a,r.timestamp,n)),o=!0),s=null,c++;continue}if(r.category===`event`&&r.type===`tool-end`){let i=e[c-1];i&&i.category===`event`&&i.type===`tool-start`&&t.push(J(`tool_exec`,`tool-start`,`tool-end`,i.timestamp,r.timestamp,n)),s=r.timestamp,c++;continue}if(r.category===`event`&&r.type===`tool-summary`){s!==null&&t.push(J(`llm_final_response`,`tool-end`,`tool-summary`,s,r.timestamp,n)),c++;continue}if(r.category===`chat`&&r.type===`assistant`){o?s!==null&&t.push(J(`llm_final_response`,`tool-end`,`assistant`,s,r.timestamp,n)):t.push(J(`user_to_assistant`,`user`,`assistant`,a,r.timestamp,n)),c++;break}c++}r=c}else r++}return t}function J(e,t,n,r,i,a){return{kind:e,fromType:t,toType:n,fromTimestamp:r,toTimestamp:i,durationMs:he(r,i),turnIndex:a}}function _e(e){let t=e.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`),n=e.filter(e=>e.kind===`tool_exec`),r=e.filter(e=>e.kind===`user_to_assistant`),i=e=>e.length?Math.round(e.reduce((e,t)=>e+t.durationMs,0)/e.length):0,a=e=>e.length?Math.max(...e.map(e=>e.durationMs)):0;return{llmWaitMs:{avg:i(t),max:a(t),total:t.reduce((e,t)=>e+t.durationMs,0),count:t.length},toolExecMs:{avg:i(n),max:a(n),median:(e=>{if(!e.length)return 0;let t=[...e].sort((e,t)=>e.durationMs-t.durationMs),n=Math.floor(t.length/2);return t.length%2==0?Math.round(((t[n-1]?.durationMs??0)+(t[n]?.durationMs??0))/2):t[n]?.durationMs??0})(n),count:n.length},userToAssistantMs:{avg:i(r),max:a(r),count:r.length}}}function Y(e){let t=ge(e.history??[]),n=t.filter(e=>e.durationMs>=1e4);return{sessionId:e.id,cwd:e.cwd,createdAt:e.createdAt,totalIntervals:t.length,intervals:t,slowIntervals:n,stats:_e(t)}}function X(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}function Z(e){return new Date(e).toLocaleString(`sv-SE`,{timeZoneName:`short`}).slice(0,16)}function ve(e){return{user_to_first_tool:`user → tool-start`,user_to_assistant:`user → assistant`,tool_exec:`tool-start → tool-end`,llm_between_tools:`tool-end → tool-start`,llm_final_response:`tool-end → assistant/summary`}[e.kind]??e.kind}function ye(e){let{stats:t}=e,n=t.llmWaitMs.total+t.toolExecMs.avg*t.toolExecMs.count;if(n===0)return`Verdict: No timing data available.`;let r=Math.round(t.llmWaitMs.total/n*100);return`Verdict: LLM API wait ${r}% | Code processing ${100-r}%`}function Q(e){let t=[],{stats:n}=e;if(t.push(`Session: ${e.sessionId}`),t.push(`Created: ${Z(e.createdAt)} | cwd: ${e.cwd}`),t.push(``),t.push(`Timing Summary:`),n.llmWaitMs.count>0&&t.push(` LLM API wait ${X(n.llmWaitMs.avg).padStart(8)} avg | ${X(n.llmWaitMs.max).padStart(8)} max`),n.toolExecMs.count>0&&t.push(` Tool execution ${X(n.toolExecMs.avg).padStart(8)} avg | ${X(n.toolExecMs.median).padStart(8)} median`),n.userToAssistantMs.count>0&&t.push(` user → assistant ${X(n.userToAssistantMs.avg).padStart(8)} avg`),n.llmWaitMs.count===0&&n.toolExecMs.count===0&&t.push(` (no intervals computed — session may have no history)`),e.slowIntervals.length>0){t.push(``),t.push(`Slow intervals (>10s):`);for(let n of e.slowIntervals)t.push(` turn ${n.turnIndex} ${ve(n).padEnd(32)} ${X(n.durationMs).padStart(8)}`)}return t.push(``),t.push(ye(e)),t.join(`
42
+ `)}function be(e){let t=[];return t.push(`Analyzed ${e.sessionCount} sessions (${Z(e.fromDate)} ~ ${Z(e.toDate)})`),t.push(` Avg LLM response: ${X(e.avgLlmResponseMs)}`),t.push(` Avg tool exec: ${X(e.avgToolExecMs)}`),e.maxSingleDelayMs>0&&t.push(` Max single delay: ${X(e.maxSingleDelayMs)} (${e.maxSingleDelaySession}, turn ${e.maxSingleDelayTurn}, ${e.maxSingleDelayKind})`),t.join(`
43
+ `)}function $(e){let t,n;for(let r=0;r<e.length;r++)if(e[r]===`--last`&&e[r+1]){let n=parseInt(e[r+1],10);!isNaN(n)&&n>0&&(t=n),r++}else e[r]===`--session`&&e[r+1]&&(n=e[r+1],r++);return{last:t,sessionId:n}}function xe(e){try{return P(e).filter(e=>e.endsWith(`.json`)).map(t=>F(e,t)).sort()}catch{return[]}}function Se(e){let t=e.flatMap(e=>e.intervals.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`)),n=e.flatMap(e=>e.intervals.filter(e=>e.kind===`tool_exec`)),r=t.length?Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length):0,i=n.length?Math.round(n.reduce((e,t)=>e+t.durationMs,0)/n.length):0,a=0,o=``,s=0,c=``;for(let t of e)for(let e of t.intervals)e.durationMs>a&&(a=e.durationMs,o=t.sessionId,s=e.turnIndex,c=e.kind);let l=e.map(e=>e.createdAt).sort();return{sessionCount:e.length,fromDate:l[0]??``,toDate:l[l.length-1]??``,avgLlmResponseMs:r,avgToolExecMs:i,maxSingleDelayMs:a,maxSingleDelaySession:o,maxSingleDelayTurn:s,maxSingleDelayKind:c}}async function Ce(e){let t=$(e),n=C().sessions,r=xe(n);if(r.length===0&&(process.stderr.write(`No session files found in ${n}\n`),process.exit(1)),t.sessionId!==void 0){let e=r.find(e=>e.includes(t.sessionId));e||(process.stderr.write(`Session not found: ${t.sessionId}\n`),process.exit(1));let n=Y(q(e));process.stdout.write(Q(n)+`
44
+ `);return}if(t.last!==void 0){let e=r.slice(-t.last),n=[];for(let t of e)try{n.push(Y(q(t)))}catch{}n.length===0&&(process.stderr.write(`No valid sessions found.
45
+ `),process.exit(1));let i=Se(n);process.stdout.write(be(i)+`
46
+ `);return}let i=r[r.length-1];i||(process.stderr.write(`No sessions found.
47
+ `),process.exit(1));let a=Y(q(i));process.stdout.write(Q(a)+`
48
+ `)}const we=()=>h(import.meta.url);function Te(e){let t=v();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function Ee(e,t,n,r){let i={settings:{read:()=>_(f()),write:e=>w(f(),e)},plugin:k(e)},a=n.providerDefinitions??D();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...O({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>m(e),readTargetSettings:()=>_(y(e)),writeTargetSettings:t=>w(y(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:S(t)?d({currentVersion:r}):void 0}}function De(e,t){let n=N(I(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function Oe(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(De(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
49
 
43
- `):void 0}async function ue(e,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=le(e,n),d=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,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,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function de(t={}){let i;try{i=J()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=oe();if(i.help){process.stdout.write(U());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await o({currentVersion:a,force:!0}),t=l(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new n;if(i.reset){$(f);return}try{if(await ae(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:m,providerDefinitions:h,commandModules:_,startupUpdateNoticePromise:v}=se(d,i,t,a);if(i.configure){await Q(d,i,r,f,h);return}if(X(d,i,f,h))return;try{await Z(d,i,r,f,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let b=i.provider?{providerOverride:i.provider,providerDefinitions:h}:{providerDefinitions:h},S=g(d,b),C=i.model??S.model,w=c(d,i.model,b),T=I(),E=p(d),D=L({workerPath:R(),providerConfig:{...S,model:C},logsDir:E.logs}),O=s(d),k,A=!1;if(i.continueMode?k=y(O,d):i.resumeId!==void 0&&(i.resumeId===``?A=!0:(k=x(O,i.resumeId),k===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await ue(d,i,w,O,T,D,_,m);return}await P({cwd:d,provider:w,providerOverride:i.provider,providerType:S.name,modelId:C,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:O,resumeSessionId:k,showSessionPickerOnStart:A,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:T,subagentRunnerFactory:D,commandModules:_,commandHostAdapters:m,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:v?v.then(e=>e?u(e):void 0):void 0,transportRegistry:F(),cliAdapter:N({providerDefinitions:h,reloadPluginCommandSource:j}),reloadPluginCommandSource:j,agentName:`robota-cli`}),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(`
50
+ `):void 0}async function ke(e,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.
51
+ `),process.exit(1));let u=Oe(e,n),d=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,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,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function Ae(t={}){let i;try{i=G()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=we();if(i.help){process.stdout.write(z());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await o({currentVersion:a,force:!0}),t=l(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new n;if(i.reset){Te(f);return}if(i.positional[0]===`session`&&i.positional[1]===`analyze`){await Ce(process.argv.slice(4));return}try{if(await me(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:m,providerDefinitions:h,commandModules:_,startupUpdateNoticePromise:v}=Ee(d,i,t,a);if(i.configure){await ue(d,i,r,f,h);return}if(ce(d,i,f,h))return;try{await le(d,i,r,f,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let y=i.provider?{providerOverride:i.provider,providerDefinitions:h}:{providerDefinitions:h},x=g(d,y),S=i.model??x.model,C=c(d,i.model,y),w=oe(),T=p(d),E=se({workerPath:M(),providerConfig:{...x,model:S},logsDir:T.logs}),D=s(d),O,k=!1;if(i.continueMode?O=ee(D,d):i.resumeId!==void 0&&(i.resumeId===``?k=!0:(O=b(D,i.resumeId),O===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await ke(d,i,C,D,w,E,_,m);return}await ie({cwd:d,provider:C,providerOverride:i.provider,providerType:x.name,modelId:S,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:D,resumeSessionId:O,showSessionPickerOnStart:k,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:w,subagentRunnerFactory:E,commandModules:_,commandHostAdapters:m,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:v?v.then(e=>e?u(e):void 0):void 0,transportRegistry:ae(),cliAdapter:re({providerDefinitions:h,reloadPluginCommandSource:j}),reloadPluginCommandSource:j,agentName:`robota-cli`}),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(`
45
52
  [robota] CJK/IME input error — this is a known issue with macOS Terminal.app.
46
53
  Workaround: use iTerm2 (https://iterm2.com) or input your prompt in English.
47
54
  Alternatively, use headless mode: robota -p "your prompt here"
48
55
 
49
- `);return}throw e}),de().catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(t+`
56
+ `);return}throw e}),Ae().catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(t+`
50
57
  `),process.exit(1)});export{};
51
58
  //# sourceMappingURL=bin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","names":[],"sources":["../../src/utils/cli-args.ts","../../src/startup/provider-startup.ts","../../src/user-local-direct-command.ts","../../src/startup/version.ts","../../src/startup/reset-config.ts","../../src/startup/command-setup.ts","../../src/startup/append-system-prompt.ts","../../src/modes/print-mode.ts","../../src/cli.ts","../../src/bin.ts"],"sourcesContent":["/**\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 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 deniedTools: string | undefined;\n model: 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 dryRun: boolean;\n yes: 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 --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 into a new independent session\n --task-file <path> Read a task prompt from file and append it to the system prompt\n --bare Print mode: output raw text only, no formatting wrapper\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run Plan-only run: show what the agent would do without modifying files\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nCommands:\n robota init Initialize AGENTS.md and .robota/settings.json\n\nExamples:\n robota Start interactive TUI session\n robota init Initialize project files\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota -p \"Review this diff\" --bare Raw output for shell pipelines\n robota --task-file task.md Run task from file (appended to system prompt)\n robota --dry-run \"Refactor the auth module\" Show plan without modifying files\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 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 'denied-tools': { type: 'string' },\n model: { 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 'dry-run': { type: 'boolean', default: false },\n yes: { type: 'boolean', short: 'y', 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 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 deniedTools: values['denied-tools'],\n model: values['model'],\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 dryRun: values['dry-run'] ?? false,\n yes: values['yes'] ?? 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 { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from '../utils/cli-args.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 { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\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 args: IParsedCliArgs,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(args.settingsScope));\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\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 terminal.writeLine(`Current provider set to ${args.provider}`);\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 terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n isInteractive?: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: args.provider, settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive:\n isInteractive !== undefined\n ? () => isInteractive\n : () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\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\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\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 { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n terminal: ITerminalOutput,\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.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\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 { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getStartupCliUpdateNotice,\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n shouldRunStartupCliUpdateCheck,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICliUpdateNotice,\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nexport function 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: 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 const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\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(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","import type { IAIProvider } from '@robota-sdk/agent-core';\nimport type { ICommandHostAdapters, ICommandModule } from '@robota-sdk/agent-framework';\nimport type { createProjectSessionStore } from '@robota-sdk/agent-framework';\nimport { HeadlessInteractionChannel } from '@robota-sdk/agent-transport/headless';\nimport type { IBackgroundTaskRunner } from '@robota-sdk/agent-executor';\nimport type { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\n\nexport async 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 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 const channel = new HeadlessInteractionChannel({\n cwd,\n provider,\n outputFormat: args.outputFormat ?? 'text',\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 ...(args.systemPrompt ? { systemPrompt: args.systemPrompt } : {}),\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n });\n\n await channel.run(prompt);\n process.exit(channel.getExitCode());\n}\n","/**\n * CLI entry point — pure composition root.\n * Parses arguments and delegates to startup modules, mode runners, and transports.\n */\n\nimport { execSync } from 'node:child_process';\nimport { PrintTerminal, promptInput } from '@robota-sdk/agent-transport/headless';\nimport {\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './startup/provider-startup.js';\nimport { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { createDefaultBackgroundTaskRunners } from '@robota-sdk/agent-executor';\nimport {\n createChildProcessSubagentRunnerFactory,\n getDefaultSubagentWorkerPath,\n} from '@robota-sdk/agent-subagent-runner';\nimport { reloadPluginCommandSource } from '@robota-sdk/agent-command';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { readVersion } from './startup/version.js';\nimport { runResetConfig } from './startup/reset-config.js';\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport { buildCommandSetup } from './startup/command-setup.js';\nimport { runPrintMode } from './modes/print-mode.js';\n\nexport type { IStartCliOptions };\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n let args: IParsedCliArgs;\n try {\n args = 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 const version = readVersion();\n\n if (args.help) {\n process.stdout.write(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 const cwd = process.cwd();\n const terminal = new PrintTerminal();\n\n if (args.reset) {\n runResetConfig(terminal);\n return;\n }\n\n try {\n if (await runUserLocalDirectCommandIfRequested(args, cwd, terminal)) {\n return;\n }\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 const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, terminal, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, terminal, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, terminal, 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 const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n workerPath: getDefaultSubagentWorkerPath(),\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\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 await renderApp({\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: createDefaultTransportRegistry(),\n cliAdapter: createDefaultTuiCliAdapter({ providerDefinitions, reloadPluginCommandSource }),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\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 * A Node.js version check (>=22) is injected as a build-time banner in\n * tsdown.config.ts and runs before any module imports are loaded.\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(\n '\\n[robota] CJK/IME input error — this is a known issue with macOS Terminal.app.\\n' +\n ' Workaround: use iTerm2 (https://iterm2.com) or input your prompt in English.\\n' +\n ' Alternatively, use headless mode: robota -p \"your prompt here\"\\n\\n',\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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"}
1
+ {"version":3,"file":"bin.js","names":[],"sources":["../../src/utils/cli-args.ts","../../src/startup/provider-startup.ts","../../src/user-local-direct-command.ts","../../src/session-analyzer/parser.ts","../../src/session-analyzer/reporter.ts","../../src/session-analyzer/session-analyze-command.ts","../../src/startup/version.ts","../../src/startup/reset-config.ts","../../src/startup/command-setup.ts","../../src/startup/append-system-prompt.ts","../../src/modes/print-mode.ts","../../src/cli.ts","../../src/bin.ts"],"sourcesContent":["/**\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 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 deniedTools: string | undefined;\n model: 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 dryRun: boolean;\n yes: 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 --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 into a new independent session\n --task-file <path> Read a task prompt from file and append it to the system prompt\n --bare Print mode: output raw text only, no formatting wrapper\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run Plan-only run: show what the agent would do without modifying files\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nCommands:\n robota init Initialize AGENTS.md and .robota/settings.json\n\nExamples:\n robota Start interactive TUI session\n robota init Initialize project files\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota -p \"Review this diff\" --bare Raw output for shell pipelines\n robota --task-file task.md Run task from file (appended to system prompt)\n robota --dry-run \"Refactor the auth module\" Show plan without modifying files\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 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 'denied-tools': { type: 'string' },\n model: { 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 'dry-run': { type: 'boolean', default: false },\n yes: { type: 'boolean', short: 'y', 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 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 deniedTools: values['denied-tools'],\n model: values['model'],\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 dryRun: values['dry-run'] ?? false,\n yes: values['yes'] ?? 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 { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from '../utils/cli-args.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 { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\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 args: IParsedCliArgs,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(args.settingsScope));\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\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 terminal.writeLine(`Current provider set to ${args.provider}`);\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 terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n isInteractive?: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: args.provider, settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive:\n isInteractive !== undefined\n ? () => isInteractive\n : () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\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\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\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 { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n terminal: ITerminalOutput,\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.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","/**\n * Session log parser and timing interval calculator.\n */\n\nimport { readFileSync } from 'node:fs';\n\nimport type {\n ISessionHistoryEntry,\n ISessionRecord,\n ISessionTimingReport,\n ITimingInterval,\n ITimingStats,\n TIntervalKind,\n} from './types.js';\n\nexport function parseSessionFile(filePath: string): ISessionRecord {\n const raw = readFileSync(filePath, 'utf-8');\n return JSON.parse(raw) as ISessionRecord;\n}\n\n/** Calculate gap in milliseconds between two ISO 8601 timestamps. */\nexport function gapMs(from: string, to: string): number {\n return new Date(to).getTime() - new Date(from).getTime();\n}\n\n/**\n * Compute timing intervals from a history entry array.\n *\n * Strategy: scan the timeline turn by turn.\n * A \"turn\" starts with a user message. After user, we expect:\n * - zero or more: tool-start → tool-end cycles\n * - optionally: tool-summary\n * - finally: assistant message\n */\nexport function computeTimingIntervals(history: ISessionHistoryEntry[]): ITimingInterval[] {\n const intervals: ITimingInterval[] = [];\n let turnIndex = 0;\n\n let i = 0;\n while (i < history.length) {\n const entry = history[i];\n if (!entry) {\n i++;\n continue;\n }\n\n if (entry.category === 'chat' && entry.type === 'user') {\n turnIndex++;\n const userTs = entry.timestamp;\n let foundFirstTool = false;\n let lastToolEndTs: string | null = null;\n let j = i + 1;\n\n while (j < history.length) {\n const next = history[j];\n if (!next) {\n j++;\n continue;\n }\n\n if (next.category === 'chat' && next.type === 'user') {\n break;\n }\n\n if (next.category === 'event' && next.type === 'tool-start') {\n if (!foundFirstTool) {\n intervals.push(\n makeInterval(\n 'user_to_first_tool',\n 'user',\n 'tool-start',\n userTs,\n next.timestamp,\n turnIndex,\n ),\n );\n foundFirstTool = true;\n } else if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_between_tools',\n 'tool-end',\n 'tool-start',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n lastToolEndTs = null;\n j++;\n continue;\n }\n\n if (next.category === 'event' && next.type === 'tool-end') {\n const prev = history[j - 1];\n if (prev && prev.category === 'event' && prev.type === 'tool-start') {\n intervals.push(\n makeInterval(\n 'tool_exec',\n 'tool-start',\n 'tool-end',\n prev.timestamp,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n lastToolEndTs = next.timestamp;\n j++;\n continue;\n }\n\n if (next.category === 'event' && next.type === 'tool-summary') {\n if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_final_response',\n 'tool-end',\n 'tool-summary',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n j++;\n continue;\n }\n\n if (next.category === 'chat' && next.type === 'assistant') {\n if (!foundFirstTool) {\n intervals.push(\n makeInterval(\n 'user_to_assistant',\n 'user',\n 'assistant',\n userTs,\n next.timestamp,\n turnIndex,\n ),\n );\n } else if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_final_response',\n 'tool-end',\n 'assistant',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n j++;\n break;\n }\n\n j++;\n }\n\n i = j;\n } else {\n i++;\n }\n }\n\n return intervals;\n}\n\nfunction makeInterval(\n kind: TIntervalKind,\n fromType: string,\n toType: string,\n fromTimestamp: string,\n toTimestamp: string,\n turnIndex: number,\n): ITimingInterval {\n return {\n kind,\n fromType,\n toType,\n fromTimestamp,\n toTimestamp,\n durationMs: gapMs(fromTimestamp, toTimestamp),\n turnIndex,\n };\n}\n\nconst SLOW_THRESHOLD_MS = 10_000;\n\nfunction computeStats(intervals: ITimingInterval[]): ITimingStats {\n const llm = intervals.filter(\n (iv) =>\n iv.kind === 'user_to_first_tool' ||\n iv.kind === 'user_to_assistant' ||\n iv.kind === 'llm_between_tools' ||\n iv.kind === 'llm_final_response',\n );\n const tool = intervals.filter((iv) => iv.kind === 'tool_exec');\n const direct = intervals.filter((iv) => iv.kind === 'user_to_assistant');\n\n const avg = (arr: ITimingInterval[]) =>\n arr.length ? Math.round(arr.reduce((s, iv) => s + iv.durationMs, 0) / arr.length) : 0;\n const max = (arr: ITimingInterval[]) =>\n arr.length ? Math.max(...arr.map((iv) => iv.durationMs)) : 0;\n const median = (arr: ITimingInterval[]) => {\n if (!arr.length) return 0;\n const sorted = [...arr].sort((a, b) => a.durationMs - b.durationMs);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0\n ? Math.round(((sorted[mid - 1]?.durationMs ?? 0) + (sorted[mid]?.durationMs ?? 0)) / 2)\n : (sorted[mid]?.durationMs ?? 0);\n };\n\n return {\n llmWaitMs: {\n avg: avg(llm),\n max: max(llm),\n total: llm.reduce((s, iv) => s + iv.durationMs, 0),\n count: llm.length,\n },\n toolExecMs: { avg: avg(tool), max: max(tool), median: median(tool), count: tool.length },\n userToAssistantMs: { avg: avg(direct), max: max(direct), count: direct.length },\n };\n}\n\nexport function analyzeSession(record: ISessionRecord): ISessionTimingReport {\n const history = record.history ?? [];\n const intervals = computeTimingIntervals(history);\n const slowIntervals = intervals.filter((iv) => iv.durationMs >= SLOW_THRESHOLD_MS);\n\n return {\n sessionId: record.id,\n cwd: record.cwd,\n createdAt: record.createdAt,\n totalIntervals: intervals.length,\n intervals,\n slowIntervals,\n stats: computeStats(intervals),\n };\n}\n","/**\n * Text report formatter for session timing analysis.\n */\n\nimport type { IAggregateReport, ISessionTimingReport, ITimingInterval } from './types.js';\n\nfunction fmtMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nfunction fmtDate(iso: string): string {\n return new Date(iso).toLocaleString('sv-SE', { timeZoneName: 'short' }).slice(0, 16);\n}\n\nfunction intervalLabel(iv: ITimingInterval): string {\n const map: Record<string, string> = {\n user_to_first_tool: 'user → tool-start',\n user_to_assistant: 'user → assistant',\n tool_exec: 'tool-start → tool-end',\n llm_between_tools: 'tool-end → tool-start',\n llm_final_response: 'tool-end → assistant/summary',\n };\n return map[iv.kind] ?? iv.kind;\n}\n\nfunction verdictLine(report: ISessionTimingReport): string {\n const { stats } = report;\n const totalMs = stats.llmWaitMs.total + stats.toolExecMs.avg * stats.toolExecMs.count;\n if (totalMs === 0) return 'Verdict: No timing data available.';\n const llmPct = Math.round((stats.llmWaitMs.total / totalMs) * 100);\n const toolPct = 100 - llmPct;\n return `Verdict: LLM API wait ${llmPct}% | Code processing ${toolPct}%`;\n}\n\nexport function formatSingleSession(report: ISessionTimingReport): string {\n const lines: string[] = [];\n const { stats } = report;\n\n lines.push(`Session: ${report.sessionId}`);\n lines.push(`Created: ${fmtDate(report.createdAt)} | cwd: ${report.cwd}`);\n lines.push('');\n lines.push('Timing Summary:');\n\n if (stats.llmWaitMs.count > 0) {\n lines.push(\n ` LLM API wait ${fmtMs(stats.llmWaitMs.avg).padStart(8)} avg | ${fmtMs(stats.llmWaitMs.max).padStart(8)} max`,\n );\n }\n if (stats.toolExecMs.count > 0) {\n lines.push(\n ` Tool execution ${fmtMs(stats.toolExecMs.avg).padStart(8)} avg | ${fmtMs(stats.toolExecMs.median).padStart(8)} median`,\n );\n }\n if (stats.userToAssistantMs.count > 0) {\n lines.push(` user → assistant ${fmtMs(stats.userToAssistantMs.avg).padStart(8)} avg`);\n }\n if (stats.llmWaitMs.count === 0 && stats.toolExecMs.count === 0) {\n lines.push(' (no intervals computed — session may have no history)');\n }\n\n if (report.slowIntervals.length > 0) {\n lines.push('');\n lines.push('Slow intervals (>10s):');\n for (const iv of report.slowIntervals) {\n lines.push(\n ` turn ${iv.turnIndex} ${intervalLabel(iv).padEnd(32)} ${fmtMs(iv.durationMs).padStart(8)}`,\n );\n }\n }\n\n lines.push('');\n lines.push(verdictLine(report));\n\n return lines.join('\\n');\n}\n\nexport function formatAggregateReport(aggregate: IAggregateReport): string {\n const lines: string[] = [];\n lines.push(\n `Analyzed ${aggregate.sessionCount} sessions (${fmtDate(aggregate.fromDate)} ~ ${fmtDate(aggregate.toDate)})`,\n );\n lines.push(` Avg LLM response: ${fmtMs(aggregate.avgLlmResponseMs)}`);\n lines.push(` Avg tool exec: ${fmtMs(aggregate.avgToolExecMs)}`);\n if (aggregate.maxSingleDelayMs > 0) {\n lines.push(\n ` Max single delay: ${fmtMs(aggregate.maxSingleDelayMs)} (${aggregate.maxSingleDelaySession}, turn ${aggregate.maxSingleDelayTurn}, ${aggregate.maxSingleDelayKind})`,\n );\n }\n return lines.join('\\n');\n}\n","/**\n * `robota session analyze` command.\n *\n * Usage:\n * robota session analyze — analyze the most recent session\n * robota session analyze --last <n> — aggregate the last N sessions\n * robota session analyze --session <id> — analyze a specific session by ID prefix\n */\n\nimport { readdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { userPaths } from '@robota-sdk/agent-framework';\n\nimport { analyzeSession, parseSessionFile } from './parser.js';\nimport { formatAggregateReport, formatSingleSession } from './reporter.js';\nimport type { IAggregateReport, ISessionTimingReport } from './types.js';\n\ninterface ISessionAnalyzeArgs {\n last: number | undefined;\n sessionId: string | undefined;\n}\n\nfunction parseSessionAnalyzeArgs(argv: string[]): ISessionAnalyzeArgs {\n let last: number | undefined;\n let sessionId: string | undefined;\n\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--last' && argv[i + 1]) {\n const n = parseInt(argv[i + 1]!, 10);\n if (!isNaN(n) && n > 0) last = n;\n i++;\n } else if (argv[i] === '--session' && argv[i + 1]) {\n sessionId = argv[i + 1];\n i++;\n }\n }\n\n return { last, sessionId };\n}\n\nfunction listSessionFiles(sessionsDir: string): string[] {\n try {\n return readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => join(sessionsDir, f))\n .sort();\n } catch {\n // allow-fallback: sessions directory may not exist on first run — empty list is correct response\n return [];\n }\n}\n\nfunction buildAggregateReport(reports: ISessionTimingReport[]): IAggregateReport {\n const llmIntervals = reports.flatMap((r) =>\n r.intervals.filter(\n (iv) =>\n iv.kind === 'user_to_first_tool' ||\n iv.kind === 'user_to_assistant' ||\n iv.kind === 'llm_between_tools' ||\n iv.kind === 'llm_final_response',\n ),\n );\n const toolIntervals = reports.flatMap((r) => r.intervals.filter((iv) => iv.kind === 'tool_exec'));\n\n const avgLlmResponseMs = llmIntervals.length\n ? Math.round(llmIntervals.reduce((s, iv) => s + iv.durationMs, 0) / llmIntervals.length)\n : 0;\n const avgToolExecMs = toolIntervals.length\n ? Math.round(toolIntervals.reduce((s, iv) => s + iv.durationMs, 0) / toolIntervals.length)\n : 0;\n\n let maxSingleDelayMs = 0;\n let maxSingleDelaySession = '';\n let maxSingleDelayTurn = 0;\n let maxSingleDelayKind = '';\n\n for (const r of reports) {\n for (const iv of r.intervals) {\n if (iv.durationMs > maxSingleDelayMs) {\n maxSingleDelayMs = iv.durationMs;\n maxSingleDelaySession = r.sessionId;\n maxSingleDelayTurn = iv.turnIndex;\n maxSingleDelayKind = iv.kind;\n }\n }\n }\n\n const dates = reports.map((r) => r.createdAt).sort();\n\n return {\n sessionCount: reports.length,\n fromDate: dates[0] ?? '',\n toDate: dates[dates.length - 1] ?? '',\n avgLlmResponseMs,\n avgToolExecMs,\n maxSingleDelayMs,\n maxSingleDelaySession,\n maxSingleDelayTurn,\n maxSingleDelayKind,\n };\n}\n\nexport async function runSessionAnalyze(argv: string[]): Promise<void> {\n const args = parseSessionAnalyzeArgs(argv);\n const sessionsDir = userPaths().sessions;\n const allFiles = listSessionFiles(sessionsDir);\n\n if (allFiles.length === 0) {\n process.stderr.write(`No session files found in ${sessionsDir}\\n`);\n process.exit(1);\n }\n\n if (args.sessionId !== undefined) {\n const matched = allFiles.find((f) => f.includes(args.sessionId!));\n if (!matched) {\n process.stderr.write(`Session not found: ${args.sessionId}\\n`);\n process.exit(1);\n }\n const record = parseSessionFile(matched);\n const report = analyzeSession(record);\n process.stdout.write(formatSingleSession(report) + '\\n');\n return;\n }\n\n if (args.last !== undefined) {\n const files = allFiles.slice(-args.last);\n const reports: ISessionTimingReport[] = [];\n for (const f of files) {\n try {\n reports.push(analyzeSession(parseSessionFile(f)));\n } catch {\n // allow-fallback: corrupted or partial session files are skipped — expected on interrupted writes\n // skip unreadable session files\n }\n }\n if (reports.length === 0) {\n process.stderr.write('No valid sessions found.\\n');\n process.exit(1);\n }\n const aggregate = buildAggregateReport(reports);\n process.stdout.write(formatAggregateReport(aggregate) + '\\n');\n return;\n }\n\n // Default: analyze the most recent session\n const latest = allFiles[allFiles.length - 1];\n if (!latest) {\n process.stderr.write('No sessions found.\\n');\n process.exit(1);\n }\n const record = parseSessionFile(latest);\n const report = analyzeSession(record);\n process.stdout.write(formatSingleSession(report) + '\\n');\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\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 { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getStartupCliUpdateNotice,\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n shouldRunStartupCliUpdateCheck,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICliUpdateNotice,\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nexport function 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: 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 const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\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(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","import type { IAIProvider } from '@robota-sdk/agent-core';\nimport type { ICommandHostAdapters, ICommandModule } from '@robota-sdk/agent-framework';\nimport type { createProjectSessionStore } from '@robota-sdk/agent-framework';\nimport { HeadlessInteractionChannel } from '@robota-sdk/agent-transport/headless';\nimport type { IBackgroundTaskRunner } from '@robota-sdk/agent-executor';\nimport type { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\n\nexport async 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 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 const channel = new HeadlessInteractionChannel({\n cwd,\n provider,\n outputFormat: args.outputFormat ?? 'text',\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 ...(args.systemPrompt ? { systemPrompt: args.systemPrompt } : {}),\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n });\n\n await channel.run(prompt);\n process.exit(channel.getExitCode());\n}\n","/**\n * CLI entry point — pure composition root.\n * Parses arguments and delegates to startup modules, mode runners, and transports.\n */\n\nimport { execSync } from 'node:child_process';\nimport { PrintTerminal, promptInput } from '@robota-sdk/agent-transport/headless';\nimport {\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './startup/provider-startup.js';\nimport { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { createDefaultBackgroundTaskRunners } from '@robota-sdk/agent-executor';\nimport {\n createChildProcessSubagentRunnerFactory,\n getDefaultSubagentWorkerPath,\n} from '@robota-sdk/agent-subagent-runner';\nimport { reloadPluginCommandSource } from '@robota-sdk/agent-command';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { runSessionAnalyze } from './session-analyzer/session-analyze-command.js';\nimport { readVersion } from './startup/version.js';\nimport { runResetConfig } from './startup/reset-config.js';\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport { buildCommandSetup } from './startup/command-setup.js';\nimport { runPrintMode } from './modes/print-mode.js';\n\nexport type { IStartCliOptions };\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n let args: IParsedCliArgs;\n try {\n args = 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 const version = readVersion();\n\n if (args.help) {\n process.stdout.write(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 const cwd = process.cwd();\n const terminal = new PrintTerminal();\n\n if (args.reset) {\n runResetConfig(terminal);\n return;\n }\n\n if (args.positional[0] === 'session' && args.positional[1] === 'analyze') {\n await runSessionAnalyze(process.argv.slice(4));\n return;\n }\n\n try {\n if (await runUserLocalDirectCommandIfRequested(args, cwd, terminal)) {\n return;\n }\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 const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, terminal, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, terminal, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, terminal, 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 const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n workerPath: getDefaultSubagentWorkerPath(),\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\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 await renderApp({\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: createDefaultTransportRegistry(),\n cliAdapter: createDefaultTuiCliAdapter({ providerDefinitions, reloadPluginCommandSource }),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\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 * A Node.js version check (>=22) is injected as a build-time banner in\n * tsdown.config.ts and runs before any module imports are loaded.\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(\n '\\n[robota] CJK/IME input error — this is a known issue with macOS Terminal.app.\\n' +\n ' Workaround: use iTerm2 (https://iterm2.com) or input your prompt in English.\\n' +\n ' Alternatively, use headless mode: robota -p \"your prompt here\"\\n\\n',\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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"}
@@ -36,7 +36,14 @@ Examples:
36
36
  robota --dry-run "Refactor the auth module" Show plan without modifying files
37
37
  robota --continue Resume the last session
38
38
  `}function g(e){if(e!==void 0){if(!m.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${m.join(` | `)}`);return e}}function _(e){if(e!==void 0){if(!p.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${p.join(` | `)}`);return e}}function v(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 y={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`},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`},"denied-tools":{type:`string`},model:{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},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function b(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:_(e[`permission-mode`]),maxTurns:v(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:g(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`],deniedTools:e[`denied-tools`],model:e.model,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,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function x(){let{values:e,positionals:t}=(0,r.parseArgs)(y);return b(e,t)}function S(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function C(e,t,r,i=(0,a.createDefaultProviderDefinitions)()){let o=(0,n.resolveSettingsPathForScope)(e,S(t.settingsScope));return t.configureProvider?((0,n.applyProviderConfiguration)(o,E(t),{providerDefinitions:i}),r.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?((0,n.applyProviderSwitch)(t.settingsScope===void 0?(0,n.resolveProviderSettingsWriteTargetPath)(e):o,t.provider,{knownProviders:(0,n.readMergedProviderSettings)(e).providers}),r.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function w(e,t,n,r,i=(0,a.createDefaultProviderDefinitions)(),s){await(0,o.ensureProviderConfig)(e,{provider:t.provider,settingsScope:S(t.settingsScope)},n,r,i,{formatError:D,isInteractive:s===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>s})}async function T(e,t,n,r,i=(0,a.createDefaultProviderDefinitions)()){await(0,o.runProviderStartupSetup)(e,{settingsScope:S(t.settingsScope)},n,r,i)}function E(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 D(e=(0,a.createDefaultProviderDefinitions)()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${(0,i.formatSupportedProviderTypes)(e)}`,...e.map(O)].join(`
39
- `)}function O(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 k(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await(0,o.executeUserLocalDirectCommand)({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}const A=()=>(0,n.readPackageVersion)(require(`url`).pathToFileURL(__filename).href);function j(e){let t=(0,n.resetUserConfig)();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function M(e,t,r,i){let s={settings:{read:()=>(0,n.readSettings)((0,n.getUserSettingsPath)()),write:e=>(0,n.writeSettings)((0,n.getUserSettingsPath)(),e)},plugin:(0,o.createDefaultPluginCommandAdapter)(e)},c=r.providerDefinitions??(0,a.createDefaultProviderDefinitions)();return{commandHostAdapters:s,providerDefinitions:c,commandModules:[...(0,o.createDefaultCommandModules)({cwd:e,providerDefinitions:c,providerSettingsAdapter:{readMergedSettings:()=>(0,n.readMergedProviderSettings)(e),readTargetSettings:()=>(0,n.readSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e)),writeTargetSettings:t=>(0,n.writeSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e),t)}}),...r.commandModules??[]],startupUpdateNoticePromise:(0,n.shouldRunStartupCliUpdateCheck)(t)?(0,n.getStartupCliUpdateNotice)({currentVersion:i}):void 0}}function N(e,t){let n=(0,d.readFileSync)((0,f.resolve)(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function P(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(N(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(`
39
+ `)}function O(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 k(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await(0,o.executeUserLocalDirectCommand)({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 A(e){let t=(0,d.readFileSync)(e,`utf-8`);return JSON.parse(t)}function j(e,t){return new Date(t).getTime()-new Date(e).getTime()}function M(e){let t=[],n=0,r=0;for(;r<e.length;){let i=e[r];if(!i){r++;continue}if(i.category===`chat`&&i.type===`user`){n++;let a=i.timestamp,o=!1,s=null,c=r+1;for(;c<e.length;){let r=e[c];if(!r){c++;continue}if(r.category===`chat`&&r.type===`user`)break;if(r.category===`event`&&r.type===`tool-start`){o?s!==null&&t.push(N(`llm_between_tools`,`tool-end`,`tool-start`,s,r.timestamp,n)):(t.push(N(`user_to_first_tool`,`user`,`tool-start`,a,r.timestamp,n)),o=!0),s=null,c++;continue}if(r.category===`event`&&r.type===`tool-end`){let i=e[c-1];i&&i.category===`event`&&i.type===`tool-start`&&t.push(N(`tool_exec`,`tool-start`,`tool-end`,i.timestamp,r.timestamp,n)),s=r.timestamp,c++;continue}if(r.category===`event`&&r.type===`tool-summary`){s!==null&&t.push(N(`llm_final_response`,`tool-end`,`tool-summary`,s,r.timestamp,n)),c++;continue}if(r.category===`chat`&&r.type===`assistant`){o?s!==null&&t.push(N(`llm_final_response`,`tool-end`,`assistant`,s,r.timestamp,n)):t.push(N(`user_to_assistant`,`user`,`assistant`,a,r.timestamp,n)),c++;break}c++}r=c}else r++}return t}function N(e,t,n,r,i,a){return{kind:e,fromType:t,toType:n,fromTimestamp:r,toTimestamp:i,durationMs:j(r,i),turnIndex:a}}function P(e){let t=e.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`),n=e.filter(e=>e.kind===`tool_exec`),r=e.filter(e=>e.kind===`user_to_assistant`),i=e=>e.length?Math.round(e.reduce((e,t)=>e+t.durationMs,0)/e.length):0,a=e=>e.length?Math.max(...e.map(e=>e.durationMs)):0;return{llmWaitMs:{avg:i(t),max:a(t),total:t.reduce((e,t)=>e+t.durationMs,0),count:t.length},toolExecMs:{avg:i(n),max:a(n),median:(e=>{if(!e.length)return 0;let t=[...e].sort((e,t)=>e.durationMs-t.durationMs),n=Math.floor(t.length/2);return t.length%2==0?Math.round(((t[n-1]?.durationMs??0)+(t[n]?.durationMs??0))/2):t[n]?.durationMs??0})(n),count:n.length},userToAssistantMs:{avg:i(r),max:a(r),count:r.length}}}function F(e){let t=M(e.history??[]),n=t.filter(e=>e.durationMs>=1e4);return{sessionId:e.id,cwd:e.cwd,createdAt:e.createdAt,totalIntervals:t.length,intervals:t,slowIntervals:n,stats:P(t)}}function I(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}function L(e){return new Date(e).toLocaleString(`sv-SE`,{timeZoneName:`short`}).slice(0,16)}function R(e){return{user_to_first_tool:`user → tool-start`,user_to_assistant:`user → assistant`,tool_exec:`tool-start → tool-end`,llm_between_tools:`tool-end → tool-start`,llm_final_response:`tool-end → assistant/summary`}[e.kind]??e.kind}function z(e){let{stats:t}=e,n=t.llmWaitMs.total+t.toolExecMs.avg*t.toolExecMs.count;if(n===0)return`Verdict: No timing data available.`;let r=Math.round(t.llmWaitMs.total/n*100);return`Verdict: LLM API wait ${r}% | Code processing ${100-r}%`}function B(e){let t=[],{stats:n}=e;if(t.push(`Session: ${e.sessionId}`),t.push(`Created: ${L(e.createdAt)} | cwd: ${e.cwd}`),t.push(``),t.push(`Timing Summary:`),n.llmWaitMs.count>0&&t.push(` LLM API wait ${I(n.llmWaitMs.avg).padStart(8)} avg | ${I(n.llmWaitMs.max).padStart(8)} max`),n.toolExecMs.count>0&&t.push(` Tool execution ${I(n.toolExecMs.avg).padStart(8)} avg | ${I(n.toolExecMs.median).padStart(8)} median`),n.userToAssistantMs.count>0&&t.push(` user → assistant ${I(n.userToAssistantMs.avg).padStart(8)} avg`),n.llmWaitMs.count===0&&n.toolExecMs.count===0&&t.push(` (no intervals computed — session may have no history)`),e.slowIntervals.length>0){t.push(``),t.push(`Slow intervals (>10s):`);for(let n of e.slowIntervals)t.push(` turn ${n.turnIndex} ${R(n).padEnd(32)} ${I(n.durationMs).padStart(8)}`)}return t.push(``),t.push(z(e)),t.join(`
40
+ `)}function V(e){let t=[];return t.push(`Analyzed ${e.sessionCount} sessions (${L(e.fromDate)} ~ ${L(e.toDate)})`),t.push(` Avg LLM response: ${I(e.avgLlmResponseMs)}`),t.push(` Avg tool exec: ${I(e.avgToolExecMs)}`),e.maxSingleDelayMs>0&&t.push(` Max single delay: ${I(e.maxSingleDelayMs)} (${e.maxSingleDelaySession}, turn ${e.maxSingleDelayTurn}, ${e.maxSingleDelayKind})`),t.join(`
41
+ `)}function H(e){let t,n;for(let r=0;r<e.length;r++)if(e[r]===`--last`&&e[r+1]){let n=parseInt(e[r+1],10);!isNaN(n)&&n>0&&(t=n),r++}else e[r]===`--session`&&e[r+1]&&(n=e[r+1],r++);return{last:t,sessionId:n}}function U(e){try{return(0,d.readdirSync)(e).filter(e=>e.endsWith(`.json`)).map(t=>(0,f.join)(e,t)).sort()}catch{return[]}}function W(e){let t=e.flatMap(e=>e.intervals.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`)),n=e.flatMap(e=>e.intervals.filter(e=>e.kind===`tool_exec`)),r=t.length?Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length):0,i=n.length?Math.round(n.reduce((e,t)=>e+t.durationMs,0)/n.length):0,a=0,o=``,s=0,c=``;for(let t of e)for(let e of t.intervals)e.durationMs>a&&(a=e.durationMs,o=t.sessionId,s=e.turnIndex,c=e.kind);let l=e.map(e=>e.createdAt).sort();return{sessionCount:e.length,fromDate:l[0]??``,toDate:l[l.length-1]??``,avgLlmResponseMs:r,avgToolExecMs:i,maxSingleDelayMs:a,maxSingleDelaySession:o,maxSingleDelayTurn:s,maxSingleDelayKind:c}}async function G(e){let t=H(e),r=(0,n.userPaths)().sessions,i=U(r);if(i.length===0&&(process.stderr.write(`No session files found in ${r}\n`),process.exit(1)),t.sessionId!==void 0){let e=i.find(e=>e.includes(t.sessionId));e||(process.stderr.write(`Session not found: ${t.sessionId}\n`),process.exit(1));let n=F(A(e));process.stdout.write(B(n)+`
42
+ `);return}if(t.last!==void 0){let e=i.slice(-t.last),n=[];for(let t of e)try{n.push(F(A(t)))}catch{}n.length===0&&(process.stderr.write(`No valid sessions found.
43
+ `),process.exit(1));let r=W(n);process.stdout.write(V(r)+`
44
+ `);return}let a=i[i.length-1];a||(process.stderr.write(`No sessions found.
45
+ `),process.exit(1));let o=F(A(a));process.stdout.write(B(o)+`
46
+ `)}const K=()=>(0,n.readPackageVersion)(require(`url`).pathToFileURL(__filename).href);function q(e){let t=(0,n.resetUserConfig)();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function J(e,t,r,i){let s={settings:{read:()=>(0,n.readSettings)((0,n.getUserSettingsPath)()),write:e=>(0,n.writeSettings)((0,n.getUserSettingsPath)(),e)},plugin:(0,o.createDefaultPluginCommandAdapter)(e)},c=r.providerDefinitions??(0,a.createDefaultProviderDefinitions)();return{commandHostAdapters:s,providerDefinitions:c,commandModules:[...(0,o.createDefaultCommandModules)({cwd:e,providerDefinitions:c,providerSettingsAdapter:{readMergedSettings:()=>(0,n.readMergedProviderSettings)(e),readTargetSettings:()=>(0,n.readSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e)),writeTargetSettings:t=>(0,n.writeSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e),t)}}),...r.commandModules??[]],startupUpdateNoticePromise:(0,n.shouldRunStartupCliUpdateCheck)(t)?(0,n.getStartupCliUpdateNotice)({currentVersion:i}):void 0}}function Y(e,t){let n=(0,d.readFileSync)((0,f.resolve)(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function X(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(Y(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(`
40
47
 
41
- `):void 0}async function F(e,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.
42
- `),process.exit(1));let u=P(e,n),d=new t.HeadlessInteractionChannel({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,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,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function I(r={}){let i;try{i=x()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=A();if(i.help){process.stdout.write(h());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await(0,n.checkForCliUpdate)({currentVersion:a,force:!0}),t=(0,n.formatCliUpdateCheckMessage)(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new t.PrintTerminal;if(i.reset){j(f);return}try{if(await k(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:p,providerDefinitions:m,commandModules:g,startupUpdateNoticePromise:_}=M(d,i,r,a);if(i.configure){await T(d,i,t.promptInput,f,m);return}if(C(d,i,f,m))return;try{await w(d,i,t.promptInput,f,m)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let v=i.provider?{providerOverride:i.provider,providerDefinitions:m}:{providerDefinitions:m},y=(0,n.readProviderSettings)(d,v),b=i.model??y.model,S=(0,n.createProviderFromSettings)(d,i.model,v),E=(0,l.createDefaultBackgroundTaskRunners)(),D=(0,n.projectPaths)(d),O=(0,u.createChildProcessSubagentRunnerFactory)({workerPath:(0,u.getDefaultSubagentWorkerPath)(),providerConfig:{...y,model:b},logsDir:D.logs}),N=(0,n.createProjectSessionStore)(d),P,I=!1;if(i.continueMode?P=(0,n.resolveLatestSessionId)(N,d):i.resumeId!==void 0&&(i.resumeId===``?I=!0:(P=(0,n.resolveSessionIdByIdOrName)(N,i.resumeId),P===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await F(d,i,S,N,E,O,g,p);return}await(0,s.renderApp)({cwd:d,provider:S,providerOverride:i.provider,providerType:y.name,modelId:b,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:N,resumeSessionId:P,showSessionPickerOnStart:I,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:E,subagentRunnerFactory:O,commandModules:g,commandHostAdapters:p,shellExec:t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:_?_.then(e=>e?(0,n.formatCliUpdateNotice)(e):void 0):void 0,transportRegistry:(0,c.createDefaultTransportRegistry)(),cliAdapter:(0,s.createDefaultTuiCliAdapter)({providerDefinitions:m,reloadPluginCommandSource:o.reloadPluginCommandSource}),reloadPluginCommandSource:o.reloadPluginCommandSource,agentName:`robota-cli`}),process.exit(0)}exports.startCli=I;
48
+ `):void 0}async function Z(e,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.
49
+ `),process.exit(1));let u=X(e,n),d=new t.HeadlessInteractionChannel({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,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,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function Q(r={}){let i;try{i=x()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=K();if(i.help){process.stdout.write(h());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await(0,n.checkForCliUpdate)({currentVersion:a,force:!0}),t=(0,n.formatCliUpdateCheckMessage)(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new t.PrintTerminal;if(i.reset){q(f);return}if(i.positional[0]===`session`&&i.positional[1]===`analyze`){await G(process.argv.slice(4));return}try{if(await k(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:p,providerDefinitions:m,commandModules:g,startupUpdateNoticePromise:_}=J(d,i,r,a);if(i.configure){await T(d,i,t.promptInput,f,m);return}if(C(d,i,f,m))return;try{await w(d,i,t.promptInput,f,m)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let v=i.provider?{providerOverride:i.provider,providerDefinitions:m}:{providerDefinitions:m},y=(0,n.readProviderSettings)(d,v),b=i.model??y.model,S=(0,n.createProviderFromSettings)(d,i.model,v),E=(0,l.createDefaultBackgroundTaskRunners)(),D=(0,n.projectPaths)(d),O=(0,u.createChildProcessSubagentRunnerFactory)({workerPath:(0,u.getDefaultSubagentWorkerPath)(),providerConfig:{...y,model:b},logsDir:D.logs}),A=(0,n.createProjectSessionStore)(d),j,M=!1;if(i.continueMode?j=(0,n.resolveLatestSessionId)(A,d):i.resumeId!==void 0&&(i.resumeId===``?M=!0:(j=(0,n.resolveSessionIdByIdOrName)(A,i.resumeId),j===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await Z(d,i,S,A,E,O,g,p);return}await(0,s.renderApp)({cwd:d,provider:S,providerOverride:i.provider,providerType:y.name,modelId:b,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:A,resumeSessionId:j,showSessionPickerOnStart:M,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:E,subagentRunnerFactory:O,commandModules:g,commandHostAdapters:p,shellExec:t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:_?_.then(e=>e?(0,n.formatCliUpdateNotice)(e):void 0):void 0,transportRegistry:(0,c.createDefaultTransportRegistry)(),cliAdapter:(0,s.createDefaultTuiCliAdapter)({providerDefinitions:m,reloadPluginCommandSource:o.reloadPluginCommandSource}),reloadPluginCommandSource:o.reloadPluginCommandSource,agentName:`robota-cli`}),process.exit(0)}exports.startCli=Q;
@@ -1,5 +1,5 @@
1
- import { IProviderDefinition } from "@robota-sdk/agent-core";
2
1
  import { ICommandModule } from "@robota-sdk/agent-framework";
2
+ import { IProviderDefinition } from "@robota-sdk/agent-core";
3
3
 
4
4
  //#region src/startup/command-setup.d.ts
5
5
  interface IStartCliOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/startup/command-setup.ts","../../src/cli.ts"],"mappings":";;;;UAuBiB,gBAAA;EACf,cAAA,YAA0B,cAAA;EAC1B,mBAAA,YAA+B,mBAAmB;AAAA;;;iBCkB9B,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/startup/command-setup.ts","../../src/cli.ts"],"mappings":";;;;UAuBiB,gBAAA;EACf,cAAA,YAA0B,cAAA;EAC1B,mBAAA,YAA+B,mBAAmB;AAAA;;;iBCmB9B,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
@@ -1,4 +1,4 @@
1
- import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{applyProviderConfiguration as i,applyProviderSwitch as a,checkForCliUpdate as o,createProjectSessionStore as s,createProviderFromSettings as c,formatCliUpdateCheckMessage as l,formatCliUpdateNotice as u,getStartupCliUpdateNotice as d,getUserSettingsPath as f,projectPaths as p,readMergedProviderSettings as m,readPackageVersion as h,readProviderSettings as g,readSettings as _,resetUserConfig as v,resolveLatestSessionId as y,resolveProviderSettingsWriteTargetPath as b,resolveSessionIdByIdOrName as x,resolveSettingsPathForScope as S,shouldRunStartupCliUpdateCheck as C,writeSettings as w}from"@robota-sdk/agent-framework";import{parseArgs as T}from"node:util";import{formatSupportedProviderTypes as E}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as D}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as ee,reloadPluginCommandSource as j,runProviderStartupSetup as M}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as N,renderApp as P}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as F}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as I}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as L,getDefaultSubagentWorkerPath as R}from"@robota-sdk/agent-subagent-runner";import{readFileSync as z}from"node:fs";import{resolve as B}from"node:path";const V=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],H=[`text`,`json`,`stream-json`];function U(){return`
1
+ import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{applyProviderConfiguration as i,applyProviderSwitch as a,checkForCliUpdate as o,createProjectSessionStore as s,createProviderFromSettings as c,formatCliUpdateCheckMessage as l,formatCliUpdateNotice as u,getStartupCliUpdateNotice as d,getUserSettingsPath as f,projectPaths as p,readMergedProviderSettings as m,readPackageVersion as h,readProviderSettings as g,readSettings as _,resetUserConfig as v,resolveLatestSessionId as ee,resolveProviderSettingsWriteTargetPath as y,resolveSessionIdByIdOrName as b,resolveSettingsPathForScope as x,shouldRunStartupCliUpdateCheck as S,userPaths as C,writeSettings as w}from"@robota-sdk/agent-framework";import{parseArgs as T}from"node:util";import{formatSupportedProviderTypes as E}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as D}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as te,reloadPluginCommandSource as j,runProviderStartupSetup as ne}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as re,renderApp as ie}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as ae}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as oe}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as se,getDefaultSubagentWorkerPath as M}from"@robota-sdk/agent-subagent-runner";import{readFileSync as N,readdirSync as P}from"node:fs";import{join as F,resolve as I}from"node:path";const L=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],R=[`text`,`json`,`stream-json`];function z(){return`
2
2
  Usage: robota [options] [-p <prompt>]
3
3
 
4
4
  Options:
@@ -35,9 +35,16 @@ Examples:
35
35
  robota --task-file task.md Run task from file (appended to system prompt)
36
36
  robota --dry-run "Refactor the auth module" Show plan without modifying files
37
37
  robota --continue Resume the last session
38
- `}function W(e){if(e!==void 0){if(!H.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${H.join(` | `)}`);return e}}function G(e){if(e!==void 0){if(!V.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${V.join(` | `)}`);return e}}function K(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 te={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`},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`},"denied-tools":{type:`string`},model:{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},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function q(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:G(e[`permission-mode`]),maxTurns:K(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:W(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`],deniedTools:e[`denied-tools`],model:e.model,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,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function J(){let{values:e,positionals:t}=T(te);return q(e,t)}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(e,t,n,r=D()){let o=S(e,Y(t.settingsScope));return t.configureProvider?(i(o,ne(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(a(t.settingsScope===void 0?b(e):o,t.provider,{knownProviders:m(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function Z(e,t,n,r,i=D(),a){await A(e,{provider:t.provider,settingsScope:Y(t.settingsScope)},n,r,i,{formatError:re,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function Q(e,t,n,r,i=D()){await M(e,{settingsScope:Y(t.settingsScope)},n,r,i)}function ne(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 re(e=D()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${E(e)}`,...e.map(ie)].join(`
39
- `)}function ie(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 ae(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await ee({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}const oe=()=>h(import.meta.url);function $(e){let t=v();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function se(e,t,n,r){let i={settings:{read:()=>_(f()),write:e=>w(f(),e)},plugin:k(e)},a=n.providerDefinitions??D();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...O({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>m(e),readTargetSettings:()=>_(b(e)),writeTargetSettings:t=>w(b(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:C(t)?d({currentVersion:r}):void 0}}function ce(e,t){let n=z(B(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function le(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(ce(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(`
38
+ `}function B(e){if(e!==void 0){if(!R.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${R.join(` | `)}`);return e}}function V(e){if(e!==void 0){if(!L.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${L.join(` | `)}`);return e}}function H(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 U={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`},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`},"denied-tools":{type:`string`},model:{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},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function W(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:V(e[`permission-mode`]),maxTurns:H(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:B(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`],deniedTools:e[`denied-tools`],model:e.model,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,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function G(){let{values:e,positionals:t}=T(U);return W(e,t)}function K(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function ce(e,t,n,r=D()){let o=x(e,K(t.settingsScope));return t.configureProvider?(i(o,de(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(a(t.settingsScope===void 0?y(e):o,t.provider,{knownProviders:m(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function le(e,t,n,r,i=D(),a){await A(e,{provider:t.provider,settingsScope:K(t.settingsScope)},n,r,i,{formatError:fe,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function ue(e,t,n,r,i=D()){await ne(e,{settingsScope:K(t.settingsScope)},n,r,i)}function de(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 fe(e=D()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${E(e)}`,...e.map(pe)].join(`
39
+ `)}function pe(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 me(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await te({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 q(e){let t=N(e,`utf-8`);return JSON.parse(t)}function he(e,t){return new Date(t).getTime()-new Date(e).getTime()}function ge(e){let t=[],n=0,r=0;for(;r<e.length;){let i=e[r];if(!i){r++;continue}if(i.category===`chat`&&i.type===`user`){n++;let a=i.timestamp,o=!1,s=null,c=r+1;for(;c<e.length;){let r=e[c];if(!r){c++;continue}if(r.category===`chat`&&r.type===`user`)break;if(r.category===`event`&&r.type===`tool-start`){o?s!==null&&t.push(J(`llm_between_tools`,`tool-end`,`tool-start`,s,r.timestamp,n)):(t.push(J(`user_to_first_tool`,`user`,`tool-start`,a,r.timestamp,n)),o=!0),s=null,c++;continue}if(r.category===`event`&&r.type===`tool-end`){let i=e[c-1];i&&i.category===`event`&&i.type===`tool-start`&&t.push(J(`tool_exec`,`tool-start`,`tool-end`,i.timestamp,r.timestamp,n)),s=r.timestamp,c++;continue}if(r.category===`event`&&r.type===`tool-summary`){s!==null&&t.push(J(`llm_final_response`,`tool-end`,`tool-summary`,s,r.timestamp,n)),c++;continue}if(r.category===`chat`&&r.type===`assistant`){o?s!==null&&t.push(J(`llm_final_response`,`tool-end`,`assistant`,s,r.timestamp,n)):t.push(J(`user_to_assistant`,`user`,`assistant`,a,r.timestamp,n)),c++;break}c++}r=c}else r++}return t}function J(e,t,n,r,i,a){return{kind:e,fromType:t,toType:n,fromTimestamp:r,toTimestamp:i,durationMs:he(r,i),turnIndex:a}}function _e(e){let t=e.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`),n=e.filter(e=>e.kind===`tool_exec`),r=e.filter(e=>e.kind===`user_to_assistant`),i=e=>e.length?Math.round(e.reduce((e,t)=>e+t.durationMs,0)/e.length):0,a=e=>e.length?Math.max(...e.map(e=>e.durationMs)):0;return{llmWaitMs:{avg:i(t),max:a(t),total:t.reduce((e,t)=>e+t.durationMs,0),count:t.length},toolExecMs:{avg:i(n),max:a(n),median:(e=>{if(!e.length)return 0;let t=[...e].sort((e,t)=>e.durationMs-t.durationMs),n=Math.floor(t.length/2);return t.length%2==0?Math.round(((t[n-1]?.durationMs??0)+(t[n]?.durationMs??0))/2):t[n]?.durationMs??0})(n),count:n.length},userToAssistantMs:{avg:i(r),max:a(r),count:r.length}}}function Y(e){let t=ge(e.history??[]),n=t.filter(e=>e.durationMs>=1e4);return{sessionId:e.id,cwd:e.cwd,createdAt:e.createdAt,totalIntervals:t.length,intervals:t,slowIntervals:n,stats:_e(t)}}function X(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}function Z(e){return new Date(e).toLocaleString(`sv-SE`,{timeZoneName:`short`}).slice(0,16)}function ve(e){return{user_to_first_tool:`user → tool-start`,user_to_assistant:`user → assistant`,tool_exec:`tool-start → tool-end`,llm_between_tools:`tool-end → tool-start`,llm_final_response:`tool-end → assistant/summary`}[e.kind]??e.kind}function ye(e){let{stats:t}=e,n=t.llmWaitMs.total+t.toolExecMs.avg*t.toolExecMs.count;if(n===0)return`Verdict: No timing data available.`;let r=Math.round(t.llmWaitMs.total/n*100);return`Verdict: LLM API wait ${r}% | Code processing ${100-r}%`}function Q(e){let t=[],{stats:n}=e;if(t.push(`Session: ${e.sessionId}`),t.push(`Created: ${Z(e.createdAt)} | cwd: ${e.cwd}`),t.push(``),t.push(`Timing Summary:`),n.llmWaitMs.count>0&&t.push(` LLM API wait ${X(n.llmWaitMs.avg).padStart(8)} avg | ${X(n.llmWaitMs.max).padStart(8)} max`),n.toolExecMs.count>0&&t.push(` Tool execution ${X(n.toolExecMs.avg).padStart(8)} avg | ${X(n.toolExecMs.median).padStart(8)} median`),n.userToAssistantMs.count>0&&t.push(` user → assistant ${X(n.userToAssistantMs.avg).padStart(8)} avg`),n.llmWaitMs.count===0&&n.toolExecMs.count===0&&t.push(` (no intervals computed — session may have no history)`),e.slowIntervals.length>0){t.push(``),t.push(`Slow intervals (>10s):`);for(let n of e.slowIntervals)t.push(` turn ${n.turnIndex} ${ve(n).padEnd(32)} ${X(n.durationMs).padStart(8)}`)}return t.push(``),t.push(ye(e)),t.join(`
40
+ `)}function be(e){let t=[];return t.push(`Analyzed ${e.sessionCount} sessions (${Z(e.fromDate)} ~ ${Z(e.toDate)})`),t.push(` Avg LLM response: ${X(e.avgLlmResponseMs)}`),t.push(` Avg tool exec: ${X(e.avgToolExecMs)}`),e.maxSingleDelayMs>0&&t.push(` Max single delay: ${X(e.maxSingleDelayMs)} (${e.maxSingleDelaySession}, turn ${e.maxSingleDelayTurn}, ${e.maxSingleDelayKind})`),t.join(`
41
+ `)}function $(e){let t,n;for(let r=0;r<e.length;r++)if(e[r]===`--last`&&e[r+1]){let n=parseInt(e[r+1],10);!isNaN(n)&&n>0&&(t=n),r++}else e[r]===`--session`&&e[r+1]&&(n=e[r+1],r++);return{last:t,sessionId:n}}function xe(e){try{return P(e).filter(e=>e.endsWith(`.json`)).map(t=>F(e,t)).sort()}catch{return[]}}function Se(e){let t=e.flatMap(e=>e.intervals.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`)),n=e.flatMap(e=>e.intervals.filter(e=>e.kind===`tool_exec`)),r=t.length?Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length):0,i=n.length?Math.round(n.reduce((e,t)=>e+t.durationMs,0)/n.length):0,a=0,o=``,s=0,c=``;for(let t of e)for(let e of t.intervals)e.durationMs>a&&(a=e.durationMs,o=t.sessionId,s=e.turnIndex,c=e.kind);let l=e.map(e=>e.createdAt).sort();return{sessionCount:e.length,fromDate:l[0]??``,toDate:l[l.length-1]??``,avgLlmResponseMs:r,avgToolExecMs:i,maxSingleDelayMs:a,maxSingleDelaySession:o,maxSingleDelayTurn:s,maxSingleDelayKind:c}}async function Ce(e){let t=$(e),n=C().sessions,r=xe(n);if(r.length===0&&(process.stderr.write(`No session files found in ${n}\n`),process.exit(1)),t.sessionId!==void 0){let e=r.find(e=>e.includes(t.sessionId));e||(process.stderr.write(`Session not found: ${t.sessionId}\n`),process.exit(1));let n=Y(q(e));process.stdout.write(Q(n)+`
42
+ `);return}if(t.last!==void 0){let e=r.slice(-t.last),n=[];for(let t of e)try{n.push(Y(q(t)))}catch{}n.length===0&&(process.stderr.write(`No valid sessions found.
43
+ `),process.exit(1));let i=Se(n);process.stdout.write(be(i)+`
44
+ `);return}let i=r[r.length-1];i||(process.stderr.write(`No sessions found.
45
+ `),process.exit(1));let a=Y(q(i));process.stdout.write(Q(a)+`
46
+ `)}const we=()=>h(import.meta.url);function Te(e){let t=v();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function Ee(e,t,n,r){let i={settings:{read:()=>_(f()),write:e=>w(f(),e)},plugin:k(e)},a=n.providerDefinitions??D();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...O({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>m(e),readTargetSettings:()=>_(y(e)),writeTargetSettings:t=>w(y(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:S(t)?d({currentVersion:r}):void 0}}function De(e,t){let n=N(I(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function Oe(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(De(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(`
40
47
 
41
- `):void 0}async function ue(e,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.
42
- `),process.exit(1));let u=le(e,n),d=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,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,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function de(t={}){let i;try{i=J()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=oe();if(i.help){process.stdout.write(U());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await o({currentVersion:a,force:!0}),t=l(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new n;if(i.reset){$(f);return}try{if(await ae(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:m,providerDefinitions:h,commandModules:_,startupUpdateNoticePromise:v}=se(d,i,t,a);if(i.configure){await Q(d,i,r,f,h);return}if(X(d,i,f,h))return;try{await Z(d,i,r,f,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let b=i.provider?{providerOverride:i.provider,providerDefinitions:h}:{providerDefinitions:h},S=g(d,b),C=i.model??S.model,w=c(d,i.model,b),T=I(),E=p(d),D=L({workerPath:R(),providerConfig:{...S,model:C},logsDir:E.logs}),O=s(d),k,A=!1;if(i.continueMode?k=y(O,d):i.resumeId!==void 0&&(i.resumeId===``?A=!0:(k=x(O,i.resumeId),k===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await ue(d,i,w,O,T,D,_,m);return}await P({cwd:d,provider:w,providerOverride:i.provider,providerType:S.name,modelId:C,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:O,resumeSessionId:k,showSessionPickerOnStart:A,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:T,subagentRunnerFactory:D,commandModules:_,commandHostAdapters:m,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:v?v.then(e=>e?u(e):void 0):void 0,transportRegistry:F(),cliAdapter:N({providerDefinitions:h,reloadPluginCommandSource:j}),reloadPluginCommandSource:j,agentName:`robota-cli`}),process.exit(0)}export{de as startCli};
48
+ `):void 0}async function ke(e,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.
49
+ `),process.exit(1));let u=Oe(e,n),d=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,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,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function Ae(t={}){let i;try{i=G()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=we();if(i.help){process.stdout.write(z());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await o({currentVersion:a,force:!0}),t=l(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new n;if(i.reset){Te(f);return}if(i.positional[0]===`session`&&i.positional[1]===`analyze`){await Ce(process.argv.slice(4));return}try{if(await me(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:m,providerDefinitions:h,commandModules:_,startupUpdateNoticePromise:v}=Ee(d,i,t,a);if(i.configure){await ue(d,i,r,f,h);return}if(ce(d,i,f,h))return;try{await le(d,i,r,f,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let y=i.provider?{providerOverride:i.provider,providerDefinitions:h}:{providerDefinitions:h},x=g(d,y),S=i.model??x.model,C=c(d,i.model,y),w=oe(),T=p(d),E=se({workerPath:M(),providerConfig:{...x,model:S},logsDir:T.logs}),D=s(d),O,k=!1;if(i.continueMode?O=ee(D,d):i.resumeId!==void 0&&(i.resumeId===``?k=!0:(O=b(D,i.resumeId),O===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await ke(d,i,C,D,w,E,_,m);return}await ie({cwd:d,provider:C,providerOverride:i.provider,providerType:x.name,modelId:S,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:D,resumeSessionId:O,showSessionPickerOnStart:k,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:w,subagentRunnerFactory:E,commandModules:_,commandHostAdapters:m,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:v?v.then(e=>e?u(e):void 0):void 0,transportRegistry:ae(),cliAdapter:re({providerDefinitions:h,reloadPluginCommandSource:j}),reloadPluginCommandSource:j,agentName:`robota-cli`}),process.exit(0)}export{Ae as startCli};
43
50
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/utils/cli-args.ts","../../src/startup/provider-startup.ts","../../src/user-local-direct-command.ts","../../src/startup/version.ts","../../src/startup/reset-config.ts","../../src/startup/command-setup.ts","../../src/startup/append-system-prompt.ts","../../src/modes/print-mode.ts","../../src/cli.ts"],"sourcesContent":["/**\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 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 deniedTools: string | undefined;\n model: 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 dryRun: boolean;\n yes: 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 --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 into a new independent session\n --task-file <path> Read a task prompt from file and append it to the system prompt\n --bare Print mode: output raw text only, no formatting wrapper\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run Plan-only run: show what the agent would do without modifying files\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nCommands:\n robota init Initialize AGENTS.md and .robota/settings.json\n\nExamples:\n robota Start interactive TUI session\n robota init Initialize project files\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota -p \"Review this diff\" --bare Raw output for shell pipelines\n robota --task-file task.md Run task from file (appended to system prompt)\n robota --dry-run \"Refactor the auth module\" Show plan without modifying files\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 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 'denied-tools': { type: 'string' },\n model: { 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 'dry-run': { type: 'boolean', default: false },\n yes: { type: 'boolean', short: 'y', 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 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 deniedTools: values['denied-tools'],\n model: values['model'],\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 dryRun: values['dry-run'] ?? false,\n yes: values['yes'] ?? 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 { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from '../utils/cli-args.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 { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\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 args: IParsedCliArgs,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(args.settingsScope));\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\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 terminal.writeLine(`Current provider set to ${args.provider}`);\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 terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n isInteractive?: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: args.provider, settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive:\n isInteractive !== undefined\n ? () => isInteractive\n : () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\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\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\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 { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n terminal: ITerminalOutput,\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.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\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 { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getStartupCliUpdateNotice,\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n shouldRunStartupCliUpdateCheck,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICliUpdateNotice,\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nexport function 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: 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 const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\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(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","import type { IAIProvider } from '@robota-sdk/agent-core';\nimport type { ICommandHostAdapters, ICommandModule } from '@robota-sdk/agent-framework';\nimport type { createProjectSessionStore } from '@robota-sdk/agent-framework';\nimport { HeadlessInteractionChannel } from '@robota-sdk/agent-transport/headless';\nimport type { IBackgroundTaskRunner } from '@robota-sdk/agent-executor';\nimport type { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\n\nexport async 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 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 const channel = new HeadlessInteractionChannel({\n cwd,\n provider,\n outputFormat: args.outputFormat ?? 'text',\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 ...(args.systemPrompt ? { systemPrompt: args.systemPrompt } : {}),\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n });\n\n await channel.run(prompt);\n process.exit(channel.getExitCode());\n}\n","/**\n * CLI entry point — pure composition root.\n * Parses arguments and delegates to startup modules, mode runners, and transports.\n */\n\nimport { execSync } from 'node:child_process';\nimport { PrintTerminal, promptInput } from '@robota-sdk/agent-transport/headless';\nimport {\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './startup/provider-startup.js';\nimport { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { createDefaultBackgroundTaskRunners } from '@robota-sdk/agent-executor';\nimport {\n createChildProcessSubagentRunnerFactory,\n getDefaultSubagentWorkerPath,\n} from '@robota-sdk/agent-subagent-runner';\nimport { reloadPluginCommandSource } from '@robota-sdk/agent-command';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { readVersion } from './startup/version.js';\nimport { runResetConfig } from './startup/reset-config.js';\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport { buildCommandSetup } from './startup/command-setup.js';\nimport { runPrintMode } from './modes/print-mode.js';\n\nexport type { IStartCliOptions };\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n let args: IParsedCliArgs;\n try {\n args = 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 const version = readVersion();\n\n if (args.help) {\n process.stdout.write(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 const cwd = process.cwd();\n const terminal = new PrintTerminal();\n\n if (args.reset) {\n runResetConfig(terminal);\n return;\n }\n\n try {\n if (await runUserLocalDirectCommandIfRequested(args, cwd, terminal)) {\n return;\n }\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 const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, terminal, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, terminal, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, terminal, 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 const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n workerPath: getDefaultSubagentWorkerPath(),\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\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 await renderApp({\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: createDefaultTransportRegistry(),\n cliAdapter: createDefaultTuiCliAdapter({ providerDefinitions, reloadPluginCommandSource }),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\n });\n process.exit(0);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/utils/cli-args.ts","../../src/startup/provider-startup.ts","../../src/user-local-direct-command.ts","../../src/session-analyzer/parser.ts","../../src/session-analyzer/reporter.ts","../../src/session-analyzer/session-analyze-command.ts","../../src/startup/version.ts","../../src/startup/reset-config.ts","../../src/startup/command-setup.ts","../../src/startup/append-system-prompt.ts","../../src/modes/print-mode.ts","../../src/cli.ts"],"sourcesContent":["/**\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 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 deniedTools: string | undefined;\n model: 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 dryRun: boolean;\n yes: 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 --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 into a new independent session\n --task-file <path> Read a task prompt from file and append it to the system prompt\n --bare Print mode: output raw text only, no formatting wrapper\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run Plan-only run: show what the agent would do without modifying files\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nCommands:\n robota init Initialize AGENTS.md and .robota/settings.json\n\nExamples:\n robota Start interactive TUI session\n robota init Initialize project files\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota -p \"Review this diff\" --bare Raw output for shell pipelines\n robota --task-file task.md Run task from file (appended to system prompt)\n robota --dry-run \"Refactor the auth module\" Show plan without modifying files\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 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 'denied-tools': { type: 'string' },\n model: { 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 'dry-run': { type: 'boolean', default: false },\n yes: { type: 'boolean', short: 'y', 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 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 deniedTools: values['denied-tools'],\n model: values['model'],\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 dryRun: values['dry-run'] ?? false,\n yes: values['yes'] ?? 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 { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from '../utils/cli-args.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 { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\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 args: IParsedCliArgs,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(args.settingsScope));\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\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 terminal.writeLine(`Current provider set to ${args.provider}`);\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 terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n isInteractive?: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: args.provider, settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive:\n isInteractive !== undefined\n ? () => isInteractive\n : () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\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\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\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 { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n terminal: ITerminalOutput,\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.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","/**\n * Session log parser and timing interval calculator.\n */\n\nimport { readFileSync } from 'node:fs';\n\nimport type {\n ISessionHistoryEntry,\n ISessionRecord,\n ISessionTimingReport,\n ITimingInterval,\n ITimingStats,\n TIntervalKind,\n} from './types.js';\n\nexport function parseSessionFile(filePath: string): ISessionRecord {\n const raw = readFileSync(filePath, 'utf-8');\n return JSON.parse(raw) as ISessionRecord;\n}\n\n/** Calculate gap in milliseconds between two ISO 8601 timestamps. */\nexport function gapMs(from: string, to: string): number {\n return new Date(to).getTime() - new Date(from).getTime();\n}\n\n/**\n * Compute timing intervals from a history entry array.\n *\n * Strategy: scan the timeline turn by turn.\n * A \"turn\" starts with a user message. After user, we expect:\n * - zero or more: tool-start → tool-end cycles\n * - optionally: tool-summary\n * - finally: assistant message\n */\nexport function computeTimingIntervals(history: ISessionHistoryEntry[]): ITimingInterval[] {\n const intervals: ITimingInterval[] = [];\n let turnIndex = 0;\n\n let i = 0;\n while (i < history.length) {\n const entry = history[i];\n if (!entry) {\n i++;\n continue;\n }\n\n if (entry.category === 'chat' && entry.type === 'user') {\n turnIndex++;\n const userTs = entry.timestamp;\n let foundFirstTool = false;\n let lastToolEndTs: string | null = null;\n let j = i + 1;\n\n while (j < history.length) {\n const next = history[j];\n if (!next) {\n j++;\n continue;\n }\n\n if (next.category === 'chat' && next.type === 'user') {\n break;\n }\n\n if (next.category === 'event' && next.type === 'tool-start') {\n if (!foundFirstTool) {\n intervals.push(\n makeInterval(\n 'user_to_first_tool',\n 'user',\n 'tool-start',\n userTs,\n next.timestamp,\n turnIndex,\n ),\n );\n foundFirstTool = true;\n } else if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_between_tools',\n 'tool-end',\n 'tool-start',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n lastToolEndTs = null;\n j++;\n continue;\n }\n\n if (next.category === 'event' && next.type === 'tool-end') {\n const prev = history[j - 1];\n if (prev && prev.category === 'event' && prev.type === 'tool-start') {\n intervals.push(\n makeInterval(\n 'tool_exec',\n 'tool-start',\n 'tool-end',\n prev.timestamp,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n lastToolEndTs = next.timestamp;\n j++;\n continue;\n }\n\n if (next.category === 'event' && next.type === 'tool-summary') {\n if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_final_response',\n 'tool-end',\n 'tool-summary',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n j++;\n continue;\n }\n\n if (next.category === 'chat' && next.type === 'assistant') {\n if (!foundFirstTool) {\n intervals.push(\n makeInterval(\n 'user_to_assistant',\n 'user',\n 'assistant',\n userTs,\n next.timestamp,\n turnIndex,\n ),\n );\n } else if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_final_response',\n 'tool-end',\n 'assistant',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n j++;\n break;\n }\n\n j++;\n }\n\n i = j;\n } else {\n i++;\n }\n }\n\n return intervals;\n}\n\nfunction makeInterval(\n kind: TIntervalKind,\n fromType: string,\n toType: string,\n fromTimestamp: string,\n toTimestamp: string,\n turnIndex: number,\n): ITimingInterval {\n return {\n kind,\n fromType,\n toType,\n fromTimestamp,\n toTimestamp,\n durationMs: gapMs(fromTimestamp, toTimestamp),\n turnIndex,\n };\n}\n\nconst SLOW_THRESHOLD_MS = 10_000;\n\nfunction computeStats(intervals: ITimingInterval[]): ITimingStats {\n const llm = intervals.filter(\n (iv) =>\n iv.kind === 'user_to_first_tool' ||\n iv.kind === 'user_to_assistant' ||\n iv.kind === 'llm_between_tools' ||\n iv.kind === 'llm_final_response',\n );\n const tool = intervals.filter((iv) => iv.kind === 'tool_exec');\n const direct = intervals.filter((iv) => iv.kind === 'user_to_assistant');\n\n const avg = (arr: ITimingInterval[]) =>\n arr.length ? Math.round(arr.reduce((s, iv) => s + iv.durationMs, 0) / arr.length) : 0;\n const max = (arr: ITimingInterval[]) =>\n arr.length ? Math.max(...arr.map((iv) => iv.durationMs)) : 0;\n const median = (arr: ITimingInterval[]) => {\n if (!arr.length) return 0;\n const sorted = [...arr].sort((a, b) => a.durationMs - b.durationMs);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0\n ? Math.round(((sorted[mid - 1]?.durationMs ?? 0) + (sorted[mid]?.durationMs ?? 0)) / 2)\n : (sorted[mid]?.durationMs ?? 0);\n };\n\n return {\n llmWaitMs: {\n avg: avg(llm),\n max: max(llm),\n total: llm.reduce((s, iv) => s + iv.durationMs, 0),\n count: llm.length,\n },\n toolExecMs: { avg: avg(tool), max: max(tool), median: median(tool), count: tool.length },\n userToAssistantMs: { avg: avg(direct), max: max(direct), count: direct.length },\n };\n}\n\nexport function analyzeSession(record: ISessionRecord): ISessionTimingReport {\n const history = record.history ?? [];\n const intervals = computeTimingIntervals(history);\n const slowIntervals = intervals.filter((iv) => iv.durationMs >= SLOW_THRESHOLD_MS);\n\n return {\n sessionId: record.id,\n cwd: record.cwd,\n createdAt: record.createdAt,\n totalIntervals: intervals.length,\n intervals,\n slowIntervals,\n stats: computeStats(intervals),\n };\n}\n","/**\n * Text report formatter for session timing analysis.\n */\n\nimport type { IAggregateReport, ISessionTimingReport, ITimingInterval } from './types.js';\n\nfunction fmtMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nfunction fmtDate(iso: string): string {\n return new Date(iso).toLocaleString('sv-SE', { timeZoneName: 'short' }).slice(0, 16);\n}\n\nfunction intervalLabel(iv: ITimingInterval): string {\n const map: Record<string, string> = {\n user_to_first_tool: 'user → tool-start',\n user_to_assistant: 'user → assistant',\n tool_exec: 'tool-start → tool-end',\n llm_between_tools: 'tool-end → tool-start',\n llm_final_response: 'tool-end → assistant/summary',\n };\n return map[iv.kind] ?? iv.kind;\n}\n\nfunction verdictLine(report: ISessionTimingReport): string {\n const { stats } = report;\n const totalMs = stats.llmWaitMs.total + stats.toolExecMs.avg * stats.toolExecMs.count;\n if (totalMs === 0) return 'Verdict: No timing data available.';\n const llmPct = Math.round((stats.llmWaitMs.total / totalMs) * 100);\n const toolPct = 100 - llmPct;\n return `Verdict: LLM API wait ${llmPct}% | Code processing ${toolPct}%`;\n}\n\nexport function formatSingleSession(report: ISessionTimingReport): string {\n const lines: string[] = [];\n const { stats } = report;\n\n lines.push(`Session: ${report.sessionId}`);\n lines.push(`Created: ${fmtDate(report.createdAt)} | cwd: ${report.cwd}`);\n lines.push('');\n lines.push('Timing Summary:');\n\n if (stats.llmWaitMs.count > 0) {\n lines.push(\n ` LLM API wait ${fmtMs(stats.llmWaitMs.avg).padStart(8)} avg | ${fmtMs(stats.llmWaitMs.max).padStart(8)} max`,\n );\n }\n if (stats.toolExecMs.count > 0) {\n lines.push(\n ` Tool execution ${fmtMs(stats.toolExecMs.avg).padStart(8)} avg | ${fmtMs(stats.toolExecMs.median).padStart(8)} median`,\n );\n }\n if (stats.userToAssistantMs.count > 0) {\n lines.push(` user → assistant ${fmtMs(stats.userToAssistantMs.avg).padStart(8)} avg`);\n }\n if (stats.llmWaitMs.count === 0 && stats.toolExecMs.count === 0) {\n lines.push(' (no intervals computed — session may have no history)');\n }\n\n if (report.slowIntervals.length > 0) {\n lines.push('');\n lines.push('Slow intervals (>10s):');\n for (const iv of report.slowIntervals) {\n lines.push(\n ` turn ${iv.turnIndex} ${intervalLabel(iv).padEnd(32)} ${fmtMs(iv.durationMs).padStart(8)}`,\n );\n }\n }\n\n lines.push('');\n lines.push(verdictLine(report));\n\n return lines.join('\\n');\n}\n\nexport function formatAggregateReport(aggregate: IAggregateReport): string {\n const lines: string[] = [];\n lines.push(\n `Analyzed ${aggregate.sessionCount} sessions (${fmtDate(aggregate.fromDate)} ~ ${fmtDate(aggregate.toDate)})`,\n );\n lines.push(` Avg LLM response: ${fmtMs(aggregate.avgLlmResponseMs)}`);\n lines.push(` Avg tool exec: ${fmtMs(aggregate.avgToolExecMs)}`);\n if (aggregate.maxSingleDelayMs > 0) {\n lines.push(\n ` Max single delay: ${fmtMs(aggregate.maxSingleDelayMs)} (${aggregate.maxSingleDelaySession}, turn ${aggregate.maxSingleDelayTurn}, ${aggregate.maxSingleDelayKind})`,\n );\n }\n return lines.join('\\n');\n}\n","/**\n * `robota session analyze` command.\n *\n * Usage:\n * robota session analyze — analyze the most recent session\n * robota session analyze --last <n> — aggregate the last N sessions\n * robota session analyze --session <id> — analyze a specific session by ID prefix\n */\n\nimport { readdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { userPaths } from '@robota-sdk/agent-framework';\n\nimport { analyzeSession, parseSessionFile } from './parser.js';\nimport { formatAggregateReport, formatSingleSession } from './reporter.js';\nimport type { IAggregateReport, ISessionTimingReport } from './types.js';\n\ninterface ISessionAnalyzeArgs {\n last: number | undefined;\n sessionId: string | undefined;\n}\n\nfunction parseSessionAnalyzeArgs(argv: string[]): ISessionAnalyzeArgs {\n let last: number | undefined;\n let sessionId: string | undefined;\n\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--last' && argv[i + 1]) {\n const n = parseInt(argv[i + 1]!, 10);\n if (!isNaN(n) && n > 0) last = n;\n i++;\n } else if (argv[i] === '--session' && argv[i + 1]) {\n sessionId = argv[i + 1];\n i++;\n }\n }\n\n return { last, sessionId };\n}\n\nfunction listSessionFiles(sessionsDir: string): string[] {\n try {\n return readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => join(sessionsDir, f))\n .sort();\n } catch {\n // allow-fallback: sessions directory may not exist on first run — empty list is correct response\n return [];\n }\n}\n\nfunction buildAggregateReport(reports: ISessionTimingReport[]): IAggregateReport {\n const llmIntervals = reports.flatMap((r) =>\n r.intervals.filter(\n (iv) =>\n iv.kind === 'user_to_first_tool' ||\n iv.kind === 'user_to_assistant' ||\n iv.kind === 'llm_between_tools' ||\n iv.kind === 'llm_final_response',\n ),\n );\n const toolIntervals = reports.flatMap((r) => r.intervals.filter((iv) => iv.kind === 'tool_exec'));\n\n const avgLlmResponseMs = llmIntervals.length\n ? Math.round(llmIntervals.reduce((s, iv) => s + iv.durationMs, 0) / llmIntervals.length)\n : 0;\n const avgToolExecMs = toolIntervals.length\n ? Math.round(toolIntervals.reduce((s, iv) => s + iv.durationMs, 0) / toolIntervals.length)\n : 0;\n\n let maxSingleDelayMs = 0;\n let maxSingleDelaySession = '';\n let maxSingleDelayTurn = 0;\n let maxSingleDelayKind = '';\n\n for (const r of reports) {\n for (const iv of r.intervals) {\n if (iv.durationMs > maxSingleDelayMs) {\n maxSingleDelayMs = iv.durationMs;\n maxSingleDelaySession = r.sessionId;\n maxSingleDelayTurn = iv.turnIndex;\n maxSingleDelayKind = iv.kind;\n }\n }\n }\n\n const dates = reports.map((r) => r.createdAt).sort();\n\n return {\n sessionCount: reports.length,\n fromDate: dates[0] ?? '',\n toDate: dates[dates.length - 1] ?? '',\n avgLlmResponseMs,\n avgToolExecMs,\n maxSingleDelayMs,\n maxSingleDelaySession,\n maxSingleDelayTurn,\n maxSingleDelayKind,\n };\n}\n\nexport async function runSessionAnalyze(argv: string[]): Promise<void> {\n const args = parseSessionAnalyzeArgs(argv);\n const sessionsDir = userPaths().sessions;\n const allFiles = listSessionFiles(sessionsDir);\n\n if (allFiles.length === 0) {\n process.stderr.write(`No session files found in ${sessionsDir}\\n`);\n process.exit(1);\n }\n\n if (args.sessionId !== undefined) {\n const matched = allFiles.find((f) => f.includes(args.sessionId!));\n if (!matched) {\n process.stderr.write(`Session not found: ${args.sessionId}\\n`);\n process.exit(1);\n }\n const record = parseSessionFile(matched);\n const report = analyzeSession(record);\n process.stdout.write(formatSingleSession(report) + '\\n');\n return;\n }\n\n if (args.last !== undefined) {\n const files = allFiles.slice(-args.last);\n const reports: ISessionTimingReport[] = [];\n for (const f of files) {\n try {\n reports.push(analyzeSession(parseSessionFile(f)));\n } catch {\n // allow-fallback: corrupted or partial session files are skipped — expected on interrupted writes\n // skip unreadable session files\n }\n }\n if (reports.length === 0) {\n process.stderr.write('No valid sessions found.\\n');\n process.exit(1);\n }\n const aggregate = buildAggregateReport(reports);\n process.stdout.write(formatAggregateReport(aggregate) + '\\n');\n return;\n }\n\n // Default: analyze the most recent session\n const latest = allFiles[allFiles.length - 1];\n if (!latest) {\n process.stderr.write('No sessions found.\\n');\n process.exit(1);\n }\n const record = parseSessionFile(latest);\n const report = analyzeSession(record);\n process.stdout.write(formatSingleSession(report) + '\\n');\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\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 { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getStartupCliUpdateNotice,\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n shouldRunStartupCliUpdateCheck,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICliUpdateNotice,\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nexport function 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: 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 const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\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(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","import type { IAIProvider } from '@robota-sdk/agent-core';\nimport type { ICommandHostAdapters, ICommandModule } from '@robota-sdk/agent-framework';\nimport type { createProjectSessionStore } from '@robota-sdk/agent-framework';\nimport { HeadlessInteractionChannel } from '@robota-sdk/agent-transport/headless';\nimport type { IBackgroundTaskRunner } from '@robota-sdk/agent-executor';\nimport type { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\n\nexport async 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 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 const channel = new HeadlessInteractionChannel({\n cwd,\n provider,\n outputFormat: args.outputFormat ?? 'text',\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 ...(args.systemPrompt ? { systemPrompt: args.systemPrompt } : {}),\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n });\n\n await channel.run(prompt);\n process.exit(channel.getExitCode());\n}\n","/**\n * CLI entry point — pure composition root.\n * Parses arguments and delegates to startup modules, mode runners, and transports.\n */\n\nimport { execSync } from 'node:child_process';\nimport { PrintTerminal, promptInput } from '@robota-sdk/agent-transport/headless';\nimport {\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './startup/provider-startup.js';\nimport { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { createDefaultBackgroundTaskRunners } from '@robota-sdk/agent-executor';\nimport {\n createChildProcessSubagentRunnerFactory,\n getDefaultSubagentWorkerPath,\n} from '@robota-sdk/agent-subagent-runner';\nimport { reloadPluginCommandSource } from '@robota-sdk/agent-command';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { runSessionAnalyze } from './session-analyzer/session-analyze-command.js';\nimport { readVersion } from './startup/version.js';\nimport { runResetConfig } from './startup/reset-config.js';\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport { buildCommandSetup } from './startup/command-setup.js';\nimport { runPrintMode } from './modes/print-mode.js';\n\nexport type { IStartCliOptions };\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n let args: IParsedCliArgs;\n try {\n args = 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 const version = readVersion();\n\n if (args.help) {\n process.stdout.write(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 const cwd = process.cwd();\n const terminal = new PrintTerminal();\n\n if (args.reset) {\n runResetConfig(terminal);\n return;\n }\n\n if (args.positional[0] === 'session' && args.positional[1] === 'analyze') {\n await runSessionAnalyze(process.argv.slice(4));\n return;\n }\n\n try {\n if (await runUserLocalDirectCommandIfRequested(args, cwd, terminal)) {\n return;\n }\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 const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, terminal, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, terminal, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, terminal, 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 const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n workerPath: getDefaultSubagentWorkerPath(),\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\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 await renderApp({\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: createDefaultTransportRegistry(),\n cliAdapter: createDefaultTuiCliAdapter({ providerDefinitions, reloadPluginCommandSource }),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\n });\n process.exit(0);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robota-sdk/agent-cli",
3
- "version": "3.0.0-beta.70",
3
+ "version": "3.0.0-beta.72",
4
4
  "description": "AI coding assistant CLI built on Robota SDK",
5
5
  "type": "module",
6
6
  "bin": {
@@ -45,12 +45,12 @@
45
45
  "open": "^11.0.0",
46
46
  "string-width": "^8.2.0",
47
47
  "ws": "^8.18.3",
48
- "@robota-sdk/agent-command": "3.0.0-beta.70",
49
- "@robota-sdk/agent-core": "3.0.0-beta.70",
50
- "@robota-sdk/agent-provider": "3.0.0-beta.70",
51
- "@robota-sdk/agent-subagent-runner": "3.0.0-beta.70",
52
- "@robota-sdk/agent-framework": "3.0.0-beta.70",
53
- "@robota-sdk/agent-transport": "3.0.0-beta.70"
48
+ "@robota-sdk/agent-command": "3.0.0-beta.72",
49
+ "@robota-sdk/agent-core": "3.0.0-beta.72",
50
+ "@robota-sdk/agent-provider": "3.0.0-beta.72",
51
+ "@robota-sdk/agent-subagent-runner": "3.0.0-beta.72",
52
+ "@robota-sdk/agent-framework": "3.0.0-beta.72",
53
+ "@robota-sdk/agent-transport": "3.0.0-beta.72"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@homebridge/node-pty-prebuilt-multiarch": "^0.13.1",
@@ -61,7 +61,7 @@
61
61
  "tsx": "^4.7.0",
62
62
  "typescript": "^5.3.3",
63
63
  "vitest": "^1.6.1",
64
- "@robota-sdk/agent-executor": "3.0.0-beta.70"
64
+ "@robota-sdk/agent-executor": "3.0.0-beta.72"
65
65
  },
66
66
  "keywords": [
67
67
  "ai",