@robota-sdk/agent-ui-terminal 3.0.0-beta.82 → 3.0.0-beta.84
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/CHANGELOG.md +893 -0
- package/README.md +34 -11
- package/dist/node/index.d.ts +205 -55
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +21 -21
- package/dist/node/index.js.map +1 -1
- package/package.json +19 -23
- package/src/App.tsx +14 -3
- package/src/AppPresentation.tsx +1 -1
- package/src/PermissionPrompt.tsx +73 -23
- package/src/SessionPicker.tsx +27 -7
- package/src/SessionStatusBar.tsx +6 -2
- package/src/StatusBar.tsx +24 -0
- package/src/SupervisedSessionView.tsx +568 -161
- package/src/TuiInteractionChannel.ts +17 -54
- package/src/__tests__/SupervisedSessionView-render.test.tsx +28 -0
- package/src/__tests__/SupervisedSessionView.test.tsx +561 -82
- package/src/__tests__/TuiInteractionChannel.display-contract.test.ts +32 -22
- package/src/__tests__/TuiInteractionChannel.lifecycle.test.ts +10 -2
- package/src/__tests__/attached-app-session-switch.test.tsx +317 -0
- package/src/__tests__/checkpoint-store-per-channel.test.ts +81 -0
- package/src/__tests__/command-handoff-pty-e2e.test.ts +2 -2
- package/src/__tests__/default-tui-cli-adapter-host-settings.test.ts +3 -1
- package/src/__tests__/fixtures/command-handoff-driver.tsx +8 -5
- package/src/__tests__/grant-history-reaches-the-session.test.ts +31 -0
- package/src/__tests__/helpers/terminal-profiles.ts +4 -4
- package/src/__tests__/numbered-selection-chunk.test.tsx +41 -0
- package/src/__tests__/palette-consistency.test.ts +0 -1
- package/src/__tests__/permission-prompt-arming.test.tsx +153 -0
- package/src/__tests__/permission-prompt-requester.test.tsx +34 -0
- package/src/__tests__/pty/behavior-2437-git.ptytest.ts +11 -3
- package/src/__tests__/pty/screen-005-prompt-footers.ptytest.ts +2 -1
- package/src/__tests__/pty/screen-006-no-color.ptytest.ts +2 -0
- package/src/__tests__/pty/session-attach.ptytest.ts +144 -0
- package/src/__tests__/pty/trust-prompt.ptytest.ts +134 -0
- package/src/__tests__/render-channel-options.test.ts +6 -6
- package/src/__tests__/sandbox-reaches-the-session.test.ts +37 -0
- package/src/__tests__/screen-reader-menus.test.tsx +1 -1
- package/src/__tests__/session-picker.test.tsx +93 -0
- package/src/__tests__/status-bar.test.tsx +8 -0
- package/src/__tests__/tui-channel-init-failure.test.ts +10 -2
- package/src/__tests__/tui-interaction-queues.test.ts +10 -0
- package/src/__tests__/tui-state-manager.test.ts +31 -0
- package/src/__tests__/wire-tui-channel.test.ts +1457 -0
- package/src/__tests__/wire-tui-client-commands.test.ts +243 -0
- package/src/app-view-model.ts +6 -2
- package/src/attached-session-connection.ts +14 -0
- package/src/hooks/__tests__/use-app-detach-key.test.tsx +72 -0
- package/src/hooks/__tests__/use-app-loop-escape.test.tsx +13 -0
- package/src/hooks/useAppController.ts +6 -2
- package/src/hooks/useAppInputBindings.ts +20 -2
- package/src/hooks/useAppInteractionState.ts +3 -0
- package/src/hooks/useAppOverlays.ts +20 -4
- package/src/hooks/useNumberedSelection.ts +19 -2
- package/src/hooks/useTuiChannel.ts +13 -1
- package/src/index.ts +19 -3
- package/src/render.tsx +218 -27
- package/src/short-session-id.ts +9 -0
- package/src/slash-command-input.ts +11 -0
- package/src/tui-app-channel-port.ts +29 -1
- package/src/tui-channel-options.ts +11 -2
- package/src/tui-interaction-queues.ts +9 -1
- package/src/tui-session-event-projector.ts +12 -3
- package/src/tui-session-events.ts +6 -0
- package/src/tui-session-options.ts +9 -0
- package/src/tui-state-manager.ts +25 -5
- package/src/types.ts +3 -1
- package/src/waiting-loop-stop-notice.ts +23 -0
- package/src/wire-history-sync.ts +159 -0
- package/src/wire-tui-channel.ts +963 -0
- package/src/wire-tui-client-commands.ts +142 -0
- package/src/wire-tui-projection.ts +136 -0
- package/dist/node/index.cjs +0 -32
- package/dist/node/index.d.cts +0 -1066
- package/dist/node/index.d.cts.map +0 -1
package/README.md
CHANGED
|
@@ -1,7 +1,34 @@
|
|
|
1
1
|
# @robota-sdk/agent-ui-terminal
|
|
2
2
|
|
|
3
|
-
React + Ink terminal UI
|
|
4
|
-
`TuiInteractionChannel`; it is not a borrowed-session `ITransportAdapter`.
|
|
3
|
+
React + Ink terminal UI for the Robota SDK — the interactive renderer the `robota` CLI uses. It owns its
|
|
4
|
+
interactive session through `TuiInteractionChannel`; it is not a borrowed-session `ITransportAdapter`.
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install @robota-sdk/agent-ui-terminal
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The package is ESM-only: use `import` or `import()`. It has no `require()` entry, because Ink loads
|
|
13
|
+
`yoga-layout`, which starts with a top-level `await` that `require()` cannot run.
|
|
14
|
+
|
|
15
|
+
## Entry points
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-ui-terminal';
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- `renderApp(options)` — render the full TUI on a session this process builds and owns.
|
|
22
|
+
- `renderAttachedApp(options)` — render the full TUI as a thin client of a session another host (a
|
|
23
|
+
workspace daemon) runs. Leaving only detaches; the session keeps running.
|
|
24
|
+
- `renderSupervisedSessionView(options)` — the list view of supervised sessions behind
|
|
25
|
+
`robota session view`.
|
|
26
|
+
- `TuiInteractionChannel` — the session-owning interaction channel `renderApp` builds.
|
|
27
|
+
- `createDefaultTuiCliAdapter(options)` — the default settings/plugin seam the renderer reads through.
|
|
28
|
+
- Theme and key-binding helpers (`createThemeRegistry`, `createThemeCataloguePort`,
|
|
29
|
+
`createNodeKeybindingsSource`) for the host that composes `/theme` and `/keybindings`.
|
|
30
|
+
|
|
31
|
+
## Session behavior
|
|
5
32
|
|
|
6
33
|
The channel consumes the exhaustive shared session-event map directly. Plan, context-refresh, and branch
|
|
7
34
|
events render as bounded operational notices outside canonical conversation history. A TUI projection
|
|
@@ -10,18 +37,14 @@ does not reverse the already-committed session operation.
|
|
|
10
37
|
|
|
11
38
|
`IRenderOptions.projectAccess` carries the host's trusted-or-restricted project decision through
|
|
12
39
|
`renderApp` into `TuiInteractionChannel`. `cwd` alone never enables project discovery; omission is
|
|
13
|
-
Restricted. Checkpoint mutation is separately opt-in through `
|
|
40
|
+
Restricted. Checkpoint mutation is separately opt-in through `createEditCheckpointStore`, which
|
|
41
|
+
builds each session its own store.
|
|
14
42
|
|
|
15
43
|
The status bar projects the session's active model-effort level next to the provider/model when the
|
|
16
44
|
session exposes it. This is a read-only view of session state and remains separate from thinking
|
|
17
45
|
display settings.
|
|
18
46
|
|
|
19
|
-
|
|
20
|
-
import { renderApp, createDefaultTuiCliAdapter } from '@robota-sdk/agent-ui-terminal';
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
See [docs/SPEC.md](./docs/SPEC.md) for the full contract.
|
|
47
|
+
## Documentation
|
|
24
48
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
[test strategy](./docs/SPEC.md) for runtime verification and isolation constraints.
|
|
49
|
+
See [docs/SPEC.md](./docs/SPEC.md) for the full contract, including the attached-client rules, theme
|
|
50
|
+
and screen-reader behavior, and teardown. PTY test helpers live in `src/__tests__/pty/`; they are internal and not exported.
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { CommandRegistry, EditCheckpointStore, IAgentDefinition, IAutomaticMemoryConfig, IBackgroundTaskRunner, ICommandHostAdapters, ICommandModule, IContributionSource, ICreateSessionOptions, ILivePromptTracePort, IMemoryStore, INodeHostSettingsSource, IOrgPolicy, IOutputStylePrompt, IPerTurnRecallConfig, IProjectSettingsPath, IPromptHistoryOptions, IProviderErrorGuidance, IRemoteCommandPolicy, ISkillRootDescriptor, IToolCallHandoffPolicy, InteractiveSession, TSettingsSource, TShellExecFn, TSubagentRunnerFactory, TWorkspaceProjectAccess } from "@robota-sdk/agent-framework";
|
|
2
|
+
import { CommandRegistry, EditCheckpointStore, IAgentDefinition, IAutomaticMemoryConfig, IBackgroundTaskRunner, ICommandHostAdapters, ICommandHostTerminalHandoff, ICommandHostWorkspace, ICommandModule, IContributionSource, ICreateSessionOptions, ILivePromptTracePort, IMemoryStore, INodeHostSettingsSource, IOrgPolicy, IOutputStylePrompt, IPerTurnRecallConfig, IProjectSettingsPath, IPromptHistoryOptions, IProviderErrorGuidance, IRemoteCommandPolicy, ISkillRootDescriptor, IToolCallHandoffPolicy, InteractiveSession, TInteractiveSessionOptions, TSettingsSource, TShellExecFn, TSubagentRunnerFactory, TWorkspaceProjectAccess } from "@robota-sdk/agent-framework";
|
|
3
3
|
import { IAIProvider, IActionRequest, IContextWindowState, IHistoryEntry, IProviderDefinition, IToolWithEventService, TActionResponse, TModelEffortSelection, TPermissionMode, TSessionEndReason, TToolArgs, TUniversalValue } from "@robota-sdk/agent-core";
|
|
4
|
-
import { IBranchEvent, ICommandInfo, IContextFileRefreshedEvent, IExecutionResult, IInteractiveSession, IInteractiveSessionEvents, IInteractiveSessionStore, IPlanApprovalEvent, IPromptHistorySource, ITerminalHandoff, IToolState, TInteractiveEventName, TPermissionResultValue } from "@robota-sdk/agent-interface-session";
|
|
4
|
+
import { IBranchEvent, ICommandInfo, IContextFileRefreshedEvent, IExecutionResult, IInteractiveSession, IInteractiveSessionEvents, IInteractiveSessionStore, IPlanApprovalEvent, IPromptHistorySource, ISessionListingEntry, ITerminalHandoff, IToolState, TInteractiveEventName, TPermissionRequester, TPermissionResultValue } from "@robota-sdk/agent-interface-session";
|
|
5
|
+
import { TClientMessage, TServerMessage } from "@robota-sdk/agent-transport/client";
|
|
5
6
|
import { IExecutionDetailPage, IExecutionWorkspaceSnapshot } from "@robota-sdk/agent-interface-execution";
|
|
6
|
-
import { ICommand, IThemeAppearanceState, IThemeCataloguePort, TReducedMotionOverride } from "@robota-sdk/agent-interface-command";
|
|
7
|
+
import { ICommand, ICommandResult, IThemeAppearanceState, IThemeCataloguePort, TAppearanceSettingsPatch, TReducedMotionOverride } from "@robota-sdk/agent-interface-command";
|
|
7
8
|
import { ITransportRegistryView } from "@robota-sdk/agent-interface-transport";
|
|
8
9
|
import { ITuiCommandInteraction, ITuiConfirmInteraction, ITuiPickerInteraction, ITuiPickerItem, TAnyTuiCommandInteraction, TOnMissingArgsAction } from "@robota-sdk/agent-interface-tui";
|
|
9
10
|
//#region src/screen-reader-pacing.d.ts
|
|
@@ -26,6 +27,45 @@ interface ITerminalCapabilityOverrides {
|
|
|
26
27
|
readonly turnMarks?: boolean | undefined;
|
|
27
28
|
}
|
|
28
29
|
//#endregion
|
|
30
|
+
//#region src/terminal-handoff-controller.d.ts
|
|
31
|
+
/** How the App suspends/resumes its rendering, registered into the controller on mount. */
|
|
32
|
+
interface ITuiSuspendHooks {
|
|
33
|
+
/** Render nothing (release Ink input/raw mode); resolves once that has committed. */
|
|
34
|
+
suspend(): Promise<void>;
|
|
35
|
+
/** Resume rendering and force a redraw. */
|
|
36
|
+
resume(): void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* SCREEN-1992: terminal modes the TUI negotiated (focus reporting) are released before a child owns
|
|
40
|
+
* the terminal and re-negotiated once it is reclaimed, so the child never receives `CSI I`/`CSI O`
|
|
41
|
+
* and a child that reset the mode does not leave the TUI blind afterwards.
|
|
42
|
+
*/
|
|
43
|
+
interface ITerminalModeHooks {
|
|
44
|
+
/** May be async: SCREEN-2670 drains the parked screen-reader output before the child gets the TTY. */
|
|
45
|
+
preSuspend(): void | Promise<void>;
|
|
46
|
+
postResume(): void;
|
|
47
|
+
}
|
|
48
|
+
/** Minimal slice of the Ink render instance the controller needs. */
|
|
49
|
+
interface IInkClearable {
|
|
50
|
+
clear(): void;
|
|
51
|
+
}
|
|
52
|
+
declare class TerminalHandoffController implements ITerminalHandoff {
|
|
53
|
+
private hooks?;
|
|
54
|
+
private instance?;
|
|
55
|
+
private modeHooks?;
|
|
56
|
+
/**
|
|
57
|
+
* The App registers how to suspend/resume Ink. Returns an unregister function for cleanup on
|
|
58
|
+
* unmount. Only a mounted App provides these hooks, which gates `canHandoffTerminal`.
|
|
59
|
+
*/
|
|
60
|
+
registerSuspendHooks(hooks: ITuiSuspendHooks): () => void;
|
|
61
|
+
/** render.tsx registers the terminal-mode bracket (SCREEN-1992) before `render()`. */
|
|
62
|
+
setTerminalModeHooks(hooks: ITerminalModeHooks | undefined): void;
|
|
63
|
+
/** render.tsx supplies the Ink instance (for `clear()`) after `render()` returns. */
|
|
64
|
+
setInkInstance(instance: IInkClearable): void;
|
|
65
|
+
get canHandoffTerminal(): boolean;
|
|
66
|
+
runWithTerminal<T>(fn: () => Promise<T>): Promise<T>;
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
29
69
|
//#region src/tui-session-events.d.ts
|
|
30
70
|
interface ITuiSessionEventNotice {
|
|
31
71
|
id: string;
|
|
@@ -90,7 +130,7 @@ declare class TuiStateManager {
|
|
|
90
130
|
onToolStart: (state: IToolState) => void;
|
|
91
131
|
onToolEnd: (state: IToolState) => void;
|
|
92
132
|
onThinking: (thinking: boolean) => void;
|
|
93
|
-
onComplete: (result: IExecutionResult) => void;
|
|
133
|
+
onComplete: (result: Pick<IExecutionResult, "contextState">) => void;
|
|
94
134
|
onInterrupted: () => void;
|
|
95
135
|
onError: (error?: Error) => void;
|
|
96
136
|
onContextUpdate: (state: IContextWindowState) => void;
|
|
@@ -100,6 +140,13 @@ declare class TuiStateManager {
|
|
|
100
140
|
* only the newly-appended tail; committed lines already in terminal scrollback are never re-printed.
|
|
101
141
|
*/
|
|
102
142
|
syncHistory(entries: IHistoryEntry[]): void;
|
|
143
|
+
/**
|
|
144
|
+
* A host's history as a terminal attached to it last read it, then the echoes of prompts the host
|
|
145
|
+
* has not recorded yet. Unlike `syncHistory`, an empty history is an answer: the host's session
|
|
146
|
+
* has no entries.
|
|
147
|
+
*/
|
|
148
|
+
syncHostHistory(entries: readonly IHistoryEntry[], echoes: readonly IHistoryEntry[]): void;
|
|
149
|
+
private withLocalNotices;
|
|
103
150
|
/** Add a notice this terminal owns; it survives the next session-history sync in place. */
|
|
104
151
|
addEntry(entry: IHistoryEntry): void;
|
|
105
152
|
/** Echo the user's prompt at once; the session's own user entry replaces it on the next sync. */
|
|
@@ -124,45 +171,6 @@ declare class TuiStateManager {
|
|
|
124
171
|
dispose(): void;
|
|
125
172
|
}
|
|
126
173
|
//#endregion
|
|
127
|
-
//#region src/terminal-handoff-controller.d.ts
|
|
128
|
-
/** How the App suspends/resumes its rendering, registered into the controller on mount. */
|
|
129
|
-
interface ITuiSuspendHooks {
|
|
130
|
-
/** Render nothing (release Ink input/raw mode); resolves once that has committed. */
|
|
131
|
-
suspend(): Promise<void>;
|
|
132
|
-
/** Resume rendering and force a redraw. */
|
|
133
|
-
resume(): void;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* SCREEN-1992: terminal modes the TUI negotiated (focus reporting) are released before a child owns
|
|
137
|
-
* the terminal and re-negotiated once it is reclaimed, so the child never receives `CSI I`/`CSI O`
|
|
138
|
-
* and a child that reset the mode does not leave the TUI blind afterwards.
|
|
139
|
-
*/
|
|
140
|
-
interface ITerminalModeHooks {
|
|
141
|
-
/** May be async: SCREEN-2670 drains the parked screen-reader output before the child gets the TTY. */
|
|
142
|
-
preSuspend(): void | Promise<void>;
|
|
143
|
-
postResume(): void;
|
|
144
|
-
}
|
|
145
|
-
/** Minimal slice of the Ink render instance the controller needs. */
|
|
146
|
-
interface IInkClearable {
|
|
147
|
-
clear(): void;
|
|
148
|
-
}
|
|
149
|
-
declare class TerminalHandoffController implements ITerminalHandoff {
|
|
150
|
-
private hooks?;
|
|
151
|
-
private instance?;
|
|
152
|
-
private modeHooks?;
|
|
153
|
-
/**
|
|
154
|
-
* The App registers how to suspend/resume Ink. Returns an unregister function for cleanup on
|
|
155
|
-
* unmount. Only a mounted App provides these hooks, which gates `canHandoffTerminal`.
|
|
156
|
-
*/
|
|
157
|
-
registerSuspendHooks(hooks: ITuiSuspendHooks): () => void;
|
|
158
|
-
/** render.tsx registers the terminal-mode bracket (SCREEN-1992) before `render()`. */
|
|
159
|
-
setTerminalModeHooks(hooks: ITerminalModeHooks | undefined): void;
|
|
160
|
-
/** render.tsx supplies the Ink instance (for `clear()`) after `render()` returns. */
|
|
161
|
-
setInkInstance(instance: IInkClearable): void;
|
|
162
|
-
get canHandoffTerminal(): boolean;
|
|
163
|
-
runWithTerminal<T>(fn: () => Promise<T>): Promise<T>;
|
|
164
|
-
}
|
|
165
|
-
//#endregion
|
|
166
174
|
//#region src/types.d.ts
|
|
167
175
|
/**
|
|
168
176
|
* Permission result: true (allow once), false (deny), 'allow-session' (remember for session),
|
|
@@ -175,6 +183,8 @@ interface IPendingPermissionRequest {
|
|
|
175
183
|
canPersistProjectPermission?: boolean;
|
|
176
184
|
/** The peer session whose message this call serves, when a peer turn asked. */
|
|
177
185
|
requestedByPeer?: string;
|
|
186
|
+
/** Issue #3288 §1: a background agent's own request, forwarded to the person. */
|
|
187
|
+
requester?: TPermissionRequester;
|
|
178
188
|
resolve: (result: TPermissionResult) => void;
|
|
179
189
|
}
|
|
180
190
|
//#endregion
|
|
@@ -193,6 +203,8 @@ interface ITuiRuntimeStatusSnapshot {
|
|
|
193
203
|
sessionId: string;
|
|
194
204
|
activePresetId?: string;
|
|
195
205
|
effort?: TModelEffortSelection;
|
|
206
|
+
/** The model the session reports, when its host says; absent ⇒ the one this terminal was started with. */
|
|
207
|
+
modelId?: string;
|
|
196
208
|
}
|
|
197
209
|
interface ITuiChannelSnapshot {
|
|
198
210
|
history: readonly IHistoryEntry[];
|
|
@@ -215,6 +227,28 @@ interface ITuiChannelSnapshot {
|
|
|
215
227
|
usedTokens: number;
|
|
216
228
|
maxTokens: number;
|
|
217
229
|
};
|
|
230
|
+
/**
|
|
231
|
+
* The sessions the session picker offers, when the host keeps them (a terminal attached to a
|
|
232
|
+
* daemon). Absent ⇒ the picker lists this terminal's own session store. A host that keeps sessions
|
|
233
|
+
* live says which rows run now and how many clients are on each; the picker shows both.
|
|
234
|
+
*/
|
|
235
|
+
hostSessions?: readonly ISessionListingEntry[];
|
|
236
|
+
/**
|
|
237
|
+
* Changes when the transcript starts over for another session while the App keeps this channel.
|
|
238
|
+
* The terminal prints the transcript once and counts what it printed, so a new transcript is
|
|
239
|
+
* printed from its start. Absent ⇒ the transcript never starts over under this channel.
|
|
240
|
+
*/
|
|
241
|
+
transcriptGeneration?: number;
|
|
242
|
+
/**
|
|
243
|
+
* True while this terminal only observes the session: it sends nothing that changes it, and the
|
|
244
|
+
* App offers no key that would. Absent ⇒ the terminal drives the session.
|
|
245
|
+
*/
|
|
246
|
+
readOnly?: boolean;
|
|
247
|
+
/**
|
|
248
|
+
* True when this terminal is attached to a session a host runs: leaving only detaches it, and
|
|
249
|
+
* Ctrl-] leaves too. Absent ⇒ the terminal runs its own session, where Ctrl-] means nothing.
|
|
250
|
+
*/
|
|
251
|
+
attached?: boolean;
|
|
218
252
|
}
|
|
219
253
|
/**
|
|
220
254
|
* Complete channel surface visible below the top-level App composition shell.
|
|
@@ -309,8 +343,15 @@ interface ITuiInteractionChannelOptions {
|
|
|
309
343
|
contributionSources?: ICreateSessionOptions['contributionSources'];
|
|
310
344
|
skillRoots?: ICreateSessionOptions['skillRoots'];
|
|
311
345
|
userSettingsSources?: readonly INodeHostSettingsSource[];
|
|
312
|
-
/**
|
|
346
|
+
/**
|
|
347
|
+
* Explicit authority- and permission-backed edit checkpoint capability for this channel's one
|
|
348
|
+
* session. Never shared with another channel's session: a store holds one turn in progress.
|
|
349
|
+
*/
|
|
313
350
|
editCheckpointStore?: EditCheckpointStore;
|
|
351
|
+
/** The host's way to build each external-event grant's verifier; absent, no grant opens. */
|
|
352
|
+
externalEventVerifierFactory?: TInteractiveSessionOptions['externalEventVerifierFactory'];
|
|
353
|
+
/** The run's grant history, shared by every session this TUI binds (#3189). */
|
|
354
|
+
externalEventGrantHistory?: TInteractiveSessionOptions['externalEventGrantHistory'];
|
|
314
355
|
/**
|
|
315
356
|
* CLI-076: the resolved model id (the same value the status line displays). Forwarded to the session so an
|
|
316
357
|
* explicit `--model` override reaches the provider chat call instead of being silently replaced by the
|
|
@@ -336,7 +377,6 @@ interface ITuiInteractionChannelOptions {
|
|
|
336
377
|
/** Issue #3081: this channel's session is the target of a `/cd` from this directory. */
|
|
337
378
|
workspaceMovedFrom?: string;
|
|
338
379
|
sessionName?: string;
|
|
339
|
-
onAutoNamed?: (name: string) => void;
|
|
340
380
|
backgroundTaskRunners?: IBackgroundTaskRunner[];
|
|
341
381
|
/** MCP-004: forwarded to `ICreateSessionOptions.toolCallHandoff`. */
|
|
342
382
|
toolCallHandoff?: IToolCallHandoffPolicy;
|
|
@@ -355,6 +395,8 @@ interface ITuiInteractionChannelOptions {
|
|
|
355
395
|
*/
|
|
356
396
|
additionalTools?: IToolWithEventService[];
|
|
357
397
|
defaultTools?: readonly IToolWithEventService[];
|
|
398
|
+
/** The sandbox the shell tools run under, so the session can let a confined command skip the prompt. */
|
|
399
|
+
sandboxClient?: ICreateSessionOptions['sandboxClient'];
|
|
358
400
|
commandModules?: readonly ICommandModule[];
|
|
359
401
|
commandHostAdapters?: ICommandHostAdapters;
|
|
360
402
|
shellExec?: TShellExecFn;
|
|
@@ -419,7 +461,6 @@ declare class TuiInteractionChannel implements ITuiAppChannelPort {
|
|
|
419
461
|
private readonly lifecycle;
|
|
420
462
|
availableCommands: ICommandInfo[];
|
|
421
463
|
sessionName: string | undefined;
|
|
422
|
-
private autoNameTriggered;
|
|
423
464
|
private initPoller;
|
|
424
465
|
/** TERM-002: the App registers its Ink suspend/resume hooks into this controller. */
|
|
425
466
|
get terminalHandoffController(): TerminalHandoffController | undefined;
|
|
@@ -456,6 +497,7 @@ declare class TuiInteractionChannel implements ITuiAppChannelPort {
|
|
|
456
497
|
addEntry(entry: IHistoryEntry): void;
|
|
457
498
|
abort(): void;
|
|
458
499
|
cancelQueue(): void;
|
|
500
|
+
/** Esc on an idle prompt: the session decides which waiting loop, if any, stops. */
|
|
459
501
|
stopWaitingSelfPacedLoop(): Promise<void>;
|
|
460
502
|
shutdown(options?: {
|
|
461
503
|
reason?: TSessionEndReason;
|
|
@@ -490,7 +532,6 @@ declare class TuiInteractionChannel implements ITuiAppChannelPort {
|
|
|
490
532
|
* permission promise dangling (the tool would hang) nor silently grant it (CLI-075 RUNTIME-32).
|
|
491
533
|
*/
|
|
492
534
|
private cancelAllPermissions;
|
|
493
|
-
private handleAutoNaming;
|
|
494
535
|
private syncRestoredHistory;
|
|
495
536
|
private startInitCheck;
|
|
496
537
|
/** Throws while the session is not ready; the init poller classifies the error. */
|
|
@@ -502,6 +543,19 @@ declare class TuiInteractionChannel implements ITuiAppChannelPort {
|
|
|
502
543
|
private syncExecutionWorkspace;
|
|
503
544
|
}
|
|
504
545
|
//#endregion
|
|
546
|
+
//#region src/attached-session-connection.d.ts
|
|
547
|
+
/**
|
|
548
|
+
* A terminal's end of the session protocol to a session it is attached to. The terminal only sends
|
|
549
|
+
* and listens; closing the connection belongs to whoever opened it.
|
|
550
|
+
*/
|
|
551
|
+
interface IAttachedSessionConnection {
|
|
552
|
+
send(message: TClientMessage): void;
|
|
553
|
+
subscribe(listener: (message: TServerMessage) => void): () => void;
|
|
554
|
+
onClose(listener: () => void): () => void;
|
|
555
|
+
}
|
|
556
|
+
/** Why an attached terminal stopped showing the session: the user left, or the connection closed. */
|
|
557
|
+
type TAttachedSessionEnd = 'user' | 'closed';
|
|
558
|
+
//#endregion
|
|
505
559
|
//#region src/keybindings/keybinding-catalogue.d.ts
|
|
506
560
|
declare const KEYBINDING_ACTIONS: {
|
|
507
561
|
readonly app: readonly ["open-workspace-switcher"];
|
|
@@ -787,6 +841,25 @@ interface ITuiCliAdapter {
|
|
|
787
841
|
formatResumeCommand?: (sessionId: string) => string;
|
|
788
842
|
}
|
|
789
843
|
//#endregion
|
|
844
|
+
//#region src/wire-tui-client-commands.d.ts
|
|
845
|
+
/** What a client-run command may use: this terminal's handoff and working directory. */
|
|
846
|
+
type TTuiClientCommandHost = ICommandHostTerminalHandoff & ICommandHostWorkspace;
|
|
847
|
+
/**
|
|
848
|
+
* A command this terminal runs itself. Declared here rather than imported: the command package's
|
|
849
|
+
* `createTerminalClientCommands` produces objects of this shape, and this package does not depend on
|
|
850
|
+
* the command package.
|
|
851
|
+
*/
|
|
852
|
+
interface ITuiClientCommand {
|
|
853
|
+
readonly name: string;
|
|
854
|
+
execute(host: TTuiClientCommandHost, args: string): ICommandResult | Promise<ICommandResult>;
|
|
855
|
+
}
|
|
856
|
+
/** The client-run commands, and how this terminal writes what they change. */
|
|
857
|
+
interface ITuiClientCommands {
|
|
858
|
+
readonly commands: readonly ITuiClientCommand[];
|
|
859
|
+
/** Writes the appearance keys of the user's settings; resolves when written. */
|
|
860
|
+
writeAppearanceSettings(patch: TAppearanceSettingsPatch): void | Promise<void>;
|
|
861
|
+
}
|
|
862
|
+
//#endregion
|
|
790
863
|
//#region src/render.d.ts
|
|
791
864
|
interface IRenderOptions {
|
|
792
865
|
cwd: string;
|
|
@@ -826,8 +899,19 @@ interface IRenderOptions {
|
|
|
826
899
|
* is what disabled the one check that would have caught the missing declaration.
|
|
827
900
|
*/
|
|
828
901
|
orgPolicy?: IOrgPolicy | undefined;
|
|
829
|
-
/**
|
|
830
|
-
|
|
902
|
+
/**
|
|
903
|
+
* Builds the authority- and permission-backed edit checkpoint store for one session; absent, no
|
|
904
|
+
* session keeps checkpoints. A factory, not a store: a session switch builds the next channel
|
|
905
|
+
* while the old session may still be finishing a turn, and a store holds one turn in progress.
|
|
906
|
+
*/
|
|
907
|
+
createEditCheckpointStore?: () => EditCheckpointStore;
|
|
908
|
+
/** The host's way to build each external-event grant's verifier; absent, no grant opens. */
|
|
909
|
+
externalEventVerifierFactory?: TInteractiveSessionOptions['externalEventVerifierFactory'];
|
|
910
|
+
/**
|
|
911
|
+
* #3189: the run's grant history, handed to every session this TUI builds so a switch replays no
|
|
912
|
+
* spent token and resets no rate. DECLARED for the reason `orgPolicy` above is.
|
|
913
|
+
*/
|
|
914
|
+
externalEventGrantHistory?: TInteractiveSessionOptions['externalEventGrantHistory'];
|
|
831
915
|
providerOverride?: string | undefined;
|
|
832
916
|
/**
|
|
833
917
|
* #1844: forwarded to the session so `/provider switch` can construct the provider it switches TO.
|
|
@@ -890,6 +974,8 @@ interface IRenderOptions {
|
|
|
890
974
|
*/
|
|
891
975
|
additionalTools?: IToolWithEventService[];
|
|
892
976
|
defaultTools?: readonly IToolWithEventService[];
|
|
977
|
+
/** The sandbox the shell tools run under, so the session can let a confined command skip the prompt. */
|
|
978
|
+
sandboxClient?: ICreateSessionOptions['sandboxClient'];
|
|
893
979
|
commandModules?: readonly ICommandModule[];
|
|
894
980
|
commandHostAdapters?: ICommandHostAdapters;
|
|
895
981
|
shellExec?: TShellExecFn;
|
|
@@ -965,6 +1051,33 @@ interface IRenderOptions {
|
|
|
965
1051
|
promptHistoryProject?: string;
|
|
966
1052
|
}
|
|
967
1053
|
declare function renderApp(options: IRenderOptions): Promise<void>;
|
|
1054
|
+
/**
|
|
1055
|
+
* What the full TUI needs to attach to a session a host runs (a daemon) instead of building one.
|
|
1056
|
+
* Only presentation options: everything else belongs to the host's session.
|
|
1057
|
+
*/
|
|
1058
|
+
interface IRenderAttachedAppOptions extends Pick<IRenderOptions, 'cwd' | 'productDisplayName' | 'version' | 'cliAdapter' | 'screenReader' | 'screenReaderChannel' | 'screenReaderHint' | 'screenReaderPacing' | 'terminalCapabilities' | 'keybindingsSource' | 'themeRegistry' | 'reducedMotion' | 'reducedMotionOverride' | 'focusReporting' | 'promptHistorySource' | 'promptHistoryProject'> {
|
|
1059
|
+
/** The session protocol connection; closing it belongs to the caller. */
|
|
1060
|
+
readonly connection: IAttachedSessionConnection;
|
|
1061
|
+
/** Shown as the session's label until the session reports its own name. */
|
|
1062
|
+
readonly sessionLabel: string;
|
|
1063
|
+
/** This terminal's driver id, from the attach handshake. */
|
|
1064
|
+
readonly driverId: string;
|
|
1065
|
+
/** Commands this terminal runs itself (`/shell`, `/theme`, ...); the host never sees them. */
|
|
1066
|
+
readonly clientCommands?: ITuiClientCommands;
|
|
1067
|
+
/**
|
|
1068
|
+
* How this terminal is on the session: `'drive'` (the default) sends prompts and answers questions;
|
|
1069
|
+
* `'observe'` only watches, and the host refuses anything else from it.
|
|
1070
|
+
*/
|
|
1071
|
+
readonly mode?: 'drive' | 'observe';
|
|
1072
|
+
/** Print the screen-reader line; false when this process already printed it. Default true. */
|
|
1073
|
+
readonly announce?: boolean;
|
|
1074
|
+
}
|
|
1075
|
+
/**
|
|
1076
|
+
* Render the full TUI on a session the terminal is attached to over the session protocol. Leaving
|
|
1077
|
+
* only detaches: the session keeps running. Resolves `'user'` when the user leaves (`/exit`,
|
|
1078
|
+
* Ctrl-C) and `'closed'` when the connection closed.
|
|
1079
|
+
*/
|
|
1080
|
+
declare function renderAttachedApp(options: IRenderAttachedAppOptions): Promise<TAttachedSessionEnd>;
|
|
968
1081
|
//#endregion
|
|
969
1082
|
//#region src/SupervisedSessionView.d.ts
|
|
970
1083
|
interface ISupervisedViewRow {
|
|
@@ -982,25 +1095,62 @@ interface ISupervisedViewRow {
|
|
|
982
1095
|
readonly kind: 'pull' | 'merge-request';
|
|
983
1096
|
};
|
|
984
1097
|
readonly problem?: 'invalid-registration';
|
|
1098
|
+
/** The verified registration generation; a row without one never offers an action. Never rendered. */
|
|
1099
|
+
readonly generation?: string;
|
|
1100
|
+
}
|
|
1101
|
+
/** An attach the user confirmed in the view, bound to the process start the row showed. */
|
|
1102
|
+
interface ISupervisedAttachRequest {
|
|
1103
|
+
readonly id: string;
|
|
1104
|
+
readonly generation: string;
|
|
1105
|
+
readonly mode: 'drive' | 'observe';
|
|
1106
|
+
/** How the view was grouped, so it can reopen the same way after the attach. */
|
|
1107
|
+
readonly groupByDirectory: boolean;
|
|
1108
|
+
}
|
|
1109
|
+
/** How the view ended: closed, or handed to the host to attach and then come back. */
|
|
1110
|
+
type TSupervisedViewExit = {
|
|
1111
|
+
readonly kind: 'closed';
|
|
1112
|
+
} | ({
|
|
1113
|
+
readonly kind: 'attach';
|
|
1114
|
+
} & ISupervisedAttachRequest);
|
|
1115
|
+
/**
|
|
1116
|
+
* How a new session starts in a folder that is not trusted: trusted first (`trust` records the grant),
|
|
1117
|
+
* or `restricted`, without the project's own configuration. A person chose it in the view.
|
|
1118
|
+
*/
|
|
1119
|
+
type TSupervisedStartTrustChoice = 'trust' | 'restricted';
|
|
1120
|
+
/** What the person is asked about: the folder a new session would start in, and what trust loads. */
|
|
1121
|
+
interface ISupervisedStartTrustQuestion {
|
|
1122
|
+
readonly folder: string;
|
|
1123
|
+
/** What trusting it would load, one line each. */
|
|
1124
|
+
readonly loads: readonly string[];
|
|
985
1125
|
}
|
|
986
1126
|
interface ISupervisedSessionViewProps {
|
|
987
1127
|
readonly loadRows: (signal: AbortSignal) => Promise<readonly ISupervisedViewRow[]>;
|
|
988
|
-
|
|
989
|
-
readonly
|
|
990
|
-
|
|
1128
|
+
/** Called once the user confirmed; the view then closes so the host can attach this terminal. */
|
|
1129
|
+
readonly onAttach?: (request: ISupervisedAttachRequest) => void;
|
|
1130
|
+
/** Receives the generation the row displayed, so a session restarted under the same id is refused. */
|
|
1131
|
+
readonly onStop?: (id: string, generation: string) => Promise<void>;
|
|
1132
|
+
readonly onStart?: (choice?: TSupervisedStartTrustChoice) => Promise<string>;
|
|
1133
|
+
/** The question to ask when the folder a new session starts in is not trusted yet; none otherwise. */
|
|
1134
|
+
readonly startTrustQuestion?: () => Promise<ISupervisedStartTrustQuestion | undefined>;
|
|
1135
|
+
readonly onOpenPr?: (id: string, url: string, generation: string) => Promise<void>;
|
|
991
1136
|
readonly filteredByCwd?: boolean;
|
|
992
1137
|
readonly filteredByName?: boolean;
|
|
993
1138
|
readonly filteredByPr?: boolean;
|
|
994
1139
|
readonly stateFilter?: TGroup;
|
|
995
1140
|
readonly refreshMs?: number;
|
|
1141
|
+
/** The row to select first, when it is still listed — the one an attach left from. */
|
|
1142
|
+
readonly initialSelectedId?: string;
|
|
1143
|
+
readonly initialGroupByDirectory?: boolean;
|
|
996
1144
|
}
|
|
997
1145
|
declare const GROUP_ORDER: readonly ["needs-input", "working", "idle", "unknown", "unverified", "dead"];
|
|
998
|
-
type TGroup = typeof GROUP_ORDER[number];
|
|
1146
|
+
type TGroup = (typeof GROUP_ORDER)[number];
|
|
999
1147
|
declare function renderSupervisedSessionView(options: ISupervisedSessionViewProps & {
|
|
1000
1148
|
readonly screenReader: boolean;
|
|
1001
1149
|
readonly screenReaderChannel?: TScreenReaderChannel;
|
|
1002
1150
|
readonly screenReaderHint?: boolean;
|
|
1003
|
-
|
|
1151
|
+
/** Print the screen-reader line; false when this process already printed it. */
|
|
1152
|
+
readonly announce?: boolean;
|
|
1153
|
+
}): Promise<TSupervisedViewExit>;
|
|
1004
1154
|
//#endregion
|
|
1005
1155
|
//#region src/create-default-tui-cli-adapter.d.ts
|
|
1006
1156
|
interface IDefaultTuiCliAdapterOptions {
|
|
@@ -1062,5 +1212,5 @@ declare function sanitizeThemeProse(message: string): string;
|
|
|
1062
1212
|
*/
|
|
1063
1213
|
declare function parseThemeDocument(input: IThemeDocumentInput): TThemeDocumentResult;
|
|
1064
1214
|
//#endregion
|
|
1065
|
-
export { type IDefaultTuiCliAdapterOptions, type IKeybindingDiagnostic, type IKeybindingSnapshot, type IKeybindingWarning, type IKeybindingsFilePort, type IKeybindingsSource, type INodeKeybindingsSourceOptions, type IRenderOptions, type IScreenReaderPacingOverrides, type ISupervisedSessionViewProps, type ISupervisedViewRow, type ITerminalCapabilityOverrides, type IThemeCataloguePortOptions, type IThemeDocumentInput, type IThemeRegistry, type IThemeResolution, type IThemeSkip, type ITuiCliAdapter, type ITuiCommandInteraction, type ITuiConfirmInteraction, type ITuiInteractionChannelOptions, type ITuiPickerInteraction, type ITuiPickerItem, type ITuiTheme, type TAnyTuiCommandInteraction, type TKeybindingAction, type TKeybindingContext, type TOnMissingArgsAction, type TScreenReaderChannel, type TThemeDocumentResult, type TThemeSource, TuiInteractionChannel, createDefaultTuiCliAdapter, createNodeKeybindingsSource, createThemeCataloguePort, createThemeRegistry, escapeThemeText, listBuiltInThemes, parseThemeDocument, quoteThemeText, renderApp, renderSupervisedSessionView, sanitizeThemeProse };
|
|
1215
|
+
export { type IAttachedSessionConnection, type IDefaultTuiCliAdapterOptions, type IKeybindingDiagnostic, type IKeybindingSnapshot, type IKeybindingWarning, type IKeybindingsFilePort, type IKeybindingsSource, type INodeKeybindingsSourceOptions, type IRenderAttachedAppOptions, type IRenderOptions, type IScreenReaderPacingOverrides, type ISupervisedAttachRequest, type ISupervisedSessionViewProps, type ISupervisedStartTrustQuestion, type ISupervisedViewRow, type ITerminalCapabilityOverrides, type IThemeCataloguePortOptions, type IThemeDocumentInput, type IThemeRegistry, type IThemeResolution, type IThemeSkip, type ITuiCliAdapter, type ITuiClientCommand, type ITuiClientCommands, type ITuiCommandInteraction, type ITuiConfirmInteraction, type ITuiInteractionChannelOptions, type ITuiPickerInteraction, type ITuiPickerItem, type ITuiTheme, type TAnyTuiCommandInteraction, type TAttachedSessionEnd, type TKeybindingAction, type TKeybindingContext, type TOnMissingArgsAction, type TScreenReaderChannel, type TSupervisedStartTrustChoice, type TSupervisedViewExit, type TThemeDocumentResult, type TThemeSource, type TTuiClientCommandHost, TuiInteractionChannel, createDefaultTuiCliAdapter, createNodeKeybindingsSource, createThemeCataloguePort, createThemeRegistry, escapeThemeText, listBuiltInThemes, parseThemeDocument, quoteThemeText, renderApp, renderAttachedApp, renderSupervisedSessionView, sanitizeThemeProse };
|
|
1066
1216
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/screen-reader-pacing.ts","../../src/terminal-capabilities-context.tsx","../../src/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/screen-reader-pacing.ts","../../src/terminal-capabilities-context.tsx","../../src/terminal-handoff-controller.ts","../../src/tui-session-events.ts","../../src/tui-state-manager.ts","../../src/types.ts","../../src/tui-app-channel-port.ts","../../src/attention/attention-tracker.ts","../../src/tui-channel-options.ts","../../src/TuiInteractionChannel.ts","../../src/attached-session-connection.ts","../../src/keybindings/keybinding-catalogue.ts","../../src/keybindings/keybinding-registry.ts","../../src/keybindings/node-keybindings-source.ts","../../src/screen-reader-announcement.ts","../../src/theme/theme-contracts.ts","../../src/theme/built-in-themes.ts","../../src/theme/theme-registry.ts","../../src/tui-cli-adapter.ts","../../src/wire-tui-client-commands.ts","../../src/render.tsx","../../src/SupervisedSessionView.tsx","../../src/create-default-tui-cli-adapter.ts","../../src/theme/theme-document.ts"],"mappings":"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"}
|