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
84 lines
2.7 KiB
TypeScript
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;
|
|
}
|