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

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.
Files changed (93) hide show
  1. package/README.md +414 -114
  2. package/bin/robota.cjs +47 -0
  3. package/dist/node/bin.d.ts +2 -1
  4. package/dist/node/bin.js +50 -10
  5. package/dist/node/bin.js.map +1 -0
  6. package/dist/node/child-process-subagent-ipc--Vp2dk1v.js +2 -0
  7. package/dist/node/child-process-subagent-ipc--Vp2dk1v.js.map +1 -0
  8. package/dist/node/child-process-subagent-ipc-Aitv2i6E.cjs +1 -0
  9. package/dist/node/child-process-subagent-ipc-CEy8bLN6.cjs +1 -0
  10. package/dist/node/child-process-subagent-ipc-DVpVp43R.js +2 -0
  11. package/dist/node/child-process-subagent-ipc-DVpVp43R.js.map +1 -0
  12. package/dist/node/cli.cjs +1 -0
  13. package/dist/node/cli.d.ts +7 -0
  14. package/dist/node/cli.d.ts.map +1 -0
  15. package/dist/node/cli.js +2 -0
  16. package/dist/node/cli.js.map +1 -0
  17. package/dist/node/constants.cjs +1 -0
  18. package/dist/node/constants.js +2 -0
  19. package/dist/node/constants.js.map +1 -0
  20. package/dist/node/index.cjs +42 -1257
  21. package/dist/node/index.d.ts +12 -47
  22. package/dist/node/index.d.ts.map +1 -0
  23. package/dist/node/index.js +43 -13
  24. package/dist/node/index.js.map +1 -0
  25. package/dist/node/init/init-command.cjs +32 -0
  26. package/dist/node/init/init-command.js +33 -0
  27. package/dist/node/init/init-command.js.map +1 -0
  28. package/dist/node/modes/print-mode.cjs +6 -0
  29. package/dist/node/modes/print-mode.js +7 -0
  30. package/dist/node/modes/print-mode.js.map +1 -0
  31. package/dist/node/modes/shell-exec.cjs +1 -0
  32. package/dist/node/modes/shell-exec.js +2 -0
  33. package/dist/node/modes/shell-exec.js.map +1 -0
  34. package/dist/node/modes/tui-mode.cjs +1 -0
  35. package/dist/node/modes/tui-mode.js +2 -0
  36. package/dist/node/modes/tui-mode.js.map +1 -0
  37. package/dist/node/provider-default-definitions-CKtxv2k0.js +2 -0
  38. package/dist/node/provider-default-definitions-CKtxv2k0.js.map +1 -0
  39. package/dist/node/provider-default-definitions-GFiYzACo.cjs +1 -0
  40. package/dist/node/provider-default-definitions-g0ZUDeii.cjs +1 -0
  41. package/dist/node/startup/append-system-prompt.cjs +3 -0
  42. package/dist/node/startup/append-system-prompt.js +4 -0
  43. package/dist/node/startup/append-system-prompt.js.map +1 -0
  44. package/dist/node/startup/args-to-options.cjs +1 -0
  45. package/dist/node/startup/args-to-options.js +2 -0
  46. package/dist/node/startup/args-to-options.js.map +1 -0
  47. package/dist/node/startup/command-setup.cjs +1 -0
  48. package/dist/node/startup/command-setup.d.ts +11 -0
  49. package/dist/node/startup/command-setup.d.ts.map +1 -0
  50. package/dist/node/startup/command-setup.js +2 -0
  51. package/dist/node/startup/command-setup.js.map +1 -0
  52. package/dist/node/startup/config-phase.cjs +1 -0
  53. package/dist/node/startup/config-phase.js +2 -0
  54. package/dist/node/startup/config-phase.js.map +1 -0
  55. package/dist/node/startup/preflight.cjs +1 -0
  56. package/dist/node/startup/preflight.js +2 -0
  57. package/dist/node/startup/preflight.js.map +1 -0
  58. package/dist/node/startup/provider-setup.cjs +1 -0
  59. package/dist/node/startup/provider-setup.js +2 -0
  60. package/dist/node/startup/provider-setup.js.map +1 -0
  61. package/dist/node/startup/provider-startup.cjs +2 -0
  62. package/dist/node/startup/provider-startup.js +3 -0
  63. package/dist/node/startup/provider-startup.js.map +1 -0
  64. package/dist/node/startup/reset-config.cjs +1 -0
  65. package/dist/node/startup/reset-config.js +2 -0
  66. package/dist/node/startup/reset-config.js.map +1 -0
  67. package/dist/node/startup/session-setup.cjs +1 -0
  68. package/dist/node/startup/session-setup.js +2 -0
  69. package/dist/node/startup/session-setup.js.map +1 -0
  70. package/dist/node/startup/subagent-setup.cjs +1 -0
  71. package/dist/node/startup/subagent-setup.js +2 -0
  72. package/dist/node/startup/subagent-setup.js.map +1 -0
  73. package/dist/node/startup/update-notice.cjs +1 -0
  74. package/dist/node/startup/update-notice.js +2 -0
  75. package/dist/node/startup/update-notice.js.map +1 -0
  76. package/dist/node/startup/version.cjs +1 -0
  77. package/dist/node/startup/version.js +2 -0
  78. package/dist/node/startup/version.js.map +1 -0
  79. package/dist/node/subagents/child-process-subagent-worker.cjs +1 -0
  80. package/dist/node/subagents/child-process-subagent-worker.d.ts +1 -0
  81. package/dist/node/subagents/child-process-subagent-worker.js +2 -0
  82. package/dist/node/subagents/child-process-subagent-worker.js.map +1 -0
  83. package/dist/node/user-local-direct-command.cjs +1 -0
  84. package/dist/node/user-local-direct-command.js +2 -0
  85. package/dist/node/user-local-direct-command.js.map +1 -0
  86. package/dist/node/utils/cli-args.cjs +35 -0
  87. package/dist/node/utils/cli-args.js +36 -0
  88. package/dist/node/utils/cli-args.js.map +1 -0
  89. package/package.json +52 -16
  90. package/dist/node/bin.cjs +0 -1240
  91. package/dist/node/bin.d.cts +0 -1
  92. package/dist/node/chunk-A2A66S6Q.js +0 -1219
  93. package/dist/node/index.d.cts +0 -49
