@timurproko/a1 0.2.7-dev.1252 → 0.2.7-dev.1255
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/bin/ui.js +3 -3
- package/dist/app/session-shell/clipboard-diagnostics.d.ts +2 -2
- package/dist/app/session-shell/clipboard-image.d.ts +0 -1
- package/dist/app/session-shell/clipboard-image.js +1 -1
- package/dist/app/session-shell/dialog-coordinator.d.ts +6 -5
- package/dist/app/session-shell/dialog-coordinator.js +3 -4
- package/dist/app/session-shell/dock-chrome.d.ts +11 -6
- package/dist/app/session-shell/dock-chrome.js +5 -8
- package/dist/app/session-shell/editor-hyperlink-budget.d.ts +0 -2
- package/dist/app/session-shell/editor-hyperlink-budget.js +1 -1
- package/dist/app/session-shell/exit-notice.d.ts +2 -2
- package/dist/app/session-shell/exit-notice.js +1 -1
- package/dist/app/session-shell/extension-surface.d.ts +8 -7
- package/dist/app/session-shell/helper-pool.d.ts +3 -4
- package/dist/app/session-shell/helper-pool.js +1 -1
- package/dist/app/session-shell/image-preparation-client.d.ts +4 -3
- package/dist/app/session-shell/image-preparation.d.ts +0 -2
- package/dist/app/session-shell/image-preparation.js +2 -2
- package/dist/app/session-shell/image-source.d.ts +2 -3
- package/dist/app/session-shell/image-source.js +2 -2
- package/dist/app/session-shell/input-surface-switch.d.ts +9 -7
- package/dist/app/session-shell/input-surface-switch.js +1 -2
- package/dist/app/session-shell/login-interaction.d.ts +5 -4
- package/dist/app/session-shell/login-interaction.js +2 -3
- package/dist/app/session-shell/paste-executor.d.ts +4 -8
- package/dist/app/session-shell/paste-executor.js +2 -2
- package/dist/app/session-shell/paste-protocol.d.ts +2 -2
- package/dist/app/session-shell/path-chip-presentation.d.ts +0 -5
- package/dist/app/session-shell/path-chip-presentation.js +3 -3
- package/dist/app/session-shell/prompt-chips.d.ts +8 -7
- package/dist/app/session-shell/prompt-history-controller.d.ts +3 -3
- package/dist/app/session-shell/prompt-submission.d.ts +5 -2
- package/dist/app/session-shell/prompt-submission.js +4 -5
- package/dist/app/session-shell/quit-outro-effects.d.ts +3 -3
- package/dist/app/session-shell/quit-outro-effects.js +1 -4
- package/dist/app/session-shell/quit-outro.d.ts +9 -12
- package/dist/app/session-shell/quit-outro.js +11 -11
- package/dist/app/session-shell/response-copy-protocol.d.ts +3 -2
- package/dist/app/session-shell/response-copy-transport.d.ts +2 -14
- package/dist/app/session-shell/response-copy-transport.js +1 -1
- package/dist/app/session-shell/session-lifecycle.d.ts +2 -1
- package/dist/app/session-shell/session-shell-root.d.ts +74 -89
- package/dist/app/session-shell/session-shell-root.js +81 -113
- package/dist/app/session-shell/session-shell.d.ts +13 -16
- package/dist/app/session-shell/session-shell.js +144 -268
- package/dist/app/session-shell/session-viewport-controller.d.ts +7 -6
- package/dist/app/session-shell/session-viewport-controller.js +2 -2
- package/dist/app/session-shell/settings-bindings.d.ts +24 -2
- package/dist/app/session-shell/settings-bindings.js +24 -0
- package/dist/app/session-shell/share-operation.d.ts +3 -3
- package/dist/app/session-shell/share-operation.js +4 -6
- package/dist/app/session-shell/shell-clipboard.d.ts +59 -0
- package/dist/app/session-shell/shell-clipboard.js +119 -0
- package/dist/app/session-shell/shell-editor-factory.d.ts +8 -4
- package/dist/app/session-shell/shell-editor-factory.js +13 -15
- package/dist/app/session-shell/shell-host.d.ts +16 -17
- package/dist/app/session-shell/shell-host.js +18 -19
- package/dist/app/session-shell/shell-layout.d.ts +2 -2
- package/dist/app/session-shell/shell-prompt-suggestions.d.ts +26 -0
- package/dist/app/session-shell/shell-prompt-suggestions.js +48 -0
- package/dist/app/session-shell/suggestion-surface.d.ts +1 -6
- package/dist/app/session-shell/suggestion-surface.js +1 -1
- package/dist/app/session-shell/system-clipboard.d.ts +2 -14
- package/dist/app/session-shell/system-clipboard.js +2 -7
- package/dist/app/session-shell/transcript-document.d.ts +11 -8
- package/dist/app/session-shell/transcript-document.js +13 -14
- package/dist/app/session-shell/viewport-layout.d.ts +2 -2
- package/dist/app/session-shell/workflow-output.d.ts +5 -3
- package/dist/app/session-shell/workflow-output.js +13 -15
- package/dist/cli/package-messages.d.ts +0 -1
- package/dist/cli/package-messages.js +1 -1
- package/dist/cli/session-context.d.ts +1 -1
- package/dist/cli/uninstall.d.ts +3 -2
- package/dist/composition/owned-settings.d.ts +2 -1
- package/dist/composition/owned-settings.js +0 -3
- package/dist/composition/owned-ui.d.ts +1 -1
- package/dist/composition/owned-ui.js +27 -27
- package/dist/composition/reference-selection-options.d.ts +1 -1
- package/dist/composition/reference-selection-options.js +1 -1
- package/dist/composition/session-runtime-registry.d.ts +2 -1
- package/dist/composition/settings-route-host.js +3 -10
- package/dist/composition/settings-search-input.d.ts +2 -1
- package/dist/composition/startup-route.d.ts +2 -2
- package/dist/composition/startup-route.js +2 -2
- package/dist/contracts/owned-ui/extension-ui.d.ts +2 -1
- package/dist/contracts/owned-ui/index.d.ts +1 -0
- package/dist/contracts/owned-ui/session-presenters.d.ts +3 -0
- package/dist/contracts/owned-ui/shell-components.d.ts +543 -0
- package/dist/contracts/owned-ui/shell-components.js +1 -0
- package/dist/contracts/presentation/component.d.ts +17 -0
- package/dist/contracts/presentation/component.js +8 -0
- package/dist/contracts/presentation/index.d.ts +6 -15
- package/dist/contracts/presentation/index.js +2 -0
- package/dist/contracts/presentation/terminal.d.ts +290 -0
- package/dist/contracts/presentation/terminal.js +1 -0
- package/dist/contracts/presentation/theme.d.ts +46 -0
- package/dist/contracts/presentation/theme.js +1 -0
- package/dist/features/launch/development-launch.js +1 -1
- package/dist/features/launch/runtime-selection.d.ts +2 -2
- package/dist/features/launch/runtime-selection.js +2 -2
- package/dist/features/owned-ui/project-trust-prompt.d.ts +2 -2
- package/dist/features/owned-ui/project-trust-prompt.js +1 -1
- package/dist/features/owned-ui/release-note-state.d.ts +2 -1
- package/dist/features/owned-ui/settings-app.js +38 -219
- package/dist/features/owned-ui/settings-edits.d.ts +31 -0
- package/dist/features/owned-ui/settings-edits.js +139 -0
- package/dist/features/owned-ui/settings-scroll-rail.d.ts +29 -0
- package/dist/features/owned-ui/settings-scroll-rail.js +79 -0
- package/dist/features/owned-ui/settings-search-input.d.ts +2 -1
- package/dist/features/prompt-history/service.d.ts +3 -2
- package/dist/foundation/lifecycle/claim-gate.d.ts +2 -1
- package/dist/foundation/release/automatic-update.d.ts +5 -14
- package/dist/foundation/release/automatic-update.js +14 -14
- package/dist/foundation/release/bootstrap.js +4 -4
- package/dist/foundation/release/dependency-certification.d.ts +0 -1
- package/dist/foundation/release/dependency-certification.js +1 -1
- package/dist/foundation/release/early-accent.d.ts +2 -2
- package/dist/foundation/release/early-accent.js +1 -1
- package/dist/foundation/release/index.d.ts +2 -2
- package/dist/foundation/release/index.js +1 -1
- package/dist/foundation/release/latest-release.d.ts +3 -18
- package/dist/foundation/release/latest-release.js +10 -10
- package/dist/foundation/release/ordinary-launch-selection.d.ts +1 -1
- package/dist/foundation/release/ordinary-launch-selection.js +1 -1
- package/dist/foundation/release/release-gc.d.ts +3 -3
- package/dist/foundation/release/release-gc.js +4 -4
- package/dist/foundation/release/{cohort-state.d.ts → release-state.d.ts} +23 -23
- package/dist/foundation/release/{cohort-state.js → release-state.js} +8 -8
- package/dist/foundation/release/update-activation.js +2 -2
- package/dist/foundation/release/update-execution-lease.d.ts +2 -3
- package/dist/foundation/release/update-execution-lease.js +1 -1
- package/dist/foundation/release/update-launch.d.ts +2 -2
- package/dist/foundation/release/update.d.ts +0 -2
- package/dist/foundation/release/update.js +14 -14
- package/dist/foundation/startup/startup-budget.d.ts +5 -5
- package/dist/foundation/startup/startup-budget.js +2 -2
- package/dist/integrations/pi/components/editor-interaction.d.ts +4 -12
- package/dist/integrations/pi/components/index.d.ts +15 -9
- package/dist/integrations/pi/components/index.js +9 -5
- package/dist/integrations/pi/components/lazy-selectors.d.ts +2 -10
- package/dist/integrations/pi/components/lazy-selectors.js +1 -1
- package/dist/integrations/pi/components/modal-frame.d.ts +5 -22
- package/dist/integrations/pi/components/modal-frame.js +3 -23
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +4 -3
- package/dist/integrations/pi/components/prompt-input-port.d.ts +2 -19
- package/dist/integrations/pi/components/resources/builtin-themes.d.ts +2 -1
- package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +3 -2
- package/dist/integrations/pi/components/shell-footer-status.d.ts +2 -2
- package/dist/integrations/pi/components/shell-footer-status.js +3 -2
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +6 -5
- package/dist/integrations/pi/components/shell-presenters-info.js +2 -1
- package/dist/integrations/pi/components/shell-session-info-reference.d.ts +2 -1
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +33 -227
- package/dist/integrations/pi/components/shell-shared-facade.js +8 -1
- package/dist/integrations/pi/components/skills-command.d.ts +1 -9
- package/dist/integrations/pi/components/skills-command.js +5 -5
- package/dist/integrations/pi/components/theme.d.ts +9 -2
- package/dist/integrations/pi/components/theme.js +17 -2
- package/dist/integrations/pi/components/thinking-selector-dialog.d.ts +2 -1
- package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +2 -2
- package/dist/integrations/pi/engine/adapter.d.ts +3 -5
- package/dist/integrations/pi/engine/adapter.js +3 -12
- package/dist/integrations/pi/engine/changelog.d.ts +2 -2
- package/dist/integrations/pi/engine/changelog.js +3 -3
- package/dist/integrations/pi/engine/compaction-progress.d.ts +2 -3
- package/dist/integrations/pi/engine/compaction-progress.js +1 -1
- package/dist/integrations/pi/engine/conformance.d.ts +2 -1
- package/dist/integrations/pi/engine/default-model-setting.d.ts +0 -2
- package/dist/integrations/pi/engine/default-model-setting.js +1 -2
- package/dist/integrations/pi/engine/event-delivery.d.ts +2 -1
- package/dist/integrations/pi/engine/extension-ui-binding.d.ts +2 -1
- package/dist/integrations/pi/engine/host.js +2 -2
- package/dist/integrations/pi/engine/message-values.d.ts +0 -1
- package/dist/integrations/pi/engine/message-values.js +1 -1
- package/dist/integrations/pi/engine/pending-delivery.d.ts +0 -4
- package/dist/integrations/pi/engine/pending-delivery.js +3 -3
- package/dist/integrations/pi/engine/ports.d.ts +7 -1
- package/dist/integrations/pi/engine/ports.js +4 -0
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +2 -1
- package/dist/integrations/pi/engine/prompt-suggestions.d.ts +3 -2
- package/dist/integrations/pi/engine/provider-authentication.d.ts +1 -1
- package/dist/integrations/pi/engine/public-main-entry.d.ts +1 -5
- package/dist/integrations/pi/engine/public-main-entry.js +1 -1
- package/dist/integrations/pi/engine/repository-pr-rest.d.ts +1 -9
- package/dist/integrations/pi/engine/repository-pr-rest.js +2 -2
- package/dist/integrations/pi/engine/repository-pr.d.ts +1 -3
- package/dist/integrations/pi/engine/repository-pr.js +1 -1
- package/dist/integrations/pi/engine/resource-catalog.d.ts +2 -1
- package/dist/integrations/pi/engine/session-integration.d.ts +1 -1
- package/dist/integrations/pi/engine/session-runtime.d.ts +4 -3
- package/dist/integrations/pi/engine/settings-bridge.d.ts +0 -2
- package/dist/integrations/pi/engine/settings-bridge.js +1 -1
- package/dist/integrations/pi/engine/settings-port.d.ts +3 -2
- package/dist/integrations/pi/engine/transcript-projection.d.ts +2 -1
- package/dist/integrations/pi/engine/workflow-contexts.d.ts +1 -1
- package/dist/integrations/pi/engine/workflow-runner.d.ts +1 -1
- package/dist/integrations/pi/engine/workflow-support.d.ts +0 -6
- package/dist/integrations/pi/engine/workflow-support.js +4 -18
- package/dist/integrations/pi/engine/workflows.d.ts +5 -5
- package/dist/integrations/pi/session-presenters/components.d.ts +3 -0
- package/dist/integrations/pi/session-presenters/components.js +75 -0
- package/dist/integrations/pi/session-presenters/index.d.ts +1 -0
- package/dist/integrations/pi/session-presenters/index.js +1 -0
- package/dist/integrations/pi/session-presenters/presentation.d.ts +3 -0
- package/dist/integrations/pi/session-presenters/presentation.js +10 -0
- package/dist/integrations/pi/session-presenters/presenters.d.ts +2 -1
- package/dist/integrations/pi/session-presenters/presenters.js +3 -1
- package/dist/integrations/pi/tui-runtime/adapter.js +21 -30
- package/dist/integrations/pi/tui-runtime/contracts.d.ts +22 -166
- package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +5 -40
- package/dist/integrations/pi/tui-runtime/index.d.ts +1 -0
- package/dist/integrations/pi/tui-runtime/index.js +1 -0
- package/dist/integrations/pi/tui-runtime/input-presentation-coordinator.d.ts +4 -6
- package/dist/integrations/pi/tui-runtime/overlay-geometry.d.ts +2 -8
- package/dist/integrations/pi/tui-runtime/overlay-geometry.js +3 -9
- package/dist/integrations/pi/tui-runtime/runtime-factory.d.ts +3 -0
- package/dist/integrations/pi/tui-runtime/runtime-factory.js +11 -0
- package/dist/ui/components/index.d.ts +2 -2
- package/dist/ui/components/index.js +1 -1
- package/dist/ui/components/selection-copy.d.ts +0 -1
- package/dist/ui/components/selection-copy.js +0 -12
- package/dist/ui/components/theme.d.ts +4 -19
- package/dist/ui/components/theme.js +6 -0
- package/dist/ui/settings/declarations.d.ts +2 -3
- package/dist/ui/settings/declarations.js +2 -3
- package/dist/ui/settings/early-accent.js +1 -1
- package/dist/ui/settings/index.d.ts +3 -5
- package/dist/ui/settings/index.js +2 -3
- package/dist/ui/settings/manager.d.ts +0 -4
- package/dist/ui/settings/manager.js +6 -62
- package/dist/ui/settings/resolution.d.ts +6 -18
- package/dist/ui/settings/resolution.js +4 -103
- package/dist/ui/settings/sections.d.ts +0 -4
- package/dist/ui/settings/sections.js +1 -1
- package/docs/architecture/boundaries.md +2 -2
- package/docs/architecture/internal-naming.md +2 -0
- package/docs/architecture/project-structure.md +4 -2
- package/docs/validation.md +1 -1
- package/package.json +3 -4
- package/dist/integrations/pi/components/components.d.ts +0 -4
- package/dist/integrations/pi/components/components.js +0 -48
- package/dist/integrations/pi/components/conformance.d.ts +0 -18
- package/dist/integrations/pi/components/conformance.js +0 -70
- package/dist/integrations/pi/components/shell-components.d.ts +0 -7
- package/dist/integrations/pi/components/shell-components.js +0 -7
- package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +0 -33
- package/dist/integrations/pi/components/upstream/theme/theme-controller.js +0 -114
- package/dist/ui/settings/migrations.d.ts +0 -19
- package/dist/ui/settings/migrations.js +0 -225
- package/dist/ui/settings/progress-palette.generated.d.ts +0 -139
- package/dist/ui/settings/progress-palette.generated.js +0 -139
- /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.d.ts +0 -0
- /package/dist/{foundation/release → contracts/presentation}/progress-palette.generated.js +0 -0
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
import { ImageAttachmentError } from "../../contracts/owned-ui/index.js";
|
|
2
1
|
import { promptArrow } from "../../ui/components/prompt-input.js";
|
|
3
2
|
import { composeSubmittedPromptRows, submittedPromptLayout, } from "../../ui/components/submitted-prompt.js";
|
|
4
3
|
import { nativeHyperlinkStyle } from "../../ui/components/spans.js";
|
|
5
4
|
import { paintTextSelection } from "../../ui/components/text-selection.js";
|
|
6
5
|
import { progressStatusFrame, progressStatusText } from "../../ui/components/progress-status.js";
|
|
7
|
-
import { createPiQueuedInputStatus, createPiShellFooter, createPiShellHeader, createPiShellLoadedResources, createPiShellStatus, } from "../../integrations/pi/components/shell-footer-status.js";
|
|
8
|
-
import { createPiShellTranscriptComponent, } from "../../integrations/pi/components/shell-presenters-transcript.js";
|
|
9
|
-
import { onPiThemeChange, piTheme } from "../../integrations/pi/components/upstream/theme/theme.js";
|
|
10
|
-
import { piShellTruncateToWidth, } from "../../integrations/pi/components/shell-shared-facade.js";
|
|
11
|
-
import {} from "../../integrations/pi/tui-runtime/input-presentation-coordinator.js";
|
|
12
6
|
import { PromptChipStore } from "./prompt-chips.js";
|
|
13
7
|
import { SessionViewportController } from "./session-viewport-controller.js";
|
|
14
8
|
import { createShellEditor } from "./shell-editor-factory.js";
|
|
@@ -18,14 +12,15 @@ import { WorkflowOutput } from "./workflow-output.js";
|
|
|
18
12
|
import { InputSurfaceSwitch } from "./input-surface-switch.js";
|
|
19
13
|
import { PinnedLayout } from "./shell-layout.js";
|
|
20
14
|
import { ViewportLayout } from "./viewport-layout.js";
|
|
21
|
-
import {
|
|
15
|
+
import { transcriptLinkColor, TranscriptDocument } from "./transcript-document.js";
|
|
22
16
|
/** Composes session state into the owned transcript, viewport, editor, and dock. */
|
|
23
17
|
export class OwnedUiSessionShellRoot {
|
|
24
18
|
editor;
|
|
25
19
|
header;
|
|
26
20
|
resources;
|
|
27
21
|
#cwd;
|
|
28
|
-
|
|
22
|
+
/** The transcript's semantic rows, caches, and engine-backed block renderers. */
|
|
23
|
+
transcript;
|
|
29
24
|
#themeUnsubscribe;
|
|
30
25
|
#view;
|
|
31
26
|
#status;
|
|
@@ -47,11 +42,13 @@ export class OwnedUiSessionShellRoot {
|
|
|
47
42
|
#showImages = true;
|
|
48
43
|
#imageWidthCells = 80;
|
|
49
44
|
#outputPad = 1;
|
|
50
|
-
|
|
45
|
+
/** Workflow results, messages, and status lines appended to the transcript. */
|
|
46
|
+
workflow;
|
|
51
47
|
#input;
|
|
52
48
|
#layout;
|
|
53
49
|
#extensions = new ExtensionSurface();
|
|
54
|
-
|
|
50
|
+
/** The dock's notices, copy acknowledgement, and release banner. */
|
|
51
|
+
chrome;
|
|
55
52
|
#imageSubmissionsSending = 0;
|
|
56
53
|
constructor(view, cwd, handlers, startup = {}, agentDir, extensionRenderers = {
|
|
57
54
|
getMessageRenderer: () => undefined,
|
|
@@ -64,26 +61,26 @@ export class OwnedUiSessionShellRoot {
|
|
|
64
61
|
...(handlers.pasteDiagnostics === undefined ? {} : { onEvent: handlers.pasteDiagnostics }),
|
|
65
62
|
...(handlers.pastePreparation === undefined ? {} : { preparation: handlers.pastePreparation }),
|
|
66
63
|
...(handlers.promptImageLimit === undefined ? {} : { imageLimit: handlers.promptImageLimit }) });
|
|
67
|
-
this.#submittedPromptComposer = this.#customViewport ? this.#createSubmittedPromptComposer() : undefined;
|
|
64
|
+
this.#submittedPromptComposer = this.#customViewport ? this.#createSubmittedPromptComposer(handlers.presentation.theme) : undefined;
|
|
68
65
|
this.#cwd = cwd;
|
|
69
|
-
this
|
|
66
|
+
this.transcript = this.#createDocument(cwd, handlers.presentation.theme, handlers.components);
|
|
70
67
|
this.#extensionRenderers = extensionRenderers;
|
|
71
68
|
this.#imageAssets = imageAssets;
|
|
72
69
|
this.#componentRuntime = handlers;
|
|
73
70
|
this.#onPromptSuggestionEligibilityChanged = handlers.onPromptSuggestionEligibilityChanged;
|
|
74
|
-
this.header =
|
|
71
|
+
this.header = handlers.components.chrome.header({
|
|
75
72
|
...startup,
|
|
76
73
|
...(this.#customViewport ? { getKeybindings: () => this.editor.keybindingConfig() } : {}),
|
|
77
74
|
});
|
|
78
|
-
this.resources =
|
|
79
|
-
this.#status =
|
|
75
|
+
this.resources = handlers.components.chrome.loadedResources(startup.resources ?? [], startup.expanded ?? false);
|
|
76
|
+
this.#status = handlers.components.chrome.status(view, {
|
|
80
77
|
text: (message, mode) => progressStatusText(message, mode === "custom-viewport" ? "…" : "..."),
|
|
81
78
|
frame: progressStatusFrame,
|
|
82
79
|
}, handlers);
|
|
83
80
|
this.#status.setProgressPresentation(this.#customViewport ? "custom-viewport" : "pinned");
|
|
84
|
-
this.#footer =
|
|
81
|
+
this.#footer = handlers.components.chrome.footer(this.#extensions.withStatuses(view), cwd, this.#customViewport ? "a1" : "pi", () => this.#footerLevel);
|
|
85
82
|
this.editor = createShellEditor({
|
|
86
|
-
handlers,
|
|
83
|
+
handlers, theme: handlers.presentation.theme, components: handlers.components,
|
|
87
84
|
customViewport: this.#customViewport,
|
|
88
85
|
cwd,
|
|
89
86
|
...(agentDir === undefined ? {} : { agentDir }),
|
|
@@ -92,7 +89,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
92
89
|
nextPasteDiagnosticRequest: () => --this.#pasteDiagnosticId,
|
|
93
90
|
toggleToolsExpanded: () => this.#setToolsExpanded(!this.#toolsExpanded),
|
|
94
91
|
});
|
|
95
|
-
this.#queued =
|
|
92
|
+
this.#queued = handlers.components.chrome.queuedInput(view.editor.queuedSubmissions, this.#customViewport ? "custom-viewport" : "pinned", this.#customViewport ? () => this.editor.keybindingConfig() : undefined);
|
|
96
93
|
this.#viewportController = new SessionViewportController({
|
|
97
94
|
enabled: this.#customViewport,
|
|
98
95
|
editor: this.editor,
|
|
@@ -102,15 +99,15 @@ export class OwnedUiSessionShellRoot {
|
|
|
102
99
|
...(handlers.pasteDiagnostics === undefined ? {} : { pasteDiagnostics: handlers.pasteDiagnostics }),
|
|
103
100
|
nextPasteDiagnosticRequest: () => --this.#pasteDiagnosticId,
|
|
104
101
|
});
|
|
105
|
-
this
|
|
102
|
+
this.chrome = new DockChrome({ theme: handlers.presentation.theme, outputPad: handlers.presentation.pinnedOutputPad, components: handlers.components,
|
|
106
103
|
invalidateChrome: () => this.#invalidateChrome(),
|
|
107
104
|
requestRender: () => this.#componentRuntime.requestRender(),
|
|
108
105
|
viewport: this.#viewportController,
|
|
109
106
|
});
|
|
110
|
-
this
|
|
111
|
-
customViewport: this.#customViewport,
|
|
112
|
-
document: this
|
|
113
|
-
dock: this
|
|
107
|
+
this.workflow = new WorkflowOutput({
|
|
108
|
+
customViewport: this.#customViewport, components: handlers.components,
|
|
109
|
+
document: this.transcript,
|
|
110
|
+
dock: this.chrome,
|
|
114
111
|
transcriptLength: () => this.#view.transcript.length,
|
|
115
112
|
outputPad: () => this.#outputPad,
|
|
116
113
|
hotkeysPresentation: () => this.hotkeysPresentation(),
|
|
@@ -119,26 +116,27 @@ export class OwnedUiSessionShellRoot {
|
|
|
119
116
|
});
|
|
120
117
|
this.editor.setThinkingLevel(view.thinkingLevel);
|
|
121
118
|
this.#input = new InputSurfaceSwitch(this.editor, {
|
|
122
|
-
dockInputReuse: this.#customViewport && (handlers.enableDockInputReuse ?? true),
|
|
119
|
+
dockInputReuse: this.#customViewport && (handlers.enableDockInputReuse ?? true), classifyInput: handlers.presentation.terminalRuntime.classifyInput,
|
|
123
120
|
viewport: this.#viewportController,
|
|
124
121
|
...(handlers.onInputSurfaceChanged === undefined ? {} : { onChanged: handlers.onInputSurfaceChanged }),
|
|
125
122
|
});
|
|
126
|
-
this.#layout = this.#createLayout(handlers.onViewportFrame);
|
|
123
|
+
this.#layout = this.#createLayout(handlers.onViewportFrame, createViewportTheme(handlers.presentation.theme));
|
|
127
124
|
for (const block of view.transcript) {
|
|
128
125
|
if (block.kind === "user")
|
|
129
126
|
this.editor.addToHistory(block.text);
|
|
130
127
|
}
|
|
131
|
-
this
|
|
128
|
+
this.transcript.sync(view.transcript);
|
|
132
129
|
// Invariant: rendered rows expire when
|
|
133
130
|
// their active theme changes.
|
|
134
|
-
this.#themeUnsubscribe =
|
|
131
|
+
this.#themeUnsubscribe = handlers.presentation.theme.onChange(() => {
|
|
135
132
|
this.invalidate();
|
|
136
133
|
this.#componentRuntime.requestRender(true);
|
|
137
134
|
});
|
|
138
135
|
}
|
|
139
136
|
// Invariant: the document reads the shell's chrome lazily, so it may be built before the header and viewport.
|
|
140
|
-
#createDocument(cwd) {
|
|
137
|
+
#createDocument(cwd, theme, components) {
|
|
141
138
|
return new TranscriptDocument({
|
|
139
|
+
theme, components,
|
|
142
140
|
customViewport: this.#customViewport,
|
|
143
141
|
cwd,
|
|
144
142
|
mount: block => this.#mountTranscript(block),
|
|
@@ -153,33 +151,34 @@ export class OwnedUiSessionShellRoot {
|
|
|
153
151
|
});
|
|
154
152
|
}
|
|
155
153
|
// Invariant: one layout per root; the render path never consults the layout mode again.
|
|
156
|
-
#createLayout(onFrame) {
|
|
154
|
+
#createLayout(onFrame, theme) {
|
|
157
155
|
const ports = {
|
|
158
156
|
viewport: this.#viewportController,
|
|
159
157
|
input: this.#input,
|
|
160
158
|
editor: this.editor,
|
|
161
159
|
promptChips: this.#promptChips,
|
|
162
|
-
dockChrome: this
|
|
163
|
-
theme
|
|
160
|
+
dockChrome: this.chrome,
|
|
161
|
+
theme,
|
|
164
162
|
...(onFrame === undefined ? {} : { onFrame }),
|
|
165
163
|
rows: () => this.#componentRuntime.getRows(),
|
|
166
164
|
dock: width => this.#renderDockLayout(width),
|
|
167
|
-
document: width => this
|
|
165
|
+
document: width => this.transcript.layout(width),
|
|
168
166
|
queued: width => this.#renderQueued(width),
|
|
169
167
|
liveStatus: width => this.#renderStatus(width),
|
|
170
168
|
diagnostics: () => this.#view.diagnostics,
|
|
171
169
|
};
|
|
172
170
|
return this.#customViewport ? new ViewportLayout(ports) : new PinnedLayout(ports);
|
|
173
171
|
}
|
|
174
|
-
#createSubmittedPromptComposer() {
|
|
172
|
+
#createSubmittedPromptComposer(theme) {
|
|
173
|
+
const linkColor = transcriptLinkColor(theme);
|
|
175
174
|
return {
|
|
176
175
|
layout: width => submittedPromptLayout(width),
|
|
177
|
-
compose: (rows, width, style) => composeSubmittedPromptRows(rows, width, { ...style, prefix: text => promptArrow(text,
|
|
176
|
+
compose: (rows, width, style) => composeSubmittedPromptRows(rows, width, { ...style, prefix: text => promptArrow(text, theme.current()) }).map(row => nativeHyperlinkStyle(row, linkColor)),
|
|
178
177
|
};
|
|
179
178
|
}
|
|
180
179
|
setEditorPaddingX(padding) {
|
|
181
180
|
this.editor.setPaddingX(padding);
|
|
182
|
-
this
|
|
181
|
+
this.transcript.invalidate("editor-padding");
|
|
183
182
|
}
|
|
184
183
|
setAutocompleteMaxVisible(maxVisible) {
|
|
185
184
|
this.editor.setAutocompleteMaxVisible(maxVisible);
|
|
@@ -189,7 +188,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
189
188
|
return;
|
|
190
189
|
this.#outputPad = padding;
|
|
191
190
|
this.#status.setOutputPad(padding);
|
|
192
|
-
for (const component of this
|
|
191
|
+
for (const component of this.transcript.components())
|
|
193
192
|
component.setOutputPad(padding);
|
|
194
193
|
this.#invalidateTranscriptPresentation();
|
|
195
194
|
}
|
|
@@ -197,7 +196,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
197
196
|
if (this.#thinkingVisible === !hidden)
|
|
198
197
|
return;
|
|
199
198
|
this.#thinkingVisible = !hidden;
|
|
200
|
-
for (const component of this
|
|
199
|
+
for (const component of this.transcript.components())
|
|
201
200
|
component.setHideThinkingBlock(hidden);
|
|
202
201
|
this.#invalidateTranscriptPresentation();
|
|
203
202
|
}
|
|
@@ -205,7 +204,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
205
204
|
if (this.#mermaidRenderingMode === mode)
|
|
206
205
|
return;
|
|
207
206
|
this.#mermaidRenderingMode = mode;
|
|
208
|
-
for (const component of this
|
|
207
|
+
for (const component of this.transcript.components())
|
|
209
208
|
component.setMermaidRenderingMode(mode);
|
|
210
209
|
this.#invalidateTranscriptPresentation();
|
|
211
210
|
}
|
|
@@ -214,7 +213,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
214
213
|
return;
|
|
215
214
|
this.#showImages = showImages;
|
|
216
215
|
this.#imageWidthCells = imageWidthCells;
|
|
217
|
-
for (const component of this
|
|
216
|
+
for (const component of this.transcript.components())
|
|
218
217
|
component.setImagePresentation(showImages, imageWidthCells);
|
|
219
218
|
this.#invalidateTranscriptPresentation();
|
|
220
219
|
}
|
|
@@ -234,9 +233,9 @@ export class OwnedUiSessionShellRoot {
|
|
|
234
233
|
return this.#promptChips.prepareSubmission(text);
|
|
235
234
|
}
|
|
236
235
|
reconcilePromptImageLimitNotice(text = this.editor.getText()) {
|
|
237
|
-
if (this
|
|
236
|
+
if (this.chrome.notice?.errorCode !== "image-count" || !this.#promptChips.imageLimitState(text).corrected)
|
|
238
237
|
return false;
|
|
239
|
-
this.dismissNotice();
|
|
238
|
+
this.chrome.dismissNotice();
|
|
240
239
|
return true;
|
|
241
240
|
}
|
|
242
241
|
hasPendingPastes(text) { return this.#promptChips.hasPending(text); }
|
|
@@ -280,14 +279,14 @@ export class OwnedUiSessionShellRoot {
|
|
|
280
279
|
const becameReady = this.#view.lifecycle !== "ready" && view.lifecycle === "ready";
|
|
281
280
|
if (view.diagnostics.length !== this.#view.diagnostics.length
|
|
282
281
|
|| view.diagnostics.some((diagnostic, index) => diagnostic.sequence !== this.#view.diagnostics[index]?.sequence)) {
|
|
283
|
-
this
|
|
282
|
+
this.transcript.invalidate("diagnostics");
|
|
284
283
|
}
|
|
285
284
|
const promptAccepted = this.#view.lifecycle !== "busy" && view.lifecycle === "busy";
|
|
286
285
|
this.#view = view;
|
|
287
286
|
// Invariant: the idle new-session confirmation yields to the first truthful live status;
|
|
288
287
|
// ordinary dock notices deliberately remain visible below Working during a run.
|
|
289
|
-
if (promptAccepted && this
|
|
290
|
-
this
|
|
288
|
+
if (promptAccepted && this.chrome.notice?.kind === "new-session")
|
|
289
|
+
this.chrome.forgetNotice();
|
|
291
290
|
if (promptAccepted && this.#imageSubmissionsSending > 0) {
|
|
292
291
|
this.#imageSubmissionsSending = 0;
|
|
293
292
|
this.#syncWorkingOverride();
|
|
@@ -295,7 +294,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
295
294
|
this.#status.update(view);
|
|
296
295
|
this.#footer.update(this.#extensions.withStatuses(view));
|
|
297
296
|
this.#queued.update(view.editor.queuedSubmissions);
|
|
298
|
-
this
|
|
297
|
+
this.transcript.sync(view.transcript);
|
|
299
298
|
this.editor.setSubmitEnabled(view.lifecycle !== "stopping" && view.lifecycle !== "stopped" && view.lifecycle !== "failed");
|
|
300
299
|
this.editor.setThinkingLevel(view.thinkingLevel);
|
|
301
300
|
// Performance: semantic updates already invalidate affected transcript blocks. Chrome is a separate authority.
|
|
@@ -303,23 +302,15 @@ export class OwnedUiSessionShellRoot {
|
|
|
303
302
|
if (becameReady)
|
|
304
303
|
this.#onPromptSuggestionEligibilityChanged?.();
|
|
305
304
|
}
|
|
306
|
-
/**
|
|
307
|
-
* Applies one block: its component is created or updated in place and the order grows
|
|
308
|
-
* only when the block is new. A streamed chunk costs one component update rather than a
|
|
309
|
-
* walk of the whole transcript.
|
|
310
|
-
*/
|
|
311
|
-
applyTranscriptBlock(block) {
|
|
312
|
-
this.#document.apply(block);
|
|
313
|
-
}
|
|
314
305
|
#mountTranscript(block) {
|
|
315
306
|
// Invariant: the notice answers the reader's last command, so only their next prompt or
|
|
316
307
|
// shell command retires it; assistant, tool, and compaction blocks streaming in keep it.
|
|
317
308
|
if (block.kind === "user" || block.kind === "bash")
|
|
318
|
-
this.dismissNotice();
|
|
319
|
-
const created =
|
|
320
|
-
if (this
|
|
309
|
+
this.chrome.dismissNotice();
|
|
310
|
+
const created = this.#componentRuntime.components.transcript.component(block, this.#cwd, this.#extensionRenderers, this.#submittedPromptComposer, this.#outputPad, !this.#thinkingVisible, this.#mermaidRenderingMode, this.#showImages, this.#imageWidthCells, this.#imageAssets, { ...this.#componentRuntime, changed: () => {
|
|
311
|
+
if (this.transcript.component(block.id) !== created)
|
|
321
312
|
return;
|
|
322
|
-
this
|
|
313
|
+
this.transcript.blockChanged(block.id);
|
|
323
314
|
this.#layout.invalidate();
|
|
324
315
|
this.#input.clearDockInputCandidate();
|
|
325
316
|
this.#componentRuntime.requestRender();
|
|
@@ -361,26 +352,19 @@ export class OwnedUiSessionShellRoot {
|
|
|
361
352
|
}
|
|
362
353
|
setViewportConfig(config) {
|
|
363
354
|
if (this.#viewportController.setConfig(config)) {
|
|
364
|
-
this
|
|
355
|
+
this.transcript.invalidate("viewport-config");
|
|
365
356
|
this.#layout.invalidate();
|
|
366
357
|
}
|
|
367
358
|
}
|
|
368
359
|
setFullscreenCopyOnSelect(enabled) {
|
|
369
360
|
this.#viewportController.setCopyOnSelect(enabled);
|
|
370
361
|
}
|
|
371
|
-
showCopyAcknowledgement(message) {
|
|
372
|
-
this.#dockChrome.showCopyAcknowledgement(message);
|
|
373
|
-
}
|
|
374
362
|
resumeViewportFollowing() {
|
|
375
363
|
this.#viewportController.resumeFollowing();
|
|
376
364
|
}
|
|
377
365
|
noteCompletedAssistantMessage() {
|
|
378
366
|
this.#viewportController.noteCompletedAssistantMessage();
|
|
379
367
|
}
|
|
380
|
-
/** A new session binding owns new mounts even when it reuses semantic invocation ids. */
|
|
381
|
-
resetTranscript() {
|
|
382
|
-
this.#document.reset();
|
|
383
|
-
}
|
|
384
368
|
resetViewport() {
|
|
385
369
|
this.#viewportController.reset();
|
|
386
370
|
}
|
|
@@ -400,7 +384,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
400
384
|
#renderDockLayout(width) {
|
|
401
385
|
const queued = this.#customViewport ? [] : this.#renderQueued(width);
|
|
402
386
|
const statusRows = this.#customViewport ? this.#status.renderDock(width) : this.#renderStatus(width);
|
|
403
|
-
const noticeRows = this
|
|
387
|
+
const noticeRows = this.chrome.renderNotice(width, this.#outputPad);
|
|
404
388
|
const transientRows = [...queued, ...statusRows, ...noticeRows];
|
|
405
389
|
const messageStart = queued.length;
|
|
406
390
|
const copyableMessageRows = Array.from({ length: statusRows.length + noticeRows.length }, (_value, index) => ({ row: messageStart + index }));
|
|
@@ -420,9 +404,6 @@ export class OwnedUiSessionShellRoot {
|
|
|
420
404
|
copyableMessageRows,
|
|
421
405
|
};
|
|
422
406
|
}
|
|
423
|
-
dismissNotice() {
|
|
424
|
-
this.#dockChrome.dismissNotice();
|
|
425
|
-
}
|
|
426
407
|
#renderQueued(width) {
|
|
427
408
|
return this.#view.editor.queuedSubmissions.length === 0 ? [] : this.#queued.render(width);
|
|
428
409
|
}
|
|
@@ -439,22 +420,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
439
420
|
};
|
|
440
421
|
}
|
|
441
422
|
#renderDocument(width) {
|
|
442
|
-
return this
|
|
443
|
-
}
|
|
444
|
-
transcriptComponent(id) {
|
|
445
|
-
return this.#document.component(id);
|
|
446
|
-
}
|
|
447
|
-
exitTranscript(width) {
|
|
448
|
-
return this.#document.exitTranscript(width);
|
|
449
|
-
}
|
|
450
|
-
appendWorkflowStatus(message) {
|
|
451
|
-
this.#workflowOutput.appendStatus(message);
|
|
452
|
-
}
|
|
453
|
-
appendWorkflowMessage(message, errorCode) {
|
|
454
|
-
this.#workflowOutput.appendMessage(message, errorCode);
|
|
455
|
-
}
|
|
456
|
-
appendWorkflowResult(result, errorCode) {
|
|
457
|
-
this.#workflowOutput.appendResult(result, errorCode);
|
|
423
|
+
return this.transcript.layout(width).rows;
|
|
458
424
|
}
|
|
459
425
|
toggleThinkingVisibility() {
|
|
460
426
|
this.setHideThinkingBlock(this.#thinkingVisible);
|
|
@@ -471,7 +437,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
471
437
|
}
|
|
472
438
|
setExtensionHeader(component) {
|
|
473
439
|
this.#extensions.replaceHeader(component);
|
|
474
|
-
this
|
|
440
|
+
this.transcript.invalidate("extension-header");
|
|
475
441
|
this.invalidate();
|
|
476
442
|
}
|
|
477
443
|
setExtensionFooter(component) {
|
|
@@ -516,9 +482,9 @@ export class OwnedUiSessionShellRoot {
|
|
|
516
482
|
};
|
|
517
483
|
}
|
|
518
484
|
resetWorkflowPresentation() {
|
|
519
|
-
this
|
|
520
|
-
this
|
|
521
|
-
this
|
|
485
|
+
this.chrome.forgetNotice();
|
|
486
|
+
this.chrome.clearCopyAcknowledgement(false);
|
|
487
|
+
this.workflow.reset();
|
|
522
488
|
this.invalidate();
|
|
523
489
|
}
|
|
524
490
|
resetExtensionUi() {
|
|
@@ -526,15 +492,15 @@ export class OwnedUiSessionShellRoot {
|
|
|
526
492
|
this.#syncWorkingOverride();
|
|
527
493
|
this.#footer.update(this.#extensions.withStatuses(this.#view));
|
|
528
494
|
// Invariant: an extension renderer may have drawn transcript blocks that are now unrendered by it.
|
|
529
|
-
this
|
|
495
|
+
this.transcript.invalidate("extension-renderers");
|
|
530
496
|
this.invalidate();
|
|
531
497
|
}
|
|
532
498
|
addExtensionNotification(message, type) {
|
|
533
499
|
if (type === "info") {
|
|
534
|
-
this.
|
|
500
|
+
this.workflow.appendStatus(message);
|
|
535
501
|
return;
|
|
536
502
|
}
|
|
537
|
-
this.
|
|
503
|
+
this.workflow.appendMessage({ kind: type, message });
|
|
538
504
|
}
|
|
539
505
|
extensionFooterData() {
|
|
540
506
|
return {
|
|
@@ -554,7 +520,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
554
520
|
return this.#layout.compositions();
|
|
555
521
|
}
|
|
556
522
|
transcriptRenderCount() {
|
|
557
|
-
return this
|
|
523
|
+
return this.transcript.renderCount;
|
|
558
524
|
}
|
|
559
525
|
setFooterLevel(visible) { this.#footerLevel = visible; }
|
|
560
526
|
setInputSurface(component, disposePrevious = true, coordination = "owned") {
|
|
@@ -565,7 +531,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
565
531
|
this.#input.handleInput(data);
|
|
566
532
|
}
|
|
567
533
|
invalidate() {
|
|
568
|
-
this
|
|
534
|
+
this.transcript.invalidate("repaint");
|
|
569
535
|
this.#invalidateChrome();
|
|
570
536
|
}
|
|
571
537
|
#invalidateChrome() {
|
|
@@ -585,12 +551,12 @@ export class OwnedUiSessionShellRoot {
|
|
|
585
551
|
this.#onPromptSuggestionEligibilityChanged?.();
|
|
586
552
|
}
|
|
587
553
|
dispose() {
|
|
588
|
-
this
|
|
554
|
+
this.chrome.clearCopyAcknowledgement(false);
|
|
589
555
|
this.clearViewportPointerState();
|
|
590
556
|
this.#themeUnsubscribe();
|
|
591
557
|
this.header.dispose?.();
|
|
592
558
|
this.resources.dispose?.();
|
|
593
|
-
this
|
|
559
|
+
this.transcript.dispose();
|
|
594
560
|
this.#layout.invalidate();
|
|
595
561
|
this.#input.dispose();
|
|
596
562
|
this.#extensions.dispose();
|
|
@@ -600,7 +566,7 @@ export class OwnedUiSessionShellRoot {
|
|
|
600
566
|
this.#queued.dispose?.();
|
|
601
567
|
}
|
|
602
568
|
#invalidateTranscriptPresentation() {
|
|
603
|
-
this
|
|
569
|
+
this.transcript.invalidate("block-presentation");
|
|
604
570
|
this.invalidate();
|
|
605
571
|
}
|
|
606
572
|
#renderStatus(width) {
|
|
@@ -611,16 +577,16 @@ export class OwnedUiSessionShellRoot {
|
|
|
611
577
|
if (!this.#customViewport)
|
|
612
578
|
return footer.render(width);
|
|
613
579
|
width = Math.max(0, width - 2);
|
|
614
|
-
return footer.render(width).map(row => ` ${
|
|
580
|
+
return footer.render(width).map(row => ` ${this.#componentRuntime.components.text.truncateToWidth(row, width)}`);
|
|
615
581
|
}
|
|
616
582
|
#setToolsExpanded(expanded) {
|
|
617
583
|
this.#toolsExpanded = expanded;
|
|
618
584
|
this.header.setExpanded(expanded);
|
|
619
585
|
this.resources.setExpanded(expanded);
|
|
620
|
-
for (const component of this
|
|
586
|
+
for (const component of this.transcript.components())
|
|
621
587
|
component.setExpanded(expanded);
|
|
622
588
|
// Invariant: expansion changes what a block draws without changing its revision.
|
|
623
|
-
this
|
|
589
|
+
this.transcript.invalidate("tools-expanded");
|
|
624
590
|
this.invalidate();
|
|
625
591
|
}
|
|
626
592
|
}
|
|
@@ -634,7 +600,7 @@ function withoutTerminalBackground(text) {
|
|
|
634
600
|
* The pinned-profile screen: a followed transcript scroll above the dock. The runtime mounts one such layout,
|
|
635
601
|
* so its single `transcript` scroll view is shared by whichever session the parts currently resolve to.
|
|
636
602
|
*/
|
|
637
|
-
export function pinnedLayoutRoot(parts) {
|
|
603
|
+
export function pinnedLayoutRoot(parts, theme) {
|
|
638
604
|
return {
|
|
639
605
|
type: "stack",
|
|
640
606
|
direction: "vertical",
|
|
@@ -651,8 +617,8 @@ export function pinnedLayoutRoot(parts) {
|
|
|
651
617
|
primary: true,
|
|
652
618
|
overscroll: "chain",
|
|
653
619
|
scrollbar: "auto",
|
|
654
|
-
scrollbarTrackStyle: text =>
|
|
655
|
-
scrollbarThumbStyle: text =>
|
|
620
|
+
scrollbarTrackStyle: text => theme.current().fg("scrollbarTrack", text),
|
|
621
|
+
scrollbarThumbStyle: text => theme.current().fg("scrollbarThumb", text),
|
|
656
622
|
child: { type: "component", component: parts.document },
|
|
657
623
|
},
|
|
658
624
|
},
|
|
@@ -839,13 +805,15 @@ function isPackageExtensionSource(sourceInfo) {
|
|
|
839
805
|
const source = sourceInfo?.source ?? "";
|
|
840
806
|
return source.startsWith("npm:") || source.startsWith("git:");
|
|
841
807
|
}
|
|
842
|
-
// Performance:
|
|
843
|
-
// selection variants while each callback still resolves the live
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
808
|
+
// Performance: one painter set per root keeps identities stable, so the neutral viewport retains row-level
|
|
809
|
+
// selection variants while each callback still resolves the live theme.
|
|
810
|
+
function createViewportTheme(source) {
|
|
811
|
+
return {
|
|
812
|
+
track: text => `${SCROLLBAR_CELL_RESET}${source.current().fg("dim", text)}`,
|
|
813
|
+
thumb: text => `${SCROLLBAR_CELL_RESET}${source.current().fg("accent", text)}`,
|
|
814
|
+
sticky: (text, hovered) => source.current().background(hovered ? "selectedBg" : "toolPendingBg", source.current().fg("text", withoutTerminalBackground(text))),
|
|
815
|
+
quietSticky: text => `\u001b[2m${text.replace(/\u001b\[(?:0|22)m/g, "$&\u001b[2m")}\u001b[22m`,
|
|
816
|
+
bottomControl: (text, hovered) => source.current().background(hovered ? "selectedBg" : "toolPendingBg", source.current().fg("text", text)),
|
|
817
|
+
selection: paintTextSelection,
|
|
818
|
+
};
|
|
819
|
+
}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
+
import type { OwnedUiShellSelectorOption } from "../../contracts/owned-ui/index.js";
|
|
2
|
+
import type { TerminalComponentPort, TerminalInputListenerResult, TerminalInputSurfaceKind, TerminalOverlayHandle, TerminalPointerSurface } from "../../contracts/presentation/index.js";
|
|
1
3
|
import type { OwnedUiCommandResult, OwnedUiSessionBackend, OwnedUiSessionViewModel, OwnedUiThinkingLevel, OwnedUiWorkflowRequest } from "../../contracts/owned-ui/index.js";
|
|
2
|
-
import {
|
|
3
|
-
import type {
|
|
4
|
-
import type { PiShellSelectorOption } from "../../integrations/pi/components/shell-shared-facade.js";
|
|
5
|
-
import type { PiTuiDamageDecision } from "../../integrations/pi/tui-runtime/damage-aware-terminal.js";
|
|
6
|
-
import type { PiTuiRuntimeAdapter } from "../../integrations/pi/tui-runtime/adapter.js";
|
|
7
|
-
import type { PiTuiInputSurfaceKind } from "../../integrations/pi/tui-runtime/input-presentation-coordinator.js";
|
|
8
|
-
import type { PiTuiComponentPort, PiTuiInputListenerResult, PiTuiOverlayHandle, PiTuiPointerSurface } from "../../integrations/pi/tui-runtime/contracts.js";
|
|
4
|
+
import type { OwnedUiShellHotkeysPresentation, OwnedUiShellSkillSummary } from "../../contracts/owned-ui/index.js";
|
|
5
|
+
import type { TerminalDamageDecision, TerminalRuntimePort } from "../../contracts/presentation/index.js";
|
|
9
6
|
import { OwnedUiTerminalHost, type OwnedUiHostedPresenter, type OwnedUiPresenterRelease } from "./shell-host.js";
|
|
10
7
|
import { OwnedUiSessionShellRoot, type OwnedUiSessionShellOptions, type PinnedLayoutPart } from "./session-shell-root.js";
|
|
11
8
|
export { OwnedUiSessionShellRoot, type OwnedUiSessionShellOptions, type OwnedUiShellDiagnosticOptions, type OwnedUiShellEngineOptions, type OwnedUiShellHistoryOptions, type OwnedUiShellPresentationOptions, type OwnedUiShellPromptImagesOptions, type OwnedUiShellSharedServices, type OwnedUiShellSkillsOptions, type OwnedUiShellSuggestionOptions, } from "./session-shell-root.js";
|
|
@@ -26,12 +23,12 @@ export declare class OwnedUiSessionPresenter implements OwnedUiHostedPresenter {
|
|
|
26
23
|
handleInput(data: string): void;
|
|
27
24
|
invalidate(): void;
|
|
28
25
|
setFocused(focused: boolean): void;
|
|
29
|
-
inputCoordinationSurface():
|
|
30
|
-
setOverlaySurfaces(surfaces: readonly
|
|
26
|
+
inputCoordinationSurface(): TerminalInputSurfaceKind;
|
|
27
|
+
setOverlaySurfaces(surfaces: readonly TerminalPointerSurface[] | null): void;
|
|
31
28
|
noteImmediatePresentation(): void;
|
|
32
|
-
layoutPart(part: PinnedLayoutPart):
|
|
29
|
+
layoutPart(part: PinnedLayoutPart): TerminalComponentPort;
|
|
33
30
|
activated(): void;
|
|
34
|
-
handleViewportInput(data: string):
|
|
31
|
+
handleViewportInput(data: string): TerminalInputListenerResult | undefined;
|
|
35
32
|
start(): void;
|
|
36
33
|
onView(listener: (view: OwnedUiSessionViewModel) => void): () => void;
|
|
37
34
|
waitUntilStopped(): Promise<void>;
|
|
@@ -49,10 +46,10 @@ export declare class OwnedUiSessionPresenter implements OwnedUiHostedPresenter {
|
|
|
49
46
|
cycleModel(direction: "forward" | "backward"): Promise<OwnedUiCommandResult>;
|
|
50
47
|
queueFollowUp(): Promise<OwnedUiCommandResult>;
|
|
51
48
|
restoreQueuedInput(): void;
|
|
52
|
-
showSelector(title: string, options: readonly
|
|
49
|
+
showSelector(title: string, options: readonly OwnedUiShellSelectorOption[], onSelect: (id: string) => void, onCancel?: () => void): TerminalOverlayHandle;
|
|
53
50
|
showThinkingSelector(): Promise<void>;
|
|
54
51
|
/** The Skills dialog: a replacement input like the model selector, applying the chosen skill through the prompt path. */
|
|
55
|
-
showSkillsSelector(skills?: readonly
|
|
52
|
+
showSkillsSelector(skills?: readonly OwnedUiShellSkillSummary[]): void;
|
|
56
53
|
showModelSelector(initialSearchInput?: string): void;
|
|
57
54
|
showForkSelector(): void;
|
|
58
55
|
showLogoutSelector(): Promise<void>;
|
|
@@ -74,7 +71,7 @@ export declare class OwnedUiSessionPresenter implements OwnedUiHostedPresenter {
|
|
|
74
71
|
readonly columns: number;
|
|
75
72
|
}): OwnedUiPresenterRelease;
|
|
76
73
|
openOwnedRoute(route: string): void;
|
|
77
|
-
hotkeysPresentation():
|
|
74
|
+
hotkeysPresentation(): OwnedUiShellHotkeysPresentation;
|
|
78
75
|
}
|
|
79
76
|
/**
|
|
80
77
|
* One session on a terminal of its own: a terminal host with this presenter attached. Disposing it ends the
|
|
@@ -82,6 +79,6 @@ export declare class OwnedUiSessionPresenter implements OwnedUiHostedPresenter {
|
|
|
82
79
|
*/
|
|
83
80
|
export declare class OwnedUiSessionShell extends OwnedUiSessionPresenter {
|
|
84
81
|
constructor(options: OwnedUiSessionShellOptions);
|
|
85
|
-
get runtime():
|
|
86
|
-
damagePresentationDecision():
|
|
82
|
+
get runtime(): TerminalRuntimePort;
|
|
83
|
+
damagePresentationDecision(): TerminalDamageDecision | null;
|
|
87
84
|
}
|