mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-05-17 17:35:01 +00:00
422 lines
12 KiB
TypeScript
422 lines
12 KiB
TypeScript
import type { IncomingMessage } from 'node:http';
|
|
|
|
//----------------- HTTP RESPONSE SHAPES ------------
|
|
/**
|
|
* Canonical success envelope used by backend APIs that return a structured payload.
|
|
*
|
|
* Use this for route handlers that need a stable `success/data` shape so frontend
|
|
* consumers can parse responses consistently across endpoints.
|
|
*/
|
|
export type ApiSuccessShape<TData = unknown> = {
|
|
success: true;
|
|
data: TData;
|
|
};
|
|
|
|
/**
|
|
* Generic plain-object record used when parsing loosely typed JSON payloads.
|
|
*
|
|
* Use this only after runtime shape checks, not as a replacement for validated
|
|
* domain models.
|
|
*/
|
|
export type AnyRecord = Record<string, any>;
|
|
|
|
// ---------------------------
|
|
//----------------- WEBSOCKET TRANSPORT TYPES ------------
|
|
/**
|
|
* Minimal websocket client contract used by backend broadcaster services.
|
|
*
|
|
* Any transport object added to `connectedClients` must implement these two
|
|
* members so shared services can safely send JSON strings and check whether the
|
|
* socket is still open before broadcasting.
|
|
*/
|
|
export type RealtimeClientConnection = {
|
|
readyState: number;
|
|
send(data: string): void;
|
|
};
|
|
|
|
/**
|
|
* Authenticated user payload attached to websocket upgrade requests.
|
|
*
|
|
* Platform and OSS auth flows currently use either `id` or `userId`; both are
|
|
* represented here so websocket handlers can resolve a stable writer user id.
|
|
*/
|
|
export type AuthenticatedWebSocketUser = {
|
|
id?: string | number;
|
|
userId?: string | number;
|
|
username?: string;
|
|
[key: string]: unknown;
|
|
};
|
|
|
|
/**
|
|
* HTTP upgrade request shape after websocket authentication succeeds.
|
|
*
|
|
* `verifyClient` populates `request.user` with the authenticated payload, and
|
|
* downstream websocket handlers rely on this extended request type.
|
|
*/
|
|
export type AuthenticatedWebSocketRequest = IncomingMessage & {
|
|
user?: AuthenticatedWebSocketUser;
|
|
};
|
|
|
|
// ---------------------------
|
|
//----------------- PROVIDER MESSAGE MODEL ------------
|
|
/**
|
|
* Providers supported by the unified server runtime.
|
|
*
|
|
* Use this as the source of truth whenever a function or payload needs to identify
|
|
* a specific LLM integration.
|
|
*/
|
|
export type LLMProvider = 'claude' | 'codex' | 'gemini' | 'cursor' | 'opencode';
|
|
|
|
/**
|
|
* One selectable model row (matches legacy `shared/modelConstants.js` option shape).
|
|
*/
|
|
export type ProviderModelOption = {
|
|
value: string;
|
|
label: string;
|
|
};
|
|
|
|
/**
|
|
* Provider model catalog returned by `GET /api/providers/:provider/models`.
|
|
*/
|
|
export type ProviderModelsDefinition = {
|
|
OPTIONS: ProviderModelOption[];
|
|
DEFAULT: string;
|
|
};
|
|
|
|
/**
|
|
* Message/event variants emitted by provider adapters and normalized transports.
|
|
*
|
|
* Keep this union in sync with event kinds produced by provider session adapters.
|
|
*/
|
|
export type MessageKind =
|
|
| 'text'
|
|
| 'tool_use'
|
|
| 'tool_result'
|
|
| 'thinking'
|
|
| 'stream_delta'
|
|
| 'stream_end'
|
|
| 'error'
|
|
| 'complete'
|
|
| 'status'
|
|
| 'permission_request'
|
|
| 'permission_cancelled'
|
|
| 'session_created'
|
|
| 'interactive_prompt'
|
|
| 'task_notification';
|
|
|
|
/**
|
|
* Provider-neutral message envelope used in REST responses and realtime channels.
|
|
*
|
|
* Every provider-specific message must be converted into this shape before being
|
|
* emitted outside provider-specific modules.
|
|
*/
|
|
export type NormalizedMessage = {
|
|
id: string;
|
|
sessionId: string;
|
|
timestamp: string;
|
|
provider: LLMProvider;
|
|
kind: MessageKind;
|
|
role?: 'user' | 'assistant';
|
|
content?: string;
|
|
/**
|
|
* Optional display-oriented metadata used by providers that need to expose
|
|
* richer transcript artifacts without introducing a brand-new message kind.
|
|
*
|
|
* Current Claude usage:
|
|
* - local slash commands expose parsed command fields
|
|
* - compact summaries are flagged so the UI can treat them differently later
|
|
*/
|
|
displayText?: string;
|
|
commandName?: string;
|
|
commandMessage?: string;
|
|
commandArgs?: string;
|
|
isLocalCommand?: boolean;
|
|
isLocalCommandStdout?: boolean;
|
|
isCompactSummary?: boolean;
|
|
images?: unknown;
|
|
toolName?: string;
|
|
toolInput?: unknown;
|
|
toolId?: string;
|
|
toolResult?: {
|
|
content?: string;
|
|
isError?: boolean;
|
|
toolUseResult?: unknown;
|
|
};
|
|
isError?: boolean;
|
|
text?: string;
|
|
tokens?: number;
|
|
canInterrupt?: boolean;
|
|
requestId?: string;
|
|
input?: unknown;
|
|
context?: unknown;
|
|
reason?: string;
|
|
newSessionId?: string;
|
|
status?: string;
|
|
summary?: string;
|
|
tokenBudget?: unknown;
|
|
subagentTools?: unknown;
|
|
toolUseResult?: unknown;
|
|
sequence?: number;
|
|
rowid?: number;
|
|
[key: string]: unknown;
|
|
};
|
|
|
|
/**
|
|
* Shared options used to fetch historical provider messages.
|
|
*
|
|
* Consumers should pass provider-specific lookup hints (`projectPath`) only
|
|
* when the selected provider requires them.
|
|
*/
|
|
export type FetchHistoryOptions = {
|
|
projectPath?: string;
|
|
limit?: number | null;
|
|
offset?: number;
|
|
};
|
|
|
|
/**
|
|
* Standardized response payload returned from provider history readers.
|
|
*
|
|
* Use this as the contract for APIs that return paginated conversation history.
|
|
*/
|
|
export type FetchHistoryResult = {
|
|
messages: NormalizedMessage[];
|
|
total: number;
|
|
hasMore: boolean;
|
|
offset: number;
|
|
limit: number | null;
|
|
tokenUsage?: unknown;
|
|
};
|
|
|
|
// ---------------------------
|
|
//----------------- PROVIDER SKILL TYPES ------------
|
|
/**
|
|
* Scope where a provider skill definition was discovered.
|
|
*
|
|
* Provider skill adapters should use this to describe the origin of each
|
|
* skill markdown file without leaking provider-specific folder names into route
|
|
* contracts. `repo` is used for Codex repository lookup locations, while
|
|
* `project` is used for providers that treat workspace-local skills as project
|
|
* scoped.
|
|
*/
|
|
export type ProviderSkillScope = 'user' | 'project' | 'plugin' | 'repo' | 'admin' | 'system';
|
|
|
|
/**
|
|
* Shared input accepted by provider skill listing operations.
|
|
*
|
|
* Routes pass `workspacePath` when a caller wants project/repository skills for
|
|
* a specific folder. Providers should fall back to the backend process cwd when
|
|
* this option is omitted.
|
|
*/
|
|
export type ProviderSkillListOptions = {
|
|
workspacePath?: string;
|
|
};
|
|
|
|
/**
|
|
* Normalized skill record returned by provider skill adapters.
|
|
*
|
|
* The `command` value is the exact invocation text the selected provider expects
|
|
* for this skill. Claude plugin skills use a namespaced command such as
|
|
* `/plugin-name:skill-name`, while Codex skills use the `$skill-name` form.
|
|
* `sourcePath` points to the skill markdown file that produced the record so
|
|
* callers can distinguish duplicate skill names across scopes.
|
|
*/
|
|
export type ProviderSkill = {
|
|
provider: LLMProvider;
|
|
name: string;
|
|
description: string;
|
|
command: string;
|
|
scope: ProviderSkillScope;
|
|
sourcePath: string;
|
|
pluginName?: string;
|
|
pluginId?: string;
|
|
};
|
|
|
|
/**
|
|
* Internal source descriptor consumed by shared provider skill discovery logic.
|
|
*
|
|
* Concrete provider adapters build these records from their native lookup rules.
|
|
* The shared skills provider then scans `rootDir` for child skill markdown files
|
|
* and uses `commandForSkill` or `commandPrefix` to produce the provider-specific
|
|
* invocation command. Set `recursive` only when a provider stores skills under
|
|
* arbitrary nested folders below the source root.
|
|
*/
|
|
export type ProviderSkillSource = {
|
|
scope: ProviderSkillScope;
|
|
rootDir: string;
|
|
recursive?: boolean;
|
|
commandPrefix?: '/' | '$';
|
|
commandForSkill?: (skillName: string) => string;
|
|
pluginName?: string;
|
|
pluginId?: string;
|
|
};
|
|
|
|
// ---------------------------
|
|
//----------------- SHARED ERROR TYPES ------------
|
|
/**
|
|
* Optional metadata used when constructing application-level errors.
|
|
*
|
|
* `statusCode` should reflect the HTTP response status, while `code` identifies
|
|
* the stable machine-readable error category.
|
|
*/
|
|
export type AppErrorOptions = {
|
|
code?: string;
|
|
statusCode?: number;
|
|
details?: unknown;
|
|
};
|
|
|
|
// ---------------------------
|
|
//----------------- MCP TYPES ------------
|
|
/**
|
|
* Scope where an MCP server definition is stored and resolved.
|
|
*
|
|
* `user` is global for a user account, `local` is provider-local, and `project`
|
|
* is tied to a specific project path.
|
|
*/
|
|
export type McpScope = 'user' | 'local' | 'project';
|
|
|
|
/**
|
|
* Transport protocol used by an MCP server definition.
|
|
*/
|
|
export type McpTransport = 'stdio' | 'http' | 'sse';
|
|
|
|
/**
|
|
* Normalized MCP server model exposed to frontend and route handlers.
|
|
*
|
|
* Provider adapters should map provider-native config to this structure before
|
|
* returning results.
|
|
*/
|
|
export type ProviderMcpServer = {
|
|
provider: LLMProvider;
|
|
name: string;
|
|
scope: McpScope;
|
|
transport: McpTransport;
|
|
command?: string;
|
|
args?: string[];
|
|
env?: Record<string, string>;
|
|
cwd?: string;
|
|
url?: string;
|
|
headers?: Record<string, string>;
|
|
envVars?: string[];
|
|
bearerTokenEnvVar?: string;
|
|
envHttpHeaders?: Record<string, string>;
|
|
};
|
|
|
|
/**
|
|
* Payload for create/update MCP server operations.
|
|
*
|
|
* Routes and services should accept this type, validate it, and then persist it
|
|
* through provider-specific MCP repositories.
|
|
*/
|
|
export type UpsertProviderMcpServerInput = {
|
|
name: string;
|
|
scope?: McpScope;
|
|
transport: McpTransport;
|
|
workspacePath?: string;
|
|
command?: string;
|
|
args?: string[];
|
|
env?: Record<string, string>;
|
|
cwd?: string;
|
|
url?: string;
|
|
headers?: Record<string, string>;
|
|
envVars?: string[];
|
|
bearerTokenEnvVar?: string;
|
|
envHttpHeaders?: Record<string, string>;
|
|
};
|
|
|
|
// ---------------------------
|
|
//----------------- PROVIDER AUTH TYPES ------------
|
|
/**
|
|
* Authentication status result returned by provider health checks.
|
|
*
|
|
* This shape is consumed by settings/status endpoints to report installation and
|
|
* credential state for each provider.
|
|
*/
|
|
export type ProviderAuthStatus = {
|
|
installed: boolean;
|
|
provider: LLMProvider;
|
|
authenticated: boolean;
|
|
email: string | null;
|
|
method: string | null;
|
|
error?: string;
|
|
};
|
|
|
|
// ---------------------------
|
|
//----------------- SHARED DATABASE CREDENTIAL TYPES ------------
|
|
/**
|
|
* Safe credential view returned by credential listing APIs.
|
|
*
|
|
* This intentionally excludes the raw credential secret while still exposing
|
|
* metadata needed for UI rendering and management operations.
|
|
*/
|
|
export type CredentialPublicRow = {
|
|
id: number;
|
|
credential_name: string;
|
|
credential_type: string;
|
|
description: string | null;
|
|
created_at: string;
|
|
is_active: number;
|
|
};
|
|
|
|
/**
|
|
* Result returned after creating a credential record.
|
|
*
|
|
* Use this return shape when callers need the created id and display metadata,
|
|
* but must never receive the stored secret value.
|
|
*/
|
|
export type CreateCredentialResult = {
|
|
id: number | bigint;
|
|
credentialName: string;
|
|
credentialType: string;
|
|
};
|
|
|
|
// ---------------------------
|
|
//----------------- PROJECT PERSISTENCE TYPES ------------
|
|
/**
|
|
* Canonical project row shape returned by the projects repository.
|
|
*
|
|
* Use this type whenever backend services need to pass around one database
|
|
* project record without leaking raw SQL row typing across modules.
|
|
*/
|
|
export type ProjectRepositoryRow = {
|
|
project_id: string;
|
|
project_path: string;
|
|
custom_project_name: string | null;
|
|
isStarred: number;
|
|
isArchived: number;
|
|
};
|
|
|
|
/**
|
|
* Result category returned by `projectsDb.createProjectPath`.
|
|
*
|
|
* `created` means a fresh row was inserted, `reactivated_archived` means an
|
|
* existing archived path was accepted and updated, and `active_conflict` means
|
|
* an already-active path blocked project creation.
|
|
*/
|
|
export type CreateProjectPathOutcome =
|
|
| 'created'
|
|
| 'reactivated_archived'
|
|
| 'active_conflict';
|
|
|
|
/**
|
|
* Structured result returned by project-path upsert operations.
|
|
*
|
|
* Services should use this result to decide whether a request succeeded,
|
|
* should return a conflict, or needs follow-up retrieval of row metadata.
|
|
*/
|
|
export type CreateProjectPathResult = {
|
|
outcome: CreateProjectPathOutcome;
|
|
project: ProjectRepositoryRow | null;
|
|
};
|
|
|
|
/**
|
|
* Validation result for user-supplied workspace/project paths.
|
|
*
|
|
* `resolvedPath` is present only when validation succeeds. `error` is present
|
|
* only when validation fails and is suitable for user-facing diagnostics.
|
|
*/
|
|
export type WorkspacePathValidationResult = {
|
|
valid: boolean;
|
|
resolvedPath?: string;
|
|
error?: string;
|
|
};
|