/** * Host-neutral application service for v3 Saved Workflows. * * The schema/store/materializer modules own persistence and execution * contracts. This layer adds the user-context rules shared by future CLI, * IM, and dashboard adapters: source-run ownership, chat/global visibility, * explicit name ambiguity, owner-only revision updates, and published-only * instantiation. It has no daemon/session-store dependency; hosts pass the * already-authenticated actor + chat context in. */ import type { BotConfig } from '../../bot-registry.js'; import type { RawParamInput } from '../shared/params.js'; import { type MaterializedSavedWorkflowRun } from './library-materialize.js'; import { type SavedWorkflowMetadata, type SavedWorkflowOwner } from './library-schema.js'; import { loadCurrentSavedWorkflow, type SavedWorkflowListResult, type SavedWorkflowWriteResult } from './library-store.js'; import { type LoadedAuthorizedV3Run } from './run-envelope.js'; export interface SavedWorkflowActorContext { actor: SavedWorkflowOwner; /** Current invocation chat. Optional for a global-only list/resolve. */ chatId?: string; chatType?: 'group' | 'p2p'; rootMessageId?: string; sessionId?: string; } export type SavedWorkflowServiceErrorCode = 'invalid_context' | 'source_not_owned' | 'scope_mismatch' | 'not_found' | 'ambiguous' | 'not_published'; export declare class SavedWorkflowServiceError extends Error { readonly code: SavedWorkflowServiceErrorCode; readonly matches: SavedWorkflowMetadata[]; constructor(code: SavedWorkflowServiceErrorCode, message: string, matches?: SavedWorkflowMetadata[]); } interface SaveTerminalRunBase { dataDir: string; runDir: string; context: SavedWorkflowActorContext; /** Failed/blocked sources are draft-only and require this explicit opt-in. */ allowDraft?: boolean; acknowledgeUnsafeLiterals?: boolean; now?: Date; } export interface SaveTerminalRunAsNewWorkflowInput extends SaveTerminalRunBase { workflowId?: never; displayName?: string; aliases?: string[]; /** Defaults to the current chat. Global publication must be explicit. */ scope?: 'chat' | 'global'; } export interface AppendTerminalRunToWorkflowInput extends SaveTerminalRunBase { /** Supplying an id always means append; it never creates implicitly. */ workflowId: string; expectedLatestRevision?: string; displayName?: never; aliases?: never; scope?: never; } export type SaveTerminalRunAsWorkflowInput = SaveTerminalRunAsNewWorkflowInput | AppendTerminalRunToWorkflowInput; export type SaveTerminalRunAsWorkflowIdempotentInput = Omit & { allowDraft?: never; }; export interface SaveTerminalRunAsWorkflowResult extends SavedWorkflowWriteResult { sourceStatus: 'succeeded' | 'failed' | 'blocked'; created: boolean; } /** * Stable identity for the default "save this completed run" action. Scope and * display name are intentionally excluded: the first valid save wins, so a * retried command/card callback can never fork duplicate definitions. */ export declare function savedWorkflowIdForSourceRun(loaded: LoadedAuthorizedV3Run): string; export interface ListVisibleSavedWorkflowsInput { dataDir: string; context: SavedWorkflowActorContext; includeArchived?: boolean; includeDrafts?: boolean; } export interface ResolveVisibleSavedWorkflowInput extends ListVisibleSavedWorkflowsInput { ref: string; } export interface InstantiatePublishedSavedWorkflowInput { dataDir: string; ref: string; context: SavedWorkflowActorContext; rawParams?: Record; bots: BotConfig[]; baseDir: string; runId?: string; now?: Date; } export interface ResolveOwnedTerminalRunInput { baseDir: string; source: 'last' | string; context: SavedWorkflowActorContext; } /** Resolve `last` within the authenticated actor+chat scope, never globally. */ export declare function resolveOwnedTerminalRunDir(input: ResolveOwnedTerminalRunInput): Promise; /** * Save a terminal run exactly as executed. * * There is deliberately no literal-to-parameter inference here. Ad-hoc runs * become zero-parameter definitions. When the source itself came from a saved * definition, its already-explicit input/context declarations are preserved * from the integrity-pinned definition snapshot. */ export declare function saveTerminalRunAsWorkflow(input: SaveTerminalRunAsWorkflowInput): Promise; /** * Card callbacks can be delivered or clicked more than once. This dedicated * seam gives that surface stable source-run idempotency without changing the * existing `/workflow save` command semantics (which may intentionally create * another definition with a different name/scope). */ export declare function saveTerminalRunAsWorkflowIdempotent(input: SaveTerminalRunAsWorkflowIdempotentInput): Promise; /** List the current chat's workflows plus global workflows. */ export declare function listVisibleSavedWorkflows(input: ListVisibleSavedWorkflowsInput): Promise; /** * Resolve a visible id/name/alias. Exact workflowId wins; names never silently * prefer chat over global, so a collision is returned as an explicit error. */ export declare function resolveVisibleSavedWorkflow(input: ResolveVisibleSavedWorkflowInput): Promise; /** Resolve and re-check visibility after the second metadata/revision read. */ export declare function loadVisibleSavedWorkflow(input: ResolveVisibleSavedWorkflowInput, deps?: { resolveVisible?: typeof resolveVisibleSavedWorkflow; loadCurrent?: typeof loadCurrentSavedWorkflow; }): Promise; /** Resolve the active revision and atomically materialize a fresh authorized run. */ export declare function instantiatePublishedSavedWorkflow(input: InstantiatePublishedSavedWorkflowInput): Promise; export {}; //# sourceMappingURL=library-service.d.ts.map