Documentation / @agentick/kernel / Procedure
Interface: Procedure()<THandler, TPassThrough>
Defined in: kernel/src/procedure.ts:572
A callable function wrapper with middleware, validation, and execution control.
Procedures are the core execution primitive in Agentick. They wrap any async function and provide:
- Middleware pipeline - Transform args, intercept results, handle errors
- Schema validation - Zod-based input validation
- Execution handles - Every call returns ExecutionHandle for control
- Automatic tracking - Every call is tracked in the procedure graph
- Composition - Chain procedures with
.pipe()
Procedures return ProcedurePromise wrapping ExecutionHandle (AsyncIterable):
await proc(args)→ ExecutionHandle (status, abort, streaming)await proc(args).result→ the final valuefor await (const event of await proc(args))→ streams events
Examples
const greet = createProcedure(async (name: string) => `Hello, ${name}!`);
const handle = await greet('World');
const result = await handle.result; // 'Hello, World!'const handle = await proc(input);
for await (const event of handle) {
console.log('Event:', event);
}const handle = proc(input);
console.log('Status:', handle.status); // 'running'
handle.abort('cancelled');const proc = createProcedure(async (x: number) => x * 2)
.use(loggingMiddleware)
.use(timingMiddleware);See
- createProcedure - Create a new procedure
- Middleware - Middleware function type
- ExecutionHandle - Handle for execution control
Type Parameters
THandler
THandler extends (...args) => any
The function type being wrapped
TPassThrough
TPassThrough extends boolean = false
Procedure(...
args):TPassThroughextendstrue?ProcedurePromise<ExtractReturn<THandler>> :ProcedurePromise<ExecutionHandle<ExtractReturn<THandler>,any>>
Defined in: kernel/src/procedure.ts:584
Call the procedure directly. Returns ProcedurePromise — supports .result chaining in all modes.
Usage:
await proc()→ ExecutionHandle (or T in passthrough mode)await proc().result→ T (the final value)
Parameters
args
...ExtractArgs<THandler>
Returns
TPassThrough extends true ? ProcedurePromise<ExtractReturn<THandler>> : ProcedurePromise<ExecutionHandle<ExtractReturn<THandler>, any>>
Methods
exec()
exec(...
args):TPassThroughextendstrue?ProcedurePromise<ExtractReturn<THandler>> :ProcedurePromise<ExecutionHandle<ExtractReturn<THandler>,any>>
Defined in: kernel/src/procedure.ts:594
Execute the procedure with explicit arguments. Equivalent to direct call.
Parameters
args
...ExtractArgs<THandler>
Returns
TPassThrough extends true ? ProcedurePromise<ExtractReturn<THandler>> : ProcedurePromise<ExecutionHandle<ExtractReturn<THandler>, any>>
pipe()
pipe<
TNext>(next):Procedure<(...args) =>Promise<ExtractReturn<TNext>>,TPassThrough>
Defined in: kernel/src/procedure.ts:667
Pipe the output of this procedure to another procedure. Creates a new procedure that runs this procedure, then passes its result to the next.
Type Parameters
TNext
TNext extends (arg) => any
Parameters
next
Procedure<TNext>
Returns
Procedure<(...args) => Promise<ExtractReturn<TNext>>, TPassThrough>
Example
const parse = createProcedure(async (input: string) => JSON.parse(input));
const validate = createProcedure(async (data: object) => schema.parse(data));
const transform = createProcedure(async (valid: Valid) => transform(valid));
const pipeline = parse.pipe(validate).pipe(transform);
const result = await pipeline('{"name": "test"}');use()
Call Signature
use(...
middleware):Procedure<THandler,TPassThrough>
Defined in: kernel/src/procedure.ts:605
Add middleware to the procedure. Returns a new Procedure (immutable). Typed overload preserves IntelliSense for inline middleware. Generic overload accepts pre-built middleware (guards, logging, etc.).
Parameters
middleware
...(MiddlewarePipeline | Middleware<ExtractArgs<THandler>>)[]
Returns
Procedure<THandler, TPassThrough>
Call Signature
use(...
middleware):Procedure<THandler,TPassThrough>
Defined in: kernel/src/procedure.ts:608
Parameters
middleware
...(Middleware<any[]> | MiddlewarePipeline)[]
Returns
Procedure<THandler, TPassThrough>
withContext()
withContext(
ctx):Procedure<THandler,TPassThrough>
Defined in: kernel/src/procedure.ts:614
Create a procedure variant with merged context. Returns a new Procedure.
Parameters
ctx
Partial<KernelContext>
Partial context to merge with the current context
Returns
Procedure<THandler, TPassThrough>
withMetadata()
withMetadata(
metadata):Procedure<THandler,TPassThrough>
Defined in: kernel/src/procedure.ts:651
Create a procedure variant with merged metadata. Returns a new Procedure. Metadata is passed to ExecutionTracker and included in procedure events. Useful for passing model IDs, tool names, or other execution-specific info.
Parameters
metadata
Record<string, unknown>
Metadata to merge with existing procedure metadata
Returns
Procedure<THandler, TPassThrough>
Example
// Model adapter passes model info
const result = await model.generate
.withMetadata({ modelId: 'gpt-4o', provider: 'openai' })
.exec(messages);
// Tool passes tool info
const result = await tool.execute
.withMetadata({ toolName: 'search', toolId: 'search-v2' })
.exec(input);withMiddleware()
withMiddleware(
mw):Procedure<THandler,TPassThrough>
Defined in: kernel/src/procedure.ts:620
Add a single middleware. Returns a new Procedure. Convenience method equivalent to .use(mw).
Parameters
mw
Middleware<any[]> | MiddlewarePipeline | Middleware<ExtractArgs<THandler>>
Returns
Procedure<THandler, TPassThrough>
withTimeout()
withTimeout(
ms):Procedure<THandler,TPassThrough>
Defined in: kernel/src/procedure.ts:629
Create a procedure variant with a timeout. Returns a new Procedure. Throws AbortError.timeout() if the timeout is exceeded.
Parameters
ms
number
Timeout in milliseconds
Returns
Procedure<THandler, TPassThrough>