@aragon-agent/cli 0.6.2 → 0.6.4
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 +321 -0
- package/README.md +297 -2
- package/dist/agent/controller.d.ts +193 -1
- package/dist/agent/controller.js +475 -2
- package/dist/agent/headless.d.ts +8 -0
- package/dist/agent/headless.js +47 -0
- package/dist/agent/reducer.d.ts +189 -0
- package/dist/agent/reducer.js +301 -2
- package/dist/agent/system-prompt.d.ts +14 -0
- package/dist/agent/system-prompt.js +2 -0
- package/dist/cli.js +297 -16
- package/dist/commands/builtins.js +165 -24
- package/dist/commands/registry.d.ts +27 -0
- package/dist/compaction/archive.d.ts +175 -0
- package/dist/compaction/archive.js +267 -0
- package/dist/compaction/child.d.ts +97 -0
- package/dist/compaction/child.js +118 -0
- package/dist/compaction/command.d.ts +41 -0
- package/dist/compaction/command.js +355 -0
- package/dist/compaction/compactor.d.ts +302 -0
- package/dist/compaction/compactor.js +810 -0
- package/dist/compaction/digest.d.ts +62 -0
- package/dist/compaction/digest.js +164 -0
- package/dist/compaction/limits.d.ts +165 -0
- package/dist/compaction/limits.js +172 -0
- package/dist/compaction/pressure.d.ts +135 -0
- package/dist/compaction/pressure.js +167 -0
- package/dist/compaction/summarize-call.d.ts +70 -0
- package/dist/compaction/summarize-call.js +86 -0
- package/dist/compaction/summary-prompt.d.ts +85 -0
- package/dist/compaction/summary-prompt.js +197 -0
- package/dist/compaction/tail-budget.d.ts +52 -0
- package/dist/compaction/tail-budget.js +67 -0
- package/dist/compaction/types.d.ts +215 -0
- package/dist/compaction/types.js +22 -0
- package/dist/compaction/wiring.d.ts +264 -0
- package/dist/compaction/wiring.js +577 -0
- package/dist/config/app-paths.d.ts +14 -0
- package/dist/config/app-paths.js +16 -0
- package/dist/config/cli-commands.d.ts +41 -0
- package/dist/config/cli-commands.js +77 -1
- package/dist/config/env.d.ts +5 -2
- package/dist/config/env.js +140 -3
- package/dist/config/load.d.ts +42 -0
- package/dist/config/load.js +101 -1
- package/dist/config/schema.d.ts +244 -0
- package/dist/config/schema.js +170 -0
- package/dist/config/store.js +37 -1
- package/dist/config/ui-state.d.ts +28 -1
- package/dist/config/ui-state.js +9 -0
- package/dist/exec/events.d.ts +50 -1
- package/dist/exec/runner.js +42 -0
- package/dist/input/limits.d.ts +72 -0
- package/dist/input/limits.js +63 -0
- package/dist/input/mouse-events.d.ts +31 -5
- package/dist/input/mouse-events.js +86 -27
- package/dist/input/paste-parse.d.ts +71 -0
- package/dist/input/paste-parse.js +95 -0
- package/dist/input/stdin-filter.d.ts +81 -0
- package/dist/input/stdin-filter.js +379 -0
- package/dist/logging/install.d.ts +53 -1
- package/dist/logging/install.js +81 -1
- package/dist/logging/logger.d.ts +1 -1
- package/dist/proc/classify.d.ts +52 -0
- package/dist/proc/classify.js +143 -0
- package/dist/proc/kill-tree.d.ts +42 -0
- package/dist/proc/kill-tree.js +119 -0
- package/dist/proc/limits.d.ts +84 -0
- package/dist/proc/limits.js +84 -0
- package/dist/proc/log-ring.d.ts +68 -0
- package/dist/proc/log-ring.js +102 -0
- package/dist/proc/prompt.d.ts +24 -0
- package/dist/proc/prompt.js +49 -0
- package/dist/proc/readiness.d.ts +102 -0
- package/dist/proc/readiness.js +219 -0
- package/dist/proc/supervisor.d.ts +103 -0
- package/dist/proc/supervisor.js +465 -0
- package/dist/proc/types.d.ts +175 -0
- package/dist/proc/types.js +15 -0
- package/dist/session/persist.js +55 -1
- package/dist/team/report.js +7 -1
- package/dist/team/runtime.d.ts +10 -0
- package/dist/team/runtime.js +7 -0
- package/dist/team/subagent.d.ts +31 -1
- package/dist/team/subagent.js +42 -15
- package/dist/team/types.d.ts +8 -0
- package/dist/tools/bash-tool.d.ts +51 -2
- package/dist/tools/bash-tool.js +321 -51
- package/dist/tools/fs-tools.d.ts +17 -0
- package/dist/tools/index.d.ts +55 -2
- package/dist/tools/index.js +39 -1
- package/dist/tools/proc-tools.d.ts +25 -0
- package/dist/tools/proc-tools.js +102 -0
- package/dist/ui/ActivityLine.d.ts +19 -1
- package/dist/ui/ActivityLine.js +10 -2
- package/dist/ui/App.d.ts +62 -2
- package/dist/ui/App.js +546 -16
- package/dist/ui/Composer.d.ts +66 -1
- package/dist/ui/Composer.js +50 -6
- package/dist/ui/PromptInput.d.ts +82 -3
- package/dist/ui/PromptInput.js +232 -49
- package/dist/ui/StatusBar.d.ts +59 -0
- package/dist/ui/StatusBar.js +16 -4
- package/dist/ui/TeamPanel.js +7 -1
- package/dist/ui/Transcript.d.ts +21 -1
- package/dist/ui/Transcript.js +61 -3
- package/dist/ui/clipboard.d.ts +52 -0
- package/dist/ui/clipboard.js +91 -0
- package/dist/ui/composer-limits.d.ts +31 -0
- package/dist/ui/composer-limits.js +50 -0
- package/dist/ui/composer-rows.d.ts +73 -0
- package/dist/ui/composer-rows.js +201 -0
- package/dist/ui/editor-reducer.d.ts +37 -0
- package/dist/ui/editor-reducer.js +88 -12
- package/dist/ui/entries/CompactionCard.d.ts +75 -0
- package/dist/ui/entries/CompactionCard.js +158 -0
- package/dist/ui/entries/ServiceCard.d.ts +66 -0
- package/dist/ui/entries/ServiceCard.js +116 -0
- package/dist/ui/entries/UserEntry.d.ts +17 -3
- package/dist/ui/entries/UserEntry.js +34 -5
- package/dist/ui/frame-differ.d.ts +46 -0
- package/dist/ui/frame-differ.js +94 -10
- package/dist/ui/gauge.d.ts +16 -1
- package/dist/ui/gauge.js +25 -6
- package/dist/ui/glyphs.d.ts +11 -0
- package/dist/ui/glyphs.js +2 -0
- package/dist/ui/layout/ScrollViewport.d.ts +43 -6
- package/dist/ui/layout/ScrollViewport.js +128 -21
- package/dist/ui/layout/budget.d.ts +44 -9
- package/dist/ui/layout/budget.js +42 -10
- package/dist/ui/layout/follow-state.d.ts +137 -0
- package/dist/ui/layout/follow-state.js +150 -0
- package/dist/ui/layout/virtual-window.d.ts +11 -0
- package/dist/ui/layout/virtual-window.js +85 -1
- package/dist/ui/overlays/HelpOverlay.js +9 -1
- package/dist/ui/overlays/PlanReviewOverlay.js +10 -2
- package/dist/ui/overlays/QuestionOverlay.js +5 -1
- package/dist/ui/overlays/SettingsScreen.d.ts +47 -1
- package/dist/ui/overlays/SettingsScreen.js +74 -2
- package/dist/ui/palettes.d.ts +16 -0
- package/dist/ui/palettes.js +6 -0
- package/dist/ui/paste-frames.d.ts +87 -0
- package/dist/ui/paste-frames.js +112 -0
- package/dist/ui/paste-tokens.d.ts +90 -0
- package/dist/ui/paste-tokens.js +147 -0
- package/dist/ui/screen.d.ts +38 -0
- package/dist/ui/screen.js +113 -8
- package/dist/ui/selection/highlight.d.ts +39 -0
- package/dist/ui/selection/highlight.js +64 -0
- package/dist/ui/selection/screen-mirror.d.ts +24 -0
- package/dist/ui/selection/screen-mirror.js +35 -0
- package/dist/ui/selection/selection-controller.d.ts +88 -0
- package/dist/ui/selection/selection-controller.js +282 -0
- package/dist/ui/selection/selection.d.ts +90 -0
- package/dist/ui/selection/selection.js +223 -0
- package/dist/ui/stdout-frame-writer.d.ts +33 -0
- package/dist/ui/stdout-frame-writer.js +15 -0
- package/dist/ui/theme.d.ts +11 -0
- package/dist/ui/theme.js +2 -0
- package/dist/ui/transcript-text.js +72 -0
- package/dist/ui/use-startup-notices.d.ts +27 -1
- package/dist/ui/use-startup-notices.js +43 -11
- package/dist/ui/use-wheel-routing.d.ts +1 -1
- package/dist/ui/use-wheel-routing.js +8 -0
- package/package.json +4 -2
- package/dist/input/stdin-mouse-filter.d.ts +0 -42
- package/dist/input/stdin-mouse-filter.js +0 -153
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bash_output` and `bash_kill` — the model's two handles on a supervised
|
|
3
|
+
* service (background-service-supervision §5.1).
|
|
4
|
+
*
|
|
5
|
+
* REGISTERED THROUGH A FACTORY OPTION, NEVER APPENDED AFTER THE FACT
|
|
6
|
+
* (`tools/index.ts::procTools`). `tools.test.ts::C7` asserts `HOST_TOOL_NAMES`
|
|
7
|
+
* equals what `createBuiltinTools` PRODUCES, so appending these in
|
|
8
|
+
* `AgentController` after the factory returned would turn that test red with a
|
|
9
|
+
* message about two lists of names that says nothing about background services —
|
|
10
|
+
* the trap `teamTools` and `todoTools` each record in capitals.
|
|
11
|
+
*
|
|
12
|
+
* NEITHER JOINS `MUTATING_TOOLS` (P2-5). `bash_output` is a read. `bash_kill`
|
|
13
|
+
* stops something THIS SESSION STARTED and is showing on screen, and the plan
|
|
14
|
+
* gate already refuses it in plan mode; putting a `--confirm` modal between the
|
|
15
|
+
* user and stopping their own runaway server is the wrong trade. `bash` itself
|
|
16
|
+
* stays in `MUTATING_TOOLS` unchanged, including when `background: true` — the
|
|
17
|
+
* command is still arbitrary.
|
|
18
|
+
*/
|
|
19
|
+
import { type AgentTool } from '@aragon-agent/core';
|
|
20
|
+
import type { ProcSupervisorPort } from '../proc/types.js';
|
|
21
|
+
export interface ProcToolDeps {
|
|
22
|
+
supervisor: ProcSupervisorPort;
|
|
23
|
+
}
|
|
24
|
+
export declare function makeBashOutput(deps: ProcToolDeps): AgentTool;
|
|
25
|
+
export declare function makeBashKill(deps: ProcToolDeps): AgentTool;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bash_output` and `bash_kill` — the model's two handles on a supervised
|
|
3
|
+
* service (background-service-supervision §5.1).
|
|
4
|
+
*
|
|
5
|
+
* REGISTERED THROUGH A FACTORY OPTION, NEVER APPENDED AFTER THE FACT
|
|
6
|
+
* (`tools/index.ts::procTools`). `tools.test.ts::C7` asserts `HOST_TOOL_NAMES`
|
|
7
|
+
* equals what `createBuiltinTools` PRODUCES, so appending these in
|
|
8
|
+
* `AgentController` after the factory returned would turn that test red with a
|
|
9
|
+
* message about two lists of names that says nothing about background services —
|
|
10
|
+
* the trap `teamTools` and `todoTools` each record in capitals.
|
|
11
|
+
*
|
|
12
|
+
* NEITHER JOINS `MUTATING_TOOLS` (P2-5). `bash_output` is a read. `bash_kill`
|
|
13
|
+
* stops something THIS SESSION STARTED and is showing on screen, and the plan
|
|
14
|
+
* gate already refuses it in plan mode; putting a `--confirm` modal between the
|
|
15
|
+
* user and stopping their own runaway server is the wrong trade. `bash` itself
|
|
16
|
+
* stays in `MUTATING_TOOLS` unchanged, including when `background: true` — the
|
|
17
|
+
* command is still arbitrary.
|
|
18
|
+
*/
|
|
19
|
+
import { defineTool, errorResult, textResult } from '@aragon-agent/core';
|
|
20
|
+
import { PROC_LIMITS } from '../proc/limits.js';
|
|
21
|
+
/** One line of status, shared by both tools so the two can never disagree. */
|
|
22
|
+
function statusLine(service) {
|
|
23
|
+
const bits = [`service ${service.id} ${service.status}`];
|
|
24
|
+
if (service.url)
|
|
25
|
+
bits.push(service.url);
|
|
26
|
+
if (service.exitCode !== null)
|
|
27
|
+
bits.push(`exit code ${service.exitCode}`);
|
|
28
|
+
else if (service.signal)
|
|
29
|
+
bits.push(`signal ${service.signal}`);
|
|
30
|
+
if (service.killIncomplete)
|
|
31
|
+
bits.push('(may have left a detached child)');
|
|
32
|
+
return `${bits.join(' ')}\n$ ${service.command}`;
|
|
33
|
+
}
|
|
34
|
+
export function makeBashOutput(deps) {
|
|
35
|
+
return defineTool({
|
|
36
|
+
name: 'bash_output',
|
|
37
|
+
label: 'Service log',
|
|
38
|
+
description: 'Read a background service log tail and its current status. Pass the ' +
|
|
39
|
+
'`since` cursor returned by a previous call to read only what is new. ' +
|
|
40
|
+
'Use this to verify a service actually started, and to read a build or ' +
|
|
41
|
+
'test watcher as it runs.',
|
|
42
|
+
parameters: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: {
|
|
45
|
+
service: { type: 'string', description: 'The service id, e.g. "s1".' },
|
|
46
|
+
since: {
|
|
47
|
+
type: 'number',
|
|
48
|
+
description: 'Cursor from a previous call; omit to read the whole tail.',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
required: ['service'],
|
|
52
|
+
},
|
|
53
|
+
async execute(_id, rawParams) {
|
|
54
|
+
const params = rawParams;
|
|
55
|
+
const service = deps.supervisor.get(params.service);
|
|
56
|
+
if (!service) {
|
|
57
|
+
return errorResult(`No service "${params.service}". Start one with bash({ command, background: true }).`);
|
|
58
|
+
}
|
|
59
|
+
const page = deps.supervisor.read(params.service, params.since);
|
|
60
|
+
const lines = [statusLine(service)];
|
|
61
|
+
if (page?.truncated) {
|
|
62
|
+
lines.push(`[note] older rows were dropped - the tail keeps the last ` +
|
|
63
|
+
`${PROC_LIMITS.serviceTailRows} rows.`);
|
|
64
|
+
}
|
|
65
|
+
if (!page || page.rows.length === 0) {
|
|
66
|
+
lines.push('(no new output)');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
lines.push(...page.rows);
|
|
70
|
+
}
|
|
71
|
+
lines.push(`[cursor ${page?.cursor ?? service.rowsSeen}]`);
|
|
72
|
+
return textResult(lines.join('\n'));
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export function makeBashKill(deps) {
|
|
77
|
+
return defineTool({
|
|
78
|
+
name: 'bash_kill',
|
|
79
|
+
label: 'Stop service',
|
|
80
|
+
description: 'Stop a background service by id, or every service with "all". Stop the ' +
|
|
81
|
+
'services you started once you are finished with them, unless the user ' +
|
|
82
|
+
'asked for them to stay up.',
|
|
83
|
+
parameters: {
|
|
84
|
+
type: 'object',
|
|
85
|
+
properties: {
|
|
86
|
+
service: { type: 'string', description: 'The service id, or "all".' },
|
|
87
|
+
},
|
|
88
|
+
required: ['service'],
|
|
89
|
+
},
|
|
90
|
+
async execute(_id, rawParams) {
|
|
91
|
+
const params = rawParams;
|
|
92
|
+
if (params.service !== 'all' && !deps.supervisor.get(params.service)) {
|
|
93
|
+
return errorResult(`No service "${params.service}".`);
|
|
94
|
+
}
|
|
95
|
+
const stopped = await deps.supervisor.stop(params.service);
|
|
96
|
+
if (stopped.length === 0)
|
|
97
|
+
return textResult('Nothing to stop.');
|
|
98
|
+
const lines = stopped.map((s) => statusLine(s));
|
|
99
|
+
return textResult(`Stopped ${stopped.length} service${stopped.length === 1 ? '' : 's'}.\n${lines.join('\n')}`);
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
@@ -74,7 +74,25 @@ export interface ActivityLineProps {
|
|
|
74
74
|
* not calm, it is wrong.
|
|
75
75
|
*/
|
|
76
76
|
runningTool?: string;
|
|
77
|
+
/**
|
|
78
|
+
* A context compaction is in flight (context-auto-compaction §6.1).
|
|
79
|
+
*
|
|
80
|
+
* HIGHEST PRECEDENCE IN THE LABEL LADDER, above `runningTool` and above the
|
|
81
|
+
* rotating phrase. Compaction happens BEFORE `turn_start`, i.e. at a moment
|
|
82
|
+
* when `status` is `'running'` but no tool is in flight — precisely the window
|
|
83
|
+
* in which the phrase rotation would say something false, and it can last
|
|
84
|
+
* tens of seconds. `runningTool` already established the principle one step
|
|
85
|
+
* back: a UI that says "Pondering" while `npm test` runs is not calm, it is
|
|
86
|
+
* wrong, and one that says it while a 30 k-token summarization runs is the same
|
|
87
|
+
* error.
|
|
88
|
+
*
|
|
89
|
+
* STILL NO SECOND SPINNER. `single-spinner-while-running`'s D-1 stands: this
|
|
90
|
+
* row owns the only animation while it is mounted, and the compaction card
|
|
91
|
+
* follows `FastCard` in taking a `reducedMotion` that `App` has already
|
|
92
|
+
* widened.
|
|
93
|
+
*/
|
|
94
|
+
compacting?: boolean;
|
|
77
95
|
theme: Theme;
|
|
78
96
|
caps: TermCapabilities;
|
|
79
97
|
}
|
|
80
|
-
export declare function ActivityLine({ startedAt, elapsedMs, reducedMotion, runningTool, theme, caps, }: ActivityLineProps): React.ReactElement;
|
|
98
|
+
export declare function ActivityLine({ startedAt, elapsedMs, reducedMotion, runningTool, compacting, theme, caps, }: ActivityLineProps): React.ReactElement;
|
package/dist/ui/ActivityLine.js
CHANGED
|
@@ -21,7 +21,7 @@ import { pickActivityPhrase } from './activity-phrases.js';
|
|
|
21
21
|
export function liveSpinner(reducedMotion, caps) {
|
|
22
22
|
return caps.unicode && !reducedMotion ? _jsx(Spinner, { type: "dots" }) : null;
|
|
23
23
|
}
|
|
24
|
-
export function ActivityLine({ startedAt, elapsedMs, reducedMotion, runningTool, theme, caps, }) {
|
|
24
|
+
export function ActivityLine({ startedAt, elapsedMs, reducedMotion, runningTool, compacting, theme, caps, }) {
|
|
25
25
|
const glyphs = pickGlyphs(caps);
|
|
26
26
|
// PURE AND DERIVED FROM `(startedAt, now)`, so the sequence does not need to
|
|
27
27
|
// keep rotating underneath the tool label: when the tool settles the phrase
|
|
@@ -31,7 +31,15 @@ export function ActivityLine({ startedAt, elapsedMs, reducedMotion, runningTool,
|
|
|
31
31
|
// SECOND registry of tool names, and `toolGlyph` is already the one place that
|
|
32
32
|
// knows them. Everything round 1 legislated for this row survives — one row,
|
|
33
33
|
// no digits, no `esc abort`, no width ladder, ASCII only.
|
|
34
|
-
|
|
34
|
+
// THREE RUNGS, MOST SPECIFIC FIRST. `Compacting context` outranks a tool name
|
|
35
|
+
// because compaction can be the only thing happening, and it outranks the
|
|
36
|
+
// phrase for the reason `runningTool` does. ASCII only, and the ellipsis comes
|
|
37
|
+
// from `pickGlyphs` like every other one on this row.
|
|
38
|
+
const label = compacting
|
|
39
|
+
? `Compacting context${glyphs.ellipsis}`
|
|
40
|
+
: runningTool
|
|
41
|
+
? `Running ${runningTool}`
|
|
42
|
+
: `${phrase}${glyphs.ellipsis}`;
|
|
35
43
|
// The IDENTICAL branch `Transcript.tsx` uses for the assistant role marker, and
|
|
36
44
|
// it must stay identical: braille dots are both an animation AND a Unicode-only
|
|
37
45
|
// glyph, so reduced motion and an ASCII terminal fall back to the same marker.
|
package/dist/ui/App.d.ts
CHANGED
|
@@ -10,7 +10,9 @@ import type { ConfirmRequest } from '../tools/index.js';
|
|
|
10
10
|
import { type Overlay, type ToastLevel } from '../agent/reducer.js';
|
|
11
11
|
import type { UpdateBridge } from '../update/types.js';
|
|
12
12
|
import { type RenderMode } from './layout/frame.js';
|
|
13
|
-
import type { MouseSource } from '../input/stdin-
|
|
13
|
+
import type { MouseSource } from '../input/stdin-filter.js';
|
|
14
|
+
import type { PasteBridge } from '../input/limits.js';
|
|
15
|
+
import type { SelectionBridge } from './selection/selection-controller.js';
|
|
14
16
|
import type { HumanInputBridge } from '../tools/human-input.js';
|
|
15
17
|
export interface ConfirmBridge {
|
|
16
18
|
handler: ((req: ConfirmRequest) => Promise<boolean>) | null;
|
|
@@ -72,5 +74,63 @@ export interface AppProps {
|
|
|
72
74
|
* 'off'`, on a non-TTY, in CI, and in every test that does not exercise it.
|
|
73
75
|
*/
|
|
74
76
|
updateBridge?: UpdateBridge;
|
|
77
|
+
/**
|
|
78
|
+
* The stdin filter's channel for a refused paste (tui-paste-handling section
|
|
79
|
+
* 5.1.2 / I-15).
|
|
80
|
+
*
|
|
81
|
+
* A BRIDGE for the reason `updateBridge` above is one: the filter is built in
|
|
82
|
+
* `cli.tsx` BEFORE `render()`, so it has no `dispatch`. Its only other outlet
|
|
83
|
+
* is the logger, and a limit that writes only to a log file is
|
|
84
|
+
* indistinguishable — from the user's chair — from a paste that silently did
|
|
85
|
+
* nothing, which is what D-11 exists to rule out. Absent under `--no-paste`,
|
|
86
|
+
* on a non-TTY, and in every test that does not exercise it.
|
|
87
|
+
*/
|
|
88
|
+
pasteBridge?: PasteBridge;
|
|
89
|
+
/**
|
|
90
|
+
* The terminal-facing services `cli.tsx` owns and this component cannot build
|
|
91
|
+
* (tui-selection-and-scroll-follow §4.4).
|
|
92
|
+
*
|
|
93
|
+
* ONE PROP RATHER THAN FOUR, and every FIELD of it is independently optional,
|
|
94
|
+
* so `--no-mouse`, `--no-diff-render` and inline mode each drop exactly the
|
|
95
|
+
* services they do not have. Absent altogether on a non-TTY and in every test
|
|
96
|
+
* that does not exercise selection, which is what keeps those trees
|
|
97
|
+
* byte-identical.
|
|
98
|
+
*/
|
|
99
|
+
terminal?: TerminalBridge;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Terminal-level services, almost all of which exist only in a full-screen TTY
|
|
103
|
+
* session — `writeForeign` is the exception, because `/copy` is available in
|
|
104
|
+
* inline mode too and OSC 52 is what makes it work over SSH (§4.4.5).
|
|
105
|
+
*
|
|
106
|
+
* `selection` is a LATE-BOUND BRIDGE for the reason `updateBridge` above is one:
|
|
107
|
+
* the controller is constructed before `render()` and must not hold React state,
|
|
108
|
+
* while the toast sink and the redraw nonce only exist once this component has
|
|
109
|
+
* mounted. The effect below assigns both and clears them on unmount.
|
|
110
|
+
*/
|
|
111
|
+
export interface TerminalBridge {
|
|
112
|
+
/** Whether drag-select is on for this session (`mouseSelect` + a filter). */
|
|
113
|
+
mouseSelect: boolean;
|
|
114
|
+
/** Release the mouse to the terminal, or take it back (`/mouse`, G3). */
|
|
115
|
+
setMouseCapture?: (on: boolean) => void;
|
|
116
|
+
/** Whether the mouse is captured right now — read at command time. */
|
|
117
|
+
isMouseCaptured?: () => boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Write bytes that are ours but are not a frame (OSC 52).
|
|
120
|
+
*
|
|
121
|
+
* IT MUST NOT BE `stdout.write` WITH THE DIFFER IN FRONT OF STDOUT (P1-6):
|
|
122
|
+
* that goes through the frame-writer proxy, which does not recognise an OSC 52
|
|
123
|
+
* chunk, counts it as a foreign write and prints `FRAME_FALLBACK_NOTICE` at
|
|
124
|
+
* the user the first time they copy anything. Without a differ — inline mode,
|
|
125
|
+
* `--no-diff-render` — stdout IS the real stream and `cli.tsx` supplies a
|
|
126
|
+
* direct write instead.
|
|
127
|
+
*
|
|
128
|
+
* Absent only when there is no terminal to accept it at all. It is never a
|
|
129
|
+
* function that writes nowhere: `copyText` reports `'osc52'` whenever its door
|
|
130
|
+
* took the text, so a no-op door would make the toast name a mechanism that
|
|
131
|
+
* was never attempted.
|
|
132
|
+
*/
|
|
133
|
+
writeForeign?: (text: string) => void;
|
|
134
|
+
selection?: SelectionBridge;
|
|
75
135
|
}
|
|
76
|
-
export declare function App({ controller, version, mode, initialOverlay, initialPrompt, confirmBridge, humanInputBridge, mouseSource, vtInputWarning, updateBridge, }: AppProps): React.ReactElement;
|
|
136
|
+
export declare function App({ controller, version, mode, initialOverlay, initialPrompt, confirmBridge, humanInputBridge, mouseSource, vtInputWarning, updateBridge, pasteBridge, terminal, }: AppProps): React.ReactElement;
|