@robota-sdk/agent-cli 3.0.0-beta.74 → 3.0.0-beta.75

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.
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("node:child_process"),t=require("@robota-sdk/agent-transport/headless"),n=require("@robota-sdk/agent-framework"),r=require("node:util"),i=require("@robota-sdk/agent-core"),a=require("@robota-sdk/agent-provider"),o=require("@robota-sdk/agent-command"),s=require("@robota-sdk/agent-transport/tui"),c=require("@robota-sdk/agent-transport"),l=require("@robota-sdk/agent-executor"),u=require("@robota-sdk/agent-subagent-runner"),d=require("node:fs"),f=require("node:path"),p=require("node:readline/promises"),m=require("node:net");const h=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],g=[`text`,`json`,`stream-json`];function _(){return`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("node:child_process"),t=require("@robota-sdk/agent-transport/headless"),n=require("@robota-sdk/agent-framework"),r=require("node:util"),i=require("@robota-sdk/agent-preset"),a=require("@robota-sdk/agent-core"),o=require("@robota-sdk/agent-provider"),s=require("@robota-sdk/agent-command"),c=require("@robota-sdk/agent-transport/tui"),l=require("@robota-sdk/agent-transport"),u=require("@robota-sdk/agent-executor"),d=require("@robota-sdk/agent-subagent-runner"),f=require("node:fs"),p=require("node:path"),m=require("node:readline/promises"),h=require("node:net");const g=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],_=[`text`,`json`,`stream-json`];function ee(){return`
2
2
  Usage: robota [options] [-p <prompt>]
3
3
 
4
4
  Options:
@@ -21,6 +21,7 @@ Options:
21
21
  --allowed-tools <list> Comma-separated tool allowlist (TUI and print mode)
22
22
  --denied-tools <list> Comma-separated tool denylist (TUI and print mode)
23
23
  --model <model> Model override for this run
24
+ --preset <id> Preset id to apply (default: settings.preset or "default")
24
25
  --json-schema <schema> Print mode: instruct the model to respond with JSON matching this schema
25
26
  --dry-run Alias for --permission-mode plan (plan only, no execution)
26
27
  --reset Delete ~/.robota/settings.json (provider profiles and preferences).
@@ -43,20 +44,20 @@ Examples:
43
44
  robota --task-file task.md Run task from file (appended to system prompt)
44
45
  robota -p "Refactor the auth module" --dry-run Plan only, no execution
45
46
  robota --continue Resume the last session
46
- `}function v(e){if(e===void 0)return;let t=e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}function y(e){if(e!==void 0){if(!g.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${g.join(` | `)}`);return e}}function b(e){if(e!==void 0){if(!h.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${h.join(` | `)}`);return e}}function x(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 S={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 C(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:b(e[`permission-mode`]),maxTurns:x(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:y(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 w(){let{values:e,positionals:t}=(0,r.parseArgs)(S),n=C(e,t);if(n.printMode){if(n.resumeId===``)throw Error(`Print mode requires an explicit session id: -r <id|name> (the interactive session picker is TUI-only)`);if(n.noSessionPersistence&&(n.continueMode||n.resumeId!==void 0))throw Error(`--no-session-persistence conflicts with -c/-r (resume needs the session store)`)}if(n.dryRun){if(n.permissionMode!==void 0&&n.permissionMode!==`plan`)throw Error(`--dry-run is an alias for --permission-mode plan and conflicts with --permission-mode ${n.permissionMode}`);return{...n,permissionMode:`plan`}}return n}function T(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function ee(e,t,r,i=(0,a.createDefaultProviderDefinitions)()){let o=(0,n.resolveSettingsPathForScope)(e,T(t.settingsScope));return t.configureProvider?((0,n.applyProviderConfiguration)(o,D(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 te(e,t,n,r,i=(0,a.createDefaultProviderDefinitions)(),s){await(0,o.ensureProviderConfig)(e,{provider:t.provider,settingsScope:T(t.settingsScope)},n,r,i,{formatError:O,isInteractive:s===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>s})}async function E(e,t,n,r,i=(0,a.createDefaultProviderDefinitions)()){await(0,o.runProviderStartupSetup)(e,{settingsScope:T(t.settingsScope)},n,r,i)}function D(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 O(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(k)].join(`
47
- `)}function k(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 ne(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 re(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 P(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:re(t)}}function F(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}function I(e){return new Date(e).toLocaleString(`sv-SE`,{timeZoneName:`short`}).slice(0,16)}function ie(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 L(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 R(e){let t=[],{stats:n}=e;if(t.push(`Session: ${e.sessionId}`),t.push(`Created: ${I(e.createdAt)} | cwd: ${e.cwd}`),t.push(``),t.push(`Timing Summary:`),n.llmWaitMs.count>0&&t.push(` LLM API wait ${F(n.llmWaitMs.avg).padStart(8)} avg | ${F(n.llmWaitMs.max).padStart(8)} max`),n.toolExecMs.count>0&&t.push(` Tool execution ${F(n.toolExecMs.avg).padStart(8)} avg | ${F(n.toolExecMs.median).padStart(8)} median`),n.userToAssistantMs.count>0&&t.push(` user → assistant ${F(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} ${ie(n).padEnd(32)} ${F(n.durationMs).padStart(8)}`)}return t.push(``),t.push(L(e)),t.join(`
48
- `)}function z(e){let t=[];return t.push(`Analyzed ${e.sessionCount} sessions (${I(e.fromDate)} ~ ${I(e.toDate)})`),t.push(` Avg LLM response: ${F(e.avgLlmResponseMs)}`),t.push(` Avg tool exec: ${F(e.avgToolExecMs)}`),e.maxSingleDelayMs>0&&t.push(` Max single delay: ${F(e.maxSingleDelayMs)} (${e.maxSingleDelaySession}, turn ${e.maxSingleDelayTurn}, ${e.maxSingleDelayKind})`),t.join(`
49
- `)}function B(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 V(e){try{return(0,d.readdirSync)(e).filter(e=>e.endsWith(`.json`)).map(t=>(0,f.join)(e,t))}catch{return[]}}function H(e){let t=new Map;for(let e of V((0,n.userPaths)().sessions))t.set((0,f.basename)(e),e);for(let r of V((0,n.projectPaths)(e).sessions))t.set((0,f.basename)(r),r);return[...t.entries()].sort((e,t)=>e[0].localeCompare(t[0])).map(([,e])=>e)}function U(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 W(e,t=process.cwd()){let r=B(e),i=H(t);if(i.length===0&&(process.stderr.write(`No session files found in ${(0,n.projectPaths)(t).sessions} or ${(0,n.userPaths)().sessions}\n`),process.exit(1)),r.sessionId!==void 0){let e=i.find(e=>e.includes(r.sessionId));e||(process.stderr.write(`Session not found: ${r.sessionId}\n`),process.exit(1));let t=P(A(e));process.stdout.write(R(t)+`
50
- `);return}if(r.last!==void 0){let e=i.slice(-r.last),t=[];for(let n of e)try{t.push(P(A(n)))}catch{}t.length===0&&(process.stderr.write(`No valid sessions found.
51
- `),process.exit(1));let n=U(t);process.stdout.write(z(n)+`
47
+ `}function v(e){if(e===void 0)return;let t=e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}function y(e){if(e!==void 0){if(!_.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${_.join(` | `)}`);return e}}function b(e){if(e!==void 0){if(!g.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${g.join(` | `)}`);return e}}function x(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 S={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`},preset:{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 C(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:b(e[`permission-mode`]),maxTurns:x(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:y(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,preset:e.preset,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 te(){let{values:e,positionals:t}=(0,r.parseArgs)(S),n=C(e,t);if(n.printMode){if(n.resumeId===``)throw Error(`Print mode requires an explicit session id: -r <id|name> (the interactive session picker is TUI-only)`);if(n.noSessionPersistence&&(n.continueMode||n.resumeId!==void 0))throw Error(`--no-session-persistence conflicts with -c/-r (resume needs the session store)`)}if(n.dryRun){if(n.permissionMode!==void 0&&n.permissionMode!==`plan`)throw Error(`--dry-run is an alias for --permission-mode plan and conflicts with --permission-mode ${n.permissionMode}`);return{...n,permissionMode:`plan`}}return n}function w(e,t){return e.preset??t??`default`}function T(e){return{...e.model===void 0?{}:{model:e.model},...e.systemPrompt===void 0?{}:{systemPrompt:e.systemPrompt},...e.appendSystemPrompt===void 0?{}:{appendSystemPrompt:e.appendSystemPrompt},...e.language===void 0?{}:{language:e.language},...e.permissionMode===void 0?{}:{permissionMode:e.permissionMode}}}function ne(e,t){return(0,i.resolvePreset)(w(e,t),{cliOverrides:T(e)})}function E(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function D(e,t,r,i=(0,o.createDefaultProviderDefinitions)()){let a=(0,n.resolveSettingsPathForScope)(e,E(t.settingsScope));return t.configureProvider?((0,n.applyProviderConfiguration)(a,A(t),{providerDefinitions:i}),r.writeLine(`Provider profile saved to ${a}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?((0,n.applyProviderSwitch)(t.settingsScope===void 0?(0,n.resolveProviderSettingsWriteTargetPath)(e):a,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 O(e,t,n,r,i=(0,o.createDefaultProviderDefinitions)(),a){await(0,s.ensureProviderConfig)(e,{provider:t.provider,settingsScope:E(t.settingsScope)},n,r,i,{formatError:j,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function k(e,t,n,r,i=(0,o.createDefaultProviderDefinitions)()){await(0,s.runProviderStartupSetup)(e,{settingsScope:E(t.settingsScope)},n,r,i)}function A(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 j(e=(0,o.createDefaultProviderDefinitions)()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${(0,a.formatSupportedProviderTypes)(e)}`,...e.map(M)].join(`
48
+ `)}function M(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 re(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await(0,s.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 N(e){let t=(0,f.readFileSync)(e,`utf-8`);return JSON.parse(t)}function P(e,t){return new Date(t).getTime()-new Date(e).getTime()}function F(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(I(`llm_between_tools`,`tool-end`,`tool-start`,s,r.timestamp,n)):(t.push(I(`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(I(`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(I(`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(I(`llm_final_response`,`tool-end`,`assistant`,s,r.timestamp,n)):t.push(I(`user_to_assistant`,`user`,`assistant`,a,r.timestamp,n)),c++;break}c++}r=c}else r++}return t}function I(e,t,n,r,i,a){return{kind:e,fromType:t,toType:n,fromTimestamp:r,toTimestamp:i,durationMs:P(r,i),turnIndex:a}}function L(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 R(e){let t=F(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:L(t)}}function z(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}function B(e){return new Date(e).toLocaleString(`sv-SE`,{timeZoneName:`short`}).slice(0,16)}function ie(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 ae(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 V(e){let t=[],{stats:n}=e;if(t.push(`Session: ${e.sessionId}`),t.push(`Created: ${B(e.createdAt)} | cwd: ${e.cwd}`),t.push(``),t.push(`Timing Summary:`),n.llmWaitMs.count>0&&t.push(` LLM API wait ${z(n.llmWaitMs.avg).padStart(8)} avg | ${z(n.llmWaitMs.max).padStart(8)} max`),n.toolExecMs.count>0&&t.push(` Tool execution ${z(n.toolExecMs.avg).padStart(8)} avg | ${z(n.toolExecMs.median).padStart(8)} median`),n.userToAssistantMs.count>0&&t.push(` user → assistant ${z(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} ${ie(n).padEnd(32)} ${z(n.durationMs).padStart(8)}`)}return t.push(``),t.push(ae(e)),t.join(`
49
+ `)}function H(e){let t=[];return t.push(`Analyzed ${e.sessionCount} sessions (${B(e.fromDate)} ~ ${B(e.toDate)})`),t.push(` Avg LLM response: ${z(e.avgLlmResponseMs)}`),t.push(` Avg tool exec: ${z(e.avgToolExecMs)}`),e.maxSingleDelayMs>0&&t.push(` Max single delay: ${z(e.maxSingleDelayMs)} (${e.maxSingleDelaySession}, turn ${e.maxSingleDelayTurn}, ${e.maxSingleDelayKind})`),t.join(`
50
+ `)}function U(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 W(e){try{return(0,f.readdirSync)(e).filter(e=>e.endsWith(`.json`)).map(t=>(0,p.join)(e,t))}catch{return[]}}function G(e){let t=new Map;for(let e of W((0,n.userPaths)().sessions))t.set((0,p.basename)(e),e);for(let r of W((0,n.projectPaths)(e).sessions))t.set((0,p.basename)(r),r);return[...t.entries()].sort((e,t)=>e[0].localeCompare(t[0])).map(([,e])=>e)}function K(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 q(e,t=process.cwd()){let r=U(e),i=G(t);if(i.length===0&&(process.stderr.write(`No session files found in ${(0,n.projectPaths)(t).sessions} or ${(0,n.userPaths)().sessions}\n`),process.exit(1)),r.sessionId!==void 0){let e=i.find(e=>e.includes(r.sessionId));e||(process.stderr.write(`Session not found: ${r.sessionId}\n`),process.exit(1));let t=R(N(e));process.stdout.write(V(t)+`
51
+ `);return}if(r.last!==void 0){let e=i.slice(-r.last),t=[];for(let n of e)try{t.push(R(N(n)))}catch{}t.length===0&&(process.stderr.write(`No valid sessions found.
52
+ `),process.exit(1));let n=K(t);process.stdout.write(H(n)+`
52
53
  `);return}let a=i[i.length-1];a||(process.stderr.write(`No sessions found.
53
- `),process.exit(1));let o=P(A(a));process.stdout.write(R(o)+`
54
- `)}const G=()=>(0,n.readPackageVersion)(require("url").pathToFileURL(__filename).href);async function K(e){let t=(0,p.createInterface)({input:process.stdin,output:process.stdout});try{let n=(await t.question(e)).trim().toLowerCase();return n===`y`||n===`yes`}finally{t.close()}}async function q(e,t){let r=(0,n.getUserSettingsPath)();if(!(0,d.existsSync)(r))return e.writeLine(`No user settings found.`),0;if(!t.yes){if(!t.isTTY)return e.writeError(`--reset deletes ${r}. Refusing without confirmation in non-interactive mode — pass --yes to proceed.`),1;if(!await(t.confirm??K)(`Delete ${r}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let i=(0,n.resetUserConfig)();return i.deleted?e.writeLine(`Deleted ${i.path}`):e.writeLine(`No user settings found.`),0}const J={anthropic:{host:`api.anthropic.com`,port:443},openai:{host:`api.openai.com`,port:443},gemini:{host:`generativelanguage.googleapis.com`,port:443},deepseek:{host:`api.deepseek.com`,port:443},qwen:{host:`dashscope.aliyuncs.com`,port:443}};function Y(){let[e]=process.versions.node.split(`.`).map(Number);return e!==void 0&&e>=22?{label:`Node.js version`,status:`ok`,message:`v${process.versions.node}`}:{label:`Node.js version`,status:`fail`,message:`v${process.versions.node} (requires >=22)\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22`}}function ae(e){return{label:`robota version`,status:`ok`,message:e}}function oe(e,t,r){try{let i=(0,n.readProviderSettings)(e,{providerDefinitions:t,env:r}),a=i.source===`env-default`?`env-default via ${i.sourceEnvVar??`environment`}`:`settings profile`,o=i.model===void 0?``:` (${i.model})`;return{label:`API key`,status:`ok`,message:`${i.name}${o} — ${a}`}}catch(e){return{label:`API key`,status:`fail`,message:`${e instanceof Error?e.message:String(e)}\n Set ANTHROPIC_API_KEY or run: robota --configure\n Get key: https://console.anthropic.com/settings/keys`}}}function se(e){try{return JSON.parse((0,d.readFileSync)(e,`utf-8`)),`ok`}catch{return`corrupt`}}function ce(e){let t=(0,n.getProviderSettingsPaths)(e).filter(e=>(0,d.existsSync)(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>se(e)===`corrupt`?{label:`Settings file`,status:`fail`,message:`${e} — invalid JSON\n Fix or delete the file, or run: robota --configure`}:{label:`Settings file`,status:`ok`,message:e})}function le(e){try{let t=JSON.parse((0,d.readFileSync)(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function ue(e){let t=(0,f.join)(e,`.robota`,`settings.json`),n=(0,f.join)(process.env.HOME??``,`.robota`,`settings.json`),r=(0,d.existsSync)(t)?t:(0,d.existsSync)(n)?n:void 0;if(r!==void 0){let e=(le(r)??``).toLowerCase(),t=Object.entries(J).find(([t])=>e.startsWith(t));if(t)return t[1]}return J.anthropic}function de(){let e=process.env.TERM_PROGRAM??`unknown`;return process.platform===`darwin`&&e===`Apple_Terminal`?{label:`Terminal`,status:`warn`,message:`macOS Terminal.app — CJK/IME input may be unstable
55
- Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function fe(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=(0,m.createConnection)({host:e.host,port:e.port}),a=setTimeout(()=>{i.destroy(),n({label:t,status:`fail`,message:`timeout (3s)`})},3e3);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({label:t,status:`ok`,message:`reachable (${Date.now()-r}ms)`})}),i.on(`error`,e=>{clearTimeout(a),n({label:t,status:`warn`,message:`${e.message}\n Check proxy settings or firewall`})})})}async function pe(e,t={checkNetwork:fe}){e.terminal.writeLine(`
54
+ `),process.exit(1));let o=R(N(a));process.stdout.write(V(o)+`
55
+ `)}const J=()=>(0,n.readPackageVersion)(require("url").pathToFileURL(__filename).href);async function oe(e){let t=(0,m.createInterface)({input:process.stdin,output:process.stdout});try{let n=(await t.question(e)).trim().toLowerCase();return n===`y`||n===`yes`}finally{t.close()}}async function se(e,t){let r=(0,n.getUserSettingsPath)();if(!(0,f.existsSync)(r))return e.writeLine(`No user settings found.`),0;if(!t.yes){if(!t.isTTY)return e.writeError(`--reset deletes ${r}. Refusing without confirmation in non-interactive mode — pass --yes to proceed.`),1;if(!await(t.confirm??oe)(`Delete ${r}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let i=(0,n.resetUserConfig)();return i.deleted?e.writeLine(`Deleted ${i.path}`):e.writeLine(`No user settings found.`),0}const Y={anthropic:{host:`api.anthropic.com`,port:443},openai:{host:`api.openai.com`,port:443},gemini:{host:`generativelanguage.googleapis.com`,port:443},deepseek:{host:`api.deepseek.com`,port:443},qwen:{host:`dashscope.aliyuncs.com`,port:443}};function ce(){let[e]=process.versions.node.split(`.`).map(Number);return e!==void 0&&e>=22?{label:`Node.js version`,status:`ok`,message:`v${process.versions.node}`}:{label:`Node.js version`,status:`fail`,message:`v${process.versions.node} (requires >=22)\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22`}}function le(e){return{label:`robota version`,status:`ok`,message:e}}function ue(e,t,r){try{let i=(0,n.readProviderSettings)(e,{providerDefinitions:t,env:r}),a=i.source===`env-default`?`env-default via ${i.sourceEnvVar??`environment`}`:`settings profile`,o=i.model===void 0?``:` (${i.model})`;return{label:`API key`,status:`ok`,message:`${i.name}${o} — ${a}`}}catch(e){return{label:`API key`,status:`fail`,message:`${e instanceof Error?e.message:String(e)}\n Set ANTHROPIC_API_KEY or run: robota --configure\n Get key: https://console.anthropic.com/settings/keys`}}}function de(e){try{return JSON.parse((0,f.readFileSync)(e,`utf-8`)),`ok`}catch{return`corrupt`}}function fe(e){let t=(0,n.getProviderSettingsPaths)(e).filter(e=>(0,f.existsSync)(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>de(e)===`corrupt`?{label:`Settings file`,status:`fail`,message:`${e} — invalid JSON\n Fix or delete the file, or run: robota --configure`}:{label:`Settings file`,status:`ok`,message:e})}function pe(e){try{let t=JSON.parse((0,f.readFileSync)(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function me(e){let t=(0,p.join)(e,`.robota`,`settings.json`),n=(0,p.join)(process.env.HOME??``,`.robota`,`settings.json`),r=(0,f.existsSync)(t)?t:(0,f.existsSync)(n)?n:void 0;if(r!==void 0){let e=(pe(r)??``).toLowerCase(),t=Object.entries(Y).find(([t])=>e.startsWith(t));if(t)return t[1]}return Y.anthropic}function he(){let e=process.env.TERM_PROGRAM??`unknown`;return process.platform===`darwin`&&e===`Apple_Terminal`?{label:`Terminal`,status:`warn`,message:`macOS Terminal.app — CJK/IME input may be unstable
56
+ Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function ge(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=(0,h.createConnection)({host:e.host,port:e.port}),a=setTimeout(()=>{i.destroy(),n({label:t,status:`fail`,message:`timeout (3s)`})},3e3);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({label:t,status:`ok`,message:`reachable (${Date.now()-r}ms)`})}),i.on(`error`,e=>{clearTimeout(a),n({label:t,status:`warn`,message:`${e.message}\n Check proxy settings or firewall`})})})}async function _e(e,t={checkNetwork:ge}){e.terminal.writeLine(`
56
57
  robota diagnose
57
- `);let n=ue(e.cwd),r=t.providerDefinitions??(0,a.createDefaultProviderDefinitions)(),i=t.env??process.env,o=[Y(),ae(e.version),oe(e.cwd,r,i),...ce(e.cwd),de(),await t.checkNetwork(n)],s=0,c=0;for(let t of o){let n=t.status===`ok`?`✓`:t.status===`warn`?`⚠`:`✗`,r=t.message.split(`
58
- `);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&s++,t.status===`warn`&&c++}return e.terminal.writeLine(``),s===0&&c===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):s>0?e.terminal.writeLine(`✗ ${s} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${c} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),s}const X=`robota`,Z={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function me(e){let t=(0,f.join)(e,`settings.json`);if(!(0,d.existsSync)(t))return{};let n=(0,d.readFileSync)(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var he=class extends Error{constructor(e){super(`Cannot ask "${e}" in a non-interactive shell. Re-run with --yes to accept the defaults.`),this.name=`InitPromptUnavailableError`}};async function Q(e,t,n){if(n.yes||n.ci)return n.terminal.writeLine(`${e} → ${t?`Y`:`N`} (${n.yes?`--yes`:`CI`}: using default)`),t;if(!n.isTTY)throw new he(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function ge(e,r,i={}){r.writeLine(``),r.writeLine(`${X} project initialization`),r.writeLine(`─`.repeat(40));let a={yes:i.yes===!0,ci:i.ci??process.env.CI===`true`,isTTY:i.isTTY??process.stdin.isTTY===!0,promptFn:i.promptFn??t.promptInput,terminal:r},o=(0,n.projectPaths)(e).settings,s=(0,f.dirname)(o),c=(0,f.join)(e,`AGENTS.md`),l=(0,f.join)(e,`.claude`),u=(0,d.existsSync)(l),p=(0,d.existsSync)(o),m=(0,d.existsSync)(c);if(p&&m&&(r.writeLine(``),r.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await Q(`Overwrite existing files?`,!1,a))){r.writeLine(`Init cancelled.`);return}let h={...Z};if(u&&(r.writeLine(``),r.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await Q(`Migrate Claude Code settings to .robota/?`,!1,a))){let e=me(l);if(e===null)r.writeLine(`Warning: .claude/settings.json could not be parsed — skipping migration.`);else{let t=e.permissions;h={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...Z.permissions.allow,...t?.allow??[]],deny:t?.deny??[]}},r.writeLine(`Settings imported from .claude/settings.json.`)}}(0,d.mkdirSync)(s,{recursive:!0}),(0,d.writeFileSync)(o,JSON.stringify(h,null,2)+`
59
- `,`utf8`),r.writeLine(``),r.writeLine(`Created: .robota/settings.json`),(0,d.writeFileSync)(c,`# AGENTS.md — Project Agent Guidelines
58
+ `);let n=me(e.cwd),r=t.providerDefinitions??(0,o.createDefaultProviderDefinitions)(),i=t.env??process.env,a=[ce(),le(e.version),ue(e.cwd,r,i),...fe(e.cwd),he(),await t.checkNetwork(n)],s=0,c=0;for(let t of a){let n=t.status===`ok`?`✓`:t.status===`warn`?`⚠`:`✗`,r=t.message.split(`
59
+ `);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&s++,t.status===`warn`&&c++}return e.terminal.writeLine(``),s===0&&c===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):s>0?e.terminal.writeLine(`✗ ${s} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${c} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),s}const X=`robota`,Z={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function ve(e){let t=(0,p.join)(e,`settings.json`);if(!(0,f.existsSync)(t))return{};let n=(0,f.readFileSync)(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var ye=class extends Error{constructor(e){super(`Cannot ask "${e}" in a non-interactive shell. Re-run with --yes to accept the defaults.`),this.name=`InitPromptUnavailableError`}};async function Q(e,t,n){if(n.yes||n.ci)return n.terminal.writeLine(`${e} → ${t?`Y`:`N`} (${n.yes?`--yes`:`CI`}: using default)`),t;if(!n.isTTY)throw new ye(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function be(e,r,i={}){r.writeLine(``),r.writeLine(`${X} project initialization`),r.writeLine(`─`.repeat(40));let a={yes:i.yes===!0,ci:i.ci??process.env.CI===`true`,isTTY:i.isTTY??process.stdin.isTTY===!0,promptFn:i.promptFn??t.promptInput,terminal:r},o=(0,n.projectPaths)(e).settings,s=(0,p.dirname)(o),c=(0,p.join)(e,`AGENTS.md`),l=(0,p.join)(e,`.claude`),u=(0,f.existsSync)(l),d=(0,f.existsSync)(o),m=(0,f.existsSync)(c);if(d&&m&&(r.writeLine(``),r.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await Q(`Overwrite existing files?`,!1,a))){r.writeLine(`Init cancelled.`);return}let h={...Z};if(u&&(r.writeLine(``),r.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await Q(`Migrate Claude Code settings to .robota/?`,!1,a))){let e=ve(l);if(e===null)r.writeLine(`Warning: .claude/settings.json could not be parsed — skipping migration.`);else{let t=e.permissions;h={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...Z.permissions.allow,...t?.allow??[]],deny:t?.deny??[]}},r.writeLine(`Settings imported from .claude/settings.json.`)}}(0,f.mkdirSync)(s,{recursive:!0}),(0,f.writeFileSync)(o,JSON.stringify(h,null,2)+`
60
+ `,`utf8`),r.writeLine(``),r.writeLine(`Created: .robota/settings.json`),(0,f.writeFileSync)(c,`# AGENTS.md — Project Agent Guidelines
60
61
 
61
62
  This file guides the AI agent working in this project. Customize it for your project.
62
63
 
@@ -86,7 +87,7 @@ npm run build
86
87
  ## Important Notes
87
88
 
88
89
  <!-- Anything the agent should know before making changes -->
89
- `,`utf8`),r.writeLine(`Created: AGENTS.md`),r.writeLine(``),r.writeLine(`Initialization complete.`),r.writeLine(``),r.writeLine(`Next steps:`),r.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),r.writeLine(` 2. Run \`${X} --configure\` to set up your AI provider`),r.writeLine(` 3. Run \`${X}\` to start the assistant`),r.writeLine(``),i.onProviderSetup!==void 0&&(a.isTTY||a.yes||a.ci)&&await Q(`Would you like to set up a provider now?`,!1,a)&&await i.onProviderSetup()}function _e(e=(0,n.userPaths)().onboarded){return!(0,d.existsSync)(e)}function ve(e=(0,n.userPaths)().onboarded){(0,d.mkdirSync)((0,f.dirname)(e),{recursive:!0}),(0,d.writeFileSync)(e,new Date().toISOString())}const ye=`
90
+ `,`utf8`),r.writeLine(`Created: AGENTS.md`),r.writeLine(``),r.writeLine(`Initialization complete.`),r.writeLine(``),r.writeLine(`Next steps:`),r.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),r.writeLine(` 2. Run \`${X} --configure\` to set up your AI provider`),r.writeLine(` 3. Run \`${X}\` to start the assistant`),r.writeLine(``),i.onProviderSetup!==void 0&&(a.isTTY||a.yes||a.ci)&&await Q(`Would you like to set up a provider now?`,!1,a)&&await i.onProviderSetup()}function xe(e=(0,n.userPaths)().onboarded){return!(0,f.existsSync)(e)}function Se(e=(0,n.userPaths)().onboarded){(0,f.mkdirSync)((0,p.dirname)(e),{recursive:!0}),(0,f.writeFileSync)(e,new Date().toISOString())}const $=`
90
91
  ╭─────────────────────────────────────────────────────────────╮
91
92
  │ Welcome to ${X}! — AI coding assistant │
92
93
  │ │
@@ -103,11 +104,11 @@ npm run build
103
104
  │ │
104
105
  │ ${X} diagnose — check your setup │
105
106
  ╰─────────────────────────────────────────────────────────────╯
106
- `;function be(e){e.writeLine(ye)}function $(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
107
+ `;function Ce(e){e.writeLine($)}function we(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
107
108
  ⚠ macOS Terminal.app detected: CJK/IME input may be unstable.
108
109
  Recommended: use iTerm2 (https://iterm2.com) for Korean/Japanese/Chinese input.
109
110
  Or use headless mode: robota -p "your prompt"
110
- `)}function xe(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 Se(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 Ce(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(Se(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(`
111
+ `)}function Te(e,t,r,i,a={}){let c={settings:{read:()=>(0,n.readSettings)((0,n.getUserSettingsPath)()),write:e=>(0,n.writeSettings)((0,n.getUserSettingsPath)(),e)},plugin:(0,s.createDefaultPluginCommandAdapter)(e)},l=r.providerDefinitions??(0,o.createDefaultProviderDefinitions)();return{commandHostAdapters:c,providerDefinitions:l,commandModules:[...(0,s.createDefaultCommandModules)({cwd:e,providerDefinitions:l,providerSettingsAdapter:{readMergedSettings:()=>(0,n.readMergedProviderSettings)(e),readTargetSettings:()=>(0,n.readSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e)),writeTargetSettings:t=>(0,n.writeSettings)((0,n.resolveProviderSettingsWriteTargetPath)(e),t)},...a.enabledCommandModules===void 0?{}:{enabledCommandModules:a.enabledCommandModules},...a.disabledCommandModules===void 0?{}:{disabledCommandModules:a.disabledCommandModules}}),...r.commandModules??[]],startupUpdateNoticePromise:(0,n.shouldRunStartupCliUpdateCheck)(t)?(0,n.getStartupCliUpdateNotice)({currentVersion:i}):void 0}}function Ee(e,t){let n=(0,f.readFileSync)((0,p.resolve)(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function De(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(Ee(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(`
111
112
 
112
- `):void 0}async function we(e,n,r,i,a,o,s,c,l={}){let u=n.positional.join(` `).trim();if(!u&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);u=Buffer.concat(e).toString(`utf-8`).trim()}u||(process.stderr.write(`Print mode (-p) requires a prompt argument.
113
- `),process.exit(1));let d=Ce(e,n),f=new t.HeadlessInteractionChannel({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:v(n.allowedTools),deniedTools:v(n.deniedTools),appendSystemPrompt:d,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await f.run(u),process.exit(f.getExitCode())}async function Te(r={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await W(process.argv.slice(4),process.cwd());return}let i;try{i=w()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=G();if(i.help){process.stdout.write(_());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){process.exitCode=await q(f,{yes:i.yes,isTTY:process.stdin.isTTY===!0});return}if(i.positional[0]===`diagnose`){let e=await pe({version:a,terminal:f,cwd:d});process.exitCode=+(e>0);return}if(i.positional[0]===`session`&&i.positional[1]===`analyze`){await W(process.argv.slice(4),d);return}try{if(await ne(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:p,providerDefinitions:m,commandModules:h,startupUpdateNoticePromise:g}=xe(d,i,r,a);if(i.positional[0]===`init`){try{await ge(d,f,{yes:i.yes,onProviderSetup:async()=>{await E(d,i,t.promptInput,f,m)}})}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(i.configure){await E(d,i,t.promptInput,f,m);return}if(ee(d,i,f,m))return;try{await te(d,i,t.promptInput,f,m)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof n.ProviderConfigError&&i.printMode?3:1)}let y=i.provider?{providerOverride:i.provider,providerDefinitions:m}:{providerDefinitions:m},b=(0,n.readProviderSettings)(d,y),x=i.model??b.model;if(b.source===`env-default`&&b.sourceEnvVar!==void 0){let e=`Using ${b.name} (${x}) via ${b.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;i.printMode?process.stderr.write(e):f.writeLine(e.trimEnd())}let S=(0,n.createProviderFromSettings)(d,i.model,y),C=(0,l.createDefaultBackgroundTaskRunners)(),T=(0,n.projectPaths)(d),D=(0,u.createChildProcessSubagentRunnerFactory)({workerPath:(0,u.getDefaultSubagentWorkerPath)(),providerConfig:{...b,model:x},logsDir:T.logs}),O=(0,n.createProjectSessionStore)(d),k,A=!1;if(i.continueMode?k=(0,n.resolveLatestSessionId)(O,d):i.resumeId!==void 0&&(i.resumeId===``?A=!0:(k=(0,n.resolveSessionIdByIdOrName)(O,i.resumeId),k===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await we(d,i,S,O,C,D,h,p,{resumeSessionId:k,forkSession:i.forkSession});return}$(f),_e()&&(be(f),ve()),await(0,s.renderApp)({cwd:d,provider:S,providerOverride:i.provider,providerType:b.name,modelId:x,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,allowedTools:v(i.allowedTools),deniedTools:v(i.deniedTools),version:a,sessionStore:i.noSessionPersistence?void 0:O,resumeSessionId:k,showSessionPickerOnStart:A,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:C,subagentRunnerFactory:D,commandModules:h,commandHostAdapters:p,shellExec:t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:g?g.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=Te;
113
+ `):void 0}async function Oe(e,n,r,i,a,o,s,c,l={},u={}){let d=n.positional.join(` `).trim();if(!d&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);d=Buffer.concat(e).toString(`utf-8`).trim()}d||(process.stderr.write(`Print mode (-p) requires a prompt argument.
114
+ `),process.exit(1));let f=De(e,n),p=new t.HeadlessInteractionChannel({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??u.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:v(n.allowedTools),deniedTools:v(n.deniedTools),appendSystemPrompt:f,...u.persona===void 0?{}:{persona:u.persona},...u.agentName===void 0?{}:{agentName:u.agentName},...u.activePresetId===void 0?{}:{activePresetId:u.activePresetId},...u.enableParallelSubagents===void 0?{}:{enableParallelSubagents:u.enableParallelSubagents},...u.selfVerification===void 0?{}:{selfVerification:u.selfVerification},...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await p.run(d),process.exit(p.getExitCode())}async function ke(r={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await q(process.argv.slice(4),process.cwd());return}let a;try{a=te()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let o=J();if(a.help){process.stdout.write(ee());return}if(a.version){process.stdout.write(`robota ${o}\n`);return}if(a.checkUpdate){let e=await(0,n.checkForCliUpdate)({currentVersion:o,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 f=process.cwd(),p=new t.PrintTerminal;if(a.reset){process.exitCode=await se(p,{yes:a.yes,isTTY:process.stdin.isTTY===!0});return}if(a.positional[0]===`diagnose`){let e=await _e({version:o,terminal:p,cwd:f});process.exitCode=+(e>0);return}if(a.positional[0]===`session`&&a.positional[1]===`analyze`){await q(process.argv.slice(4),f);return}try{if(await re(a,f,p))return}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let m=(0,n.readSettings)((0,n.getUserSettingsPath)()),h=typeof m.preset==`string`?m.preset:void 0,g=(0,i.loadExternalPresets)();for(let{file:e,error:t}of g.errors)p.writeError(`Skipped external preset "${e}": ${t}`);let _;try{_=ne(a,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let y=w(a,h),{commandHostAdapters:b,providerDefinitions:x,commandModules:S,startupUpdateNoticePromise:C}=Te(f,a,r,o,{..._.enabledCommandModules===void 0?{}:{enabledCommandModules:_.enabledCommandModules},..._.disabledCommandModules===void 0?{}:{disabledCommandModules:_.disabledCommandModules}});if(a.positional[0]===`init`){try{await be(f,p,{yes:a.yes,onProviderSetup:async()=>{await k(f,a,t.promptInput,p,x)}})}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(a.configure){await k(f,a,t.promptInput,p,x);return}if(D(f,a,p,x))return;try{await O(f,a,t.promptInput,p,x)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof n.ProviderConfigError&&a.printMode?3:1)}let T=a.provider?{providerOverride:a.provider,providerDefinitions:x}:{providerDefinitions:x},E=(0,n.readProviderSettings)(f,T),A=_.model??E.model;if(E.source===`env-default`&&E.sourceEnvVar!==void 0){let e=`Using ${E.name} (${A}) via ${E.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;a.printMode?process.stderr.write(e):p.writeLine(e.trimEnd())}let j=(0,n.createProviderFromSettings)(f,_.model,T),M=(0,u.createDefaultBackgroundTaskRunners)(),N=(0,n.projectPaths)(f),P=(0,d.createChildProcessSubagentRunnerFactory)({workerPath:(0,d.getDefaultSubagentWorkerPath)(),providerConfig:{...E,model:A},logsDir:N.logs}),F=(0,n.createProjectSessionStore)(f),I,L=!1;if(a.continueMode?I=(0,n.resolveLatestSessionId)(F,f):a.resumeId!==void 0&&(a.resumeId===``?L=!0:(I=(0,n.resolveSessionIdByIdOrName)(F,a.resumeId),I===void 0&&(process.stderr.write(`Session not found: ${a.resumeId}\n`),process.exit(1)))),a.printMode){await Oe(f,a,j,F,M,P,S,b,{resumeSessionId:I,forkSession:a.forkSession},{agentName:_.agentName??i.DEFAULT_AGENT_NAME,activePresetId:y,persona:_.persona,..._.permissionMode===void 0?{}:{permissionMode:_.permissionMode},..._.enableParallelSubagents===void 0?{}:{enableParallelSubagents:_.enableParallelSubagents},..._.selfVerification===void 0?{}:{selfVerification:_.selfVerification}});return}we(p),xe()&&(Ce(p),Se()),await(0,c.renderApp)({cwd:f,provider:j,providerOverride:a.provider,providerType:E.name,modelId:A,language:a.language,permissionMode:a.permissionMode??_.permissionMode,maxTurns:a.maxTurns,allowedTools:v(a.allowedTools),deniedTools:v(a.deniedTools),version:o,sessionStore:a.noSessionPersistence?void 0:F,resumeSessionId:I,showSessionPickerOnStart:L,forkSession:a.forkSession,sessionName:a.sessionName,backgroundTaskRunners:M,subagentRunnerFactory:P,commandModules:S,commandHostAdapters:b,shellExec:t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:C?C.then(e=>e?(0,n.formatCliUpdateNotice)(e):void 0):void 0,transportRegistry:(0,l.createDefaultTransportRegistry)(),cliAdapter:(0,c.createDefaultTuiCliAdapter)({providerDefinitions:x,reloadPluginCommandSource:s.reloadPluginCommandSource}),reloadPluginCommandSource:s.reloadPluginCommandSource,agentName:_.agentName??i.DEFAULT_AGENT_NAME,activePresetId:y,persona:_.persona,..._.enableParallelSubagents===void 0?{}:{enableParallelSubagents:_.enableParallelSubagents},..._.selfVerification===void 0?{}:{selfVerification:_.selfVerification}}),process.exit(0)}exports.startCli=ke;
@@ -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;;;iBCwB9B,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;;;iBC6B9B,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{ProviderConfigError as i,applyProviderConfiguration as a,applyProviderSwitch as o,checkForCliUpdate as s,createProjectSessionStore as c,createProviderFromSettings as l,formatCliUpdateCheckMessage as u,formatCliUpdateNotice as d,getProviderSettingsPaths as f,getStartupCliUpdateNotice as p,getUserSettingsPath as m,projectPaths as h,readMergedProviderSettings as g,readPackageVersion as _,readProviderSettings as v,readSettings as y,resetUserConfig as b,resolveLatestSessionId as ee,resolveProviderSettingsWriteTargetPath as x,resolveSessionIdByIdOrName as te,resolveSettingsPathForScope as S,shouldRunStartupCliUpdateCheck as C,userPaths as w,writeSettings as T}from"@robota-sdk/agent-framework";import{parseArgs as E}from"node:util";import{formatSupportedProviderTypes as D}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as O}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as k,createDefaultPluginCommandAdapter as ne,ensureProviderConfig as re,executeUserLocalDirectCommand as ie,reloadPluginCommandSource as A,runProviderStartupSetup as ae}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as oe,renderApp as se}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as ce}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as le}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as ue,getDefaultSubagentWorkerPath as de}from"@robota-sdk/agent-subagent-runner";import{existsSync as j,mkdirSync as M,readFileSync as N,readdirSync as fe,writeFileSync as P}from"node:fs";import{basename as F,dirname as I,join as L,resolve as pe}from"node:path";import{createInterface as me}from"node:readline/promises";import{createConnection as he}from"node:net";const R=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],z=[`text`,`json`,`stream-json`];function ge(){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{ProviderConfigError as i,applyProviderConfiguration as a,applyProviderSwitch as o,checkForCliUpdate as s,createProjectSessionStore as c,createProviderFromSettings as l,formatCliUpdateCheckMessage as u,formatCliUpdateNotice as d,getProviderSettingsPaths as f,getStartupCliUpdateNotice as p,getUserSettingsPath as m,projectPaths as h,readMergedProviderSettings as g,readPackageVersion as _,readProviderSettings as ee,readSettings as v,resetUserConfig as y,resolveLatestSessionId as te,resolveProviderSettingsWriteTargetPath as b,resolveSessionIdByIdOrName as ne,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{DEFAULT_AGENT_NAME as E,loadExternalPresets as re,resolvePreset as D}from"@robota-sdk/agent-preset";import{formatSupportedProviderTypes as O}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as k}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as A,createDefaultPluginCommandAdapter as j,ensureProviderConfig as M,executeUserLocalDirectCommand as N,reloadPluginCommandSource as ie,runProviderStartupSetup as P}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as ae,renderApp as oe}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as se}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as ce}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as le,getDefaultSubagentWorkerPath as ue}from"@robota-sdk/agent-subagent-runner";import{existsSync as F,mkdirSync as I,readFileSync as L,readdirSync as de,writeFileSync as R}from"node:fs";import{basename as z,dirname as B,join as V,resolve as fe}from"node:path";import{createInterface as pe}from"node:readline/promises";import{createConnection as me}from"node:net";const H=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],U=[`text`,`json`,`stream-json`];function he(){return`
2
2
  Usage: robota [options] [-p <prompt>]
3
3
 
4
4
  Options:
@@ -21,6 +21,7 @@ Options:
21
21
  --allowed-tools <list> Comma-separated tool allowlist (TUI and print mode)
22
22
  --denied-tools <list> Comma-separated tool denylist (TUI and print mode)
23
23
  --model <model> Model override for this run
24
+ --preset <id> Preset id to apply (default: settings.preset or "default")
24
25
  --json-schema <schema> Print mode: instruct the model to respond with JSON matching this schema
25
26
  --dry-run Alias for --permission-mode plan (plan only, no execution)
26
27
  --reset Delete ~/.robota/settings.json (provider profiles and preferences).
@@ -43,20 +44,20 @@ Examples:
43
44
  robota --task-file task.md Run task from file (appended to system prompt)
44
45
  robota -p "Refactor the auth module" --dry-run Plan only, no execution
45
46
  robota --continue Resume the last session
46
- `}function B(e){if(e===void 0)return;let t=e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}function _e(e){if(e!==void 0){if(!z.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${z.join(` | `)}`);return e}}function ve(e){if(e!==void 0){if(!R.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${R.join(` | `)}`);return e}}function ye(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 be={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 xe(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:ve(e[`permission-mode`]),maxTurns:ye(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:_e(e[`output-format`]),format:e.format,summary:e.summary,source:e.source,systemPrompt:e[`system-prompt`],appendSystemPrompt:e[`append-system-prompt`],taskFile:e[`task-file`],version:e.version??!1,reset:e.reset??!1,bare:e.bare??!1,allowedTools:e[`allowed-tools`],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 Se(){let{values:e,positionals:t}=E(be),n=xe(e,t);if(n.printMode){if(n.resumeId===``)throw Error(`Print mode requires an explicit session id: -r <id|name> (the interactive session picker is TUI-only)`);if(n.noSessionPersistence&&(n.continueMode||n.resumeId!==void 0))throw Error(`--no-session-persistence conflicts with -c/-r (resume needs the session store)`)}if(n.dryRun){if(n.permissionMode!==void 0&&n.permissionMode!==`plan`)throw Error(`--dry-run is an alias for --permission-mode plan and conflicts with --permission-mode ${n.permissionMode}`);return{...n,permissionMode:`plan`}}return n}function V(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=O()){let i=S(e,V(t.settingsScope));return t.configureProvider?(a(i,Te(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${i}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(o(t.settingsScope===void 0?x(e):i,t.provider,{knownProviders:g(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function we(e,t,n,r,i=O(),a){await re(e,{provider:t.provider,settingsScope:V(t.settingsScope)},n,r,i,{formatError:Ee,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function H(e,t,n,r,i=O()){await ae(e,{settingsScope:V(t.settingsScope)},n,r,i)}function Te(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 Ee(e=O()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${D(e)}`,...e.map(De)].join(`
47
- `)}function De(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 Oe(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await ie({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 U(e){let t=N(e,`utf-8`);return JSON.parse(t)}function ke(e,t){return new Date(t).getTime()-new Date(e).getTime()}function Ae(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(W(`llm_between_tools`,`tool-end`,`tool-start`,s,r.timestamp,n)):(t.push(W(`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(W(`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(W(`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(W(`llm_final_response`,`tool-end`,`assistant`,s,r.timestamp,n)):t.push(W(`user_to_assistant`,`user`,`assistant`,a,r.timestamp,n)),c++;break}c++}r=c}else r++}return t}function W(e,t,n,r,i,a){return{kind:e,fromType:t,toType:n,fromTimestamp:r,toTimestamp:i,durationMs:ke(r,i),turnIndex:a}}function je(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 G(e){let t=Ae(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:je(t)}}function K(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}function q(e){return new Date(e).toLocaleString(`sv-SE`,{timeZoneName:`short`}).slice(0,16)}function Me(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 Ne(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 J(e){let t=[],{stats:n}=e;if(t.push(`Session: ${e.sessionId}`),t.push(`Created: ${q(e.createdAt)} | cwd: ${e.cwd}`),t.push(``),t.push(`Timing Summary:`),n.llmWaitMs.count>0&&t.push(` LLM API wait ${K(n.llmWaitMs.avg).padStart(8)} avg | ${K(n.llmWaitMs.max).padStart(8)} max`),n.toolExecMs.count>0&&t.push(` Tool execution ${K(n.toolExecMs.avg).padStart(8)} avg | ${K(n.toolExecMs.median).padStart(8)} median`),n.userToAssistantMs.count>0&&t.push(` user → assistant ${K(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} ${Me(n).padEnd(32)} ${K(n.durationMs).padStart(8)}`)}return t.push(``),t.push(Ne(e)),t.join(`
48
- `)}function Pe(e){let t=[];return t.push(`Analyzed ${e.sessionCount} sessions (${q(e.fromDate)} ~ ${q(e.toDate)})`),t.push(` Avg LLM response: ${K(e.avgLlmResponseMs)}`),t.push(` Avg tool exec: ${K(e.avgToolExecMs)}`),e.maxSingleDelayMs>0&&t.push(` Max single delay: ${K(e.maxSingleDelayMs)} (${e.maxSingleDelaySession}, turn ${e.maxSingleDelayTurn}, ${e.maxSingleDelayKind})`),t.join(`
49
- `)}function Fe(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 Y(e){try{return fe(e).filter(e=>e.endsWith(`.json`)).map(t=>L(e,t))}catch{return[]}}function Ie(e){let t=new Map;for(let e of Y(w().sessions))t.set(F(e),e);for(let n of Y(h(e).sessions))t.set(F(n),n);return[...t.entries()].sort((e,t)=>e[0].localeCompare(t[0])).map(([,e])=>e)}function Le(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 X(e,t=process.cwd()){let n=Fe(e),r=Ie(t);if(r.length===0&&(process.stderr.write(`No session files found in ${h(t).sessions} or ${w().sessions}\n`),process.exit(1)),n.sessionId!==void 0){let e=r.find(e=>e.includes(n.sessionId));e||(process.stderr.write(`Session not found: ${n.sessionId}\n`),process.exit(1));let t=G(U(e));process.stdout.write(J(t)+`
50
- `);return}if(n.last!==void 0){let e=r.slice(-n.last),t=[];for(let n of e)try{t.push(G(U(n)))}catch{}t.length===0&&(process.stderr.write(`No valid sessions found.
51
- `),process.exit(1));let i=Le(t);process.stdout.write(Pe(i)+`
47
+ `}function W(e){if(e===void 0)return;let t=e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}function ge(e){if(e!==void 0){if(!U.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${U.join(` | `)}`);return e}}function _e(e){if(e!==void 0){if(!H.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${H.join(` | `)}`);return e}}function ve(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 ye={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`},preset:{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 be(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(e[`permission-mode`]),maxTurns:ve(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:ge(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,preset:e.preset,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 xe(){let{values:e,positionals:t}=T(ye),n=be(e,t);if(n.printMode){if(n.resumeId===``)throw Error(`Print mode requires an explicit session id: -r <id|name> (the interactive session picker is TUI-only)`);if(n.noSessionPersistence&&(n.continueMode||n.resumeId!==void 0))throw Error(`--no-session-persistence conflicts with -c/-r (resume needs the session store)`)}if(n.dryRun){if(n.permissionMode!==void 0&&n.permissionMode!==`plan`)throw Error(`--dry-run is an alias for --permission-mode plan and conflicts with --permission-mode ${n.permissionMode}`);return{...n,permissionMode:`plan`}}return n}function G(e,t){return e.preset??t??`default`}function Se(e){return{...e.model===void 0?{}:{model:e.model},...e.systemPrompt===void 0?{}:{systemPrompt:e.systemPrompt},...e.appendSystemPrompt===void 0?{}:{appendSystemPrompt:e.appendSystemPrompt},...e.language===void 0?{}:{language:e.language},...e.permissionMode===void 0?{}:{permissionMode:e.permissionMode}}}function Ce(e,t){return D(G(e,t),{cliOverrides:Se(e)})}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 we(e,t,n,r=k()){let i=x(e,K(t.settingsScope));return t.configureProvider?(a(i,De(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${i}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(o(t.settingsScope===void 0?b(e):i,t.provider,{knownProviders:g(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function Te(e,t,n,r,i=k(),a){await M(e,{provider:t.provider,settingsScope:K(t.settingsScope)},n,r,i,{formatError:Oe,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function Ee(e,t,n,r,i=k()){await P(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 Oe(e=k()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${O(e)}`,...e.map(ke)].join(`
48
+ `)}function ke(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 N({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=L(e,`utf-8`);return JSON.parse(t)}function je(e,t){return new Date(t).getTime()-new Date(e).getTime()}function Me(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:je(r,i),turnIndex:a}}function Ne(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=Me(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:Ne(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 Pe(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 Fe(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 Ie(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} ${Pe(n).padEnd(32)} ${X(n.durationMs).padStart(8)}`)}return t.push(``),t.push(Fe(e)),t.join(`
49
+ `)}function Le(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(`
50
+ `)}function Re(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 ze(e){try{return de(e).filter(e=>e.endsWith(`.json`)).map(t=>V(e,t))}catch{return[]}}function Be(e){let t=new Map;for(let e of ze(C().sessions))t.set(z(e),e);for(let n of ze(h(e).sessions))t.set(z(n),n);return[...t.entries()].sort((e,t)=>e[0].localeCompare(t[0])).map(([,e])=>e)}function Ve(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 He(e,t=process.cwd()){let n=Re(e),r=Be(t);if(r.length===0&&(process.stderr.write(`No session files found in ${h(t).sessions} or ${C().sessions}\n`),process.exit(1)),n.sessionId!==void 0){let e=r.find(e=>e.includes(n.sessionId));e||(process.stderr.write(`Session not found: ${n.sessionId}\n`),process.exit(1));let t=Y(q(e));process.stdout.write(Ie(t)+`
51
+ `);return}if(n.last!==void 0){let e=r.slice(-n.last),t=[];for(let n of e)try{t.push(Y(q(n)))}catch{}t.length===0&&(process.stderr.write(`No valid sessions found.
52
+ `),process.exit(1));let i=Ve(t);process.stdout.write(Le(i)+`
52
53
  `);return}let i=r[r.length-1];i||(process.stderr.write(`No sessions found.
53
- `),process.exit(1));let a=G(U(i));process.stdout.write(J(a)+`
54
- `)}const Re=()=>_(import.meta.url);async function ze(e){let t=me({input:process.stdin,output:process.stdout});try{let n=(await t.question(e)).trim().toLowerCase();return n===`y`||n===`yes`}finally{t.close()}}async function Be(e,t){let n=m();if(!j(n))return e.writeLine(`No user settings found.`),0;if(!t.yes){if(!t.isTTY)return e.writeError(`--reset deletes ${n}. Refusing without confirmation in non-interactive mode — pass --yes to proceed.`),1;if(!await(t.confirm??ze)(`Delete ${n}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let r=b();return r.deleted?e.writeLine(`Deleted ${r.path}`):e.writeLine(`No user settings found.`),0}const Z={anthropic:{host:`api.anthropic.com`,port:443},openai:{host:`api.openai.com`,port:443},gemini:{host:`generativelanguage.googleapis.com`,port:443},deepseek:{host:`api.deepseek.com`,port:443},qwen:{host:`dashscope.aliyuncs.com`,port:443}};function Ve(){let[e]=process.versions.node.split(`.`).map(Number);return e!==void 0&&e>=22?{label:`Node.js version`,status:`ok`,message:`v${process.versions.node}`}:{label:`Node.js version`,status:`fail`,message:`v${process.versions.node} (requires >=22)\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22`}}function He(e){return{label:`robota version`,status:`ok`,message:e}}function Ue(e,t,n){try{let r=v(e,{providerDefinitions:t,env:n}),i=r.source===`env-default`?`env-default via ${r.sourceEnvVar??`environment`}`:`settings profile`,a=r.model===void 0?``:` (${r.model})`;return{label:`API key`,status:`ok`,message:`${r.name}${a} — ${i}`}}catch(e){return{label:`API key`,status:`fail`,message:`${e instanceof Error?e.message:String(e)}\n Set ANTHROPIC_API_KEY or run: robota --configure\n Get key: https://console.anthropic.com/settings/keys`}}}function We(e){try{return JSON.parse(N(e,`utf-8`)),`ok`}catch{return`corrupt`}}function Ge(e){let t=f(e).filter(e=>j(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>We(e)===`corrupt`?{label:`Settings file`,status:`fail`,message:`${e} — invalid JSON\n Fix or delete the file, or run: robota --configure`}:{label:`Settings file`,status:`ok`,message:e})}function Ke(e){try{let t=JSON.parse(N(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function qe(e){let t=L(e,`.robota`,`settings.json`),n=L(process.env.HOME??``,`.robota`,`settings.json`),r=j(t)?t:j(n)?n:void 0;if(r!==void 0){let e=(Ke(r)??``).toLowerCase(),t=Object.entries(Z).find(([t])=>e.startsWith(t));if(t)return t[1]}return Z.anthropic}function Je(){let e=process.env.TERM_PROGRAM??`unknown`;return process.platform===`darwin`&&e===`Apple_Terminal`?{label:`Terminal`,status:`warn`,message:`macOS Terminal.app — CJK/IME input may be unstable
55
- Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function Ye(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=he({host:e.host,port:e.port}),a=setTimeout(()=>{i.destroy(),n({label:t,status:`fail`,message:`timeout (3s)`})},3e3);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({label:t,status:`ok`,message:`reachable (${Date.now()-r}ms)`})}),i.on(`error`,e=>{clearTimeout(a),n({label:t,status:`warn`,message:`${e.message}\n Check proxy settings or firewall`})})})}async function Xe(e,t={checkNetwork:Ye}){e.terminal.writeLine(`
54
+ `),process.exit(1));let a=Y(q(i));process.stdout.write(Ie(a)+`
55
+ `)}const Ue=()=>_(import.meta.url);async function We(e){let t=pe({input:process.stdin,output:process.stdout});try{let n=(await t.question(e)).trim().toLowerCase();return n===`y`||n===`yes`}finally{t.close()}}async function Ge(e,t){let n=m();if(!F(n))return e.writeLine(`No user settings found.`),0;if(!t.yes){if(!t.isTTY)return e.writeError(`--reset deletes ${n}. Refusing without confirmation in non-interactive mode — pass --yes to proceed.`),1;if(!await(t.confirm??We)(`Delete ${n}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let r=y();return r.deleted?e.writeLine(`Deleted ${r.path}`):e.writeLine(`No user settings found.`),0}const Ke={anthropic:{host:`api.anthropic.com`,port:443},openai:{host:`api.openai.com`,port:443},gemini:{host:`generativelanguage.googleapis.com`,port:443},deepseek:{host:`api.deepseek.com`,port:443},qwen:{host:`dashscope.aliyuncs.com`,port:443}};function qe(){let[e]=process.versions.node.split(`.`).map(Number);return e!==void 0&&e>=22?{label:`Node.js version`,status:`ok`,message:`v${process.versions.node}`}:{label:`Node.js version`,status:`fail`,message:`v${process.versions.node} (requires >=22)\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22`}}function Je(e){return{label:`robota version`,status:`ok`,message:e}}function Ye(e,t,n){try{let r=ee(e,{providerDefinitions:t,env:n}),i=r.source===`env-default`?`env-default via ${r.sourceEnvVar??`environment`}`:`settings profile`,a=r.model===void 0?``:` (${r.model})`;return{label:`API key`,status:`ok`,message:`${r.name}${a} — ${i}`}}catch(e){return{label:`API key`,status:`fail`,message:`${e instanceof Error?e.message:String(e)}\n Set ANTHROPIC_API_KEY or run: robota --configure\n Get key: https://console.anthropic.com/settings/keys`}}}function Xe(e){try{return JSON.parse(L(e,`utf-8`)),`ok`}catch{return`corrupt`}}function Ze(e){let t=f(e).filter(e=>F(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>Xe(e)===`corrupt`?{label:`Settings file`,status:`fail`,message:`${e} — invalid JSON\n Fix or delete the file, or run: robota --configure`}:{label:`Settings file`,status:`ok`,message:e})}function Qe(e){try{let t=JSON.parse(L(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function $e(e){let t=V(e,`.robota`,`settings.json`),n=V(process.env.HOME??``,`.robota`,`settings.json`),r=F(t)?t:F(n)?n:void 0;if(r!==void 0){let e=(Qe(r)??``).toLowerCase(),t=Object.entries(Ke).find(([t])=>e.startsWith(t));if(t)return t[1]}return Ke.anthropic}function et(){let e=process.env.TERM_PROGRAM??`unknown`;return process.platform===`darwin`&&e===`Apple_Terminal`?{label:`Terminal`,status:`warn`,message:`macOS Terminal.app — CJK/IME input may be unstable
56
+ Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function tt(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=me({host:e.host,port:e.port}),a=setTimeout(()=>{i.destroy(),n({label:t,status:`fail`,message:`timeout (3s)`})},3e3);i.on(`connect`,()=>{clearTimeout(a),i.destroy(),n({label:t,status:`ok`,message:`reachable (${Date.now()-r}ms)`})}),i.on(`error`,e=>{clearTimeout(a),n({label:t,status:`warn`,message:`${e.message}\n Check proxy settings or firewall`})})})}async function nt(e,t={checkNetwork:tt}){e.terminal.writeLine(`
56
57
  robota diagnose
57
- `);let n=qe(e.cwd),r=t.providerDefinitions??O(),i=t.env??process.env,a=[Ve(),He(e.version),Ue(e.cwd,r,i),...Ge(e.cwd),Je(),await t.checkNetwork(n)],o=0,s=0;for(let t of a){let n=t.status===`ok`?`✓`:t.status===`warn`?`⚠`:`✗`,r=t.message.split(`
58
- `);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&o++,t.status===`warn`&&s++}return e.terminal.writeLine(``),o===0&&s===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):o>0?e.terminal.writeLine(`✗ ${o} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${s} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),o}const Q=`robota`,Ze={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function Qe(e){let t=L(e,`settings.json`);if(!j(t))return{};let n=N(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var $e=class extends Error{constructor(e){super(`Cannot ask "${e}" in a non-interactive shell. Re-run with --yes to accept the defaults.`),this.name=`InitPromptUnavailableError`}};async function $(e,t,n){if(n.yes||n.ci)return n.terminal.writeLine(`${e} → ${t?`Y`:`N`} (${n.yes?`--yes`:`CI`}: using default)`),t;if(!n.isTTY)throw new $e(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function et(e,t,n={}){t.writeLine(``),t.writeLine(`${Q} project initialization`),t.writeLine(`─`.repeat(40));let i={yes:n.yes===!0,ci:n.ci??process.env.CI===`true`,isTTY:n.isTTY??process.stdin.isTTY===!0,promptFn:n.promptFn??r,terminal:t},a=h(e).settings,o=I(a),s=L(e,`AGENTS.md`),c=L(e,`.claude`),l=j(c),u=j(a),d=j(s);if(u&&d&&(t.writeLine(``),t.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await $(`Overwrite existing files?`,!1,i))){t.writeLine(`Init cancelled.`);return}let f={...Ze};if(l&&(t.writeLine(``),t.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await $(`Migrate Claude Code settings to .robota/?`,!1,i))){let e=Qe(c);if(e===null)t.writeLine(`Warning: .claude/settings.json could not be parsed — skipping migration.`);else{let n=e.permissions;f={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...Ze.permissions.allow,...n?.allow??[]],deny:n?.deny??[]}},t.writeLine(`Settings imported from .claude/settings.json.`)}}M(o,{recursive:!0}),P(a,JSON.stringify(f,null,2)+`
59
- `,`utf8`),t.writeLine(``),t.writeLine(`Created: .robota/settings.json`),P(s,`# AGENTS.md — Project Agent Guidelines
58
+ `);let n=$e(e.cwd),r=t.providerDefinitions??k(),i=t.env??process.env,a=[qe(),Je(e.version),Ye(e.cwd,r,i),...Ze(e.cwd),et(),await t.checkNetwork(n)],o=0,s=0;for(let t of a){let n=t.status===`ok`?`✓`:t.status===`warn`?`⚠`:`✗`,r=t.message.split(`
59
+ `);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&o++,t.status===`warn`&&s++}return e.terminal.writeLine(``),o===0&&s===0?e.terminal.writeLine(`✓ All checks passed. robota is ready to use.`):o>0?e.terminal.writeLine(`✗ ${o} issue(s) found. Fix the items above to use robota.`):e.terminal.writeLine(`⚠ ${s} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),o}const Q=`robota`,rt={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function it(e){let t=V(e,`settings.json`);if(!F(t))return{};let n=L(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var at=class extends Error{constructor(e){super(`Cannot ask "${e}" in a non-interactive shell. Re-run with --yes to accept the defaults.`),this.name=`InitPromptUnavailableError`}};async function $(e,t,n){if(n.yes||n.ci)return n.terminal.writeLine(`${e} → ${t?`Y`:`N`} (${n.yes?`--yes`:`CI`}: using default)`),t;if(!n.isTTY)throw new at(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function ot(e,t,n={}){t.writeLine(``),t.writeLine(`${Q} project initialization`),t.writeLine(`─`.repeat(40));let i={yes:n.yes===!0,ci:n.ci??process.env.CI===`true`,isTTY:n.isTTY??process.stdin.isTTY===!0,promptFn:n.promptFn??r,terminal:t},a=h(e).settings,o=B(a),s=V(e,`AGENTS.md`),c=V(e,`.claude`),l=F(c),u=F(a),d=F(s);if(u&&d&&(t.writeLine(``),t.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await $(`Overwrite existing files?`,!1,i))){t.writeLine(`Init cancelled.`);return}let f={...rt};if(l&&(t.writeLine(``),t.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await $(`Migrate Claude Code settings to .robota/?`,!1,i))){let e=it(c);if(e===null)t.writeLine(`Warning: .claude/settings.json could not be parsed — skipping migration.`);else{let n=e.permissions;f={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...rt.permissions.allow,...n?.allow??[]],deny:n?.deny??[]}},t.writeLine(`Settings imported from .claude/settings.json.`)}}I(o,{recursive:!0}),R(a,JSON.stringify(f,null,2)+`
60
+ `,`utf8`),t.writeLine(``),t.writeLine(`Created: .robota/settings.json`),R(s,`# AGENTS.md — Project Agent Guidelines
60
61
 
61
62
  This file guides the AI agent working in this project. Customize it for your project.
62
63
 
@@ -86,7 +87,7 @@ npm run build
86
87
  ## Important Notes
87
88
 
88
89
  <!-- Anything the agent should know before making changes -->
89
- `,`utf8`),t.writeLine(`Created: AGENTS.md`),t.writeLine(``),t.writeLine(`Initialization complete.`),t.writeLine(``),t.writeLine(`Next steps:`),t.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),t.writeLine(` 2. Run \`${Q} --configure\` to set up your AI provider`),t.writeLine(` 3. Run \`${Q}\` to start the assistant`),t.writeLine(``),n.onProviderSetup!==void 0&&(i.isTTY||i.yes||i.ci)&&await $(`Would you like to set up a provider now?`,!1,i)&&await n.onProviderSetup()}function tt(e=w().onboarded){return!j(e)}function nt(e=w().onboarded){M(I(e),{recursive:!0}),P(e,new Date().toISOString())}const rt=`
90
+ `,`utf8`),t.writeLine(`Created: AGENTS.md`),t.writeLine(``),t.writeLine(`Initialization complete.`),t.writeLine(``),t.writeLine(`Next steps:`),t.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),t.writeLine(` 2. Run \`${Q} --configure\` to set up your AI provider`),t.writeLine(` 3. Run \`${Q}\` to start the assistant`),t.writeLine(``),n.onProviderSetup!==void 0&&(i.isTTY||i.yes||i.ci)&&await $(`Would you like to set up a provider now?`,!1,i)&&await n.onProviderSetup()}function st(e=C().onboarded){return!F(e)}function ct(e=C().onboarded){I(B(e),{recursive:!0}),R(e,new Date().toISOString())}const lt=`
90
91
  ╭─────────────────────────────────────────────────────────────╮
91
92
  │ Welcome to ${Q}! — AI coding assistant │
92
93
  │ │
@@ -103,12 +104,12 @@ npm run build
103
104
  │ │
104
105
  │ ${Q} diagnose — check your setup │
105
106
  ╰─────────────────────────────────────────────────────────────╯
106
- `;function it(e){e.writeLine(rt)}function at(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
107
+ `;function ut(e){e.writeLine(lt)}function dt(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
107
108
  ⚠ macOS Terminal.app detected: CJK/IME input may be unstable.
108
109
  Recommended: use iTerm2 (https://iterm2.com) for Korean/Japanese/Chinese input.
109
110
  Or use headless mode: robota -p "your prompt"
110
- `)}function ot(e,t,n,r){let i={settings:{read:()=>y(m()),write:e=>T(m(),e)},plugin:ne(e)},a=n.providerDefinitions??O();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...k({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>g(e),readTargetSettings:()=>y(x(e)),writeTargetSettings:t=>T(x(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:C(t)?p({currentVersion:r}):void 0}}function st(e,t){let n=N(pe(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function ct(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(st(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(`
111
+ `)}function ft(e,t,n,r,i={}){let a={settings:{read:()=>v(m()),write:e=>w(m(),e)},plugin:j(e)},o=n.providerDefinitions??k();return{commandHostAdapters:a,providerDefinitions:o,commandModules:[...A({cwd:e,providerDefinitions:o,providerSettingsAdapter:{readMergedSettings:()=>g(e),readTargetSettings:()=>v(b(e)),writeTargetSettings:t=>w(b(e),t)},...i.enabledCommandModules===void 0?{}:{enabledCommandModules:i.enabledCommandModules},...i.disabledCommandModules===void 0?{}:{disabledCommandModules:i.disabledCommandModules}}),...n.commandModules??[]],startupUpdateNoticePromise:S(t)?p({currentVersion:r}):void 0}}function pt(e,t){let n=L(fe(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function mt(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(pt(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(`
111
112
 
112
- `):void 0}async function lt(e,n,r,i,a,o,s,c,l={}){let u=n.positional.join(` `).trim();if(!u&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);u=Buffer.concat(e).toString(`utf-8`).trim()}u||(process.stderr.write(`Print mode (-p) requires a prompt argument.
113
- `),process.exit(1));let d=ct(e,n),f=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:B(n.allowedTools),deniedTools:B(n.deniedTools),appendSystemPrompt:d,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await f.run(u),process.exit(f.getExitCode())}async function ut(t={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await X(process.argv.slice(4),process.cwd());return}let a;try{a=Se()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let o=Re();if(a.help){process.stdout.write(ge());return}if(a.version){process.stdout.write(`robota ${o}\n`);return}if(a.checkUpdate){let e=await s({currentVersion:o,force:!0}),t=u(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let f=process.cwd(),p=new n;if(a.reset){process.exitCode=await Be(p,{yes:a.yes,isTTY:process.stdin.isTTY===!0});return}if(a.positional[0]===`diagnose`){let e=await Xe({version:o,terminal:p,cwd:f});process.exitCode=+(e>0);return}if(a.positional[0]===`session`&&a.positional[1]===`analyze`){await X(process.argv.slice(4),f);return}try{if(await Oe(a,f,p))return}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:m,providerDefinitions:g,commandModules:_,startupUpdateNoticePromise:y}=ot(f,a,t,o);if(a.positional[0]===`init`){try{await et(f,p,{yes:a.yes,onProviderSetup:async()=>{await H(f,a,r,p,g)}})}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(a.configure){await H(f,a,r,p,g);return}if(Ce(f,a,p,g))return;try{await we(f,a,r,p,g)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof i&&a.printMode?3:1)}let b=a.provider?{providerOverride:a.provider,providerDefinitions:g}:{providerDefinitions:g},x=v(f,b),S=a.model??x.model;if(x.source===`env-default`&&x.sourceEnvVar!==void 0){let e=`Using ${x.name} (${S}) via ${x.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;a.printMode?process.stderr.write(e):p.writeLine(e.trimEnd())}let C=l(f,a.model,b),w=le(),T=h(f),E=ue({workerPath:de(),providerConfig:{...x,model:S},logsDir:T.logs}),D=c(f),O,k=!1;if(a.continueMode?O=ee(D,f):a.resumeId!==void 0&&(a.resumeId===``?k=!0:(O=te(D,a.resumeId),O===void 0&&(process.stderr.write(`Session not found: ${a.resumeId}\n`),process.exit(1)))),a.printMode){await lt(f,a,C,D,w,E,_,m,{resumeSessionId:O,forkSession:a.forkSession});return}at(p),tt()&&(it(p),nt()),await se({cwd:f,provider:C,providerOverride:a.provider,providerType:x.name,modelId:S,language:a.language,permissionMode:a.permissionMode,maxTurns:a.maxTurns,allowedTools:B(a.allowedTools),deniedTools:B(a.deniedTools),version:o,sessionStore:a.noSessionPersistence?void 0:D,resumeSessionId:O,showSessionPickerOnStart:k,forkSession:a.forkSession,sessionName:a.sessionName,backgroundTaskRunners:w,subagentRunnerFactory:E,commandModules:_,commandHostAdapters:m,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:y?y.then(e=>e?d(e):void 0):void 0,transportRegistry:ce(),cliAdapter:oe({providerDefinitions:g,reloadPluginCommandSource:A}),reloadPluginCommandSource:A,agentName:`robota-cli`}),process.exit(0)}export{ut as startCli};
113
+ `):void 0}async function ht(e,n,r,i,a,o,s,c,l={},u={}){let d=n.positional.join(` `).trim();if(!d&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);d=Buffer.concat(e).toString(`utf-8`).trim()}d||(process.stderr.write(`Print mode (-p) requires a prompt argument.
114
+ `),process.exit(1));let f=mt(e,n),p=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??u.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:W(n.allowedTools),deniedTools:W(n.deniedTools),appendSystemPrompt:f,...u.persona===void 0?{}:{persona:u.persona},...u.agentName===void 0?{}:{agentName:u.agentName},...u.activePresetId===void 0?{}:{activePresetId:u.activePresetId},...u.enableParallelSubagents===void 0?{}:{enableParallelSubagents:u.enableParallelSubagents},...u.selfVerification===void 0?{}:{selfVerification:u.selfVerification},...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await p.run(d),process.exit(p.getExitCode())}async function gt(t={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await He(process.argv.slice(4),process.cwd());return}let a;try{a=xe()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let o=Ue();if(a.help){process.stdout.write(he());return}if(a.version){process.stdout.write(`robota ${o}\n`);return}if(a.checkUpdate){let e=await s({currentVersion:o,force:!0}),t=u(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let f=process.cwd(),p=new n;if(a.reset){process.exitCode=await Ge(p,{yes:a.yes,isTTY:process.stdin.isTTY===!0});return}if(a.positional[0]===`diagnose`){let e=await nt({version:o,terminal:p,cwd:f});process.exitCode=+(e>0);return}if(a.positional[0]===`session`&&a.positional[1]===`analyze`){await He(process.argv.slice(4),f);return}try{if(await Ae(a,f,p))return}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let g=v(m()),_=typeof g.preset==`string`?g.preset:void 0,y=re();for(let{file:e,error:t}of y.errors)p.writeError(`Skipped external preset "${e}": ${t}`);let b;try{b=Ce(a,_)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let x=G(a,_),{commandHostAdapters:S,providerDefinitions:C,commandModules:w,startupUpdateNoticePromise:T}=ft(f,a,t,o,{...b.enabledCommandModules===void 0?{}:{enabledCommandModules:b.enabledCommandModules},...b.disabledCommandModules===void 0?{}:{disabledCommandModules:b.disabledCommandModules}});if(a.positional[0]===`init`){try{await ot(f,p,{yes:a.yes,onProviderSetup:async()=>{await Ee(f,a,r,p,C)}})}catch(e){p.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(a.configure){await Ee(f,a,r,p,C);return}if(we(f,a,p,C))return;try{await Te(f,a,r,p,C)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof i&&a.printMode?3:1)}let D=a.provider?{providerOverride:a.provider,providerDefinitions:C}:{providerDefinitions:C},O=ee(f,D),k=b.model??O.model;if(O.source===`env-default`&&O.sourceEnvVar!==void 0){let e=`Using ${O.name} (${k}) via ${O.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;a.printMode?process.stderr.write(e):p.writeLine(e.trimEnd())}let A=l(f,b.model,D),j=ce(),M=h(f),N=le({workerPath:ue(),providerConfig:{...O,model:k},logsDir:M.logs}),P=c(f),F,I=!1;if(a.continueMode?F=te(P,f):a.resumeId!==void 0&&(a.resumeId===``?I=!0:(F=ne(P,a.resumeId),F===void 0&&(process.stderr.write(`Session not found: ${a.resumeId}\n`),process.exit(1)))),a.printMode){await ht(f,a,A,P,j,N,w,S,{resumeSessionId:F,forkSession:a.forkSession},{agentName:b.agentName??E,activePresetId:x,persona:b.persona,...b.permissionMode===void 0?{}:{permissionMode:b.permissionMode},...b.enableParallelSubagents===void 0?{}:{enableParallelSubagents:b.enableParallelSubagents},...b.selfVerification===void 0?{}:{selfVerification:b.selfVerification}});return}dt(p),st()&&(ut(p),ct()),await oe({cwd:f,provider:A,providerOverride:a.provider,providerType:O.name,modelId:k,language:a.language,permissionMode:a.permissionMode??b.permissionMode,maxTurns:a.maxTurns,allowedTools:W(a.allowedTools),deniedTools:W(a.deniedTools),version:o,sessionStore:a.noSessionPersistence?void 0:P,resumeSessionId:F,showSessionPickerOnStart:I,forkSession:a.forkSession,sessionName:a.sessionName,backgroundTaskRunners:j,subagentRunnerFactory:N,commandModules:w,commandHostAdapters:S,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:T?T.then(e=>e?d(e):void 0):void 0,transportRegistry:se(),cliAdapter:ae({providerDefinitions:C,reloadPluginCommandSource:ie}),reloadPluginCommandSource:ie,agentName:b.agentName??E,activePresetId:x,persona:b.persona,...b.enableParallelSubagents===void 0?{}:{enableParallelSubagents:b.enableParallelSubagents},...b.selfVerification===void 0?{}:{selfVerification:b.selfVerification}}),process.exit(0)}export{gt as startCli};
114
115
  //# sourceMappingURL=index.js.map