One source of truth:Documentation Index
Fetch the complete documentation index at: https://smithers.sh/llms.txt
Use this file to discover all available pages before exploring further.
tsc --emitDeclarationOnly would produce something close to this. Import these types from smithers-orchestrator unless noted otherwise.
// =============================================================================
// Workflow
// =============================================================================
interface SmithersWorkflow<Schema = unknown> {
readonly readableName?: string;
readonly description?: string;
readonly db?: unknown;
readonly build: (ctx: SmithersCtx<Schema>) => JSX.Element;
readonly opts: SmithersWorkflowOptions;
readonly schemaRegistry?: Map<string, SchemaRegistryEntry>;
}
type SmithersWorkflowOptions = {
alertPolicy?: SmithersAlertPolicy;
cache?: boolean;
workflowHash?: string;
};
type SchemaRegistryEntry = {
table: any;
zodSchema: import("zod").ZodObject<any>;
};
type SmithersAlertPolicy = {
defaults?: SmithersAlertPolicyDefaults;
rules?: Record<string, SmithersAlertPolicyRule>;
reactions?: Record<string, SmithersAlertReaction>;
};
type SmithersAlertSeverity = "info" | "warning" | "critical";
type SmithersAlertLabels = Record<string, string>;
type SmithersAlertPolicyDefaults = {
owner?: string;
severity?: SmithersAlertSeverity;
runbook?: string;
labels?: SmithersAlertLabels;
};
type SmithersAlertPolicyRule = SmithersAlertPolicyDefaults & {
afterMs?: number;
reaction?: string | SmithersAlertReaction;
};
type SmithersAlertReaction =
| { kind: "emit-only" }
| { kind: "pause" }
| { kind: "cancel" }
| { kind: "open-approval" }
| { kind: "deliver"; destination: string };
// =============================================================================
// Context
// =============================================================================
declare class SmithersCtx<Schema = unknown> {
readonly runId: string;
readonly iteration: number;
readonly iterations?: Record<string, number>;
readonly input: Schema extends { input: infer T } ? T : any;
readonly auth: RunAuthContext | null;
readonly outputs: OutputAccessor<Schema>;
output(table: any, key: OutputKey): any;
outputMaybe(table: any, key: OutputKey): any | undefined;
latest(table: any, nodeId: string): any | undefined;
latestArray(value: unknown, schema: any): unknown[];
iterationCount(table: any, nodeId: string): number;
}
type OutputKey = { nodeId: string; iteration?: number };
type OutputAccessor<Schema> = ((table: any) => any[]) & Record<string, any[]>;
type InferRow<TTable> = TTable extends { $inferSelect: infer R } ? R : never;
type InferOutputEntry<T> =
T extends import("zod").ZodTypeAny ? import("zod").infer<T>
: T extends { $inferSelect: any } ? InferRow<T>
: never;
type RunAuthContext = {
triggeredBy: string;
scopes: string[];
role: string;
createdAt: string;
};
// =============================================================================
// Run
// =============================================================================
type RunOptions = {
runId?: string;
parentRunId?: string | null;
input: Record<string, unknown>;
maxConcurrency?: number; // default 4
onProgress?: (e: SmithersEvent) => void;
signal?: AbortSignal;
resume?: boolean;
force?: boolean; // resume even if marked running
workflowPath?: string;
rootDir?: string;
logDir?: string | null;
allowNetwork?: boolean; // default false; bash tool network access
maxOutputBytes?: number; // default 200000
toolTimeoutMs?: number; // default 60000
hot?: boolean | HotReloadOptions;
auth?: RunAuthContext | null;
config?: Record<string, unknown>;
cliAgentToolsDefault?: "all" | "explicit-only"; // default "all"
resumeClaim?: { // internal supervisor coordination
claimOwnerId: string;
claimHeartbeatAtMs: number;
restoreRuntimeOwnerId?: string | null;
restoreHeartbeatAtMs?: number | null;
};
};
type HotReloadOptions = {
rootDir?: string;
outDir?: string; // default .smithers/hmr/<runId>
maxGenerations?: number; // default 3
cancelUnmounted?: boolean; // default false
debounceMs?: number; // default 100
};
type RunResult = {
readonly runId: string;
readonly status: RunStatus;
readonly output?: unknown;
readonly error?: unknown;
readonly nextRunId?: string; // set when the run continued-as-new
};
type RunStatus =
| "running"
| "waiting-approval"
| "waiting-event"
| "waiting-timer"
| "finished"
| "continued"
| "failed"
| "cancelled";
type RetryTaskOptions = {
runId: string;
nodeId: string;
iteration?: number;
resetDependents?: boolean; // default true
force?: boolean; // default false
onProgress?: (e: SmithersEvent) => void;
};
type RetryTaskResult = {
success: boolean;
resetNodes: string[];
error?: string;
};
// =============================================================================
// Task
// =============================================================================
type TaskDescriptor = {
nodeId: string;
ordinal: number;
iteration: number;
ralphId?: string;
dependsOn?: string[];
needs?: Record<string, string>;
worktreeId?: string;
worktreePath?: string;
worktreeBranch?: string;
worktreeBaseBranch?: string;
outputTable: unknown | null;
outputTableName: string;
outputRef?: import("zod").ZodObject<any>;
outputSchema?: import("zod").ZodObject<any>;
parallelGroupId?: string;
parallelMaxConcurrency?: number;
needsApproval: boolean;
waitAsync?: boolean;
approvalMode?: "gate" | "decision" | "select" | "rank";
approvalOnDeny?: "fail" | "continue" | "skip";
approvalOptions?: ApprovalOption[];
approvalAllowedScopes?: string[];
approvalAllowedUsers?: string[];
approvalAutoApprove?: {
after?: number;
audit?: boolean;
conditionMet?: boolean;
revertOnMet?: boolean;
};
skipIf: boolean;
retries: number;
retryPolicy?: RetryPolicy;
timeoutMs: number | null;
heartbeatTimeoutMs: number | null;
continueOnFail: boolean;
cachePolicy?: CachePolicy;
agent?: AgentLike | AgentLike[];
prompt?: string;
staticPayload?: unknown;
computeFn?: () => unknown | Promise<unknown>;
label?: string;
meta?: Record<string, unknown>;
scorers?: ScorersMap;
memoryConfig?: TaskMemoryConfig;
};
type RetryPolicy = {
backoff?: "fixed" | "linear" | "exponential"; // default "fixed"
initialDelayMs?: number; // default 0
maxDelayMs?: number;
multiplier?: number;
jitter?: boolean;
};
type CachePolicy<Ctx = any> = {
by?: (ctx: Ctx) => unknown;
version?: string;
key?: string;
ttlMs?: number;
scope?: "run" | "workflow" | "global";
};
type AgentLike = {
id?: string;
tools?: Record<string, any>;
supportsNativeStructuredOutput?: boolean;
capabilities?: any;
generate: (args: any) => Promise<any>;
};
type TaskMemoryConfig = {
recall?: { namespace?: MemoryNamespace; query?: string; topK?: number };
remember?: { namespace?: MemoryNamespace; key?: string };
threadId?: string;
};
type MemoryNamespace = { kind: MemoryNamespaceKind; id: string };
type MemoryNamespaceKind = "workflow" | "agent" | "user" | "global";
// =============================================================================
// Graph
// =============================================================================
type GraphSnapshot = {
readonly runId: string;
readonly frameNo: number;
readonly xml: XmlNode | null;
readonly tasks: readonly TaskDescriptor[];
};
type XmlNode = XmlElement | XmlText;
type XmlElement = {
readonly kind: "element";
readonly tag: string; // "Workflow" | "Task" | "Sequence" | ...
readonly props: Record<string, string>;
readonly children: readonly XmlNode[];
};
type XmlText = { readonly kind: "text"; readonly text: string };
// =============================================================================
// Events
// =============================================================================
//
// `SmithersEvent` is a discriminated union of every lifecycle event the runtime
// emits. The full union is documented separately to keep this
// file usable as the everyday type reference.
//
// See: docs/reference/event-types.mdx (rendered) or /llms-events.txt (LLM fragment).
type SmithersEvent = { type: string; runId: string; timestampMs: number } & Record<string, unknown>;
// (Each variant has additional fields per its `type`. See event-types.)
// =============================================================================
// Component props
// =============================================================================
type WorkflowProps = {
name: string;
cache?: boolean;
children?: React.ReactNode;
};
type OutputTarget = import("zod").ZodObject<any> | { $inferSelect: any } | string;
type DepsSpec = Record<string, OutputTarget>;
type InferDeps<D extends DepsSpec> = {
[K in keyof D]: D[K] extends string ? unknown : InferOutputEntry<D[K]>;
};
type TaskProps<Row, Output extends OutputTarget = OutputTarget, D extends DepsSpec = {}> = {
key?: string;
id: string;
output: Output;
outputSchema?: import("zod").ZodObject<any>;
agent?: AgentLike | AgentLike[];
fallbackAgent?: AgentLike;
dependsOn?: string[];
needs?: Record<string, string>;
deps?: D;
skipIf?: boolean;
needsApproval?: boolean;
async?: boolean; // only with needsApproval
timeoutMs?: number;
heartbeatTimeoutMs?: number;
noRetry?: boolean;
retries?: number; // default Infinity (set 0 to disable)
retryPolicy?: RetryPolicy; // default exponential, 1000ms, capped 5min
continueOnFail?: boolean;
cache?: CachePolicy;
scorers?: ScorersMap;
memory?: TaskMemoryConfig;
allowTools?: string[]; // CLI-agent tool allowlist
label?: string;
meta?: Record<string, unknown>;
children: string | Row | (() => Row | Promise<Row>) | React.ReactNode | ((deps: InferDeps<D>) => Row | React.ReactNode);
};
type SequenceProps = { skipIf?: boolean; children?: React.ReactNode };
type ParallelProps = { id?: string; maxConcurrency?: number; skipIf?: boolean; children?: React.ReactNode };
type BranchProps = { if: boolean; then: React.ReactElement; else?: React.ReactElement | null; skipIf?: boolean };
type LoopProps = {
id?: string;
until?: boolean;
maxIterations?: number;
onMaxReached?: "fail" | "return-last"; // default "return-last"
continueAsNewEvery?: number;
skipIf?: boolean;
children?: React.ReactNode;
};
type RalphProps = LoopProps; // deprecated alias
type ApprovalDecision = { approved: boolean; note: string | null; decidedBy: string | null; decidedAt: string | null };
type ApprovalSelection = { selected: string; notes: string | null };
type ApprovalRanking = { ranked: string[]; notes: string | null };
type ApprovalRequest = { title: string; summary?: string; metadata?: Record<string, unknown> };
type ApprovalMode = "approve" | "select" | "rank";
type ApprovalOption = { key: string; label: string; summary?: string; metadata?: Record<string, unknown> };
type ApprovalAutoApprove = {
after?: number;
condition?: ((ctx: any) => boolean) | (() => boolean);
audit?: boolean;
revertOn?: ((ctx: any) => boolean) | (() => boolean);
};
type ApprovalProps<Row = ApprovalDecision, Output extends OutputTarget = OutputTarget> = {
id: string;
mode?: ApprovalMode;
options?: ApprovalOption[];
output: Output;
outputSchema?: import("zod").ZodObject<any>;
request: ApprovalRequest;
onDeny?: "fail" | "continue" | "skip";
allowedScopes?: string[];
allowedUsers?: string[];
autoApprove?: ApprovalAutoApprove;
async?: boolean;
dependsOn?: string[];
needs?: Record<string, string>;
skipIf?: boolean;
timeoutMs?: number;
heartbeatTimeoutMs?: number;
retries?: number;
retryPolicy?: RetryPolicy;
continueOnFail?: boolean;
cache?: CachePolicy;
label?: string;
meta?: Record<string, unknown>;
key?: string;
children?: React.ReactNode;
};
type SignalProps<S extends import("zod").ZodObject<any> = import("zod").ZodObject<any>> = {
id: string;
schema: S;
correlationId?: string;
timeoutMs?: number;
onTimeout?: "fail" | "skip" | "continue";
async?: boolean;
skipIf?: boolean;
dependsOn?: string[];
needs?: Record<string, string>;
label?: string;
meta?: Record<string, unknown>;
key?: string;
children?: (data: import("zod").infer<S>) => React.ReactNode;
};
type WaitForEventProps = {
id: string;
event: string;
correlationId?: string;
output: OutputTarget;
outputSchema?: import("zod").ZodObject<any>;
timeoutMs?: number;
onTimeout?: "fail" | "skip" | "continue";
async?: boolean;
skipIf?: boolean;
dependsOn?: string[];
needs?: Record<string, string>;
label?: string;
meta?: Record<string, unknown>;
key?: string;
};
type TimerProps = {
id: string;
duration?: string; // e.g. "30s", "5m"
until?: string | Date; // absolute timestamp
every?: string; // periodic
skipIf?: boolean;
dependsOn?: string[];
needs?: Record<string, string>;
label?: string;
meta?: Record<string, unknown>;
key?: string;
};
type SagaStepDef = { id: string; action: React.ReactElement; compensation: React.ReactElement; label?: string };
type SagaProps = { id?: string; steps?: SagaStepDef[]; onFailure?: "compensate" | "compensate-and-fail" | "fail"; skipIf?: boolean; children?: React.ReactNode };
type SagaStepProps = { id: string; compensation: React.ReactElement; children: React.ReactElement };
type TryCatchFinallyProps = {
id?: string;
try: React.ReactElement;
catch?: React.ReactElement | ((error: SmithersError) => React.ReactElement);
catchErrors?: SmithersErrorCode[];
finally?: React.ReactElement;
skipIf?: boolean;
};
// Higher-level composites
type PollerProps = {
id?: string;
check: AgentLike | ((...args: any[]) => any);
checkOutput: OutputTarget;
maxAttempts?: number;
backoff?: "fixed" | "linear" | "exponential";
intervalMs?: number;
onTimeout?: "fail" | "return-last";
skipIf?: boolean;
children?: React.ReactNode;
};
type ColumnDef = {
name: string;
agent: AgentLike;
output: OutputTarget;
prompt?: (ctx: { item: unknown; column: string }) => string;
task?: Partial<TaskProps<unknown>>;
};
type KanbanProps = {
id?: string;
columns: ColumnDef[];
useTickets: () => Array<{ id: string; [key: string]: unknown }>;
agents?: Record<string, AgentLike>;
maxConcurrency?: number;
onComplete?: OutputTarget;
until?: boolean;
maxIterations?: number;
skipIf?: boolean;
children?: React.ReactNode | Record<string, unknown>;
};
// Sandbox
type SandboxRuntime = "bubblewrap" | "docker" | "codeplane";
type SandboxVolumeMount = { host: string; container: string; readonly?: boolean };
type SandboxWorkspaceSpec = {
name: string;
snapshotId?: string;
idleTimeoutSecs?: number;
persistence?: "ephemeral" | "sticky";
};
type SandboxProps = {
id: string;
workflow?: (...args: any[]) => any;
input?: unknown;
output: OutputTarget;
runtime?: SandboxRuntime;
allowNetwork?: boolean;
reviewDiffs?: boolean;
autoAcceptDiffs?: boolean;
image?: string;
env?: Record<string, string>;
ports?: Array<{ host: number; container: number }>;
volumes?: SandboxVolumeMount[];
memoryLimit?: string;
cpuLimit?: string;
command?: string;
workspace?: SandboxWorkspaceSpec;
skipIf?: boolean;
timeoutMs?: number;
heartbeatTimeoutMs?: number;
retries?: number;
retryPolicy?: RetryPolicy;
continueOnFail?: boolean;
cache?: CachePolicy;
dependsOn?: string[];
needs?: Record<string, string>;
label?: string;
meta?: Record<string, unknown>;
key?: string;
children?: React.ReactNode;
};
// =============================================================================
// Errors
// =============================================================================
//
// Every Smithers error is a SmithersError with a typed code. See the Errors page
// for the full list of built-in codes.
declare class SmithersError extends Error {
readonly code: SmithersErrorCode;
readonly summary: string;
readonly docsUrl: string;
readonly details?: Record<string, unknown>;
readonly cause?: unknown;
}
type SmithersErrorCode = KnownSmithersErrorCode | (string & {});
type KnownSmithersErrorCode =
| "INVALID_INPUT" | "MISSING_INPUT" | "MISSING_INPUT_TABLE" | "RESUME_METADATA_MISMATCH"
| "UNKNOWN_OUTPUT_SCHEMA" | "INVALID_OUTPUT" | "WORKTREE_CREATE_FAILED" | "VCS_NOT_FOUND"
| "SNAPSHOT_NOT_FOUND" | "VCS_WORKSPACE_CREATE_FAILED" | "TASK_TIMEOUT" | "TASK_ABORTED"
| "RUN_NOT_FOUND" | "NODE_NOT_FOUND" | "UI_COMMAND_FAILED" | "INVALID_EVENTS_OPTIONS"
| "SANDBOX_BUNDLE_INVALID" | "SANDBOX_BUNDLE_TOO_LARGE" | "WORKFLOW_EXECUTION_FAILED"
| "SANDBOX_EXECUTION_FAILED" | "TASK_HEARTBEAT_TIMEOUT" | "HEARTBEAT_PAYLOAD_TOO_LARGE"
| "HEARTBEAT_PAYLOAD_NOT_JSON_SERIALIZABLE" | "RUN_CANCELLED" | "RUN_NOT_RESUMABLE"
| "RUN_OWNER_ALIVE" | "RUN_STILL_RUNNING" | "RUN_RESUME_CLAIM_LOST" | "RUN_RESUME_CLAIM_FAILED"
| "RUN_RESUME_ACTIVATION_FAILED" | "RUN_HIJACKED" | "CONTINUATION_STATE_TOO_LARGE"
| "INVALID_CONTINUATION_STATE" | "RALPH_MAX_REACHED" | "SCHEDULER_ERROR" | "SESSION_ERROR"
| "TASK_ID_REQUIRED" | "TASK_MISSING_OUTPUT" | "DUPLICATE_ID" | "NESTED_LOOP"
| "WORKTREE_EMPTY_PATH" | "MDX_PRELOAD_INACTIVE" | "CONTEXT_OUTSIDE_WORKFLOW"
| "MISSING_OUTPUT" | "DEP_NOT_SATISFIED" | "ASPECT_BUDGET_EXCEEDED" | "APPROVAL_OUTSIDE_TASK"
| "APPROVAL_OPTIONS_REQUIRED" | "WORKFLOW_MISSING_DEFAULT"
| "TOOL_PATH_INVALID" | "TOOL_PATH_ESCAPE" | "TOOL_FILE_TOO_LARGE" | "TOOL_CONTENT_TOO_LARGE"
| "TOOL_PATCH_TOO_LARGE" | "TOOL_PATCH_FAILED" | "TOOL_NETWORK_DISABLED"
| "TOOL_GIT_REMOTE_DISABLED" | "TOOL_COMMAND_FAILED" | "TOOL_GREP_FAILED"
| "AGENT_CLI_ERROR" | "AGENT_RPC_FILE_ARGS" | "AGENT_BUILD_COMMAND" | "AGENT_DIAGNOSTIC_TIMEOUT"
| "DB_MISSING_COLUMNS" | "DB_REQUIRES_BUN_SQLITE" | "DB_QUERY_FAILED" | "DB_WRITE_FAILED"
| "STORAGE_ERROR" | "INTERNAL_ERROR" | "PROCESS_ABORTED" | "PROCESS_TIMEOUT"
| "PROCESS_IDLE_TIMEOUT" | "PROCESS_SPAWN_FAILED" | "TASK_RUNTIME_UNAVAILABLE"
| "SCHEMA_CHANGE_HOT" | "HOT_OVERLAY_FAILED" | "HOT_RELOAD_INVALID_MODULE"
| "SCORER_FAILED" | "WORKFLOW_EXISTS" | "PROMPT_EXISTS" | "PROMPT_MDX_INVALID"
| "TICKET_EXISTS" | "TICKET_NOT_FOUND" | "CLI_DB_NOT_FOUND" | "CLI_AGENT_UNSUPPORTED"
| "PI_HTTP_ERROR" | "EXTERNAL_BUILD_FAILED" | "SCHEMA_DISCOVERY_FAILED"
| "OPENAPI_SPEC_LOAD_FAILED" | "OPENAPI_OPERATION_NOT_FOUND" | "OPENAPI_TOOL_EXECUTION_FAILED";
// =============================================================================
// Server
// =============================================================================
type ServerOptions = {
port?: number;
db?: unknown;
authToken?: string;
maxBodyBytes?: number;
rootDir?: string;
allowNetwork?: boolean;
headersTimeout?: number;
requestTimeout?: number;
};
type ServeOptions = {
workflow: SmithersWorkflow<any>;
adapter: any;
runId: string;
abort: AbortController;
authToken?: string;
metrics?: boolean;
};
type GatewayTokenGrant = { role: string; scopes: string[]; userId?: string };
type GatewayAuthConfig =
| { mode: "token"; tokens: Record<string, GatewayTokenGrant> }
| { mode: "jwt"; issuer: string; audience: string | string[]; secret: string;
scopesClaim?: string; roleClaim?: string; userClaim?: string;
defaultRole?: string; defaultScopes?: string[]; clockSkewSeconds?: number }
| { mode: "trusted-proxy"; trustedHeaders?: string[]; allowedOrigins?: string[];
defaultRole?: string; defaultScopes?: string[] };
type GatewayOptions = {
protocol?: number;
features?: string[];
heartbeatMs?: number;
auth?: GatewayAuthConfig;
defaults?: { cliAgentTools?: "all" | "explicit-only" };
maxBodyBytes?: number;
maxPayload?: number;
maxConnections?: number;
eventWindowSize?: number;
headersTimeout?: number;
requestTimeout?: number;
};
// =============================================================================
// Scorers (smithers-orchestrator/scorers)
// =============================================================================
type ScoreResult = { score: number; reason?: string; meta?: Record<string, unknown> };
type ScorerInput = { input: unknown; output: unknown; groundTruth?: unknown; context?: unknown; latencyMs?: number; outputSchema?: import("zod").ZodObject<any> };
type ScorerFn = (input: ScorerInput) => Promise<ScoreResult>;
type Scorer = { id: string; name: string; description: string; score: ScorerFn };
type SamplingConfig =
| { type: "all" }
| { type: "ratio"; rate: number }
| { type: "none" };
type ScorerBinding = { scorer: Scorer; sampling?: SamplingConfig };
type ScorersMap = Record<string, ScorerBinding>;
type LlmJudgeConfig = { model: string; systemPrompt?: string; temperature?: number; maxTokens?: number };
type CreateScorerConfig = {
id: string;
name: string;
description: string;
model: string;
criteria: string;
examples?: Array<{ input: unknown; output: unknown; score: number; explanation: string }>;
};
// =============================================================================
// Memory (smithers-orchestrator/memory)
// =============================================================================
type MemoryFact = { namespace: string; key: string; valueJson: string; schemaSig?: string | null; createdAtMs: number; updatedAtMs: number; ttlMs?: number | null };
type MemoryMessage = { id: string; threadId: string; role: string; contentJson: string; runId?: string | null; nodeId?: string | null; createdAtMs: number };
type MemoryThread = { threadId: string; namespace: string; title?: string | null; metadataJson?: string | null; createdAtMs: number; updatedAtMs: number };
type MemoryStore = {
getFact(ns: MemoryNamespace, key: string): Promise<MemoryFact | undefined>;
setFact(ns: MemoryNamespace, key: string, value: unknown, ttlMs?: number): Promise<void>;
deleteFact(ns: MemoryNamespace, key: string): Promise<void>;
listFacts(ns: MemoryNamespace): Promise<MemoryFact[]>;
createThread(ns: MemoryNamespace, title?: string): Promise<MemoryThread>;
getThread(threadId: string): Promise<MemoryThread | undefined>;
deleteThread(threadId: string): Promise<void>;
saveMessage(msg: Omit<MemoryMessage, "createdAtMs"> & { createdAtMs?: number }): Promise<void>;
listMessages(threadId: string, limit?: number): Promise<MemoryMessage[]>;
countMessages(threadId: string): Promise<number>;
deleteExpiredFacts(): Promise<number>;
getFactEffect(ns: MemoryNamespace, key: string): Effect.Effect<MemoryFact | undefined, SmithersError>;
setFactEffect(ns: MemoryNamespace, key: string, value: unknown, ttlMs?: number): Effect.Effect<void, SmithersError>;
deleteFactEffect(ns: MemoryNamespace, key: string): Effect.Effect<void, SmithersError>;
listFactsEffect(ns: MemoryNamespace): Effect.Effect<MemoryFact[], SmithersError>;
createThreadEffect(ns: MemoryNamespace, title?: string): Effect.Effect<MemoryThread, SmithersError>;
getThreadEffect(threadId: string): Effect.Effect<MemoryThread | undefined, SmithersError>;
deleteThreadEffect(threadId: string): Effect.Effect<void, SmithersError>;
saveMessageEffect(msg: Omit<MemoryMessage, "createdAtMs"> & { createdAtMs?: number }): Effect.Effect<void, SmithersError>;
listMessagesEffect(threadId: string, limit?: number): Effect.Effect<MemoryMessage[], SmithersError>;
countMessagesEffect(threadId: string): Effect.Effect<number, SmithersError>;
deleteExpiredFactsEffect(): Effect.Effect<number, SmithersError>;
};
// =============================================================================
// OpenAPI tools (smithers-orchestrator/openapi)
// =============================================================================
type OpenApiAuth =
| { type: "apiKey"; name: string; in: "header" | "query"; value: string }
| { type: "bearer"; token: string }
| { type: "basic"; username: string; password: string };
type OpenApiToolsOptions = {
baseUrl?: string;
headers?: Record<string, string>;
auth?: OpenApiAuth;
include?: string[];
exclude?: string[];
namePrefix?: string;
};
// =============================================================================
// CreateSmithers (createSmithers(...) return)
// =============================================================================
type CreateSmithersApi<Schema = any> = {
Workflow: (props: WorkflowProps) => React.ReactElement;
Approval: <Row>(props: ApprovalProps<Row>) => React.ReactElement;
Task: <Row, D extends DepsSpec = {}>(props: TaskProps<Row, any, D>) => React.ReactElement;
Sequence: (props: SequenceProps) => React.ReactElement;
Parallel: (props: ParallelProps) => React.ReactElement;
Branch: (props: BranchProps) => React.ReactElement;
Loop: (props: LoopProps) => React.ReactElement;
Ralph: (props: LoopProps) => React.ReactElement;
Worktree: any;
Sandbox: (props: SandboxProps) => React.ReactElement;
Signal: <S extends import("zod").ZodObject<any>>(props: SignalProps<S>) => React.ReactElement;
Timer: (props: TimerProps) => React.ReactElement;
ContinueAsNew: any;
continueAsNew: any;
useCtx: () => SmithersCtx<Schema>;
smithers: (build: (ctx: SmithersCtx<Schema>) => React.ReactElement, opts?: SmithersWorkflowOptions) => SmithersWorkflow<Schema>;
db: any;
tables: Record<string, any>;
outputs: Record<string, any>;
};
// =============================================================================
// Observability (smithers-orchestrator/observability)
// =============================================================================
type SmithersLogFormat = "json" | "pretty";
type SmithersObservabilityService = { emit(event: SmithersEvent): void | Promise<void> };
type SmithersObservabilityOptions = { service?: SmithersObservabilityService; logFormat?: SmithersLogFormat };
type ResolvedSmithersObservabilityOptions = SmithersObservabilityOptions & { metricsPort?: number; metricsPath?: string };
smithers-orchestrator and use editor go-to-definition. For runtime errors, see Errors.