feat: expand live chat and work server tools

This commit is contained in:
2026-04-30 11:40:02 +09:00
parent 42ae640470
commit 2df0ba30cb
112 changed files with 15241 additions and 996 deletions

View File

@@ -0,0 +1,65 @@
const CHAT_EXTERNAL_LINK_OPENED_AT_KEY = 'ai-code-app.chat.external-link-opened-at';
const CHAT_EXTERNAL_LINK_TTL_MS = 15_000;
type LinkNavigationEvent = {
preventDefault?: () => void;
stopPropagation?: () => void;
};
function canUseSessionStorage() {
return typeof window !== 'undefined' && typeof window.sessionStorage !== 'undefined';
}
function persistExternalLinkOpenTimestamp(openedAt: number) {
if (!canUseSessionStorage()) {
return;
}
window.sessionStorage.setItem(CHAT_EXTERNAL_LINK_OPENED_AT_KEY, String(openedAt));
}
function clearExternalLinkOpenTimestamp() {
if (!canUseSessionStorage()) {
return;
}
window.sessionStorage.removeItem(CHAT_EXTERNAL_LINK_OPENED_AT_KEY);
}
export function shouldSkipForegroundResyncAfterExternalLink() {
if (!canUseSessionStorage()) {
return false;
}
const rawOpenedAt = window.sessionStorage.getItem(CHAT_EXTERNAL_LINK_OPENED_AT_KEY);
clearExternalLinkOpenTimestamp();
if (!rawOpenedAt) {
return false;
}
const openedAt = Number(rawOpenedAt);
return Number.isFinite(openedAt) && Date.now() - openedAt <= CHAT_EXTERNAL_LINK_TTL_MS;
}
export function openChatExternalLink(url: string, event?: LinkNavigationEvent) {
event?.preventDefault?.();
event?.stopPropagation?.();
if (typeof window === 'undefined') {
return;
}
persistExternalLinkOpenTimestamp(Date.now());
const openedWindow = window.open(url, '_blank', 'noopener,noreferrer');
if (openedWindow) {
return;
}
const anchor = document.createElement('a');
anchor.href = url;
anchor.target = '_blank';
anchor.rel = 'noopener noreferrer';
anchor.click();
}