@robota-sdk/agent-cli 3.0.0-beta.7 → 3.0.0-beta.71
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/README.md +414 -114
- package/bin/robota.cjs +47 -0
- package/dist/node/bin.d.ts +2 -1
- package/dist/node/bin.js +57 -10
- package/dist/node/bin.js.map +1 -0
- package/dist/node/child-process-subagent-ipc--Vp2dk1v.js +2 -0
- package/dist/node/child-process-subagent-ipc--Vp2dk1v.js.map +1 -0
- package/dist/node/child-process-subagent-ipc-Aitv2i6E.cjs +1 -0
- package/dist/node/child-process-subagent-ipc-CEy8bLN6.cjs +1 -0
- package/dist/node/child-process-subagent-ipc-DVpVp43R.js +2 -0
- package/dist/node/child-process-subagent-ipc-DVpVp43R.js.map +1 -0
- package/dist/node/cli.cjs +1 -0
- package/dist/node/cli.d.ts +7 -0
- package/dist/node/cli.d.ts.map +1 -0
- package/dist/node/cli.js +2 -0
- package/dist/node/cli.js.map +1 -0
- package/dist/node/constants.cjs +1 -0
- package/dist/node/constants.js +2 -0
- package/dist/node/constants.js.map +1 -0
- package/dist/node/index.cjs +49 -1257
- package/dist/node/index.d.ts +12 -47
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +50 -13
- package/dist/node/index.js.map +1 -0
- package/dist/node/init/init-command.cjs +32 -0
- package/dist/node/init/init-command.js +33 -0
- package/dist/node/init/init-command.js.map +1 -0
- package/dist/node/modes/print-mode.cjs +6 -0
- package/dist/node/modes/print-mode.js +7 -0
- package/dist/node/modes/print-mode.js.map +1 -0
- package/dist/node/modes/shell-exec.cjs +1 -0
- package/dist/node/modes/shell-exec.js +2 -0
- package/dist/node/modes/shell-exec.js.map +1 -0
- package/dist/node/modes/tui-mode.cjs +1 -0
- package/dist/node/modes/tui-mode.js +2 -0
- package/dist/node/modes/tui-mode.js.map +1 -0
- package/dist/node/provider-default-definitions-CKtxv2k0.js +2 -0
- package/dist/node/provider-default-definitions-CKtxv2k0.js.map +1 -0
- package/dist/node/provider-default-definitions-GFiYzACo.cjs +1 -0
- package/dist/node/provider-default-definitions-g0ZUDeii.cjs +1 -0
- package/dist/node/startup/append-system-prompt.cjs +3 -0
- package/dist/node/startup/append-system-prompt.js +4 -0
- package/dist/node/startup/append-system-prompt.js.map +1 -0
- package/dist/node/startup/args-to-options.cjs +1 -0
- package/dist/node/startup/args-to-options.js +2 -0
- package/dist/node/startup/args-to-options.js.map +1 -0
- package/dist/node/startup/command-setup.cjs +1 -0
- package/dist/node/startup/command-setup.d.ts +11 -0
- package/dist/node/startup/command-setup.d.ts.map +1 -0
- package/dist/node/startup/command-setup.js +2 -0
- package/dist/node/startup/command-setup.js.map +1 -0
- package/dist/node/startup/config-phase.cjs +1 -0
- package/dist/node/startup/config-phase.js +2 -0
- package/dist/node/startup/config-phase.js.map +1 -0
- package/dist/node/startup/preflight.cjs +1 -0
- package/dist/node/startup/preflight.js +2 -0
- package/dist/node/startup/preflight.js.map +1 -0
- package/dist/node/startup/provider-setup.cjs +1 -0
- package/dist/node/startup/provider-setup.js +2 -0
- package/dist/node/startup/provider-setup.js.map +1 -0
- package/dist/node/startup/provider-startup.cjs +2 -0
- package/dist/node/startup/provider-startup.js +3 -0
- package/dist/node/startup/provider-startup.js.map +1 -0
- package/dist/node/startup/reset-config.cjs +1 -0
- package/dist/node/startup/reset-config.js +2 -0
- package/dist/node/startup/reset-config.js.map +1 -0
- package/dist/node/startup/session-setup.cjs +1 -0
- package/dist/node/startup/session-setup.js +2 -0
- package/dist/node/startup/session-setup.js.map +1 -0
- package/dist/node/startup/subagent-setup.cjs +1 -0
- package/dist/node/startup/subagent-setup.js +2 -0
- package/dist/node/startup/subagent-setup.js.map +1 -0
- package/dist/node/startup/update-notice.cjs +1 -0
- package/dist/node/startup/update-notice.js +2 -0
- package/dist/node/startup/update-notice.js.map +1 -0
- package/dist/node/startup/version.cjs +1 -0
- package/dist/node/startup/version.js +2 -0
- package/dist/node/startup/version.js.map +1 -0
- package/dist/node/subagents/child-process-subagent-worker.cjs +1 -0
- package/dist/node/subagents/child-process-subagent-worker.d.ts +1 -0
- package/dist/node/subagents/child-process-subagent-worker.js +2 -0
- package/dist/node/subagents/child-process-subagent-worker.js.map +1 -0
- package/dist/node/user-local-direct-command.cjs +1 -0
- package/dist/node/user-local-direct-command.js +2 -0
- package/dist/node/user-local-direct-command.js.map +1 -0
- package/dist/node/utils/cli-args.cjs +35 -0
- package/dist/node/utils/cli-args.js +36 -0
- package/dist/node/utils/cli-args.js.map +1 -0
- package/package.json +52 -16
- package/dist/node/bin.cjs +0 -1240
- package/dist/node/bin.d.cts +0 -1
- package/dist/node/chunk-A2A66S6Q.js +0 -1219
- package/dist/node/index.d.cts +0 -49
package/dist/node/index.d.ts
CHANGED
|
@@ -1,49 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { IProviderDefinition } from "@robota-sdk/agent-core";
|
|
2
|
+
import { ICommandModule } from "@robota-sdk/agent-framework";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* Spinner handle returned by ITerminalOutput.spinner()
|
|
9
|
-
*/
|
|
10
|
-
interface ISpinner {
|
|
11
|
-
stop(): void;
|
|
12
|
-
update(message: string): void;
|
|
4
|
+
//#region src/startup/command-setup.d.ts
|
|
5
|
+
interface IStartCliOptions {
|
|
6
|
+
commandModules?: readonly ICommandModule[];
|
|
7
|
+
providerDefinitions?: readonly IProviderDefinition[];
|
|
13
8
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
writeMarkdown(md: string): void;
|
|
21
|
-
writeError(text: string): void;
|
|
22
|
-
prompt(question: string): Promise<string>;
|
|
23
|
-
/** Arrow-key selector. Returns the index of the chosen option. */
|
|
24
|
-
select(options: string[], initialIndex?: number): Promise<number>;
|
|
25
|
-
spinner(message: string): ISpinner;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* CLI entry point — parses arguments, loads config/context, and starts the
|
|
30
|
-
* Ink TUI or runs in print mode.
|
|
31
|
-
*
|
|
32
|
-
* CLI flags:
|
|
33
|
-
* robota Interactive TUI mode
|
|
34
|
-
* robota "prompt" TUI with initial prompt (future)
|
|
35
|
-
* robota -p "prompt" Print mode (one-shot, exit after response)
|
|
36
|
-
* robota -c Continue last session
|
|
37
|
-
* robota -r <id> Resume session by ID
|
|
38
|
-
* robota --model <model> Model override
|
|
39
|
-
* robota --permission-mode <m> plan|default|acceptEdits|bypassPermissions
|
|
40
|
-
* robota --max-turns <n> Limit agentic turns
|
|
41
|
-
* robota --version Print package version and exit
|
|
42
|
-
*/
|
|
43
|
-
/**
|
|
44
|
-
* Main CLI orchestration function.
|
|
45
|
-
* Called from bin.ts as the top-level entry.
|
|
46
|
-
*/
|
|
47
|
-
declare function startCli(): Promise<void>;
|
|
48
|
-
|
|
49
|
-
export { type ISpinner, type ITerminalOutput, startCli };
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region src/cli.d.ts
|
|
11
|
+
declare function startCli(options?: IStartCliOptions): Promise<void>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { startCli };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/startup/command-setup.ts","../../src/cli.ts"],"mappings":";;;;UAuBiB,gBAAA;EACf,cAAA,YAA0B,cAAA;EAC1B,mBAAA,YAA+B,mBAAmB;AAAA;;;iBCmB9B,QAAA,CAAS,OAAA,GAAS,gBAAA,GAAwB,OAAO"}
|
package/dist/node/index.js
CHANGED
|
@@ -1,13 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import{execSync as e}from"node:child_process";import{HeadlessInteractionChannel as t,PrintTerminal as n,promptInput as r}from"@robota-sdk/agent-transport/headless";import{applyProviderConfiguration as i,applyProviderSwitch as a,checkForCliUpdate as o,createProjectSessionStore as s,createProviderFromSettings as c,formatCliUpdateCheckMessage as l,formatCliUpdateNotice as u,getStartupCliUpdateNotice as d,getUserSettingsPath as f,projectPaths as p,readMergedProviderSettings as m,readPackageVersion as h,readProviderSettings as g,readSettings as _,resetUserConfig as v,resolveLatestSessionId as ee,resolveProviderSettingsWriteTargetPath as y,resolveSessionIdByIdOrName as b,resolveSettingsPathForScope as x,shouldRunStartupCliUpdateCheck as S,userPaths as C,writeSettings as w}from"@robota-sdk/agent-framework";import{parseArgs as T}from"node:util";import{formatSupportedProviderTypes as E}from"@robota-sdk/agent-core";import{createDefaultProviderDefinitions as D}from"@robota-sdk/agent-provider";import{createDefaultCommandModules as O,createDefaultPluginCommandAdapter as k,ensureProviderConfig as A,executeUserLocalDirectCommand as te,reloadPluginCommandSource as j,runProviderStartupSetup as ne}from"@robota-sdk/agent-command";import{createDefaultTuiCliAdapter as re,renderApp as ie}from"@robota-sdk/agent-transport/tui";import{createDefaultTransportRegistry as ae}from"@robota-sdk/agent-transport";import{createDefaultBackgroundTaskRunners as oe}from"@robota-sdk/agent-executor";import{createChildProcessSubagentRunnerFactory as se,getDefaultSubagentWorkerPath as M}from"@robota-sdk/agent-subagent-runner";import{readFileSync as N,readdirSync as P}from"node:fs";import{join as F,resolve as I}from"node:path";const L=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],R=[`text`,`json`,`stream-json`];function z(){return`
|
|
2
|
+
Usage: robota [options] [-p <prompt>]
|
|
3
|
+
|
|
4
|
+
Options:
|
|
5
|
+
-p <prompt> Run in print (headless) mode with the given prompt
|
|
6
|
+
--output-format <format> Output format: text | json | stream-json (default: text)
|
|
7
|
+
--system-prompt <text> Override the system prompt for this session
|
|
8
|
+
--append-system-prompt <t> Append text to the system prompt
|
|
9
|
+
--language <lang> Language preference (e.g. ko, en)
|
|
10
|
+
--no-session-persistence Disable session persistence for this run
|
|
11
|
+
--permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions
|
|
12
|
+
--max-turns <n> Maximum agent turns before stopping
|
|
13
|
+
-c, --continue Continue the most recent session
|
|
14
|
+
-r, --resume <id> Resume a session by ID or name
|
|
15
|
+
-n, --name <name> Name for the new session
|
|
16
|
+
--fork-session Fork the current session into a new independent session
|
|
17
|
+
--task-file <path> Read a task prompt from file and append it to the system prompt
|
|
18
|
+
--bare Print mode: output raw text only, no formatting wrapper
|
|
19
|
+
--configure Run interactive provider configuration
|
|
20
|
+
--configure-provider <n> Configure a specific provider
|
|
21
|
+
--dry-run Plan-only run: show what the agent would do without modifying files
|
|
22
|
+
--check-update Check for CLI updates
|
|
23
|
+
--version Show version number
|
|
24
|
+
-h, --help Show this help message
|
|
25
|
+
|
|
26
|
+
Commands:
|
|
27
|
+
robota init Initialize AGENTS.md and .robota/settings.json
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
robota Start interactive TUI session
|
|
31
|
+
robota init Initialize project files
|
|
32
|
+
robota -p "Hello" Print mode: send prompt and exit
|
|
33
|
+
robota -p "Hello" --output-format json
|
|
34
|
+
robota -p "Review this diff" --bare Raw output for shell pipelines
|
|
35
|
+
robota --task-file task.md Run task from file (appended to system prompt)
|
|
36
|
+
robota --dry-run "Refactor the auth module" Show plan without modifying files
|
|
37
|
+
robota --continue Resume the last session
|
|
38
|
+
`}function B(e){if(e!==void 0){if(!R.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${R.join(` | `)}`);return e}}function V(e){if(e!==void 0){if(!L.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${L.join(` | `)}`);return e}}function H(e){if(e===void 0)return;let t=parseInt(e,10);if(isNaN(t)||t<=0)throw Error(`Invalid --max-turns "${e}". Must be a positive integer.`);return t}const U={allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},language:{type:`string`},"permission-mode":{type:`string`},"max-turns":{type:`string`},"fork-session":{type:`boolean`,default:!1},name:{type:`string`,short:`n`},"output-format":{type:`string`},format:{type:`string`},summary:{type:`string`},source:{type:`string`},"system-prompt":{type:`string`},"append-system-prompt":{type:`string`},"task-file":{type:`string`},version:{type:`boolean`,default:!1},reset:{type:`boolean`,default:!1},bare:{type:`boolean`,default:!1},"allowed-tools":{type:`string`},"denied-tools":{type:`string`},model:{type:`string`},"no-session-persistence":{type:`boolean`,default:!1},"json-schema":{type:`string`},configure:{type:`boolean`,default:!1},"configure-provider":{type:`string`},provider:{type:`string`},type:{type:`string`},"base-url":{type:`string`},"api-key":{type:`string`},"api-key-env":{type:`string`},"set-current":{type:`boolean`,default:!1},"settings-scope":{type:`string`},"check-update":{type:`boolean`,default:!1},"disable-update-check":{type:`boolean`,default:!1},"dry-run":{type:`boolean`,default:!1},yes:{type:`boolean`,short:`y`,default:!1}}};function W(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,language:e.language,permissionMode:V(e[`permission-mode`]),maxTurns:H(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:B(e[`output-format`]),format:e.format,summary:e.summary,source:e.source,systemPrompt:e[`system-prompt`],appendSystemPrompt:e[`append-system-prompt`],taskFile:e[`task-file`],version:e.version??!1,reset:e.reset??!1,bare:e.bare??!1,allowedTools:e[`allowed-tools`],deniedTools:e[`denied-tools`],model:e.model,noSessionPersistence:e[`no-session-persistence`]??!1,jsonSchema:e[`json-schema`],configure:e.configure??!1,configureProvider:e[`configure-provider`],provider:e.provider,providerType:e.type,baseURL:e[`base-url`],apiKey:e[`api-key`],apiKeyEnv:e[`api-key-env`],setCurrent:e[`set-current`]??!1,settingsScope:e[`settings-scope`],checkUpdate:e[`check-update`]??!1,disableUpdateCheck:e[`disable-update-check`]??!1,dryRun:e[`dry-run`]??!1,yes:e.yes??!1}}function G(){let{values:e,positionals:t}=T(U);return W(e,t)}function K(e){if(e===void 0||e===`user`||e===`project-local`)return e;throw Error(`Invalid --settings-scope "${e}". Valid: user | project-local`)}function ce(e,t,n,r=D()){let o=x(e,K(t.settingsScope));return t.configureProvider?(i(o,de(t),{providerDefinitions:r}),n.writeLine(`Provider profile saved to ${o}`),!t.printMode&&t.positional.length===0):t.provider&&t.setCurrent?(a(t.settingsScope===void 0?y(e):o,t.provider,{knownProviders:m(e).providers}),n.writeLine(`Current provider set to ${t.provider}`),!t.printMode&&t.positional.length===0):!1}async function le(e,t,n,r,i=D(),a){await A(e,{provider:t.provider,settingsScope:K(t.settingsScope)},n,r,i,{formatError:fe,isInteractive:a===void 0?()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0:()=>a})}async function ue(e,t,n,r,i=D()){await ne(e,{settingsScope:K(t.settingsScope)},n,r,i)}function de(e){let t=e.providerType??e.configureProvider;if(!e.configureProvider||!t)throw Error(`--configure-provider requires a provider profile and --type`);return{profile:e.configureProvider,type:t,...e.model!==void 0&&{model:e.model},...e.apiKey!==void 0&&{apiKey:e.apiKey},...e.apiKeyEnv!==void 0&&{apiKeyEnv:e.apiKeyEnv},...e.baseURL!==void 0&&{baseURL:e.baseURL},setCurrent:e.setCurrent}}function fe(e=D()){return[`No provider configuration found.`,"Run `robota --configure` in an interactive terminal, or configure a provider:",`Supported providers: ${E(e)}`,...e.map(pe)].join(`
|
|
39
|
+
`)}function pe(e){return` ${[`robota --configure-provider ${e.type}`,`--type ${e.type}`,...e.defaults?.baseURL===void 0?[]:[`--base-url <url>`],`--model <model>`,...e.requiresApiKey===!0?[`--api-key-env <ENV_NAME>`]:[],`--set-current`].join(` `)}`}async function me(e,t,n){if(e.positional[0]!==`user-local`)return!1;let r=await te({cwd:t,argv:e.positional.slice(1),format:e.format,summary:e.summary,source:e.source}),i=r.message.trimEnd();if(!r.success)throw Error(i);return n.writeLine(i),!0}function q(e){let t=N(e,`utf-8`);return JSON.parse(t)}function he(e,t){return new Date(t).getTime()-new Date(e).getTime()}function ge(e){let t=[],n=0,r=0;for(;r<e.length;){let i=e[r];if(!i){r++;continue}if(i.category===`chat`&&i.type===`user`){n++;let a=i.timestamp,o=!1,s=null,c=r+1;for(;c<e.length;){let r=e[c];if(!r){c++;continue}if(r.category===`chat`&&r.type===`user`)break;if(r.category===`event`&&r.type===`tool-start`){o?s!==null&&t.push(J(`llm_between_tools`,`tool-end`,`tool-start`,s,r.timestamp,n)):(t.push(J(`user_to_first_tool`,`user`,`tool-start`,a,r.timestamp,n)),o=!0),s=null,c++;continue}if(r.category===`event`&&r.type===`tool-end`){let i=e[c-1];i&&i.category===`event`&&i.type===`tool-start`&&t.push(J(`tool_exec`,`tool-start`,`tool-end`,i.timestamp,r.timestamp,n)),s=r.timestamp,c++;continue}if(r.category===`event`&&r.type===`tool-summary`){s!==null&&t.push(J(`llm_final_response`,`tool-end`,`tool-summary`,s,r.timestamp,n)),c++;continue}if(r.category===`chat`&&r.type===`assistant`){o?s!==null&&t.push(J(`llm_final_response`,`tool-end`,`assistant`,s,r.timestamp,n)):t.push(J(`user_to_assistant`,`user`,`assistant`,a,r.timestamp,n)),c++;break}c++}r=c}else r++}return t}function J(e,t,n,r,i,a){return{kind:e,fromType:t,toType:n,fromTimestamp:r,toTimestamp:i,durationMs:he(r,i),turnIndex:a}}function _e(e){let t=e.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`),n=e.filter(e=>e.kind===`tool_exec`),r=e.filter(e=>e.kind===`user_to_assistant`),i=e=>e.length?Math.round(e.reduce((e,t)=>e+t.durationMs,0)/e.length):0,a=e=>e.length?Math.max(...e.map(e=>e.durationMs)):0;return{llmWaitMs:{avg:i(t),max:a(t),total:t.reduce((e,t)=>e+t.durationMs,0),count:t.length},toolExecMs:{avg:i(n),max:a(n),median:(e=>{if(!e.length)return 0;let t=[...e].sort((e,t)=>e.durationMs-t.durationMs),n=Math.floor(t.length/2);return t.length%2==0?Math.round(((t[n-1]?.durationMs??0)+(t[n]?.durationMs??0))/2):t[n]?.durationMs??0})(n),count:n.length},userToAssistantMs:{avg:i(r),max:a(r),count:r.length}}}function Y(e){let t=ge(e.history??[]),n=t.filter(e=>e.durationMs>=1e4);return{sessionId:e.id,cwd:e.cwd,createdAt:e.createdAt,totalIntervals:t.length,intervals:t,slowIntervals:n,stats:_e(t)}}function X(e){return e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`}function Z(e){return new Date(e).toLocaleString(`sv-SE`,{timeZoneName:`short`}).slice(0,16)}function ve(e){return{user_to_first_tool:`user → tool-start`,user_to_assistant:`user → assistant`,tool_exec:`tool-start → tool-end`,llm_between_tools:`tool-end → tool-start`,llm_final_response:`tool-end → assistant/summary`}[e.kind]??e.kind}function ye(e){let{stats:t}=e,n=t.llmWaitMs.total+t.toolExecMs.avg*t.toolExecMs.count;if(n===0)return`Verdict: No timing data available.`;let r=Math.round(t.llmWaitMs.total/n*100);return`Verdict: LLM API wait ${r}% | Code processing ${100-r}%`}function Q(e){let t=[],{stats:n}=e;if(t.push(`Session: ${e.sessionId}`),t.push(`Created: ${Z(e.createdAt)} | cwd: ${e.cwd}`),t.push(``),t.push(`Timing Summary:`),n.llmWaitMs.count>0&&t.push(` LLM API wait ${X(n.llmWaitMs.avg).padStart(8)} avg | ${X(n.llmWaitMs.max).padStart(8)} max`),n.toolExecMs.count>0&&t.push(` Tool execution ${X(n.toolExecMs.avg).padStart(8)} avg | ${X(n.toolExecMs.median).padStart(8)} median`),n.userToAssistantMs.count>0&&t.push(` user → assistant ${X(n.userToAssistantMs.avg).padStart(8)} avg`),n.llmWaitMs.count===0&&n.toolExecMs.count===0&&t.push(` (no intervals computed — session may have no history)`),e.slowIntervals.length>0){t.push(``),t.push(`Slow intervals (>10s):`);for(let n of e.slowIntervals)t.push(` turn ${n.turnIndex} ${ve(n).padEnd(32)} ${X(n.durationMs).padStart(8)}`)}return t.push(``),t.push(ye(e)),t.join(`
|
|
40
|
+
`)}function be(e){let t=[];return t.push(`Analyzed ${e.sessionCount} sessions (${Z(e.fromDate)} ~ ${Z(e.toDate)})`),t.push(` Avg LLM response: ${X(e.avgLlmResponseMs)}`),t.push(` Avg tool exec: ${X(e.avgToolExecMs)}`),e.maxSingleDelayMs>0&&t.push(` Max single delay: ${X(e.maxSingleDelayMs)} (${e.maxSingleDelaySession}, turn ${e.maxSingleDelayTurn}, ${e.maxSingleDelayKind})`),t.join(`
|
|
41
|
+
`)}function $(e){let t,n;for(let r=0;r<e.length;r++)if(e[r]===`--last`&&e[r+1]){let n=parseInt(e[r+1],10);!isNaN(n)&&n>0&&(t=n),r++}else e[r]===`--session`&&e[r+1]&&(n=e[r+1],r++);return{last:t,sessionId:n}}function xe(e){try{return P(e).filter(e=>e.endsWith(`.json`)).map(t=>F(e,t)).sort()}catch{return[]}}function Se(e){let t=e.flatMap(e=>e.intervals.filter(e=>e.kind===`user_to_first_tool`||e.kind===`user_to_assistant`||e.kind===`llm_between_tools`||e.kind===`llm_final_response`)),n=e.flatMap(e=>e.intervals.filter(e=>e.kind===`tool_exec`)),r=t.length?Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length):0,i=n.length?Math.round(n.reduce((e,t)=>e+t.durationMs,0)/n.length):0,a=0,o=``,s=0,c=``;for(let t of e)for(let e of t.intervals)e.durationMs>a&&(a=e.durationMs,o=t.sessionId,s=e.turnIndex,c=e.kind);let l=e.map(e=>e.createdAt).sort();return{sessionCount:e.length,fromDate:l[0]??``,toDate:l[l.length-1]??``,avgLlmResponseMs:r,avgToolExecMs:i,maxSingleDelayMs:a,maxSingleDelaySession:o,maxSingleDelayTurn:s,maxSingleDelayKind:c}}async function Ce(e){let t=$(e),n=C().sessions,r=xe(n);if(r.length===0&&(process.stderr.write(`No session files found in ${n}\n`),process.exit(1)),t.sessionId!==void 0){let e=r.find(e=>e.includes(t.sessionId));e||(process.stderr.write(`Session not found: ${t.sessionId}\n`),process.exit(1));let n=Y(q(e));process.stdout.write(Q(n)+`
|
|
42
|
+
`);return}if(t.last!==void 0){let e=r.slice(-t.last),n=[];for(let t of e)try{n.push(Y(q(t)))}catch{}n.length===0&&(process.stderr.write(`No valid sessions found.
|
|
43
|
+
`),process.exit(1));let i=Se(n);process.stdout.write(be(i)+`
|
|
44
|
+
`);return}let i=r[r.length-1];i||(process.stderr.write(`No sessions found.
|
|
45
|
+
`),process.exit(1));let a=Y(q(i));process.stdout.write(Q(a)+`
|
|
46
|
+
`)}const we=()=>h(import.meta.url);function Te(e){let t=v();t.deleted?e.writeLine(`Deleted ${t.path}`):e.writeLine(`No user settings found.`)}function Ee(e,t,n,r){let i={settings:{read:()=>_(f()),write:e=>w(f(),e)},plugin:k(e)},a=n.providerDefinitions??D();return{commandHostAdapters:i,providerDefinitions:a,commandModules:[...O({cwd:e,providerDefinitions:a,providerSettingsAdapter:{readMergedSettings:()=>m(e),readTargetSettings:()=>_(y(e)),writeTargetSettings:t=>w(y(e),t)}}),...n.commandModules??[]],startupUpdateNoticePromise:S(t)?d({currentVersion:r}):void 0}}function De(e,t){let n=N(I(e,t),`utf8`).trim();if(n.length===0)throw Error(`Task file is empty: ${t}`);return`Task file (${t}):\n${n}`}function Oe(e,t){let n=[];if(t.appendSystemPrompt&&n.push(t.appendSystemPrompt),t.taskFile)try{n.push(De(e,t.taskFile))}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}return t.jsonSchema&&n.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),n.length>0?n.join(`
|
|
47
|
+
|
|
48
|
+
`):void 0}async function ke(e,n,r,i,a,o,s,c){let l=n.positional.join(` `).trim();if(!l&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);l=Buffer.concat(e).toString(`utf-8`).trim()}l||(process.stderr.write(`Print mode (-p) requires a prompt argument.
|
|
49
|
+
`),process.exit(1));let u=Oe(e,n),d=new t({cwd:e,provider:r,outputFormat:n.outputFormat??`text`,permissionMode:n.permissionMode??`bypassPermissions`,maxTurns:n.maxTurns,sessionStore:n.noSessionPersistence?void 0:i,sessionName:n.sessionName,bare:n.bare||void 0,allowedTools:n.allowedTools?n.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:u,...n.systemPrompt?{systemPrompt:n.systemPrompt}:{},backgroundTaskRunners:a,subagentRunnerFactory:o,commandModules:s,commandHostAdapters:c});await d.run(l),process.exit(d.getExitCode())}async function Ae(t={}){let i;try{i=G()}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let a=we();if(i.help){process.stdout.write(z());return}if(i.version){process.stdout.write(`robota ${a}\n`);return}if(i.checkUpdate){let e=await o({currentVersion:a,force:!0}),t=l(e);e.status===`error`&&(process.stderr.write(`${t}\n`),process.exit(1)),process.stdout.write(`${t}\n`);return}let d=process.cwd(),f=new n;if(i.reset){Te(f);return}if(i.positional[0]===`session`&&i.positional[1]===`analyze`){await Ce(process.argv.slice(4));return}try{if(await me(i,d,f))return}catch(e){f.writeError(e instanceof Error?e.message:String(e)),process.exit(1)}let{commandHostAdapters:m,providerDefinitions:h,commandModules:_,startupUpdateNoticePromise:v}=Ee(d,i,t,a);if(i.configure){await ue(d,i,r,f,h);return}if(ce(d,i,f,h))return;try{await le(d,i,r,f,h)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}let y=i.provider?{providerOverride:i.provider,providerDefinitions:h}:{providerDefinitions:h},x=g(d,y),S=i.model??x.model,C=c(d,i.model,y),w=oe(),T=p(d),E=se({workerPath:M(),providerConfig:{...x,model:S},logsDir:T.logs}),D=s(d),O,k=!1;if(i.continueMode?O=ee(D,d):i.resumeId!==void 0&&(i.resumeId===``?k=!0:(O=b(D,i.resumeId),O===void 0&&(process.stderr.write(`Session not found: ${i.resumeId}\n`),process.exit(1)))),i.printMode){await ke(d,i,C,D,w,E,_,m);return}await ie({cwd:d,provider:C,providerOverride:i.provider,providerType:x.name,modelId:S,language:i.language,permissionMode:i.permissionMode,maxTurns:i.maxTurns,version:a,sessionStore:i.noSessionPersistence?void 0:D,resumeSessionId:O,showSessionPickerOnStart:k,forkSession:i.forkSession,sessionName:i.sessionName,backgroundTaskRunners:w,subagentRunnerFactory:E,commandModules:_,commandHostAdapters:m,shellExec:t=>e(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd(),startupUpdateNotice:v?v.then(e=>e?u(e):void 0):void 0,transportRegistry:ae(),cliAdapter:re({providerDefinitions:h,reloadPluginCommandSource:j}),reloadPluginCommandSource:j,agentName:`robota-cli`}),process.exit(0)}export{Ae as startCli};
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/utils/cli-args.ts","../../src/startup/provider-startup.ts","../../src/user-local-direct-command.ts","../../src/session-analyzer/parser.ts","../../src/session-analyzer/reporter.ts","../../src/session-analyzer/session-analyze-command.ts","../../src/startup/version.ts","../../src/startup/reset-config.ts","../../src/startup/command-setup.ts","../../src/startup/append-system-prompt.ts","../../src/modes/print-mode.ts","../../src/cli.ts"],"sourcesContent":["/**\n * CLI argument parsing and validation.\n * Pure functions — throw on invalid input, no process.* side effects.\n */\n\nimport { parseArgs } from 'node:util';\n\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nconst VALID_MODES: TPermissionMode[] = ['plan', 'default', 'acceptEdits', 'bypassPermissions'];\n\nconst VALID_OUTPUT_FORMATS = ['text', 'json', 'stream-json'] as const;\nexport type TOutputFormat = (typeof VALID_OUTPUT_FORMATS)[number];\n\nexport interface IParsedCliArgs {\n positional: string[];\n help: boolean;\n printMode: boolean;\n continueMode: boolean;\n resumeId: string | undefined;\n language: string | undefined;\n permissionMode: TPermissionMode | undefined;\n maxTurns: number | undefined;\n forkSession: boolean;\n sessionName: string | undefined;\n outputFormat: TOutputFormat | undefined;\n format: string | undefined;\n summary: string | undefined;\n source: string | undefined;\n systemPrompt: string | undefined;\n appendSystemPrompt: string | undefined;\n taskFile: string | undefined;\n version: boolean;\n reset: boolean;\n bare: boolean;\n allowedTools: string | undefined;\n deniedTools: string | undefined;\n model: string | undefined;\n noSessionPersistence: boolean;\n jsonSchema: string | undefined;\n configure: boolean;\n configureProvider: string | undefined;\n provider: string | undefined;\n providerType: string | undefined;\n baseURL: string | undefined;\n apiKey: string | undefined;\n apiKeyEnv: string | undefined;\n setCurrent: boolean;\n settingsScope: string | undefined;\n checkUpdate: boolean;\n disableUpdateCheck: boolean;\n dryRun: boolean;\n yes: boolean;\n}\n\n/** Return CLI usage help text. */\nexport function printHelp(): string {\n return `\nUsage: robota [options] [-p <prompt>]\n\nOptions:\n -p <prompt> Run in print (headless) mode with the given prompt\n --output-format <format> Output format: text | json | stream-json (default: text)\n --system-prompt <text> Override the system prompt for this session\n --append-system-prompt <t> Append text to the system prompt\n --language <lang> Language preference (e.g. ko, en)\n --no-session-persistence Disable session persistence for this run\n --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions\n --max-turns <n> Maximum agent turns before stopping\n -c, --continue Continue the most recent session\n -r, --resume <id> Resume a session by ID or name\n -n, --name <name> Name for the new session\n --fork-session Fork the current session into a new independent session\n --task-file <path> Read a task prompt from file and append it to the system prompt\n --bare Print mode: output raw text only, no formatting wrapper\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run Plan-only run: show what the agent would do without modifying files\n --check-update Check for CLI updates\n --version Show version number\n -h, --help Show this help message\n\nCommands:\n robota init Initialize AGENTS.md and .robota/settings.json\n\nExamples:\n robota Start interactive TUI session\n robota init Initialize project files\n robota -p \"Hello\" Print mode: send prompt and exit\n robota -p \"Hello\" --output-format json\n robota -p \"Review this diff\" --bare Raw output for shell pipelines\n robota --task-file task.md Run task from file (appended to system prompt)\n robota --dry-run \"Refactor the auth module\" Show plan without modifying files\n robota --continue Resume the last session\n`;\n}\n\n/** Validate and return a TOutputFormat from a raw CLI string, or throw on error. */\nexport function parseOutputFormat(raw: string | undefined): TOutputFormat | undefined {\n if (raw === undefined) return undefined;\n if (!(VALID_OUTPUT_FORMATS as readonly string[]).includes(raw)) {\n throw new Error(`Invalid --output-format \"${raw}\". Valid: ${VALID_OUTPUT_FORMATS.join(' | ')}`);\n }\n return raw as TOutputFormat;\n}\n\n/** Validate and return a TPermissionMode from a raw CLI string, or throw on error. */\nexport function parsePermissionMode(raw: string | undefined): TPermissionMode | undefined {\n if (raw === undefined) return undefined;\n if (!VALID_MODES.includes(raw as TPermissionMode)) {\n throw new Error(`Invalid --permission-mode \"${raw}\". Valid: ${VALID_MODES.join(' | ')}`);\n }\n return raw as TPermissionMode;\n}\n\n/** Validate and return a positive integer from a raw CLI string, or throw on error. */\nexport function parseMaxTurns(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = parseInt(raw, 10);\n if (isNaN(n) || n <= 0) {\n throw new Error(`Invalid --max-turns \"${raw}\". Must be a positive integer.`);\n }\n return n;\n}\n\nconst PARSE_ARGS_CONFIG = {\n allowPositionals: true,\n options: {\n help: { type: 'boolean', short: 'h', default: false },\n p: { type: 'boolean', short: 'p', default: false },\n continue: { type: 'boolean', short: 'c', default: false },\n resume: { type: 'string', short: 'r' },\n language: { type: 'string' },\n 'permission-mode': { type: 'string' },\n 'max-turns': { type: 'string' },\n 'fork-session': { type: 'boolean', default: false },\n name: { type: 'string', short: 'n' },\n 'output-format': { type: 'string' },\n format: { type: 'string' },\n summary: { type: 'string' },\n source: { type: 'string' },\n 'system-prompt': { type: 'string' },\n 'append-system-prompt': { type: 'string' },\n 'task-file': { type: 'string' },\n version: { type: 'boolean', default: false },\n reset: { type: 'boolean', default: false },\n bare: { type: 'boolean', default: false },\n 'allowed-tools': { type: 'string' },\n 'denied-tools': { type: 'string' },\n model: { type: 'string' },\n 'no-session-persistence': { type: 'boolean', default: false },\n 'json-schema': { type: 'string' },\n configure: { type: 'boolean', default: false },\n 'configure-provider': { type: 'string' },\n provider: { type: 'string' },\n type: { type: 'string' },\n 'base-url': { type: 'string' },\n 'api-key': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'set-current': { type: 'boolean', default: false },\n 'settings-scope': { type: 'string' },\n 'check-update': { type: 'boolean', default: false },\n 'disable-update-check': { type: 'boolean', default: false },\n 'dry-run': { type: 'boolean', default: false },\n yes: { type: 'boolean', short: 'y', default: false },\n },\n} as const;\n\nfunction mapParsedValues(\n values: ReturnType<typeof parseArgs<typeof PARSE_ARGS_CONFIG>>['values'],\n positionals: string[],\n): IParsedCliArgs {\n return {\n positional: positionals,\n help: values['help'] ?? false,\n printMode: values['p'] ?? false,\n continueMode: values['continue'] ?? false,\n resumeId: values['resume'],\n language: values['language'],\n permissionMode: parsePermissionMode(values['permission-mode']),\n maxTurns: parseMaxTurns(values['max-turns']),\n forkSession: values['fork-session'] ?? false,\n sessionName: values['name'],\n outputFormat: parseOutputFormat(values['output-format']),\n format: values['format'],\n summary: values['summary'],\n source: values['source'],\n systemPrompt: values['system-prompt'],\n appendSystemPrompt: values['append-system-prompt'],\n taskFile: values['task-file'],\n version: values['version'] ?? false,\n reset: values['reset'] ?? false,\n bare: values['bare'] ?? false,\n allowedTools: values['allowed-tools'],\n deniedTools: values['denied-tools'],\n model: values['model'],\n noSessionPersistence: values['no-session-persistence'] ?? false,\n jsonSchema: values['json-schema'],\n configure: values['configure'] ?? false,\n configureProvider: values['configure-provider'],\n provider: values['provider'],\n providerType: values['type'],\n baseURL: values['base-url'],\n apiKey: values['api-key'],\n apiKeyEnv: values['api-key-env'],\n setCurrent: values['set-current'] ?? false,\n settingsScope: values['settings-scope'],\n checkUpdate: values['check-update'] ?? false,\n disableUpdateCheck: values['disable-update-check'] ?? false,\n dryRun: values['dry-run'] ?? false,\n yes: values['yes'] ?? false,\n };\n}\n\n/** Parse and validate CLI arguments. */\nexport function parseCliArgs(): IParsedCliArgs {\n const { values, positionals } = parseArgs(PARSE_ARGS_CONFIG);\n return mapParsedValues(values, positionals);\n}\n","import { formatSupportedProviderTypes, type IProviderDefinition } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport {\n applyProviderConfiguration,\n applyProviderSwitch,\n readMergedProviderSettings,\n resolveProviderSettingsWriteTargetPath,\n resolveSettingsPathForScope,\n} from '@robota-sdk/agent-framework';\nimport type { TSettingsScope } from '@robota-sdk/agent-framework';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport { type IProviderSetupInput } from '@robota-sdk/agent-framework';\nimport {\n ensureProviderConfig,\n runProviderStartupSetup,\n type TPromptInput,\n} from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nfunction validateSettingsScope(scope: string | undefined): TSettingsScope | undefined {\n if (scope === undefined || scope === 'user' || scope === 'project-local') {\n return scope as TSettingsScope | undefined;\n }\n throw new Error(`Invalid --settings-scope \"${scope}\". Valid: user | project-local`);\n}\n\nexport function handleProviderConfigurationArgs(\n cwd: string,\n args: IParsedCliArgs,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): boolean {\n const settingsPath = resolveSettingsPathForScope(cwd, validateSettingsScope(args.settingsScope));\n if (args.configureProvider) {\n applyProviderConfiguration(settingsPath, buildSetupInputFromArgs(args), {\n providerDefinitions,\n });\n terminal.writeLine(`Provider profile saved to ${settingsPath}`);\n return !args.printMode && args.positional.length === 0;\n }\n if (args.provider && args.setCurrent) {\n const switchSettingsPath =\n args.settingsScope === undefined ? resolveProviderSettingsWriteTargetPath(cwd) : settingsPath;\n applyProviderSwitch(switchSettingsPath, args.provider, {\n knownProviders: readMergedProviderSettings(cwd).providers,\n });\n terminal.writeLine(`Current provider set to ${args.provider}`);\n return !args.printMode && args.positional.length === 0;\n }\n return false;\n}\n\nexport async function ensureConfig(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n isInteractive?: boolean,\n): Promise<void> {\n await ensureProviderConfig(\n cwd,\n { provider: args.provider, settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n {\n formatError: formatMissingProviderConfigMessage,\n isInteractive:\n isInteractive !== undefined\n ? () => isInteractive\n : () => process.stdin.isTTY === true && process.stdout.isTTY === true,\n },\n );\n}\n\nexport async function runInteractiveProviderSetup(\n cwd: string,\n args: IParsedCliArgs,\n promptInput: TPromptInput,\n terminal: ITerminalOutput,\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): Promise<void> {\n await runProviderStartupSetup(\n cwd,\n { settingsScope: validateSettingsScope(args.settingsScope) },\n promptInput,\n terminal,\n providerDefinitions,\n );\n}\n\nfunction buildSetupInputFromArgs(args: IParsedCliArgs): IProviderSetupInput {\n const type = args.providerType ?? args.configureProvider;\n if (!args.configureProvider || !type) {\n throw new Error('--configure-provider requires a provider profile and --type');\n }\n return {\n profile: args.configureProvider,\n type,\n ...(args.model !== undefined && { model: args.model }),\n ...(args.apiKey !== undefined && { apiKey: args.apiKey }),\n ...(args.apiKeyEnv !== undefined && { apiKeyEnv: args.apiKeyEnv }),\n ...(args.baseURL !== undefined && { baseURL: args.baseURL }),\n setCurrent: args.setCurrent,\n };\n}\n\nexport function formatMissingProviderConfigMessage(\n providerDefinitions: readonly IProviderDefinition[] = createDefaultProviderDefinitions(),\n): string {\n return [\n 'No provider configuration found.',\n 'Run `robota --configure` in an interactive terminal, or configure a provider:',\n `Supported providers: ${formatSupportedProviderTypes(providerDefinitions)}`,\n ...providerDefinitions.map(formatConfigureProviderExample),\n ].join('\\n');\n}\n\nfunction formatConfigureProviderExample(definition: IProviderDefinition): string {\n const flags = [\n `robota --configure-provider ${definition.type}`,\n `--type ${definition.type}`,\n ...(definition.defaults?.baseURL !== undefined ? ['--base-url <url>'] : []),\n '--model <model>',\n ...(definition.requiresApiKey === true ? ['--api-key-env <ENV_NAME>'] : []),\n '--set-current',\n ];\n return ` ${flags.join(' ')}`;\n}\n","import { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n args: IParsedCliArgs,\n cwd: string,\n terminal: ITerminalOutput,\n): Promise<boolean> {\n if (args.positional[0] !== 'user-local') {\n return false;\n }\n\n const result = await executeUserLocalDirectCommand({\n cwd,\n argv: args.positional.slice(1),\n format: args.format,\n summary: args.summary,\n source: args.source,\n });\n const output = result.message.trimEnd();\n if (!result.success) {\n throw new Error(output);\n }\n terminal.writeLine(output);\n return true;\n}\n","/**\n * Session log parser and timing interval calculator.\n */\n\nimport { readFileSync } from 'node:fs';\n\nimport type {\n ISessionHistoryEntry,\n ISessionRecord,\n ISessionTimingReport,\n ITimingInterval,\n ITimingStats,\n TIntervalKind,\n} from './types.js';\n\nexport function parseSessionFile(filePath: string): ISessionRecord {\n const raw = readFileSync(filePath, 'utf-8');\n return JSON.parse(raw) as ISessionRecord;\n}\n\n/** Calculate gap in milliseconds between two ISO 8601 timestamps. */\nexport function gapMs(from: string, to: string): number {\n return new Date(to).getTime() - new Date(from).getTime();\n}\n\n/**\n * Compute timing intervals from a history entry array.\n *\n * Strategy: scan the timeline turn by turn.\n * A \"turn\" starts with a user message. After user, we expect:\n * - zero or more: tool-start → tool-end cycles\n * - optionally: tool-summary\n * - finally: assistant message\n */\nexport function computeTimingIntervals(history: ISessionHistoryEntry[]): ITimingInterval[] {\n const intervals: ITimingInterval[] = [];\n let turnIndex = 0;\n\n let i = 0;\n while (i < history.length) {\n const entry = history[i];\n if (!entry) {\n i++;\n continue;\n }\n\n if (entry.category === 'chat' && entry.type === 'user') {\n turnIndex++;\n const userTs = entry.timestamp;\n let foundFirstTool = false;\n let lastToolEndTs: string | null = null;\n let j = i + 1;\n\n while (j < history.length) {\n const next = history[j];\n if (!next) {\n j++;\n continue;\n }\n\n if (next.category === 'chat' && next.type === 'user') {\n break;\n }\n\n if (next.category === 'event' && next.type === 'tool-start') {\n if (!foundFirstTool) {\n intervals.push(\n makeInterval(\n 'user_to_first_tool',\n 'user',\n 'tool-start',\n userTs,\n next.timestamp,\n turnIndex,\n ),\n );\n foundFirstTool = true;\n } else if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_between_tools',\n 'tool-end',\n 'tool-start',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n lastToolEndTs = null;\n j++;\n continue;\n }\n\n if (next.category === 'event' && next.type === 'tool-end') {\n const prev = history[j - 1];\n if (prev && prev.category === 'event' && prev.type === 'tool-start') {\n intervals.push(\n makeInterval(\n 'tool_exec',\n 'tool-start',\n 'tool-end',\n prev.timestamp,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n lastToolEndTs = next.timestamp;\n j++;\n continue;\n }\n\n if (next.category === 'event' && next.type === 'tool-summary') {\n if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_final_response',\n 'tool-end',\n 'tool-summary',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n j++;\n continue;\n }\n\n if (next.category === 'chat' && next.type === 'assistant') {\n if (!foundFirstTool) {\n intervals.push(\n makeInterval(\n 'user_to_assistant',\n 'user',\n 'assistant',\n userTs,\n next.timestamp,\n turnIndex,\n ),\n );\n } else if (lastToolEndTs !== null) {\n intervals.push(\n makeInterval(\n 'llm_final_response',\n 'tool-end',\n 'assistant',\n lastToolEndTs,\n next.timestamp,\n turnIndex,\n ),\n );\n }\n j++;\n break;\n }\n\n j++;\n }\n\n i = j;\n } else {\n i++;\n }\n }\n\n return intervals;\n}\n\nfunction makeInterval(\n kind: TIntervalKind,\n fromType: string,\n toType: string,\n fromTimestamp: string,\n toTimestamp: string,\n turnIndex: number,\n): ITimingInterval {\n return {\n kind,\n fromType,\n toType,\n fromTimestamp,\n toTimestamp,\n durationMs: gapMs(fromTimestamp, toTimestamp),\n turnIndex,\n };\n}\n\nconst SLOW_THRESHOLD_MS = 10_000;\n\nfunction computeStats(intervals: ITimingInterval[]): ITimingStats {\n const llm = intervals.filter(\n (iv) =>\n iv.kind === 'user_to_first_tool' ||\n iv.kind === 'user_to_assistant' ||\n iv.kind === 'llm_between_tools' ||\n iv.kind === 'llm_final_response',\n );\n const tool = intervals.filter((iv) => iv.kind === 'tool_exec');\n const direct = intervals.filter((iv) => iv.kind === 'user_to_assistant');\n\n const avg = (arr: ITimingInterval[]) =>\n arr.length ? Math.round(arr.reduce((s, iv) => s + iv.durationMs, 0) / arr.length) : 0;\n const max = (arr: ITimingInterval[]) =>\n arr.length ? Math.max(...arr.map((iv) => iv.durationMs)) : 0;\n const median = (arr: ITimingInterval[]) => {\n if (!arr.length) return 0;\n const sorted = [...arr].sort((a, b) => a.durationMs - b.durationMs);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0\n ? Math.round(((sorted[mid - 1]?.durationMs ?? 0) + (sorted[mid]?.durationMs ?? 0)) / 2)\n : (sorted[mid]?.durationMs ?? 0);\n };\n\n return {\n llmWaitMs: {\n avg: avg(llm),\n max: max(llm),\n total: llm.reduce((s, iv) => s + iv.durationMs, 0),\n count: llm.length,\n },\n toolExecMs: { avg: avg(tool), max: max(tool), median: median(tool), count: tool.length },\n userToAssistantMs: { avg: avg(direct), max: max(direct), count: direct.length },\n };\n}\n\nexport function analyzeSession(record: ISessionRecord): ISessionTimingReport {\n const history = record.history ?? [];\n const intervals = computeTimingIntervals(history);\n const slowIntervals = intervals.filter((iv) => iv.durationMs >= SLOW_THRESHOLD_MS);\n\n return {\n sessionId: record.id,\n cwd: record.cwd,\n createdAt: record.createdAt,\n totalIntervals: intervals.length,\n intervals,\n slowIntervals,\n stats: computeStats(intervals),\n };\n}\n","/**\n * Text report formatter for session timing analysis.\n */\n\nimport type { IAggregateReport, ISessionTimingReport, ITimingInterval } from './types.js';\n\nfunction fmtMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nfunction fmtDate(iso: string): string {\n return new Date(iso).toLocaleString('sv-SE', { timeZoneName: 'short' }).slice(0, 16);\n}\n\nfunction intervalLabel(iv: ITimingInterval): string {\n const map: Record<string, string> = {\n user_to_first_tool: 'user → tool-start',\n user_to_assistant: 'user → assistant',\n tool_exec: 'tool-start → tool-end',\n llm_between_tools: 'tool-end → tool-start',\n llm_final_response: 'tool-end → assistant/summary',\n };\n return map[iv.kind] ?? iv.kind;\n}\n\nfunction verdictLine(report: ISessionTimingReport): string {\n const { stats } = report;\n const totalMs = stats.llmWaitMs.total + stats.toolExecMs.avg * stats.toolExecMs.count;\n if (totalMs === 0) return 'Verdict: No timing data available.';\n const llmPct = Math.round((stats.llmWaitMs.total / totalMs) * 100);\n const toolPct = 100 - llmPct;\n return `Verdict: LLM API wait ${llmPct}% | Code processing ${toolPct}%`;\n}\n\nexport function formatSingleSession(report: ISessionTimingReport): string {\n const lines: string[] = [];\n const { stats } = report;\n\n lines.push(`Session: ${report.sessionId}`);\n lines.push(`Created: ${fmtDate(report.createdAt)} | cwd: ${report.cwd}`);\n lines.push('');\n lines.push('Timing Summary:');\n\n if (stats.llmWaitMs.count > 0) {\n lines.push(\n ` LLM API wait ${fmtMs(stats.llmWaitMs.avg).padStart(8)} avg | ${fmtMs(stats.llmWaitMs.max).padStart(8)} max`,\n );\n }\n if (stats.toolExecMs.count > 0) {\n lines.push(\n ` Tool execution ${fmtMs(stats.toolExecMs.avg).padStart(8)} avg | ${fmtMs(stats.toolExecMs.median).padStart(8)} median`,\n );\n }\n if (stats.userToAssistantMs.count > 0) {\n lines.push(` user → assistant ${fmtMs(stats.userToAssistantMs.avg).padStart(8)} avg`);\n }\n if (stats.llmWaitMs.count === 0 && stats.toolExecMs.count === 0) {\n lines.push(' (no intervals computed — session may have no history)');\n }\n\n if (report.slowIntervals.length > 0) {\n lines.push('');\n lines.push('Slow intervals (>10s):');\n for (const iv of report.slowIntervals) {\n lines.push(\n ` turn ${iv.turnIndex} ${intervalLabel(iv).padEnd(32)} ${fmtMs(iv.durationMs).padStart(8)}`,\n );\n }\n }\n\n lines.push('');\n lines.push(verdictLine(report));\n\n return lines.join('\\n');\n}\n\nexport function formatAggregateReport(aggregate: IAggregateReport): string {\n const lines: string[] = [];\n lines.push(\n `Analyzed ${aggregate.sessionCount} sessions (${fmtDate(aggregate.fromDate)} ~ ${fmtDate(aggregate.toDate)})`,\n );\n lines.push(` Avg LLM response: ${fmtMs(aggregate.avgLlmResponseMs)}`);\n lines.push(` Avg tool exec: ${fmtMs(aggregate.avgToolExecMs)}`);\n if (aggregate.maxSingleDelayMs > 0) {\n lines.push(\n ` Max single delay: ${fmtMs(aggregate.maxSingleDelayMs)} (${aggregate.maxSingleDelaySession}, turn ${aggregate.maxSingleDelayTurn}, ${aggregate.maxSingleDelayKind})`,\n );\n }\n return lines.join('\\n');\n}\n","/**\n * `robota session analyze` command.\n *\n * Usage:\n * robota session analyze — analyze the most recent session\n * robota session analyze --last <n> — aggregate the last N sessions\n * robota session analyze --session <id> — analyze a specific session by ID prefix\n */\n\nimport { readdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { userPaths } from '@robota-sdk/agent-framework';\n\nimport { analyzeSession, parseSessionFile } from './parser.js';\nimport { formatAggregateReport, formatSingleSession } from './reporter.js';\nimport type { IAggregateReport, ISessionTimingReport } from './types.js';\n\ninterface ISessionAnalyzeArgs {\n last: number | undefined;\n sessionId: string | undefined;\n}\n\nfunction parseSessionAnalyzeArgs(argv: string[]): ISessionAnalyzeArgs {\n let last: number | undefined;\n let sessionId: string | undefined;\n\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--last' && argv[i + 1]) {\n const n = parseInt(argv[i + 1]!, 10);\n if (!isNaN(n) && n > 0) last = n;\n i++;\n } else if (argv[i] === '--session' && argv[i + 1]) {\n sessionId = argv[i + 1];\n i++;\n }\n }\n\n return { last, sessionId };\n}\n\nfunction listSessionFiles(sessionsDir: string): string[] {\n try {\n return readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => join(sessionsDir, f))\n .sort();\n } catch {\n // allow-fallback: sessions directory may not exist on first run — empty list is correct response\n return [];\n }\n}\n\nfunction buildAggregateReport(reports: ISessionTimingReport[]): IAggregateReport {\n const llmIntervals = reports.flatMap((r) =>\n r.intervals.filter(\n (iv) =>\n iv.kind === 'user_to_first_tool' ||\n iv.kind === 'user_to_assistant' ||\n iv.kind === 'llm_between_tools' ||\n iv.kind === 'llm_final_response',\n ),\n );\n const toolIntervals = reports.flatMap((r) => r.intervals.filter((iv) => iv.kind === 'tool_exec'));\n\n const avgLlmResponseMs = llmIntervals.length\n ? Math.round(llmIntervals.reduce((s, iv) => s + iv.durationMs, 0) / llmIntervals.length)\n : 0;\n const avgToolExecMs = toolIntervals.length\n ? Math.round(toolIntervals.reduce((s, iv) => s + iv.durationMs, 0) / toolIntervals.length)\n : 0;\n\n let maxSingleDelayMs = 0;\n let maxSingleDelaySession = '';\n let maxSingleDelayTurn = 0;\n let maxSingleDelayKind = '';\n\n for (const r of reports) {\n for (const iv of r.intervals) {\n if (iv.durationMs > maxSingleDelayMs) {\n maxSingleDelayMs = iv.durationMs;\n maxSingleDelaySession = r.sessionId;\n maxSingleDelayTurn = iv.turnIndex;\n maxSingleDelayKind = iv.kind;\n }\n }\n }\n\n const dates = reports.map((r) => r.createdAt).sort();\n\n return {\n sessionCount: reports.length,\n fromDate: dates[0] ?? '',\n toDate: dates[dates.length - 1] ?? '',\n avgLlmResponseMs,\n avgToolExecMs,\n maxSingleDelayMs,\n maxSingleDelaySession,\n maxSingleDelayTurn,\n maxSingleDelayKind,\n };\n}\n\nexport async function runSessionAnalyze(argv: string[]): Promise<void> {\n const args = parseSessionAnalyzeArgs(argv);\n const sessionsDir = userPaths().sessions;\n const allFiles = listSessionFiles(sessionsDir);\n\n if (allFiles.length === 0) {\n process.stderr.write(`No session files found in ${sessionsDir}\\n`);\n process.exit(1);\n }\n\n if (args.sessionId !== undefined) {\n const matched = allFiles.find((f) => f.includes(args.sessionId!));\n if (!matched) {\n process.stderr.write(`Session not found: ${args.sessionId}\\n`);\n process.exit(1);\n }\n const record = parseSessionFile(matched);\n const report = analyzeSession(record);\n process.stdout.write(formatSingleSession(report) + '\\n');\n return;\n }\n\n if (args.last !== undefined) {\n const files = allFiles.slice(-args.last);\n const reports: ISessionTimingReport[] = [];\n for (const f of files) {\n try {\n reports.push(analyzeSession(parseSessionFile(f)));\n } catch {\n // allow-fallback: corrupted or partial session files are skipped — expected on interrupted writes\n // skip unreadable session files\n }\n }\n if (reports.length === 0) {\n process.stderr.write('No valid sessions found.\\n');\n process.exit(1);\n }\n const aggregate = buildAggregateReport(reports);\n process.stdout.write(formatAggregateReport(aggregate) + '\\n');\n return;\n }\n\n // Default: analyze the most recent session\n const latest = allFiles[allFiles.length - 1];\n if (!latest) {\n process.stderr.write('No sessions found.\\n');\n process.exit(1);\n }\n const record = parseSessionFile(latest);\n const report = analyzeSession(record);\n process.stdout.write(formatSingleSession(report) + '\\n');\n}\n","import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\n","import { resetUserConfig } from '@robota-sdk/agent-framework';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nexport function runResetConfig(terminal: ITerminalOutput): void {\n const result = resetUserConfig();\n if (result.deleted) {\n terminal.writeLine(`Deleted ${result.path}`);\n } else {\n terminal.writeLine('No user settings found.');\n }\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getStartupCliUpdateNotice,\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n shouldRunStartupCliUpdateCheck,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICliUpdateNotice,\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICliSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n startupUpdateNoticePromise: Promise<ICliUpdateNotice | undefined> | undefined;\n}\n\nexport function buildCommandSetup(\n cwd: string,\n args: IParsedCliArgs,\n options: IStartCliOptions,\n version: string,\n): ICliSetup {\n const commandHostAdapters: ICommandHostAdapters = {\n settings: {\n read: () => readSettings(getUserSettingsPath()),\n write: (settings) => writeSettings(getUserSettingsPath(), settings),\n },\n plugin: createDefaultPluginCommandAdapter(cwd),\n };\n const providerDefinitions = options.providerDefinitions ?? createDefaultProviderDefinitions();\n const providerSettingsAdapter = {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n readTargetSettings: () =>\n readSettings(resolveProviderSettingsWriteTargetPath(cwd)) as TProviderSettingsDocument,\n writeTargetSettings: (settings: TProviderSettingsDocument) =>\n writeSettings(resolveProviderSettingsWriteTargetPath(cwd), settings),\n };\n const commandModules: readonly ICommandModule[] = [\n ...createDefaultCommandModules({ cwd, providerDefinitions, providerSettingsAdapter }),\n ...(options.commandModules ?? []),\n ];\n const startupUpdateNoticePromise = shouldRunStartupCliUpdateCheck(args)\n ? getStartupCliUpdateNotice({ currentVersion: version })\n : undefined;\n return { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise };\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\n\nfunction readTaskFilePrompt(cwd: string, taskFile: string): string {\n const taskPath = resolve(cwd, taskFile);\n const content = readFileSync(taskPath, 'utf8').trim();\n if (content.length === 0) {\n throw new Error(`Task file is empty: ${taskFile}`);\n }\n return `Task file (${taskFile}):\\n${content}`;\n}\n\nexport function buildAppendSystemPrompt(cwd: string, args: IParsedCliArgs): string | undefined {\n const appendParts: string[] = [];\n if (args.appendSystemPrompt) appendParts.push(args.appendSystemPrompt);\n if (args.taskFile) {\n try {\n appendParts.push(readTaskFilePrompt(cwd, args.taskFile));\n } catch (error) {\n // allow-fallback: terminal failure — task file read failure exits process\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n }\n if (args.jsonSchema)\n appendParts.push(\n `Respond with valid JSON only, matching this JSON schema:\\n${args.jsonSchema}`,\n );\n return appendParts.length > 0 ? appendParts.join('\\n\\n') : undefined;\n}\n","import type { IAIProvider } from '@robota-sdk/agent-core';\nimport type { ICommandHostAdapters, ICommandModule } from '@robota-sdk/agent-framework';\nimport type { createProjectSessionStore } from '@robota-sdk/agent-framework';\nimport { HeadlessInteractionChannel } from '@robota-sdk/agent-transport/headless';\nimport type { IBackgroundTaskRunner } from '@robota-sdk/agent-executor';\nimport type { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\nimport type { IParsedCliArgs } from '../utils/cli-args.js';\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\n\nexport async function runPrintMode(\n cwd: string,\n args: IParsedCliArgs,\n provider: IAIProvider,\n sessionStore: ReturnType<typeof createProjectSessionStore>,\n backgroundTaskRunners: IBackgroundTaskRunner[],\n subagentRunnerFactory: ReturnType<typeof createChildProcessSubagentRunnerFactory>,\n commandModules: readonly ICommandModule[],\n commandHostAdapters: ICommandHostAdapters,\n): Promise<void> {\n let prompt = args.positional.join(' ').trim();\n\n if (!prompt && !process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n process.stderr.write('Print mode (-p) requires a prompt argument.\\n');\n process.exit(1);\n }\n\n const appendSystemPrompt = buildAppendSystemPrompt(cwd, args);\n\n const channel = new HeadlessInteractionChannel({\n cwd,\n provider,\n outputFormat: args.outputFormat ?? 'text',\n permissionMode: args.permissionMode ?? 'bypassPermissions',\n maxTurns: args.maxTurns,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n sessionName: args.sessionName,\n bare: args.bare || undefined,\n allowedTools: args.allowedTools\n ? args.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n appendSystemPrompt,\n ...(args.systemPrompt ? { systemPrompt: args.systemPrompt } : {}),\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n });\n\n await channel.run(prompt);\n process.exit(channel.getExitCode());\n}\n","/**\n * CLI entry point — pure composition root.\n * Parses arguments and delegates to startup modules, mode runners, and transports.\n */\n\nimport { execSync } from 'node:child_process';\nimport { PrintTerminal, promptInput } from '@robota-sdk/agent-transport/headless';\nimport {\n createProjectSessionStore,\n projectPaths,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n readMergedProviderSettings,\n readProviderSettings,\n createProviderFromSettings,\n checkForCliUpdate,\n formatCliUpdateCheckMessage,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport { parseCliArgs, printHelp } from './utils/cli-args.js';\nimport type { IParsedCliArgs } from './utils/cli-args.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './startup/provider-startup.js';\nimport { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\nimport { createDefaultTransportRegistry } from '@robota-sdk/agent-transport';\nimport { createDefaultBackgroundTaskRunners } from '@robota-sdk/agent-executor';\nimport {\n createChildProcessSubagentRunnerFactory,\n getDefaultSubagentWorkerPath,\n} from '@robota-sdk/agent-subagent-runner';\nimport { reloadPluginCommandSource } from '@robota-sdk/agent-command';\nimport { runUserLocalDirectCommandIfRequested } from './user-local-direct-command.js';\nimport { runSessionAnalyze } from './session-analyzer/session-analyze-command.js';\nimport { readVersion } from './startup/version.js';\nimport { runResetConfig } from './startup/reset-config.js';\nimport type { IStartCliOptions } from './startup/command-setup.js';\nimport { buildCommandSetup } from './startup/command-setup.js';\nimport { runPrintMode } from './modes/print-mode.js';\n\nexport type { IStartCliOptions };\n\nexport async function startCli(options: IStartCliOptions = {}): Promise<void> {\n let args: IParsedCliArgs;\n try {\n args = parseCliArgs();\n } catch (error) {\n // allow-fallback: argument validation errors are terminal — exit is the correct response\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n const version = readVersion();\n\n if (args.help) {\n process.stdout.write(printHelp());\n return;\n }\n\n if (args.version) {\n process.stdout.write(`robota ${version}\\n`);\n return;\n }\n\n if (args.checkUpdate) {\n const result = await checkForCliUpdate({ currentVersion: version, force: true });\n const message = formatCliUpdateCheckMessage(result);\n if (result.status === 'error') {\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n }\n process.stdout.write(`${message}\\n`);\n return;\n }\n\n const cwd = process.cwd();\n const terminal = new PrintTerminal();\n\n if (args.reset) {\n runResetConfig(terminal);\n return;\n }\n\n if (args.positional[0] === 'session' && args.positional[1] === 'analyze') {\n await runSessionAnalyze(process.argv.slice(4));\n return;\n }\n\n try {\n if (await runUserLocalDirectCommandIfRequested(args, cwd, terminal)) {\n return;\n }\n } catch (error) {\n // allow-fallback: user-local command failure is terminal — exit is the correct response\n terminal.writeError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n\n const { commandHostAdapters, providerDefinitions, commandModules, startupUpdateNoticePromise } =\n buildCommandSetup(cwd, args, options, version);\n\n if (args.configure) {\n await runInteractiveProviderSetup(cwd, args, promptInput, terminal, providerDefinitions);\n return;\n }\n\n if (handleProviderConfigurationArgs(cwd, args, terminal, providerDefinitions)) {\n return;\n }\n\n try {\n await ensureConfig(cwd, args, promptInput, terminal, providerDefinitions);\n } catch (error) {\n // allow-fallback: terminal failure — not a silent fallback\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exit(1);\n }\n\n const providerOptions = args.provider\n ? { providerOverride: args.provider, providerDefinitions }\n : { providerDefinitions };\n const providerSettings = readProviderSettings(cwd, providerOptions);\n const modelId = args.model ?? providerSettings.model;\n const provider = createProviderFromSettings(cwd, args.model, providerOptions);\n const backgroundTaskRunners = createDefaultBackgroundTaskRunners();\n const paths = projectPaths(cwd);\n const subagentRunnerFactory = createChildProcessSubagentRunnerFactory({\n workerPath: getDefaultSubagentWorkerPath(),\n providerConfig: { ...providerSettings, model: modelId },\n logsDir: paths.logs,\n });\n\n const sessionStore = createProjectSessionStore(cwd);\n let resumeSessionId: string | undefined;\n let showSessionPickerOnStart = false;\n\n if (args.continueMode) {\n resumeSessionId = resolveLatestSessionId(sessionStore, cwd);\n } else if (args.resumeId !== undefined) {\n if (args.resumeId === '') {\n showSessionPickerOnStart = true;\n } else {\n resumeSessionId = resolveSessionIdByIdOrName(sessionStore, args.resumeId);\n if (resumeSessionId === undefined) {\n process.stderr.write(`Session not found: ${args.resumeId}\\n`);\n process.exit(1);\n }\n }\n }\n\n if (args.printMode) {\n await runPrintMode(\n cwd,\n args,\n provider,\n sessionStore,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n );\n return;\n }\n\n await renderApp({\n cwd,\n provider,\n providerOverride: args.provider,\n providerType: providerSettings.name,\n modelId,\n language: args.language,\n permissionMode: args.permissionMode,\n maxTurns: args.maxTurns,\n version,\n sessionStore: args.noSessionPersistence ? undefined : sessionStore,\n resumeSessionId,\n showSessionPickerOnStart,\n forkSession: args.forkSession,\n sessionName: args.sessionName,\n backgroundTaskRunners,\n subagentRunnerFactory,\n commandModules,\n commandHostAdapters,\n shellExec: (command: string) =>\n execSync(command, { timeout: 5000, encoding: 'utf-8', stdio: 'pipe' }).trimEnd(),\n startupUpdateNotice: startupUpdateNoticePromise\n ? startupUpdateNoticePromise.then((n) => (n ? formatCliUpdateNotice(n) : undefined))\n : undefined,\n transportRegistry: createDefaultTransportRegistry(),\n cliAdapter: createDefaultTuiCliAdapter({ providerDefinitions, reloadPluginCommandSource }),\n reloadPluginCommandSource,\n agentName: 'robota-cli',\n });\n process.exit(0);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
let e=require(`@robota-sdk/agent-transport/headless`),t=require(`node:fs`),n=require(`node:path`);const r={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function i(e){let r=(0,n.join)(e,`settings.json`);if(!(0,t.existsSync)(r))return{};let i=(0,t.readFileSync)(r,`utf8`);return JSON.parse(i)}async function a(t){let n=await(0,e.promptInput)(`${t} [y/N] `);return n.toLowerCase()===`y`||n.toLowerCase()===`yes`}async function o(e,o){o.writeLine(``),o.writeLine(`Robota project initialization`),o.writeLine(`─`.repeat(40));let s=(0,n.join)(e,`.robota`),c=(0,n.join)(s,`settings.json`),l=(0,n.join)(e,`AGENTS.md`),u=(0,n.join)(e,`.claude`),d=(0,t.existsSync)(u),f=(0,t.existsSync)(c),p=(0,t.existsSync)(l);if(f&&p&&(o.writeLine(``),o.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await a(`Overwrite existing files?`))){o.writeLine(`Init cancelled.`);return}let m={...r};if(d&&(o.writeLine(``),o.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await a(`Migrate Claude Code settings to .robota/?`))){let e=i(u),t=e.permissions;m={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...r.permissions.allow,...t?.allow??[]],deny:t?.deny??[]}},o.writeLine(`Settings imported from .claude/settings.json.`)}(0,t.mkdirSync)(s,{recursive:!0}),(0,t.writeFileSync)(c,JSON.stringify(m,null,2)+`
|
|
2
|
+
`,`utf8`),o.writeLine(``),o.writeLine(`Created: .robota/settings.json`),(0,t.writeFileSync)(l,`# AGENTS.md — Project Agent Guidelines
|
|
3
|
+
|
|
4
|
+
This file guides the AI agent working in this project. Customize it for your project.
|
|
5
|
+
|
|
6
|
+
## Project Overview
|
|
7
|
+
|
|
8
|
+
<!-- Describe your project's purpose, tech stack, and key conventions -->
|
|
9
|
+
|
|
10
|
+
## Common Commands
|
|
11
|
+
|
|
12
|
+
\`\`\`bash
|
|
13
|
+
# Install dependencies
|
|
14
|
+
npm install
|
|
15
|
+
|
|
16
|
+
# Run tests
|
|
17
|
+
npm test
|
|
18
|
+
|
|
19
|
+
# Build
|
|
20
|
+
npm run build
|
|
21
|
+
\`\`\`
|
|
22
|
+
|
|
23
|
+
## Coding Conventions
|
|
24
|
+
|
|
25
|
+
- Language: <!-- e.g. TypeScript strict mode -->
|
|
26
|
+
- Test framework: <!-- e.g. Vitest, Jest -->
|
|
27
|
+
- Linting: <!-- e.g. ESLint with prettier -->
|
|
28
|
+
|
|
29
|
+
## Important Notes
|
|
30
|
+
|
|
31
|
+
<!-- Anything the agent should know before making changes -->
|
|
32
|
+
`,`utf8`),o.writeLine(`Created: AGENTS.md`),o.writeLine(``),o.writeLine(`Initialization complete.`),o.writeLine(``),o.writeLine(`Next steps:`),o.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),o.writeLine(" 2. Run `robota --configure` to set up your AI provider"),o.writeLine(" 3. Run `robota` to start the assistant"),o.writeLine(``)}exports.runInitCommand=o;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import{promptInput as e}from"@robota-sdk/agent-transport/headless";import{existsSync as t,mkdirSync as n,readFileSync as r,writeFileSync as i}from"node:fs";import{join as a}from"node:path";const o={permissions:{allow:[`Read(.robota/**)`,`Read(.claude/**)`,`Read(.agents/**)`],deny:[]}};function s(e){let n=a(e,`settings.json`);if(!t(n))return{};let i=r(n,`utf8`);return JSON.parse(i)}async function c(t){let n=await e(`${t} [y/N] `);return n.toLowerCase()===`y`||n.toLowerCase()===`yes`}async function l(e,r){r.writeLine(``),r.writeLine(`Robota project initialization`),r.writeLine(`─`.repeat(40));let l=a(e,`.robota`),u=a(l,`settings.json`),d=a(e,`AGENTS.md`),f=a(e,`.claude`),p=t(f),m=t(u),h=t(d);if(m&&h&&(r.writeLine(``),r.writeLine(`Both AGENTS.md and .robota/settings.json already exist.`),!await c(`Overwrite existing files?`))){r.writeLine(`Init cancelled.`);return}let g={...o};if(p&&(r.writeLine(``),r.writeLine(`Detected .claude/ directory (Claude Code configuration).`),await c(`Migrate Claude Code settings to .robota/?`))){let e=s(f),t=e.permissions;g={...e,permissions:{...typeof e.permissions==`object`&&e.permissions!==null?e.permissions:{},allow:[...o.permissions.allow,...t?.allow??[]],deny:t?.deny??[]}},r.writeLine(`Settings imported from .claude/settings.json.`)}n(l,{recursive:!0}),i(u,JSON.stringify(g,null,2)+`
|
|
2
|
+
`,`utf8`),r.writeLine(``),r.writeLine(`Created: .robota/settings.json`),i(d,`# AGENTS.md — Project Agent Guidelines
|
|
3
|
+
|
|
4
|
+
This file guides the AI agent working in this project. Customize it for your project.
|
|
5
|
+
|
|
6
|
+
## Project Overview
|
|
7
|
+
|
|
8
|
+
<!-- Describe your project's purpose, tech stack, and key conventions -->
|
|
9
|
+
|
|
10
|
+
## Common Commands
|
|
11
|
+
|
|
12
|
+
\`\`\`bash
|
|
13
|
+
# Install dependencies
|
|
14
|
+
npm install
|
|
15
|
+
|
|
16
|
+
# Run tests
|
|
17
|
+
npm test
|
|
18
|
+
|
|
19
|
+
# Build
|
|
20
|
+
npm run build
|
|
21
|
+
\`\`\`
|
|
22
|
+
|
|
23
|
+
## Coding Conventions
|
|
24
|
+
|
|
25
|
+
- Language: <!-- e.g. TypeScript strict mode -->
|
|
26
|
+
- Test framework: <!-- e.g. Vitest, Jest -->
|
|
27
|
+
- Linting: <!-- e.g. ESLint with prettier -->
|
|
28
|
+
|
|
29
|
+
## Important Notes
|
|
30
|
+
|
|
31
|
+
<!-- Anything the agent should know before making changes -->
|
|
32
|
+
`,`utf8`),r.writeLine(`Created: AGENTS.md`),r.writeLine(``),r.writeLine(`Initialization complete.`),r.writeLine(``),r.writeLine(`Next steps:`),r.writeLine(` 1. Edit AGENTS.md to describe your project conventions`),r.writeLine(" 2. Run `robota --configure` to set up your AI provider"),r.writeLine(" 3. Run `robota` to start the assistant"),r.writeLine(``)}export{l as runInitCommand};
|
|
33
|
+
//# sourceMappingURL=init-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-command.js","names":[],"sources":["../../../src/init/init-command.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { promptInput } from '@robota-sdk/agent-transport/headless';\n\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\n\nconst AGENTS_MD_TEMPLATE = `# AGENTS.md — Project Agent Guidelines\n\nThis file guides the AI agent working in this project. Customize it for your project.\n\n## Project Overview\n\n<!-- Describe your project's purpose, tech stack, and key conventions -->\n\n## Common Commands\n\n\\`\\`\\`bash\n# Install dependencies\nnpm install\n\n# Run tests\nnpm test\n\n# Build\nnpm run build\n\\`\\`\\`\n\n## Coding Conventions\n\n- Language: <!-- e.g. TypeScript strict mode -->\n- Test framework: <!-- e.g. Vitest, Jest -->\n- Linting: <!-- e.g. ESLint with prettier -->\n\n## Important Notes\n\n<!-- Anything the agent should know before making changes -->\n`;\n\nconst SETTINGS_TEMPLATE = {\n permissions: {\n allow: ['Read(.robota/**)', 'Read(.claude/**)', 'Read(.agents/**)'],\n deny: [],\n },\n};\n\nfunction readClaudeSettings(claudeDir: string): Record<string, unknown> {\n const settingsPath = join(claudeDir, 'settings.json');\n if (!existsSync(settingsPath)) return {};\n const raw = readFileSync(settingsPath, 'utf8');\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nasync function askYesNo(question: string): Promise<boolean> {\n const answer = await promptInput(`${question} [y/N] `);\n return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n}\n\nexport async function runInitCommand(cwd: string, terminal: ITerminalOutput): Promise<void> {\n terminal.writeLine('');\n terminal.writeLine('Robota project initialization');\n terminal.writeLine('─'.repeat(40));\n\n const robotaDir = join(cwd, '.robota');\n const settingsPath = join(robotaDir, 'settings.json');\n const agentsMdPath = join(cwd, 'AGENTS.md');\n const claudeDir = join(cwd, '.claude');\n const hasClaudeDir = existsSync(claudeDir);\n\n const hasSettings = existsSync(settingsPath);\n const hasAgentsMd = existsSync(agentsMdPath);\n\n if (hasSettings && hasAgentsMd) {\n terminal.writeLine('');\n terminal.writeLine('Both AGENTS.md and .robota/settings.json already exist.');\n const overwrite = await askYesNo('Overwrite existing files?');\n if (!overwrite) {\n terminal.writeLine('Init cancelled.');\n return;\n }\n }\n\n let settingsData: Record<string, unknown> = { ...SETTINGS_TEMPLATE };\n\n if (hasClaudeDir) {\n terminal.writeLine('');\n terminal.writeLine('Detected .claude/ directory (Claude Code configuration).');\n const migrate = await askYesNo('Migrate Claude Code settings to .robota/?');\n if (migrate) {\n const claudeSettings = readClaudeSettings(claudeDir);\n const claudePerms = claudeSettings.permissions as\n | { allow?: string[]; deny?: string[] }\n | undefined;\n settingsData = {\n ...claudeSettings,\n permissions: {\n ...(typeof claudeSettings.permissions === 'object' && claudeSettings.permissions !== null\n ? (claudeSettings.permissions as Record<string, unknown>)\n : {}),\n allow: [...SETTINGS_TEMPLATE.permissions.allow, ...(claudePerms?.allow ?? [])],\n deny: claudePerms?.deny ?? [],\n },\n };\n terminal.writeLine('Settings imported from .claude/settings.json.');\n }\n }\n\n mkdirSync(robotaDir, { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(settingsData, null, 2) + '\\n', 'utf8');\n terminal.writeLine('');\n terminal.writeLine('Created: .robota/settings.json');\n\n writeFileSync(agentsMdPath, AGENTS_MD_TEMPLATE, 'utf8');\n terminal.writeLine('Created: AGENTS.md');\n\n terminal.writeLine('');\n terminal.writeLine('Initialization complete.');\n terminal.writeLine('');\n terminal.writeLine('Next steps:');\n terminal.writeLine(' 1. Edit AGENTS.md to describe your project conventions');\n terminal.writeLine(' 2. Run `robota --configure` to set up your AI provider');\n terminal.writeLine(' 3. Run `robota` to start the assistant');\n terminal.writeLine('');\n}\n"],"mappings":"6LAOA,MAgCM,EAAoB,CACxB,YAAa,CACX,MAAO,CAAC,mBAAoB,mBAAoB,kBAAkB,EAClE,KAAM,CAAC,CACT,CACF,EAEA,SAAS,EAAmB,EAA4C,CACtE,IAAM,EAAe,EAAK,EAAW,eAAe,EACpD,GAAI,CAAC,EAAW,CAAY,EAAG,MAAO,CAAC,EACvC,IAAM,EAAM,EAAa,EAAc,MAAM,EAC7C,OAAO,KAAK,MAAM,CAAG,CACvB,CAEA,eAAe,EAAS,EAAoC,CAC1D,IAAM,EAAS,MAAM,EAAY,GAAG,EAAS,QAAQ,EACrD,OAAO,EAAO,YAAY,IAAM,KAAO,EAAO,YAAY,IAAM,KAClE,CAEA,eAAsB,EAAe,EAAa,EAA0C,CAC1F,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,+BAA+B,EAClD,EAAS,UAAU,IAAI,OAAO,EAAE,CAAC,EAEjC,IAAM,EAAY,EAAK,EAAK,SAAS,EAC/B,EAAe,EAAK,EAAW,eAAe,EAC9C,EAAe,EAAK,EAAK,WAAW,EACpC,EAAY,EAAK,EAAK,SAAS,EAC/B,EAAe,EAAW,CAAS,EAEnC,EAAc,EAAW,CAAY,EACrC,EAAc,EAAW,CAAY,EAE3C,GAAI,GAAe,IACjB,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,yDAAyD,EAExE,CAAC,MADmB,EAAS,2BAA2B,GAC5C,CACd,EAAS,UAAU,iBAAiB,EACpC,MACF,CAGF,IAAI,EAAwC,CAAE,GAAG,CAAkB,EAEnE,GAAI,IACF,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,0DAA0D,EAEzE,MADkB,EAAS,2CAA2C,GAC7D,CACX,IAAM,EAAiB,EAAmB,CAAS,EAC7C,EAAc,EAAe,YAGnC,EAAe,CACb,GAAG,EACH,YAAa,CACX,GAAI,OAAO,EAAe,aAAgB,UAAY,EAAe,cAAgB,KAChF,EAAe,YAChB,CAAC,EACL,MAAO,CAAC,GAAG,EAAkB,YAAY,MAAO,GAAI,GAAa,OAAS,CAAC,CAAE,EAC7E,KAAM,GAAa,MAAQ,CAAC,CAC9B,CACF,EACA,EAAS,UAAU,+CAA+C,CACpE,CAGF,EAAU,EAAW,CAAE,UAAW,EAAK,CAAC,EACxC,EAAc,EAAc,KAAK,UAAU,EAAc,KAAM,CAAC,EAAI;EAAM,MAAM,EAChF,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,gCAAgC,EAEnD,EAAc,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAoB,MAAM,EACtD,EAAS,UAAU,oBAAoB,EAEvC,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,0BAA0B,EAC7C,EAAS,UAAU,EAAE,EACrB,EAAS,UAAU,aAAa,EAChC,EAAS,UAAU,0DAA0D,EAC7E,EAAS,UAAU,0DAA0D,EAC7E,EAAS,UAAU,0CAA0C,EAC7D,EAAS,UAAU,EAAE,CACvB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const e=require(`../startup/append-system-prompt.cjs`),t=require(`../constants.cjs`),n=require(`./shell-exec.cjs`);let r=require(`@robota-sdk/agent-transport/headless`);async function i(e){let t=e.positional.join(` `).trim();if(!t&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);t=Buffer.concat(e).toString(`utf-8`).trim()}return t||(process.stderr.write(`Print mode (-p) requires a prompt argument.
|
|
2
|
+
`),process.exit(1)),t}async function a(a,o){let s=await i(a);a.dryRun&&process.stdout.write(`DRY RUN — plan mode enabled. No files will be modified.
|
|
3
|
+
|
|
4
|
+
`);let c=[];a.dryRun&&c.push(`You are in dry-run (plan) mode. Analyze the request and describe step by step what you would do, without executing any write or edit operations. Format your response as a numbered action plan.`);let l=e.buildAppendSystemPrompt(o.cwd,a);l&&c.push(l);let u=c.length>0?c.join(`
|
|
5
|
+
|
|
6
|
+
`):void 0,d=n.createShellExec(),f=o.createSession({permissionMode:a.permissionMode??`bypassPermissions`,maxTurns:a.maxTurns,sessionStore:a.noSessionPersistence?void 0:o.sessionStore,sessionName:a.sessionName,bare:a.bare||void 0,allowedTools:a.allowedTools?a.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:u,systemPrompt:a.systemPrompt,shellExec:d,agentName:t.AGENT_CLI_NAME}),p=(0,r.createHeadlessTransport)({outputFormat:a.outputFormat??`text`,prompt:s});f.attachTransport(p),await p.start(),await f.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(p.getExitCode())}exports.runPrintMode=a;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{buildAppendSystemPrompt as e}from"../startup/append-system-prompt.js";import{AGENT_CLI_NAME as t}from"../constants.js";import{createShellExec as n}from"./shell-exec.js";import{createHeadlessTransport as r}from"@robota-sdk/agent-transport/headless";async function i(e){let t=e.positional.join(` `).trim();if(!t&&!process.stdin.isTTY){let e=[];for await(let t of process.stdin)e.push(t);t=Buffer.concat(e).toString(`utf-8`).trim()}return t||(process.stderr.write(`Print mode (-p) requires a prompt argument.
|
|
2
|
+
`),process.exit(1)),t}async function a(a,o){let s=await i(a);a.dryRun&&process.stdout.write(`DRY RUN — plan mode enabled. No files will be modified.
|
|
3
|
+
|
|
4
|
+
`);let c=[];a.dryRun&&c.push(`You are in dry-run (plan) mode. Analyze the request and describe step by step what you would do, without executing any write or edit operations. Format your response as a numbered action plan.`);let l=e(o.cwd,a);l&&c.push(l);let u=c.length>0?c.join(`
|
|
5
|
+
|
|
6
|
+
`):void 0,d=n(),f=o.createSession({permissionMode:a.permissionMode??`bypassPermissions`,maxTurns:a.maxTurns,sessionStore:a.noSessionPersistence?void 0:o.sessionStore,sessionName:a.sessionName,bare:a.bare||void 0,allowedTools:a.allowedTools?a.allowedTools.split(`,`).map(e=>e.trim()).filter(e=>e.length>0):void 0,appendSystemPrompt:u,systemPrompt:a.systemPrompt,shellExec:d,agentName:t}),p=r({outputFormat:a.outputFormat??`text`,prompt:s});f.attachTransport(p),await p.start(),await f.shutdown({reason:`prompt_input_exit`,message:`Headless transport complete`}),process.exit(p.getExitCode())}export{a as runPrintMode};
|
|
7
|
+
//# sourceMappingURL=print-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-mode.js","names":[],"sources":["../../../src/modes/print-mode.ts"],"sourcesContent":["import { createHeadlessTransport } from '@robota-sdk/agent-transport/headless';\n\nimport { buildAppendSystemPrompt } from '../startup/append-system-prompt.js';\nimport { AGENT_CLI_NAME } from '../constants.js';\nimport { createShellExec } from './shell-exec.js';\n\nimport type { ISessionRunOptions } from '../startup/args-to-options.js';\nimport type { IAgentRuntime } from '@robota-sdk/agent-framework';\n\nasync function resolvePrompt(opts: ISessionRunOptions): Promise<string> {\n let prompt = opts.positional.join(' ').trim();\n\n if (!prompt && !process.stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n prompt = Buffer.concat(chunks).toString('utf-8').trim();\n }\n\n if (!prompt) {\n process.stderr.write('Print mode (-p) requires a prompt argument.\\n');\n process.exit(1);\n }\n\n return prompt;\n}\n\nconst DRY_RUN_SYSTEM_PROMPT =\n 'You are in dry-run (plan) mode. Analyze the request and describe step by step what you would do, without executing any write or edit operations. Format your response as a numbered action plan.';\n\nexport async function runPrintMode(\n opts: ISessionRunOptions,\n runtime: IAgentRuntime,\n): Promise<void> {\n const prompt = await resolvePrompt(opts);\n\n if (opts.dryRun) {\n process.stdout.write('DRY RUN — plan mode enabled. No files will be modified.\\n\\n');\n }\n\n const appendSystemPromptParts: string[] = [];\n if (opts.dryRun) appendSystemPromptParts.push(DRY_RUN_SYSTEM_PROMPT);\n const baseAppend = buildAppendSystemPrompt(runtime.cwd, opts);\n if (baseAppend) appendSystemPromptParts.push(baseAppend);\n const appendSystemPrompt =\n appendSystemPromptParts.length > 0 ? appendSystemPromptParts.join('\\n\\n') : undefined;\n const shellExec = createShellExec();\n\n const session = runtime.createSession({\n permissionMode: opts.permissionMode ?? 'bypassPermissions',\n maxTurns: opts.maxTurns,\n sessionStore: opts.noSessionPersistence ? undefined : runtime.sessionStore,\n sessionName: opts.sessionName,\n bare: opts.bare || undefined,\n allowedTools: opts.allowedTools\n ? opts.allowedTools\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n appendSystemPrompt,\n systemPrompt: opts.systemPrompt,\n shellExec,\n agentName: AGENT_CLI_NAME,\n });\n\n const transport = createHeadlessTransport({\n outputFormat: opts.outputFormat ?? 'text',\n prompt,\n });\n session.attachTransport(transport);\n await transport.start();\n await session.shutdown({ reason: 'prompt_input_exit', message: 'Headless transport complete' });\n process.exit(transport.getExitCode());\n}\n"],"mappings":"+PASA,eAAe,EAAc,EAA2C,CACtE,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,CAOA,OALK,IACH,QAAQ,OAAO,MAAM;CAA+C,EACpE,QAAQ,KAAK,CAAC,GAGT,CACT,CAKA,eAAsB,EACpB,EACA,EACe,CACf,IAAM,EAAS,MAAM,EAAc,CAAI,EAEnC,EAAK,QACP,QAAQ,OAAO,MAAM;;CAA6D,EAGpF,IAAM,EAAoC,CAAC,EACvC,EAAK,QAAQ,EAAwB,KAAK,kMAAqB,EACnE,IAAM,EAAa,EAAwB,EAAQ,IAAK,CAAI,EACxD,GAAY,EAAwB,KAAK,CAAU,EACvD,IAAM,EACJ,EAAwB,OAAS,EAAI,EAAwB,KAAK;;CAAM,EAAI,IAAA,GACxE,EAAY,EAAgB,EAE5B,EAAU,EAAQ,cAAc,CACpC,eAAgB,EAAK,gBAAkB,oBACvC,SAAU,EAAK,SACf,aAAc,EAAK,qBAAuB,IAAA,GAAY,EAAQ,aAC9D,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,aAAc,EAAK,aACnB,YACA,UAAW,CACb,CAAC,EAEK,EAAY,EAAwB,CACxC,aAAc,EAAK,cAAgB,OACnC,QACF,CAAC,EACD,EAAQ,gBAAgB,CAAS,EACjC,MAAM,EAAU,MAAM,EACtB,MAAM,EAAQ,SAAS,CAAE,OAAQ,oBAAqB,QAAS,6BAA8B,CAAC,EAC9F,QAAQ,KAAK,EAAU,YAAY,CAAC,CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require(`node:child_process`);function t(){return t=>(0,e.execSync)(t,{timeout:5e3,encoding:`utf-8`,stdio:`pipe`}).trimEnd()}exports.createShellExec=t;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-exec.js","names":[],"sources":["../../../src/modes/shell-exec.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\n\nexport const SHELL_EXEC_TIMEOUT_MS = 5_000;\n\nexport function createShellExec(): (command: string) => string {\n return (command: string): string =>\n execSync(command, {\n timeout: SHELL_EXEC_TIMEOUT_MS,\n encoding: 'utf-8',\n stdio: 'pipe',\n }).trimEnd();\n}\n"],"mappings":"8CAIA,SAAgB,GAA+C,CAC7D,MAAQ,IACN,EAAS,EAAS,CAChB,QAAS,IACT,SAAU,QACV,MAAO,MACT,CAAC,EAAE,QAAQ,CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`../constants.cjs`),t=require(`./shell-exec.cjs`);let n=require(`@robota-sdk/agent-transport/tui`);async function r(r){let{runtime:i,version:a,commandSetup:o,providerSetup:s,sessionSetup:c,sessionOpts:l,startupUpdateNotice:u}=r;await new n.TuiTransport({runtime:i,providerOverride:s.activeProfileName,providerType:s.providerSettings.name,modelId:s.modelId,language:l.language,permissionMode:l.permissionMode,maxTurns:l.maxTurns,version:a,resumeSessionId:c.resumeSessionId,showSessionPickerOnStart:c.showSessionPickerOnStart,forkSession:l.forkSession,sessionName:l.sessionName,shellExec:t.createShellExec(),startupUpdateNotice:u,cliAdapter:(0,n.createDefaultTuiCliAdapter)({providerDefinitions:o.providerDefinitions,reloadPluginCommandSource:o.reloadPluginCommandSource}),agentName:e.AGENT_CLI_NAME}).start()}exports.runTuiMode=r;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AGENT_CLI_NAME as e}from"../constants.js";import{createShellExec as t}from"./shell-exec.js";import{TuiTransport as n,createDefaultTuiCliAdapter as r}from"@robota-sdk/agent-transport/tui";async function i(i){let{runtime:a,version:o,commandSetup:s,providerSetup:c,sessionSetup:l,sessionOpts:u,startupUpdateNotice:d}=i;await new n({runtime:a,providerOverride:c.activeProfileName,providerType:c.providerSettings.name,modelId:c.modelId,language:u.language,permissionMode:u.permissionMode,maxTurns:u.maxTurns,version:o,resumeSessionId:l.resumeSessionId,showSessionPickerOnStart:l.showSessionPickerOnStart,forkSession:u.forkSession,sessionName:u.sessionName,shellExec:t(),startupUpdateNotice:d,cliAdapter:r({providerDefinitions:s.providerDefinitions,reloadPluginCommandSource:s.reloadPluginCommandSource}),agentName:e}).start()}export{i as runTuiMode};
|
|
2
|
+
//# sourceMappingURL=tui-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-mode.js","names":[],"sources":["../../../src/modes/tui-mode.ts"],"sourcesContent":["import { TuiTransport, createDefaultTuiCliAdapter } from '@robota-sdk/agent-transport/tui';\n\nimport type { ISessionRunOptions } from '../startup/args-to-options.js';\nimport type { ICommandSetup } from '../startup/command-setup.js';\nimport type { IProviderSetup } from '../startup/provider-setup.js';\nimport type { ISessionSetup } from '../startup/session-setup.js';\nimport type { IAgentRuntime } from '@robota-sdk/agent-framework';\nimport { AGENT_CLI_NAME } from '../constants.js';\nimport { createShellExec } from './shell-exec.js';\n\nexport interface ITuiModeOptions {\n runtime: IAgentRuntime;\n version: string;\n commandSetup: ICommandSetup;\n providerSetup: IProviderSetup;\n sessionSetup: ISessionSetup;\n sessionOpts: ISessionRunOptions;\n startupUpdateNotice: Promise<string | undefined> | undefined;\n}\n\nexport async function runTuiMode(opts: ITuiModeOptions): Promise<void> {\n const {\n runtime,\n version,\n commandSetup,\n providerSetup,\n sessionSetup,\n sessionOpts,\n startupUpdateNotice,\n } = opts;\n\n const tuiTransport = new TuiTransport({\n runtime,\n providerOverride: providerSetup.activeProfileName,\n providerType: providerSetup.providerSettings.name,\n modelId: providerSetup.modelId,\n language: sessionOpts.language,\n permissionMode: sessionOpts.permissionMode,\n maxTurns: sessionOpts.maxTurns,\n version,\n resumeSessionId: sessionSetup.resumeSessionId,\n showSessionPickerOnStart: sessionSetup.showSessionPickerOnStart,\n forkSession: sessionOpts.forkSession,\n sessionName: sessionOpts.sessionName,\n shellExec: createShellExec(),\n startupUpdateNotice,\n cliAdapter: createDefaultTuiCliAdapter({\n providerDefinitions: commandSetup.providerDefinitions,\n reloadPluginCommandSource: commandSetup.reloadPluginCommandSource,\n }),\n agentName: AGENT_CLI_NAME,\n });\n\n await tuiTransport.start();\n}\n"],"mappings":"kMAoBA,eAAsB,EAAW,EAAsC,CACrE,GAAM,CACJ,UACA,UACA,eACA,gBACA,eACA,cACA,uBACE,EAwBJ,MAAM,IAtBmB,EAAa,CACpC,UACA,iBAAkB,EAAc,kBAChC,aAAc,EAAc,iBAAiB,KAC7C,QAAS,EAAc,QACvB,SAAU,EAAY,SACtB,eAAgB,EAAY,eAC5B,SAAU,EAAY,SACtB,UACA,gBAAiB,EAAa,gBAC9B,yBAA0B,EAAa,yBACvC,YAAa,EAAY,YACzB,YAAa,EAAY,YACzB,UAAW,EAAgB,EAC3B,sBACA,WAAY,EAA2B,CACrC,oBAAqB,EAAa,oBAClC,0BAA2B,EAAa,yBAC1C,CAAC,EACD,UAAW,CACb,CAEiB,EAAE,MAAM,CAC3B"}
|
|
@@ -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()];export{o as t};
|
|
2
|
+
//# sourceMappingURL=provider-default-definitions-CKtxv2k0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-default-definitions-CKtxv2k0.js","names":[],"sources":["../../src/utils/provider-default-definitions.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"],"mappings":"sfAQA,MAAa,EAA+D,CAC1E,EAAkC,EAClC,EAA+B,EAC/B,EAA+B,EAC/B,EAA8B,EAC9B,EAA6B,EAC7B,EAAiC,CACnC"}
|
|
@@ -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)()];Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`./index.cjs`);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)()];Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
let e=require(`node:fs`),t=require(`node:path`);function n(n,r){let i=(0,e.readFileSync)((0,t.resolve)(n,r),`utf8`).trim();if(i.length===0)throw Error(`Task file is empty: ${r}`);return`Task file (${r}):\n${i}`}function r(e,t){let r=[];return t.appendSystemPrompt&&r.push(t.appendSystemPrompt),t.taskFile&&r.push(n(e,t.taskFile)),t.jsonSchema&&r.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),r.length>0?r.join(`
|
|
2
|
+
|
|
3
|
+
`):void 0}exports.buildAppendSystemPrompt=r;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{readFileSync as e}from"node:fs";import{resolve as t}from"node:path";function n(n,r){let i=e(t(n,r),`utf8`).trim();if(i.length===0)throw Error(`Task file is empty: ${r}`);return`Task file (${r}):\n${i}`}function r(e,t){let r=[];return t.appendSystemPrompt&&r.push(t.appendSystemPrompt),t.taskFile&&r.push(n(e,t.taskFile)),t.jsonSchema&&r.push(`Respond with valid JSON only, matching this JSON schema:\n${t.jsonSchema}`),r.length>0?r.join(`
|
|
2
|
+
|
|
3
|
+
`):void 0}export{r as buildAppendSystemPrompt};
|
|
4
|
+
//# sourceMappingURL=append-system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"append-system-prompt.js","names":[],"sources":["../../../src/startup/append-system-prompt.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport interface IAppendSystemPromptOptions {\n appendSystemPrompt?: string;\n taskFile?: string;\n jsonSchema?: string;\n}\n\nfunction readTaskFilePrompt(cwd: string, taskFile: string): string {\n const taskPath = resolve(cwd, taskFile);\n const content = readFileSync(taskPath, 'utf8').trim();\n if (content.length === 0) {\n throw new Error(`Task file is empty: ${taskFile}`);\n }\n return `Task file (${taskFile}):\\n${content}`;\n}\n\nexport function buildAppendSystemPrompt(\n cwd: string,\n opts: IAppendSystemPromptOptions,\n): string | undefined {\n const appendParts: string[] = [];\n if (opts.appendSystemPrompt) appendParts.push(opts.appendSystemPrompt);\n if (opts.taskFile) {\n appendParts.push(readTaskFilePrompt(cwd, opts.taskFile));\n }\n if (opts.jsonSchema)\n appendParts.push(\n `Respond with valid JSON only, matching this JSON schema:\\n${opts.jsonSchema}`,\n );\n return appendParts.length > 0 ? appendParts.join('\\n\\n') : undefined;\n}\n"],"mappings":"2EASA,SAAS,EAAmB,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,EACd,EACA,EACoB,CACpB,IAAM,EAAwB,CAAC,EAS/B,OARI,EAAK,oBAAoB,EAAY,KAAK,EAAK,kBAAkB,EACjE,EAAK,UACP,EAAY,KAAK,EAAmB,EAAK,EAAK,QAAQ,CAAC,EAErD,EAAK,YACP,EAAY,KACV,6DAA6D,EAAK,YACpE,EACK,EAAY,OAAS,EAAI,EAAY,KAAK;;CAAM,EAAI,IAAA,EAC7D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){return{configure:e.configure,provider:e.provider,settingsScope:e.settingsScope,configureProvider:e.configureProvider,providerType:e.providerType,model:e.model,apiKey:e.apiKey,apiKeyEnv:e.apiKeyEnv,baseURL:e.baseURL,setCurrent:e.setCurrent,printMode:e.printMode||e.dryRun,positional:e.positional}}function t(e){return{positional:e.positional,language:e.language,permissionMode:e.dryRun?`plan`:e.permissionMode,maxTurns:e.maxTurns,sessionName:e.sessionName,noSessionPersistence:e.noSessionPersistence,continueMode:e.continueMode,resumeId:e.resumeId,forkSession:e.forkSession,outputFormat:e.outputFormat,bare:e.bare,allowedTools:e.allowedTools,systemPrompt:e.systemPrompt,appendSystemPrompt:e.appendSystemPrompt,taskFile:e.taskFile,jsonSchema:e.jsonSchema,dryRun:e.dryRun}}function n(e){return{positional:e.positional,format:e.format,summary:e.summary,source:e.source}}function r(e){return{printMode:e.printMode,disableUpdateCheck:e.disableUpdateCheck}}exports.toConfigPhaseOptions=e,exports.toSessionRunOptions=t,exports.toStartupUpdatePolicyOptions=r,exports.toUserLocalCommandOptions=n;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return{configure:e.configure,provider:e.provider,settingsScope:e.settingsScope,configureProvider:e.configureProvider,providerType:e.providerType,model:e.model,apiKey:e.apiKey,apiKeyEnv:e.apiKeyEnv,baseURL:e.baseURL,setCurrent:e.setCurrent,printMode:e.printMode||e.dryRun,positional:e.positional}}function t(e){return{positional:e.positional,language:e.language,permissionMode:e.dryRun?`plan`:e.permissionMode,maxTurns:e.maxTurns,sessionName:e.sessionName,noSessionPersistence:e.noSessionPersistence,continueMode:e.continueMode,resumeId:e.resumeId,forkSession:e.forkSession,outputFormat:e.outputFormat,bare:e.bare,allowedTools:e.allowedTools,systemPrompt:e.systemPrompt,appendSystemPrompt:e.appendSystemPrompt,taskFile:e.taskFile,jsonSchema:e.jsonSchema,dryRun:e.dryRun}}function n(e){return{positional:e.positional,format:e.format,summary:e.summary,source:e.source}}function r(e){return{printMode:e.printMode,disableUpdateCheck:e.disableUpdateCheck}}export{e as toConfigPhaseOptions,t as toSessionRunOptions,r as toStartupUpdatePolicyOptions,n as toUserLocalCommandOptions};
|
|
2
|
+
//# sourceMappingURL=args-to-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args-to-options.js","names":[],"sources":["../../../src/startup/args-to-options.ts"],"sourcesContent":["import type { IParsedCliArgs, TOutputFormat } from '../utils/cli-args.js';\nimport type { TPermissionMode } from '@robota-sdk/agent-core';\n\nexport interface IConfigPhaseOptions {\n configure: boolean;\n provider?: string;\n settingsScope?: string;\n configureProvider?: string;\n providerType?: string;\n model?: string;\n apiKey?: string;\n apiKeyEnv?: string;\n baseURL?: string;\n setCurrent: boolean;\n printMode: boolean;\n positional: readonly string[];\n}\n\nexport interface ISessionRunOptions {\n positional: readonly string[];\n language?: string;\n permissionMode?: TPermissionMode;\n maxTurns?: number;\n sessionName?: string;\n noSessionPersistence: boolean;\n continueMode: boolean;\n resumeId?: string;\n forkSession: boolean;\n outputFormat?: TOutputFormat;\n bare: boolean;\n allowedTools?: string;\n systemPrompt?: string;\n appendSystemPrompt?: string;\n taskFile?: string;\n jsonSchema?: string;\n dryRun: boolean;\n}\n\nexport interface IUserLocalCommandOptions {\n positional: readonly string[];\n format?: string;\n summary?: string;\n source?: string;\n}\n\nexport interface IStartupUpdatePolicyOptions {\n printMode: boolean;\n disableUpdateCheck: boolean;\n}\n\nexport function toConfigPhaseOptions(args: IParsedCliArgs): IConfigPhaseOptions {\n return {\n configure: args.configure,\n provider: args.provider,\n settingsScope: args.settingsScope,\n configureProvider: args.configureProvider,\n providerType: args.providerType,\n model: args.model,\n apiKey: args.apiKey,\n apiKeyEnv: args.apiKeyEnv,\n baseURL: args.baseURL,\n setCurrent: args.setCurrent,\n printMode: args.printMode || args.dryRun,\n positional: args.positional,\n };\n}\n\nexport function toSessionRunOptions(args: IParsedCliArgs): ISessionRunOptions {\n return {\n positional: args.positional,\n language: args.language,\n permissionMode: args.dryRun ? 'plan' : args.permissionMode,\n maxTurns: args.maxTurns,\n sessionName: args.sessionName,\n noSessionPersistence: args.noSessionPersistence,\n continueMode: args.continueMode,\n resumeId: args.resumeId,\n forkSession: args.forkSession,\n outputFormat: args.outputFormat,\n bare: args.bare,\n allowedTools: args.allowedTools,\n systemPrompt: args.systemPrompt,\n appendSystemPrompt: args.appendSystemPrompt,\n taskFile: args.taskFile,\n jsonSchema: args.jsonSchema,\n dryRun: args.dryRun,\n };\n}\n\nexport function toUserLocalCommandOptions(args: IParsedCliArgs): IUserLocalCommandOptions {\n return {\n positional: args.positional,\n format: args.format,\n summary: args.summary,\n source: args.source,\n };\n}\n\nexport function toStartupUpdatePolicyOptions(args: IParsedCliArgs): IStartupUpdatePolicyOptions {\n return {\n printMode: args.printMode,\n disableUpdateCheck: args.disableUpdateCheck,\n };\n}\n"],"mappings":"AAkDA,SAAgB,EAAqB,EAA2C,CAC9E,MAAO,CACL,UAAW,EAAK,UAChB,SAAU,EAAK,SACf,cAAe,EAAK,cACpB,kBAAmB,EAAK,kBACxB,aAAc,EAAK,aACnB,MAAO,EAAK,MACZ,OAAQ,EAAK,OACb,UAAW,EAAK,UAChB,QAAS,EAAK,QACd,WAAY,EAAK,WACjB,UAAW,EAAK,WAAa,EAAK,OAClC,WAAY,EAAK,UACnB,CACF,CAEA,SAAgB,EAAoB,EAA0C,CAC5E,MAAO,CACL,WAAY,EAAK,WACjB,SAAU,EAAK,SACf,eAAgB,EAAK,OAAS,OAAS,EAAK,eAC5C,SAAU,EAAK,SACf,YAAa,EAAK,YAClB,qBAAsB,EAAK,qBAC3B,aAAc,EAAK,aACnB,SAAU,EAAK,SACf,YAAa,EAAK,YAClB,aAAc,EAAK,aACnB,KAAM,EAAK,KACX,aAAc,EAAK,aACnB,aAAc,EAAK,aACnB,mBAAoB,EAAK,mBACzB,SAAU,EAAK,SACf,WAAY,EAAK,WACjB,OAAQ,EAAK,MACf,CACF,CAEA,SAAgB,EAA0B,EAAgD,CACxF,MAAO,CACL,WAAY,EAAK,WACjB,OAAQ,EAAK,OACb,QAAS,EAAK,QACd,OAAQ,EAAK,MACf,CACF,CAEA,SAAgB,EAA6B,EAAmD,CAC9F,MAAO,CACL,UAAW,EAAK,UAChB,mBAAoB,EAAK,kBAC3B,CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require(`@robota-sdk/agent-framework`),t=require(`@robota-sdk/agent-command`),n=require(`@robota-sdk/agent-provider`);function r(r,i={}){let a={settings:{read:()=>(0,e.readSettings)((0,e.getUserSettingsPath)()),write:t=>(0,e.writeSettings)((0,e.getUserSettingsPath)(),t)},plugin:(0,t.createDefaultPluginCommandAdapter)(r)},o=i.providerDefinitions??(0,n.createDefaultProviderDefinitions)();return{commandHostAdapters:a,providerDefinitions:o,commandModules:[...(0,t.createDefaultCommandModules)({cwd:r,providerDefinitions:o,providerSettingsAdapter:{readMergedSettings:()=>(0,e.readMergedProviderSettings)(r),readTargetSettings:()=>(0,e.readSettings)((0,e.resolveProviderSettingsWriteTargetPath)(r)),writeTargetSettings:t=>(0,e.writeSettings)((0,e.resolveProviderSettingsWriteTargetPath)(r),t)}}),...i.commandModules??[]],reloadPluginCommandSource:t.reloadPluginCommandSource}}exports.createCommandSetup=r;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ICommandModule } from "@robota-sdk/agent-framework";
|
|
2
|
+
import { IProviderDefinition } from "@robota-sdk/agent-core";
|
|
3
|
+
|
|
4
|
+
//#region src/startup/command-setup.d.ts
|
|
5
|
+
interface IStartCliOptions {
|
|
6
|
+
commandModules?: readonly ICommandModule[];
|
|
7
|
+
providerDefinitions?: readonly IProviderDefinition[];
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { IStartCliOptions };
|
|
11
|
+
//# sourceMappingURL=command-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-setup.d.ts","names":[],"sources":["../../../src/startup/command-setup.ts"],"mappings":";;;;UAqBiB,gBAAA;EACf,cAAA,YAA0B,cAAA;EAC1B,mBAAA,YAA+B,mBAAmB;AAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{getUserSettingsPath as e,readMergedProviderSettings as t,readSettings as n,resolveProviderSettingsWriteTargetPath as r,writeSettings as i}from"@robota-sdk/agent-framework";import{createDefaultCommandModules as a,createDefaultPluginCommandAdapter as o,reloadPluginCommandSource as s}from"@robota-sdk/agent-command";import{createDefaultProviderDefinitions as c}from"@robota-sdk/agent-provider";function l(l,u={}){let d={settings:{read:()=>n(e()),write:t=>i(e(),t)},plugin:o(l)},f=u.providerDefinitions??c();return{commandHostAdapters:d,providerDefinitions:f,commandModules:[...a({cwd:l,providerDefinitions:f,providerSettingsAdapter:{readMergedSettings:()=>t(l),readTargetSettings:()=>n(r(l)),writeTargetSettings:e=>i(r(l),e)}}),...u.commandModules??[]],reloadPluginCommandSource:s}}export{l as createCommandSetup};
|
|
2
|
+
//# sourceMappingURL=command-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-setup.js","names":[],"sources":["../../../src/startup/command-setup.ts"],"sourcesContent":["import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport {\n getUserSettingsPath,\n readMergedProviderSettings,\n readSettings,\n resolveProviderSettingsWriteTargetPath,\n writeSettings,\n} from '@robota-sdk/agent-framework';\nimport type {\n ICommandHostAdapters,\n ICommandModule,\n TProviderSettingsDocument,\n} from '@robota-sdk/agent-framework';\nimport type { CommandRegistry } from '@robota-sdk/agent-framework';\nimport {\n createDefaultCommandModules,\n createDefaultPluginCommandAdapter,\n reloadPluginCommandSource,\n} from '@robota-sdk/agent-command';\nimport { createDefaultProviderDefinitions } from '@robota-sdk/agent-provider';\n\nexport interface IStartCliOptions {\n commandModules?: readonly ICommandModule[];\n providerDefinitions?: readonly IProviderDefinition[];\n}\n\nexport interface ICommandSetup {\n commandHostAdapters: ICommandHostAdapters;\n providerDefinitions: readonly IProviderDefinition[];\n commandModules: readonly ICommandModule[];\n reloadPluginCommandSource: (registry: CommandRegistry) => void;\n}\n\nexport function createCommandSetup(cwd: string, options: IStartCliOptions = {}): ICommandSetup {\n const commandHostAdapters: ICommandHostAdapters = {\n settings: {\n read: () => readSettings(getUserSettingsPath()),\n write: (settings) => writeSettings(getUserSettingsPath(), settings),\n },\n plugin: createDefaultPluginCommandAdapter(cwd),\n };\n const providerDefinitions = options.providerDefinitions ?? createDefaultProviderDefinitions();\n const providerSettingsAdapter = {\n readMergedSettings: () => readMergedProviderSettings(cwd),\n readTargetSettings: () =>\n readSettings(resolveProviderSettingsWriteTargetPath(cwd)) as TProviderSettingsDocument,\n writeTargetSettings: (settings: TProviderSettingsDocument) =>\n writeSettings(resolveProviderSettingsWriteTargetPath(cwd), settings),\n };\n const commandModules: readonly ICommandModule[] = [\n ...createDefaultCommandModules({ cwd, providerDefinitions, providerSettingsAdapter }),\n ...(options.commandModules ?? []),\n ];\n return { commandHostAdapters, providerDefinitions, commandModules, reloadPluginCommandSource };\n}\n"],"mappings":"+YAiCA,SAAgB,EAAmB,EAAa,EAA4B,CAAC,EAAkB,CAC7F,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,EAY5F,MAAO,CAAE,sBAAqB,sBAAqB,eAAA,CAHjD,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,CAE+B,EAAG,2BAA0B,CAC/F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./provider-startup.cjs`);let t=require(`@robota-sdk/agent-transport/headless`);async function n(n,r,i,a,o){return r.configure?(await e.runInteractiveProviderSetup(n,r,t.promptInput,a,i.providerDefinitions),{handled:!0}):e.handleProviderConfigurationArgs(n,r,a,i.providerDefinitions)?{handled:!0}:(await e.ensureConfig(n,r,t.promptInput,a,i.providerDefinitions,o),{handled:!1})}exports.handleConfigPhase=n;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ensureConfig as e,handleProviderConfigurationArgs as t,runInteractiveProviderSetup as n}from"./provider-startup.js";import{promptInput as r}from"@robota-sdk/agent-transport/headless";async function i(i,a,o,s,c){return a.configure?(await n(i,a,r,s,o.providerDefinitions),{handled:!0}):t(i,a,s,o.providerDefinitions)?{handled:!0}:(await e(i,a,r,s,o.providerDefinitions,c),{handled:!1})}export{i as handleConfigPhase};
|
|
2
|
+
//# sourceMappingURL=config-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-phase.js","names":[],"sources":["../../../src/startup/config-phase.ts"],"sourcesContent":["import type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport { promptInput } from '@robota-sdk/agent-transport/headless';\nimport type { IConfigPhaseOptions } from './args-to-options.js';\nimport type { ICommandSetup } from './command-setup.js';\nimport {\n ensureConfig,\n handleProviderConfigurationArgs,\n runInteractiveProviderSetup,\n} from './provider-startup.js';\n\nexport type TConfigPhaseResult = { handled: true } | { handled: false };\n\nexport async function handleConfigPhase(\n cwd: string,\n opts: IConfigPhaseOptions,\n commandSetup: ICommandSetup,\n terminal: ITerminalOutput,\n isInteractive: boolean,\n): Promise<TConfigPhaseResult> {\n if (opts.configure) {\n await runInteractiveProviderSetup(\n cwd,\n opts,\n promptInput,\n terminal,\n commandSetup.providerDefinitions,\n );\n return { handled: true };\n }\n\n if (handleProviderConfigurationArgs(cwd, opts, terminal, commandSetup.providerDefinitions)) {\n return { handled: true };\n }\n\n await ensureConfig(\n cwd,\n opts,\n promptInput,\n terminal,\n commandSetup.providerDefinitions,\n isInteractive,\n );\n\n return { handled: false };\n}\n"],"mappings":"8LAYA,eAAsB,EACpB,EACA,EACA,EACA,EACA,EAC6B,CAyB7B,OAxBI,EAAK,WACP,MAAM,EACJ,EACA,EACA,EACA,EACA,EAAa,mBACf,EACO,CAAE,QAAS,EAAK,GAGrB,EAAgC,EAAK,EAAM,EAAU,EAAa,mBAAmB,EAChF,CAAE,QAAS,EAAK,GAGzB,MAAM,EACJ,EACA,EACA,EACA,EACA,EAAa,oBACb,CACF,EAEO,CAAE,QAAS,EAAM,EAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`../utils/cli-args.cjs`),t=require(`../init/init-command.cjs`),n=require(`./reset-config.cjs`);let r=require(`@robota-sdk/agent-framework`);async function i(i,a){if(i.positional[0]===`init`)return await t.runInitCommand(a.cwd,a.terminal),{handled:!0};if(i.help)return a.terminal.write(e.printHelp()),{handled:!0};if(i.version)return a.terminal.writeLine(`robota ${a.version}`),{handled:!0};if(i.checkUpdate){let e=await(0,r.checkForCliUpdate)({currentVersion:a.version,force:!0}),t=(0,r.formatCliUpdateCheckMessage)(e);if(e.status===`error`)throw Error(t);return a.terminal.writeLine(t),{handled:!0}}return i.reset?(n.runResetConfig(a.terminal),{handled:!0}):{handled:!1}}exports.handlePreflightCommands=i;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{printHelp as e}from"../utils/cli-args.js";import{runInitCommand as t}from"../init/init-command.js";import{runResetConfig as n}from"./reset-config.js";import{checkForCliUpdate as r,formatCliUpdateCheckMessage as i}from"@robota-sdk/agent-framework";async function a(a,o){if(a.positional[0]===`init`)return await t(o.cwd,o.terminal),{handled:!0};if(a.help)return o.terminal.write(e()),{handled:!0};if(a.version)return o.terminal.writeLine(`robota ${o.version}`),{handled:!0};if(a.checkUpdate){let e=await r({currentVersion:o.version,force:!0}),t=i(e);if(e.status===`error`)throw Error(t);return o.terminal.writeLine(t),{handled:!0}}return a.reset?(n(o.terminal),{handled:!0}):{handled:!1}}export{a as handlePreflightCommands};
|
|
2
|
+
//# sourceMappingURL=preflight.js.map
|