Files
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

80 lines
2.6 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 {
classifyAgentRichTextTextPaste,
insertAgentRichTextClipboardHtml
} from "./agentRichTextEditorSupport";
import { handleAgentRichTextAbsolutePathPaste } from "./handleAgentRichTextAbsolutePathPaste";
type MentionSuggestionSuppression = {
suppressTextInsertion: (text: string) => void;
};
export function routeAgentRichTextTextPaste(input: {
availableCapabilities: readonly AgentCapabilityTokenOption[];
availableSkills: readonly AgentGUIProviderSkillOption[];
editorRef: { current: Editor | null };
html: string;
mentionSuggestionSuppression: MentionSuggestionSuppression;
onPasteLargeText?: ((text: string) => void) | null;
resolvePastedPath?:
| ((text: string) => Promise<WorkspaceFileReference | null>)
| null;
text: string;
}): boolean {
const textPasteKind = classifyAgentRichTextTextPaste(
input.text,
input.html,
Boolean(input.onPasteLargeText)
);
if (textPasteKind === "empty") {
return false;
}
if (textPasteKind === "large-text") {
input.onPasteLargeText?.(input.text);
return true;
}
if (textPasteKind === "structured-mention") {
const currentEditor = input.editorRef.current;
if (!currentEditor) {
return true;
}
if (insertAgentRichTextClipboardHtml(currentEditor, input.html)) {
input.mentionSuggestionSuppression.suppressTextInsertion(input.text);
}
return true;
}
if (
handleAgentRichTextAbsolutePathPaste({
availableCapabilities: input.availableCapabilities,
availableSkills: input.availableSkills,
editorRef: input.editorRef,
mentionSuggestionSuppression: input.mentionSuggestionSuppression,
resolvePastedPath: input.resolvePastedPath,
text: input.text
})
) {
return true;
}
const currentEditor = input.editorRef.current;
if (!currentEditor) {
return true;
}
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
})
);
return true;
}