Files
boocode/packages/ion/src/engine/deps.ts
indifferentketchup 02063072ab chore: add ion package, codesight wiki, work plans, ascli config
New @boocode/ion package (v0.0.1) for inference optimization network.
.codesight/ wiki artifacts for codebase documentation.
.omo/ work plans for openspec cleanup and enhanced file panel.
2026-06-07 22:16:45 +00:00

199 lines
6.3 KiB
TypeScript

/**
* Dependency injection interfaces for the Ion workflow engine.
*
* These interfaces define the contracts that the engine requires from its
* runtime environment. Concrete implementations are provided by the
* platform layer (CLI, server, etc.).
*/
// ---------------------------------------------------------------------------
// Workflow platform — messaging back to the conversation channel
// ---------------------------------------------------------------------------
export interface IWorkflowPlatform {
/** Send a text message to the conversation channel. */
sendMessage(
conversationId: string,
message: string,
metadata?: Record<string, unknown>,
): Promise<void>;
/** Whether the platform supports streaming responses. */
getStreamingMode(): boolean;
/** Optional structured event emission (e.g. approval requests). */
sendStructuredEvent?(
conversationId: string,
event: Record<string, unknown>,
): Promise<void>;
}
// ---------------------------------------------------------------------------
// Workflow configuration — per-workflow settings
// ---------------------------------------------------------------------------
/** Configuration for a single AI provider. */
export interface ProviderConfig {
/** Provider identifier (e.g. "openai", "anthropic"). */
provider: string;
/** Model name (e.g. "gpt-4o", "claude-sonnet-4-20250514"). */
model?: string;
/** Additional provider-specific options. */
options?: Record<string, unknown>;
}
/** Folder-level command configuration. */
export interface CommandFolderConfig {
/** Path to the commands folder. */
path: string;
/** Whether commands are enabled by default. */
enabled?: boolean;
}
export interface WorkflowConfig {
/** Default assistant identifier. */
assistant: string;
/** Named provider configurations keyed by provider id. */
assistants: Record<string, ProviderConfig>;
/** Environment variables available to the workflow. */
envVars: Record<string, string>;
/** Command folder configuration. */
commands: CommandFolderConfig;
/** Base git branch for the workflow (optional). */
baseBranch?: string;
/** Path to documentation directory (optional). */
docsPath?: string;
}
// ---------------------------------------------------------------------------
// Workflow store — persistence interface (will move to store/ later)
// ---------------------------------------------------------------------------
/** Minimal data required to create a workflow run. */
export interface CreateWorkflowRunData {
workflowPath: string;
workflowName: string;
trigger: string;
input: Record<string, unknown>;
}
/** Status of a workflow run. */
export type WorkflowRunStatus =
| 'pending'
| 'running'
| 'completed'
| 'failed'
| 'cancelled';
/** A persisted workflow run record. */
export interface WorkflowRun {
id: string;
workflowPath: string;
workflowName: string;
status: WorkflowRunStatus;
trigger: string;
input: Record<string, unknown>;
output?: Record<string, unknown>;
error?: string;
createdAt: Date;
updatedAt: Date;
}
/** A single event within a workflow run (node start/complete/etc.). */
export interface WorkflowEvent {
id: string;
runId: string;
nodeId?: string;
type: string;
data: Record<string, unknown>;
createdAt: Date;
}
export interface IWorkflowStore {
// -- Run lifecycle -------------------------------------------------------
/** Create a new workflow run. */
createWorkflowRun(data: CreateWorkflowRunData): Promise<WorkflowRun>;
/** Retrieve a workflow run by id. */
getWorkflowRun(id: string): Promise<WorkflowRun | null>;
/** Update a workflow run. */
updateWorkflowRun(
id: string,
data: Partial<WorkflowRun>,
): Promise<WorkflowRun>;
/** Mark a workflow run as failed. */
failWorkflowRun(id: string, error: string): Promise<WorkflowRun>;
/** Get the current status of a workflow run. */
getWorkflowRunStatus(id: string): Promise<WorkflowRunStatus | null>;
// -- Events --------------------------------------------------------------
/** Record a workflow event. */
createWorkflowEvent(event: Omit<WorkflowEvent, 'id' | 'createdAt'>): Promise<WorkflowEvent>;
/** Get completed DAG node outputs for a run. */
getCompletedDagNodeOutputs(
runId: string,
): Promise<Record<string, Record<string, unknown>>>;
// -- Active runs ---------------------------------------------------------
/** Find an active (non-terminal) run for a given workflow path. */
getActiveWorkflowRunByPath(
path: string,
opts?: { excludeId?: string },
): Promise<WorkflowRun | null>;
// -- Codebase ------------------------------------------------------------
/** Get a codebase record by id. */
getCodebase(id: string): Promise<Record<string, unknown> | null>;
/** Get environment variables for a codebase. */
getCodebaseEnvVars(id: string): Promise<Record<string, string>>;
// -- Resumption ----------------------------------------------------------
/** Resume a paused workflow run. */
resumeWorkflowRun(id: string): Promise<WorkflowRun>;
}
// ---------------------------------------------------------------------------
// Agent provider — creates AI agent instances
// ---------------------------------------------------------------------------
export interface IAgentProvider {
/** Provider identifier. */
readonly providerId: string;
/** Send a prompt and return the response. */
sendPrompt(prompt: string, options?: Record<string, unknown>): Promise<string>;
}
// ---------------------------------------------------------------------------
// Workflow dependencies — the full DI container
// ---------------------------------------------------------------------------
export interface WorkflowDeps {
/** Persistence store. */
store: IWorkflowStore;
/** Load workflow config from a working directory. */
loadConfig(cwd: string): Promise<WorkflowConfig>;
/** Get an agent provider by its provider id. */
getAgentProvider(providerId: string): IAgentProvider;
/** Resolve a bot-level GitHub token (optional). */
resolveBotGitHubToken?(): Promise<string | undefined>;
/** Get the user-level GitHub token (optional). */
getUserGithubToken?(): Promise<string | undefined>;
/** Whether per-user GitHub token resolution is enabled (optional). */
isPerUserGitHubEnabled?(): boolean;
}