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
67 lines
1.7 KiB
TypeScript
67 lines
1.7 KiB
TypeScript
import { createRichTextMentionMarkdown } from "@tutti-os/ui-rich-text/core";
|
|
|
|
export const browserElementMentionKind = "browser-element";
|
|
|
|
export interface BrowserElementMentionReference {
|
|
context: string;
|
|
id: string;
|
|
tagName: string;
|
|
workspaceId: string;
|
|
}
|
|
|
|
export interface BrowserElementMentionIdentity {
|
|
label: string;
|
|
scope?: Readonly<Record<string, string>>;
|
|
}
|
|
|
|
export interface BrowserElementMentionPresentation {
|
|
name: string;
|
|
workspaceId?: string;
|
|
}
|
|
|
|
export function createBrowserElementMentionMarkdown(
|
|
reference: BrowserElementMentionReference
|
|
): string {
|
|
const tagName = normalizeBrowserElementTagName(reference.tagName);
|
|
const context = reference.context.trim();
|
|
const workspaceId = reference.workspaceId.trim();
|
|
if (!tagName || !context || !workspaceId) {
|
|
return "";
|
|
}
|
|
return createRichTextMentionMarkdown({
|
|
providerId: browserElementMentionKind,
|
|
entityId: reference.id,
|
|
label: tagName,
|
|
scope: { context, tag: tagName, workspaceId }
|
|
});
|
|
}
|
|
|
|
export function browserElementMentionLabel(tagName: string): string {
|
|
const normalized = normalizeBrowserElementTagName(tagName);
|
|
return normalized ? `<${normalized}>` : "";
|
|
}
|
|
|
|
export function presentBrowserElementMention(
|
|
mention: BrowserElementMentionIdentity
|
|
): BrowserElementMentionPresentation | null {
|
|
const label = browserElementMentionLabel(
|
|
mention.scope?.tag?.trim() || mention.label
|
|
);
|
|
if (!label) {
|
|
return null;
|
|
}
|
|
const workspaceId = mention.scope?.workspaceId?.trim() ?? "";
|
|
return {
|
|
name: label,
|
|
...(workspaceId ? { workspaceId } : {})
|
|
};
|
|
}
|
|
|
|
function normalizeBrowserElementTagName(value: string): string {
|
|
return value
|
|
.trim()
|
|
.toLowerCase()
|
|
.replace(/[^a-z0-9:-]/gu, "")
|
|
.slice(0, 100);
|
|
}
|