Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@bluecopa/truecode

Package Overview
Dependencies
Maintainers
3
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@bluecopa/truecode - npm Package Compare versions

Comparing version
0.1.9
to
0.1.10
+147
dist/_harness/shared-types-D89hqST8.d.ts
import { Tool, LanguageModel } from 'ai';
/** What a tool call actually did to the world */
type ActionType = "observed" | "produced" | "modified";
interface ToolResultArtifact {
action: ActionType;
/** file, url, command_output, value */
kind: string;
uri: string;
}
interface ToolResult {
success: boolean;
output: string;
/** Compact summary for LLM context. When present, sent to the model instead of `output`. */
modelOutput?: string | undefined;
error?: string | undefined;
metadata?: Record<string, unknown> | undefined;
/** What this tool call affected — set by execute, read by worker/compactor */
artifact?: ToolResultArtifact | undefined;
}
interface BashOptions {
timeout?: number | undefined;
cwd?: string | undefined;
/** Human-readable label for long-running jobs. */
label?: string | undefined;
/** When set, run the command on a remote host via SSH (detached via nohup, persistent across truecode restarts). */
remote?: {
host: string;
user?: string | undefined;
keyPath?: string | undefined;
} | undefined;
}
interface ReadOptions {
lineRange?: [number, number] | undefined;
maxLines?: number | undefined;
}
interface GlobOptions {
ignore?: string[] | undefined;
maxResults?: number | undefined;
}
interface GrepOptions {
caseInsensitive?: boolean | undefined;
wholeWord?: boolean | undefined;
maxResults?: number | undefined;
include?: string | undefined;
}
interface WebFetchOptions {
url: string;
selector?: string | undefined;
maxContentLength?: number | undefined;
headers?: Record<string, string> | undefined;
}
type TextEditorRequest = {
command: "view";
path: string;
startLine?: number | undefined;
endLine?: number | undefined;
} | {
command: "create";
path: string;
fileText: string;
} | {
command: "str_replace";
path: string;
oldText: string;
newText: string;
replaceAll?: boolean | undefined;
} | {
command: "insert";
path: string;
insertLine: number;
newText: string;
};
type BatchOp = {
op: "exec";
command: string;
cwd?: string;
timeoutMs?: number;
} | {
op: "write_file";
path: string;
content: string;
encoding?: "utf8" | "base64";
} | {
op: "read_file";
path: string;
encoding?: "utf8" | "base64";
};
type BatchResult = {
success: true;
op: "exec";
exitCode: number;
stdout: string;
stderr: string;
} | {
success: true;
op: "write_file";
} | {
success: true;
op: "read_file";
content: string;
} | {
success: false;
op: string;
error: string;
};
interface ToolProviderCapabilities {
bash: boolean;
fileSystem: boolean;
webFetch: boolean;
webSearch: boolean;
codeExecution: boolean;
sandboxed: boolean;
}
interface ThreadStatus {
threadId: string;
isComplete: boolean;
exitCode: number | null;
output: string;
error?: string;
}
interface ToolProvider {
bash(command: string, options?: BashOptions): Promise<ToolResult>;
readFile(path: string, options?: ReadOptions): Promise<ToolResult>;
writeFile(path: string, content: string): Promise<ToolResult>;
editFile(path: string, oldText: string, newText: string): Promise<ToolResult>;
textEditor?: ((request: TextEditorRequest) => Promise<ToolResult>) | undefined;
glob(pattern: string, options?: GlobOptions): Promise<ToolResult>;
grep(pattern: string, path?: string, options?: GrepOptions): Promise<ToolResult>;
webFetch?: ((options: WebFetchOptions) => Promise<ToolResult>) | undefined;
webSearch?: ((query: string) => Promise<ToolResult>) | undefined;
thread?: ((command: string, options?: BashOptions) => Promise<ToolResult>) | undefined;
check?: ((threadId: string) => Promise<ToolResult>) | undefined;
cancel?: ((threadId: string) => Promise<ToolResult>) | undefined;
/** Wait for a background thread to reach a terminal state (complete/error). Resolves with the final ThreadStatus. */
waitForThread?: ((threadId: string, signal?: AbortSignal) => Promise<ThreadStatus>) | undefined;
batch?: ((ops: BatchOp[]) => Promise<BatchResult[]>) | undefined;
initialize?: (() => Promise<void>) | undefined;
destroy?: (() => Promise<void>) | undefined;
capabilities(): ToolProviderCapabilities;
}
type AnyTool = Tool<any, any>;
type ModelFactory = (modelId: string) => LanguageModel;
export type { AnyTool as A, BashOptions as B, GlobOptions as G, ModelFactory as M, ReadOptions as R, ToolProvider as T, WebFetchOptions as W, ToolResult as a, ToolResultArtifact as b, ToolProviderCapabilities as c, GrepOptions as d, BatchOp as e, BatchResult as f, ActionType as g, TextEditorRequest as h, ThreadStatus as i };
+256
-3

