@robota-sdk/agent-transport 3.0.0-beta.66 → 3.0.0-beta.68

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 (52) hide show
  1. package/dist/node/headless/index.cjs +1 -1
  2. package/dist/node/headless/index.js +1 -1
  3. package/dist/node/{headless-B8yWkXW_.js → headless-C-Ezlo9U.js} +4 -4
  4. package/dist/node/headless-C-Ezlo9U.js.map +1 -0
  5. package/dist/node/{headless-Dp3kQVmo.cjs → headless-Cv-igy49.cjs} +3 -3
  6. package/dist/node/index-CP7kaYMg.d.ts.map +1 -1
  7. package/dist/node/{index-rGmGTQ9o.d.ts → index-D-aT_t_N.d.ts} +16 -8
  8. package/dist/node/index-D-aT_t_N.d.ts.map +1 -0
  9. package/dist/node/index-Gby9H4q2.d.ts.map +1 -1
  10. package/dist/node/{index-CQsMNXAh.d.ts → index-ioN9mYAD.d.ts} +16 -8
  11. package/dist/node/index-ioN9mYAD.d.ts.map +1 -0
  12. package/dist/node/index.cjs +1 -1
  13. package/dist/node/index.d.ts +2 -2
  14. package/dist/node/index.js +1 -1
  15. package/dist/node/tui/index.cjs +1 -1
  16. package/dist/node/tui/index.d.ts +2 -2
  17. package/dist/node/tui/index.js +1 -1
  18. package/dist/node/tui-87G6pg3z.js +25 -0
  19. package/dist/node/tui-87G6pg3z.js.map +1 -0
  20. package/dist/node/tui-BAtwGilM.cjs +24 -0
  21. package/package.json +7 -7
  22. package/src/headless/__tests__/headless-runner.test.ts +2 -0
  23. package/src/headless/headless-runner.ts +24 -3
  24. package/src/headless/headless-stream-json.ts +8 -3
  25. package/src/headless/print-terminal.ts +0 -1
  26. package/src/tui/App.tsx +16 -12
  27. package/src/tui/CjkTextInput.tsx +1 -3
  28. package/src/tui/ContextWarningBanner.tsx +34 -0
  29. package/src/tui/InputArea.tsx +1 -1
  30. package/src/tui/__tests__/command-effect-handler.test.ts +0 -1
  31. package/src/tui/__tests__/confirm-permission-flow.test.ts +40 -1
  32. package/src/tui/__tests__/session-naming.test.ts +64 -0
  33. package/src/tui/create-default-tui-cli-adapter.ts +2 -3
  34. package/src/tui/flows/permission-prompt-flow.ts +13 -4
  35. package/src/tui/hooks/command-effect-handler.ts +0 -5
  36. package/src/tui/hooks/side-effects-types.ts +0 -3
  37. package/src/tui/hooks/use-interactive-session-init.ts +4 -0
  38. package/src/tui/hooks/useInteractiveSession.ts +24 -1
  39. package/src/tui/hooks/useSideEffects.ts +0 -37
  40. package/src/tui/index.ts +1 -1
  41. package/src/tui/render.tsx +24 -8
  42. package/src/tui/session-naming.ts +33 -0
  43. package/src/tui/tui-transport.ts +3 -3
  44. package/src/tui/types.ts +3 -2
  45. package/dist/node/headless-B8yWkXW_.js.map +0 -1
  46. package/dist/node/index-CQsMNXAh.d.ts.map +0 -1
  47. package/dist/node/index-rGmGTQ9o.d.ts.map +0 -1
  48. package/dist/node/tui-B8G3yHrL.cjs +0 -24
  49. package/dist/node/tui-DUIfVw3G.js +0 -25
  50. package/dist/node/tui-DUIfVw3G.js.map +0 -1
  51. package/src/tui/__tests__/model-change-side-effect.test.ts +0 -91
  52. package/src/tui/hooks/model-change-side-effect.ts +0 -63
@@ -1,4 +1,6 @@
1
1
  import { findProviderDefinition } from '@robota-sdk/agent-core';
