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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +414 -114
  2. package/bin/robota.cjs +47 -0
  3. package/dist/node/bin.d.ts +2 -1
  4. package/dist/node/bin.js +50 -10
  5. package/dist/node/bin.js.map +1 -0
  6. package/dist/node/child-process-subagent-ipc--Vp2dk1v.js +2 -0
  7. package/dist/node/child-process-subagent-ipc--Vp2dk1v.js.map +1 -0
  8. package/dist/node/child-process-subagent-ipc-Aitv2i6E.cjs +1 -0
  9. package/dist/node/child-process-subagent-ipc-CEy8bLN6.cjs +1 -0
  10. package/dist/node/child-process-subagent-ipc-DVpVp43R.js +2 -0
  11. package/dist/node/child-process-subagent-ipc-DVpVp43R.js.map +1 -0
  12. package/dist/node/cli.cjs +1 -0
  13. package/dist/node/cli.d.ts +7 -0
  14. package/dist/node/cli.d.ts.map +1 -0
  15. package/dist/node/cli.js +2 -0
  16. package/dist/node/cli.js.map +1 -0
  17. package/dist/node/constants.cjs +1 -0
  18. package/dist/node/constants.js +2 -0
  19. package/dist/node/constants.js.map +1 -0
  20. package/dist/node/index.cjs +42 -1257
  21. package/dist/node/index.d.ts +12 -47
  22. package/dist/node/index.d.ts.map +1 -0
  23. package/dist/node/index.js +43 -13
  24. package/dist/node/index.js.map +1 -0
  25. package/dist/node/init/init-command.cjs +32 -0
  26. package/dist/node/init/init-command.js +33 -0
  27. package/dist/node/init/init-command.js.map +1 -0
  28. package/dist/node/modes/print-mode.cjs +6 -0
  29. package/dist/node/modes/print-mode.js +7 -0
  30. package/dist/node/modes/print-mode.js.map +1 -0
  31. package/dist/node/modes/shell-exec.cjs +1 -0
  32. package/dist/node/modes/shell-exec.js +2 -0
  33. package/dist/node/modes/shell-exec.js.map +1 -0
  34. package/dist/node/modes/tui-mode.cjs +1 -0
  35. package/dist/node/modes/tui-mode.js +2 -0
  36. package/dist/node/modes/tui-mode.js.map +1 -0
  37. package/dist/node/provider-default-definitions-CKtxv2k0.js +2 -0
  38. package/dist/node/provider-default-definitions-CKtxv2k0.js.map +1 -0
  39. package/dist/node/provider-default-definitions-GFiYzACo.cjs +1 -0
  40. package/dist/node/provider-default-definitions-g0ZUDeii.cjs +1 -0
  41. package/dist/node/startup/append-system-prompt.cjs +3 -0
  42. package/dist/node/startup/append-system-prompt.js +4 -0
  43. package/dist/node/startup/append-system-prompt.js.map +1 -0
  44. package/dist/node/startup/args-to-options.cjs +1 -0
  45. package/dist/node/startup/args-to-options.js +2 -0
  46. package/dist/node/startup/args-to-options.js.map +1 -0
  47. package/dist/node/startup/command-setup.cjs +1 -0
  48. package/dist/node/startup/command-setup.d.ts +11 -0
  49. package/dist/node/startup/command-setup.d.ts.map +1 -0
  50. package/dist/node/startup/command-setup.js +2 -0
  51. package/dist/node/startup/command-setup.js.map +1 -0
  52. package/dist/node/startup/config-phase.cjs +1 -0
  53. package/dist/node/startup/config-phase.js +2 -0
  54. package/dist/node/startup/config-phase.js.map +1 -0
  55. package/dist/node/startup/preflight.cjs +1 -0
  56. package/dist/node/startup/preflight.js +2 -0
  57. package/dist/node/startup/preflight.js.map +1 -0
  58. package/dist/node/startup/provider-setup.cjs +1 -0
  59. package/dist/node/startup/provider-setup.js +2 -0
  60. package/dist/node/startup/provider-setup.js.map +1 -0
  61. package/dist/node/startup/provider-startup.cjs +2 -0
  62. package/dist/node/startup/provider-startup.js +3 -0
  63. package/dist/node/startup/provider-startup.js.map +1 -0
  64. package/dist/node/startup/reset-config.cjs +1 -0
  65. package/dist/node/startup/reset-config.js +2 -0
  66. package/dist/node/startup/reset-config.js.map +1 -0
  67. package/dist/node/startup/session-setup.cjs +1 -0
  68. package/dist/node/startup/session-setup.js +2 -0
  69. package/dist/node/startup/session-setup.js.map +1 -0
  70. package/dist/node/startup/subagent-setup.cjs +1 -0
  71. package/dist/node/startup/subagent-setup.js +2 -0
  72. package/dist/node/startup/subagent-setup.js.map +1 -0
  73. package/dist/node/startup/update-notice.cjs +1 -0
  74. package/dist/node/startup/update-notice.js +2 -0
  75. package/dist/node/startup/update-notice.js.map +1 -0
  76. package/dist/node/startup/version.cjs +1 -0
  77. package/dist/node/startup/version.js +2 -0
  78. package/dist/node/startup/version.js.map +1 -0
  79. package/dist/node/subagents/child-process-subagent-worker.cjs +1 -0
  80. package/dist/node/subagents/child-process-subagent-worker.d.ts +1 -0
  81. package/dist/node/subagents/child-process-subagent-worker.js +2 -0
  82. package/dist/node/subagents/child-process-subagent-worker.js.map +1 -0
  83. package/dist/node/user-local-direct-command.cjs +1 -0
  84. package/dist/node/user-local-direct-command.js +2 -0
  85. package/dist/node/user-local-direct-command.js.map +1 -0
  86. package/dist/node/utils/cli-args.cjs +35 -0
  87. package/dist/node/utils/cli-args.js +36 -0
  88. package/dist/node/utils/cli-args.js.map +1 -0
  89. package/package.json +52 -16
  90. package/dist/node/bin.cjs +0 -1240
  91. package/dist/node/bin.d.cts +0 -1
  92. package/dist/node/chunk-A2A66S6Q.js +0 -1219
  93. package/dist/node/index.d.cts +0 -49
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset-config.js","names":[],"sources":["../../../src/startup/reset-config.ts"],"sourcesContent":["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"],"mappings":"8DAGA,SAAgB,EAAe,EAAiC,CAC9D,IAAM,EAAS,EAAgB,EAC3B,EAAO,QACT,EAAS,UAAU,WAAW,EAAO,MAAM,EAE3C,EAAS,UAAU,yBAAyB,CAEhD"}
@@ -0,0 +1 @@
1
+ let e=require(`@robota-sdk/agent-framework`);function t(t,n){let r=n.noSessionPersistence?void 0:(0,e.createProjectSessionStore)(t),i,a=!1;if(n.continueMode)i=(0,e.resolveLatestSessionId)(r,t);else if(n.resumeId!==void 0){if(n.resumeId===``)a=!0;else if(i=(0,e.resolveSessionIdByIdOrName)(r,n.resumeId),i===void 0)throw Error(`Session not found: ${n.resumeId}`)}return{sessionStore:r,resumeSessionId:i,showSessionPickerOnStart:a}}exports.createSessionSetup=t;
@@ -0,0 +1,2 @@
1
+ import{createProjectSessionStore as e,resolveLatestSessionId as t,resolveSessionIdByIdOrName as n}from"@robota-sdk/agent-framework";function r(r,i){let a=i.noSessionPersistence?void 0:e(r),o,s=!1;if(i.continueMode)o=t(a,r);else if(i.resumeId!==void 0){if(i.resumeId===``)s=!0;else if(o=n(a,i.resumeId),o===void 0)throw Error(`Session not found: ${i.resumeId}`)}return{sessionStore:a,resumeSessionId:o,showSessionPickerOnStart:s}}export{r as createSessionSetup};
2
+ //# sourceMappingURL=session-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-setup.js","names":[],"sources":["../../../src/startup/session-setup.ts"],"sourcesContent":["import type { IInteractiveSessionStore } from '@robota-sdk/agent-framework';\nimport {\n createProjectSessionStore,\n resolveLatestSessionId,\n resolveSessionIdByIdOrName,\n} from '@robota-sdk/agent-framework';\nimport type { ISessionRunOptions } from './args-to-options.js';\n\nexport interface ISessionSetup {\n sessionStore: IInteractiveSessionStore | undefined;\n resumeSessionId: string | undefined;\n showSessionPickerOnStart: boolean;\n}\n\nexport function createSessionSetup(cwd: string, opts: ISessionRunOptions): ISessionSetup {\n const sessionStore = opts.noSessionPersistence ? undefined : createProjectSessionStore(cwd);\n\n let resumeSessionId: string | undefined;\n let showSessionPickerOnStart = false;\n\n if (opts.continueMode) {\n resumeSessionId = resolveLatestSessionId(sessionStore, cwd);\n } else if (opts.resumeId !== undefined) {\n if (opts.resumeId === '') {\n showSessionPickerOnStart = true;\n } else {\n resumeSessionId = resolveSessionIdByIdOrName(sessionStore, opts.resumeId);\n if (resumeSessionId === undefined) {\n throw new Error(`Session not found: ${opts.resumeId}`);\n }\n }\n }\n\n return { sessionStore, resumeSessionId, showSessionPickerOnStart };\n}\n"],"mappings":"oIAcA,SAAgB,EAAmB,EAAa,EAAyC,CACvF,IAAM,EAAe,EAAK,qBAAuB,IAAA,GAAY,EAA0B,CAAG,EAEtF,EACA,EAA2B,GAE/B,GAAI,EAAK,aACP,EAAkB,EAAuB,EAAc,CAAG,OACrD,GAAI,EAAK,WAAa,IAAA,GAC3B,IAAI,EAAK,WAAa,GACpB,EAA2B,QAG3B,GADA,EAAkB,EAA2B,EAAc,EAAK,QAAQ,EACpE,IAAoB,IAAA,GACtB,MAAU,MAAM,sBAAsB,EAAK,UAAU,CAEzD,CAGF,MAAO,CAAE,eAAc,kBAAiB,0BAAyB,CACnE"}
@@ -0,0 +1 @@
1
+ let e=require(`@robota-sdk/agent-subagent-runner`);function t(t){return{subagentRunnerFactory:(0,e.createChildProcessSubagentRunnerFactory)({providerConfig:t.providerConfig,logsDir:t.logsDir})}}exports.createSubagentSetup=t;
@@ -0,0 +1,2 @@
1
+ import{createChildProcessSubagentRunnerFactory as e}from"@robota-sdk/agent-subagent-runner";function t(t){return{subagentRunnerFactory:e({providerConfig:t.providerConfig,logsDir:t.logsDir})}}export{t as createSubagentSetup};
2
+ //# sourceMappingURL=subagent-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-setup.js","names":[],"sources":["../../../src/startup/subagent-setup.ts"],"sourcesContent":["import type { IProviderConfig } from '@robota-sdk/agent-core';\nimport type { TSubagentRunnerFactory } from '@robota-sdk/agent-framework';\nimport { createChildProcessSubagentRunnerFactory } from '@robota-sdk/agent-subagent-runner';\n\nexport interface ISubagentSetupConfig {\n providerConfig: IProviderConfig;\n logsDir: string;\n}\n\nexport interface ISubagentSetup {\n subagentRunnerFactory: TSubagentRunnerFactory;\n}\n\nexport function createSubagentSetup(config: ISubagentSetupConfig): ISubagentSetup {\n return {\n subagentRunnerFactory: createChildProcessSubagentRunnerFactory({\n providerConfig: config.providerConfig,\n logsDir: config.logsDir,\n }),\n };\n}\n"],"mappings":"4FAaA,SAAgB,EAAoB,EAA8C,CAChF,MAAO,CACL,sBAAuB,EAAwC,CAC7D,eAAgB,EAAO,eACvB,QAAS,EAAO,OAClB,CAAC,CACH,CACF"}
@@ -0,0 +1 @@
1
+ let e=require(`@robota-sdk/agent-framework`);function t(t,n){if((0,e.shouldRunStartupCliUpdateCheck)(n))return(0,e.getStartupCliUpdateNotice)({currentVersion:t}).then(t=>t?(0,e.formatCliUpdateNotice)(t):void 0)}exports.resolveStartupUpdateNotice=t;
@@ -0,0 +1,2 @@
1
+ import{formatCliUpdateNotice as e,getStartupCliUpdateNotice as t,shouldRunStartupCliUpdateCheck as n}from"@robota-sdk/agent-framework";function r(r,i){if(n(i))return t({currentVersion:r}).then(t=>t?e(t):void 0)}export{r as resolveStartupUpdateNotice};
2
+ //# sourceMappingURL=update-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-notice.js","names":[],"sources":["../../../src/startup/update-notice.ts"],"sourcesContent":["import {\n shouldRunStartupCliUpdateCheck,\n getStartupCliUpdateNotice,\n formatCliUpdateNotice,\n} from '@robota-sdk/agent-framework';\nimport type { IStartupUpdatePolicyOptions } from './args-to-options.js';\n\nexport function resolveStartupUpdateNotice(\n version: string,\n policy: IStartupUpdatePolicyOptions,\n): Promise<string | undefined> | undefined {\n if (!shouldRunStartupCliUpdateCheck(policy)) return undefined;\n return getStartupCliUpdateNotice({ currentVersion: version }).then((n) =>\n n ? formatCliUpdateNotice(n) : undefined,\n );\n}\n"],"mappings":"uIAOA,SAAgB,EACd,EACA,EACyC,CACpC,KAA+B,CAAM,EAC1C,OAAO,EAA0B,CAAE,eAAgB,CAAQ,CAAC,EAAE,KAAM,GAClE,EAAI,EAAsB,CAAC,EAAI,IAAA,EACjC,CACF"}
@@ -0,0 +1 @@
1
+ let e=require(`@robota-sdk/agent-framework`);const t=()=>(0,e.readPackageVersion)(require(`url`).pathToFileURL(__filename).href);exports.readVersion=t;
@@ -0,0 +1,2 @@
1
+ import{readPackageVersion as e}from"@robota-sdk/agent-framework";const t=()=>e(import.meta.url);export{t as readVersion};
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../../src/startup/version.ts"],"sourcesContent":["import { readPackageVersion } from '@robota-sdk/agent-framework';\n\nexport const readVersion = (): string => readPackageVersion(import.meta.url);\n"],"mappings":"iEAEA,MAAa,MAA4B,EAAmB,OAAO,KAAK,GAAG"}
@@ -0,0 +1 @@
1
+ const e=require(`../provider-default-definitions-g0ZUDeii.cjs`);require(`../index.cjs`);let t=require(`@robota-sdk/agent-framework`),n=require(`@robota-sdk/agent-executor`);const r={write:()=>{},writeLine:()=>{},writeMarkdown:()=>{},writeError:()=>{},prompt:()=>Promise.resolve(``),select:()=>Promise.resolve(0),spinner:()=>({stop:()=>{},update:()=>{}})};let i=null,a=!1,o=Promise.resolve();function s(e){process.send&&process.send(e)}async function c(o){try{let c=(0,n.createProviderFromProfile)(o.providerProfile,o.request.model,e.t),u=o.logsDir?(0,t.createSubagentLogger)(o.request.parentSessionId,o.jobId,o.logsDir):void 0;i=(0,t.createSubagentSession)({agentDefinition:o.agentDefinition,parentConfig:o.parentConfig,parentContext:o.parentContext,parentTools:(0,t.createDefaultTools)(),provider:c,terminal:r,sessionId:o.jobId,...u?{sessionLogger:u}:{},permissionMode:o.permissionMode,hooks:o.parentConfig.hooks,onTextDelta:e=>s({type:`text_delta`,delta:e}),onToolExecution:l});let d=await i.run(o.request.prompt);if(a){s({type:`cancelled`,reason:`Subagent worker cancelled`});return}s({type:`result`,output:d})}catch(e){if(a){s({type:`cancelled`,reason:`Subagent worker cancelled`});return}s({type:`error`,message:e instanceof Error?e.message:String(e)})}finally{setImmediate(()=>process.exit(a?130:0))}}function l(e){if(e.type===`start`){s({type:`tool_start`,toolName:e.toolName,toolArgs:e.toolArgs});return}s({type:`tool_end`,toolName:e.toolName,success:e.success??!0})}function u(e){if(i===null){s({type:`error`,message:`Subagent worker has not started`});return}o=o.then(async()=>{try{await i?.run(e)}catch(e){s({type:`error`,message:e instanceof Error?e.message:String(e)})}})}async function d(e){a=!0,i?.abort(),s({type:`cancelled`,reason:e}),await i?.shutdown({reason:`other`}).catch(()=>void 0),setTimeout(()=>process.exit(130),0)}process.on(`message`,e=>{if(!(0,t.isSubagentWorkerParentMessage)(e)){s({type:`error`,message:`Malformed subagent worker parent message`});return}switch(e.type){case`start`:o=o.then(()=>c(e.payload));break;case`send`:u(e.prompt);break;case`cancel`:d(e.reason);break;default:s({type:`error`,message:`Unhandled subagent worker parent message`})}}),process.on(`disconnect`,()=>{a=!0,i?.abort(),i?.shutdown({reason:`other`}).catch(()=>void 0)}),s({type:`ready`});
@@ -0,0 +1,2 @@
1
+ import{t as e}from"../provider-default-definitions-CKtxv2k0.js";import{createDefaultTools as t,createSubagentLogger as n,createSubagentSession as r,isSubagentWorkerParentMessage as i}from"@robota-sdk/agent-framework";import{createProviderFromProfile as a}from"@robota-sdk/agent-executor";const o={write:()=>{},writeLine:()=>{},writeMarkdown:()=>{},writeError:()=>{},prompt:()=>Promise.resolve(``),select:()=>Promise.resolve(0),spinner:()=>({stop:()=>{},update:()=>{}})};let s=null,c=!1,l=Promise.resolve();function u(e){process.send&&process.send(e)}async function d(i){try{let l=a(i.providerProfile,i.request.model,e),d=i.logsDir?n(i.request.parentSessionId,i.jobId,i.logsDir):void 0;s=r({agentDefinition:i.agentDefinition,parentConfig:i.parentConfig,parentContext:i.parentContext,parentTools:t(),provider:l,terminal:o,sessionId:i.jobId,...d?{sessionLogger:d}:{},permissionMode:i.permissionMode,hooks:i.parentConfig.hooks,onTextDelta:e=>u({type:`text_delta`,delta:e}),onToolExecution:f});let p=await s.run(i.request.prompt);if(c){u({type:`cancelled`,reason:`Subagent worker cancelled`});return}u({type:`result`,output:p})}catch(e){if(c){u({type:`cancelled`,reason:`Subagent worker cancelled`});return}u({type:`error`,message:e instanceof Error?e.message:String(e)})}finally{setImmediate(()=>process.exit(c?130:0))}}function f(e){if(e.type===`start`){u({type:`tool_start`,toolName:e.toolName,toolArgs:e.toolArgs});return}u({type:`tool_end`,toolName:e.toolName,success:e.success??!0})}function p(e){if(s===null){u({type:`error`,message:`Subagent worker has not started`});return}l=l.then(async()=>{try{await s?.run(e)}catch(e){u({type:`error`,message:e instanceof Error?e.message:String(e)})}})}async function m(e){c=!0,s?.abort(),u({type:`cancelled`,reason:e}),await s?.shutdown({reason:`other`}).catch(()=>void 0),setTimeout(()=>process.exit(130),0)}process.on(`message`,e=>{if(!i(e)){u({type:`error`,message:`Malformed subagent worker parent message`});return}switch(e.type){case`start`:l=l.then(()=>d(e.payload));break;case`send`:p(e.prompt);break;case`cancel`:m(e.reason);break;default:u({type:`error`,message:`Unhandled subagent worker parent message`})}}),process.on(`disconnect`,()=>{c=!0,s?.abort(),s?.shutdown({reason:`other`}).catch(()=>void 0)}),u({type:`ready`});export{};
2
+ //# sourceMappingURL=child-process-subagent-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-process-subagent-worker.js","names":[],"sources":["../../../src/subagents/child-process-subagent-worker.ts"],"sourcesContent":["import {\n createDefaultTools,\n createSubagentLogger,\n createSubagentSession,\n} from '@robota-sdk/agent-framework';\nimport { createProviderFromProfile } from '@robota-sdk/agent-executor';\nimport {\n isSubagentWorkerParentMessage,\n type ISubagentWorkerStartPayload,\n type TSubagentWorkerChildMessage,\n type TSubagentWorkerWireValue,\n} from '@robota-sdk/agent-framework';\nimport type { ITerminalOutput } from '../types.js';\nimport { DEFAULT_PROVIDER_DEFINITIONS } from '../utils/provider-default-definitions.js';\n\nconst CANCEL_EXIT_CODE = 130;\n\nconst NOOP_TERMINAL: ITerminalOutput = {\n write: (): void => {},\n writeLine: (): void => {},\n writeMarkdown: (): void => {},\n writeError: (): void => {},\n prompt: (): Promise<string> => Promise.resolve(''),\n select: (): Promise<number> => Promise.resolve(0),\n spinner: () => ({ stop: (): void => {}, update: (): void => {} }),\n};\n\ntype TSubagentSessionToolEvent = Parameters<\n NonNullable<Parameters<typeof createSubagentSession>[0]['onToolExecution']>\n>[0];\n\nlet session: ReturnType<typeof createSubagentSession> | null = null;\nlet cancelled = false;\nlet running: Promise<void> = Promise.resolve();\n\nfunction sendChildMessage(message: TSubagentWorkerChildMessage): void {\n if (process.send) {\n process.send(message);\n }\n}\n\nasync function runInitialPrompt(payload: ISubagentWorkerStartPayload): Promise<void> {\n try {\n const provider = createProviderFromProfile(\n payload.providerProfile,\n payload.request.model,\n DEFAULT_PROVIDER_DEFINITIONS,\n );\n const sessionLogger = payload.logsDir\n ? createSubagentLogger(payload.request.parentSessionId, payload.jobId, payload.logsDir)\n : undefined;\n session = createSubagentSession({\n agentDefinition: payload.agentDefinition,\n parentConfig: payload.parentConfig,\n parentContext: payload.parentContext,\n parentTools: createDefaultTools(),\n provider,\n terminal: NOOP_TERMINAL,\n sessionId: payload.jobId,\n ...(sessionLogger ? { sessionLogger } : {}),\n permissionMode: payload.permissionMode,\n hooks: payload.parentConfig.hooks,\n onTextDelta: (delta) => sendChildMessage({ type: 'text_delta', delta }),\n onToolExecution: forwardToolExecution,\n });\n const output = await session.run(payload.request.prompt);\n if (cancelled) {\n sendChildMessage({ type: 'cancelled', reason: 'Subagent worker cancelled' });\n return;\n }\n sendChildMessage({ type: 'result', output });\n } catch (error) {\n if (cancelled) {\n sendChildMessage({ type: 'cancelled', reason: 'Subagent worker cancelled' });\n return;\n }\n const message = error instanceof Error ? error.message : String(error);\n sendChildMessage({ type: 'error', message });\n } finally {\n setImmediate(() => process.exit(cancelled ? CANCEL_EXIT_CODE : 0));\n }\n}\n\nfunction forwardToolExecution(event: TSubagentSessionToolEvent): void {\n if (event.type === 'start') {\n sendChildMessage({ type: 'tool_start', toolName: event.toolName, toolArgs: event.toolArgs });\n return;\n }\n sendChildMessage({ type: 'tool_end', toolName: event.toolName, success: event.success ?? true });\n}\n\nfunction runFollowUp(prompt: string): void {\n if (session === null) {\n sendChildMessage({ type: 'error', message: 'Subagent worker has not started' });\n return;\n }\n running = running.then(async () => {\n try {\n await session?.run(prompt);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendChildMessage({ type: 'error', message });\n }\n });\n}\n\nasync function cancelWorker(reason?: string): Promise<void> {\n cancelled = true;\n session?.abort();\n sendChildMessage({ type: 'cancelled', reason });\n await session?.shutdown({ reason: 'other' }).catch(() => undefined);\n setTimeout(() => process.exit(CANCEL_EXIT_CODE), 0);\n}\n\nprocess.on('message', (message: TSubagentWorkerWireValue) => {\n if (!isSubagentWorkerParentMessage(message)) {\n sendChildMessage({ type: 'error', message: 'Malformed subagent worker parent message' });\n return;\n }\n\n switch (message.type) {\n case 'start':\n running = running.then(() => runInitialPrompt(message.payload));\n break;\n case 'send':\n runFollowUp(message.prompt);\n break;\n case 'cancel':\n void cancelWorker(message.reason);\n break;\n default:\n sendChildMessage({ type: 'error', message: 'Unhandled subagent worker parent message' });\n }\n});\n\nprocess.on('disconnect', () => {\n cancelled = true;\n session?.abort();\n void session?.shutdown({ reason: 'other' }).catch(() => undefined);\n});\n\nsendChildMessage({ type: 'ready' });\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ let e=require(`@robota-sdk/agent-command`);async function t(t,n,r){if(t.positional[0]!==`user-local`)return!1;let i=await(0,e.executeUserLocalDirectCommand)({cwd:n,argv:t.positional.slice(1),format:t.format,summary:t.summary,source:t.source}),a=i.message.trimEnd();if(!i.success)throw Error(a);return r.writeLine(a),!0}exports.runUserLocalDirectCommandIfRequested=t;
@@ -0,0 +1,2 @@
1
+ import{executeUserLocalDirectCommand as e}from"@robota-sdk/agent-command";async function t(t,n,r){if(t.positional[0]!==`user-local`)return!1;let i=await e({cwd:n,argv:t.positional.slice(1),format:t.format,summary:t.summary,source:t.source}),a=i.message.trimEnd();if(!i.success)throw Error(a);return r.writeLine(a),!0}export{t as runUserLocalDirectCommandIfRequested};
2
+ //# sourceMappingURL=user-local-direct-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-local-direct-command.js","names":[],"sources":["../../src/user-local-direct-command.ts"],"sourcesContent":["import { executeUserLocalDirectCommand } from '@robota-sdk/agent-command';\nimport type { ITerminalOutput } from '@robota-sdk/agent-core';\nimport type { IUserLocalCommandOptions } from './startup/args-to-options.js';\n\nexport async function runUserLocalDirectCommandIfRequested(\n opts: IUserLocalCommandOptions,\n cwd: string,\n terminal: ITerminalOutput,\n): Promise<boolean> {\n if (opts.positional[0] !== 'user-local') {\n return false;\n }\n\n const result = await executeUserLocalDirectCommand({\n cwd,\n argv: opts.positional.slice(1),\n format: opts.format,\n summary: opts.summary,\n source: opts.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"],"mappings":"0EAIA,eAAsB,EACpB,EACA,EACA,EACkB,CAClB,GAAI,EAAK,WAAW,KAAO,aACzB,MAAO,GAGT,IAAM,EAAS,MAAM,EAA8B,CACjD,MACA,KAAM,EAAK,WAAW,MAAM,CAAC,EAC7B,OAAQ,EAAK,OACb,QAAS,EAAK,QACd,OAAQ,EAAK,MACf,CAAC,EACK,EAAS,EAAO,QAAQ,QAAQ,EACtC,GAAI,CAAC,EAAO,QACV,MAAU,MAAM,CAAM,EAGxB,OADA,EAAS,UAAU,CAAM,EAClB,EACT"}
@@ -0,0 +1,35 @@
1
+ let e=require(`node:util`);const t=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],n=[`text`,`json`,`stream-json`];function r(){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
+ --model <model> Override model for this session
12
+ --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions
13
+ --max-turns <n> Maximum agent turns before stopping
14
+ -c, --continue Continue the most recent session
15
+ -r, --resume <id> Resume a session by ID or name
16
+ -n, --name <name> Name for the new session
17
+ --fork-session Fork the current session
18
+ --configure Run interactive provider configuration
19
+ --configure-provider <n> Configure a specific provider
20
+ --dry-run <prompt> Plan-only run: show what the agent would do without modifying files
21
+ --check-update Check for CLI updates
22
+ --version Show version number
23
+ -h, --help Show this help message
24
+
25
+ Commands:
26
+ robota init Initialize AGENTS.md and .robota/settings.json
27
+
28
+ Examples:
29
+ robota Start interactive TUI session
30
+ robota init Initialize project files
31
+ robota -p "Hello" Print mode: send prompt and exit
32
+ robota -p "Hello" --output-format json
33
+ robota --dry-run "Refactor the auth module" Show plan without modifying files
34
+ robota --continue Resume the last session
35
+ `}function i(e){if(e!==void 0){if(!n.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${n.join(` | `)}`);return e}}function a(e){if(e!==void 0){if(!t.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${t.join(` | `)}`);return e}}function o(e){if(e===void 0)return;let t=parseInt(e,10);if(isNaN(t)||t<=0)throw Error(`Invalid --max-turns "${e}". Must be a positive integer.`);return t}const s={allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},model:{type:`string`},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`},"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}}};function c(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,model:e.model,language:e.language,permissionMode:a(e[`permission-mode`]),maxTurns:o(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:i(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`],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}}function l(){let{values:t,positionals:n}=(0,e.parseArgs)(s);return c(t,n)}exports.parseCliArgs=l,exports.printHelp=r;
@@ -0,0 +1,36 @@
1
+ import{parseArgs as e}from"node:util";const t=[`plan`,`default`,`acceptEdits`,`bypassPermissions`],n=[`text`,`json`,`stream-json`];function r(){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
+ --model <model> Override model for this session
12
+ --permission-mode <mode> Permission mode: plan | default | acceptEdits | bypassPermissions
13
+ --max-turns <n> Maximum agent turns before stopping
14
+ -c, --continue Continue the most recent session
15
+ -r, --resume <id> Resume a session by ID or name
16
+ -n, --name <name> Name for the new session
17
+ --fork-session Fork the current session
18
+ --configure Run interactive provider configuration
19
+ --configure-provider <n> Configure a specific provider
20
+ --dry-run <prompt> Plan-only run: show what the agent would do without modifying files
21
+ --check-update Check for CLI updates
22
+ --version Show version number
23
+ -h, --help Show this help message
24
+
25
+ Commands:
26
+ robota init Initialize AGENTS.md and .robota/settings.json
27
+
28
+ Examples:
29
+ robota Start interactive TUI session
30
+ robota init Initialize project files
31
+ robota -p "Hello" Print mode: send prompt and exit
32
+ robota -p "Hello" --output-format json
33
+ robota --dry-run "Refactor the auth module" Show plan without modifying files
34
+ robota --continue Resume the last session
35
+ `}function i(e){if(e!==void 0){if(!n.includes(e))throw Error(`Invalid --output-format "${e}". Valid: ${n.join(` | `)}`);return e}}function a(e){if(e!==void 0){if(!t.includes(e))throw Error(`Invalid --permission-mode "${e}". Valid: ${t.join(` | `)}`);return e}}function o(e){if(e===void 0)return;let t=parseInt(e,10);if(isNaN(t)||t<=0)throw Error(`Invalid --max-turns "${e}". Must be a positive integer.`);return t}const s={allowPositionals:!0,options:{help:{type:`boolean`,short:`h`,default:!1},p:{type:`boolean`,short:`p`,default:!1},continue:{type:`boolean`,short:`c`,default:!1},resume:{type:`string`,short:`r`},model:{type:`string`},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`},"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}}};function c(e,t){return{positional:t,help:e.help??!1,printMode:e.p??!1,continueMode:e.continue??!1,resumeId:e.resume,model:e.model,language:e.language,permissionMode:a(e[`permission-mode`]),maxTurns:o(e[`max-turns`]),forkSession:e[`fork-session`]??!1,sessionName:e.name,outputFormat:i(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`],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}}function l(){let{values:t,positionals:n}=e(s);return c(t,n)}export{l as parseCliArgs,r as printHelp};
36
+ //# sourceMappingURL=cli-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-args.js","names":[],"sources":["../../../src/utils/cli-args.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 model: 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 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}\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 --model <model> Override model for this session\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\n --configure Run interactive provider configuration\n --configure-provider <n> Configure a specific provider\n --dry-run <prompt> 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 --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 model: { type: 'string' },\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 '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 },\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 model: values['model'],\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 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 };\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@robota-sdk/agent-cli",
3
- "version": "3.0.0-beta.7",
3
+ "version": "3.0.0-beta.70",
4
4
  "description": "AI coding assistant CLI built on Robota SDK",
5
5
  "type": "module",
6
6
  "bin": {
7
- "robota": "./dist/node/bin.js"
7
+ "robota": "./bin/robota.cjs"
8
8
  },
9
9
  "main": "dist/node/index.js",
10
10
  "types": "dist/node/index.d.ts",
11
11
  "exports": {
12
12
  ".": {
13
13
  "types": "./dist/node/index.d.ts",
14
+ "source": "./src/index.ts",
14
15
  "node": {
15
16
  "import": "./dist/node/index.js",
16
17
  "require": "./dist/node/index.cjs"
@@ -21,41 +22,76 @@
21
22
  }
22
23
  }
23
24
  },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/woojubb/robota.git"
28
+ },
29
+ "homepage": "https://robota.io/",
30
+ "bugs": {
31
+ "url": "https://github.com/woojubb/robota/issues"
32
+ },
33
+ "engines": {
34
+ "node": ">=22.0.0"
35
+ },
24
36
  "files": [
25
- "dist"
37
+ "dist",
38
+ "bin"
26
39
  ],
27
40
  "dependencies": {
28
41
  "chalk": "^5.3.0",
29
42
  "cli-highlight": "^2.1.0",
30
- "ink": "^6.8.0",
31
- "ink-select-input": "^6.2.0",
32
- "ink-spinner": "^5.0.0",
33
- "ink-text-input": "^6.0.0",
34
43
  "marked": "^9.1.5",
35
44
  "marked-terminal": "^7.3.0",
36
- "react": "19.2.4",
45
+ "open": "^11.0.0",
37
46
  "string-width": "^8.2.0",
38
- "@robota-sdk/agent-core": "3.0.0-beta.7",
39
- "@robota-sdk/agent-sdk": "3.0.0-beta.7"
47
+ "ws": "^8.18.3",
48
+ "@robota-sdk/agent-command": "3.0.0-beta.70",
49
+ "@robota-sdk/agent-core": "3.0.0-beta.70",
50
+ "@robota-sdk/agent-provider": "3.0.0-beta.70",
51
+ "@robota-sdk/agent-subagent-runner": "3.0.0-beta.70",
52
+ "@robota-sdk/agent-framework": "3.0.0-beta.70",
53
+ "@robota-sdk/agent-transport": "3.0.0-beta.70"
40
54
  },
41
55
  "devDependencies": {
56
+ "@homebridge/node-pty-prebuilt-multiarch": "^0.13.1",
42
57
  "@types/marked": "^6.0.0",
43
- "@types/react": "^19.2.14",
58
+ "@types/ws": "^8.5.10",
44
59
  "rimraf": "^5.0.5",
45
- "tsup": "^8.0.1",
60
+ "tsdown": "^0.22.0",
46
61
  "tsx": "^4.7.0",
47
62
  "typescript": "^5.3.3",
48
- "vitest": "^1.6.1"
63
+ "vitest": "^1.6.1",
64
+ "@robota-sdk/agent-executor": "3.0.0-beta.70"
49
65
  },
66
+ "keywords": [
67
+ "ai",
68
+ "cli",
69
+ "coding-assistant",
70
+ "agent",
71
+ "llm",
72
+ "anthropic",
73
+ "openai",
74
+ "claude",
75
+ "typescript",
76
+ "developer-tools",
77
+ "terminal",
78
+ "automation",
79
+ "multi-provider",
80
+ "robota",
81
+ "open-source"
82
+ ],
50
83
  "license": "MIT",
51
84
  "publishConfig": {
52
85
  "access": "public"
53
86
  },
54
87
  "scripts": {
55
- "build": "tsup src/index.ts src/bin.ts --format esm,cjs --dts --out-dir dist/node --clean",
56
- "dev": "tsx --env-file=.env src/bin.ts",
57
- "start": "node --env-file=.env dist/node/bin.js",
88
+ "build": "pnpm --filter @robota-sdk/agent-web build:spa && node scripts/copy-web-assets.mjs && tsdown",
89
+ "build:js": "tsdown --no-dts",
90
+ "build:types": "tsdown --dts",
91
+ "dev": "tsx src/bin.ts",
92
+ "start": "node dist/node/bin.js",
58
93
  "test": "vitest run --passWithNoTests",
94
+ "test:coverage": "vitest run --coverage --passWithNoTests",
59
95
  "typecheck": "tsc --noEmit",
60
96
  "lint": "eslint src/ --ext .ts,.tsx",
61
97
  "clean": "rimraf dist"