@@ -1,4 +0,5 @@

import { A as AnyTool, T as ToolProvider, a as ToolResult, M as ModelFactory, b as ToolResultArtifact } from '../shared-types-vZuVoy_H.js';
export { c as ActionType, B as BashOptions, d as BatchOp, e as BatchResult, G as GlobOptions, f as GrepOptions, R as ReadOptions, g as TextEditorRequest, h as ThreadStatus, i as ToolProviderCapabilities, W as WebFetchOptions } from '../shared-types-vZuVoy_H.js';
import { A as AnyTool, T as ToolProvider, a as ToolResult, M as ModelFactory, b as ToolResultArtifact, c as ToolProviderCapabilities, B as BashOptions, R as ReadOptions, G as GlobOptions, d as GrepOptions, e as BatchOp, f as BatchResult } from '../shared-types-D89hqST8.js';
export { g as ActionType, h as TextEditorRequest, i as ThreadStatus, W as WebFetchOptions } from '../shared-types-D89hqST8.js';
import { HarnessTelemetry } from '../observability/otel.js';
export { MetricRecord, SpanHandle, SpanRecord } from '../observability/otel.js';
import 'ai';

@@ -1008,2 +1009,60 @@

interface Episode {
id: string;
taskId: string;
sessionId: string;
tupleId?: string;
summary: string;
createdAt: number;
completedAt?: number;
/** Arbitrary metadata for routing/display */
metadata?: Record<string, unknown>;
}
interface EpisodeTrace {
episodeId: string;
messages: Array<{
role: string;
content: string;
[key: string]: unknown;
}>;
createdAt: number;
}
interface EpisodeStore {
addEpisode(episode: Episode): Promise<void>;
addTrace(trace: EpisodeTrace): Promise<void>;
getEpisode(id: string): Promise<Episode | null>;
getTrace(episodeId: string): Promise<EpisodeTrace | null>;
getEpisodesByTask(taskId: string): Promise<Episode[]>;
getEpisodesBySession(sessionId: string): Promise<Episode[]>;
getRecentEpisodes(limit: number): Promise<Episode[]>;
evictTraces(olderThan: number): Promise<number>;
}
interface SessionMemo {
id: string;
sessionId: string;
content: string;
sourceEpisodeIds?: string[];
createdAt: number;
}
interface SessionMemoStore {
addMemo(memo: SessionMemo): Promise<void>;
getMemo(id: string): Promise<SessionMemo | null>;
getMemosBySession(sessionId: string): Promise<SessionMemo[]>;
getRecentMemos(limit: number): Promise<SessionMemo[]>;
}
interface LongTermMemory {
id: string;
content: string;
category: string;
createdAt: number;
updatedAt: number;
}
interface LongTermStore {
addMemory(memory: LongTermMemory): Promise<void>;
getMemory(id: string): Promise<LongTermMemory | null>;
getAllMemories(): Promise<LongTermMemory[]>;
getMemoriesByCategory(category: string): Promise<LongTermMemory[]>;
updateMemory(id: string, updates: Partial<Pick<LongTermMemory, 'content' | 'category' | 'updatedAt'>>): Promise<void>;
deleteMemory(id: string): Promise<void>;
}
/** In-memory transcript store for testing */

