Phase 8: TypeScript migration, i18n rewrite, Activity Tree, Projects API, Heartbeats
This commit is contained in:
389
static/global.d.ts
vendored
Normal file
389
static/global.d.ts
vendored
Normal file
@@ -0,0 +1,389 @@
|
||||
// Global type extensions for Hermes WebUI
|
||||
// Patches for loosely-typed legacy JavaScript code
|
||||
|
||||
interface WsEntry {
|
||||
name: string;
|
||||
path: string;
|
||||
type: 'file' | 'dir' | string;
|
||||
size?: number;
|
||||
modified?: number;
|
||||
}
|
||||
|
||||
interface State {
|
||||
session: any;
|
||||
messages: any[];
|
||||
entries: any[];
|
||||
busy: boolean;
|
||||
pendingFiles: any[];
|
||||
toolCalls: any[];
|
||||
activeStreamId: any;
|
||||
currentDir: string;
|
||||
activeProfile: string;
|
||||
_expandedDirs?: Set<string>;
|
||||
_dirCache?: Record<string, WsEntry[]>;
|
||||
_profileDefaultWorkspace?: string;
|
||||
lastUsage?: Record<string, unknown>;
|
||||
activityTree?: ActivityTree | null;
|
||||
mcFilter?: MCFilter;
|
||||
mcSort?: 'runtime' | 'agent' | 'status';
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
declare const t: any;
|
||||
|
||||
interface HTMLInputElement {
|
||||
value: string;
|
||||
disabled: boolean;
|
||||
files: FileList | null;
|
||||
checked?: boolean;
|
||||
}
|
||||
|
||||
interface HTMLTextAreaElement {
|
||||
value: string;
|
||||
}
|
||||
|
||||
interface HTMLSelectElement {
|
||||
value: string;
|
||||
options: HTMLOptionsCollection;
|
||||
selectedIndex: number;
|
||||
readonly children: HTMLCollectionOf<HTMLOptGroupElement | HTMLOptionElement>;
|
||||
readonly childElementCount: number;
|
||||
item(index: number): HTMLOptGroupElement | HTMLOptionElement | null;
|
||||
namedItem(name: string): HTMLOptionElement | null;
|
||||
}
|
||||
|
||||
interface HTMLOptionElement {
|
||||
value: string;
|
||||
text: string;
|
||||
disabled: boolean;
|
||||
defaultSelected: boolean;
|
||||
selected: boolean;
|
||||
index: number;
|
||||
form: HTMLFormElement | null;
|
||||
}
|
||||
|
||||
interface HTMLOptGroupElement {
|
||||
disabled: boolean;
|
||||
label: string;
|
||||
readonly children: HTMLCollectionOf<HTMLOptionElement>;
|
||||
}
|
||||
|
||||
interface HTMLElement {
|
||||
disabled?: boolean;
|
||||
value?: string;
|
||||
files?: FileList | null;
|
||||
checked?: boolean;
|
||||
placeholder?: string;
|
||||
innerHTML?: string;
|
||||
innerText?: string;
|
||||
textContent?: string;
|
||||
title?: string;
|
||||
style?: CSSStyleDeclaration & { [key: string]: string } & { cssText?: string };
|
||||
className?: string;
|
||||
id?: string;
|
||||
dataset?: DOMStringMap;
|
||||
offsetWidth?: number;
|
||||
offsetHeight?: number;
|
||||
offsetLeft?: number;
|
||||
offsetTop?: number;
|
||||
scrollIntoView?: (options?: any) => void;
|
||||
getBoundingClientRect?: () => DOMRect;
|
||||
contains?: (node: Node) => boolean;
|
||||
closest?: (selectors: string) => HTMLElement | null;
|
||||
classList?: DOMTokenList & { add(...classes: string[]): void; remove(...classes: string[]): void; toggle(c: string, force?: boolean): boolean; contains(c: string): boolean; };
|
||||
setAttribute(name: string, value: string): void;
|
||||
getAttribute(name: string): string | null;
|
||||
removeAttribute(name: string): void;
|
||||
addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
|
||||
removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
|
||||
dispatchEvent(event: Event): boolean;
|
||||
appendChild(node: Node | Element | HTMLElement | HTMLButtonElement | HTMLDivElement | HTMLSpanElement | HTMLInputElement | HTMLOptGroupElement): Node;
|
||||
removeChild(node: Node | Element | HTMLElement | HTMLButtonElement | HTMLDivElement | HTMLSpanElement | HTMLInputElement | HTMLOptGroupElement): Node;
|
||||
replaceWith(...nodes: (Node | string)[]): void;
|
||||
insertAdjacentHTML(position: 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend', html: string): void;
|
||||
insertAdjacentElement(position: 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend', element: HTMLElement): HTMLElement | null;
|
||||
click(): void;
|
||||
focus(): void;
|
||||
blur(): void;
|
||||
scrollTo(x: number, y: number): void;
|
||||
requestFullscreen?: () => Promise<void>;
|
||||
matches?(selector: string): boolean;
|
||||
replaceWith(...nodes: any[]): void;
|
||||
_t?: ReturnType<typeof setTimeout>;
|
||||
after(...nodes: (Node | string)[]): void;
|
||||
}
|
||||
|
||||
interface Window {
|
||||
webkitSpeechRecognition: any;
|
||||
SpeechRecognition: any;
|
||||
_stopMic: () => void;
|
||||
_micActive: boolean;
|
||||
_micPendingSend: boolean;
|
||||
_sendKey: string;
|
||||
_showTokenUsage: boolean;
|
||||
_showCliSessions: boolean;
|
||||
_soundEnabled: boolean;
|
||||
_notificationsEnabled: boolean;
|
||||
_botName: string;
|
||||
_previewCurrentPath: string;
|
||||
_previewCurrentMode: string;
|
||||
_previewDirty: boolean;
|
||||
_initResizePanels: () => void;
|
||||
showSaveFilePicker?: (options?: any) => Promise<any>;
|
||||
showOpenFilePicker?: (options?: any) => Promise<any>;
|
||||
_activeProvider: string | null;
|
||||
t: any;
|
||||
_userEmoji: string;
|
||||
_userName: string;
|
||||
_updateData: any;
|
||||
_escHandler: any;
|
||||
_saveExpandedDirs: any;
|
||||
_mcPriorityFilter: any;
|
||||
cancelEditMode: () => void;
|
||||
cancelEdit: () => void;
|
||||
closeAgentDetail: () => void;
|
||||
switchToChatPanel: () => void;
|
||||
stopGatewaySSE: () => void;
|
||||
updateWorkspaceChip: () => void;
|
||||
_showAllProfiles: () => void;
|
||||
showPreview: (type: string) => void;
|
||||
cancelEditMode: () => void;
|
||||
_previewDirty: boolean;
|
||||
}
|
||||
|
||||
declare var Prism: any;
|
||||
declare var mermaid: any;
|
||||
declare var katex: any;
|
||||
|
||||
declare function li(name: string, size?: number): string;
|
||||
declare function openFile(path: string, line?: number): void;
|
||||
|
||||
interface Session {
|
||||
session_id: string;
|
||||
messages?: Message[];
|
||||
workspace?: string;
|
||||
input_tokens?: number;
|
||||
output_tokens?: number;
|
||||
estimated_cost?: number;
|
||||
last_usage?: Record<string, unknown>;
|
||||
tool_calls?: any[];
|
||||
active_stream_id?: string;
|
||||
pending_attachments?: unknown[];
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
interface Message {
|
||||
id?: string;
|
||||
role: string;
|
||||
content?: string | any[];
|
||||
tool_calls?: any[];
|
||||
name?: string;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
declare const IMAGE_EXTS: Set<string>;
|
||||
declare const MD_EXTS: Set<string>;
|
||||
declare const DOWNLOAD_EXTS: Set<string>;
|
||||
|
||||
interface Document {
|
||||
exitFullscreen?: () => Promise<void>;
|
||||
fullscreenElement?: Element;
|
||||
pictureInPictureElement?: Element;
|
||||
documentMode?: any;
|
||||
}
|
||||
|
||||
interface Element {
|
||||
scrollIntoViewIfNeeded?: (centerIfNeeded?: boolean) => void;
|
||||
onclick?: (ev: MouseEvent) => any;
|
||||
oninput?: (ev: InputEvent) => any;
|
||||
onkeydown?: (ev: KeyboardEvent) => any;
|
||||
onkeyup?: (ev: KeyboardEvent) => any;
|
||||
onchange?: (ev: Event) => any;
|
||||
style?: CSSStyleDeclaration & { [key: string]: string };
|
||||
closest?: (selectors: string) => HTMLElement | null;
|
||||
dataset?: DOMStringMap;
|
||||
classList?: DOMTokenList & { add(...classes: string[]): void; remove(...classes: string[]): void; toggle(c: string, force?: boolean): boolean; contains(c: string): boolean; };
|
||||
appendChild<T extends Node>(node: T): T;
|
||||
removeChild<T extends Node>(node: T): T;
|
||||
getAttribute(name: string): string | null;
|
||||
setAttribute(name: string, value: string): void;
|
||||
removeAttribute(name: string): void;
|
||||
appendChild(node: Node | Element | HTMLElement | HTMLButtonElement | HTMLDivElement | HTMLSpanElement | HTMLInputElement | HTMLOptGroupElement): Node;
|
||||
removeChild(node: Node | Element | HTMLElement | HTMLButtonElement | HTMLDivElement | HTMLSpanElement | HTMLInputElement | HTMLOptGroupElement): Node;
|
||||
addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: Element, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
|
||||
removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: Element, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
|
||||
contains(node: Node): boolean;
|
||||
replaceWith(...nodes: any[]): void;
|
||||
textContent?: string;
|
||||
innerHTML?: string;
|
||||
}
|
||||
|
||||
declare function escape(html: string): string;
|
||||
declare function highlightCode(container?: any): void;
|
||||
declare function showToast(msg: string, ms?: number): void;
|
||||
declare function setStatus(msg: string): void;
|
||||
declare function setComposerStatus(msg: string): void;
|
||||
declare function loadWorkspaceList(): Promise<any>;
|
||||
declare function syncOnboardingProvider(value: string): void;
|
||||
declare function syncOnboardingWorkspaceSelect(value: string): void;
|
||||
declare function fileIcon(name: string, type: string): string;
|
||||
declare function loadOnboardingWizard(): Promise<boolean>;
|
||||
declare function nextOnboardingStep(): Promise<void>;
|
||||
declare function prevOnboardingStep(): void;
|
||||
declare function skipOnboarding(): Promise<void>;
|
||||
declare function renderSessionList(): Promise<void>;
|
||||
declare function newSession(flash?: boolean, agentOverride?: string): Promise<void>;
|
||||
declare function updateQueueBadge(sid?: string): void;
|
||||
declare function stopApprovalPolling(): void;
|
||||
declare function hideApprovalCard(): void;
|
||||
declare function updateSendBtn(): void;
|
||||
declare function syncTopbar(): void;
|
||||
declare function renderMessages(): void;
|
||||
declare function loadDir(path: string): Promise<void>;
|
||||
declare function loadSession(sid: string): Promise<void>;
|
||||
declare function executeCommand(text: string): boolean;
|
||||
declare function isCompressionUiRunning(): boolean;
|
||||
declare const _allSessions: any[];
|
||||
declare function renderSessionListFromCache(): void;
|
||||
declare const _assistantTurnBlocks: any;
|
||||
declare function placeLiveToolCardsHost(): void;
|
||||
declare function finalizeThinkingCard(): void;
|
||||
|
||||
declare const _: any;
|
||||
declare const jQuery: any;
|
||||
declare const LOCALES: any;
|
||||
|
||||
interface ConfigData {
|
||||
default_model?: string;
|
||||
send_key?: string;
|
||||
theme?: string;
|
||||
language?: string;
|
||||
show_token_usage?: boolean;
|
||||
show_cli_sessions?: boolean;
|
||||
sync_to_insights?: boolean;
|
||||
check_for_updates?: boolean;
|
||||
sound_enabled?: boolean;
|
||||
notifications_enabled?: boolean;
|
||||
bubble_layout?: string;
|
||||
bot_name?: string;
|
||||
user_emoji?: string;
|
||||
user_name?: string;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
declare function stopGateway(): void;
|
||||
declare function stopGatewaySSE(): void;
|
||||
declare function cancelEdit(): void;
|
||||
declare function watchInflightSession(sid: string, activeStreamId: string): void;
|
||||
declare function showPreview(type: string): void;
|
||||
declare function cancelEditMode(): void;
|
||||
declare function clearPreview(): void;
|
||||
declare function closeAgentDetail(): void;
|
||||
declare function switchToChatPanel(): void;
|
||||
declare function updateWorkspaceChip(): void;
|
||||
declare let _showAllProfiles: boolean;
|
||||
declare let _escHandler: any;
|
||||
declare let _previewDirty: boolean;
|
||||
declare function _saveExpandedDirs(): void;
|
||||
declare function highlightCode(container?: any): void;
|
||||
declare function addCopyButtons(): void;
|
||||
declare function renderMermaidBlocks(): void;
|
||||
declare function renderKatexBlocks(): void;
|
||||
declare function openFile(path: string, line?: number): void;
|
||||
declare const fileExt: any;
|
||||
interface DialogOpts {
|
||||
title?: string;
|
||||
message?: string;
|
||||
inputType?: string;
|
||||
value?: string;
|
||||
placeholder?: string;
|
||||
cancelLabel?: string;
|
||||
confirmLabel?: string;
|
||||
danger?: boolean;
|
||||
focusCancel?: boolean;
|
||||
}
|
||||
declare function showConfirmDialog(opts?: DialogOpts): Promise<boolean>;
|
||||
declare function showPromptDialog(opts?: DialogOpts): Promise<string | null>;
|
||||
|
||||
// Global state variables used across modules
|
||||
declare let assistantText: string;
|
||||
declare let _reasoningText: string;
|
||||
declare let liveReasoningText: string;
|
||||
declare function persistInflightState(sid: string, state: any): void;
|
||||
declare function clearInflightState(sid: string): void;
|
||||
declare function markInflight(sid: string, streamId: string): void;
|
||||
declare function clearInflight(): void;
|
||||
declare function saveInflightState(sid: string, state: any): void;
|
||||
declare function loadInflightState(sid: string, streamId: string): any;
|
||||
declare function startApprovalPolling(sid: string): void;
|
||||
declare function stopApprovalPolling(): void;
|
||||
declare function startClarifyPolling(sid: string): void;
|
||||
declare function stopClarifyPolling(): void;
|
||||
declare function cancelStream(): void;
|
||||
declare function appendLiveToolCard(tc: any): void;
|
||||
declare function buildToolCard(tc: any, live?: boolean): string;
|
||||
declare function finalizeThinkingCard(): void;
|
||||
declare function syncInflightAssistantMessage(): void;
|
||||
declare function setBusy(busy: boolean): void;
|
||||
declare function attachLiveStream(sid: string, streamId: string, uploaded?: any[], opts?: any): void;
|
||||
declare function isCompressionUiRunning(): boolean;
|
||||
|
||||
// ─── Agent Activity Tree (Mission Control) ──────────────────────────
|
||||
interface ActivityToolCall {
|
||||
id: string;
|
||||
name: string;
|
||||
status: 'pending' | 'running' | 'done' | 'error';
|
||||
args: Record<string, any>;
|
||||
result?: string;
|
||||
duration?: number;
|
||||
startedAt: number | null;
|
||||
endedAt: number | null;
|
||||
}
|
||||
|
||||
interface ActivityNode {
|
||||
id: string;
|
||||
parentId: string | null;
|
||||
agentId: string;
|
||||
agentEmoji: string;
|
||||
agentName: string;
|
||||
tier: 1 | 2 | 3;
|
||||
status: 'pending' | 'running' | 'thinking' | 'done' | 'error' | 'cancelled';
|
||||
task: string;
|
||||
toolCalls: ActivityToolCall[];
|
||||
startedAt: number | null;
|
||||
endedAt: number | null;
|
||||
duration: number | null;
|
||||
children: string[];
|
||||
collapsed: boolean;
|
||||
metadata: Record<string, any>;
|
||||
}
|
||||
|
||||
interface MCStats {
|
||||
totalAgents: number;
|
||||
runningAgents: number;
|
||||
pendingAgents: number;
|
||||
doneAgents: number;
|
||||
errorAgents: number;
|
||||
totalTools: number;
|
||||
doneTools: number;
|
||||
runningTools: number;
|
||||
avgResponseTime: number;
|
||||
totalElapsed: number;
|
||||
}
|
||||
|
||||
interface ActivityTree {
|
||||
version: 1;
|
||||
rootId: string;
|
||||
nodes: Record<string, ActivityNode>;
|
||||
stats: MCStats;
|
||||
}
|
||||
|
||||
interface MCFilter {
|
||||
agent?: string;
|
||||
status?: string;
|
||||
search?: string;
|
||||
}
|
||||
|
||||
declare function initActivityTree(): ActivityTree;
|
||||
declare function createMockActivityTree(): ActivityTree;
|
||||
declare function formatElapsed(ms: number): string;
|
||||
Reference in New Issue
Block a user