2
+ import type { IProviderDefinition } from '@robota-sdk/agent-core';
3
+ import type { CommandRegistry } from '@robota-sdk/agent-framework';
2
4
  import {
3
5
  applyActiveModelChange,
4
6
  applyStatusLineSettings,
@@ -8,10 +10,7 @@ import {
8
10
  resolveGitBranch,
9
11
  writeSettings,
10
12
  } from '@robota-sdk/agent-framework';
11
-
12
13
  import type { ITuiCliAdapter } from './tui-cli-adapter.js';
13
- import type { IProviderDefinition } from '@robota-sdk/agent-core';
14
- import type { CommandRegistry } from '@robota-sdk/agent-framework';
15
14
 
16
15
  export interface IDefaultTuiCliAdapterOptions {
17
16
  providerDefinitions: readonly IProviderDefinition[];
@@ -6,9 +6,14 @@ import {
6
6
  type TSelectionInputAction,
7
7
  } from './selection-flow.js';
8
8
 
9
- export const PERMISSION_PROMPT_OPTIONS = ['Allow', 'Allow always (this session)', 'Deny'] as const;
9
+ export const PERMISSION_PROMPT_OPTIONS = [
10
+ 'Allow [y]',
11
+ 'Allow always (this session) [s]',
12
+ 'Allow always (this project) [p]',
13
+ 'Deny [n]',
14
+ ] as const;
10
15
 
11
- export type TPermissionPromptDecision = true | 'allow-session' | false;
16
+ export type TPermissionPromptDecision = true | 'allow-session' | 'allow-project' | false;
12
17
  export type TPermissionPromptInputAction =
13
18
  | TSelectionInputAction
14
19
  | { type: 'shortcut'; index: number };
@@ -28,12 +33,15 @@ export function getPermissionPromptInputAction(
28
33
  if (input === 'y' || input === '1') {
29
34
  return { type: 'shortcut', index: 0 };
30
35
  }
31
- if (input === 'a' || input === '2') {
36
+ if (input === 's' || input === 'a' || input === '2') {
32
37
  return { type: 'shortcut', index: 1 };
33
38
  }
34
- if (input === 'n' || input === 'd' || input === '3') {
39
+ if (input === 'p' || input === '3') {
35
40
  return { type: 'shortcut', index: 2 };
36
41
  }
42
+ if (input === 'n' || input === 'd' || input === '4') {
43
+ return { type: 'shortcut', index: 3 };
44
+ }
37
45
  return undefined;
38
46
  }
39
47
 
@@ -62,6 +70,7 @@ export function applyPermissionPromptInput(
62
70
  export function getPermissionDecision(index: number): TPermissionPromptDecision {
63
71
  if (index === 0) return true;
64
72
  if (index === 1) return 'allow-session';
73
+ if (index === 2) return 'allow-project';
65
74
  return false;
66
75
  }
67
76
 
@@ -8,7 +8,6 @@ import type { TCommandEffect, TStatusLineCommandSettingsPatch } from '@robota-sd
8
8
  export interface ICommandEffectHandlerDeps {
9
9
  addEntry: (entry: IHistoryEntry) => void;
10
10
  requestShutdown: (reason: TSessionEndReason, message: string) => void;
11
- requestModelChange: (modelId: string) => void;
12
11
  openPluginTUI: () => void;
13
12
  openSessionPicker: () => void;
14
13
  openTransportTUI: () => void;
@@ -23,10 +22,6 @@ export function applyCommandEffects(
23
22
  deps: ICommandEffectHandlerDeps,
24
23
  ): boolean {
25
24
  for (const effect of effects) {
26
- if (effect.type === 'model-change-requested') {
27
- deps.requestModelChange(effect.modelId);
28
- return true;
29
- }
30
25
  if (effect.type === 'language-change-requested') {
31
26
  applyLanguageEffect(effect.language, deps);
32
27
  return true;
@@ -23,16 +23,13 @@ export interface IUseSideEffectsOptions {
23
23
 
24
24
  export interface IUseSideEffectsResult {
25
25
  handleSubmit: (input: string) => Promise<void>;
26
- pendingModelId: string | null;
27
26
  pendingInteractionPrompt: TInteractivePrompt | null;
28
27
  showPluginTUI: boolean;
29
28
  showSessionPicker: boolean;
30
29
  showTransportTUI: boolean;
31
- setPendingModelId: (id: string | null) => void;
32
30
  setShowPluginTUI: (show: boolean) => void;
33
31
  setShowSessionPicker: (show: boolean) => void;
34
32
  setShowTransportTUI: (show: boolean) => void;
35
- handleModelConfirm: (index: number) => void;
36
33
  handleInteractionSubmit: (value: string) => Promise<void>;
37
34
  handleInteractionCancel: () => void;
38
35
  }
@@ -35,6 +35,10 @@ export function initializeSession(
35
35
  shellExec: props.shellExec,
36
36
  language: props.language,
37
37
  agentName: props.agentName,
38
+ systemPrompt: props.systemPrompt,
39
+ appendSystemPrompt: props.appendSystemPrompt,
40
+ allowedTools: props.allowedTools,
41
+ deniedTools: props.deniedTools,
38
42
  });
39
43
 
40
44
  const registry = new CommandRegistry();
@@ -1,10 +1,11 @@
1
1
  import { createSystemMessage, messageToHistoryEntry } from '@robota-sdk/agent-core';
2
- import { useState, useCallback, useEffect } from 'react';
2
+ import { useState, useCallback, useEffect, useRef } from 'react';
3
3
 
4
4
  import { CommandEffectQueue, type ICommandEffectQueue } from './command-effect-queue.js';
5
5
  import { initializeSession, type IInitState } from './use-interactive-session-init.js';
6
6
  import { usePermissionQueue } from './usePermissionQueue.js';
7
7
  import { useSlashRouting } from './useSlashRouting.js';
8
+ import { generateSessionName } from '../session-naming.js';
8
9
 
9
10
  import type { TuiStateManager } from '../tui-state-manager.js';
10
11
  import type { IPermissionRequest } from '../types.js';
@@ -41,6 +42,7 @@ export interface IInteractiveSessionProps {
41
42
  resumeSessionId?: string;
42
43
  forkSession?: boolean;
43
44
  sessionName?: string;
45
+ onAutoNamed?: (name: string) => void;
44
46
  backgroundTaskRunners?: IBackgroundTaskRunner[];
45
47
  subagentRunnerFactory?: TSubagentRunnerFactory;
46
48
  commandModules?: readonly ICommandModule[];
@@ -50,6 +52,10 @@ export interface IInteractiveSessionProps {
50
52
  language?: string;
51
53
  reloadPluginCommandSource?: (registry: CommandRegistry) => void;
52
54
  agentName?: string;
55
+ systemPrompt?: string;
56
+ appendSystemPrompt?: string;
57
+ allowedTools?: string[];
58
+ deniedTools?: string[];
53
59
  }
54
60
 
55
61
  export interface IInteractiveSessionState {
@@ -118,6 +124,7 @@ export function useInteractiveSession(props: IInteractiveSessionProps): IInterac
118
124
  const [, forceRender] = useState(0);
119
125
  const [isShuttingDown, setIsShuttingDown] = useState(false);
120
126
  const { permissionHandler, permissionRequest } = usePermissionQueue();
127
+ const autoNameTriggeredRef = useRef(false);
121
128
 
122
129
  // Initialize once — useState lazy initializer runs exactly once per mount, safe for Concurrent Mode
123
130
  const [initState] = useState<IInitState>(() => initializeSession(props, permissionHandler));
@@ -148,9 +155,24 @@ export function useInteractiveSession(props: IInteractiveSessionProps): IInterac
148
155
  const onCompact = (): void => applyCompactEventToManager(interactiveSession, manager);
149
156
  const onSkillActivation = (): void =>
150
157
  applySkillActivationEventToManager(interactiveSession, manager);
158
+
159
+ const onUserMessage = (content: string): void => {
160
+ if (autoNameTriggeredRef.current) return;
161
+ if (props.sessionName || interactiveSession.getName()) return;
162
+ autoNameTriggeredRef.current = true;
163
+ generateSessionName(props.provider, content)
164
+ .then((name) => {
165
+ interactiveSession.setName(name);
166
+ props.onAutoNamed?.(name);
167
+ })
168
+ .catch(() => {
169
+ autoNameTriggeredRef.current = false;
170
+ });
171
+ };
151
172
  const onExecutionWorkspaceEvent = (event: IExecutionWorkspaceEvent): void =>
152
173
  manager.syncExecutionWorkspaceSnapshot(event.snapshot);
153
174
 
175
+ interactiveSession.on('user_message', onUserMessage);
154
176
  interactiveSession.on('text_delta', manager.onTextDelta);
155
177
  interactiveSession.on('tool_start', manager.onToolStart);
156
178
  interactiveSession.on('tool_end', manager.onToolEnd);
@@ -186,6 +208,7 @@ export function useInteractiveSession(props: IInteractiveSessionProps): IInterac
186
208
 
187
209
  return () => {
188
210
  clearInterval(initCheck);
211
+ interactiveSession.off('user_message', onUserMessage);
189
212
  interactiveSession.off('text_delta', manager.onTextDelta);
190
213
  interactiveSession.off('tool_start', manager.onToolStart);
191
214
  interactiveSession.off('tool_end', manager.onToolEnd);
@@ -4,10 +4,6 @@ import { useState, useRef, useCallback } from 'react';
4
4
 
5
5
  import { applyCommandEffects } from './command-effect-handler.js';
6
6
  import { useTuiCliAdapter } from '../tui-cli-adapter-context.js';
7
- import {
8
- addModelChangeCancelledMessage,
9
- applyConfirmedModelChange,
10
- } from './model-change-side-effect.js';
11
7
 
12
8
  import type { IUseSideEffectsOptions, IUseSideEffectsResult } from './side-effects-types.js';
13
9
  import type { TInteractivePrompt } from './side-effects-types.js';
@@ -30,8 +26,6 @@ export function useSideEffects({
30
26
  }: IUseSideEffectsOptions): IUseSideEffectsResult {
31
27
  const { exit } = useApp();
32
28
  const cliAdapter = useTuiCliAdapter();
33
- const [pendingModelId, setPendingModelId] = useState<string | null>(null);
34
- const pendingModelChangeRef = useRef<string | null>(null);
35
29
  const [pendingInteractionPrompt, setPendingInteractionPrompt] =
36
30
  useState<TInteractivePrompt | null>(null);
37
31
  const commandInteractionRef = useRef<ICommandInteraction | null>(null);
@@ -54,10 +48,6 @@ export function useSideEffects({
54
48
  applyCommandEffects(effects, {
55
49
  addEntry,
56
50
  requestShutdown,
57
- requestModelChange: (modelId) => {
58
- pendingModelChangeRef.current = modelId;
59
- setPendingModelId(modelId);
60
- },
61
51
  openPluginTUI: () => setShowPluginTUI(true),
62
52
  openSessionPicker: () => setShowSessionPicker(true),
63
53
  openTransportTUI: () => setShowTransportTUI(true),
@@ -125,30 +115,6 @@ export function useSideEffects({
125
115
  [baseHandleSubmit, applyQueuedCommandState],
126
116
  );
127
117
 
128
- const handleModelConfirm = useCallback(
129
- (index: number) => {
130
- const modelId = pendingModelChangeRef.current;
131
- setPendingModelId(null);
132
- pendingModelChangeRef.current = null;
133
- if (index === 0 && modelId) {
134
- applyConfirmedModelChange({
135
- cwd,
136
- modelId,
137
- providerOverride,
138
- addEntry,
139
- requestShutdown,
140
- applyModelChange: (c, m, opts) => {
141
- cliAdapter.applyActiveModelChange(c, m, opts);
142
- return { applied: true };
143
- },
144
- });
145
- } else {
146
- addModelChangeCancelledMessage(addEntry);
147
- }
148
- },
149
- [cwd, providerOverride, addEntry, cliAdapter, requestShutdown],
150
- );
151
-
152
118
  const handleInteractionSubmit = useCallback(
153
119
  async (value: string): Promise<void> => {
154
120
  const interaction = commandInteractionRef.current;
@@ -196,16 +162,13 @@ export function useSideEffects({
196
162
 
197
163
  return {
198
164
  handleSubmit,
199
- pendingModelId,
200
165
  pendingInteractionPrompt,
201
166
  showPluginTUI,
202
167
  showSessionPicker,
203
168
  showTransportTUI,
204
- setPendingModelId,
205
169
  setShowPluginTUI,
206
170
  setShowSessionPicker,
207
171
  setShowTransportTUI,
208
- handleModelConfirm,
209
172
  handleInteractionSubmit,
210
173
  handleInteractionCancel,
211
174
  };
package/src/tui/index.ts CHANGED
@@ -2,7 +2,7 @@ export { TuiTransport } from './tui-transport.js';
2
2
  export type { ITuiCliAdapter } from './tui-cli-adapter.js';
3
3
  export type { IDefaultTuiCliAdapterOptions } from './create-default-tui-cli-adapter.js';
4
4
  export { createDefaultTuiCliAdapter } from './create-default-tui-cli-adapter.js';
5
- export type { ITuiRenderOptions } from './render.js';
5
+ export type { IRenderOptions } from './render.js';
6
6
  export type {
7
7
  TOnMissingArgsAction,
8
8
  ITuiPickerItem,
@@ -8,13 +8,23 @@ import React from 'react';
8
8
  import App from './App.js';
9
9
 
10
10
  import type { ITuiCliAdapter } from './tui-cli-adapter.js';
11
+ import type { IAIProvider } from '@robota-sdk/agent-core';
11
12
  import type { TPermissionMode } from '@robota-sdk/agent-core';
12
- import type { IAgentRuntime } from '@robota-sdk/agent-framework';
13
- import type { TShellExecFn } from '@robota-sdk/agent-framework';
14
-
15
- export interface ITuiRenderOptions {
16
- runtime: IAgentRuntime;
13
+ import type {
14
+ IBackgroundTaskRunner,
15
+ ICommandHostAdapters,
16
+ ICommandModule,
17
+ IInteractiveSession,
18
+ IInteractiveSessionStore,
19
+ TSubagentRunnerFactory,
20
+ TShellExecFn,
21
+ CommandRegistry,
22
+ } from '@robota-sdk/agent-framework';
23
+ import type { ITransportRegistryView } from '@robota-sdk/agent-interface-transport';
17
24
 
25
+ export interface IRenderOptions {
26
+ cwd: string;
27
+ provider: IAIProvider;
18
28
  providerOverride?: string | undefined;
19
29
  providerType?: string | undefined;
20
30
  modelId?: string;
@@ -22,17 +32,24 @@ export interface ITuiRenderOptions {
22
32
  permissionMode?: TPermissionMode;
23
33
  maxTurns?: number;
24
34
  version?: string;
35
+ sessionStore?: IInteractiveSessionStore;
25
36
  resumeSessionId?: string;
26
37
  showSessionPickerOnStart?: boolean;
27
38
  forkSession?: boolean;
28
39
  sessionName?: string;
40
+ backgroundTaskRunners?: IBackgroundTaskRunner[];
41
+ subagentRunnerFactory?: TSubagentRunnerFactory;
42
+ commandModules?: readonly ICommandModule[];
43
+ commandHostAdapters?: ICommandHostAdapters;
29
44
  shellExec?: TShellExecFn;
30
45
  startupUpdateNotice?: Promise<string | undefined>;
46
+ transportRegistry?: ITransportRegistryView<IInteractiveSession>;
31
47
  cliAdapter: ITuiCliAdapter;
48
+ reloadPluginCommandSource?: (registry: CommandRegistry) => void;
32
49
  agentName?: string;
33
50
  }
34
51
 
35
- export async function renderApp(options: ITuiRenderOptions): Promise<void> {
52
+ export async function renderApp(options: IRenderOptions): Promise<void> {
36
53
  process.on('unhandledRejection', (reason) => {
37
54
  process.stderr.write(`\n[UNHANDLED REJECTION] ${reason}\n`);
38
55
  if (reason instanceof Error) {
@@ -40,7 +57,6 @@ export async function renderApp(options: ITuiRenderOptions): Promise<void> {
40
57
  }
41
58
  });
42
59
 
43
- const { runtime, ...tuiOptions } = options;
44
- const instance = render(<App {...runtime} {...tuiOptions} />, { exitOnCtrlC: false });
60
+ const instance = render(<App {...options} />, { exitOnCtrlC: false });
45
61
  await instance.waitUntilExit();
46
62
  }
@@ -0,0 +1,33 @@
1
+ import { createSystemMessage, createUserMessage } from '@robota-sdk/agent-core';
2
+
3
+ import type { IAIProvider } from '@robota-sdk/agent-core';
4
+
5
+ const SYSTEM_PROMPT =
6
+ 'You generate short session titles. Respond with ONLY a 3-5 word lowercase-hyphenated title (e.g. refactor-auth-middleware). No explanation, no punctuation, no quotes.';
7
+
8
+ const MAX_FIRST_MESSAGE_CHARS = 200;
9
+
10
+ function sanitizeName(raw: string): string {
11
+ return raw
12
+ .toLowerCase()
13
+ .replace(/[^a-z0-9\s-]/g, '')
14
+ .trim()
15
+ .replace(/\s+/g, '-')
16
+ .replace(/-+/g, '-')
17
+ .slice(0, 60);
18
+ }
19
+
20
+ export async function generateSessionName(
21
+ provider: IAIProvider,
22
+ firstMessage: string,
23
+ ): Promise<string> {
24
+ const truncated = firstMessage.slice(0, MAX_FIRST_MESSAGE_CHARS);
25
+ const response = await provider.chat(
26
+ [createSystemMessage(SYSTEM_PROMPT), createUserMessage(truncated)],
27
+ { maxTokens: 20 },
28
+ );
29
+ const raw = typeof response.content === 'string' ? response.content : '';
30
+ const name = sanitizeName(raw);
31
+ if (!name || name.length < 3) return sanitizeName(firstMessage);
32
+ return name;
33
+ }
@@ -1,4 +1,4 @@
1
- import { renderApp, type ITuiRenderOptions } from './render.js';
1
+ import { renderApp, type IRenderOptions } from './render.js';
2
2
 
3
3
  import type { TUniversalValue } from '@robota-sdk/agent-core';
4
4
  import type { IInteractiveSession } from '@robota-sdk/agent-framework';
@@ -9,9 +9,9 @@ export class TuiTransport implements IConfigurableTransport<IInteractiveSession>
9
9
  readonly defaultEnabled = true;
10
10
  readonly optionsSchema = {};
11
11
 
12
- private readonly options: ITuiRenderOptions;
12
+ private readonly options: IRenderOptions;
13
13
 
14
- constructor(options: ITuiRenderOptions) {
14
+ constructor(options: IRenderOptions) {
15
15
  this.options = options;
16
16
  }
17
17
 
package/src/tui/types.ts CHANGED
@@ -3,9 +3,10 @@
3
3
  import type { TToolArgs } from '@robota-sdk/agent-core';
4
4
 
5
5
  /**
6
- * Permission result: true (allow once), false (deny), or 'allow-session' (remember for session).
6
+ * Permission result: true (allow once), false (deny), 'allow-session' (remember for session),
7
+ * or 'allow-project' (persist to .robota/settings.local.json).
7
8
  */
8
- export type TPermissionResult = boolean | 'allow-session';
9
+ export type TPermissionResult = boolean | 'allow-session' | 'allow-project';
9
10
 
10
11
  export interface IPermissionRequest {
11
12
  toolName: string;
@@ -1 +0,0 @@
1
- {"version":3,"file":"headless-B8yWkXW_.js","names":[],"sources":["../../src/headless/print-terminal.ts","../../src/headless/cli-input.ts","../../src/headless/headless-stream-json.ts","../../src/headless/headless-runner.ts","../../src/headless/headless-transport.ts"],"sourcesContent":["/**\n * ITerminalOutput implementation for print mode (-p).\n *\n * Writes to stdout/stderr directly. The readline-based prompt and select are\n * only invoked if the agent triggers a permission-gated tool, which is rare in\n * one-shot print mode but must still work correctly.\n */\n\nimport * as readline from 'node:readline';\n\nimport type { ITerminalOutput, ISpinner } from '@robota-sdk/agent-core';\n\nexport class PrintTerminal implements ITerminalOutput {\n write(text: string): void {\n process.stdout.write(text);\n }\n writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n }\n writeMarkdown(md: string): void {\n process.stdout.write(md);\n }\n writeError(text: string): void {\n process.stderr.write(text + '\\n');\n }\n prompt(question: string): Promise<string> {\n return new Promise<string>((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n historySize: 0,\n });\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n }\n async select(options: string[], initialIndex = 0): Promise<number> {\n for (let i = 0; i < options.length; i++) {\n const marker = i === initialIndex ? '>' : ' ';\n process.stdout.write(` ${marker} ${i + 1}) ${options[i]}\\n`);\n }\n const answer = await this.prompt(\n ` Choose [1-${options.length}] (default: ${options[initialIndex]}): `,\n );\n const trimmed = answer.trim().toLowerCase();\n if (trimmed === '') return initialIndex;\n const num = parseInt(trimmed, 10);\n if (!isNaN(num) && num >= 1 && num <= options.length) return num - 1;\n return initialIndex;\n }\n spinner(_message: string): ISpinner {\n return { stop(): void {}, update(): void {} };\n }\n}\n","const PRINTABLE_ASCII_START = 32;\n\nexport const promptInput = (label: string, masked = false): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n process.stdout.write(label);\n let input = '';\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n if (!stdin.isTTY) {\n reject(\n new Error(\n 'Cannot prompt for input: stdin is not a TTY.\\n' +\n 'Set your API key via environment variable instead:\\n' +\n ' ANTHROPIC_API_KEY=<key> robota\\n' +\n ' OPENAI_API_KEY=<key> robota',\n ),\n );\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n const onData = (data: string): void => {\n for (const ch of data) {\n if (ch === '\\r' || ch === '\\n') {\n stdin.removeListener('data', onData);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stdout.write('\\n');\n resolve(input.trim());\n return;\n } else if (ch === '\\x7f' || ch === '\\b') {\n if (input.length > 0) {\n input = input.slice(0, -1);\n process.stdout.write('\\b \\b');\n }\n } else if (ch === '\\x03') {\n stdin.removeListener('data', onData);\n stdin.setRawMode(wasRaw ?? false);\n stdin.pause();\n process.stdout.write('\\n');\n process.exit(0);\n } else if (ch.charCodeAt(0) >= PRINTABLE_ASCII_START) {\n input += ch;\n process.stdout.write(masked ? '*' : ch);\n }\n }\n };\n stdin.on('data', onData);\n });\n","import { randomUUID } from 'node:crypto';\n\nimport type {\n IInteractiveSession,\n IExecutionResult,\n ICommandResult,\n TBackgroundJobGroupEvent,\n TBackgroundTaskEvent,\n} from '@robota-sdk/agent-framework';\n\ntype TSlashCommandExecution =\n | { readonly kind: 'not-slash' }\n | { readonly kind: 'command-result'; readonly result: ICommandResult }\n | { readonly kind: 'session-execution' };\n\nfunction parseSlashCommand(prompt: string): { name: string; args: string } | null {\n const trimmed = prompt.trimStart();\n if (!trimmed.startsWith('/')) return null;\n const withoutSlash = trimmed.slice(1);\n const [name = '', ...args] = withoutSlash.split(/\\s+/);\n if (name.length === 0) return null;\n return { name, args: args.join(' ') };\n}\n\nexport async function executeSlashCommandIfPresent(\n session: IInteractiveSession,\n prompt: string,\n): Promise<TSlashCommandExecution> {\n const command = parseSlashCommand(prompt);\n if (!command) return { kind: 'not-slash' };\n\n const result = await session.executeCommand(command.name, command.args);\n if (result) {\n if (result.effects?.some((effect) => effect.type === 'session-execution-started')) {\n return { kind: 'session-execution' };\n }\n return { kind: 'command-result', result };\n }\n return {\n kind: 'command-result',\n result: { message: `Unknown command \"/${command.name}\".`, success: false },\n };\n}\n\ntype TStreamJsonEvent =\n | {\n type: 'content_block_delta';\n delta: { type: 'text_delta'; text: string };\n }\n | {\n type: 'background_task_event';\n background_task_event: TBackgroundTaskEvent;\n }\n | {\n type: 'background_job_group_event';\n background_job_group_event: TBackgroundJobGroupEvent;\n };\n\ninterface IStreamJsonHandlers {\n onTextDelta: (text: string) => void;\n onBackgroundTaskEvent: (event: TBackgroundTaskEvent) => void;\n onBackgroundJobGroupEvent: (event: TBackgroundJobGroupEvent) => void;\n onComplete: (result: IExecutionResult) => void;\n onInterrupted: (result: IExecutionResult) => void;\n onError: (error: Error) => void;\n}\n\nexport function writeStreamJsonEvent(\n session: IInteractiveSession,\n getSessionId: (s: IInteractiveSession) => string,\n event: TStreamJsonEvent,\n): void {\n const output = JSON.stringify({\n type: 'stream_event',\n event,\n session_id: getSessionId(session),\n uuid: randomUUID(),\n });\n process.stdout.write(output + '\\n');\n}\n\nexport function subscribeStreamJsonEvents(\n session: IInteractiveSession,\n getSessionId: (s: IInteractiveSession) => string,\n writeJsonResult: (sessionId: string, result: string, subtype: 'success' | 'error') => void,\n resolve: (exitCode: number) => void,\n): () => void {\n const emit = (event: TStreamJsonEvent): void =>\n writeStreamJsonEvent(session, getSessionId, event);\n\n const onTextDelta = (text: string): void =>\n emit({ type: 'content_block_delta', delta: { type: 'text_delta', text } });\n const onBackgroundTaskEvent = (event: TBackgroundTaskEvent): void =>\n emit({ type: 'background_task_event', background_task_event: event });\n const onBackgroundJobGroupEvent = (event: TBackgroundJobGroupEvent): void =>\n emit({ type: 'background_job_group_event', background_job_group_event: event });\n\n const cleanup = (): void =>\n unsubscribeStreamJsonEvents(session, {\n onTextDelta,\n onBackgroundTaskEvent,\n onBackgroundJobGroupEvent,\n onComplete,\n onInterrupted,\n onError,\n });\n\n const onComplete = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onInterrupted = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onError = (_error: Error): void => {\n cleanup();\n writeJsonResult(getSessionId(session), '', 'error');\n resolve(1);\n };\n\n session.on('text_delta', onTextDelta);\n session.on('background_task_event', onBackgroundTaskEvent);\n session.on('background_job_group_event', onBackgroundJobGroupEvent);\n session.on('complete', onComplete);\n session.on('interrupted', onInterrupted);\n session.on('error', onError);\n return cleanup;\n}\n\nfunction unsubscribeStreamJsonEvents(\n session: IInteractiveSession,\n handlers: IStreamJsonHandlers,\n): void {\n session.off('text_delta', handlers.onTextDelta);\n session.off('background_task_event', handlers.onBackgroundTaskEvent);\n session.off('background_job_group_event', handlers.onBackgroundJobGroupEvent);\n session.off('complete', handlers.onComplete);\n session.off('interrupted', handlers.onInterrupted);\n session.off('error', handlers.onError);\n}\n","import { executeSlashCommandIfPresent, subscribeStreamJsonEvents } from './headless-stream-json.js';\n\nimport type { IInteractiveSession, IExecutionResult } from '@robota-sdk/agent-framework';\n\nexport type TOutputFormat = 'text' | 'json' | 'stream-json';\n\nexport interface IHeadlessRunnerOptions {\n session: IInteractiveSession;\n outputFormat: TOutputFormat;\n}\n\nexport function createHeadlessRunner(options: IHeadlessRunnerOptions): {\n run: (prompt: string) => Promise<number>;\n} {\n const { session, outputFormat } = options;\n return {\n run: (prompt: string): Promise<number> => {\n if (outputFormat === 'text') return runTextFormat(session, prompt);\n if (outputFormat === 'json') return runJsonFormat(session, prompt);\n return runStreamJsonFormat(session, prompt);\n },\n };\n}\n\nexport function writeJsonResult(\n sessionId: string,\n result: string,\n subtype: 'success' | 'error',\n): void {\n const output = JSON.stringify({ type: 'result', result, session_id: sessionId, subtype });\n process.stdout.write(output + '\\n');\n}\n\nexport function getSessionId(session: IInteractiveSession): string {\n try {\n return session.getSession().getSessionId();\n } catch {\n // allow-fallback: session may not be initialized yet\n return '';\n }\n}\n\nfunction runTextFormat(session: IInteractiveSession, prompt: string): Promise<number> {\n return new Promise<number>((resolve) => {\n const cleanup = (): void => {\n session.off('complete', onComplete);\n session.off('interrupted', onInterrupted);\n session.off('error', onError);\n };\n const onComplete = (result: IExecutionResult): void => {\n cleanup();\n process.stdout.write(result.response + '\\n');\n resolve(0);\n };\n const onInterrupted = (result: IExecutionResult): void => {\n cleanup();\n if (result.response) process.stdout.write(result.response + '\\n');\n resolve(0);\n };\n const onError = (_error: Error): void => {\n cleanup();\n resolve(1);\n };\n\n session.on('complete', onComplete);\n session.on('interrupted', onInterrupted);\n session.on('error', onError);\n\n void executeSlashCommandIfPresent(session, prompt).then((cmd) => {\n if (cmd.kind === 'command-result') {\n cleanup();\n process.stdout.write(cmd.result.message + '\\n');\n resolve(cmd.result.success ? 0 : 1);\n return;\n }\n if (cmd.kind !== 'session-execution') void session.submit(prompt);\n });\n });\n}\n\nfunction runJsonFormat(session: IInteractiveSession, prompt: string): Promise<number> {\n return new Promise<number>((resolve) => {\n const cleanup = (): void => {\n session.off('complete', onComplete);\n session.off('interrupted', onInterrupted);\n session.off('error', onError);\n };\n const onComplete = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onInterrupted = (result: IExecutionResult): void => {\n cleanup();\n writeJsonResult(getSessionId(session), result.response, 'success');\n resolve(0);\n };\n const onError = (_error: Error): void => {\n cleanup();\n writeJsonResult(getSessionId(session), '', 'error');\n resolve(1);\n };\n\n session.on('complete', onComplete);\n session.on('interrupted', onInterrupted);\n session.on('error', onError);\n\n void executeSlashCommandIfPresent(session, prompt).then((cmd) => {\n if (cmd.kind === 'command-result') {\n cleanup();\n writeJsonResult(\n getSessionId(session),\n cmd.result.message,\n cmd.result.success ? 'success' : 'error',\n );\n resolve(cmd.result.success ? 0 : 1);\n return;\n }\n if (cmd.kind !== 'session-execution') void session.submit(prompt);\n });\n });\n}\n\nfunction runStreamJsonFormat(session: IInteractiveSession, prompt: string): Promise<number> {\n return new Promise<number>((resolve) => {\n const cleanup = subscribeStreamJsonEvents(session, getSessionId, writeJsonResult, resolve);\n\n void executeSlashCommandIfPresent(session, prompt).then((cmd) => {\n if (cmd.kind === 'command-result') {\n cleanup();\n writeJsonResult(\n getSessionId(session),\n cmd.result.message,\n cmd.result.success ? 'success' : 'error',\n );\n resolve(cmd.result.success ? 0 : 1);\n return;\n }\n if (cmd.kind !== 'session-execution') void session.submit(prompt);\n });\n });\n}\n","/**\n * ITransportAdapter implementation for headless transport.\n *\n * Wraps createHeadlessRunner into the unified ITransportAdapter interface.\n * After start() completes, getExitCode() returns the runner's exit code.\n */\n\nimport { createHeadlessRunner } from './headless-runner.js';\n\nimport type { TOutputFormat } from './headless-runner.js';\nimport type { IInteractiveSession } from '@robota-sdk/agent-framework';\nimport type { ITransportAdapter } from '@robota-sdk/agent-interface-transport';\n\nexport interface IHeadlessTransportOptions {\n /** Output format: 'text', 'json', or 'stream-json'. */\n outputFormat: TOutputFormat;\n /** The prompt to execute. */\n prompt: string;\n}\n\nexport function createHeadlessTransport(\n options: IHeadlessTransportOptions,\n): ITransportAdapter<IInteractiveSession> & { getExitCode(): number } {\n let session: IInteractiveSession | null = null;\n let exitCode = 0;\n\n return {\n name: 'headless',\n attach(s: IInteractiveSession) {\n session = s;\n },\n async start() {\n if (!session) throw new Error('No session attached. Call attach() first.');\n const runner = createHeadlessRunner({ session, outputFormat: options.outputFormat });\n exitCode = await runner.run(options.prompt);\n },\n async stop() {\n /* no-op: headless runner completes in start() */\n },\n getExitCode() {\n return exitCode;\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CQsMNXAh.d.ts","names":[],"sources":["../../src/tui/tui-cli-adapter.ts","../../src/tui/render.tsx","../../src/tui/tui-transport.ts","../../src/tui/create-default-tui-cli-adapter.ts"],"mappings":";;;;;;UAOiB,cAAA;EACf,mBAAA;EACA,YAAA,CAAa,IAAA,WAAe,MAAA,SAAe,eAAA;EAC3C,aAAA,CAAc,IAAA,UAAc,QAAA,EAAU,MAAA,SAAe,eAAA;EACrD,cAAA,CAAe,IAAA;EACf,uBAAA,CACE,IAAA,UACA,KAAA,EAAO,+BAAA,GACN,0BAAA;EACH,yBAAA,CAA0B,QAAA,EAAU,eAAA;EACpC,sBAAA,CACE,GAAA,UACA,OAAA,UACA,OAAA;IAAY,gBAAA;EAAA;IACT,OAAA;EAAA;EACL,YAAA,CAAa,GAAA;EACb,sBAAA,CAAuB,IAAA;AAAA;;;UCTR,iBAAA;EACf,OAAA,EAAS,aAAA;EAET,gBAAA;EACA,YAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA,GAAiB,eAAA;EACjB,QAAA;EACA,OAAA;EACA,eAAA;EACA,wBAAA;EACA,WAAA;EACA,WAAA;EACA,SAAA,GAAY,YAAA;EACZ,mBAAA,GAAsB,OAAA;EACtB,UAAA,EAAY,cAAA;EACZ,SAAA;AAAA;;;cCzBW,YAAA,YAAwB,sBAAA,CAAuB,mBAAA;EAAA,SACjD,IAAA;EAAA,SACA,cAAA;EAAA,SACA,aAAA;EAAA,iBAEQ,OAAA;cAEL,OAAA,EAAS,iBAAA;EAIrB,MAAA,CAAO,QAAA,EAAU,mBAAA;EAIX,KAAA,CAAA,GAAS,OAAA;EAIT,IAAA,CAAA,GAAQ,OAAA;EAId,eAAA,CAAgB,QAAA,EAAU,MAAA,SAAe,eAAA;AAAA;;;UCd1B,4BAAA;EACf,mBAAA,WAA8B,mBAAA;EAC9B,yBAAA,GAA4B,QAAA,EAAU,eAAe;AAAA;AAAA,iBAGvC,0BAAA,CAAA;EACd,mBAAA;EACA;AAAA,GACC,4BAAA,GAA+B,cAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-rGmGTQ9o.d.ts","names":[],"sources":["../../src/tui/tui-cli-adapter.ts","../../src/tui/render.tsx","../../src/tui/tui-transport.ts","../../src/tui/create-default-tui-cli-adapter.ts"],"mappings":";;;;;;UAOiB,cAAA;EACf,mBAAA;EACA,YAAA,CAAa,IAAA,WAAe,MAAA,SAAe,eAAA;EAC3C,aAAA,CAAc,IAAA,UAAc,QAAA,EAAU,MAAA,SAAe,eAAA;EACrD,cAAA,CAAe,IAAA;EACf,uBAAA,CACE,IAAA,UACA,KAAA,EAAO,+BAAA,GACN,0BAAA;EACH,yBAAA,CAA0B,QAAA,EAAU,eAAA;EACpC,sBAAA,CACE,GAAA,UACA,OAAA,UACA,OAAA;IAAY,gBAAA;EAAA;IACT,OAAA;EAAA;EACL,YAAA,CAAa,GAAA;EACb,sBAAA,CAAuB,IAAA;AAAA;;;UCTR,iBAAA;EACf,OAAA,EAAS,aAAA;EAET,gBAAA;EACA,YAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA,GAAiB,eAAA;EACjB,QAAA;EACA,OAAA;EACA,eAAA;EACA,wBAAA;EACA,WAAA;EACA,WAAA;EACA,SAAA,GAAY,YAAA;EACZ,mBAAA,GAAsB,OAAA;EACtB,UAAA,EAAY,cAAA;EACZ,SAAA;AAAA;;;cCzBW,YAAA,YAAwB,sBAAA,CAAuB,mBAAA;EAAA,SACjD,IAAA;EAAA,SACA,cAAA;EAAA,SACA,aAAA;EAAA,iBAEQ,OAAA;cAEL,OAAA,EAAS,iBAAA;EAIrB,MAAA,CAAO,QAAA,EAAU,mBAAA;EAIX,KAAA,CAAA,GAAS,OAAA;EAIT,IAAA,CAAA,GAAQ,OAAA;EAId,eAAA,CAAgB,QAAA,EAAU,MAAA,SAAe,eAAA;AAAA;;;UCd1B,4BAAA;EACf,mBAAA,WAA8B,mBAAA;EAC9B,yBAAA,GAA4B,QAAA,EAAU,eAAe;AAAA;AAAA,iBAGvC,0BAAA,CAAA;EACd,mBAAA;EACA;AAAA,GACC,4BAAA,GAA+B,cAAA"}