@@ -1051,2 +1110,33 @@ declare class MemoryTranscriptStore implements TranscriptStore {

}
/** In-memory episode store */
declare class InMemoryEpisodeStore implements EpisodeStore {
private episodes;
private traces;
addEpisode(episode: Episode): Promise<void>;
addTrace(trace: EpisodeTrace): Promise<void>;
getEpisode(id: string): Promise<Episode | null>;
getTrace(episodeId: string): Promise<EpisodeTrace | null>;
getEpisodesByTask(taskId: string): Promise<Episode[]>;
getEpisodesBySession(sessionId: string): Promise<Episode[]>;
getRecentEpisodes(limit: number): Promise<Episode[]>;
evictTraces(_olderThan: number): Promise<number>;
}
/** In-memory session memo store */
declare class InMemorySessionMemoStore implements SessionMemoStore {
private memos;
addMemo(memo: SessionMemo): Promise<void>;
getMemo(id: string): Promise<SessionMemo | null>;
getMemosBySession(sessionId: string): Promise<SessionMemo[]>;
getRecentMemos(limit: number): Promise<SessionMemo[]>;
}
/** In-memory long-term store */
declare class InMemoryLongTermStore implements LongTermStore {
private memories;
addMemory(memory: LongTermMemory): Promise<void>;
getMemory(id: string): Promise<LongTermMemory | null>;
getAllMemories(): Promise<LongTermMemory[]>;
getMemoriesByCategory(category: string): Promise<LongTermMemory[]>;
updateMemory(id: string, updates: Partial<Pick<LongTermMemory, 'content' | 'category' | 'updatedAt'>>): Promise<void>;
deleteMemory(id: string): Promise<void>;
}

