@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.
- package/dist/node/headless/index.cjs +1 -1
- package/dist/node/headless/index.js +1 -1
- package/dist/node/{headless-B8yWkXW_.js → headless-C-Ezlo9U.js} +4 -4
- package/dist/node/headless-C-Ezlo9U.js.map +1 -0
- package/dist/node/{headless-Dp3kQVmo.cjs → headless-Cv-igy49.cjs} +3 -3
- package/dist/node/index-CP7kaYMg.d.ts.map +1 -1
- package/dist/node/{index-rGmGTQ9o.d.ts → index-D-aT_t_N.d.ts} +16 -8
- package/dist/node/index-D-aT_t_N.d.ts.map +1 -0
- package/dist/node/index-Gby9H4q2.d.ts.map +1 -1
- package/dist/node/{index-CQsMNXAh.d.ts → index-ioN9mYAD.d.ts} +16 -8
- package/dist/node/index-ioN9mYAD.d.ts.map +1 -0
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +1 -1
- package/dist/node/tui/index.cjs +1 -1
- package/dist/node/tui/index.d.ts +2 -2
- package/dist/node/tui/index.js +1 -1
- package/dist/node/tui-87G6pg3z.js +25 -0
- package/dist/node/tui-87G6pg3z.js.map +1 -0
- package/dist/node/tui-BAtwGilM.cjs +24 -0
- package/package.json +7 -7
- package/src/headless/__tests__/headless-runner.test.ts +2 -0
- package/src/headless/headless-runner.ts +24 -3
- package/src/headless/headless-stream-json.ts +8 -3
- package/src/headless/print-terminal.ts +0 -1
- package/src/tui/App.tsx +16 -12
- package/src/tui/CjkTextInput.tsx +1 -3
- package/src/tui/ContextWarningBanner.tsx +34 -0
- package/src/tui/InputArea.tsx +1 -1
- package/src/tui/__tests__/command-effect-handler.test.ts +0 -1
- package/src/tui/__tests__/confirm-permission-flow.test.ts +40 -1
- package/src/tui/__tests__/session-naming.test.ts +64 -0
- package/src/tui/create-default-tui-cli-adapter.ts +2 -3
- package/src/tui/flows/permission-prompt-flow.ts +13 -4
- package/src/tui/hooks/command-effect-handler.ts +0 -5
- package/src/tui/hooks/side-effects-types.ts +0 -3
- package/src/tui/hooks/use-interactive-session-init.ts +4 -0
- package/src/tui/hooks/useInteractiveSession.ts +24 -1
- package/src/tui/hooks/useSideEffects.ts +0 -37
- package/src/tui/index.ts +1 -1
- package/src/tui/render.tsx +24 -8
- package/src/tui/session-naming.ts +33 -0
- package/src/tui/tui-transport.ts +3 -3
- package/src/tui/types.ts +3 -2
- package/dist/node/headless-B8yWkXW_.js.map +0 -1
- package/dist/node/index-CQsMNXAh.d.ts.map +0 -1
- package/dist/node/index-rGmGTQ9o.d.ts.map +0 -1
- package/dist/node/tui-B8G3yHrL.cjs +0 -24
- package/dist/node/tui-DUIfVw3G.js +0 -25
- package/dist/node/tui-DUIfVw3G.js.map +0 -1
- package/src/tui/__tests__/model-change-side-effect.test.ts +0 -91
- 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 = [
|
|
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 === '
|
|
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 {
|
|
5
|
+
export type { IRenderOptions } from './render.js';
|
|
6
6
|
export type {
|
|
7
7
|
TOnMissingArgsAction,
|
|
8
8
|
ITuiPickerItem,
|
package/src/tui/render.tsx
CHANGED
|
@@ -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 {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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:
|
|
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
|
|
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
|
+
}
|
package/src/tui/tui-transport.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { renderApp, type
|
|
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:
|
|
12
|
+
private readonly options: IRenderOptions;
|
|
13
13
|
|
|
14
|
-
constructor(options:
|
|
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),
|
|
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"}
|