@pentoshi/clai 4.8.3 → 4.9.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/README.md +69 -3
- package/dist/agent/finalize-gate.js +0 -9
- package/dist/agent/finalize-gate.js.map +1 -1
- package/dist/agent/plan-mode-reminders.js +5 -5
- package/dist/agent/plan-mode-reminders.js.map +1 -1
- package/dist/agent/plan-tool.d.ts +1 -0
- package/dist/agent/plan-tool.js +50 -21
- package/dist/agent/plan-tool.js.map +1 -1
- package/dist/agent/reliability-policy.d.ts +9 -0
- package/dist/agent/reliability-policy.js +36 -1
- package/dist/agent/reliability-policy.js.map +1 -1
- package/dist/agent/runner.d.ts +4 -0
- package/dist/agent/runner.js +193 -116
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/task-analyzer.d.ts +8 -18
- package/dist/agent/task-analyzer.js +75 -182
- package/dist/agent/task-analyzer.js.map +1 -1
- package/dist/agent/task-evidence.js +10 -0
- package/dist/agent/task-evidence.js.map +1 -1
- package/dist/agent/tool-call-parser.js +14 -13
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/app/adapters/current-agent-adapter.d.ts +5 -1
- package/dist/app/adapters/current-agent-adapter.js +2 -1
- package/dist/app/adapters/current-agent-adapter.js.map +1 -1
- package/dist/app/commands/catalog.js +5 -0
- package/dist/app/commands/catalog.js.map +1 -1
- package/dist/app/controllers/session-compact-helper.js +3 -6
- package/dist/app/controllers/session-compact-helper.js.map +1 -1
- package/dist/app/ports/transcript-item.d.ts +4 -0
- package/dist/classic/app/ClassicApp.js +1 -1
- package/dist/classic/app/ClassicApp.js.map +1 -1
- package/dist/classic/app/action-handlers.js +4 -0
- package/dist/classic/app/action-handlers.js.map +1 -1
- package/dist/classic/app/app-wiring.js +1 -0
- package/dist/classic/app/app-wiring.js.map +1 -1
- package/dist/classic/app/wiring-lifecycle.js +1 -0
- package/dist/classic/app/wiring-lifecycle.js.map +1 -1
- package/dist/classic/blocks/compacted-lines.js +3 -0
- package/dist/classic/blocks/compacted-lines.js.map +1 -1
- package/dist/classic/blocks/thinking-lines.js +11 -2
- package/dist/classic/blocks/thinking-lines.js.map +1 -1
- package/dist/classic/bootstrap/start-classic.js +3 -0
- package/dist/classic/bootstrap/start-classic.js.map +1 -1
- package/dist/classic/chrome/Composer.d.ts +6 -0
- package/dist/classic/chrome/Composer.js +2 -3
- package/dist/classic/chrome/Composer.js.map +1 -1
- package/dist/classic/chrome/composer-controller.d.ts +6 -1
- package/dist/classic/chrome/composer-controller.js +18 -8
- package/dist/classic/chrome/composer-controller.js.map +1 -1
- package/dist/classic/chrome/editor-view.d.ts +2 -1
- package/dist/classic/chrome/editor-view.js +1 -1
- package/dist/classic/chrome/editor-view.js.map +1 -1
- package/dist/classic/chrome/status-rows.js +3 -2
- package/dist/classic/chrome/status-rows.js.map +1 -1
- package/dist/classic/panels/TextEditorPanel.d.ts +3 -0
- package/dist/classic/panels/TextEditorPanel.js +7 -0
- package/dist/classic/panels/TextEditorPanel.js.map +1 -0
- package/dist/classic/panels/panel-controller.js +28 -1
- package/dist/classic/panels/panel-controller.js.map +1 -1
- package/dist/classic/panels/panel-effect.d.ts +3 -0
- package/dist/classic/panels/panel-effect.js.map +1 -1
- package/dist/classic/panels/panel-effects.js +3 -0
- package/dist/classic/panels/panel-effects.js.map +1 -1
- package/dist/classic/panels/panel-host.js +3 -0
- package/dist/classic/panels/panel-host.js.map +1 -1
- package/dist/classic/panels/panel-types.d.ts +2 -0
- package/dist/classic/panels/secret-panel.d.ts +1 -1
- package/dist/classic/panels/secret-panel.js +4 -2
- package/dist/classic/panels/secret-panel.js.map +1 -1
- package/dist/classic/panels/text-editor-panel.d.ts +33 -0
- package/dist/classic/panels/text-editor-panel.js +101 -0
- package/dist/classic/panels/text-editor-panel.js.map +1 -0
- package/dist/llm/adapters/anthropic-tools.d.ts +2 -1
- package/dist/llm/adapters/anthropic-tools.js +55 -4
- package/dist/llm/adapters/anthropic-tools.js.map +1 -1
- package/dist/llm/anthropic.js +1 -1
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +2 -0
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/meta.js +62 -68
- package/dist/llm/meta.js.map +1 -1
- package/dist/llm/provider.js +7 -7
- package/dist/llm/request-plan.js +7 -2
- package/dist/llm/request-plan.js.map +1 -1
- package/dist/llm/tool-protocol.d.ts +1 -0
- package/dist/llm/tool-protocol.js +7 -0
- package/dist/llm/tool-protocol.js.map +1 -1
- package/dist/mcp/client.d.ts +27 -0
- package/dist/mcp/client.js +119 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/config-file.d.ts +35 -0
- package/dist/mcp/config-file.js +217 -0
- package/dist/mcp/config-file.js.map +1 -0
- package/dist/mcp/discovery.d.ts +4 -0
- package/dist/mcp/discovery.js +409 -0
- package/dist/mcp/discovery.js.map +1 -0
- package/dist/mcp/format.d.ts +17 -0
- package/dist/mcp/format.js +122 -0
- package/dist/mcp/format.js.map +1 -0
- package/dist/mcp/index.d.ts +15 -0
- package/dist/mcp/index.js +16 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/jsonrpc.d.ts +40 -0
- package/dist/mcp/jsonrpc.js +175 -0
- package/dist/mcp/jsonrpc.js.map +1 -0
- package/dist/mcp/manager.d.ts +36 -0
- package/dist/mcp/manager.js +300 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/mentions.d.ts +9 -0
- package/dist/mcp/mentions.js +44 -0
- package/dist/mcp/mentions.js.map +1 -0
- package/dist/mcp/names.d.ts +15 -0
- package/dist/mcp/names.js +59 -0
- package/dist/mcp/names.js.map +1 -0
- package/dist/mcp/results.d.ts +6 -0
- package/dist/mcp/results.js +182 -0
- package/dist/mcp/results.js.map +1 -0
- package/dist/mcp/runtime.d.ts +107 -0
- package/dist/mcp/runtime.js +505 -0
- package/dist/mcp/runtime.js.map +1 -0
- package/dist/mcp/substitution.d.ts +13 -0
- package/dist/mcp/substitution.js +74 -0
- package/dist/mcp/substitution.js.map +1 -0
- package/dist/mcp/transport-http.d.ts +53 -0
- package/dist/mcp/transport-http.js +433 -0
- package/dist/mcp/transport-http.js.map +1 -0
- package/dist/mcp/transport-stdio.d.ts +39 -0
- package/dist/mcp/transport-stdio.js +268 -0
- package/dist/mcp/transport-stdio.js.map +1 -0
- package/dist/mcp/transport.d.ts +20 -0
- package/dist/mcp/transport.js +44 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/mcp/types.d.ts +179 -0
- package/dist/mcp/types.js +30 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/validation.d.ts +16 -0
- package/dist/mcp/validation.js +222 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/modes/agent.d.ts +2 -0
- package/dist/modes/agent.js.map +1 -1
- package/dist/noninteractive/start-noninteractive.js +4 -0
- package/dist/noninteractive/start-noninteractive.js.map +1 -1
- package/dist/prompts/embedded.js +2 -2
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.js +70 -55
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/system.agent.md +34 -10
- package/dist/prompts/system.ask.md +8 -0
- package/dist/safety/classifier.js +4 -0
- package/dist/safety/classifier.js.map +1 -1
- package/dist/store/logs.js +17 -6
- package/dist/store/logs.js.map +1 -1
- package/dist/store/plan.d.ts +2 -0
- package/dist/store/plan.js +12 -13
- package/dist/store/plan.js.map +1 -1
- package/dist/store/session-workspace.js +2 -1
- package/dist/store/session-workspace.js.map +1 -1
- package/dist/tools/definitions.js +18 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/external-tools.d.ts +30 -0
- package/dist/tools/external-tools.js +52 -0
- package/dist/tools/external-tools.js.map +1 -0
- package/dist/tools/registry.js +36 -5
- package/dist/tools/registry.js.map +1 -1
- package/dist/tui-v2/bootstrap/start-tui-v2.js +3 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
- package/dist/tui-v2/components/completion/completion-menu.d.ts +4 -6
- package/dist/tui-v2/components/completion/completion-menu.js +34 -16
- package/dist/tui-v2/components/completion/completion-menu.js.map +1 -1
- package/dist/tui-v2/components/composer/composer-input-box.js +3 -1
- package/dist/tui-v2/components/composer/composer-input-box.js.map +1 -1
- package/dist/tui-v2/components/modal/secret-modal.js +6 -4
- package/dist/tui-v2/components/modal/secret-modal.js.map +1 -1
- package/dist/tui-v2/components/modal/text-editor-modal.d.ts +19 -0
- package/dist/tui-v2/components/modal/text-editor-modal.js +85 -0
- package/dist/tui-v2/components/modal/text-editor-modal.js.map +1 -0
- package/dist/tui-v2/components/overlay/overlay-host.js +2 -1
- package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
- package/dist/tui-v2/components/transcript/compacted-row.js +12 -3
- package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/thinking-block.d.ts +9 -1
- package/dist/tui-v2/components/transcript/thinking-block.js +253 -49
- package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
- package/dist/tui-v2/components/transcript/thinking-presentation.d.ts +46 -0
- package/dist/tui-v2/components/transcript/thinking-presentation.js +84 -0
- package/dist/tui-v2/components/transcript/thinking-presentation.js.map +1 -0
- package/dist/tui-v2/components/transcript/transcript-row.d.ts +2 -0
- package/dist/tui-v2/components/transcript/transcript-row.js +7 -2
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-view.js +195 -83
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.js +54 -39
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/tui-v2/composer/composer-highlight.d.ts +20 -0
- package/dist/tui-v2/composer/composer-highlight.js +97 -0
- package/dist/tui-v2/composer/composer-highlight.js.map +1 -0
- package/dist/tui-v2/composer/textarea-keybindings.d.ts +5 -0
- package/dist/tui-v2/composer/textarea-keybindings.js +12 -0
- package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -1
- package/dist/ui/mentions.js +4 -1
- package/dist/ui/mentions.js.map +1 -1
- package/dist/ui-core/actions/action-id.d.ts +1 -1
- package/dist/ui-core/actions/action-id.js +1 -0
- package/dist/ui-core/actions/action-id.js.map +1 -1
- package/dist/ui-core/actions/format-shortcuts.js +5 -0
- package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
- package/dist/ui-core/actions/keymap.js +3 -0
- package/dist/ui-core/actions/keymap.js.map +1 -1
- package/dist/ui-core/bootstrap/composition-root.d.ts +3 -0
- package/dist/ui-core/bootstrap/composition-root.js +5 -1
- package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
- package/dist/ui-core/commands/command-handlers.js +2 -0
- package/dist/ui-core/commands/command-handlers.js.map +1 -1
- package/dist/ui-core/commands/mcp-commands.d.ts +3 -0
- package/dist/ui-core/commands/mcp-commands.js +310 -0
- package/dist/ui-core/commands/mcp-commands.js.map +1 -0
- package/dist/ui-core/commands/picker-commands.d.ts +1 -1
- package/dist/ui-core/commands/picker-commands.js +2 -2
- package/dist/ui-core/commands/picker-commands.js.map +1 -1
- package/dist/ui-core/commands/session-commands.js +1 -0
- package/dist/ui-core/commands/session-commands.js.map +1 -1
- package/dist/ui-core/composer/completion-viewport.d.ts +40 -0
- package/dist/ui-core/composer/completion-viewport.js +105 -0
- package/dist/ui-core/composer/completion-viewport.js.map +1 -0
- package/dist/ui-core/controllers/overlay-controller.d.ts +24 -3
- package/dist/ui-core/controllers/overlay-controller.js +35 -4
- package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
- package/dist/ui-core/rendering/artifact-pager-source.d.ts +1 -0
- package/dist/ui-core/rendering/artifact-pager-source.js +67 -1
- package/dist/ui-core/rendering/artifact-pager-source.js.map +1 -1
- package/dist/ui-core/rendering/duration.d.ts +3 -1
- package/dist/ui-core/rendering/duration.js +14 -0
- package/dist/ui-core/rendering/duration.js.map +1 -1
- package/dist/ui-core/rendering/exit-summary.js +4 -4
- package/dist/ui-core/rendering/format-help.js +4 -0
- package/dist/ui-core/rendering/format-help.js.map +1 -1
- package/dist/ui-core/rendering/intro-header.js +4 -4
- package/dist/ui-core/rendering/open-tool-output.js +90 -32
- package/dist/ui-core/rendering/open-tool-output.js.map +1 -1
- package/dist/ui-core/rendering/theme.d.ts +5 -3
- package/dist/ui-core/rendering/theme.js +8 -4
- package/dist/ui-core/rendering/theme.js.map +1 -1
- package/dist/ui-core/rendering/wordmark.d.ts +2 -2
- package/dist/ui-core/rendering/wordmark.js +62 -62
- package/dist/ui-core/rendering/wordmark.js.map +1 -1
- package/dist/ui-core/state/thinking-copy.d.ts +13 -0
- package/dist/ui-core/state/thinking-copy.js +33 -0
- package/dist/ui-core/state/thinking-copy.js.map +1 -0
- package/dist/ui-core/state/transcript-hydrate.js +20 -0
- package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
- package/dist/ui-core/state/transcript-reducer.js +140 -62
- package/dist/ui-core/state/transcript-reducer.js.map +1 -1
- package/dist/ui-core/state/transcript-store.d.ts +10 -0
- package/dist/ui-core/state/transcript-store.js +235 -31
- package/dist/ui-core/state/transcript-store.js.map +1 -1
- package/dist/ui-core/state/transcript-types.d.ts +10 -0
- package/dist/ui-core/state/transcript-types.js +1 -0
- package/dist/ui-core/state/transcript-types.js.map +1 -1
- package/dist/ui-core/state/transcript-window.d.ts +32 -0
- package/dist/ui-core/state/transcript-window.js +63 -0
- package/dist/ui-core/state/transcript-window.js.map +1 -0
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +1 -1
- package/dist/tui-v2/composer/skill-highlight.d.ts +0 -3
- package/dist/tui-v2/composer/skill-highlight.js +0 -63
- package/dist/tui-v2/composer/skill-highlight.js.map +0 -1
|
@@ -28,11 +28,13 @@ function isPrintableSequence(seq) {
|
|
|
28
28
|
}
|
|
29
29
|
export function SecretModal(props) {
|
|
30
30
|
const { services, theme, request, docked } = props;
|
|
31
|
-
const bufferRef = useRef(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
const bufferRef = useRef((() => {
|
|
32
|
+
const buffer = new SecretBuffer();
|
|
33
|
+
buffer.insert(request.initialValue ?? "", 0);
|
|
34
|
+
return buffer;
|
|
35
|
+
})());
|
|
35
36
|
const revealed = request.reveal === true;
|
|
37
|
+
const [mask, setMask] = useState(() => revealed ? bufferRef.current.reveal() : bufferRef.current.masked());
|
|
36
38
|
function refreshMask() {
|
|
37
39
|
setMask(revealed ? bufferRef.current.reveal() : bufferRef.current.masked());
|
|
38
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-modal.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/modal/secret-modal.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AACtC;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACL,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAGrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAS1E,MAAM,MAAM,GAAG,SAAS,CAAC;AAEzB,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,yDAAyD;QACzD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC
|
|
1
|
+
{"version":3,"file":"secret-modal.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/modal/secret-modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** @jsxImportSource @opentui/react */
|
|
2
|
+
/**
|
|
3
|
+
* Multiline text editor overlay (long structured input such as MCP server
|
|
4
|
+
* JSON). Uses the native textarea so the caret, arrow navigation, selection,
|
|
5
|
+
* word/line kills and mid-text edits behave exactly like the composer —
|
|
6
|
+
* Enter inserts a newline here and Ctrl+S saves.
|
|
7
|
+
*/
|
|
8
|
+
import { type ReactNode } from "react";
|
|
9
|
+
import type { AppServices } from "../../../ui-core/bootstrap/composition-root.js";
|
|
10
|
+
import type { Theme } from "../../../ui-core/rendering/theme.js";
|
|
11
|
+
import type { TextEditorRequest } from "../../../ui-core/controllers/overlay-controller.js";
|
|
12
|
+
export interface TextEditorModalProps {
|
|
13
|
+
readonly services: AppServices;
|
|
14
|
+
readonly theme: Theme;
|
|
15
|
+
readonly request: TextEditorRequest;
|
|
16
|
+
readonly width: number;
|
|
17
|
+
readonly height: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function TextEditorModal(props: TextEditorModalProps): ReactNode;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
/** @jsxImportSource @opentui/react */
|
|
3
|
+
/**
|
|
4
|
+
* Multiline text editor overlay (long structured input such as MCP server
|
|
5
|
+
* JSON). Uses the native textarea so the caret, arrow navigation, selection,
|
|
6
|
+
* word/line kills and mid-text edits behave exactly like the composer —
|
|
7
|
+
* Enter inserts a newline here and Ctrl+S saves.
|
|
8
|
+
*/
|
|
9
|
+
import { useEffect, useRef, useState } from "react";
|
|
10
|
+
import { TextAttributes, } from "@opentui/core";
|
|
11
|
+
import { chordFromKeyEvent } from "../../input/chord-from-opentui-key.js";
|
|
12
|
+
import { buildTextEditorTextareaOverrides } from "../../composer/textarea-keybindings.js";
|
|
13
|
+
const keyBindings = buildTextEditorTextareaOverrides();
|
|
14
|
+
export function TextEditorModal(props) {
|
|
15
|
+
const { services, theme, request } = props;
|
|
16
|
+
const editorRef = useRef(null);
|
|
17
|
+
const [caret, setCaret] = useState({ line: 1, column: 1, lines: 1 });
|
|
18
|
+
const width = Math.max(24, Math.min(props.width - 4, 120));
|
|
19
|
+
const rows = Math.max(4, Math.min(props.height - 8, 24));
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const editor = editorRef.current;
|
|
22
|
+
if (!editor)
|
|
23
|
+
return;
|
|
24
|
+
if (request.initialValue) {
|
|
25
|
+
editor.setText(request.initialValue);
|
|
26
|
+
editor.gotoBufferEnd();
|
|
27
|
+
}
|
|
28
|
+
editor.focus();
|
|
29
|
+
}, [request.initialValue]);
|
|
30
|
+
function syncCaret() {
|
|
31
|
+
const editor = editorRef.current;
|
|
32
|
+
if (!editor)
|
|
33
|
+
return;
|
|
34
|
+
const text = editor.plainText;
|
|
35
|
+
const offset = Math.max(0, Math.min(editor.cursorOffset, text.length));
|
|
36
|
+
const before = text.slice(0, offset);
|
|
37
|
+
const line = before.split("\n").length;
|
|
38
|
+
const column = offset - (before.lastIndexOf("\n") + 1) + 1;
|
|
39
|
+
setCaret((current) => current.line === line &&
|
|
40
|
+
current.column === column &&
|
|
41
|
+
current.lines === text.split("\n").length
|
|
42
|
+
? current
|
|
43
|
+
: { line, column, lines: text.split("\n").length });
|
|
44
|
+
}
|
|
45
|
+
function submit() {
|
|
46
|
+
services.overlay.answerTextEditor(editorRef.current?.plainText ?? "");
|
|
47
|
+
}
|
|
48
|
+
function onKeyDown(key) {
|
|
49
|
+
const chord = chordFromKeyEvent(key);
|
|
50
|
+
if (chord === "ctrl+s") {
|
|
51
|
+
key.preventDefault();
|
|
52
|
+
submit();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (chord === "escape") {
|
|
56
|
+
key.preventDefault();
|
|
57
|
+
services.overlay.answerTextEditor(undefined);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return (_jsxs("box", { border: true, borderStyle: "rounded", title: ` ${request.title} `, titleAlignment: "left", titleColor: theme.modalBorder, style: {
|
|
62
|
+
flexDirection: "column",
|
|
63
|
+
width,
|
|
64
|
+
borderColor: theme.modalBorder,
|
|
65
|
+
backgroundColor: theme.statusBackground,
|
|
66
|
+
paddingLeft: 1,
|
|
67
|
+
paddingRight: 1,
|
|
68
|
+
}, children: [_jsx("text", { style: { fg: theme.foreground }, content: request.prompt }), _jsx("box", { border: true, borderStyle: "single", style: {
|
|
69
|
+
flexDirection: "row",
|
|
70
|
+
width: "100%",
|
|
71
|
+
height: rows + 2,
|
|
72
|
+
borderColor: theme.inputBorder,
|
|
73
|
+
backgroundColor: theme.statusBackground,
|
|
74
|
+
paddingLeft: 1,
|
|
75
|
+
paddingRight: 1,
|
|
76
|
+
}, children: _jsx("textarea", { ref: editorRef, focused: true, selectable: true, selectionBg: theme.selection, selectionFg: theme.white, placeholder: request.placeholder ?? "", placeholderColor: theme.muted, textColor: theme.foreground, backgroundColor: theme.statusBackground, cursorColor: theme.inputBorder, keyBindings: keyBindings, wrapMode: "word", onKeyDown: onKeyDown, onContentChange: syncCaret, onCursorChange: syncCaret, style: {
|
|
77
|
+
flexGrow: 1,
|
|
78
|
+
flexShrink: 1,
|
|
79
|
+
minWidth: 0,
|
|
80
|
+
minHeight: 1,
|
|
81
|
+
width: 0,
|
|
82
|
+
height: "100%",
|
|
83
|
+
} }) }), _jsxs("box", { style: { flexDirection: "row", width: "100%" }, children: [_jsx("text", { style: { fg: theme.cyan, attributes: TextAttributes.BOLD }, content: "\u203A " }), _jsx("text", { style: { fg: theme.cyan }, content: `^S ${request.submitLabel ?? "save"} · enter newline · arrows move · esc cancel` }), _jsx("text", { style: { fg: theme.muted, attributes: TextAttributes.DIM }, content: ` ln ${String(caret.line)}/${String(caret.lines)} · col ${String(caret.column)}` })] })] }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=text-editor-modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-editor-modal.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/modal/text-editor-modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { PromptActionsModal } from "../modal/prompt-actions-modal.js";
|
|
|
6
6
|
import { SecretModal } from "../modal/secret-modal.js";
|
|
7
7
|
import { ScopeModal } from "../modal/scope-modal.js";
|
|
8
8
|
import { KeysModal } from "../modal/keys-modal.js";
|
|
9
|
+
import { TextEditorModal } from "../modal/text-editor-modal.js";
|
|
9
10
|
import { Pager } from "../pager/pager.js";
|
|
10
11
|
import { JobsPanel } from "../jobs/jobs-panel.js";
|
|
11
12
|
function isDockedKind(kind) {
|
|
@@ -43,6 +44,6 @@ export function OverlayHost(props) {
|
|
|
43
44
|
backgroundColor: theme.background,
|
|
44
45
|
alignItems: "center",
|
|
45
46
|
justifyContent: "center",
|
|
46
|
-
}, children: [state.kind === "picker" ? (_jsx(Picker, { services: services, theme: theme, request: state.request })) : null, state.kind === "prompt-actions" ? (_jsx(PromptActionsModal, { services: services, theme: theme, request: state.request })) : null, state.kind === "pager" ? (_jsx(Pager, { services: services, theme: theme, title: state.title, body: state.body, source: state.source, highlightPath: state.highlightPath, markdown: state.markdown })) : null, state.kind === "jobs" ? _jsx(JobsPanel, { services: services, theme: theme }) : null] }));
|
|
47
|
+
}, children: [state.kind === "picker" ? (_jsx(Picker, { services: services, theme: theme, request: state.request })) : null, state.kind === "prompt-actions" ? (_jsx(PromptActionsModal, { services: services, theme: theme, request: state.request })) : null, state.kind === "pager" ? (_jsx(Pager, { services: services, theme: theme, title: state.title, body: state.body, source: state.source, highlightPath: state.highlightPath, markdown: state.markdown })) : null, state.kind === "jobs" ? _jsx(JobsPanel, { services: services, theme: theme }) : null, state.kind === "text-editor" ? (_jsx(TextEditorModal, { services: services, theme: theme, request: state.request, width: width, height: height })) : null] }));
|
|
47
48
|
}
|
|
48
49
|
//# sourceMappingURL=overlay-host.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay-host.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/overlay/overlay-host.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"overlay-host.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/overlay/overlay-host.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
2
|
/** @jsxImportSource @opentui/react */
|
|
3
3
|
/**
|
|
4
4
|
* Compacted-context card — compact summary strip; full memory opens in the
|
|
5
5
|
* pager modal (same as tool OUTPUT), not an in-chat mega-expand.
|
|
6
6
|
*/
|
|
7
|
-
import { Fragment, useMemo, useRef } from "react";
|
|
7
|
+
import { Fragment, useEffect, useMemo, useRef, useState, } from "react";
|
|
8
8
|
import { TextAttributes } from "@opentui/core";
|
|
9
9
|
import { useTerminalDimensions } from "@opentui/react";
|
|
10
10
|
import { compactionTokenLabel } from "../../../ui-core/state/transcript-types.js";
|
|
@@ -13,10 +13,19 @@ import { EMPTY_MARKDOWN_STREAM_CACHE, } from "../../../ui-core/rendering/streami
|
|
|
13
13
|
import { renderStyledStreamingMarkdown } from "../../rendering/styled-markdown.js";
|
|
14
14
|
import { liveCompactionHeadTail } from "../../../ui-core/rendering/thinking-tail.js";
|
|
15
15
|
import { useClickWithoutDrag } from "./use-click-without-drag.js";
|
|
16
|
+
import { compactionElapsedLabel } from "../../../ui-core/rendering/duration.js";
|
|
16
17
|
const PREVIEW_LINES = 4;
|
|
17
18
|
export function CompactedRow(props) {
|
|
18
19
|
const { item, theme, services, contentWidth } = props;
|
|
19
20
|
const { width: termWidth } = useTerminalDimensions();
|
|
21
|
+
const [now, setNow] = useState(() => Date.now());
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!item.streaming)
|
|
24
|
+
return;
|
|
25
|
+
const clock = setInterval(() => setNow(Date.now()), 1_000);
|
|
26
|
+
return () => clearInterval(clock);
|
|
27
|
+
}, [item.streaming]);
|
|
28
|
+
const elapsedLabel = compactionElapsedLabel(item, now);
|
|
20
29
|
const wrapWidth = Math.max(20, contentWidth != null
|
|
21
30
|
? Math.max(20, contentWidth - 4)
|
|
22
31
|
: Math.max(40, termWidth - 10));
|
|
@@ -76,7 +85,7 @@ export function CompactedRow(props) {
|
|
|
76
85
|
width: "100%",
|
|
77
86
|
paddingTop: 0,
|
|
78
87
|
paddingBottom: 0,
|
|
79
|
-
}, children: [
|
|
88
|
+
}, children: [_jsx("text", { content: `✦ Compacted context${item.streaming ? " …" : ""}${elapsedLabel ? ` · ${elapsedLabel}` : ""}`, selectable: true, style: { fg: borderFg, attributes: TextAttributes.BOLD } }), _jsx("text", { content: " ", selectable: true }), _jsx("text", { selectable: true, style: {
|
|
80
89
|
fg: borderFg,
|
|
81
90
|
bg: theme.chip,
|
|
82
91
|
attributes: TextAttributes.BOLD,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compacted-row.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/transcript/compacted-row.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AACtC;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"compacted-row.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/transcript/compacted-row.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
* thinking toggle (Ctrl+T). After the block is finalized, the body follows the
|
|
8
8
|
* global Ctrl+T toggle (or a per-block override from clicking the header).
|
|
9
9
|
*
|
|
10
|
+
* The body is a fixed-height window of pre-wrapped rows, paged by an internal
|
|
11
|
+
* offset. A nested ScrollBox is deliberately avoided: inside the transcript
|
|
12
|
+
* ScrollBox its children escaped the parent's scissor rect and overdrew the
|
|
13
|
+
* following response rows.
|
|
14
|
+
*
|
|
10
15
|
* Placement: thinking rows always precede the ◆ Response / tool cards for
|
|
11
16
|
* the same model step (agent emits thinking-block before assistant-message
|
|
12
17
|
* and tool-call). Violet accent distinguishes reasoning from green replies.
|
|
@@ -18,7 +23,10 @@ export declare function ThinkingBlock(props: {
|
|
|
18
23
|
item: ThinkingItem;
|
|
19
24
|
theme: Theme;
|
|
20
25
|
expanded: boolean;
|
|
21
|
-
/** Chat-pane columns (plan split/overlay already subtracted). */
|
|
22
26
|
contentWidth?: number | undefined;
|
|
23
27
|
onToggle: () => void;
|
|
28
|
+
/** This card owns the pointer wheel (clicked, not Ctrl+T). */
|
|
29
|
+
focused?: boolean | undefined;
|
|
30
|
+
onFocus?: (() => void) | undefined;
|
|
31
|
+
onBlur?: (() => void) | undefined;
|
|
24
32
|
}): ReactNode;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx
|
|
1
|
+
import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
2
2
|
/** @jsxImportSource @opentui/react */
|
|
3
3
|
/**
|
|
4
4
|
* Renders a `ThinkingItem` (CHAT-006, V2-053).
|
|
@@ -8,62 +8,266 @@ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
|
8
8
|
* thinking toggle (Ctrl+T). After the block is finalized, the body follows the
|
|
9
9
|
* global Ctrl+T toggle (or a per-block override from clicking the header).
|
|
10
10
|
*
|
|
11
|
+
* The body is a fixed-height window of pre-wrapped rows, paged by an internal
|
|
12
|
+
* offset. A nested ScrollBox is deliberately avoided: inside the transcript
|
|
13
|
+
* ScrollBox its children escaped the parent's scissor rect and overdrew the
|
|
14
|
+
* following response rows.
|
|
15
|
+
*
|
|
11
16
|
* Placement: thinking rows always precede the ◆ Response / tool cards for
|
|
12
17
|
* the same model step (agent emits thinking-block before assistant-message
|
|
13
18
|
* and tool-call). Violet accent distinguishes reasoning from green replies.
|
|
14
19
|
*/
|
|
15
|
-
import { useMemo } from "react";
|
|
16
|
-
import { TextAttributes } from "@opentui/core";
|
|
20
|
+
import { useEffect, useMemo, useRef, useState, } from "react";
|
|
21
|
+
import { TextAttributes, } from "@opentui/core";
|
|
17
22
|
import { useTerminalDimensions } from "@opentui/react";
|
|
18
23
|
import { renderColumns } from "../../../ui-core/rendering/text-width.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
+
import { sanitizeDisplayText } from "../../../ui-core/rendering/sanitize-display.js";
|
|
25
|
+
import { thinkingElapsedLabel } from "../../../ui-core/rendering/duration.js";
|
|
26
|
+
import { resolveThinkingFooter, resolveThinkingHeadingStyle, resolveThinkingPresentation, resolveThinkingViewport, THINKING_BODY_MAX_ROWS, wrapThinkingBody, } from "./thinking-presentation.js";
|
|
27
|
+
import { useClickWithoutDrag } from "./use-click-without-drag.js";
|
|
28
|
+
const WHEEL_ROWS = 3;
|
|
29
|
+
/** Rows per tick while drag-selecting at a body edge. */
|
|
30
|
+
const DRAG_SCROLL_ROWS = 2;
|
|
31
|
+
/** Autoscroll cadence while the pointer is held at a body edge. */
|
|
32
|
+
const DRAG_SCROLL_MS = 45;
|
|
24
33
|
export function ThinkingBlock(props) {
|
|
25
|
-
const { item, theme, expanded, contentWidth, onToggle } = props;
|
|
34
|
+
const { item, theme, expanded, contentWidth, onToggle, focused = false, onFocus, onBlur, } = props;
|
|
26
35
|
const { width: termWidth } = useTerminalDimensions();
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
36
|
+
const cardRef = useRef(null);
|
|
37
|
+
const followTail = useRef(true);
|
|
38
|
+
const offsetRef = useRef(0);
|
|
39
|
+
const dragActive = useRef(false);
|
|
40
|
+
const dragTimer = useRef(undefined);
|
|
41
|
+
const lineCountRef = useRef(0);
|
|
42
|
+
const [now, setNow] = useState(() => Date.now());
|
|
43
|
+
const [requestedOffset, setRequestedOffset] = useState(0);
|
|
44
|
+
const [headingHovered, setHeadingHovered] = useState(false);
|
|
45
|
+
const bodyWidth = Math.max(18, (contentWidth != null ? contentWidth : Math.max(40, termWidth - 8)) - 4);
|
|
46
|
+
const content = useMemo(() => sanitizeDisplayText(item.content).replace(/\r\n/g, "\n"), [item.content]);
|
|
47
|
+
const lines = useMemo(() => wrapThinkingBody(content, bodyWidth, item.streaming), [content, bodyWidth, item.streaming]);
|
|
48
|
+
const viewport = resolveThinkingViewport({
|
|
49
|
+
lineCount: lines.length,
|
|
50
|
+
offset: item.streaming && followTail.current
|
|
51
|
+
? Number.POSITIVE_INFINITY
|
|
52
|
+
: requestedOffset,
|
|
53
|
+
maxRows: THINKING_BODY_MAX_ROWS,
|
|
54
|
+
});
|
|
55
|
+
const visibleRows = useMemo(() => lines
|
|
56
|
+
.slice(viewport.offset, viewport.offset + viewport.rows)
|
|
57
|
+
.map((row) => row + " ".repeat(Math.max(0, bodyWidth - renderColumns(row)))), [lines, viewport.offset, viewport.rows, bodyWidth]);
|
|
58
|
+
offsetRef.current = viewport.offset;
|
|
59
|
+
lineCountRef.current = lines.length;
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!item.streaming)
|
|
62
|
+
return;
|
|
63
|
+
const clock = setInterval(() => setNow(Date.now()), 1_000);
|
|
64
|
+
return () => clearInterval(clock);
|
|
65
|
+
}, [item.streaming]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (item.streaming)
|
|
68
|
+
return;
|
|
69
|
+
followTail.current = true;
|
|
70
|
+
offsetRef.current = 0;
|
|
71
|
+
setRequestedOffset(0);
|
|
72
|
+
}, [item.streaming]);
|
|
73
|
+
const stopDragScroll = () => {
|
|
74
|
+
if (dragTimer.current === undefined)
|
|
75
|
+
return;
|
|
76
|
+
clearInterval(dragTimer.current);
|
|
77
|
+
dragTimer.current = undefined;
|
|
78
|
+
};
|
|
79
|
+
useEffect(() => stopDragScroll, []);
|
|
80
|
+
const maxOffsetNow = () => {
|
|
81
|
+
const rows = Math.max(1, Math.min(THINKING_BODY_MAX_ROWS, lineCountRef.current));
|
|
82
|
+
return Math.max(0, lineCountRef.current - rows);
|
|
83
|
+
};
|
|
84
|
+
/** Step the body window by `rows`; returns false at the matching end. */
|
|
85
|
+
const stepBody = (rows) => {
|
|
86
|
+
const maxOffset = maxOffsetNow();
|
|
87
|
+
const next = Math.max(0, Math.min(maxOffset, offsetRef.current + rows));
|
|
88
|
+
if (next === offsetRef.current)
|
|
89
|
+
return false;
|
|
90
|
+
offsetRef.current = next;
|
|
91
|
+
followTail.current = item.streaming && next >= maxOffset;
|
|
92
|
+
setRequestedOffset(next);
|
|
93
|
+
return true;
|
|
94
|
+
};
|
|
95
|
+
const startDragScroll = (rows) => {
|
|
96
|
+
stopDragScroll();
|
|
97
|
+
dragTimer.current = setInterval(() => {
|
|
98
|
+
if (!dragActive.current || !stepBody(rows))
|
|
99
|
+
stopDragScroll();
|
|
100
|
+
}, DRAG_SCROLL_MS);
|
|
101
|
+
};
|
|
102
|
+
const presentation = resolveThinkingPresentation({
|
|
103
|
+
streaming: item.streaming,
|
|
104
|
+
expanded,
|
|
105
|
+
elapsed: thinkingElapsedLabel(item, now),
|
|
106
|
+
content,
|
|
107
|
+
});
|
|
108
|
+
const click = useClickWithoutDrag(onToggle);
|
|
109
|
+
const headingStyle = resolveThinkingHeadingStyle({
|
|
110
|
+
hovered: headingHovered,
|
|
111
|
+
accent: theme.thinking,
|
|
112
|
+
hover: theme.white,
|
|
113
|
+
});
|
|
114
|
+
const headingAttributes = headingStyle.underline
|
|
115
|
+
? TextAttributes.BOLD | TextAttributes.UNDERLINE
|
|
116
|
+
: TextAttributes.BOLD;
|
|
117
|
+
const onBodyScroll = (event) => {
|
|
118
|
+
if (!event.scroll)
|
|
119
|
+
return;
|
|
120
|
+
const rows = Math.max(1, Math.min(THINKING_BODY_MAX_ROWS, lines.length));
|
|
121
|
+
const maxOffset = Math.max(0, lines.length - rows);
|
|
122
|
+
// Only a focused card with hidden rows owns the wheel; then it keeps it at
|
|
123
|
+
// both extremes. Unfocused or fully visible cards let the transcript
|
|
124
|
+
// scroll, so the wheel never feels trapped.
|
|
125
|
+
if (!focused || maxOffset === 0)
|
|
126
|
+
return;
|
|
127
|
+
event.stopPropagation();
|
|
128
|
+
const base = item.streaming && followTail.current ? maxOffset : offsetRef.current;
|
|
129
|
+
const delta = event.scroll.direction === "up" ? -WHEEL_ROWS : WHEEL_ROWS;
|
|
130
|
+
const next = Math.max(0, Math.min(maxOffset, base + delta));
|
|
131
|
+
if (next === base)
|
|
132
|
+
return;
|
|
133
|
+
offsetRef.current = next;
|
|
134
|
+
followTail.current = item.streaming && next >= maxOffset;
|
|
135
|
+
setRequestedOffset(next);
|
|
136
|
+
};
|
|
137
|
+
const isCardTitleEvent = (event) => {
|
|
138
|
+
const card = cardRef.current;
|
|
139
|
+
const title = presentation.borderTitle;
|
|
140
|
+
if (!card || !title || event.y !== card.screenY)
|
|
141
|
+
return false;
|
|
142
|
+
const start = card.screenX + 1;
|
|
143
|
+
const end = Math.min(card.screenX + card.width - 1, start + renderColumns(title));
|
|
144
|
+
return event.x >= start && event.x < end;
|
|
145
|
+
};
|
|
146
|
+
const onCardTitleMouseDown = (event) => {
|
|
147
|
+
if (isCardTitleEvent(event)) {
|
|
148
|
+
click.onMouseDown(event);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Body press: take focus and let OpenTUI's native text selection own the
|
|
152
|
+
// drag. preventDefault keeps the transcript's semantic selection from
|
|
153
|
+
// hijacking a gesture that starts inside this card.
|
|
154
|
+
if (event.button === 0) {
|
|
155
|
+
if (!focused)
|
|
156
|
+
onFocus?.();
|
|
157
|
+
dragActive.current = true;
|
|
158
|
+
event.preventDefault();
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
const onCardTitleMouseUp = (event) => {
|
|
162
|
+
endBodyDrag();
|
|
163
|
+
if (isCardTitleEvent(event))
|
|
164
|
+
click.onMouseUp(event);
|
|
165
|
+
};
|
|
166
|
+
const onCardTitleMouseMove = (event) => {
|
|
167
|
+
// Plain movement means no button is held, so any earlier drag is over even
|
|
168
|
+
// if its release landed outside this card and never reached us.
|
|
169
|
+
if (dragActive.current) {
|
|
170
|
+
dragActive.current = false;
|
|
171
|
+
stopDragScroll();
|
|
172
|
+
}
|
|
173
|
+
const hovered = isCardTitleEvent(event);
|
|
174
|
+
if (hovered !== headingHovered)
|
|
175
|
+
setHeadingHovered(hovered);
|
|
176
|
+
};
|
|
177
|
+
const isInsideCard = (event) => {
|
|
178
|
+
const card = cardRef.current;
|
|
179
|
+
if (!card)
|
|
180
|
+
return false;
|
|
181
|
+
return (event.x >= card.screenX &&
|
|
182
|
+
event.x < card.screenX + card.width &&
|
|
183
|
+
event.y >= card.screenY &&
|
|
184
|
+
event.y < card.screenY + card.height);
|
|
185
|
+
};
|
|
186
|
+
// Leaving the card releases the wheel, so the pointer never stays trapped.
|
|
187
|
+
// Geometry-checked because OpenTUI also emits `out` when the pointer crosses
|
|
188
|
+
// between the card's own child rows.
|
|
189
|
+
const onCardMouseOut = (event) => {
|
|
190
|
+
setHeadingHovered(false);
|
|
191
|
+
if (dragActive.current)
|
|
192
|
+
return;
|
|
193
|
+
if (focused && !isInsideCard(event))
|
|
194
|
+
onBlur?.();
|
|
195
|
+
};
|
|
196
|
+
const endBodyDrag = () => {
|
|
197
|
+
dragActive.current = false;
|
|
198
|
+
stopDragScroll();
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Drag-select at a body edge pages the window so the selection keeps
|
|
202
|
+
* travelling through hidden reasoning. Once the window hits that end the
|
|
203
|
+
* gesture is released, so the drag continues into the transcript.
|
|
204
|
+
*/
|
|
205
|
+
const onBodyDrag = (event) => {
|
|
206
|
+
if (!dragActive.current)
|
|
207
|
+
return;
|
|
208
|
+
const card = cardRef.current;
|
|
209
|
+
if (!card)
|
|
210
|
+
return;
|
|
211
|
+
const firstBodyRow = card.screenY + 1;
|
|
212
|
+
const lastBodyRow = card.screenY + card.height - 2;
|
|
213
|
+
const maxOffset = maxOffsetNow();
|
|
214
|
+
const up = event.y <= firstBodyRow;
|
|
215
|
+
const down = event.y >= lastBodyRow;
|
|
216
|
+
const canScrollUp = up && offsetRef.current > 0;
|
|
217
|
+
const canScrollDown = down && offsetRef.current < maxOffset;
|
|
218
|
+
if (!canScrollUp && !canScrollDown) {
|
|
219
|
+
stopDragScroll();
|
|
220
|
+
// At an end (or mid-body): let the transcript own the gesture so the
|
|
221
|
+
// selection can leave this card.
|
|
222
|
+
if (up || down)
|
|
223
|
+
endBodyDrag();
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
event.stopPropagation();
|
|
227
|
+
const rows = canScrollUp ? -DRAG_SCROLL_ROWS : DRAG_SCROLL_ROWS;
|
|
228
|
+
stepBody(rows);
|
|
229
|
+
startDragScroll(rows);
|
|
31
230
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
return (
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
231
|
+
if (presentation.layout === "line") {
|
|
232
|
+
return (_jsx("box", { id: item.id, style: {
|
|
233
|
+
flexDirection: "row",
|
|
234
|
+
width: "100%",
|
|
235
|
+
height: 1,
|
|
236
|
+
marginBottom: 1,
|
|
237
|
+
}, onMouseDown: click.onMouseDown, onMouseUp: click.onMouseUp, onMouseOver: () => setHeadingHovered(true), onMouseOut: () => setHeadingHovered(false), children: _jsx("text", { content: presentation.heading, selectable: true, wrapMode: "none", style: {
|
|
238
|
+
width: "100%",
|
|
239
|
+
height: 1,
|
|
240
|
+
fg: headingStyle.fg,
|
|
241
|
+
attributes: headingAttributes,
|
|
242
|
+
} }) }));
|
|
243
|
+
}
|
|
244
|
+
const bodyRows = visibleRows.length > 0 ? visibleRows : ["Waiting for reasoning…"];
|
|
245
|
+
const scrollHint = resolveThinkingFooter({
|
|
246
|
+
focused,
|
|
247
|
+
hiddenAbove: viewport.hiddenAbove,
|
|
248
|
+
hiddenBelow: viewport.hiddenBelow,
|
|
249
|
+
});
|
|
250
|
+
return (_jsx("box", { ref: cardRef, id: item.id, border: true, borderStyle: "rounded", title: presentation.borderTitle, titleAlignment: "left", titleColor: focused ? headingStyle.fg : theme.muted, ...(scrollHint
|
|
251
|
+
? { bottomTitle: scrollHint, bottomTitleAlignment: "right" }
|
|
252
|
+
: {}), onMouseDown: onCardTitleMouseDown, onMouseUp: onCardTitleMouseUp, onMouseMove: onCardTitleMouseMove, onMouseDrag: onBodyDrag, onMouseDragEnd: endBodyDrag, onMouseOut: onCardMouseOut, onMouseScroll: onBodyScroll, style: {
|
|
253
|
+
flexDirection: "column",
|
|
254
|
+
width: "100%",
|
|
255
|
+
height: bodyRows.length + 2,
|
|
256
|
+
marginBottom: 1,
|
|
257
|
+
borderColor: focused ? theme.thinking : theme.muted,
|
|
258
|
+
backgroundColor: theme.thinkingBg,
|
|
259
|
+
paddingLeft: 1,
|
|
260
|
+
paddingRight: 1,
|
|
261
|
+
paddingTop: 0,
|
|
262
|
+
paddingBottom: 0,
|
|
263
|
+
overflow: "hidden",
|
|
264
|
+
}, children: bodyRows.map((row, index) => (_jsx("text", { content: row, selectable: true, wrapMode: "none", style: {
|
|
265
|
+
width: bodyWidth,
|
|
266
|
+
height: 1,
|
|
267
|
+
flexShrink: 0,
|
|
268
|
+
fg: focused ? theme.thinking : theme.thinkingDim,
|
|
269
|
+
bg: theme.thinkingBg,
|
|
270
|
+
attributes: TextAttributes.ITALIC,
|
|
271
|
+
} }, index))) }));
|
|
68
272
|
}
|
|
69
273
|
//# sourceMappingURL=thinking-block.js.map
|