@agi-fans/dsh-tui 0.20.0 → 0.22.0
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/lib/CHANGELOG.md +249 -3
- package/lib/chrome/box.d.ts +47 -16
- package/lib/chrome/box.js +172 -130
- package/lib/chrome/box.js.map +1 -1
- package/lib/chrome/code-highlight.d.ts +15 -0
- package/lib/chrome/code-highlight.js +60 -4
- package/lib/chrome/code-highlight.js.map +1 -1
- package/lib/chrome/command-output.d.ts +29 -2
- package/lib/chrome/command-output.js +100 -4
- package/lib/chrome/command-output.js.map +1 -1
- package/lib/chrome/main-screen-renderer.d.ts +18 -0
- package/lib/chrome/main-screen-renderer.js +58 -5
- package/lib/chrome/main-screen-renderer.js.map +1 -1
- package/lib/chrome/markdown.js +30 -10
- package/lib/chrome/markdown.js.map +1 -1
- package/lib/chrome/relative-time.d.ts +17 -0
- package/lib/chrome/relative-time.js +36 -0
- package/lib/chrome/relative-time.js.map +1 -1
- package/lib/chrome/renderer.d.ts +9 -0
- package/lib/chrome/renderer.js +1 -1
- package/lib/chrome/renderer.js.map +1 -1
- package/lib/chrome/secret-mask.d.ts +35 -0
- package/lib/chrome/secret-mask.js +180 -0
- package/lib/chrome/secret-mask.js.map +1 -0
- package/lib/chrome/status-config.d.ts +161 -51
- package/lib/chrome/status-config.js +237 -126
- package/lib/chrome/status-config.js.map +1 -1
- package/lib/chrome/status-line.d.ts +3 -2
- package/lib/chrome/status-line.js +105 -63
- package/lib/chrome/status-line.js.map +1 -1
- package/lib/chrome/terminal-colors.d.ts +85 -0
- package/lib/chrome/terminal-colors.js +230 -0
- package/lib/chrome/terminal-colors.js.map +1 -0
- package/lib/chrome/terminal-images.d.ts +9 -1
- package/lib/chrome/terminal-images.js +27 -4
- package/lib/chrome/terminal-images.js.map +1 -1
- package/lib/chrome/theme.d.ts +32 -9
- package/lib/chrome/theme.js +616 -520
- package/lib/chrome/theme.js.map +1 -1
- package/lib/chrome/tool-args.d.ts +1 -1
- package/lib/chrome/tool-args.js +3 -1
- package/lib/chrome/tool-args.js.map +1 -1
- package/lib/chrome/tool-renderers.d.ts +2 -0
- package/lib/chrome/tool-renderers.js +69 -3
- package/lib/chrome/tool-renderers.js.map +1 -1
- package/lib/chrome/tools-list.d.ts +1 -4
- package/lib/chrome/tools-list.js +1 -41
- package/lib/chrome/tools-list.js.map +1 -1
- package/lib/chrome/welcome-tips.d.ts +20 -7
- package/lib/chrome/welcome-tips.js +22 -41
- package/lib/chrome/welcome-tips.js.map +1 -1
- package/lib/commands/auth-ids.d.ts +25 -0
- package/lib/commands/auth-ids.js +27 -0
- package/lib/commands/auth-ids.js.map +1 -0
- package/lib/commands/auth-input.d.ts +34 -0
- package/lib/commands/auth-input.js +96 -0
- package/lib/commands/auth-input.js.map +1 -0
- package/lib/commands/auth-providers.d.ts +39 -0
- package/lib/commands/auth-providers.js +125 -0
- package/lib/commands/auth-providers.js.map +1 -0
- package/lib/commands/auth.d.ts +16 -22
- package/lib/commands/auth.js +346 -299
- package/lib/commands/auth.js.map +1 -1
- package/lib/commands/btw.d.ts +27 -0
- package/lib/commands/btw.js +59 -0
- package/lib/commands/btw.js.map +1 -0
- package/lib/commands/diff.js +30 -5
- package/lib/commands/diff.js.map +1 -1
- package/lib/commands/export.d.ts +1 -1
- package/lib/commands/export.js +5 -3
- package/lib/commands/export.js.map +1 -1
- package/lib/commands/files.d.ts +17 -1
- package/lib/commands/files.js +69 -61
- package/lib/commands/files.js.map +1 -1
- package/lib/commands/integrations.js +18 -6
- package/lib/commands/integrations.js.map +1 -1
- package/lib/commands/jobs.d.ts +19 -4
- package/lib/commands/jobs.js +50 -7
- package/lib/commands/jobs.js.map +1 -1
- package/lib/commands/model.js +109 -76
- package/lib/commands/model.js.map +1 -1
- package/lib/commands/permission.js +46 -13
- package/lib/commands/permission.js.map +1 -1
- package/lib/commands/plugins.js +196 -42
- package/lib/commands/plugins.js.map +1 -1
- package/lib/commands/schedule.d.ts +29 -0
- package/lib/commands/schedule.js +228 -0
- package/lib/commands/schedule.js.map +1 -0
- package/lib/commands/session-configuration.d.ts +1 -1
- package/lib/commands/session-configuration.js +29 -28
- package/lib/commands/session-configuration.js.map +1 -1
- package/lib/commands/session.js +75 -80
- package/lib/commands/session.js.map +1 -1
- package/lib/commands/terminal.d.ts +24 -4
- package/lib/commands/terminal.js +38 -94
- package/lib/commands/terminal.js.map +1 -1
- package/lib/commands/trajectory.js +4 -1
- package/lib/commands/trajectory.js.map +1 -1
- package/lib/definition.d.ts +150 -11
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/input/actions.d.ts +51 -0
- package/lib/input/actions.js +120 -0
- package/lib/input/actions.js.map +1 -0
- package/lib/input/editor-discovery.js +2 -2
- package/lib/input/editor-discovery.js.map +1 -1
- package/lib/input/editor.d.ts +0 -10
- package/lib/input/editor.js +11 -9
- package/lib/input/editor.js.map +1 -1
- package/lib/input/image-paste.d.ts +19 -1
- package/lib/input/image-paste.js +82 -1
- package/lib/input/image-paste.js.map +1 -1
- package/lib/input/keybindings-config.d.ts +15 -4
- package/lib/input/keybindings-config.js +57 -35
- package/lib/input/keybindings-config.js.map +1 -1
- package/lib/input/keys.d.ts +18 -0
- package/lib/input/keys.js +48 -3
- package/lib/input/keys.js.map +1 -1
- package/lib/input/wheel-scroll.d.ts +46 -0
- package/lib/input/wheel-scroll.js +69 -0
- package/lib/input/wheel-scroll.js.map +1 -0
- package/lib/prompt-intents.d.ts +182 -0
- package/lib/prompt-intents.js +127 -0
- package/lib/prompt-intents.js.map +1 -0
- package/lib/runtime/agent-profile.d.ts +5 -0
- package/lib/runtime/agent-profile.js +12 -0
- package/lib/runtime/agent-profile.js.map +1 -1
- package/lib/runtime/approval-rules.d.ts +59 -0
- package/lib/runtime/approval-rules.js +179 -0
- package/lib/runtime/approval-rules.js.map +1 -0
- package/lib/runtime/btw-policy.d.ts +7 -0
- package/lib/runtime/btw-policy.js +18 -0
- package/lib/runtime/btw-policy.js.map +1 -0
- package/lib/runtime/btw.d.ts +47 -0
- package/lib/runtime/btw.js +200 -0
- package/lib/runtime/btw.js.map +1 -0
- package/lib/runtime/cancellable.d.ts +75 -0
- package/lib/runtime/cancellable.js +76 -0
- package/lib/runtime/cancellable.js.map +1 -0
- package/lib/runtime/composer-images.js +5 -4
- package/lib/runtime/composer-images.js.map +1 -1
- package/lib/runtime/composer-shell.d.ts +30 -0
- package/lib/runtime/composer-shell.js +150 -0
- package/lib/runtime/composer-shell.js.map +1 -0
- package/lib/runtime/file-recovery-local.d.ts +73 -0
- package/lib/runtime/file-recovery-local.js +351 -0
- package/lib/runtime/file-recovery-local.js.map +1 -0
- package/lib/runtime/file-recovery-recording.d.ts +23 -0
- package/lib/runtime/file-recovery-recording.js +131 -0
- package/lib/runtime/file-recovery-recording.js.map +1 -0
- package/lib/runtime/file-recovery-review.d.ts +3 -0
- package/lib/runtime/file-recovery-review.js +130 -0
- package/lib/runtime/file-recovery-review.js.map +1 -0
- package/lib/runtime/file-recovery-store.d.ts +83 -0
- package/lib/runtime/file-recovery-store.js +329 -0
- package/lib/runtime/file-recovery-store.js.map +1 -0
- package/lib/runtime/file-recovery-worker.d.ts +22 -0
- package/lib/runtime/file-recovery-worker.js +153 -0
- package/lib/runtime/file-recovery-worker.js.map +1 -0
- package/lib/runtime/file-review.d.ts +6 -3
- package/lib/runtime/file-review.js +44 -7
- package/lib/runtime/file-review.js.map +1 -1
- package/lib/runtime/herdr-agent.d.ts +4 -13
- package/lib/runtime/herdr-agent.js +19 -63
- package/lib/runtime/herdr-agent.js.map +1 -1
- package/lib/runtime/plain-tui.d.ts +2 -0
- package/lib/runtime/plain-tui.js +7 -1
- package/lib/runtime/plain-tui.js.map +1 -1
- package/lib/runtime/plugin-settings.d.ts +25 -2
- package/lib/runtime/plugin-settings.js +329 -31
- package/lib/runtime/plugin-settings.js.map +1 -1
- package/lib/runtime/provider-local.d.ts +81 -24
- package/lib/runtime/provider-local.js +1807 -608
- package/lib/runtime/provider-local.js.map +1 -1
- package/lib/runtime/runner.js +52 -12
- package/lib/runtime/runner.js.map +1 -1
- package/lib/runtime/session-archive.d.ts +6 -0
- package/lib/runtime/session-archive.js +129 -3
- package/lib/runtime/session-archive.js.map +1 -1
- package/lib/runtime/session-runtime.js +1 -1
- package/lib/runtime/session-runtime.js.map +1 -1
- package/lib/runtime/settings-preferences.d.ts +5 -0
- package/lib/runtime/settings-preferences.js +34 -0
- package/lib/runtime/settings-preferences.js.map +1 -0
- package/lib/runtime/startup-notices.js +2 -0
- package/lib/runtime/startup-notices.js.map +1 -1
- package/lib/runtime/terminal-modes.d.ts +47 -0
- package/lib/runtime/terminal-modes.js +86 -0
- package/lib/runtime/terminal-modes.js.map +1 -0
- package/lib/runtime/terminal-notifications.d.ts +3 -5
- package/lib/runtime/terminal-notifications.js +4 -8
- package/lib/runtime/terminal-notifications.js.map +1 -1
- package/lib/runtime/terminal-probe.d.ts +36 -0
- package/lib/runtime/terminal-probe.js +37 -0
- package/lib/runtime/terminal-probe.js.map +1 -0
- package/lib/runtime/terminal-session.d.ts +57 -0
- package/lib/runtime/terminal-session.js +164 -0
- package/lib/runtime/terminal-session.js.map +1 -0
- package/lib/runtime/terminal-state.d.ts +29 -0
- package/lib/runtime/terminal-state.js +62 -0
- package/lib/runtime/terminal-state.js.map +1 -0
- package/lib/runtime/tool-presentation.js +50 -14
- package/lib/runtime/tool-presentation.js.map +1 -1
- package/lib/session/external-agents.d.ts +5 -0
- package/lib/session/external-agents.js +27 -0
- package/lib/session/external-agents.js.map +1 -0
- package/lib/session/feature-toggles.d.ts +1 -1
- package/lib/session/feature-toggles.js +1 -1
- package/lib/session/interaction-adapter.d.ts +1 -6
- package/lib/session/interaction-adapter.js +95 -18
- package/lib/session/interaction-adapter.js.map +1 -1
- package/lib/session/message-queue.js +1 -1
- package/lib/session/message-queue.js.map +1 -1
- package/lib/session/model-readiness.d.ts +16 -0
- package/lib/session/model-readiness.js +43 -0
- package/lib/session/model-readiness.js.map +1 -0
- package/lib/session/package-metadata.d.ts +8 -0
- package/lib/session/package-metadata.js +8 -0
- package/lib/session/package-metadata.js.map +1 -1
- package/lib/session/project-context.d.ts +5 -0
- package/lib/session/project-context.js +36 -0
- package/lib/session/project-context.js.map +1 -1
- package/lib/session/session-controller.d.ts +10 -13
- package/lib/session/session-controller.js +183 -98
- package/lib/session/session-controller.js.map +1 -1
- package/lib/session/session-library.js +2 -0
- package/lib/session/session-library.js.map +1 -1
- package/lib/session/session-tree.d.ts +3 -0
- package/lib/session/session-tree.js +3 -1
- package/lib/session/session-tree.js.map +1 -1
- package/lib/session/subagent-roster.d.ts +2 -1
- package/lib/session/subagent-roster.js +24 -3
- package/lib/session/subagent-roster.js.map +1 -1
- package/lib/session/subagent-tracker.d.ts +6 -2
- package/lib/session/subagent-tracker.js +49 -2
- package/lib/session/subagent-tracker.js.map +1 -1
- package/lib/session/tui-settings.d.ts +47 -13
- package/lib/session/tui-settings.js +76 -34
- package/lib/session/tui-settings.js.map +1 -1
- package/lib/session/working-directory.d.ts +4 -0
- package/lib/session/working-directory.js +4 -0
- package/lib/session/working-directory.js.map +1 -0
- package/lib/session/worktrees.d.ts +13 -0
- package/lib/session/worktrees.js +49 -0
- package/lib/session/worktrees.js.map +1 -0
- package/lib/views/approval-rule.d.ts +3 -0
- package/lib/views/approval-rule.js +4 -0
- package/lib/views/approval-rule.js.map +1 -0
- package/lib/views/at-complete.d.ts +8 -0
- package/lib/views/at-complete.js +64 -2
- package/lib/views/at-complete.js.map +1 -1
- package/lib/views/autocomplete.d.ts +22 -2
- package/lib/views/autocomplete.js +70 -40
- package/lib/views/autocomplete.js.map +1 -1
- package/lib/views/copy-targets.d.ts +13 -14
- package/lib/views/copy-targets.js +42 -54
- package/lib/views/copy-targets.js.map +1 -1
- package/lib/views/document-reader.js +18 -5
- package/lib/views/document-reader.js.map +1 -1
- package/lib/views/event-views.d.ts +1 -1
- package/lib/views/event-views.js +60 -6
- package/lib/views/event-views.js.map +1 -1
- package/lib/views/file-actions.d.ts +12 -0
- package/lib/views/file-actions.js +72 -0
- package/lib/views/file-actions.js.map +1 -0
- package/lib/views/history-search.js +15 -21
- package/lib/views/history-search.js.map +1 -1
- package/lib/views/hotkeys.d.ts +8 -1
- package/lib/views/hotkeys.js +53 -26
- package/lib/views/hotkeys.js.map +1 -1
- package/lib/views/list-navigation.d.ts +62 -0
- package/lib/views/list-navigation.js +73 -0
- package/lib/views/list-navigation.js.map +1 -0
- package/lib/views/list-view.d.ts +99 -0
- package/lib/views/list-view.js +165 -0
- package/lib/views/list-view.js.map +1 -0
- package/lib/views/prompt-selector.d.ts +34 -4
- package/lib/views/prompt-selector.js +270 -134
- package/lib/views/prompt-selector.js.map +1 -1
- package/lib/views/session-files.d.ts +1 -2
- package/lib/views/session-files.js +1 -11
- package/lib/views/session-files.js.map +1 -1
- package/lib/views/settings-list.d.ts +51 -10
- package/lib/views/settings-list.js +267 -315
- package/lib/views/settings-list.js.map +1 -1
- package/lib/views/trajectory-timeline.d.ts +72 -0
- package/lib/views/trajectory-timeline.js +133 -0
- package/lib/views/trajectory-timeline.js.map +1 -0
- package/lib/views/trajectory.d.ts +15 -4
- package/lib/views/trajectory.js +557 -123
- package/lib/views/trajectory.js.map +1 -1
- package/lib/views/transcript-export.js +9 -0
- package/lib/views/transcript-export.js.map +1 -1
- package/lib/views/transcript-render.d.ts +97 -25
- package/lib/views/transcript-render.js +542 -170
- package/lib/views/transcript-render.js.map +1 -1
- package/lib/views/transcript-search.d.ts +39 -6
- package/lib/views/transcript-search.js +46 -11
- package/lib/views/transcript-search.js.map +1 -1
- package/lib/views/transcript-types.d.ts +63 -5
- package/lib/views/transcript-types.js +23 -11
- package/lib/views/transcript-types.js.map +1 -1
- package/package.json +95 -65
- package/lib/commands/loop.d.ts +0 -52
- package/lib/commands/loop.js +0 -307
- package/lib/commands/loop.js.map +0 -1
- package/lib/commands/steer.d.ts +0 -5
- package/lib/commands/steer.js +0 -24
- package/lib/commands/steer.js.map +0 -1
- package/lib/runtime/terminal-reader.d.ts +0 -11
- package/lib/runtime/terminal-reader.js +0 -87
- package/lib/runtime/terminal-reader.js.map +0 -1
- package/lib/views/agent-hub.d.ts +0 -32
- package/lib/views/agent-hub.js +0 -206
- package/lib/views/agent-hub.js.map +0 -1
- package/lib/views/copy-selector.d.ts +0 -51
- package/lib/views/copy-selector.js +0 -139
- package/lib/views/copy-selector.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Opt-in terminal notifications kept outside the transcript renderer. */
|
|
2
|
-
export type TerminalNotificationPolicy = 'off' | '
|
|
2
|
+
export type TerminalNotificationPolicy = 'off' | 'unfocused' | 'always';
|
|
3
3
|
export interface TerminalNotificationOptions {
|
|
4
4
|
readonly policy: TerminalNotificationPolicy;
|
|
5
5
|
readonly thresholdMs: number;
|
|
@@ -20,15 +20,13 @@ export declare class TerminalNotificationController {
|
|
|
20
20
|
event(event: NotificationEvent, now?: number): TerminalNotification | undefined;
|
|
21
21
|
humanPrompt(label?: string): TerminalNotification | undefined;
|
|
22
22
|
}
|
|
23
|
-
export type NotificationFocus = 'always' | 'unfocused';
|
|
24
23
|
/** Keep one notification per event burst, with input requests and failures first. */
|
|
25
24
|
export declare class TerminalNotificationQueue {
|
|
26
25
|
#private;
|
|
27
26
|
offer(notification: TerminalNotification): void;
|
|
28
27
|
clear(): void;
|
|
29
|
-
|
|
28
|
+
/** Drain the coalesced event. Whether it should be delivered is the caller's policy. */
|
|
29
|
+
take(): TerminalNotification | undefined;
|
|
30
30
|
}
|
|
31
31
|
/** OSC 9 is supported by common terminal emulators and never enters screen text. */
|
|
32
32
|
export declare function terminalNotificationSequence(notification: TerminalNotification): string;
|
|
33
|
-
/** Windows Terminal-compatible native taskbar/tab progress sequences. */
|
|
34
|
-
export declare function terminalProgressSequence(active: boolean): string;
|
|
@@ -45,7 +45,7 @@ export class TerminalNotificationController {
|
|
|
45
45
|
if (startedAt === undefined || this.#options.policy === 'off')
|
|
46
46
|
return undefined;
|
|
47
47
|
const elapsedMs = Math.max(0, endedAt - startedAt);
|
|
48
|
-
if (this.#options.policy === '
|
|
48
|
+
if (this.#options.policy === 'unfocused' && elapsedMs < this.#options.thresholdMs)
|
|
49
49
|
return undefined;
|
|
50
50
|
return {
|
|
51
51
|
title: event.reason && event.reason !== 'complete' && event.reason !== 'completed' ? 'omdsh needs attention' : 'omdsh finished',
|
|
@@ -67,11 +67,11 @@ export class TerminalNotificationQueue {
|
|
|
67
67
|
this.#pending = notification;
|
|
68
68
|
}
|
|
69
69
|
clear() { this.#pending = undefined; }
|
|
70
|
-
|
|
70
|
+
/** Drain the coalesced event. Whether it should be delivered is the caller's policy. */
|
|
71
|
+
take() {
|
|
71
72
|
const pending = this.#pending;
|
|
72
73
|
this.clear();
|
|
73
|
-
|
|
74
|
-
return condition === 'unfocused' && focused === true ? undefined : pending;
|
|
74
|
+
return pending;
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
function cleanNotificationText(value) {
|
|
@@ -82,8 +82,4 @@ export function terminalNotificationSequence(notification) {
|
|
|
82
82
|
const message = cleanNotificationText(`${notification.title}: ${notification.body}`);
|
|
83
83
|
return message ? `\x1b]9;${message}\x07` : '';
|
|
84
84
|
}
|
|
85
|
-
/** Windows Terminal-compatible native taskbar/tab progress sequences. */
|
|
86
|
-
export function terminalProgressSequence(active) {
|
|
87
|
-
return active ? '\x1b]9;4;3\x07' : '\x1b]9;4;0;\x07';
|
|
88
|
-
}
|
|
89
85
|
//# sourceMappingURL=terminal-notifications.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-notifications.js","sourceRoot":"","sources":["../../src/runtime/terminal-notifications.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAoB1E,MAAM,eAAe,GAAgC;IACnD,MAAM,EAAE,KAAK;IACb,WAAW,EAAE,MAAM;CACpB,CAAA;
|
|
1
|
+
{"version":3,"file":"terminal-notifications.js","sourceRoot":"","sources":["../../src/runtime/terminal-notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard protocol negotiation: whether to speak the Kitty keyboard protocol,
|
|
3
|
+
* and the sequences that ask for it and give it back.
|
|
4
|
+
*
|
|
5
|
+
* The query only asks (`CSI ? u`) and never changes the terminal's state; the
|
|
6
|
+
* primary device-attributes request that follows is answered by every
|
|
7
|
+
* terminal, so it marks the end of the round trip. A terminal that reports
|
|
8
|
+
* Kitty flags gets exactly one push of the disambiguate flag; the session's
|
|
9
|
+
* mode registry pops it on hand-off and exit and pushes it again on resume. A
|
|
10
|
+
* terminal that answers only the device attributes keeps its legacy encoding.
|
|
11
|
+
* @module @agi-fans/dsh-tui/terminal-probe
|
|
12
|
+
*/
|
|
13
|
+
import type { KeyEvent } from '../input/keys.ts';
|
|
14
|
+
/** Ask for the current Kitty flags. Changes nothing; the session's own sentinel follows it. */
|
|
15
|
+
export declare const KEYBOARD_PROTOCOL_QUERY = "\u001B[?u";
|
|
16
|
+
/** Push Kitty flag 1 (disambiguate escape codes) for this session. */
|
|
17
|
+
export declare const KITTY_PROTOCOL_ON = "\u001B[>1u";
|
|
18
|
+
/** Pop the one Kitty entry this session pushed. */
|
|
19
|
+
export declare const KITTY_PROTOCOL_OFF = "\u001B[<u";
|
|
20
|
+
/** The protocol a session settled on; absent while negotiating or when the terminal offers none. */
|
|
21
|
+
export type KeyboardProtocol = 'kitty';
|
|
22
|
+
/** One step of the negotiation. */
|
|
23
|
+
export interface NegotiationStep {
|
|
24
|
+
protocol?: KeyboardProtocol;
|
|
25
|
+
/** The enable sequence the caller must write, at most once per session. */
|
|
26
|
+
output?: string;
|
|
27
|
+
/** True once the terminal has answered enough for the choice to be final. */
|
|
28
|
+
settled: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Advance the negotiation with one decoded event.
|
|
32
|
+
* @param protocol - what the session currently speaks, if anything.
|
|
33
|
+
* @param event - the decoded input event.
|
|
34
|
+
* @returns the next protocol, any sequence to write, and whether the choice is final.
|
|
35
|
+
*/
|
|
36
|
+
export declare function negotiateKeyboard(protocol: KeyboardProtocol | undefined, event: KeyEvent): NegotiationStep;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard protocol negotiation: whether to speak the Kitty keyboard protocol,
|
|
3
|
+
* and the sequences that ask for it and give it back.
|
|
4
|
+
*
|
|
5
|
+
* The query only asks (`CSI ? u`) and never changes the terminal's state; the
|
|
6
|
+
* primary device-attributes request that follows is answered by every
|
|
7
|
+
* terminal, so it marks the end of the round trip. A terminal that reports
|
|
8
|
+
* Kitty flags gets exactly one push of the disambiguate flag; the session's
|
|
9
|
+
* mode registry pops it on hand-off and exit and pushes it again on resume. A
|
|
10
|
+
* terminal that answers only the device attributes keeps its legacy encoding.
|
|
11
|
+
* @module @agi-fans/dsh-tui/terminal-probe
|
|
12
|
+
*/
|
|
13
|
+
/** Ask for the current Kitty flags. Changes nothing; the session's own sentinel follows it. */
|
|
14
|
+
export const KEYBOARD_PROTOCOL_QUERY = '\x1b[?u';
|
|
15
|
+
/** Push Kitty flag 1 (disambiguate escape codes) for this session. */
|
|
16
|
+
export const KITTY_PROTOCOL_ON = '\x1b[>1u';
|
|
17
|
+
/** Pop the one Kitty entry this session pushed. */
|
|
18
|
+
export const KITTY_PROTOCOL_OFF = '\x1b[<u';
|
|
19
|
+
/**
|
|
20
|
+
* Advance the negotiation with one decoded event.
|
|
21
|
+
* @param protocol - what the session currently speaks, if anything.
|
|
22
|
+
* @param event - the decoded input event.
|
|
23
|
+
* @returns the next protocol, any sequence to write, and whether the choice is final.
|
|
24
|
+
*/
|
|
25
|
+
export function negotiateKeyboard(protocol, event) {
|
|
26
|
+
if (protocol !== undefined)
|
|
27
|
+
return { protocol, settled: true };
|
|
28
|
+
// Any flags report, zero included, proves the terminal implements the
|
|
29
|
+
// protocol; the reported value is only what is enabled right now.
|
|
30
|
+
if (event.type === 'kitty-flags')
|
|
31
|
+
return { protocol: 'kitty', output: KITTY_PROTOCOL_ON, settled: true };
|
|
32
|
+
// The sentinel arrived without a flags report: keep the legacy encoding.
|
|
33
|
+
if (event.type === 'device-attributes')
|
|
34
|
+
return { settled: true };
|
|
35
|
+
return { settled: false };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=terminal-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-probe.js","sourceRoot":"","sources":["../../src/runtime/terminal-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAA;AAChD,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAC3C,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAA;AAc3C;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAsC,EAAE,KAAe;IACvF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC9D,sEAAsE;IACtE,kEAAkE;IAClE,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACxG,yEAAyE;IACzE,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAChE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns the terminal's capability probe and the modes the session turns on.
|
|
3
|
+
*
|
|
4
|
+
* One query asks for the keyboard protocol, the reported colors and scheme,
|
|
5
|
+
* and DEC mode 2031 support; a trailing device-attributes request is the
|
|
6
|
+
* sentinel every terminal answers, so the probe settles on its reply instead
|
|
7
|
+
* of a timeout. Replies that arrive after settlement — late palette entries,
|
|
8
|
+
* color-scheme pushes — are adopted and coalesced into one `colorsChanged`
|
|
9
|
+
* call per burst.
|
|
10
|
+
* @module @agi-fans/dsh-tui/terminal-session
|
|
11
|
+
*/
|
|
12
|
+
import { type TerminalColors } from '../chrome/terminal-colors.ts';
|
|
13
|
+
import type { KeyEvent } from '../input/keys.ts';
|
|
14
|
+
import { type TerminalMode } from './terminal-modes.ts';
|
|
15
|
+
import { type KeyboardProtocol } from './terminal-probe.ts';
|
|
16
|
+
/**
|
|
17
|
+
* The one startup probe. The device-attributes request MUST stay last:
|
|
18
|
+
* terminals answer in order, so its reply marks the end of every reply the
|
|
19
|
+
* earlier queries produced.
|
|
20
|
+
*/
|
|
21
|
+
export declare const CAPABILITY_QUERY: string;
|
|
22
|
+
export interface TerminalSessionHost {
|
|
23
|
+
write(bytes: string): void;
|
|
24
|
+
/** Renderer hooks for per-screen Kitty stacks. */
|
|
25
|
+
alternateActive(): boolean;
|
|
26
|
+
setAlternateScreenModes(modes: {
|
|
27
|
+
enter: string;
|
|
28
|
+
exit: string;
|
|
29
|
+
}): void;
|
|
30
|
+
deferUntilMainScreen(bytes: string): void;
|
|
31
|
+
/** Called (coalesced) when reported colors or scheme changed after settlement. */
|
|
32
|
+
colorsChanged(): void;
|
|
33
|
+
/** Called exactly once when the startup probe settles (DA1 reply or timeout). */
|
|
34
|
+
probeSettled(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare class TerminalSession {
|
|
37
|
+
#private;
|
|
38
|
+
constructor(host: TerminalSessionHost, options?: {
|
|
39
|
+
probeTimeoutMs?: number;
|
|
40
|
+
});
|
|
41
|
+
get colors(): TerminalColors;
|
|
42
|
+
get keyboardProtocol(): KeyboardProtocol | undefined;
|
|
43
|
+
get settled(): boolean;
|
|
44
|
+
/** Write the one-time capability query and arm its deadline. */
|
|
45
|
+
start(): void;
|
|
46
|
+
setMode(name: string, mode: TerminalMode, on: boolean): void;
|
|
47
|
+
handOff(): void;
|
|
48
|
+
takeBack(): void;
|
|
49
|
+
release(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Consume one decoded event. Returns true for capability replies — color,
|
|
52
|
+
* scheme, keyboard and mode reports — so the caller drops them rather than
|
|
53
|
+
* treating them as input.
|
|
54
|
+
*/
|
|
55
|
+
handle(event: KeyEvent): boolean;
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns the terminal's capability probe and the modes the session turns on.
|
|
3
|
+
*
|
|
4
|
+
* One query asks for the keyboard protocol, the reported colors and scheme,
|
|
5
|
+
* and DEC mode 2031 support; a trailing device-attributes request is the
|
|
6
|
+
* sentinel every terminal answers, so the probe settles on its reply instead
|
|
7
|
+
* of a timeout. Replies that arrive after settlement — late palette entries,
|
|
8
|
+
* color-scheme pushes — are adopted and coalesced into one `colorsChanged`
|
|
9
|
+
* call per burst.
|
|
10
|
+
* @module @agi-fans/dsh-tui/terminal-session
|
|
11
|
+
*/
|
|
12
|
+
import { COLOR_QUERY, COLOR_SCHEME_QUERY, mergeColorReply } from "../chrome/terminal-colors.js";
|
|
13
|
+
import { KITTY_KEYBOARD, TerminalModes } from "./terminal-modes.js";
|
|
14
|
+
import { KEYBOARD_PROTOCOL_QUERY, negotiateKeyboard } from "./terminal-probe.js";
|
|
15
|
+
/**
|
|
16
|
+
* The one startup probe. The device-attributes request MUST stay last:
|
|
17
|
+
* terminals answer in order, so its reply marks the end of every reply the
|
|
18
|
+
* earlier queries produced.
|
|
19
|
+
*/
|
|
20
|
+
export const CAPABILITY_QUERY = KEYBOARD_PROTOCOL_QUERY + COLOR_QUERY + COLOR_SCHEME_QUERY + '\x1b[?2031$p' + '\x1b[c';
|
|
21
|
+
/** DEC mode 2031 enable/disable, armed only after DECRQM reports support. */
|
|
22
|
+
const COLOR_SCHEME_NOTIFY = { enable: '\x1b[?2031h', disable: '\x1b[?2031l' };
|
|
23
|
+
/** How long the startup probe may wait for the DA1 sentinel. */
|
|
24
|
+
const DEFAULT_PROBE_TIMEOUT_MS = 200;
|
|
25
|
+
/** Color replies are coalesced into one colorsChanged call per this window. */
|
|
26
|
+
const COLORS_CHANGED_MS = 30;
|
|
27
|
+
/** A scheme change re-queries the colors after this debounce. */
|
|
28
|
+
const SCHEME_REQUERY_MS = 100;
|
|
29
|
+
export class TerminalSession {
|
|
30
|
+
#host;
|
|
31
|
+
#probeTimeoutMs;
|
|
32
|
+
#modes;
|
|
33
|
+
#colors = {};
|
|
34
|
+
#keyboardProtocol;
|
|
35
|
+
#querySent = false;
|
|
36
|
+
#settled = false;
|
|
37
|
+
#settleNotified = false;
|
|
38
|
+
#probeTimer;
|
|
39
|
+
#colorTimer;
|
|
40
|
+
#schemeTimer;
|
|
41
|
+
#disposed = false;
|
|
42
|
+
constructor(host, options) {
|
|
43
|
+
this.#host = host;
|
|
44
|
+
this.#probeTimeoutMs = options?.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;
|
|
45
|
+
this.#modes = new TerminalModes(bytes => { host.write(bytes); });
|
|
46
|
+
}
|
|
47
|
+
get colors() { return this.#colors; }
|
|
48
|
+
get keyboardProtocol() { return this.#keyboardProtocol; }
|
|
49
|
+
get settled() { return this.#settled; }
|
|
50
|
+
/** Write the one-time capability query and arm its deadline. */
|
|
51
|
+
start() {
|
|
52
|
+
if (this.#querySent)
|
|
53
|
+
return;
|
|
54
|
+
this.#querySent = true;
|
|
55
|
+
this.#host.write(CAPABILITY_QUERY);
|
|
56
|
+
this.#probeTimer = setTimeout(() => {
|
|
57
|
+
this.#probeTimer = undefined;
|
|
58
|
+
this.#settle();
|
|
59
|
+
}, this.#probeTimeoutMs);
|
|
60
|
+
}
|
|
61
|
+
setMode(name, mode, on) {
|
|
62
|
+
if (on)
|
|
63
|
+
this.#modes.enable(name, mode);
|
|
64
|
+
else
|
|
65
|
+
this.#modes.disable(name);
|
|
66
|
+
}
|
|
67
|
+
handOff() { this.#modes.handOff(); }
|
|
68
|
+
takeBack() { this.#modes.takeBack(); }
|
|
69
|
+
release() { this.#modes.release(); }
|
|
70
|
+
/**
|
|
71
|
+
* Consume one decoded event. Returns true for capability replies — color,
|
|
72
|
+
* scheme, keyboard and mode reports — so the caller drops them rather than
|
|
73
|
+
* treating them as input.
|
|
74
|
+
*/
|
|
75
|
+
handle(event) {
|
|
76
|
+
if (event.type === 'color-reply') {
|
|
77
|
+
this.#colors = mergeColorReply(this.#colors, event.reply);
|
|
78
|
+
this.#colorsDirty();
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
if (event.type === 'color-scheme') {
|
|
82
|
+
const previous = this.#colors.scheme;
|
|
83
|
+
this.#colors = { ...this.#colors, scheme: event.scheme };
|
|
84
|
+
this.#colorsDirty();
|
|
85
|
+
// A scheme flip after settlement re-queries the palette so quantized
|
|
86
|
+
// colors follow the new polarity; identical reports need nothing.
|
|
87
|
+
if (this.#settled && previous !== event.scheme && this.#schemeTimer === undefined) {
|
|
88
|
+
this.#schemeTimer = setTimeout(() => {
|
|
89
|
+
this.#schemeTimer = undefined;
|
|
90
|
+
if (!this.#disposed)
|
|
91
|
+
this.#host.write(COLOR_QUERY);
|
|
92
|
+
}, SCHEME_REQUERY_MS);
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
if (event.type === 'kitty-flags' || event.type === 'device-attributes') {
|
|
97
|
+
const step = negotiateKeyboard(this.#keyboardProtocol, event);
|
|
98
|
+
if (step.output !== undefined && step.protocol === 'kitty') {
|
|
99
|
+
if (this.#host.alternateActive()) {
|
|
100
|
+
// The overlay owns this Kitty stack; the main screen's push waits
|
|
101
|
+
// for the exit so each buffer sees exactly one.
|
|
102
|
+
this.#modes.adopt('keyboard', KITTY_KEYBOARD);
|
|
103
|
+
this.#host.deferUntilMainScreen(KITTY_KEYBOARD.enable);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
this.#modes.enable('keyboard', KITTY_KEYBOARD);
|
|
107
|
+
}
|
|
108
|
+
this.#host.setAlternateScreenModes({ enter: KITTY_KEYBOARD.enable, exit: KITTY_KEYBOARD.disable });
|
|
109
|
+
}
|
|
110
|
+
this.#keyboardProtocol = step.protocol ?? this.#keyboardProtocol;
|
|
111
|
+
if (event.type === 'device-attributes' && !this.#settled)
|
|
112
|
+
this.#settle();
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
if (event.type === 'mode-report') {
|
|
116
|
+
if (event.mode === 2031 && (event.state === 1 || event.state === 2)) {
|
|
117
|
+
this.#modes.enable('color-scheme-notify', COLOR_SCHEME_NOTIFY);
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
dispose() {
|
|
124
|
+
this.#disposed = true;
|
|
125
|
+
if (this.#probeTimer !== undefined)
|
|
126
|
+
clearTimeout(this.#probeTimer);
|
|
127
|
+
if (this.#colorTimer !== undefined)
|
|
128
|
+
clearTimeout(this.#colorTimer);
|
|
129
|
+
if (this.#schemeTimer !== undefined)
|
|
130
|
+
clearTimeout(this.#schemeTimer);
|
|
131
|
+
this.#probeTimer = this.#colorTimer = this.#schemeTimer = undefined;
|
|
132
|
+
this.#modes.release();
|
|
133
|
+
}
|
|
134
|
+
#settle() {
|
|
135
|
+
if (this.#settled)
|
|
136
|
+
return;
|
|
137
|
+
this.#settled = true;
|
|
138
|
+
if (this.#probeTimer !== undefined) {
|
|
139
|
+
clearTimeout(this.#probeTimer);
|
|
140
|
+
this.#probeTimer = undefined;
|
|
141
|
+
}
|
|
142
|
+
if (this.#settleNotified)
|
|
143
|
+
return;
|
|
144
|
+
this.#settleNotified = true;
|
|
145
|
+
// Replies buffered while probing are part of the settled frame, so only
|
|
146
|
+
// changes from here on notify.
|
|
147
|
+
if (this.#colorTimer !== undefined) {
|
|
148
|
+
clearTimeout(this.#colorTimer);
|
|
149
|
+
this.#colorTimer = undefined;
|
|
150
|
+
}
|
|
151
|
+
this.#host.probeSettled();
|
|
152
|
+
}
|
|
153
|
+
/** Mark accumulated colors dirty; changes notify only after settlement. */
|
|
154
|
+
#colorsDirty() {
|
|
155
|
+
if (!this.#settled || this.#colorTimer !== undefined)
|
|
156
|
+
return;
|
|
157
|
+
this.#colorTimer = setTimeout(() => {
|
|
158
|
+
this.#colorTimer = undefined;
|
|
159
|
+
if (!this.#disposed)
|
|
160
|
+
this.#host.colorsChanged();
|
|
161
|
+
}, COLORS_CHANGED_MS);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=terminal-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-session.js","sourceRoot":"","sources":["../../src/runtime/terminal-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAuB,MAAM,8BAA8B,CAAA;AAEpH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAA;AACtF,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAyB,MAAM,qBAAqB,CAAA;AAEvG;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,GAAG,QAAQ,CAAA;AAEtH,6EAA6E;AAC7E,MAAM,mBAAmB,GAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;AAE3F,gEAAgE;AAChE,MAAM,wBAAwB,GAAG,GAAG,CAAA;AACpC,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAC5B,iEAAiE;AACjE,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAc7B,MAAM,OAAO,eAAe;IACjB,KAAK,CAAqB;IAC1B,eAAe,CAAQ;IACvB,MAAM,CAAe;IAC9B,OAAO,GAAmB,EAAE,CAAA;IAC5B,iBAAiB,CAA8B;IAC/C,UAAU,GAAG,KAAK,CAAA;IAClB,QAAQ,GAAG,KAAK,CAAA;IAChB,eAAe,GAAG,KAAK,CAAA;IACvB,WAAW,CAA2C;IACtD,WAAW,CAA2C;IACtD,YAAY,CAA2C;IACvD,SAAS,GAAG,KAAK,CAAA;IAEjB,YAAY,IAAyB,EAAE,OAAqC;QAC1E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,cAAc,IAAI,wBAAwB,CAAA;QAC1E,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,MAAM,KAAqB,OAAO,IAAI,CAAC,OAAO,CAAA,CAAC,CAAC;IACpD,IAAI,gBAAgB,KAAmC,OAAO,IAAI,CAAC,iBAAiB,CAAA,CAAC,CAAC;IACtF,IAAI,OAAO,KAAc,OAAO,IAAI,CAAC,QAAQ,CAAA,CAAC,CAAC;IAE/C,gEAAgE;IAChE,KAAK;QACH,IAAI,IAAI,CAAC,UAAU;YAAE,OAAM;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAClC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;IAC1B,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,IAAkB,EAAE,EAAW;QACnD,IAAI,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;;YACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,KAAW,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC;IACzC,QAAQ,KAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAC,CAAC;IAC3C,OAAO,KAAW,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC;IAEzC;;;;OAIG;IACH,MAAM,CAAC,KAAe;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;YACzD,IAAI,CAAC,YAAY,EAAE,CAAA;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;YACpC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;YACxD,IAAI,CAAC,YAAY,EAAE,CAAA;YACnB,qEAAqE;YACrE,kEAAkE;YAClE,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBAClF,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;oBAClC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAA;oBAC7B,IAAI,CAAC,IAAI,CAAC,SAAS;wBAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBACpD,CAAC,EAAE,iBAAiB,CAAC,CAAA;YACvB,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;YAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC3D,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC;oBACjC,kEAAkE;oBAClE,gDAAgD;oBAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;oBAC7C,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;gBACxD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;gBAChD,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,CAAA;YACpG,CAAC;YACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,CAAA;YAChE,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAA;YACxE,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAA;YAChE,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAClE,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAClE,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACpE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,GAAG,SAAS,CAAA;QACnE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC9B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,eAAe;YAAE,OAAM;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,wEAAwE;QACxE,+BAA+B;QAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC9B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;QAC9B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAA;IAC3B,CAAC;IAED,2EAA2E;IAC3E,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,OAAM;QAC5D,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;YAC5B,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAA;QACjD,CAAC,EAAE,iBAAiB,CAAC,CAAA;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type AgentActivityState = 'idle' | 'working' | 'blocked';
|
|
2
|
+
export interface AgentActivityStatus {
|
|
3
|
+
readonly state: AgentActivityState;
|
|
4
|
+
readonly message?: string;
|
|
5
|
+
}
|
|
6
|
+
export type TerminalProgramState = AgentActivityState | 'done' | 'error';
|
|
7
|
+
export interface TerminalProgramStatus {
|
|
8
|
+
readonly state: TerminalProgramState;
|
|
9
|
+
readonly message?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const TERMINAL_TITLE_MODES: readonly ["status", "session", "workspace", "off"];
|
|
12
|
+
export type TerminalTitleMode = typeof TERMINAL_TITLE_MODES[number];
|
|
13
|
+
export declare const TERMINAL_STATE_MODES: readonly ["auto", "on", "off"];
|
|
14
|
+
export type TerminalStateMode = typeof TERMINAL_STATE_MODES[number];
|
|
15
|
+
export declare const PROGRAM_STATUS_QUERY = "\u001B]7501;?\u001B\\";
|
|
16
|
+
/** Status protocol carries titles only, never prompts, tool input or error payloads. */
|
|
17
|
+
export declare function programStatusSequence(status: TerminalProgramStatus | 'clear'): string;
|
|
18
|
+
export declare function terminalTitle(mode: TerminalTitleMode, status: TerminalProgramStatus, session: string | undefined, cwd: string, branch?: string): string;
|
|
19
|
+
export declare class AgentActivityController {
|
|
20
|
+
#private;
|
|
21
|
+
get current(): AgentActivityStatus;
|
|
22
|
+
get program(): TerminalProgramStatus;
|
|
23
|
+
start(): AgentActivityStatus;
|
|
24
|
+
setRunning(running: boolean): AgentActivityStatus | undefined;
|
|
25
|
+
settled(reason: string): void;
|
|
26
|
+
resetResult(): void;
|
|
27
|
+
prompt(message?: string): AgentActivityStatus | undefined;
|
|
28
|
+
promptResolved(): AgentActivityStatus | undefined;
|
|
29
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** Root activity projected once for Herdr and the foreground terminal. */
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
export const TERMINAL_TITLE_MODES = ['status', 'session', 'workspace', 'off'];
|
|
4
|
+
export const TERMINAL_STATE_MODES = ['auto', 'on', 'off'];
|
|
5
|
+
export const PROGRAM_STATUS_QUERY = '\x1b]7501;?\x1b\\';
|
|
6
|
+
function clean(value, limit) {
|
|
7
|
+
if (value === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
const text = [...value.replace(/[\u0000-\u001f\u007f-\u009f]/gu, ' ').replace(/\s+/gu, ' ').trim()].slice(0, limit).join('');
|
|
10
|
+
return text === '' ? undefined : text;
|
|
11
|
+
}
|
|
12
|
+
/** Status protocol carries titles only, never prompts, tool input or error payloads. */
|
|
13
|
+
export function programStatusSequence(status) {
|
|
14
|
+
if (status === 'clear')
|
|
15
|
+
return '\x1b]7501;state=clear:app=omdsh\x1b\\';
|
|
16
|
+
const message = clean(status.message, 240);
|
|
17
|
+
return `\x1b]7501;state=${status.state}:app=omdsh${message === undefined ? '' : `:msg=${Buffer.from(message).toString('base64')}`}\x1b\\`;
|
|
18
|
+
}
|
|
19
|
+
const STATE_LABELS = { idle: 'Ready', working: 'Working', blocked: 'Needs input', done: 'Done', error: 'Failed' };
|
|
20
|
+
export function terminalTitle(mode, status, session, cwd, branch) {
|
|
21
|
+
if (mode === 'off')
|
|
22
|
+
return '';
|
|
23
|
+
if (mode === 'session')
|
|
24
|
+
return clean(session, 120) ?? '';
|
|
25
|
+
const subject = mode === 'workspace' ? [basename(cwd), branch].filter(Boolean).join(' · ') : session ?? basename(cwd);
|
|
26
|
+
return clean([STATE_LABELS[status.state], subject, 'omdsh'].filter(Boolean).join(' · '), 120) ?? '';
|
|
27
|
+
}
|
|
28
|
+
export class AgentActivityController {
|
|
29
|
+
#running = false;
|
|
30
|
+
#prompts = [];
|
|
31
|
+
#last;
|
|
32
|
+
#result = 'idle';
|
|
33
|
+
get current() {
|
|
34
|
+
const message = this.#prompts.at(-1);
|
|
35
|
+
return this.#prompts.length > 0 ? { state: 'blocked', ...(message === undefined ? {} : { message }) } : { state: this.#running ? 'working' : 'idle' };
|
|
36
|
+
}
|
|
37
|
+
get program() {
|
|
38
|
+
const current = this.current;
|
|
39
|
+
return current.state === 'idle' ? { state: this.#result } : current;
|
|
40
|
+
}
|
|
41
|
+
start() { return this.#publish(true); }
|
|
42
|
+
setRunning(running) {
|
|
43
|
+
if (running && !this.#running)
|
|
44
|
+
this.#result = 'idle';
|
|
45
|
+
this.#running = running;
|
|
46
|
+
return this.#publish();
|
|
47
|
+
}
|
|
48
|
+
settled(reason) { this.#result = ['complete', 'completed'].includes(reason) ? 'done' : ['aborted', 'interrupted'].includes(reason) ? 'idle' : 'error'; }
|
|
49
|
+
resetResult() { this.#result = 'idle'; }
|
|
50
|
+
prompt(message) { this.#prompts.push(clean(message, 240)); return this.#publish(); }
|
|
51
|
+
promptResolved() { if (this.#prompts.length === 0)
|
|
52
|
+
return undefined; this.#prompts.pop(); return this.#publish(); }
|
|
53
|
+
#publish(force = false) {
|
|
54
|
+
const next = this.current;
|
|
55
|
+
const signature = `${next.state}\0${next.message ?? ''}`;
|
|
56
|
+
if (!force && signature === this.#last)
|
|
57
|
+
return undefined;
|
|
58
|
+
this.#last = signature;
|
|
59
|
+
return next;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=terminal-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-state.js","sourceRoot":"","sources":["../../src/runtime/terminal-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,15 @@ function parsedArguments(raw) {
|
|
|
12
12
|
return raw;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
+
function callKey(event) {
|
|
16
|
+
if (event.type === 'tool/call')
|
|
17
|
+
return event.data.callId;
|
|
18
|
+
if (event.type === 'tool/result')
|
|
19
|
+
return event.data.message.source.callId;
|
|
20
|
+
if (event.type === 'tool/ptc-dispatch-start' || event.type === 'tool/ptc-dispatch')
|
|
21
|
+
return event.data.subCallId;
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
15
24
|
class HarnessToolPresentation {
|
|
16
25
|
#ctx;
|
|
17
26
|
/**
|
|
@@ -24,16 +33,31 @@ class HarnessToolPresentation {
|
|
|
24
33
|
this.#ctx = ctx;
|
|
25
34
|
}
|
|
26
35
|
event(agent, event) {
|
|
27
|
-
if (event.type === 'tool/call') {
|
|
36
|
+
if (event.type === 'tool/call' || event.type === 'tool/ptc-dispatch-start') {
|
|
28
37
|
let calls = this.#liveCalls.get(agent.session);
|
|
29
38
|
if (calls === undefined) {
|
|
30
39
|
calls = new Map();
|
|
31
40
|
this.#liveCalls.set(agent.session, calls);
|
|
32
41
|
}
|
|
33
|
-
calls.set(event
|
|
42
|
+
calls.set(callKey(event), { event, cwd: this.#directory(agent) });
|
|
34
43
|
}
|
|
35
44
|
return this.#event(agent, event, undefined);
|
|
36
45
|
}
|
|
46
|
+
#directory(agent, initial = false) {
|
|
47
|
+
const service = typeof this.#ctx.get === 'function' ? this.#ctx.get('workingDirectory') : undefined;
|
|
48
|
+
return initial ? agent.session.header?.cwd ?? service?.defaultDirectory : service?.get(agent.session) ?? agent.session.header?.cwd;
|
|
49
|
+
}
|
|
50
|
+
#records(agent, events, initial = this.#directory(agent, true)) {
|
|
51
|
+
const records = new Map();
|
|
52
|
+
let cwd = initial;
|
|
53
|
+
for (const event of events) {
|
|
54
|
+
if (event.type === 'working-directory/change')
|
|
55
|
+
cwd = event.data.cwd;
|
|
56
|
+
if (event.type === 'tool/call' || event.type === 'tool/ptc-dispatch-start')
|
|
57
|
+
records.set(callKey(event), { event, cwd });
|
|
58
|
+
}
|
|
59
|
+
return records;
|
|
60
|
+
}
|
|
37
61
|
#presentCall(agent, name, args) {
|
|
38
62
|
const definition = this.#ctx.tools.get(name, agent);
|
|
39
63
|
if (definition?.presentCall === undefined)
|
|
@@ -67,38 +91,50 @@ class HarnessToolPresentation {
|
|
|
67
91
|
};
|
|
68
92
|
}
|
|
69
93
|
#event(agent, event, callIndex) {
|
|
94
|
+
const key = callKey(event);
|
|
95
|
+
if (key === undefined)
|
|
96
|
+
return undefined;
|
|
97
|
+
const record = callIndex?.get(key) ?? this.#liveCalls.get(agent.session)?.get(key)
|
|
98
|
+
?? this.#records(agent, agent.session.snapshotEvents()).get(key);
|
|
99
|
+
const cwd = record?.cwd;
|
|
100
|
+
const located = (presentation) => presentation === undefined
|
|
101
|
+
? undefined : cwd === undefined ? presentation : { ...presentation, cwd };
|
|
70
102
|
// A PTC sub-dispatch carries the tool name and its normalized arguments on
|
|
71
103
|
// both halves of the pair, so it resolves a card without a call index — the
|
|
72
104
|
// same cards a native call of the same tool would get.
|
|
73
105
|
if (event.type === 'tool/ptc-dispatch-start') {
|
|
74
106
|
const call = this.#presentCall(agent, event.data.name, event.data.arguments);
|
|
75
|
-
return call === undefined ? undefined : { call };
|
|
107
|
+
return located(call === undefined ? undefined : { call });
|
|
76
108
|
}
|
|
77
109
|
if (event.type === 'tool/ptc-dispatch') {
|
|
78
|
-
return this.#present(agent, event.data.name, event.data.arguments, event.data.content, event.data.isError, undefined);
|
|
110
|
+
return located(this.#present(agent, event.data.name, event.data.arguments, event.data.content, event.data.isError, undefined));
|
|
79
111
|
}
|
|
80
112
|
if (event.type === 'tool/call') {
|
|
81
113
|
const call = this.#presentCall(agent, event.data.name, parsedArguments(event.data.arguments));
|
|
82
|
-
return call === undefined ? undefined : { call };
|
|
114
|
+
return located(call === undefined ? undefined : { call });
|
|
83
115
|
}
|
|
84
116
|
if (event.type !== 'tool/result')
|
|
85
117
|
return undefined;
|
|
86
|
-
const
|
|
87
|
-
const callEvent = callIndex?.get(callId)
|
|
88
|
-
?? this.#liveCalls.get(agent.session)?.get(callId)
|
|
89
|
-
?? agent.session.snapshotEvents().findLast(candidate => candidate.type === 'tool/call' && candidate.data.callId === callId);
|
|
118
|
+
const callEvent = record?.event;
|
|
90
119
|
if (callEvent?.type !== 'tool/call')
|
|
91
120
|
return undefined;
|
|
92
|
-
return this.#present(agent, callEvent.data.name, callEvent.data.arguments, event.data.message.content, event.data.message.isError === true, event.data.meta);
|
|
121
|
+
return located(this.#present(agent, callEvent.data.name, callEvent.data.arguments, event.data.message.content, event.data.message.isError === true, event.data.meta));
|
|
93
122
|
}
|
|
94
123
|
session(agent, events) {
|
|
95
124
|
// One pass builds a callId index instead of the per-result backwards
|
|
96
125
|
// log scan, keeping replay linear in the event count.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
126
|
+
let initial = this.#directory(agent, true);
|
|
127
|
+
// An inspected child's own events may omit its inherited directory changes.
|
|
128
|
+
const first = events[0]?.seq;
|
|
129
|
+
if (first !== undefined && first > 1) {
|
|
130
|
+
for (const event of agent.session.snapshotEvents()) {
|
|
131
|
+
if (event.seq >= first)
|
|
132
|
+
break;
|
|
133
|
+
if (event.type === 'working-directory/change')
|
|
134
|
+
initial = event.data.cwd;
|
|
135
|
+
}
|
|
101
136
|
}
|
|
137
|
+
const callIndex = this.#records(agent, events, initial);
|
|
102
138
|
const presentations = new Map();
|
|
103
139
|
for (const event of events) {
|
|
104
140
|
const presentation = this.#event(agent, event, callIndex);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-presentation.js","sourceRoot":"","sources":["../../src/runtime/tool-presentation.ts"],"names":[],"mappings":"AAAA,6EAA6E;
|
|
1
|
+
{"version":3,"file":"tool-presentation.js","sourceRoot":"","sources":["../../src/runtime/tool-presentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Guidance and observable profile state for native one-shot Agent bundles. */
|
|
2
|
+
import type { BundleInfo, PluginInfo } from '@deepseek-ai/dsh-plugin-manager';
|
|
3
|
+
export declare function externalAgentGuide(bundle: string): string | undefined;
|
|
4
|
+
/** Profile registration is observable; authentication and payload startup require a real delegation. */
|
|
5
|
+
export declare function externalAgentDiagnostic(bundle: BundleInfo, plugins: readonly PluginInfo[]): string;
|