defineHook()
Creates a type-safe hook helper that ensures the payload type is consistent between hook creation and resumption.
This is a lightweight wrapper around createHook() and resumeHook() to avoid type mismatches.
We recommend using defineHook() over createHook() in production codebases for better type safety.
import { defineHook } from "workflow";
const nameHook = defineHook<{
  name: string;
}>();
export async function nameWorkflow() {
  "use workflow";
  const hook = nameHook.create();  
  const result = await hook; // Fully typed as { name: string }
  console.log('Name:', result.name);
}API Signature
Parameters
This function does not accept any parameters.
Returns
| Name | Type | Description | 
|---|---|---|
| create | (options?: any) => Hook<T> | Creates a new hook with the defined payload type. | 
| resume | (token: string, payload: T) => Promise<any> | Resumes a hook by sending a payload with the defined type. | 
Examples
Type-Safe Hook Definition
By defining the hook once with a specific payload type, you can reuse it in multiple workflows and API routes with automatic type safety.
import { defineHook } from "workflow";
// Define once with a specific payload type
const approvalHook = defineHook<{ 
  approved: boolean; 
  comment: string; 
}>(); 
// In your workflow
export async function workflowWithApproval() {
  "use workflow";
  const hook = approvalHook.create();
  const result = await hook; // Fully typed as { approved: boolean; comment: string }
  console.log('Approved:', result.approved);
  console.log('Comment:', result.comment);
}Resuming with Type Safety
Hooks can be resumed using the same defined hook and a token. By using the same hook, you can ensure that the payload matches the defined type when resuming a hook.
// Use the same defined hook to resume
export async function POST(request: Request) {
  const { token, approved, comment } = await request.json();
  // Type-safe resumption - TypeScript ensures the payload matches
  const result = await approvalHook.resume(token, { 
    approved, 
    comment, 
  }); 
  if (!result) {
    return Response.json({ error: 'Hook not found' }, { status: 404 });
  }
  return Response.json({ success: true, runId: result.runId });
}Customizing Tokens
Tokens are used to identify a specific hook and for resuming a hook. You can customize the token to be more specific to a use case.
const slackHook = defineHook<{ text: string; userId: string }>();
export async function slackBotWorkflow(channelId: string) {
  "use workflow";
  const hook = slackHook.create({
    token: `slack:${channelId}`, 
  });
  const message = await hook;
  console.log(`Message from ${message.userId}: ${message.text}`);
}Related Functions
-  createHook()- Create a hook in a workflow.
-  resumeHook()- Resume a hook with a payload.