@robota-sdk/agent-cli 3.0.0-beta.75 → 3.0.0-beta.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -21
- package/README.md +28 -24
- package/dist/node/bin.js +18 -19
- package/dist/node/bin.js.map +1 -1
- package/dist/node/index.cjs +17 -18
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +19 -20
- package/dist/node/index.js.map +1 -1
- package/dist/web/assets/index-LMW0IDmj.js +37 -0
- package/dist/web/index.html +1 -1
- package/package.json +17 -10
package/dist/node/index.cjs
CHANGED
|
@@ -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"),
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("node:child_process"),t=require("node:module"),n=require("@robota-sdk/agent-transport/headless"),r=require("@robota-sdk/agent-framework"),i=require("node:util"),a=require("@robota-sdk/agent-preset"),o=require("@robota-sdk/agent-core"),s=require("@robota-sdk/agent-provider"),c=require("@robota-sdk/agent-command"),l=require("@robota-sdk/agent-transport-tui"),u=require("@robota-sdk/agent-transport"),d=require("@robota-sdk/agent-transport-ws"),f=require("@robota-sdk/agent-executor"),p=require("@robota-sdk/agent-subagent-runner"),m=require("@robota-sdk/agent-session-analytics"),h=require("node:fs"),g=require("node:readline/promises"),_=require("node:net"),v=require("node:path");const y=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],b=[`text`,`json`,`stream-json`];function ee(){return`
|
|
2
2
|
Usage: robota [options] [-p <prompt>]
|
|
3
3
|
|
|
4
4
|
Options:
|
|
@@ -44,20 +44,19 @@ Examples:
|
|
|
44
44
|
robota --task-file task.md Run task from file (appended to system prompt)
|
|
45
45
|
robota -p "Refactor the auth module" --dry-run Plan only, no execution
|
|
46
46
|
robota --continue Resume the last session
|
|
47
|
-
`}function
|
|
48
|
-
`)}function
|
|
49
|
-
`)}
|
|
50
|
-
`)
|
|
51
|
-
`)
|
|
52
|
-
`),process.exit(1));let n=K(t);process.stdout.write(H(n)+`
|
|
47
|
+
`}function x(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 S(e){if(e!==void 0){if(!b.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${b.join(` | `)}`);return e}}function C(e){if(e!==void 0){if(!y.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${y.join(` | `)}`);return e}}function w(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 T={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`},goal:{type:`string`},"goal-max-iterations":{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`},"session-log":{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 E(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:C(e[`permission-mode`]),maxTurns:w(e[`max-turns`]),goal:e.goal,goalMaxIterations:w(e[`goal-max-iterations`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:S(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,sessionLog:e[`session-log`],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 D(){let{values:e,positionals:t}=(0,i.parseArgs)(T),n=E(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 O(e,t){return e.preset??t??`default`}function k(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 te(e,t){return(0,a.resolvePreset)(O(e,t),{cliOverrides:k(e)})}function A(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function j(e,t,n,i=(0,s.createDefaultProviderDefinitions)()){let a=(0,r.resolveSettingsPathForScope)(e,A(t.settingsScope));return t.configureProvider?((0,r.applyProviderConfiguration)(a,N(t),{providerDefinitions:i}),n.writeLine(`Provider profile saved to ${a}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?((0,r.applyProviderSwitch)(t.settingsScope===void 0?(0,r.resolveProviderSettingsWriteTargetPath)(e):a,t.provider,{knownProviders:(0,r.readMergedProviderSettings)(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function ne(e,t,n,r,i=(0,s.createDefaultProviderDefinitions)(),a){await(0,c.ensureProviderConfig)(e,{provider:t.provider,settingsScope:A(t.settingsScope)},n,r,i,{formatError:P,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function M(e,t,n,r,i=(0,s.createDefaultProviderDefinitions)()){await(0,c.runProviderStartupSetup)(e,{settingsScope:A(t.settingsScope)},n,r,i)}function N(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 P(e=(0,s.createDefaultProviderDefinitions)()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${(0,o.formatSupportedProviderTypes)(e)}`,...e.map(F)].join(`
|
|
48
|
+
`)}function F(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(` `)}`}let I=null,L=!1;function re(e){I=e}function R(e,t){try{if(I){I.getSession().reportBackgroundError(e,t);return}}catch{}process.stderr.write(`\n[robota] ${t}: ${e.message}\n`)}function ie(){L||(L=!0,process.on(`unhandledRejection`,e=>{R(e instanceof Error?e:Error(String(e)),`unhandled rejection`)}),process.on(`uncaughtException`,e=>{R(e instanceof Error?e:Error(String(e)),`uncaught exception`)}))}async function z(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await(0,c.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 B(e){let t,n,r=!1;for(let i=0;i<e.length;i++)if(e[i]===`--last`&&e[i+1]){let n=parseInt(e[i+1],10);!isNaN(n)&&n>0&&(t=n),i++}else e[i]===`--session`&&e[i+1]?(n=e[i+1],i++):e[i]===`--usage`&&(r=!0);return{last:t,sessionId:n,usage:r}}function V(e){let t=new Map;for(let e of(0,r.createUserSessionStore)().list())t.set(e.id,e);for(let n of(0,r.createProjectSessionStore)(e).list())t.set(n.id,n);return[...t.values()].sort((e,t)=>e.id.localeCompare(t.id))}async function H(e,t=process.cwd()){let n=B(e),i=V(t);if(i.length===0&&(process.stderr.write(`No session files found in ${(0,r.projectPaths)(t).sessions} or ${(0,r.userPaths)().sessions}\n`),process.exit(1)),n.usage){let e=n.sessionId===void 0?i[i.length-1]:i.find(e=>e.id.includes(n.sessionId));e||(process.stderr.write(`Session not found${n.sessionId?`: ${n.sessionId}`:``}\n`),process.exit(1)),process.stdout.write((0,m.formatUsageReport)((0,m.summarizeUsageBySource)(e))+`
|
|
49
|
+
`);return}if(n.sessionId!==void 0){let e=i.find(e=>e.id.includes(n.sessionId));e||(process.stderr.write(`Session not found: ${n.sessionId}\n`),process.exit(1)),process.stdout.write((0,m.formatSingleSession)((0,m.analyzeSession)(e))+`
|
|
50
|
+
`);return}if(n.last!==void 0){let e=i.slice(-n.last).map(e=>(0,m.analyzeSession)(e));e.length===0&&(process.stderr.write(`No valid sessions found.
|
|
51
|
+
`),process.exit(1)),process.stdout.write((0,m.formatAggregateReport)((0,m.aggregateReports)(e))+`
|
|
53
52
|
`);return}let a=i[i.length-1];a||(process.stderr.write(`No sessions found.
|
|
54
|
-
`),process.exit(1))
|
|
55
|
-
`)}const
|
|
56
|
-
Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function
|
|
53
|
+
`),process.exit(1)),process.stdout.write((0,m.formatSingleSession)((0,m.analyzeSession)(a))+`
|
|
54
|
+
`)}const U=()=>(0,r.readPackageVersion)(require("url").pathToFileURL(__filename).href);async function W(e){let t=(0,g.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 G(e,t){let n=(0,r.getUserSettingsPath)();if(!(0,h.existsSync)(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??W)(`Delete ${n}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let i=(0,r.resetUserConfig)();return i.deleted?e.writeLine(`Deleted ${i.path}`):e.writeLine(`No user settings found.`),0}const K={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 q(){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 J(e){return{label:`robota version`,status:`ok`,message:e}}function Y(e,t,n){try{let i=(0,r.readProviderSettings)(e,{providerDefinitions:t,env:n}),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 ae(e){try{return JSON.parse((0,h.readFileSync)(e,`utf-8`)),`ok`}catch{return`corrupt`}}function oe(e){let t=(0,r.getProviderSettingsPaths)(e).filter(e=>(0,h.existsSync)(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>ae(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 se(e){try{let t=JSON.parse((0,h.readFileSync)(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function ce(e){let t=(0,v.join)(e,`.robota`,`settings.json`),n=(0,v.join)(process.env.HOME??``,`.robota`,`settings.json`),r=(0,h.existsSync)(t)?t:(0,h.existsSync)(n)?n:void 0;if(r!==void 0){let e=(se(r)??``).toLowerCase(),t=Object.entries(K).find(([t])=>e.startsWith(t));if(t)return t[1]}return K.anthropic}function le(){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 ue(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=(0,_.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 de(e,t={checkNetwork:ue}){e.terminal.writeLine(`
|
|
57
56
|
robota diagnose
|
|
58
|
-
`);let n=
|
|
59
|
-
`);e.terminal.writeLine(` ${n} ${t.label}: ${r[0]}`);for(let t of r.slice(1))e.terminal.writeLine(` ${t}`);t.status===`fail`&&
|
|
60
|
-
`,`utf8`),
|
|
57
|
+
`);let n=ce(e.cwd),r=t.providerDefinitions??(0,s.createDefaultProviderDefinitions)(),i=t.env??process.env,a=[q(),J(e.version),Y(e.cwd,r,i),...oe(e.cwd),le(),await t.checkNetwork(n)],o=0,c=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`&&c++}return e.terminal.writeLine(``),o===0&&c===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(`⚠ ${c} warning(s). robota may work but check the items above.`),e.terminal.writeLine(``),o}const X=`robota`,Z={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function fe(e){let t=(0,v.join)(e,`settings.json`);if(!(0,h.existsSync)(t))return{};let n=(0,h.readFileSync)(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var pe=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 pe(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function me(e,t,i={}){t.writeLine(``),t.writeLine(`${X} project initialization`),t.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??n.promptInput,terminal:t},o=(0,r.projectPaths)(e).settings,s=(0,v.dirname)(o),c=(0,v.join)(e,`AGENTS.md`),l=(0,v.join)(e,`.claude`),u=(0,h.existsSync)(l),d=(0,h.existsSync)(o),f=(0,h.existsSync)(c);if(d&&f&&(t.writeLine(``),t.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await Q(`Overwrite existing files?`,!1,a))){t.writeLine(`Init cancelled.`);return}let p={...Z};if(u&&(t.writeLine(``),t.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await Q(`Migrate Claude Code settings to .robota/?`,!1,a))){let e=fe(l);if(e===null)t.writeLine(`Warning: .claude/settings.json could not be parsed — skipping migration.`);else{let n=e.permissions;p={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...Z.permissions.allow,...n?.allow??[]],deny:n?.deny??[]}},t.writeLine(`Settings imported from .claude/settings.json.`)}}(0,h.mkdirSync)(s,{recursive:!0}),(0,h.writeFileSync)(o,JSON.stringify(p,null,2)+`
|
|
59
|
+
`,`utf8`),t.writeLine(``),t.writeLine(`Created: .robota/settings.json`),(0,h.writeFileSync)(c,`# AGENTS.md — Project Agent Guidelines
|
|
61
60
|
|
|
62
61
|
This file guides the AI agent working in this project. Customize it for your project.
|
|
63
62
|
|
|
@@ -87,7 +86,7 @@ npm run build
|
|
|
87
86
|
## Important Notes
|
|
88
87
|
|
|
89
88
|
<!-- Anything the agent should know before making changes -->
|
|
90
|
-
`,`utf8`),
|
|
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 \`${X} --configure\` to set up your AI provider`),t.writeLine(` 3. Run \`${X}\` to start the assistant`),t.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 he(e=(0,r.userPaths)().onboarded){return!(0,h.existsSync)(e)}function ge(e=(0,r.userPaths)().onboarded){(0,h.mkdirSync)((0,v.dirname)(e),{recursive:!0}),(0,h.writeFileSync)(e,new Date().toISOString())}const _e=`
|
|
91
90
|
╭─────────────────────────────────────────────────────────────╮
|
|
92
91
|
│ Welcome to ${X}! — AI coding assistant │
|
|
93
92
|
│ │
|
|
@@ -104,11 +103,11 @@ npm run build
|
|
|
104
103
|
│ │
|
|
105
104
|
│ ${X} diagnose — check your setup │
|
|
106
105
|
╰─────────────────────────────────────────────────────────────╯
|
|
107
|
-
`;function
|
|
106
|
+
`;function $(e){e.writeLine(_e)}function ve(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
|
|
108
107
|
⚠ macOS Terminal.app detected: CJK/IME input may be unstable.
|
|
109
108
|
Recommended: use iTerm2 (https://iterm2.com) for Korean/Japanese/Chinese input.
|
|
110
109
|
Or use headless mode: robota -p "your prompt"
|
|
111
|
-
`)}function
|
|
110
|
+
`)}function ye(){try{return(0,t.createRequire)(require("url").pathToFileURL(__filename).href)(`@robota-sdk/agent-command-workflows`).createWorkflowsCommandModule()}catch{return}}function be(e,t,n,i,a={}){let o={settings:{read:()=>(0,r.readSettings)((0,r.getUserSettingsPath)()),write:e=>(0,r.writeSettings)((0,r.getUserSettingsPath)(),e)},plugin:(0,c.createDefaultPluginCommandAdapter)(e)},l=n.providerDefinitions??(0,s.createDefaultProviderDefinitions)(),u={readMergedSettings:()=>(0,r.readMergedProviderSettings)(e),readTargetSettings:()=>(0,r.readSettings)((0,r.resolveProviderSettingsWriteTargetPath)(e)),writeTargetSettings:t=>(0,r.writeSettings)((0,r.resolveProviderSettingsWriteTargetPath)(e),t)},d=ye();return{commandHostAdapters:o,providerDefinitions:l,commandModules:[...(0,c.createDefaultCommandModules)({cwd:e,providerDefinitions:l,providerSettingsAdapter:u,...a.enabledCommandModules===void 0?{}:{enabledCommandModules:a.enabledCommandModules},...a.disabledCommandModules===void 0?{}:{disabledCommandModules:a.disabledCommandModules}}),...d?[d]:[],...n.commandModules??[]],startupUpdateNoticePromise:(0,r.shouldRunStartupCliUpdateCheck)(t)?(0,r.getStartupCliUpdateNotice)({currentVersion:i}):void 0}}function xe(e,t){let n=(0,h.readFileSync)((0,v.resolve)(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function Se(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(xe(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(`
|
|
112
111
|
|
|
113
|
-
`):void 0}async function
|
|
114
|
-
`),process.exit(1));let
|
|
112
|
+
`):void 0}async function Ce(e,t,r,i,a,o,s,c,l={},u={}){let d=t.goal?.trim(),f=t.positional.join(` `).trim();if(!d&&!f&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);f=Buffer.concat(e).toString(`utf-8`).trim()}!d&&!f&&(process.stderr.write(`Print mode (-p) requires a prompt argument (or --goal <objective>).
|
|
113
|
+
`),process.exit(1));let p=Se(e,t),m=new n.HeadlessInteractionChannel({cwd:e,provider:r,outputFormat:t.outputFormat??`text`,permissionMode:t.permissionMode??u.permissionMode??`bypassPermissions`,maxTurns:t.maxTurns,sessionStore:t.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:t.sessionName,bare:t.bare||void 0,allowedTools:x(t.allowedTools),deniedTools:x(t.deniedTools),appendSystemPrompt:p,...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},...t.systemPrompt?{systemPrompt:t.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});d?await m.runGoal(d,t.goalMaxIterations?{maxIterations:t.goalMaxIterations}:{}):await m.run(f),process.exit(m.getExitCode())}function we(e){let n;try{n=(0,t.createRequire)(require("url").pathToFileURL(__filename).href)(`@robota-sdk/agent-provider-replay`)}catch{throw Error(`--session-log replay requires @robota-sdk/agent-provider-replay, a dev-only package that is not bundled in the published CLI.`)}return n.createReplayProviderFromLogFile(e)}function Te(){let e=new u.TransportRegistry((0,r.getUserSettingsPath)());return e.register(new d.WsTransport),e}async function Ee(t={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await H(process.argv.slice(4),process.cwd());return}let i;try{i=D()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let o=U();if(i.help){process.stdout.write(ee());return}if(i.version){process.stdout.write(`robota ${o}\n`);return}if(i.checkUpdate){let e=await(0,r.checkForCliUpdate)({currentVersion:o,force:!0}),t=(0,r.formatCliUpdateCheckMessage)(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let s=process.cwd(),u=new n.PrintTerminal;if(i.reset){process.exitCode=await G(u,{yes:i.yes,isTTY:process.stdin.isTTY===!0});return}if(i.positional[0]===`diagnose`){let e=await de({version:o,terminal:u,cwd:s});process.exitCode=+(e>0);return}if(i.positional[0]===`session`&&i.positional[1]===`analyze`){await H(process.argv.slice(4),s);return}try{if(await z(i,s,u))return}catch(e){u.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let d=(0,r.readSettings)((0,r.getUserSettingsPath)()),m=typeof d.preset==`string`?d.preset:void 0,h=(0,a.loadExternalPresets)();for(let{file:e,error:t}of h.errors)u.writeError(`Skipped external preset "${e}": ${t}`);let g;try{g=te(i,m)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let _=O(i,m),{commandHostAdapters:v,providerDefinitions:y,commandModules:b,startupUpdateNoticePromise:S}=be(s,i,t,o,{...g.enabledCommandModules===void 0?{}:{enabledCommandModules:g.enabledCommandModules},...g.disabledCommandModules===void 0?{}:{disabledCommandModules:g.disabledCommandModules}});if(i.positional[0]===`init`){try{await me(s,u,{yes:i.yes,onProviderSetup:async()=>{await M(s,i,n.promptInput,u,y)}})}catch(e){u.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(i.configure){await M(s,i,n.promptInput,u,y);return}if(j(s,i,u,y))return;try{await ne(s,i,n.promptInput,u,y)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof r.ProviderConfigError&&i.printMode?3:1)}let C=i.provider?{providerOverride:i.provider,providerDefinitions:y}:{providerDefinitions:y},w=(0,r.readProviderSettings)(s,C),T=g.model??w.model;if(w.source===`env-default`&&w.sourceEnvVar!==void 0){let e=`Using ${w.name} (${T}) via ${w.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;i.printMode?process.stderr.write(e):u.writeLine(e.trimEnd())}let E=i.sessionLog?we(i.sessionLog):(0,r.createProviderFromSettings)(s,g.model,C),k=(0,f.createDefaultBackgroundTaskRunners)(),A=(0,r.projectPaths)(s),N=(0,p.createChildProcessSubagentRunnerFactory)({workerPath:(0,p.getDefaultSubagentWorkerPath)(),providerConfig:{...w,model:T},logsDir:A.logs}),P=(0,r.createProjectSessionStore)(s),F,I=!1;if(i.continueMode?F=(0,r.resolveLatestSessionId)(P,s):i.resumeId!==void 0&&(i.resumeId===``?I=!0:(F=(0,r.resolveSessionIdByIdOrName)(P,i.resumeId),F===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode||i.goal){await Ce(s,i,E,P,k,N,b,v,{resumeSessionId:F,forkSession:i.forkSession},{agentName:g.agentName??a.DEFAULT_AGENT_NAME,activePresetId:_,persona:g.persona,...g.permissionMode===void 0?{}:{permissionMode:g.permissionMode},...g.enableParallelSubagents===void 0?{}:{enableParallelSubagents:g.enableParallelSubagents},...g.selfVerification===void 0?{}:{selfVerification:g.selfVerification}});return}ve(u),ie(),he()&&($(u),ge()),await(0,l.renderApp)({onChannelReady:e=>re(e),cwd:s,provider:E,providerOverride:i.provider,providerType:w.name,modelId:T,language:i.language,permissionMode:i.permissionMode??g.permissionMode,maxTurns:i.maxTurns,allowedTools:x(i.allowedTools),deniedTools:x(i.deniedTools),version:o,sessionStore:i.noSessionPersistence?void 0:P,resumeSessionId:F,showSessionPickerOnStart:I,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:k,subagentRunnerFactory:N,commandModules:b,commandHostAdapters:v,shellExec:t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:S?S.then(e=>e?(0,r.formatCliUpdateNotice)(e):void 0):void 0,transportRegistry:Te(),cliAdapter:(0,l.createDefaultTuiCliAdapter)({providerDefinitions:y,reloadPluginCommandSource:c.reloadPluginCommandSource}),reloadPluginCommandSource:c.reloadPluginCommandSource,agentName:g.agentName??a.DEFAULT_AGENT_NAME,activePresetId:_,persona:g.persona,...g.enableParallelSubagents===void 0?{}:{enableParallelSubagents:g.enableParallelSubagents},...g.selfVerification===void 0?{}:{selfVerification:g.selfVerification}}),process.exit(0)}exports.startCli=Ee;
|
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/startup/command-setup.ts","../../src/cli.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/startup/command-setup.ts","../../src/cli.ts"],"mappings":";;;;UA8CiB,gBAAA;EACf,cAAA,YAA0B,cAAA;EAC1B,mBAAA,YAA+B,mBAAmB;AAAA;;;iBC0C9B,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
|
package/dist/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{createRequire as e}from"node:module";import{execSync as t}from"node:child_process";import{HeadlessInteractionChannel as n,PrintTerminal as r,promptInput as i}from"@robota-sdk/agent-transport/headless";import{ProviderConfigError as a,applyProviderConfiguration as o,applyProviderSwitch as s,checkForCliUpdate as c,createProjectSessionStore as l,createProviderFromSettings as u,createUserSessionStore as d,formatCliUpdateCheckMessage as f,formatCliUpdateNotice as p,getProviderSettingsPaths as m,getStartupCliUpdateNotice as h,getUserSettingsPath as g,projectPaths as _,readMergedProviderSettings as v,readPackageVersion as y,readProviderSettings as b,readSettings as x,resetUserConfig as S,resolveLatestSessionId as ee,resolveProviderSettingsWriteTargetPath as C,resolveSessionIdByIdOrName as te,resolveSettingsPathForScope as w,shouldRunStartupCliUpdateCheck as T,userPaths as E,writeSettings as D}from"@robota-sdk/agent-framework";import{parseArgs as O}from"node:util";import{DEFAULT_AGENT_NAME as k,loadExternalPresets as ne,resolvePreset as A}from"@robota-sdk/agent-preset";import{formatSupportedProviderTypes as j}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as M}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as N,createDefaultPluginCommandAdapter as P,ensureProviderConfig as F,executeUserLocalDirectCommand as I,reloadPluginCommandSource as re,runProviderStartupSetup as L}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as ie,renderApp as ae}from"@robota-sdk/agent-transport-tui";import{TransportRegistry as oe}from"@robota-sdk/agent-transport";import{WsTransport as se}from"@robota-sdk/agent-transport-ws";import{createDefaultBackgroundTaskRunners as ce}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as le,getDefaultSubagentWorkerPath as ue}from"@robota-sdk/agent-subagent-runner";import{aggregateReports as de,analyzeSession as R,formatAggregateReport as fe,formatSingleSession as z,formatUsageReport as pe,summarizeUsageBySource as me}from"@robota-sdk/agent-session-analytics";import{existsSync as B,mkdirSync as V,readFileSync as H,writeFileSync as U}from"node:fs";import{createInterface as he}from"node:readline/promises";import{createConnection as ge}from"node:net";import{dirname as W,join as G,resolve as _e}from"node:path";const K=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],q=[`text`,`json`,`stream-json`];function ve(){return`
|
|
2
2
|
Usage: robota [options] [-p <prompt>]
|
|
3
3
|
|
|
4
4
|
Options:
|
|
@@ -44,20 +44,19 @@ Examples:
|
|
|
44
44
|
robota --task-file task.md Run task from file (appended to system prompt)
|
|
45
45
|
robota -p "Refactor the auth module" --dry-run Plan only, no execution
|
|
46
46
|
robota --continue Resume the last session
|
|
47
|
-
`}function
|
|
48
|
-
`)}function
|
|
49
|
-
`)}
|
|
50
|
-
`)}
|
|
51
|
-
`)
|
|
52
|
-
`),process.exit(1));let i=Ve(t);process.stdout.write(Le(i)+`
|
|
47
|
+
`}function J(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 ye(e){if(e!==void 0){if(!q.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${q.join(` | `)}`);return e}}function be(e){if(e!==void 0){if(!K.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${K.join(` | `)}`);return e}}function xe(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 Se={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`},goal:{type:`string`},"goal-max-iterations":{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`},"session-log":{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 Ce(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:be(e[`permission-mode`]),maxTurns:xe(e[`max-turns`]),goal:e.goal,goalMaxIterations:xe(e[`goal-max-iterations`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:ye(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,sessionLog:e[`session-log`],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 we(){let{values:e,positionals:t}=O(Se),n=Ce(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 Te(e,t){return e.preset??t??`default`}function Ee(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 De(e,t){return A(Te(e,t),{cliOverrides:Ee(e)})}function Y(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function Oe(e,t,n,r=M()){let i=w(e,Y(t.settingsScope));return t.configureProvider?(o(i,je(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${i}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(s(t.settingsScope===void 0?C(e):i,t.provider,{knownProviders:v(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function ke(e,t,n,r,i=M(),a){await F(e,{provider:t.provider,settingsScope:Y(t.settingsScope)},n,r,i,{formatError:Me,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function Ae(e,t,n,r,i=M()){await L(e,{settingsScope:Y(t.settingsScope)},n,r,i)}function je(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 Me(e=M()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${j(e)}`,...e.map(Ne)].join(`
|
|
48
|
+
`)}function Ne(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(` `)}`}let X=null,Pe=!1;function Fe(e){X=e}function Ie(e,t){try{if(X){X.getSession().reportBackgroundError(e,t);return}}catch{}process.stderr.write(`\n[robota] ${t}: ${e.message}\n`)}function Le(){Pe||(Pe=!0,process.on(`unhandledRejection`,e=>{Ie(e instanceof Error?e:Error(String(e)),`unhandled rejection`)}),process.on(`uncaughtException`,e=>{Ie(e instanceof Error?e:Error(String(e)),`uncaught exception`)}))}async function Re(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await I({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 ze(e){let t,n,r=!1;for(let i=0;i<e.length;i++)if(e[i]===`--last`&&e[i+1]){let n=parseInt(e[i+1],10);!isNaN(n)&&n>0&&(t=n),i++}else e[i]===`--session`&&e[i+1]?(n=e[i+1],i++):e[i]===`--usage`&&(r=!0);return{last:t,sessionId:n,usage:r}}function Be(e){let t=new Map;for(let e of d().list())t.set(e.id,e);for(let n of l(e).list())t.set(n.id,n);return[...t.values()].sort((e,t)=>e.id.localeCompare(t.id))}async function Ve(e,t=process.cwd()){let n=ze(e),r=Be(t);if(r.length===0&&(process.stderr.write(`No session files found in ${_(t).sessions} or ${E().sessions}\n`),process.exit(1)),n.usage){let e=n.sessionId===void 0?r[r.length-1]:r.find(e=>e.id.includes(n.sessionId));e||(process.stderr.write(`Session not found${n.sessionId?`: ${n.sessionId}`:``}\n`),process.exit(1)),process.stdout.write(pe(me(e))+`
|
|
49
|
+
`);return}if(n.sessionId!==void 0){let e=r.find(e=>e.id.includes(n.sessionId));e||(process.stderr.write(`Session not found: ${n.sessionId}\n`),process.exit(1)),process.stdout.write(z(R(e))+`
|
|
50
|
+
`);return}if(n.last!==void 0){let e=r.slice(-n.last).map(e=>R(e));e.length===0&&(process.stderr.write(`No valid sessions found.
|
|
51
|
+
`),process.exit(1)),process.stdout.write(fe(de(e))+`
|
|
53
52
|
`);return}let i=r[r.length-1];i||(process.stderr.write(`No sessions found.
|
|
54
|
-
`),process.exit(1))
|
|
55
|
-
`)}const
|
|
56
|
-
Recommendation: use iTerm2 (https://iterm2.com)`}:{label:`Terminal`,status:`ok`,message:e}}function
|
|
53
|
+
`),process.exit(1)),process.stdout.write(z(R(i))+`
|
|
54
|
+
`)}const He=()=>y(import.meta.url);async function Ue(e){let t=he({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 We(e,t){let n=g();if(!B(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??Ue)(`Delete ${n}? [y/N] `))return e.writeLine(`Reset cancelled.`),1}let r=S();return r.deleted?e.writeLine(`Deleted ${r.path}`):e.writeLine(`No user settings found.`),0}const Ge={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 Ke(){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 qe(e){return{label:`robota version`,status:`ok`,message:e}}function Je(e,t,n){try{let r=b(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 Ye(e){try{return JSON.parse(H(e,`utf-8`)),`ok`}catch{return`corrupt`}}function Xe(e){let t=m(e).filter(e=>B(e));return t.length===0?[{label:`Settings file`,status:`warn`,message:`Not found — run: robota --configure`}]:t.map(e=>Ye(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 Ze(e){try{let t=JSON.parse(H(e,`utf-8`));return typeof t.currentProvider==`string`?t.currentProvider:void 0}catch{return}}function Qe(e){let t=G(e,`.robota`,`settings.json`),n=G(process.env.HOME??``,`.robota`,`settings.json`),r=B(t)?t:B(n)?n:void 0;if(r!==void 0){let e=(Ze(r)??``).toLowerCase(),t=Object.entries(Ge).find(([t])=>e.startsWith(t));if(t)return t[1]}return Ge.anthropic}function $e(){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 et(e){let t=`Network (${e.host})`;return new Promise(n=>{let r=Date.now(),i=ge({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 tt(e,t={checkNetwork:et}){e.terminal.writeLine(`
|
|
57
56
|
robota diagnose
|
|
58
|
-
`);let n
|
|
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
|
|
60
|
-
`,`utf8`),t.writeLine(``),t.writeLine(`Created: .robota/settings.json`),
|
|
57
|
+
`);let n=Qe(e.cwd),r=t.providerDefinitions??M(),i=t.env??process.env,a=[Ke(),qe(e.version),Je(e.cwd,r,i),...Xe(e.cwd),$e(),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 Z=`robota`,Q={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function nt(e){let t=G(e,`settings.json`);if(!B(t))return{};let n=H(t,`utf8`);try{return JSON.parse(n)}catch{return null}}var rt=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 rt(e);let r=await n.promptFn(`${e} [y/N] `);return r.toLowerCase()===`y`||r.toLowerCase()===`yes`}async function it(e,t,n={}){t.writeLine(``),t.writeLine(`${Z} project initialization`),t.writeLine(`─`.repeat(40));let r={yes:n.yes===!0,ci:n.ci??process.env.CI===`true`,isTTY:n.isTTY??process.stdin.isTTY===!0,promptFn:n.promptFn??i,terminal:t},a=_(e).settings,o=W(a),s=G(e,`AGENTS.md`),c=G(e,`.claude`),l=B(c),u=B(a),d=B(s);if(u&&d&&(t.writeLine(``),t.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await $(`Overwrite existing files?`,!1,r))){t.writeLine(`Init cancelled.`);return}let f={...Q};if(l&&(t.writeLine(``),t.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await $(`Migrate Claude Code settings to .robota/?`,!1,r))){let e=nt(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:[...Q.permissions.allow,...n?.allow??[]],deny:n?.deny??[]}},t.writeLine(`Settings imported from .claude/settings.json.`)}}V(o,{recursive:!0}),U(a,JSON.stringify(f,null,2)+`
|
|
59
|
+
`,`utf8`),t.writeLine(``),t.writeLine(`Created: .robota/settings.json`),U(s,`# AGENTS.md — Project Agent Guidelines
|
|
61
60
|
|
|
62
61
|
This file guides the AI agent working in this project. Customize it for your project.
|
|
63
62
|
|
|
@@ -87,9 +86,9 @@ npm run build
|
|
|
87
86
|
## Important Notes
|
|
88
87
|
|
|
89
88
|
<!-- Anything the agent should know before making changes -->
|
|
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 \`${
|
|
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 \`${Z} --configure\` to set up your AI provider`),t.writeLine(` 3. Run \`${Z}\` to start the assistant`),t.writeLine(``),n.onProviderSetup!==void 0&&(r.isTTY||r.yes||r.ci)&&await $(`Would you like to set up a provider now?`,!1,r)&&await n.onProviderSetup()}function at(e=E().onboarded){return!B(e)}function ot(e=E().onboarded){V(W(e),{recursive:!0}),U(e,new Date().toISOString())}const st=`
|
|
91
90
|
╭─────────────────────────────────────────────────────────────╮
|
|
92
|
-
│ Welcome to ${
|
|
91
|
+
│ Welcome to ${Z}! — AI coding assistant │
|
|
93
92
|
│ │
|
|
94
93
|
│ Try asking: │
|
|
95
94
|
│ "Explain this project structure" │
|
|
@@ -102,14 +101,14 @@ npm run build
|
|
|
102
101
|
│ /cost show token usage and estimated cost │
|
|
103
102
|
│ /clear clear conversation history │
|
|
104
103
|
│ │
|
|
105
|
-
│ ${
|
|
104
|
+
│ ${Z} diagnose — check your setup │
|
|
106
105
|
╰─────────────────────────────────────────────────────────────╯
|
|
107
|
-
`;function
|
|
106
|
+
`;function ct(e){e.writeLine(st)}function lt(e){process.platform===`darwin`&&process.env.TERM_PROGRAM===`Apple_Terminal`&&e.writeError(`
|
|
108
107
|
⚠ macOS Terminal.app detected: CJK/IME input may be unstable.
|
|
109
108
|
Recommended: use iTerm2 (https://iterm2.com) for Korean/Japanese/Chinese input.
|
|
110
109
|
Or use headless mode: robota -p "your prompt"
|
|
111
|
-
`)}function
|
|
110
|
+
`)}function ut(){try{return e(import.meta.url)(`@robota-sdk/agent-command-workflows`).createWorkflowsCommandModule()}catch{return}}function dt(e,t,n,r,i={}){let a={settings:{read:()=>x(g()),write:e=>D(g(),e)},plugin:P(e)},o=n.providerDefinitions??M(),s={readMergedSettings:()=>v(e),readTargetSettings:()=>x(C(e)),writeTargetSettings:t=>D(C(e),t)},c=ut();return{commandHostAdapters:a,providerDefinitions:o,commandModules:[...N({cwd:e,providerDefinitions:o,providerSettingsAdapter:s,...i.enabledCommandModules===void 0?{}:{enabledCommandModules:i.enabledCommandModules},...i.disabledCommandModules===void 0?{}:{disabledCommandModules:i.disabledCommandModules}}),...c?[c]:[],...n.commandModules??[]],startupUpdateNoticePromise:T(t)?h({currentVersion:r}):void 0}}function ft(e,t){let n=H(_e(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function pt(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(ft(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(`
|
|
112
111
|
|
|
113
|
-
`):void 0}async function
|
|
114
|
-
`),process.exit(1));let
|
|
112
|
+
`):void 0}async function mt(e,t,r,i,a,o,s,c,l={},u={}){let d=t.goal?.trim(),f=t.positional.join(` `).trim();if(!d&&!f&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);f=Buffer.concat(e).toString(`utf-8`).trim()}!d&&!f&&(process.stderr.write(`Print mode (-p) requires a prompt argument (or --goal <objective>).
|
|
113
|
+
`),process.exit(1));let p=pt(e,t),m=new n({cwd:e,provider:r,outputFormat:t.outputFormat??`text`,permissionMode:t.permissionMode??u.permissionMode??`bypassPermissions`,maxTurns:t.maxTurns,sessionStore:t.noSessionPersistence?void 0:i,resumeSessionId:l.resumeSessionId,forkSession:l.forkSession,sessionName:t.sessionName,bare:t.bare||void 0,allowedTools:J(t.allowedTools),deniedTools:J(t.deniedTools),appendSystemPrompt:p,...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},...t.systemPrompt?{systemPrompt:t.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});d?await m.runGoal(d,t.goalMaxIterations?{maxIterations:t.goalMaxIterations}:{}):await m.run(f),process.exit(m.getExitCode())}function ht(t){let n;try{n=e(import.meta.url)(`@robota-sdk/agent-provider-replay`)}catch{throw Error(`--session-log replay requires @robota-sdk/agent-provider-replay, a dev-only package that is not bundled in the published CLI.`)}return n.createReplayProviderFromLogFile(t)}function gt(){let e=new oe(g());return e.register(new se),e}async function _t(e={}){if(process.argv[2]===`session`&&process.argv[3]===`analyze`){await Ve(process.argv.slice(4),process.cwd());return}let n;try{n=we()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let o=He();if(n.help){process.stdout.write(ve());return}if(n.version){process.stdout.write(`robota ${o}\n`);return}if(n.checkUpdate){let e=await c({currentVersion:o,force:!0}),t=f(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let s=process.cwd(),d=new r;if(n.reset){process.exitCode=await We(d,{yes:n.yes,isTTY:process.stdin.isTTY===!0});return}if(n.positional[0]===`diagnose`){let e=await tt({version:o,terminal:d,cwd:s});process.exitCode=+(e>0);return}if(n.positional[0]===`session`&&n.positional[1]===`analyze`){await Ve(process.argv.slice(4),s);return}try{if(await Re(n,s,d))return}catch(e){d.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let m=x(g()),h=typeof m.preset==`string`?m.preset:void 0,v=ne();for(let{file:e,error:t}of v.errors)d.writeError(`Skipped external preset "${e}": ${t}`);let y;try{y=De(n,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let S=Te(n,h),{commandHostAdapters:C,providerDefinitions:w,commandModules:T,startupUpdateNoticePromise:E}=dt(s,n,e,o,{...y.enabledCommandModules===void 0?{}:{enabledCommandModules:y.enabledCommandModules},...y.disabledCommandModules===void 0?{}:{disabledCommandModules:y.disabledCommandModules}});if(n.positional[0]===`init`){try{await it(s,d,{yes:n.yes,onProviderSetup:async()=>{await Ae(s,n,i,d,w)}})}catch(e){d.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}return}if(n.configure){await Ae(s,n,i,d,w);return}if(Oe(s,n,d,w))return;try{await ke(s,n,i,d,w)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(e instanceof a&&n.printMode?3:1)}let D=n.provider?{providerOverride:n.provider,providerDefinitions:w}:{providerDefinitions:w},O=b(s,D),A=y.model??O.model;if(O.source===`env-default`&&O.sourceEnvVar!==void 0){let e=`Using ${O.name} (${A}) via ${O.sourceEnvVar} — run \`robota --configure\` to persist a profile.\n`;n.printMode?process.stderr.write(e):d.writeLine(e.trimEnd())}let j=n.sessionLog?ht(n.sessionLog):u(s,y.model,D),M=ce(),N=_(s),P=le({workerPath:ue(),providerConfig:{...O,model:A},logsDir:N.logs}),F=l(s),I,L=!1;if(n.continueMode?I=ee(F,s):n.resumeId!==void 0&&(n.resumeId===``?L=!0:(I=te(F,n.resumeId),I===void 0&&(process.stderr.write(`Session not found: ${n.resumeId}\n`),process.exit(1)))),n.printMode||n.goal){await mt(s,n,j,F,M,P,T,C,{resumeSessionId:I,forkSession:n.forkSession},{agentName:y.agentName??k,activePresetId:S,persona:y.persona,...y.permissionMode===void 0?{}:{permissionMode:y.permissionMode},...y.enableParallelSubagents===void 0?{}:{enableParallelSubagents:y.enableParallelSubagents},...y.selfVerification===void 0?{}:{selfVerification:y.selfVerification}});return}lt(d),Le(),at()&&(ct(d),ot()),await ae({onChannelReady:e=>Fe(e),cwd:s,provider:j,providerOverride:n.provider,providerType:O.name,modelId:A,language:n.language,permissionMode:n.permissionMode??y.permissionMode,maxTurns:n.maxTurns,allowedTools:J(n.allowedTools),deniedTools:J(n.deniedTools),version:o,sessionStore:n.noSessionPersistence?void 0:F,resumeSessionId:I,showSessionPickerOnStart:L,forkSession:n.forkSession,sessionName:n.sessionName,backgroundTaskRunners:M,subagentRunnerFactory:P,commandModules:T,commandHostAdapters:C,shellExec:e=>t(e,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:E?E.then(e=>e?p(e):void 0):void 0,transportRegistry:gt(),cliAdapter:ie({providerDefinitions:w,reloadPluginCommandSource:re}),reloadPluginCommandSource:re,agentName:y.agentName??k,activePresetId:S,persona:y.persona,...y.enableParallelSubagents===void 0?{}:{enableParallelSubagents:y.enableParallelSubagents},...y.selfVerification===void 0?{}:{selfVerification:y.selfVerification}}),process.exit(0)}export{_t as startCli};
|
|
115
114
|
//# sourceMappingURL=index.js.map
|