Files
tutti/packages/agent/gui/agent-gui/agentGuiNode/agentRichText/handleAgentRichTextAbsolutePathPaste.ts
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

84 lines
2.7 KiB
TypeScript

import type { Editor } from "@tiptap/core";
import type { WorkspaceFileReference } from "@tutti-os/workspace-file-reference/contracts";
import type { AgentGUIProviderSkillOption } from "../model/agentGuiNodeTypes";
import type { AgentCapabilityTokenOption } from "./agentCapabilityTokenExtension";
import { plainTextToAgentRichTextInlineContent } from "./agentRichTextDocument";
import {
isAgentRichTextAbsolutePathPasteCandidate,
isPromptVisualLineStart
} from "./agentRichTextEditorSupport";
import { createAgentFileMentionContent } from "./agentWorkspaceFileReferences";
type MentionSuggestionSuppression = {
suppressTextInsertion: (text: string) => void;
};
export function handleAgentRichTextAbsolutePathPaste(input: {
availableCapabilities: readonly AgentCapabilityTokenOption[];
availableSkills: readonly AgentGUIProviderSkillOption[];
editorRef: { current: Editor | null };
mentionSuggestionSuppression: MentionSuggestionSuppression;
resolvePastedPath?:
| ((text: string) => Promise<WorkspaceFileReference | null>)
| null;
text: string;
}): boolean {
const pathCandidate = input.text.trim();
const resolvePastedPath = input.resolvePastedPath;
if (
!resolvePastedPath ||
!isAgentRichTextAbsolutePathPasteCandidate(pathCandidate)
) {
return false;
}
const insertPlainPasteText = (): void => {
const currentEditor = input.editorRef.current;
if (!currentEditor || currentEditor.isDestroyed) {
return;
}
if (!currentEditor.isFocused) {
currentEditor.commands.setTextSelection(
currentEditor.state.doc.content.size
);
}
input.mentionSuggestionSuppression.suppressTextInsertion(input.text);
currentEditor.commands.insertContent(
plainTextToAgentRichTextInlineContent(input.text, {
capabilities: input.availableCapabilities,
skills: input.availableSkills
})
);
};
void resolvePastedPath(pathCandidate)
.then((reference) => {
const currentEditor = input.editorRef.current;
if (!currentEditor || currentEditor.isDestroyed) {
return;
}
if (!reference) {
insertPlainPasteText();
return;
}
if (!currentEditor.isFocused) {
currentEditor.commands.setTextSelection(
currentEditor.state.doc.content.size
);
}
input.mentionSuggestionSuppression.suppressTextInsertion(pathCandidate);
currentEditor.commands.insertContent(
createAgentFileMentionContent([reference], {
prefixCaretAnchor: isPromptVisualLineStart(
currentEditor,
currentEditor.state.selection.from
)
})
);
})
.catch(() => {
insertPlainPasteText();
});
return true;
}