@@ -1085,2 +1175,165 @@ /**

/**
* CompositeToolProvider delegates to the first provider with matching capabilities.
*
* Useful when multiple tool providers exist (e.g., a sandbox executor + a local
* file-system executor) and you want to route tool calls based on capability.
*/
declare class CompositeToolProvider implements ToolProvider {
private providers;
constructor(providers: ToolProvider[]);
capabilities(): ToolProviderCapabilities;
/** Pick the first provider that supports the requested capability. */
private pick;
bash(command: string, options?: BashOptions): Promise<ToolResult>;
readFile(path: string, options?: ReadOptions): Promise<ToolResult>;
writeFile(path: string, content: string): Promise<ToolResult>;
editFile(path: string, oldText: string, newText: string): Promise<ToolResult>;
glob(pattern: string, options?: GlobOptions): Promise<ToolResult>;
grep(pattern: string, path?: string, options?: GrepOptions): Promise<ToolResult>;
}
/**
* Executor interface for sandboxed code execution (e.g., E2B sandbox).
*
* Implementations wrap sandbox APIs into a uniform shape that
* E2BToolProvider can delegate to.
*/
interface E2BExecutor {
bash(command: string, options?: BashOptions): Promise<ToolResult>;
readFile(path: string, options?: ReadOptions): Promise<ToolResult>;
writeFile(path: string, content: string): Promise<ToolResult>;
editFile(path: string, oldText: string, newText: string): Promise<ToolResult>;
glob(pattern: string, options?: GlobOptions): Promise<ToolResult>;
grep(pattern: string, path?: string, options?: GrepOptions): Promise<ToolResult>;
batch?(ops: BatchOp[]): Promise<BatchResult[]>;
destroy(): Promise<void>;
}
/**
* E2BToolProvider wraps an E2BExecutor into a ToolProvider interface
* suitable for use with the harness agent loop.
*/
declare class E2BToolProvider {
private executor;
constructor(executor: E2BExecutor);
capabilities(): ToolProviderCapabilities;
bash(command: string, options?: BashOptions): Promise<ToolResult>;
readFile(path: string, options?: ReadOptions): Promise<ToolResult>;
writeFile(path: string, content: string): Promise<ToolResult>;
editFile(path: string, oldText: string, newText: string): Promise<ToolResult>;
glob(pattern: string, options?: GlobOptions): Promise<ToolResult>;
grep(pattern: string, path?: string, options?: GrepOptions): Promise<ToolResult>;
}
/** Options for constructing a ControlPlaneE2BExecutor. */
interface ControlPlaneE2BExecutorOptions {
baseUrl: string;
apiKey: string;
templateId?: string;
}
/**
* Base class for control-plane E2B sandbox executors.
*
* Provides the configuration surface and stubs that concrete implementations
* (e.g., Samyx control-plane API) extend. Subclasses must override the
* tool-execution methods with actual sandbox API calls.
*/
declare class ControlPlaneE2BExecutor implements E2BExecutor {
protected baseUrl: string;
protected apiKey: string;
protected templateId: string;
constructor(options: ControlPlaneE2BExecutorOptions);
bash(_command: string, _options?: BashOptions): Promise<ToolResult>;
readFile(_path: string, _options?: ReadOptions): Promise<ToolResult>;
writeFile(_path: string, _content: string): Promise<ToolResult>;
editFile(_path: string, _oldText: string, _newText: string): Promise<ToolResult>;
glob(_pattern: string, _options?: GlobOptions): Promise<ToolResult>;
grep(_pattern: string, _path?: string, _options?: GrepOptions): Promise<ToolResult>;
writeFileBytes(_path: string, _data: Uint8Array): Promise<void>;
readFileBytes(_path: string): Promise<Uint8Array>;
get activeSandboxId(): string | undefined;
destroy(): Promise<void>;
}
/**
* Permission request sent to the resolver for each tool call.
*
* The `toolName` key is always present. Additional tool arguments
* are forwarded as-is for context-sensitive permission decisions.
*/
interface PermissionRequest {
toolName: string;
[toolArg: string]: unknown;
}
/** Resolver function that decides whether a tool call is permitted. */
type PermissionResolver = (request: PermissionRequest) => Promise<boolean>;
/** Permission mode for the manager. */
type PermissionMode = "deny_all" | "allow_all" | "ask";
/**
* PermissionManager controls whether tool calls are allowed.
*
* Three modes:
* - `deny_all`: reject everything
* - `allow_all`: accept everything
* - `ask`: delegate to a resolver function
*/
declare class PermissionManager {
private mode;
private resolver;
constructor(mode: PermissionMode, resolver?: PermissionResolver);
/** Check whether a tool call is permitted. */
canExecute(request: PermissionRequest): Promise<boolean>;
}
interface ExecutionContext {
attempt: number;
totalAttempts: number;
startTime: number;
signal: AbortSignal;
}
interface PipelineOptions {
timeout?: number;
retryCount?: number;
}
declare class ResiliencePipeline {
private options;
constructor(options?: PipelineOptions);
/** Set a timeout in milliseconds for execution. */
timeout(ms: number): ResiliencePipeline;
/** Set retry count. */
retries(count: number): ResiliencePipeline;
/** Build the executable pipeline. */
build(): {
execute: <T>(fn: () => Promise<T>, ctx: ExecutionContext) => Promise<T>;
};
}
/** Create a new resilience pipeline builder. */
declare function resilience(): ResiliencePipeline;
/**
* Profile types for ArcLoop thread configuration.
*
* Profiles control which tools a worker thread can use and which
* model tier it runs at.
*/
/** Declaration of a worker profile — matched by name in process context. */
interface ProfileDeclaration {
name: string;
/** Descriptive signature for the orchestrator (e.g., "question:string -> evidence:string[]") */
signature: string;
/** Tool names available to workers with this profile */
tools: string[];
/** Worker model tier */
model: "fast" | "medium" | "strong";
/** Worker step budget */
maxSteps: number;
/** Background/injection context for the worker system prompt */
background: string;
}
/** A profile bound to a process, with its declaration. */
interface ProcessProfile {
name: string;
declaration: ProfileDeclaration;
}
/**
* In-memory reference implementation of JobRegistry.

@@ -1110,2 +1363,2 @@ *

export { ABSOLUTE_MAX_WORKER_STEPS, AnyTool, type ArcConfig, type ArcEvent, ArcLoop, type ArcRunResult, type ArcTraceEvent, type Artifact, type ArtifactStore, DEFAULT_MAX_STEPS_PER_WORKER, DEFAULT_WORKER_STEP_BUDGETS, type DispatchRecord, type DispatchTier, type ExpectedArtifact, type ExpectedOutputContract, FsArtifactStore, FsTranscriptStore, type JobEvent, type JobKind, type JobRegistry, type JobSpec, type JobStartOptions, type JobState, type JobStatus, type JobTransport, MemoryArtifactStore, MemoryJobRegistry, MemoryMessageStore, MemoryScratchPad, MemorySessionStore, MemorySummaryDAG, MemoryTranscriptStore, MemoryVectorIndex, type MessageStore, ModelFactory, type OodaSnapshot, type OrchestratorContext, type PushResult, REQUEST_MORE_STEPS_INCREMENT, type ReadEpisodeArgs, type ReadEpisodeDetail, type RunWorkerConfig, type ScratchPad, type SessionMeta, type SessionSnapshot, type SessionStore, type StoredAttachment, type StoredMessage, type SummaryDAG, type SummaryNode, type Tool, type ToolExecutionMode, ToolProvider, ToolResult, ToolResultArtifact, type TraceToolCall, type Transcript, type TranscriptStore, type Tuple, type VectorIndex, type WorkerProgressEvent, type WorkerResult, cloneForTrace, formatDispatchForPrompt };
export { ABSOLUTE_MAX_WORKER_STEPS, AnyTool, type ArcConfig, type ArcEvent, ArcLoop, type ArcRunResult, type ArcTraceEvent, type Artifact, type ArtifactStore, BashOptions, BatchOp, BatchResult, CompositeToolProvider, ControlPlaneE2BExecutor, type ControlPlaneE2BExecutorOptions, DEFAULT_MAX_STEPS_PER_WORKER, DEFAULT_WORKER_STEP_BUDGETS, type DispatchRecord, type DispatchTier, type E2BExecutor, E2BToolProvider, type Episode, type EpisodeStore, type EpisodeTrace, type ExecutionContext, type ExpectedArtifact, type ExpectedOutputContract, FsArtifactStore, FsTranscriptStore, GlobOptions, GrepOptions, HarnessTelemetry, type HookCallback, type HookContext, type HookDecision, type HookEventName, HookRunner, InMemoryEpisodeStore, InMemoryLongTermStore, InMemorySessionMemoStore, type JobEvent, type JobKind, type JobRegistry, type JobSpec, type JobStartOptions, type JobState, type JobStatus, type JobTransport, type LongTermMemory, type LongTermStore, MemoryArtifactStore, MemoryJobRegistry, MemoryMessageStore, MemoryScratchPad, MemorySessionStore, MemorySummaryDAG, MemoryTranscriptStore, MemoryVectorIndex, type MessageStore, ModelFactory, type OodaSnapshot, type OrchestratorContext, PermissionManager, type PermissionMode, type PermissionRequest, type PermissionResolver, type ProcessProfile, type ProfileDeclaration, type PushResult, REQUEST_MORE_STEPS_INCREMENT, type ReadEpisodeArgs, type ReadEpisodeDetail, ReadOptions, type RunWorkerConfig, type ScratchPad, type SessionMemo, type SessionMemoStore, type SessionMeta, type SessionSnapshot, type SessionStore, type StoredAttachment, type StoredMessage, type SummaryDAG, type SummaryNode, type Tool, type ToolExecutionMode, ToolProvider, ToolProviderCapabilities, ToolResult, ToolResultArtifact, type TraceToolCall, type Transcript, type TranscriptStore, type Tuple, type VectorIndex, type WorkerProgressEvent, type WorkerResult, cloneForTrace, formatDispatchForPrompt, resilience };
+1
-1

@@ -1,2 +0,2 @@

import { T as ToolProvider, M as ModelFactory } from '../shared-types-vZuVoy_H.js';
import { T as ToolProvider, M as ModelFactory } from '../shared-types-D89hqST8.js';
import { HarnessTelemetry } from '../observability/otel.js';

@@ -3,0 +3,0 @@ import 'ai';

{
"name": "@bluecopa/truecode",
"version": "0.1.9",
"version": "0.1.10",
"description": "Terminal coding agent: pi-tui + pi-tools + ARC harness",

@@ -5,0 +5,0 @@ "license": "UNLICENSED",

import { Tool, LanguageModel } from 'ai';
/** What a tool call actually did to the world */
type ActionType = "observed" | "produced" | "modified";
interface ToolResultArtifact {
action: ActionType;
/** file, url, command_output, value */
kind: string;
uri: string;
}
interface ToolResult {
success: boolean;
output: string;
/** Compact summary for LLM context. When present, sent to the model instead of `output`. */
modelOutput?: string | undefined;
error?: string | undefined;
metadata?: Record<string, unknown> | undefined;
/** What this tool call affected — set by execute, read by worker/compactor */
artifact?: ToolResultArtifact | undefined;
}
interface BashOptions {
timeout?: number | undefined;
cwd?: string | undefined;
/** Human-readable label for long-running jobs. */
label?: string | undefined;
/** When set, run the command on a remote host via SSH (detached via nohup, persistent across truecode restarts). */
remote?: {
host: string;
user?: string | undefined;
keyPath?: string | undefined;
} | undefined;
}
interface ReadOptions {
lineRange?: [number, number] | undefined;
maxLines?: number | undefined;
}
interface GlobOptions {
ignore?: string[] | undefined;
maxResults?: number | undefined;
}
interface GrepOptions {
caseInsensitive?: boolean | undefined;
wholeWord?: boolean | undefined;
maxResults?: number | undefined;
include?: string | undefined;
}
interface WebFetchOptions {
url: string;
selector?: string | undefined;
maxContentLength?: number | undefined;
headers?: Record<string, string> | undefined;
}
type TextEditorRequest = {
command: "view";
path: string;
startLine?: number | undefined;
endLine?: number | undefined;
} | {
command: "create";
path: string;
fileText: string;
} | {
command: "str_replace";
path: string;
oldText: string;
newText: string;
replaceAll?: boolean | undefined;
} | {
command: "insert";
path: string;
insertLine: number;
newText: string;
};
type BatchOp = {
op: "exec";
command: string;
cwd?: string;
timeoutMs?: number;
} | {
op: "write_file";
path: string;
content: string;
encoding?: "utf8" | "base64";
} | {
op: "read_file";
path: string;
encoding?: "utf8" | "base64";
};
type BatchResult = {
success: true;
op: "exec";
exitCode: number;
stdout: string;
stderr: string;
} | {
success: true;
op: "write_file";
} | {
success: true;
op: "read_file";
content: string;
} | {
success: false;
op: string;
error: string;
};
interface ToolProviderCapabilities {
bash: boolean;
fileSystem: boolean;
webFetch: boolean;
webSearch: boolean;
codeExecution: boolean;
sandboxed: boolean;
}
interface ThreadStatus {
threadId: string;
isComplete: boolean;
exitCode: number | null;
output: string;
error?: string;
}
interface ToolProvider {
bash(command: string, options?: BashOptions): Promise<ToolResult>;
readFile(path: string, options?: ReadOptions): Promise<ToolResult>;
writeFile(path: string, content: string): Promise<ToolResult>;
editFile(path: string, oldText: string, newText: string): Promise<ToolResult>;
textEditor?: ((request: TextEditorRequest) => Promise<ToolResult>) | undefined;
glob(pattern: string, options?: GlobOptions): Promise<ToolResult>;
grep(pattern: string, path?: string, options?: GrepOptions): Promise<ToolResult>;
webFetch?: ((options: WebFetchOptions) => Promise<ToolResult>) | undefined;
webSearch?: ((query: string) => Promise<ToolResult>) | undefined;
thread?: ((command: string, options?: BashOptions) => Promise<ToolResult>) | undefined;
check?: ((threadId: string) => Promise<ToolResult>) | undefined;
cancel?: ((threadId: string) => Promise<ToolResult>) | undefined;
/** Wait for a background thread to reach a terminal state (complete/error). Resolves with the final ThreadStatus. */
waitForThread?: ((threadId: string, signal?: AbortSignal) => Promise<ThreadStatus>) | undefined;
batch?: ((ops: BatchOp[]) => Promise<BatchResult[]>) | undefined;
initialize?: (() => Promise<void>) | undefined;
destroy?: (() => Promise<void>) | undefined;
capabilities(): ToolProviderCapabilities;
}
type AnyTool = Tool<any, any>;
type ModelFactory = (modelId: string) => LanguageModel;
export type { AnyTool as A, BashOptions as B, GlobOptions as G, ModelFactory as M, ReadOptions as R, ToolProvider as T, WebFetchOptions as W, ToolResult as a, ToolResultArtifact as b, ActionType as c, BatchOp as d, BatchResult as e, GrepOptions as f, TextEditorRequest as g, ThreadStatus as h, ToolProviderCapabilities as i };

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display