package/bin/robota.cjs ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ // CJS wrapper — runs synchronously before any ESM module is loaded.
4
+ // Static ESM imports in dist/node/bin.js are hoisted by the JS engine,
5
+ // so version/env checks placed there would execute too late.
6
+
7
+ const REQUIRED_NODE_MAJOR = 22;
8
+ const nodeMajor = parseInt(process.versions.node.split('.')[0], 10);
9
+ if (nodeMajor < REQUIRED_NODE_MAJOR) {
10
+ process.stderr.write(
11
+ '\n Robota requires Node.js ' +
12
+ REQUIRED_NODE_MAJOR +
13
+ ' or higher.\n' +
14
+ ' Current version: ' +
15
+ process.versions.node +
16
+ '\n' +
17
+ ' (Reason: the TUI renderer ink 7.x requires Node.js 22+)\n\n' +
18
+ ' Upgrade options:\n' +
19
+ ' nvm: nvm install ' +
20
+ REQUIRED_NODE_MAJOR +
21
+ ' && nvm use ' +
22
+ REQUIRED_NODE_MAJOR +
23
+ '\n' +
24
+ ' Volta: volta install node@' +
25
+ REQUIRED_NODE_MAJOR +
26
+ '\n' +
27
+ ' Download: https://nodejs.org/en/download\n\n',
28
+ );
29
+ process.exit(1);
30
+ }
31
+
32
+ if (process.env.TERM_PROGRAM === 'Apple_Terminal') {
33
+ process.stderr.write(
34
+ '\n ⚠️ Warning: macOS Terminal.app detected.\n' +
35
+ ' CJK input (Korean/Chinese/Japanese) may cause crashes.\n' +
36
+ ' Recommended: use iTerm2 or another terminal emulator.\n\n',
37
+ );
38
+ }
39
+
40
+ // Load ESM main entry only after synchronous checks pass.
41
+ // CJS can dynamic-import ESM in Node.js 12+. This is the only way to load
42
+ // an ESM module from CJS — eslint-disable is intentional and required.
43
+ // eslint-disable-next-line no-restricted-syntax
44
+ import(new URL('../dist/node/bin.js', 'file://' + __filename)).catch(function (err) {
45
+ process.stderr.write((err && err.message ? err.message : String(err)) + '\n');
46
+ process.exit(1);
47
+ });
@@ -1 +1,2 @@
1
- #!/usr/bin/env node
1
+
2
+ export { };
package/dist/node/bin.js CHANGED
@@ -1,11 +1,51 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- startCli
4
- } from "./chunk-A2A66S6Q.js";
5
-
6
- // src/bin.ts
7
- startCli().catch((err) => {
8
- const message = err instanceof Error ? err.message : String(err);
9
- process.stderr.write(message + "\n");
10
- process.exit(1);
11
- });
2
+ ;(function(){var v=parseInt(process.versions.node.split('.')[0],10);if(v<22){process.stderr.write('\n✗ Node.js 22+ is required (current: '+process.version+')\n\nUpgrade:\n nvm: nvm install 22 && nvm use 22\n Volta: volta install node@22\n Download: https://nodejs.org/en/download\n\n');process.exit(1);}})();
3
+ import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{applyProviderConfiguration as i,applyProviderSwitch as a,checkForCliUpdate as o,createProjectSessionStore as s,createProviderFromSettings as c,formatCliUpdateCheckMessage as l,formatCliUpdateNotice as u,getStartupCliUpdateNotice as d,getUserSettingsPath as f,projectPaths as p,readMergedProviderSettings as m,readPackageVersion as h,readProviderSettings as g,readSettings as _,resetUserConfig as v,resolveLatestSessionId as y,resolveProviderSettingsWriteTargetPath as b,resolveSessionIdByIdOrName as x,resolveSettingsPathForScope as S,shouldRunStartupCliUpdateCheck as C,writeSettings as w}from"@robota-sdk/agent-framework";import{parseArgs as T}from"node:util";import{formatSupportedProviderTypes as E}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as D}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as ee,reloadPluginCommandSource as j,runProviderStartupSetup as M}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as N,renderApp as P}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as F}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as I}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as L,getDefaultSubagentWorkerPath as R}from"@robota-sdk/agent-subagent-runner";import{readFileSync as z}from"node:fs";import{resolve as B}from"node:path";const V=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],H=[`text`,`json`,`stream-json`];function U(){return`
4
+ Usage: robota [options] [-p <prompt>]
5
+
6
+ Options:
7
+ -p <prompt> Run in print (headless) mode with the given prompt
8
+ --output-format <format> Output format: text | json | stream-json (default: text)
9
+ --system-prompt <text> Override the system prompt for this session
10
+ --append-system-prompt <t> Append text to the system prompt
11
+ --language <lang> Language preference (e.g. ko, en)
12
+ --no-session-persistence Disable session persistence for this run
13
+ --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions
14
+ --max-turns <n> Maximum agent turns before stopping
15
+ -c, --continue Continue the most recent session
16
+ -r, --resume <id> Resume a session by ID or name
17
+ -n, --name <name> Name for the new session
18
+ --fork-session Fork the current session into a new independent session
19
+ --task-file <path> Read a task prompt from file and append it to the system prompt
20
+ --bare Print mode: output raw text only, no formatting wrapper
21
+ --configure Run interactive provider configuration
22
+ --configure-provider <n> Configure a specific provider
23
+ --dry-run Plan-only run: show what the agent would do without modifying files
24
+ --check-update Check for CLI updates
25
+ --version Show version number
26
+ -h, --help Show this help message
27
+
28
+ Commands:
29
+ robota init Initialize AGENTS.md and .robota/settings.json
30
+
31
+ Examples:
32
+ robota Start interactive TUI session
33
+ robota init Initialize project files
34
+ robota -p "Hello" Print mode: send prompt and exit
35
+ robota -p "Hello" --output-format json
36
+ robota -p "Review this diff" --bare Raw output for shell pipelines
37
+ robota --task-file task.md Run task from file (appended to system prompt)
38
+ robota --dry-run "Refactor the auth module" Show plan without modifying files
39
+ robota --continue Resume the last session
40
+ `}function W(e){if(e!==void 0){if(!H.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${H.join(` | `)}`);return e}}function G(e){if(e!==void 0){if(!V.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${V.join(` | `)}`);return e}}function K(e){if(e===void 0)return;let t=parseInt(e,10);if(isNaN(t)||t<=0)throw Error(`Invalid --max-turns "${e}". Must be a positive integer.`);return t}const te={allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},language:{type:`string`},"permission-mode":{type:`string`},"max-turns":{type:`string`},"fork-session":{type:`boolean`,default:!1},name:{type:`string`,short:`n`},"output-format":{type:`string`},format:{type:`string`},summary:{type:`string`},source:{type:`string`},"system-prompt":{type:`string`},"append-system-prompt":{type:`string`},"task-file":{type:`string`},version:{type:`boolean`,default:!1},reset:{type:`boolean`,default:!1},bare:{type:`boolean`,default:!1},"allowed-tools":{type:`string`},"denied-tools":{type:`string`},model:{type:`string`},"no-session-persistence":{type:`boolean`,default:!1},"json-schema":{type:`string`},configure:{type:`boolean`,default:!1},"configure-provider":{type:`string`},provider:{type:`string`},type:{type:`string`},"base-url":{type:`string`},"api-key":{type:`string`},"api-key-env":{type:`string`},"set-current":{type:`boolean`,default:!1},"settings-scope":{type:`string`},"check-update":{type:`boolean`,default:!1},"disable-update-check":{type:`boolean`,default:!1},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function q(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:G(e[`permission-mode`]),maxTurns:K(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:W(e[`output-format`]),format:e.format,summary:e.summary,source:e.source,systemPrompt:e[`system-prompt`],appendSystemPrompt:e[`append-system-prompt`],taskFile:e[`task-file`],version:e.version??!1,reset:e.reset??!1,bare:e.bare??!1,allowedTools:e[`allowed-tools`],deniedTools:e[`denied-tools`],model:e.model,noSessionPersistence:e[`no-session-persistence`]??!1,jsonSchema:e[`json-schema`],configure:e.configure??!1,configureProvider:e[`configure-provider`],provider:e.provider,providerType:e.type,baseURL:e[`base-url`],apiKey:e[`api-key`],apiKeyEnv:e[`api-key-env`],setCurrent:e[`set-current`]??!1,settingsScope:e[`settings-scope`],checkUpdate:e[`check-update`]??!1,disableUpdateCheck:e[`disable-update-check`]??!1,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function J(){let{values:e,positionals:t}=T(te);return q(e,t)}function Y(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function X(e,t,n,r=D()){let o=S(e,Y(t.settingsScope));return t.configureProvider?(i(o,ne(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(a(t.settingsScope===void 0?b(e):o,t.provider,{knownProviders:m(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function Z(e,t,n,r,i=D(),a){await A(e,{provider:t.provider,settingsScope:Y(t.settingsScope)},n,r,i,{formatError:re,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function Q(e,t,n,r,i=D()){await M(e,{settingsScope:Y(t.settingsScope)},n,r,i)}function ne(e){let t=e.providerType??e.configureProvider;if(!e.configureProvider||!t)throw Error(`--configure-provider requires a provider profile and --type`);return{profile:e.configureProvider,type:t,...e.model!==void 0&&{model:e.model},...e.apiKey!==void 0&&{apiKey:e.apiKey},...e.apiKeyEnv!==void 0&&{apiKeyEnv:e.apiKeyEnv},...e.baseURL!==void 0&&{baseURL:e.baseURL},setCurrent:e.setCurrent}}function re(e=D()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${E(e)}`,...e.map(ie)].join(`
41
+ `)}function ie(e){return` ${[`robota --configure-provider ${e.type}`,`--type ${e.type}`,...e.defaults?.baseURL===void 0?[]:[`--base-url <url>`],`--model <model>`,...e.requiresApiKey===!0?[`--api-key-env <ENV_NAME>`]:[],`--set-current`].join(` `)}`}async function ae(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await ee({cwd:t,argv:e.positional.slice(1),format:e.format,summary:e.summary,source:e.source}),i=r.message.trimEnd();if(!r.success)throw Error(i);return n.writeLine(i),!0}const oe=()=>h(import.meta.url);function $(e){let t=v();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function se(e,t,n,r){let i={settings:{read:()=>_(f()),write:e=>w(f(),e)},plugin:k(e)},a=n.providerDefinitions??D();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...O({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>m(e),readTargetSettings:()=>_(b(e)),writeTargetSettings:t=>w(b(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:C(t)?d({currentVersion:r}):void 0}}function ce(e,t){let n=z(B(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function le(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(ce(e,t.taskFile))}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}return t.jsonSchema&&n.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),n.length>0?n.join(`
42
+
43
+ `):void 0}async function ue(e,n,r,i,a,o,s,c){let l=n.positional.join(` `).trim();if(!l&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);l=Buffer.concat(e).toString(`utf-8`).trim()}l||(process.stderr.write(`Print mode (-p) requires a prompt argument.
44
+ `),process.exit(1));let u=le(e,n),d=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:n.allowedTools?n.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:u,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function de(t={}){let i;try{i=J()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=oe();if(i.help){process.stdout.write(U());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await o({currentVersion:a,force:!0}),t=l(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new n;if(i.reset){$(f);return}try{if(await ae(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:m,providerDefinitions:h,commandModules:_,startupUpdateNoticePromise:v}=se(d,i,t,a);if(i.configure){await Q(d,i,r,f,h);return}if(X(d,i,f,h))return;try{await Z(d,i,r,f,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let b=i.provider?{providerOverride:i.provider,providerDefinitions:h}:{providerDefinitions:h},S=g(d,b),C=i.model??S.model,w=c(d,i.model,b),T=I(),E=p(d),D=L({workerPath:R(),providerConfig:{...S,model:C},logsDir:E.logs}),O=s(d),k,A=!1;if(i.continueMode?k=y(O,d):i.resumeId!==void 0&&(i.resumeId===``?A=!0:(k=x(O,i.resumeId),k===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await ue(d,i,w,O,T,D,_,m);return}await P({cwd:d,provider:w,providerOverride:i.provider,providerType:S.name,modelId:C,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:O,resumeSessionId:k,showSessionPickerOnStart:A,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:T,subagentRunnerFactory:D,commandModules:_,commandHostAdapters:m,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:v?v.then(e=>e?u(e):void 0):void 0,transportRegistry:F(),cliAdapter:N({providerDefinitions:h,reloadPluginCommandSource:j}),reloadPluginCommandSource:j,agentName:`robota-cli`}),process.exit(0)}process.on(`uncaughtException`,e=>{let t=e.message??``;if(t.includes(`string-width`)||t.includes(`setCursorPosition`)||t.includes(`getStringWidth`)||t.includes(`slice`)||t.includes(`charCodeAt`)){process.stderr.write(`
45
+ [robota] CJK/IME input error — this is a known issue with macOS Terminal.app.
46
+ Workaround: use iTerm2 (https://iterm2.com) or input your prompt in English.
47
+ Alternatively, use headless mode: robota -p "your prompt here"
48
+
49
+ `);return}throw e}),de().catch(e=>{let t=e instanceof Error?e.message:String(e);process.stderr.write(t+`
50
+ `),process.exit(1)});export{};
51
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","names":[],"sources":["../../src/utils/cli-args.ts","../../src/startup/provider-startup.ts","../../src/user-local-direct-command.ts","../../src/startup/version.ts","../../src/startup/reset-config.ts","../../src/startup/command-setup.ts","../../src/startup/append-system-prompt.ts","../../src/modes/print-mode.ts","../../src/cli.ts","../../src/bin.ts"],"sourcesContent":["/**\n * CLI argument parsing and validation.\n * Pure functions — throw on invalid input, no process.* side effects.\n */\n\nimport { parseArgs } from 'node:util';\n\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nconst VALID_MODES: TPermissionMode[] = ['plan', 'default', 'acceptEdits', 'bypassPermissions'];\n\nconst VALID_OUTPUT_FORMATS = ['text', 'json', 'stream-json'] as const;\nexport type TOutputFormat = (typeof VALID_OUTPUT_FORMATS)[number];\n\nexport interface IParsedCliArgs {\n positional: string[];\n help: boolean;\n printMode: boolean;\n continueMode: boolean;\n resumeId: string | undefined;\n language: string | undefined;\n permissionMode: TPermissionMode | undefined;\n maxTurns: number | undefined;\n forkSession: boolean;\n sessionName: string | undefined;\n outputFormat: TOutputFormat | undefined;\n format: string | undefined;\n summary: string | undefined;\n source: string | undefined;\n systemPrompt: string | undefined;\n appendSystemPrompt: string | undefined;\n taskFile: string | undefined;\n version: boolean;\n reset: boolean;\n bare: boolean;\n allowedTools: string | undefined;\n deniedTools: string | undefined;\n model: string | undefined;\n noSessionPersistence: boolean;\n jsonSchema: string | undefined;\n configure: boolean;\n configureProvider: string | undefined;\n provider: string | undefined;\n providerType: string | undefined;\n baseURL: string | undefined;\n apiKey: string | undefined;\n apiKeyEnv: string | undefined;\n setCurrent: boolean;\n settingsScope: string | undefined;\n checkUpdate: boolean;\n disableUpdateCheck: boolean;\n dryRun: boolean;\n yes: boolean;\n}\n\n/** Return CLI usage help text. */\nexport function printHelp(): string {\n return `\nUsage: robota [options] [-p <prompt>]\n\nOptions:\n -p <prompt> Run in print (headless) mode with the given prompt\n --output-format <format> Output format: text | json | stream-json (default: text)\n --system-prompt <text> Override the system prompt for this session\n --append-system-prompt <t> Append text to the system prompt\n --language <lang> Language preference (e.g. ko, en)\n --no-session-persistence Disable session persistence for this run\n --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions\n --max-turns <n> Maximum agent turns before stopping\n -c, --continue Continue the most recent session\n -r, --resume <id> Resume a session by ID or name\n -n, --name <name> Name for the new session\n --fork-session Fork the current session into a new independent session\n --task-file <path> Read a task prompt from file and append it to the system prompt\n --bare Print mode: output raw text only, no formatting wrapper\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run Plan-only run: show what the agent would do without modifying files\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nCommands:\n robota init Initialize AGENTS.md and .robota/settings.json\n\nExamples:\n robota Start interactive TUI session\n robota init Initialize project files\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota -p \"Review this diff\" --bare Raw output for shell pipelines\n robota --task-file task.md Run task from file (appended to system prompt)\n robota --dry-run \"Refactor the auth module\" Show plan without modifying files\n robota --continue Resume the last session\n`;\n}\n\n/** Validate and return a TOutputFormat from a raw CLI string, or throw on error. */\nexport function parseOutputFormat(raw: string | undefined): TOutputFormat | undefined {\n if (raw === undefined) return undefined;\n if (!(VALID_OUTPUT_FORMATS as readonly string[]).includes(raw)) {\n throw new Error(`Invalid --output-format \"${raw}\". Valid: ${VALID_OUTPUT_FORMATS.join(' | ')}`);\n }\n return raw as TOutputFormat;\n}\n\n/** Validate and return a TPermissionMode from a raw CLI string, or throw on error. */\nexport function parsePermissionMode(raw: string | undefined): TPermissionMode | undefined {\n if (raw === undefined) return undefined;\n if (!VALID_MODES.includes(raw as TPermissionMode)) {\n throw new Error(`Invalid --permission-mode \"${raw}\". Valid: ${VALID_MODES.join(' | ')}`);\n }\n return raw as TPermissionMode;\n}\n\n/** Validate and return a positive integer from a raw CLI string, or throw on error. */\nexport function parseMaxTurns(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = parseInt(raw, 10);\n if (isNaN(n) || n <= 0) {\n throw new Error(`Invalid --max-turns \"${raw}\". Must be a positive integer.`);\n }\n return n;\n}\n\nconst PARSE_ARGS_CONFIG = {\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h', default: false },\n p: { type: 'boolean', short: 'p', default: false },\n continue: { type: 'boolean', short: 'c', default: false },\n resume: { type: 'string', short: 'r' },\n language: { type: 'string' },\n 'permission-mode': { type: 'string' },\n 'max-turns': { type: 'string' },\n 'fork-session': { type: 'boolean', default: false },\n name: { type: 'string', short: 'n' },\n 'output-format': { type: 'string' },\n format: { type: 'string' },\n summary: { type: 'string' },\n source: { type: 'string' },\n 'system-prompt': { type: 'string' },\n 'append-system-prompt': { type: 'string' },\n 'task-file': { type: 'string' },\n version: { type: 'boolean', default: false },\n reset: { type: 'boolean', default: false },\n bare: { type: 'boolean', default: false },\n 'allowed-tools': { type: 'string' },\n 'denied-tools': { type: 'string' },\n model: { type: 'string' },\n 'no-session-persistence': { type: 'boolean', default: false },\n 'json-schema': { type: 'string' },\n configure: { type: 'boolean', default: false },\n 'configure-provider': { type: 'string' },\n provider: { type: 'string' },\n type: { type: 'string' },\n 'base-url': { type: 'string' },\n 'api-key': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'set-current': { type: 'boolean', default: false },\n 'settings-scope': { type: 'string' },\n 'check-update': { type: 'boolean', default: false },\n 'disable-update-check': { type: 'boolean', default: false },\n 'dry-run': { type: 'boolean', default: false },\n yes: { type: 'boolean', short: 'y', default: false },\n },\n} as const;\n\nfunction mapParsedValues(\n values: ReturnType<typeof parseArgs<typeof PARSE_ARGS_CONFIG>>['values'],\n positionals: string[],\n): IParsedCliArgs {\n return {\n positional: positionals,\n help: values['help'] ?? false,\n printMode: values['p'] ?? false,\n continueMode: values['continue'] ?? false,\n resumeId: values['resume'],\n language: values['language'],\n permissionMode: parsePermissionMode(values['permission-mode']),\n maxTurns: parseMaxTurns(values['max-turns']),\n forkSession: values['fork-session'] ?? false,\n sessionName: values['name'],\n outputFormat: parseOutputFormat(values['output-format']),\n format: values['format'],\n summary: values['summary'],\n source: values['source'],\n systemPrompt: values['system-prompt'],\n appendSystemPrompt: values['append-system-prompt'],\n taskFile: values['task-file'],\n version: values['version'] ?? false,\n reset: values['reset'] ?? false,\n bare: values['bare'] ?? false,\n allowedTools: values['allowed-tools'],\n deniedTools: values['denied-tools'],\n model: values['model'],\n noSessionPersistence: values['no-session-persistence'] ?? false,\n jsonSchema: values['json-schema'],\n configure: values['configure'] ?? false,\n configureProvider: values['configure-provider'],\n provider: values['provider'],\n providerType: values['type'],\n baseURL: values['base-url'],\n apiKey: values['api-key'],\n apiKeyEnv: values['api-key-env'],\n setCurrent: values['set-current'] ?? false,\n settingsScope: values['settings-scope'],\n checkUpdate: values['check-update'] ?? false,\n disableUpdateCheck: values['disable-update-check'] ?? false,\n dryRun: values['dry-run'] ?? false,\n yes: values['yes'] ?? false,\n };\n}\n\n/** Parse and validate CLI arguments. */\nexport function parseCliArgs(): IParsedCliArgs {\n const { values, positionals } = parseArgs(PARSE_ARGS_CONFIG);\n return mapParsedValues(values, positionals);\n}\n","import { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport {\n applyProviderConfiguration,\n applyProviderSwitch,\n readMergedProviderSettings,\n resolveProviderSettingsWriteTargetPath,\n resolveSettingsPathForScope,\n} from '@robota-sdk/agent-framework';\nimport type { TSettingsScope } from '@robota-sdk/agent-framework';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport { type IProviderSetupInput } from '@robota-sdk/agent-framework';\nimport {\n ensureProviderConfig,\n runProviderStartupSetup,\n type TPromptInput,\n} from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nfunction validateSettingsScope(scope: string | undefined): TSettingsScope | undefined {\n if (scope === undefined || scope === 'user' || scope === 'project-local') {\n return scope as TSettingsScope | undefined;\n }\n throw new Error(`Invalid --settings-scope \"${scope}\". Valid: user | project-local`);\n}\n\nexport function handleProviderConfigurationArgs(\n cwd: string,\n args: IParsedCliArgs,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(args.settingsScope));\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\n return !args.printMode && args.positional.length === 0;\n }\n if (args.provider && args.setCurrent) {\n const switchSettingsPath =\n args.settingsScope === undefined ? resolveProviderSettingsWriteTargetPath(cwd) : settingsPath;\n applyProviderSwitch(switchSettingsPath, args.provider, {\n knownProviders: readMergedProviderSettings(cwd).providers,\n });\n terminal.writeLine(`Current provider set to ${args.provider}`);\n return !args.printMode && args.positional.length === 0;\n }\n return false;\n}\n\nexport async function ensureConfig(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n isInteractive?: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: args.provider, settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive:\n isInteractive !== undefined\n ? () => isInteractive\n : () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n );\n}\n\nfunction buildSetupInputFromArgs(args: IParsedCliArgs): IProviderSetupInput {\n const type = args.providerType ?? args.configureProvider;\n if (!args.configureProvider || !type) {\n throw new Error('--configure-provider requires a provider profile and --type');\n }\n return {\n profile: args.configureProvider,\n type,\n ...(args.model !== undefined && { model: args.model }),\n ...(args.apiKey !== undefined && { apiKey: args.apiKey }),\n ...(args.apiKeyEnv !== undefined && { apiKeyEnv: args.apiKeyEnv }),\n ...(args.baseURL !== undefined && { baseURL: args.baseURL }),\n setCurrent: args.setCurrent,\n };\n}\n\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): string {\n return [\n 'No provider configuration found.',\n 'Run `robota --configure` in an interactive terminal, or configure a provider:',\n `Supported providers: ${formatSupportedProviderTypes(providerDefinitions)}`,\n ...providerDefinitions.map(formatConfigureProviderExample),\n ].join('\\n');\n}\n\nfunction formatConfigureProviderExample(definition: IProviderDefinition): string {\n const flags = [\n `robota --configure-provider ${definition.type}`,\n `--type ${definition.type}`,\n ...(definition.defaults?.baseURL !== undefined ? ['--base-url <url>'] : []),\n '--model <model>',\n ...(definition.requiresApiKey === true ? ['--api-key-env <ENV_NAME>'] : []),\n '--set-current',\n ];\n return ` ${flags.join(' ')}`;\n}\n","import { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n terminal: ITerminalOutput,\n): Promise<boolean> {\n if (args.positional[0] !== 'user-local') {\n return false;\n }\n\n const result = await executeUserLocalDirectCommand({\n cwd,\n argv: args.positional.slice(1),\n format: args.format,\n summary: args.summary,\n source: args.source,\n });\n const output = result.message.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\n","import { resetUserConfig } from '@robota-sdk/agent-framework';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nexport function runResetConfig(terminal: ITerminalOutput): void {\n const result = resetUserConfig();\n if (result.deleted) {\n terminal.writeLine(`Deleted ${result.path}`);\n } else {\n terminal.writeLine('No user settings found.');\n }\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getStartupCliUpdateNotice,\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n shouldRunStartupCliUpdateCheck,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICliUpdateNotice,\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nexport function buildCommandSetup(\n cwd: string,\n args: IParsedCliArgs,\n options: IStartCliOptions,\n version: string,\n): ICliSetup {\n const commandHostAdapters: ICommandHostAdapters = {\n settings: {\n read: () => readSettings(getUserSettingsPath()),\n write: (settings) => writeSettings(getUserSettingsPath(), settings),\n },\n plugin: createDefaultPluginCommandAdapter(cwd),\n };\n const providerDefinitions = options.providerDefinitions ?? createDefaultProviderDefinitions();\n const providerSettingsAdapter = {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n readTargetSettings: () =>\n readSettings(resolveProviderSettingsWriteTargetPath(cwd)) as TProviderSettingsDocument,\n writeTargetSettings: (settings: TProviderSettingsDocument) =>\n writeSettings(resolveProviderSettingsWriteTargetPath(cwd), settings),\n };\n const commandModules: readonly ICommandModule[] = [\n ...createDefaultCommandModules({ cwd, providerDefinitions, providerSettingsAdapter }),\n ...(options.commandModules ?? []),\n ];\n const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nfunction readTaskFilePrompt(cwd: string, taskFile: string): string {\n const taskPath = resolve(cwd, taskFile);\n const content = readFileSync(taskPath, 'utf8').trim();\n if (content.length === 0) {\n throw new Error(`Task file is empty: ${taskFile}`);\n }\n return `Task file (${taskFile}):\\n${content}`;\n}\n\nexport function buildAppendSystemPrompt(cwd: string, args: IParsedCliArgs): string | undefined {\n const appendParts: string[] = [];\n if (args.appendSystemPrompt) appendParts.push(args.appendSystemPrompt);\n if (args.taskFile) {\n try {\n appendParts.push(readTaskFilePrompt(cwd, args.taskFile));\n } catch (error) {\n // allow-fallback: terminal failure — task file read failure exits process\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n }\n if (args.jsonSchema)\n appendParts.push(\n `Respond with valid JSON only, matching this JSON schema:\\n${args.jsonSchema}`,\n );\n return appendParts.length > 0 ? appendParts.join('\\n\\n') : undefined;\n}\n","import type { IAIProvider } from '@robota-sdk/agent-core';\nimport type { ICommandHostAdapters, ICommandModule } from '@robota-sdk/agent-framework';\nimport type { createProjectSessionStore } from '@robota-sdk/agent-framework';\nimport { HeadlessInteractionChannel } from '@robota-sdk/agent-transport/headless';\nimport type { IBackgroundTaskRunner } from '@robota-sdk/agent-executor';\nimport type { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\n\nexport async function runPrintMode(\n cwd: string,\n args: IParsedCliArgs,\n provider: IAIProvider,\n sessionStore: ReturnType<typeof createProjectSessionStore>,\n backgroundTaskRunners: IBackgroundTaskRunner[],\n subagentRunnerFactory: ReturnType<typeof createChildProcessSubagentRunnerFactory>,\n commandModules: readonly ICommandModule[],\n commandHostAdapters: ICommandHostAdapters,\n): Promise<void> {\n let prompt = args.positional.join(' ').trim();\n\n if (!prompt && !process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n process.stderr.write('Print mode (-p) requires a prompt argument.\\n');\n process.exit(1);\n }\n\n const appendSystemPrompt = buildAppendSystemPrompt(cwd, args);\n\n const channel = new HeadlessInteractionChannel({\n cwd,\n provider,\n outputFormat: args.outputFormat ?? 'text',\n permissionMode: args.permissionMode ?? 'bypassPermissions',\n maxTurns: args.maxTurns,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n sessionName: args.sessionName,\n bare: args.bare || undefined,\n allowedTools: args.allowedTools\n ? args.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n appendSystemPrompt,\n ...(args.systemPrompt ? { systemPrompt: args.systemPrompt } : {}),\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n });\n\n await channel.run(prompt);\n process.exit(channel.getExitCode());\n}\n","/**\n * CLI entry point — pure composition root.\n * Parses arguments and delegates to startup modules, mode runners, and transports.\n */\n\nimport { execSync } from 'node:child_process';\nimport { PrintTerminal, promptInput } from '@robota-sdk/agent-transport/headless';\nimport {\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './startup/provider-startup.js';\nimport { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { createDefaultBackgroundTaskRunners } from '@robota-sdk/agent-executor';\nimport {\n createChildProcessSubagentRunnerFactory,\n getDefaultSubagentWorkerPath,\n} from '@robota-sdk/agent-subagent-runner';\nimport { reloadPluginCommandSource } from '@robota-sdk/agent-command';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { readVersion } from './startup/version.js';\nimport { runResetConfig } from './startup/reset-config.js';\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport { buildCommandSetup } from './startup/command-setup.js';\nimport { runPrintMode } from './modes/print-mode.js';\n\nexport type { IStartCliOptions };\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n let args: IParsedCliArgs;\n try {\n args = parseCliArgs();\n } catch (error) {\n // allow-fallback: argument validation errors are terminal — exit is the correct response\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n const version = readVersion();\n\n if (args.help) {\n process.stdout.write(printHelp());\n return;\n }\n\n if (args.version) {\n process.stdout.write(`robota ${version}\\n`);\n return;\n }\n\n if (args.checkUpdate) {\n const result = await checkForCliUpdate({ currentVersion: version, force: true });\n const message = formatCliUpdateCheckMessage(result);\n if (result.status === 'error') {\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n }\n process.stdout.write(`${message}\\n`);\n return;\n }\n\n const cwd = process.cwd();\n const terminal = new PrintTerminal();\n\n if (args.reset) {\n runResetConfig(terminal);\n return;\n }\n\n try {\n if (await runUserLocalDirectCommandIfRequested(args, cwd, terminal)) {\n return;\n }\n } catch (error) {\n // allow-fallback: user-local command failure is terminal — exit is the correct response\n terminal.writeError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, terminal, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, terminal, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, terminal, providerDefinitions);\n } catch (error) {\n // allow-fallback: terminal failure — not a silent fallback\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n\n const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n workerPath: getDefaultSubagentWorkerPath(),\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\n const sessionStore = createProjectSessionStore(cwd);\n let resumeSessionId: string | undefined;\n let showSessionPickerOnStart = false;\n\n if (args.continueMode) {\n resumeSessionId = resolveLatestSessionId(sessionStore, cwd);\n } else if (args.resumeId !== undefined) {\n if (args.resumeId === '') {\n showSessionPickerOnStart = true;\n } else {\n resumeSessionId = resolveSessionIdByIdOrName(sessionStore, args.resumeId);\n if (resumeSessionId === undefined) {\n process.stderr.write(`Session not found: ${args.resumeId}\\n`);\n process.exit(1);\n }\n }\n }\n\n if (args.printMode) {\n await runPrintMode(\n cwd,\n args,\n provider,\n sessionStore,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n );\n return;\n }\n\n await renderApp({\n cwd,\n provider,\n providerOverride: args.provider,\n providerType: providerSettings.name,\n modelId,\n language: args.language,\n permissionMode: args.permissionMode,\n maxTurns: args.maxTurns,\n version,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n resumeSessionId,\n showSessionPickerOnStart,\n forkSession: args.forkSession,\n sessionName: args.sessionName,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n shellExec: (command: string) =>\n execSync(command, { timeout: 5000, encoding: 'utf-8', stdio: 'pipe' }).trimEnd(),\n startupUpdateNotice: startupUpdateNoticePromise\n ? startupUpdateNoticePromise.then((n) => (n ? formatCliUpdateNotice(n) : undefined))\n : undefined,\n transportRegistry: createDefaultTransportRegistry(),\n cliAdapter: createDefaultTuiCliAdapter({ providerDefinitions, reloadPluginCommandSource }),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\n });\n process.exit(0);\n}\n","#!/usr/bin/env node\n/**\n * Robota CLI binary entry point.\n *\n * Boots the CLI and handles any uncaught top-level errors gracefully.\n *\n * A Node.js version check (>=22) is injected as a build-time banner in\n * tsdown.config.ts and runs before any module imports are loaded.\n */\nimport { startCli } from './cli.js';\n\n// Last-resort crash prevention for IME-related errors only.\n// Korean IME in raw mode can cause errors that escape React/Ink.\n// Non-IME errors are re-thrown to preserve normal crash behavior.\nprocess.on('uncaughtException', (err) => {\n const msg = err.message ?? '';\n const isLikelyIME =\n msg.includes('string-width') ||\n msg.includes('setCursorPosition') ||\n msg.includes('getStringWidth') ||\n msg.includes('slice') ||\n msg.includes('charCodeAt');\n if (isLikelyIME) {\n process.stderr.write(\n '\\n[robota] CJK/IME input error — this is a known issue with macOS Terminal.app.\\n' +\n ' Workaround: use iTerm2 (https://iterm2.com) or input your prompt in English.\\n' +\n ' Alternatively, use headless mode: robota -p \"your prompt here\"\\n\\n',\n );\n return;\n }\n // Re-throw non-IME errors — let them crash normally\n throw err;\n});\n\nstartCli().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(message + '\\n');\n process.exit(1);\n});\n"],"mappings":";;goDASA,MAAM,EAAiC,CAAC,OAAQ,UAAW,cAAe,mBAAmB,EAEvF,EAAuB,CAAC,OAAQ,OAAQ,aAAa,EA6C3D,SAAgB,GAAoB,CAClC,MAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCT,CAGA,SAAgB,EAAkB,EAAoD,CAChF,OAAQ,IAAA,GACZ,IAAI,CAAE,EAA2C,SAAS,CAAG,EAC3D,MAAU,MAAM,4BAA4B,EAAI,YAAY,EAAqB,KAAK,KAAK,GAAG,EAEhG,OAAO,CAFyF,CAGlG,CAGA,SAAgB,EAAoB,EAAsD,CACpF,OAAQ,IAAA,GACZ,IAAI,CAAC,EAAY,SAAS,CAAsB,EAC9C,MAAU,MAAM,8BAA8B,EAAI,YAAY,EAAY,KAAK,KAAK,GAAG,EAEzF,OAAO,CAFkF,CAG3F,CAGA,SAAgB,EAAc,EAA6C,CACzE,GAAI,IAAQ,IAAA,GAAW,OACvB,IAAM,EAAI,SAAS,EAAK,EAAE,EAC1B,GAAI,MAAM,CAAC,GAAK,GAAK,EACnB,MAAU,MAAM,wBAAwB,EAAI,+BAA+B,EAE7E,OAAO,CACT,CAEA,MAAM,GAAoB,CACxB,iBAAkB,GAClB,QAAS,CACP,KAAM,CAAE,KAAM,UAAW,MAAO,IAAK,QAAS,EAAM,EACpD,EAAG,CAAE,KAAM,UAAW,MAAO,IAAK,QAAS,EAAM,EACjD,SAAU,CAAE,KAAM,UAAW,MAAO,IAAK,QAAS,EAAM,EACxD,OAAQ,CAAE,KAAM,SAAU,MAAO,GAAI,EACrC,SAAU,CAAE,KAAM,QAAS,EAC3B,kBAAmB,CAAE,KAAM,QAAS,EACpC,YAAa,CAAE,KAAM,QAAS,EAC9B,eAAgB,CAAE,KAAM,UAAW,QAAS,EAAM,EAClD,KAAM,CAAE,KAAM,SAAU,MAAO,GAAI,EACnC,gBAAiB,CAAE,KAAM,QAAS,EAClC,OAAQ,CAAE,KAAM,QAAS,EACzB,QAAS,CAAE,KAAM,QAAS,EAC1B,OAAQ,CAAE,KAAM,QAAS,EACzB,gBAAiB,CAAE,KAAM,QAAS,EAClC,uBAAwB,CAAE,KAAM,QAAS,EACzC,YAAa,CAAE,KAAM,QAAS,EAC9B,QAAS,CAAE,KAAM,UAAW,QAAS,EAAM,EAC3C,MAAO,CAAE,KAAM,UAAW,QAAS,EAAM,EACzC,KAAM,CAAE,KAAM,UAAW,QAAS,EAAM,EACxC,gBAAiB,CAAE,KAAM,QAAS,EAClC,eAAgB,CAAE,KAAM,QAAS,EACjC,MAAO,CAAE,KAAM,QAAS,EACxB,yBAA0B,CAAE,KAAM,UAAW,QAAS,EAAM,EAC5D,cAAe,CAAE,KAAM,QAAS,EAChC,UAAW,CAAE,KAAM,UAAW,QAAS,EAAM,EAC7C,qBAAsB,CAAE,KAAM,QAAS,EACvC,SAAU,CAAE,KAAM,QAAS,EAC3B,KAAM,CAAE,KAAM,QAAS,EACvB,WAAY,CAAE,KAAM,QAAS,EAC7B,UAAW,CAAE,KAAM,QAAS,EAC5B,cAAe,CAAE,KAAM,QAAS,EAChC,cAAe,CAAE,KAAM,UAAW,QAAS,EAAM,EACjD,iBAAkB,CAAE,KAAM,QAAS,EACnC,eAAgB,CAAE,KAAM,UAAW,QAAS,EAAM,EAClD,uBAAwB,CAAE,KAAM,UAAW,QAAS,EAAM,EAC1D,UAAW,CAAE,KAAM,UAAW,QAAS,EAAM,EAC7C,IAAK,CAAE,KAAM,UAAW,MAAO,IAAK,QAAS,EAAM,CACrD,CACF,EAEA,SAAS,EACP,EACA,EACgB,CAChB,MAAO,CACL,WAAY,EACZ,KAAM,EAAO,MAAW,GACxB,UAAW,EAAO,GAAQ,GAC1B,aAAc,EAAO,UAAe,GACpC,SAAU,EAAO,OACjB,SAAU,EAAO,SACjB,eAAgB,EAAoB,EAAO,kBAAkB,EAC7D,SAAU,EAAc,EAAO,YAAY,EAC3C,YAAa,EAAO,iBAAmB,GACvC,YAAa,EAAO,KACpB,aAAc,EAAkB,EAAO,gBAAgB,EACvD,OAAQ,EAAO,OACf,QAAS,EAAO,QAChB,OAAQ,EAAO,OACf,aAAc,EAAO,iBACrB,mBAAoB,EAAO,wBAC3B,SAAU,EAAO,aACjB,QAAS,EAAO,SAAc,GAC9B,MAAO,EAAO,OAAY,GAC1B,KAAM,EAAO,MAAW,GACxB,aAAc,EAAO,iBACrB,YAAa,EAAO,gBACpB,MAAO,EAAO,MACd,qBAAsB,EAAO,2BAA6B,GAC1D,WAAY,EAAO,eACnB,UAAW,EAAO,WAAgB,GAClC,kBAAmB,EAAO,sBAC1B,SAAU,EAAO,SACjB,aAAc,EAAO,KACrB,QAAS,EAAO,YAChB,OAAQ,EAAO,WACf,UAAW,EAAO,eAClB,WAAY,EAAO,gBAAkB,GACrC,cAAe,EAAO,kBACtB,YAAa,EAAO,iBAAmB,GACvC,mBAAoB,EAAO,yBAA2B,GACtD,OAAQ,EAAO,YAAc,GAC7B,IAAK,EAAO,KAAU,EACxB,CACF,CAGA,SAAgB,GAA+B,CAC7C,GAAM,CAAE,SAAQ,eAAgB,EAAU,EAAiB,EAC3D,OAAO,EAAgB,EAAQ,CAAW,CAC5C,CCvMA,SAAS,EAAsB,EAAuD,CACpF,GAAI,IAAU,IAAA,IAAa,IAAU,QAAU,IAAU,gBACvD,OAAO,EAET,MAAU,MAAM,6BAA6B,EAAM,+BAA+B,CACpF,CAEA,SAAgB,EACd,EACA,EACA,EACA,EAAsD,EAAiC,EAC9E,CACT,IAAM,EAAe,EAA4B,EAAK,EAAsB,EAAK,aAAa,CAAC,EAiB/F,OAhBI,EAAK,mBACP,EAA2B,EAAc,GAAwB,CAAI,EAAG,CACtE,qBACF,CAAC,EACD,EAAS,UAAU,6BAA6B,GAAc,EACvD,CAAC,EAAK,WAAa,EAAK,WAAW,SAAW,GAEnD,EAAK,UAAY,EAAK,YAGxB,EADE,EAAK,gBAAkB,IAAA,GAAY,EAAuC,CAAG,EAAI,EAC3C,EAAK,SAAU,CACrD,eAAgB,EAA2B,CAAG,EAAE,SAClD,CAAC,EACD,EAAS,UAAU,2BAA2B,EAAK,UAAU,EACtD,CAAC,EAAK,WAAa,EAAK,WAAW,SAAW,GAEhD,EACT,CAEA,eAAsB,EACpB,EACA,EACA,EACA,EACA,EAAsD,EAAiC,EACvF,EACe,CACf,MAAM,EACJ,EACA,CAAE,SAAU,EAAK,SAAU,cAAe,EAAsB,EAAK,aAAa,CAAE,EACpF,EACA,EACA,EACA,CACE,YAAa,GACb,cACE,IAAkB,IAAA,OAER,QAAQ,MAAM,QAAU,IAAQ,QAAQ,OAAO,QAAU,OADzD,CAEd,CACF,CACF,CAEA,eAAsB,EACpB,EACA,EACA,EACA,EACA,EAAsD,EAAiC,EACxE,CACf,MAAM,EACJ,EACA,CAAE,cAAe,EAAsB,EAAK,aAAa,CAAE,EAC3D,EACA,EACA,CACF,CACF,CAEA,SAAS,GAAwB,EAA2C,CAC1E,IAAM,EAAO,EAAK,cAAgB,EAAK,kBACvC,GAAI,CAAC,EAAK,mBAAqB,CAAC,EAC9B,MAAU,MAAM,6DAA6D,EAE/E,MAAO,CACL,QAAS,EAAK,kBACd,OACA,GAAI,EAAK,QAAU,IAAA,IAAa,CAAE,MAAO,EAAK,KAAM,EACpD,GAAI,EAAK,SAAW,IAAA,IAAa,CAAE,OAAQ,EAAK,MAAO,EACvD,GAAI,EAAK,YAAc,IAAA,IAAa,CAAE,UAAW,EAAK,SAAU,EAChE,GAAI,EAAK,UAAY,IAAA,IAAa,CAAE,QAAS,EAAK,OAAQ,EAC1D,WAAY,EAAK,UACnB,CACF,CAEA,SAAgB,GACd,EAAsD,EAAiC,EAC/E,CACR,MAAO,CACL,mCACA,gFACA,wBAAwB,EAA6B,CAAmB,IACxE,GAAG,EAAoB,IAAI,EAA8B,CAC3D,EAAE,KAAK;CAAI,CACb,CAEA,SAAS,GAA+B,EAAyC,CAS/E,MAAO,KAAK,CAPV,+BAA+B,EAAW,OAC1C,UAAU,EAAW,OACrB,GAAI,EAAW,UAAU,UAAY,IAAA,GAAmC,CAAC,EAAxB,CAAC,kBAAkB,EACpE,kBACA,GAAI,EAAW,iBAAmB,GAAO,CAAC,0BAA0B,EAAI,CAAC,EACzE,eAEc,EAAE,KAAK,GAAG,GAC5B,CC7HA,eAAsB,GACpB,EACA,EACA,EACkB,CAClB,GAAI,EAAK,WAAW,KAAO,aACzB,MAAO,GAGT,IAAM,EAAS,MAAM,GAA8B,CACjD,MACA,KAAM,EAAK,WAAW,MAAM,CAAC,EAC7B,OAAQ,EAAK,OACb,QAAS,EAAK,QACd,OAAQ,EAAK,MACf,CAAC,EACK,EAAS,EAAO,QAAQ,QAAQ,EACtC,GAAI,CAAC,EAAO,QACV,MAAU,MAAM,CAAM,EAGxB,OADA,EAAS,UAAU,CAAM,EAClB,EACT,CCxBA,MAAa,OAA4B,EAAmB,OAAO,KAAK,GAAG,ECC3E,SAAgB,EAAe,EAAiC,CAC9D,IAAM,EAAS,EAAgB,EAC3B,EAAO,QACT,EAAS,UAAU,WAAW,EAAO,MAAM,EAE3C,EAAS,UAAU,yBAAyB,CAEhD,CCyBA,SAAgB,GACd,EACA,EACA,EACA,EACW,CACX,IAAM,EAA4C,CAChD,SAAU,CACR,SAAY,EAAa,EAAoB,CAAC,EAC9C,MAAQ,GAAa,EAAc,EAAoB,EAAG,CAAQ,CACpE,EACA,OAAQ,EAAkC,CAAG,CAC/C,EACM,EAAsB,EAAQ,qBAAuB,EAAiC,EAe5F,MAAO,CAAE,sBAAqB,sBAAqB,eAAA,CANjD,GAAG,EAA4B,CAAE,MAAK,sBAAqB,wBAAA,CAP3D,uBAA0B,EAA2B,CAAG,EACxD,uBACE,EAAa,EAAuC,CAAG,CAAC,EAC1D,oBAAsB,GACpB,EAAc,EAAuC,CAAG,EAAG,CAAQ,CAGY,CAAE,CAAC,EACpF,GAAI,EAAQ,gBAAkB,CAAC,CAK+B,EAAG,2BAHhC,EAA+B,CAAI,EAClE,EAA0B,CAAE,eAAgB,CAAQ,CAAC,EACrD,IAAA,EAC0F,CAChG,CC5DA,SAAS,GAAmB,EAAa,EAA0B,CAEjE,IAAM,EAAU,EADC,EAAQ,EAAK,CACM,EAAG,MAAM,EAAE,KAAK,EACpD,GAAI,EAAQ,SAAW,EACrB,MAAU,MAAM,uBAAuB,GAAU,EAEnD,MAAO,cAAc,EAAS,MAAM,GACtC,CAEA,SAAgB,GAAwB,EAAa,EAA0C,CAC7F,IAAM,EAAwB,CAAC,EAE/B,GADI,EAAK,oBAAoB,EAAY,KAAK,EAAK,kBAAkB,EACjE,EAAK,SACP,GAAI,CACF,EAAY,KAAK,GAAmB,EAAK,EAAK,QAAQ,CAAC,CACzD,OAAS,EAAO,CAEd,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,KAAK,CAAC,CAChB,CAMF,OAJI,EAAK,YACP,EAAY,KACV,6DAA6D,EAAK,YACpE,EACK,EAAY,OAAS,EAAI,EAAY,KAAK;;CAAM,EAAI,IAAA,EAC7D,CCrBA,eAAsB,GACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACe,CACf,IAAI,EAAS,EAAK,WAAW,KAAK,GAAG,EAAE,KAAK,EAE5C,GAAI,CAAC,GAAU,CAAC,QAAQ,MAAM,MAAO,CACnC,IAAM,EAAmB,CAAC,EAC1B,UAAW,IAAM,KAAS,QAAQ,MAChC,EAAO,KAAK,CAAe,EAE7B,EAAS,OAAO,OAAO,CAAM,EAAE,SAAS,OAAO,EAAE,KAAK,CACxD,CAEK,IACH,QAAQ,OAAO,MAAM;CAA+C,EACpE,QAAQ,KAAK,CAAC,GAGhB,IAAM,EAAqB,GAAwB,EAAK,CAAI,EAEtD,EAAU,IAAI,EAA2B,CAC7C,MACA,WACA,aAAc,EAAK,cAAgB,OACnC,eAAgB,EAAK,gBAAkB,oBACvC,SAAU,EAAK,SACf,aAAc,EAAK,qBAAuB,IAAA,GAAY,EACtD,YAAa,EAAK,YAClB,KAAM,EAAK,MAAQ,IAAA,GACnB,aAAc,EAAK,aACf,EAAK,aACF,MAAM,GAAG,EACT,IAAK,GAAM,EAAE,KAAK,CAAC,EACnB,OAAQ,GAAM,EAAE,OAAS,CAAC,EAC7B,IAAA,GACJ,qBACA,GAAI,EAAK,aAAe,CAAE,aAAc,EAAK,YAAa,EAAI,CAAC,EAC/D,wBACA,wBACA,iBACA,qBACF,CAAC,EAED,MAAM,EAAQ,IAAI,CAAM,EACxB,QAAQ,KAAK,EAAQ,YAAY,CAAC,CACpC,CClBA,eAAsB,GAAS,EAA4B,CAAC,EAAkB,CAC5E,IAAI,EACJ,GAAI,CACF,EAAO,EAAa,CACtB,OAAS,EAAO,CAEd,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,KAAK,CAAC,CAChB,CACA,IAAM,EAAU,GAAY,EAE5B,GAAI,EAAK,KAAM,CACb,QAAQ,OAAO,MAAM,EAAU,CAAC,EAChC,MACF,CAEA,GAAI,EAAK,QAAS,CAChB,QAAQ,OAAO,MAAM,UAAU,EAAQ,GAAG,EAC1C,MACF,CAEA,GAAI,EAAK,YAAa,CACpB,IAAM,EAAS,MAAM,EAAkB,CAAE,eAAgB,EAAS,MAAO,EAAK,CAAC,EACzE,EAAU,EAA4B,CAAM,EAC9C,EAAO,SAAW,UACpB,QAAQ,OAAO,MAAM,GAAG,EAAQ,GAAG,EACnC,QAAQ,KAAK,CAAC,GAEhB,QAAQ,OAAO,MAAM,GAAG,EAAQ,GAAG,EACnC,MACF,CAEA,IAAM,EAAM,QAAQ,IAAI,EAClB,EAAW,IAAI,EAErB,GAAI,EAAK,MAAO,CACd,EAAe,CAAQ,EACvB,MACF,CAEA,GAAI,CACF,GAAI,MAAM,GAAqC,EAAM,EAAK,CAAQ,EAChE,MAEJ,OAAS,EAAO,CAEd,EAAS,WAAW,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAAC,EAC1E,QAAQ,KAAK,CAAC,CAChB,CAEA,GAAM,CAAE,sBAAqB,sBAAqB,iBAAgB,8BAChE,GAAkB,EAAK,EAAM,EAAS,CAAO,EAE/C,GAAI,EAAK,UAAW,CAClB,MAAM,EAA4B,EAAK,EAAM,EAAa,EAAU,CAAmB,EACvF,MACF,CAEA,GAAI,EAAgC,EAAK,EAAM,EAAU,CAAmB,EAC1E,OAGF,GAAI,CACF,MAAM,EAAa,EAAK,EAAM,EAAa,EAAU,CAAmB,CAC1E,OAAS,EAAO,CAEd,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,KAAK,CAAC,CAChB,CAEA,IAAM,EAAkB,EAAK,SACzB,CAAE,iBAAkB,EAAK,SAAU,qBAAoB,EACvD,CAAE,qBAAoB,EACpB,EAAmB,EAAqB,EAAK,CAAe,EAC5D,EAAU,EAAK,OAAS,EAAiB,MACzC,EAAW,EAA2B,EAAK,EAAK,MAAO,CAAe,EACtE,EAAwB,EAAmC,EAC3D,EAAQ,EAAa,CAAG,EACxB,EAAwB,EAAwC,CACpE,WAAY,EAA6B,EACzC,eAAgB,CAAE,GAAG,EAAkB,MAAO,CAAQ,EACtD,QAAS,EAAM,IACjB,CAAC,EAEK,EAAe,EAA0B,CAAG,EAC9C,EACA,EAA2B,GAgB/B,GAdI,EAAK,aACP,EAAkB,EAAuB,EAAc,CAAG,EACjD,EAAK,WAAa,IAAA,KACvB,EAAK,WAAa,GACpB,EAA2B,IAE3B,EAAkB,EAA2B,EAAc,EAAK,QAAQ,EACpE,IAAoB,IAAA,KACtB,QAAQ,OAAO,MAAM,sBAAsB,EAAK,SAAS,GAAG,EAC5D,QAAQ,KAAK,CAAC,KAKhB,EAAK,UAAW,CAClB,MAAM,GACJ,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,EACA,MACF,CAEA,MAAM,EAAU,CACd,MACA,WACA,iBAAkB,EAAK,SACvB,aAAc,EAAiB,KAC/B,UACA,SAAU,EAAK,SACf,eAAgB,EAAK,eACrB,SAAU,EAAK,SACf,UACA,aAAc,EAAK,qBAAuB,IAAA,GAAY,EACtD,kBACA,2BACA,YAAa,EAAK,YAClB,YAAa,EAAK,YAClB,wBACA,wBACA,iBACA,sBACA,UAAY,GACV,EAAS,EAAS,CAAE,QAAS,IAAM,SAAU,QAAS,MAAO,MAAO,CAAC,EAAE,QAAQ,EACjF,oBAAqB,EACjB,EAA2B,KAAM,GAAO,EAAI,EAAsB,CAAC,EAAI,IAAA,EAAU,EACjF,IAAA,GACJ,kBAAmB,EAA+B,EAClD,WAAY,EAA2B,CAAE,sBAAqB,2BAA0B,CAAC,EACzF,4BACA,UAAW,YACb,CAAC,EACD,QAAQ,KAAK,CAAC,CAChB,CC/KA,QAAQ,GAAG,oBAAsB,GAAQ,CACvC,IAAM,EAAM,EAAI,SAAW,GAO3B,GALE,EAAI,SAAS,cAAc,GAC3B,EAAI,SAAS,mBAAmB,GAChC,EAAI,SAAS,gBAAgB,GAC7B,EAAI,SAAS,OAAO,GACpB,EAAI,SAAS,YAAY,EACV,CACf,QAAQ,OAAO,MACb;;;;;CAGF,EACA,MACF,CAEA,MAAM,CACR,CAAC,EAED,GAAS,EAAE,MAAO,GAAQ,CACxB,IAAM,EAAU,aAAe,MAAQ,EAAI,QAAU,OAAO,CAAG,EAC/D,QAAQ,OAAO,MAAM,EAAU;CAAI,EACnC,QAAQ,KAAK,CAAC,CAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{createAnthropicProviderDefinition as e}from"@robota-sdk/agent-provider-anthropic";import{createDeepSeekProviderDefinition as t}from"@robota-sdk/agent-provider-deepseek";import{createGemmaProviderDefinition as n}from"@robota-sdk/agent-provider-gemma";import{createGeminiProviderDefinition as r}from"@robota-sdk/agent-provider-gemini";import{createOpenAIProviderDefinition as i}from"@robota-sdk/agent-provider-openai";import{createQwenProviderDefinition as a}from"@robota-sdk/agent-provider-qwen";const o=[e(),i(),r(),n(),a(),t()];function s(e){return typeof e==`object`&&!!e}function c(e,t){return typeof e[t]==`string`}function l(e){return!s(e)||!c(e,`jobId`)||!s(e.request)||!c(e.request,`type`)||!c(e.request,`prompt`)||!s(e.agentDefinition)||!c(e.agentDefinition,`name`)||!c(e.agentDefinition,`systemPrompt`)||!s(e.parentConfig)||!s(e.parentContext)||!s(e.providerProfile)||!c(e.providerProfile,`type`)?!1:c(e.providerProfile,`model`)}function u(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`start`:return l(e.payload);case`send`:return c(e,`prompt`);case`cancel`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}function d(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`ready`:return!0;case`text_delta`:return c(e,`delta`);case`tool_start`:return c(e,`toolName`);case`tool_end`:return c(e,`toolName`)&&typeof e.success==`boolean`;case`result`:return c(e,`output`);case`error`:return c(e,`message`);case`cancelled`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}export{u as n,o as r,d as t};
2
+ //# sourceMappingURL=child-process-subagent-ipc--Vp2dk1v.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-process-subagent-ipc--Vp2dk1v.js","names":[],"sources":["../../src/utils/provider-default-definitions.ts","../../src/subagents/child-process-subagent-ipc.ts"],"sourcesContent":["import { createAnthropicProviderDefinition } from '@robota-sdk/agent-provider-anthropic';\nimport { createDeepSeekProviderDefinition } from '@robota-sdk/agent-provider-deepseek';\nimport { createGemmaProviderDefinition } from '@robota-sdk/agent-provider-gemma';\nimport { createGeminiProviderDefinition } from '@robota-sdk/agent-provider-gemini';\nimport { createOpenAIProviderDefinition } from '@robota-sdk/agent-provider-openai';\nimport { createQwenProviderDefinition } from '@robota-sdk/agent-provider-qwen';\nimport type { IProviderDefinition } from './provider-definition.js';\n\nexport const DEFAULT_PROVIDER_DEFINITIONS: readonly IProviderDefinition[] = [\n createAnthropicProviderDefinition(),\n createOpenAIProviderDefinition(),\n createGeminiProviderDefinition(),\n createGemmaProviderDefinition(),\n createQwenProviderDefinition(),\n createDeepSeekProviderDefinition(),\n];\n","import type { TPermissionMode, TToolArgs } from '@robota-sdk/agent-core';\nimport type {\n ISerializableProviderProfile,\n ISubagentSpawnRequest,\n} from '@robota-sdk/agent-executor';\nimport type { IAgentDefinition, IInProcessSubagentRunnerDeps } from '@robota-sdk/agent-framework';\n\nexport type TSubagentWorkerWireValue = string | number | boolean | null | undefined | object;\n\ntype TSubagentWorkerWireRecord = Record<string, TSubagentWorkerWireValue>;\n\nexport interface ISubagentWorkerStartPayload {\n jobId: string;\n request: ISubagentSpawnRequest;\n agentDefinition: IAgentDefinition;\n parentConfig: IInProcessSubagentRunnerDeps['config'];\n parentContext: IInProcessSubagentRunnerDeps['context'];\n providerProfile: ISerializableProviderProfile;\n permissionMode?: TPermissionMode;\n logsDir?: string;\n}\n\nexport interface ISubagentWorkerStartMessage {\n type: 'start';\n payload: ISubagentWorkerStartPayload;\n}\n\nexport interface ISubagentWorkerSendMessage {\n type: 'send';\n prompt: string;\n}\n\nexport interface ISubagentWorkerCancelMessage {\n type: 'cancel';\n reason?: string;\n}\n\nexport type TSubagentWorkerParentMessage =\n | ISubagentWorkerStartMessage\n | ISubagentWorkerSendMessage\n | ISubagentWorkerCancelMessage;\n\nexport interface ISubagentWorkerReadyMessage {\n type: 'ready';\n}\n\nexport interface ISubagentWorkerTextDeltaMessage {\n type: 'text_delta';\n delta: string;\n}\n\nexport interface ISubagentWorkerToolStartMessage {\n type: 'tool_start';\n toolName: string;\n toolArgs?: TToolArgs;\n}\n\nexport interface ISubagentWorkerToolEndMessage {\n type: 'tool_end';\n toolName: string;\n success: boolean;\n}\n\nexport interface ISubagentWorkerResultMessage {\n type: 'result';\n output: string;\n}\n\nexport interface ISubagentWorkerErrorMessage {\n type: 'error';\n message: string;\n}\n\nexport interface ISubagentWorkerCancelledMessage {\n type: 'cancelled';\n reason?: string;\n}\n\nexport type TSubagentWorkerChildMessage =\n | ISubagentWorkerReadyMessage\n | ISubagentWorkerTextDeltaMessage\n | ISubagentWorkerToolStartMessage\n | ISubagentWorkerToolEndMessage\n | ISubagentWorkerResultMessage\n | ISubagentWorkerErrorMessage\n | ISubagentWorkerCancelledMessage;\n\nfunction isRecord(value: TSubagentWorkerWireValue): value is TSubagentWorkerWireRecord {\n return typeof value === 'object' && value !== null;\n}\n\nfunction hasString(value: TSubagentWorkerWireRecord, key: string): boolean {\n return typeof value[key] === 'string';\n}\n\nfunction isStartPayload(value: TSubagentWorkerWireValue): value is ISubagentWorkerStartPayload {\n if (!isRecord(value)) return false;\n if (!hasString(value, 'jobId')) return false;\n if (!isRecord(value.request)) return false;\n if (!hasString(value.request, 'type')) return false;\n if (!hasString(value.request, 'prompt')) return false;\n if (!isRecord(value.agentDefinition)) return false;\n if (!hasString(value.agentDefinition, 'name')) return false;\n if (!hasString(value.agentDefinition, 'systemPrompt')) return false;\n if (!isRecord(value.parentConfig)) return false;\n if (!isRecord(value.parentContext)) return false;\n if (!isRecord(value.providerProfile)) return false;\n if (!hasString(value.providerProfile, 'type')) return false;\n return hasString(value.providerProfile, 'model');\n}\n\nexport function isSubagentWorkerParentMessage(\n value: TSubagentWorkerWireValue,\n): value is TSubagentWorkerParentMessage {\n if (!isRecord(value) || !hasString(value, 'type')) return false;\n switch (value.type) {\n case 'start':\n return isStartPayload(value.payload);\n case 'send':\n return hasString(value, 'prompt');\n case 'cancel':\n return value.reason === undefined || typeof value.reason === 'string';\n default:\n return false;\n }\n}\n\nexport function isSubagentWorkerChildMessage(\n value: TSubagentWorkerWireValue,\n): value is TSubagentWorkerChildMessage {\n if (!isRecord(value) || !hasString(value, 'type')) return false;\n switch (value.type) {\n case 'ready':\n return true;\n case 'text_delta':\n return hasString(value, 'delta');\n case 'tool_start':\n return hasString(value, 'toolName');\n case 'tool_end':\n return hasString(value, 'toolName') && typeof value.success === 'boolean';\n case 'result':\n return hasString(value, 'output');\n case 'error':\n return hasString(value, 'message');\n case 'cancelled':\n return value.reason === undefined || typeof value.reason === 'string';\n default:\n return false;\n }\n}\n"],"mappings":"sfAQA,MAAa,EAA+D,CAC1E,EAAkC,EAClC,EAA+B,EAC/B,EAA+B,EAC/B,EAA8B,EAC9B,EAA6B,EAC7B,EAAiC,CACnC,ECwEA,SAAS,EAAS,EAAqE,CACrF,OAAO,OAAO,GAAU,YAAY,CACtC,CAEA,SAAS,EAAU,EAAkC,EAAsB,CACzE,OAAO,OAAO,EAAM,IAAS,QAC/B,CAEA,SAAS,EAAe,EAAuE,CAa7F,MAZI,CAAC,EAAS,CAAK,GACf,CAAC,EAAU,EAAO,OAAO,GACzB,CAAC,EAAS,EAAM,OAAO,GACvB,CAAC,EAAU,EAAM,QAAS,MAAM,GAChC,CAAC,EAAU,EAAM,QAAS,QAAQ,GAClC,CAAC,EAAS,EAAM,eAAe,GAC/B,CAAC,EAAU,EAAM,gBAAiB,MAAM,GACxC,CAAC,EAAU,EAAM,gBAAiB,cAAc,GAChD,CAAC,EAAS,EAAM,YAAY,GAC5B,CAAC,EAAS,EAAM,aAAa,GAC7B,CAAC,EAAS,EAAM,eAAe,GAC/B,CAAC,EAAU,EAAM,gBAAiB,MAAM,EAAU,GAC/C,EAAU,EAAM,gBAAiB,OAAO,CACjD,CAEA,SAAgB,EACd,EACuC,CACvC,GAAI,CAAC,EAAS,CAAK,GAAK,CAAC,EAAU,EAAO,MAAM,EAAG,MAAO,GAC1D,OAAQ,EAAM,KAAd,CACE,IAAK,QACH,OAAO,EAAe,EAAM,OAAO,EACrC,IAAK,OACH,OAAO,EAAU,EAAO,QAAQ,EAClC,IAAK,SACH,OAAO,EAAM,SAAW,IAAA,IAAa,OAAO,EAAM,QAAW,SAC/D,QACE,MAAO,EACX,CACF,CAEA,SAAgB,EACd,EACsC,CACtC,GAAI,CAAC,EAAS,CAAK,GAAK,CAAC,EAAU,EAAO,MAAM,EAAG,MAAO,GAC1D,OAAQ,EAAM,KAAd,CACE,IAAK,QACH,MAAO,GACT,IAAK,aACH,OAAO,EAAU,EAAO,OAAO,EACjC,IAAK,aACH,OAAO,EAAU,EAAO,UAAU,EACpC,IAAK,WACH,OAAO,EAAU,EAAO,UAAU,GAAK,OAAO,EAAM,SAAY,UAClE,IAAK,SACH,OAAO,EAAU,EAAO,QAAQ,EAClC,IAAK,QACH,OAAO,EAAU,EAAO,SAAS,EACnC,IAAK,YACH,OAAO,EAAM,SAAW,IAAA,IAAa,OAAO,EAAM,QAAW,SAC/D,QACE,MAAO,EACX,CACF"}
@@ -0,0 +1 @@
1
+ let e=require(`@robota-sdk/agent-provider-anthropic`),t=require(`@robota-sdk/agent-provider-deepseek`),n=require(`@robota-sdk/agent-provider-gemma`),r=require(`@robota-sdk/agent-provider-gemini`),i=require(`@robota-sdk/agent-provider-openai`),a=require(`@robota-sdk/agent-provider-qwen`);const o=[(0,e.createAnthropicProviderDefinition)(),(0,i.createOpenAIProviderDefinition)(),(0,r.createGeminiProviderDefinition)(),(0,n.createGemmaProviderDefinition)(),(0,a.createQwenProviderDefinition)(),(0,t.createDeepSeekProviderDefinition)()];function s(e){return typeof e==`object`&&!!e}function c(e,t){return typeof e[t]==`string`}function l(e){return!s(e)||!c(e,`jobId`)||!s(e.request)||!c(e.request,`type`)||!c(e.request,`prompt`)||!s(e.agentDefinition)||!c(e.agentDefinition,`name`)||!c(e.agentDefinition,`systemPrompt`)||!s(e.parentConfig)||!s(e.parentContext)||!s(e.providerProfile)||!c(e.providerProfile,`type`)?!1:c(e.providerProfile,`model`)}function u(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`start`:return l(e.payload);case`send`:return c(e,`prompt`);case`cancel`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}function d(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`ready`:return!0;case`text_delta`:return c(e,`delta`);case`tool_start`:return c(e,`toolName`);case`tool_end`:return c(e,`toolName`)&&typeof e.success==`boolean`;case`result`:return c(e,`output`);case`error`:return c(e,`message`);case`cancelled`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return d}});
@@ -0,0 +1 @@
1
+ let e=require(`@robota-sdk/agent-provider/anthropic`),t=require(`@robota-sdk/agent-provider/deepseek`),n=require(`@robota-sdk/agent-provider/gemma`),r=require(`@robota-sdk/agent-provider/gemini`),i=require(`@robota-sdk/agent-provider/openai`),a=require(`@robota-sdk/agent-provider/qwen`);const o=[(0,e.createAnthropicProviderDefinition)(),(0,i.createOpenAIProviderDefinition)(),(0,r.createGeminiProviderDefinition)(),(0,n.createGemmaProviderDefinition)(),(0,a.createQwenProviderDefinition)(),(0,t.createDeepSeekProviderDefinition)()];function s(e){return typeof e==`object`&&!!e}function c(e,t){return typeof e[t]==`string`}function l(e){return!s(e)||!c(e,`jobId`)||!s(e.request)||!c(e.request,`type`)||!c(e.request,`prompt`)||!s(e.agentDefinition)||!c(e.agentDefinition,`name`)||!c(e.agentDefinition,`systemPrompt`)||!s(e.parentConfig)||!s(e.parentContext)||!s(e.providerProfile)||!c(e.providerProfile,`type`)?!1:c(e.providerProfile,`model`)}function u(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`start`:return l(e.payload);case`send`:return c(e,`prompt`);case`cancel`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}function d(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`ready`:return!0;case`text_delta`:return c(e,`delta`);case`tool_start`:return c(e,`toolName`);case`tool_end`:return c(e,`toolName`)&&typeof e.success==`boolean`;case`result`:return c(e,`output`);case`error`:return c(e,`message`);case`cancelled`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return d}});
@@ -0,0 +1,2 @@
1
+ import{createAnthropicProviderDefinition as e}from"@robota-sdk/agent-provider/anthropic";import{createDeepSeekProviderDefinition as t}from"@robota-sdk/agent-provider/deepseek";import{createGemmaProviderDefinition as n}from"@robota-sdk/agent-provider/gemma";import{createGeminiProviderDefinition as r}from"@robota-sdk/agent-provider/gemini";import{createOpenAIProviderDefinition as i}from"@robota-sdk/agent-provider/openai";import{createQwenProviderDefinition as a}from"@robota-sdk/agent-provider/qwen";const o=[e(),i(),r(),n(),a(),t()];function s(e){return typeof e==`object`&&!!e}function c(e,t){return typeof e[t]==`string`}function l(e){return!s(e)||!c(e,`jobId`)||!s(e.request)||!c(e.request,`type`)||!c(e.request,`prompt`)||!s(e.agentDefinition)||!c(e.agentDefinition,`name`)||!c(e.agentDefinition,`systemPrompt`)||!s(e.parentConfig)||!s(e.parentContext)||!s(e.providerProfile)||!c(e.providerProfile,`type`)?!1:c(e.providerProfile,`model`)}function u(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`start`:return l(e.payload);case`send`:return c(e,`prompt`);case`cancel`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}function d(e){if(!s(e)||!c(e,`type`))return!1;switch(e.type){case`ready`:return!0;case`text_delta`:return c(e,`delta`);case`tool_start`:return c(e,`toolName`);case`tool_end`:return c(e,`toolName`)&&typeof e.success==`boolean`;case`result`:return c(e,`output`);case`error`:return c(e,`message`);case`cancelled`:return e.reason===void 0||typeof e.reason==`string`;default:return!1}}export{u as n,o as r,d as t};
2
+ //# sourceMappingURL=child-process-subagent-ipc-DVpVp43R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-process-subagent-ipc-DVpVp43R.js","names":[],"sources":["../../src/utils/provider-default-definitions.ts","../../src/subagents/child-process-subagent-ipc.ts"],"sourcesContent":["import { createAnthropicProviderDefinition } from '@robota-sdk/agent-provider/anthropic';\nimport { createDeepSeekProviderDefinition } from '@robota-sdk/agent-provider/deepseek';\nimport { createGemmaProviderDefinition } from '@robota-sdk/agent-provider/gemma';\nimport { createGeminiProviderDefinition } from '@robota-sdk/agent-provider/gemini';\nimport { createOpenAIProviderDefinition } from '@robota-sdk/agent-provider/openai';\nimport { createQwenProviderDefinition } from '@robota-sdk/agent-provider/qwen';\nimport type { IProviderDefinition } from './provider-definition.js';\n\nexport const DEFAULT_PROVIDER_DEFINITIONS: readonly IProviderDefinition[] = [\n createAnthropicProviderDefinition(),\n createOpenAIProviderDefinition(),\n createGeminiProviderDefinition(),\n createGemmaProviderDefinition(),\n createQwenProviderDefinition(),\n createDeepSeekProviderDefinition(),\n];\n","import type { TPermissionMode, TToolArgs } from '@robota-sdk/agent-core';\nimport type {\n ISerializableProviderProfile,\n ISubagentSpawnRequest,\n} from '@robota-sdk/agent-executor';\nimport type { IAgentDefinition, IInProcessSubagentRunnerDeps } from '@robota-sdk/agent-framework';\n\nexport type TSubagentWorkerWireValue = string | number | boolean | null | undefined | object;\n\ntype TSubagentWorkerWireRecord = Record<string, TSubagentWorkerWireValue>;\n\nexport interface ISubagentWorkerStartPayload {\n jobId: string;\n request: ISubagentSpawnRequest;\n agentDefinition: IAgentDefinition;\n parentConfig: IInProcessSubagentRunnerDeps['config'];\n parentContext: IInProcessSubagentRunnerDeps['context'];\n providerProfile: ISerializableProviderProfile;\n permissionMode?: TPermissionMode;\n logsDir?: string;\n}\n\nexport interface ISubagentWorkerStartMessage {\n type: 'start';\n payload: ISubagentWorkerStartPayload;\n}\n\nexport interface ISubagentWorkerSendMessage {\n type: 'send';\n prompt: string;\n}\n\nexport interface ISubagentWorkerCancelMessage {\n type: 'cancel';\n reason?: string;\n}\n\nexport type TSubagentWorkerParentMessage =\n | ISubagentWorkerStartMessage\n | ISubagentWorkerSendMessage\n | ISubagentWorkerCancelMessage;\n\nexport interface ISubagentWorkerReadyMessage {\n type: 'ready';\n}\n\nexport interface ISubagentWorkerTextDeltaMessage {\n type: 'text_delta';\n delta: string;\n}\n\nexport interface ISubagentWorkerToolStartMessage {\n type: 'tool_start';\n toolName: string;\n toolArgs?: TToolArgs;\n}\n\nexport interface ISubagentWorkerToolEndMessage {\n type: 'tool_end';\n toolName: string;\n success: boolean;\n}\n\nexport interface ISubagentWorkerResultMessage {\n type: 'result';\n output: string;\n}\n\nexport interface ISubagentWorkerErrorMessage {\n type: 'error';\n message: string;\n}\n\nexport interface ISubagentWorkerCancelledMessage {\n type: 'cancelled';\n reason?: string;\n}\n\nexport type TSubagentWorkerChildMessage =\n | ISubagentWorkerReadyMessage\n | ISubagentWorkerTextDeltaMessage\n | ISubagentWorkerToolStartMessage\n | ISubagentWorkerToolEndMessage\n | ISubagentWorkerResultMessage\n | ISubagentWorkerErrorMessage\n | ISubagentWorkerCancelledMessage;\n\nfunction isRecord(value: TSubagentWorkerWireValue): value is TSubagentWorkerWireRecord {\n return typeof value === 'object' && value !== null;\n}\n\nfunction hasString(value: TSubagentWorkerWireRecord, key: string): boolean {\n return typeof value[key] === 'string';\n}\n\nfunction isStartPayload(value: TSubagentWorkerWireValue): value is ISubagentWorkerStartPayload {\n if (!isRecord(value)) return false;\n if (!hasString(value, 'jobId')) return false;\n if (!isRecord(value.request)) return false;\n if (!hasString(value.request, 'type')) return false;\n if (!hasString(value.request, 'prompt')) return false;\n if (!isRecord(value.agentDefinition)) return false;\n if (!hasString(value.agentDefinition, 'name')) return false;\n if (!hasString(value.agentDefinition, 'systemPrompt')) return false;\n if (!isRecord(value.parentConfig)) return false;\n if (!isRecord(value.parentContext)) return false;\n if (!isRecord(value.providerProfile)) return false;\n if (!hasString(value.providerProfile, 'type')) return false;\n return hasString(value.providerProfile, 'model');\n}\n\nexport function isSubagentWorkerParentMessage(\n value: TSubagentWorkerWireValue,\n): value is TSubagentWorkerParentMessage {\n if (!isRecord(value) || !hasString(value, 'type')) return false;\n switch (value.type) {\n case 'start':\n return isStartPayload(value.payload);\n case 'send':\n return hasString(value, 'prompt');\n case 'cancel':\n return value.reason === undefined || typeof value.reason === 'string';\n default:\n return false;\n }\n}\n\nexport function isSubagentWorkerChildMessage(\n value: TSubagentWorkerWireValue,\n): value is TSubagentWorkerChildMessage {\n if (!isRecord(value) || !hasString(value, 'type')) return false;\n switch (value.type) {\n case 'ready':\n return true;\n case 'text_delta':\n return hasString(value, 'delta');\n case 'tool_start':\n return hasString(value, 'toolName');\n case 'tool_end':\n return hasString(value, 'toolName') && typeof value.success === 'boolean';\n case 'result':\n return hasString(value, 'output');\n case 'error':\n return hasString(value, 'message');\n case 'cancelled':\n return value.reason === undefined || typeof value.reason === 'string';\n default:\n return false;\n }\n}\n"],"mappings":"sfAQA,MAAa,EAA+D,CAC1E,EAAkC,EAClC,EAA+B,EAC/B,EAA+B,EAC/B,EAA8B,EAC9B,EAA6B,EAC7B,EAAiC,CACnC,ECwEA,SAAS,EAAS,EAAqE,CACrF,OAAO,OAAO,GAAU,YAAY,CACtC,CAEA,SAAS,EAAU,EAAkC,EAAsB,CACzE,OAAO,OAAO,EAAM,IAAS,QAC/B,CAEA,SAAS,EAAe,EAAuE,CAa7F,MAZI,CAAC,EAAS,CAAK,GACf,CAAC,EAAU,EAAO,OAAO,GACzB,CAAC,EAAS,EAAM,OAAO,GACvB,CAAC,EAAU,EAAM,QAAS,MAAM,GAChC,CAAC,EAAU,EAAM,QAAS,QAAQ,GAClC,CAAC,EAAS,EAAM,eAAe,GAC/B,CAAC,EAAU,EAAM,gBAAiB,MAAM,GACxC,CAAC,EAAU,EAAM,gBAAiB,cAAc,GAChD,CAAC,EAAS,EAAM,YAAY,GAC5B,CAAC,EAAS,EAAM,aAAa,GAC7B,CAAC,EAAS,EAAM,eAAe,GAC/B,CAAC,EAAU,EAAM,gBAAiB,MAAM,EAAU,GAC/C,EAAU,EAAM,gBAAiB,OAAO,CACjD,CAEA,SAAgB,EACd,EACuC,CACvC,GAAI,CAAC,EAAS,CAAK,GAAK,CAAC,EAAU,EAAO,MAAM,EAAG,MAAO,GAC1D,OAAQ,EAAM,KAAd,CACE,IAAK,QACH,OAAO,EAAe,EAAM,OAAO,EACrC,IAAK,OACH,OAAO,EAAU,EAAO,QAAQ,EAClC,IAAK,SACH,OAAO,EAAM,SAAW,IAAA,IAAa,OAAO,EAAM,QAAW,SAC/D,QACE,MAAO,EACX,CACF,CAEA,SAAgB,EACd,EACsC,CACtC,GAAI,CAAC,EAAS,CAAK,GAAK,CAAC,EAAU,EAAO,MAAM,EAAG,MAAO,GAC1D,OAAQ,EAAM,KAAd,CACE,IAAK,QACH,MAAO,GACT,IAAK,aACH,OAAO,EAAU,EAAO,OAAO,EACjC,IAAK,aACH,OAAO,EAAU,EAAO,UAAU,EACpC,IAAK,WACH,OAAO,EAAU,EAAO,UAAU,GAAK,OAAO,EAAM,SAAY,UAClE,IAAK,SACH,OAAO,EAAU,EAAO,QAAQ,EAClC,IAAK,QACH,OAAO,EAAU,EAAO,SAAS,EACnC,IAAK,YACH,OAAO,EAAM,SAAW,IAAA,IAAa,OAAO,EAAM,QAAW,SAC/D,QACE,MAAO,EACX,CACF"}
@@ -0,0 +1 @@
1
+ const e=require(`./modes/print-mode.cjs`),t=require(`./modes/tui-mode.cjs`),n=require(`./startup/args-to-options.cjs`),r=require(`./startup/command-setup.cjs`),i=require(`./startup/config-phase.cjs`),a=require(`./utils/cli-args.cjs`),o=require(`./startup/preflight.cjs`),s=require(`./startup/provider-setup.cjs`),c=require(`./startup/session-setup.cjs`),l=require(`./startup/update-notice.cjs`),u=require(`./startup/version.cjs`),d=require(`./user-local-direct-command.cjs`);let f=require(`@robota-sdk/agent-framework`),p=require(`@robota-sdk/agent-transport`),m=require(`@robota-sdk/agent-transport/headless`);function h(){try{return a.parseCliArgs()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}async function g(a={}){let g=h(),_=u.readVersion(),v=new m.PrintTerminal,y=process.cwd();if((await o.handlePreflightCommands(g,{version:_,terminal:v,cwd:y})).handled)return;let b=n.toConfigPhaseOptions(g),x=n.toSessionRunOptions(g);try{if(await d.runUserLocalDirectCommandIfRequested(n.toUserLocalCommandOptions(g),y,v))return}catch(e){v.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let S=process.stdin.isTTY===!0&&process.stdout.isTTY===!0,C=r.createCommandSetup(y,a);if((await i.handleConfigPhase(y,b,C,v,S)).handled)return;let w=s.createProviderSetup(y,b,C),T=c.createSessionSetup(y,x),E=(0,f.createAgentRuntime)({cwd:y,provider:w.provider,commandModules:C.commandModules,commandHostAdapters:C.commandHostAdapters,reloadPluginCommandSource:C.reloadPluginCommandSource,subagentRunnerFactory:w.subagentRunnerFactory,sessionStore:T.sessionStore,transportRegistry:(0,p.createDefaultTransportRegistry)()});if(b.printMode){await e.runPrintMode(x,E);return}await t.runTuiMode({runtime:E,version:_,commandSetup:C,providerSetup:w,sessionSetup:T,sessionOpts:x,startupUpdateNotice:l.resolveStartupUpdateNotice(_,n.toStartupUpdatePolicyOptions(g))}),process.exit(0)}exports.startCli=g;
@@ -0,0 +1,7 @@
1
+ import { IStartCliOptions } from "./startup/command-setup.js";
2
+
3
+ //#region src/cli.d.ts
4
+ declare function startCli(options?: IStartCliOptions): Promise<void>;
5
+ //#endregion
6
+ export { startCli };
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","names":[],"sources":["../../src/cli.ts"],"mappings":";;;iBAqCsB,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
@@ -0,0 +1,2 @@
1
+ import{runPrintMode as e}from"./modes/print-mode.js";import{runTuiMode as t}from"./modes/tui-mode.js";import{toConfigPhaseOptions as n,toSessionRunOptions as r,toStartupUpdatePolicyOptions as i,toUserLocalCommandOptions as a}from"./startup/args-to-options.js";import{createCommandSetup as o}from"./startup/command-setup.js";import{handleConfigPhase as s}from"./startup/config-phase.js";import{parseCliArgs as c}from"./utils/cli-args.js";import{handlePreflightCommands as l}from"./startup/preflight.js";import{createProviderSetup as u}from"./startup/provider-setup.js";import{createSessionSetup as d}from"./startup/session-setup.js";import{resolveStartupUpdateNotice as f}from"./startup/update-notice.js";import{readVersion as p}from"./startup/version.js";import{runUserLocalDirectCommandIfRequested as m}from"./user-local-direct-command.js";import{createAgentRuntime as h}from"@robota-sdk/agent-framework";import{createDefaultTransportRegistry as g}from"@robota-sdk/agent-transport";import{PrintTerminal as _}from"@robota-sdk/agent-transport/headless";function v(){try{return c()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}async function y(c={}){let y=v(),b=p(),x=new _,S=process.cwd();if((await l(y,{version:b,terminal:x,cwd:S})).handled)return;let C=n(y),w=r(y);try{if(await m(a(y),S,x))return}catch(e){x.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let T=process.stdin.isTTY===!0&&process.stdout.isTTY===!0,E=o(S,c);if((await s(S,C,E,x,T)).handled)return;let D=u(S,C,E),O=d(S,w),k=h({cwd:S,provider:D.provider,commandModules:E.commandModules,commandHostAdapters:E.commandHostAdapters,reloadPluginCommandSource:E.reloadPluginCommandSource,subagentRunnerFactory:D.subagentRunnerFactory,sessionStore:O.sessionStore,transportRegistry:g()});if(C.printMode){await e(w,k);return}await t({runtime:k,version:b,commandSetup:E,providerSetup:D,sessionSetup:O,sessionOpts:w,startupUpdateNotice:f(b,i(y))}),process.exit(0)}export{y as startCli};
2
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","names":[],"sources":["../../src/cli.ts"],"sourcesContent":["import { createAgentRuntime } from '@robota-sdk/agent-framework';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { PrintTerminal } from '@robota-sdk/agent-transport/headless';\n\nimport { runPrintMode } from './modes/print-mode.js';\nimport { runTuiMode } from './modes/tui-mode.js';\nimport {\n toConfigPhaseOptions,\n toSessionRunOptions,\n toUserLocalCommandOptions,\n toStartupUpdatePolicyOptions,\n} from './startup/args-to-options.js';\nimport { createCommandSetup } from './startup/command-setup.js';\nimport { handleConfigPhase } from './startup/config-phase.js';\nimport { handlePreflightCommands } from './startup/preflight.js';\nimport { createProviderSetup } from './startup/provider-setup.js';\nimport { createSessionSetup } from './startup/session-setup.js';\nimport { resolveStartupUpdateNotice } from './startup/update-notice.js';\nimport { readVersion } from './startup/version.js';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { parseCliArgs } from './utils/cli-args.js';\n\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport type { IStartCliOptions };\n\nfunction parseArgsOrExit(): IParsedCliArgs {\n try {\n return parseCliArgs();\n } catch (error) {\n // allow-fallback: argument validation errors are terminal — exit is the correct response\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n}\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n const args = parseArgsOrExit();\n const version = readVersion();\n const terminal = new PrintTerminal();\n\n const cwd = process.cwd();\n\n // Layer 0: pre-flight — single point for all early-exit commands\n if ((await handlePreflightCommands(args, { version, terminal, cwd })).handled) return;\n\n // Layer 1: IParsedCliArgs → typed option objects (boundary)\n const configPhaseOpts = toConfigPhaseOptions(args);\n const sessionOpts = toSessionRunOptions(args);\n\n try {\n if (await runUserLocalDirectCommandIfRequested(toUserLocalCommandOptions(args), cwd, terminal))\n return;\n } catch (error) {\n // allow-fallback: user-local command failure is terminal — exit is the correct response\n terminal.writeError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n // Layer 2: sub-layer assembly (same-level grouping)\n const isTTY = process.stdin.isTTY === true && process.stdout.isTTY === true;\n const commandSetup = createCommandSetup(cwd, options);\n const configPhase = await handleConfigPhase(cwd, configPhaseOpts, commandSetup, terminal, isTTY);\n if (configPhase.handled) return;\n\n const providerSetup = createProviderSetup(cwd, configPhaseOpts, commandSetup);\n const sessionSetup = createSessionSetup(cwd, sessionOpts);\n\n // Layer 3: runtime assembly\n const runtime = createAgentRuntime({\n cwd,\n provider: providerSetup.provider,\n commandModules: commandSetup.commandModules,\n commandHostAdapters: commandSetup.commandHostAdapters,\n reloadPluginCommandSource: commandSetup.reloadPluginCommandSource,\n subagentRunnerFactory: providerSetup.subagentRunnerFactory,\n sessionStore: sessionSetup.sessionStore,\n transportRegistry: createDefaultTransportRegistry(),\n });\n\n // Layer 4: mode / transport\n if (configPhaseOpts.printMode) {\n await runPrintMode(sessionOpts, runtime);\n return;\n }\n\n await runTuiMode({\n runtime,\n version,\n commandSetup,\n providerSetup,\n sessionSetup,\n sessionOpts,\n startupUpdateNotice: resolveStartupUpdateNotice(version, toStartupUpdatePolicyOptions(args)),\n });\n process.exit(0);\n}\n"],"mappings":"4hCA2BA,SAAS,GAAkC,CACzC,GAAI,CACF,OAAO,EAAa,CACtB,OAAS,EAAO,CAEd,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,KAAK,CAAC,CAChB,CACF,CAEA,eAAsB,EAAS,EAA4B,CAAC,EAAkB,CAC5E,IAAM,EAAO,EAAgB,EACvB,EAAU,EAAY,EACtB,EAAW,IAAI,EAEf,EAAM,QAAQ,IAAI,EAGxB,IAAK,MAAM,EAAwB,EAAM,CAAE,UAAS,WAAU,KAAI,CAAC,GAAG,QAAS,OAG/E,IAAM,EAAkB,EAAqB,CAAI,EAC3C,EAAc,EAAoB,CAAI,EAE5C,GAAI,CACF,GAAI,MAAM,EAAqC,EAA0B,CAAI,EAAG,EAAK,CAAQ,EAC3F,MACJ,OAAS,EAAO,CAEd,EAAS,WAAW,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAAC,EAC1E,QAAQ,KAAK,CAAC,CAChB,CAGA,IAAM,EAAQ,QAAQ,MAAM,QAAU,IAAQ,QAAQ,OAAO,QAAU,GACjE,EAAe,EAAmB,EAAK,CAAO,EAEpD,IAAI,MADsB,EAAkB,EAAK,EAAiB,EAAc,EAAU,CAAK,GAC/E,QAAS,OAEzB,IAAM,EAAgB,EAAoB,EAAK,EAAiB,CAAY,EACtE,EAAe,EAAmB,EAAK,CAAW,EAGlD,EAAU,EAAmB,CACjC,MACA,SAAU,EAAc,SACxB,eAAgB,EAAa,eAC7B,oBAAqB,EAAa,oBAClC,0BAA2B,EAAa,0BACxC,sBAAuB,EAAc,sBACrC,aAAc,EAAa,aAC3B,kBAAmB,EAA+B,CACpD,CAAC,EAGD,GAAI,EAAgB,UAAW,CAC7B,MAAM,EAAa,EAAa,CAAO,EACvC,MACF,CAEA,MAAM,EAAW,CACf,UACA,UACA,eACA,gBACA,eACA,cACA,oBAAqB,EAA2B,EAAS,EAA6B,CAAI,CAAC,CAC7F,CAAC,EACD,QAAQ,KAAK,CAAC,CAChB"}
@@ -0,0 +1 @@
1
+ exports.AGENT_CLI_NAME=`robota-cli`;
@@ -0,0 +1,2 @@
1
+ const e=`robota-cli`;export{e as AGENT_CLI_NAME};
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../src/constants.ts"],"sourcesContent":["export const AGENT_CLI_NAME = 'robota-cli';\n"],"mappings":"AAAA,MAAa,EAAiB"}