@temporal-contract/client 0.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n/**\n * Base class for all typed client errors with boxed pattern\n */\nabstract class TypedClientError extends Error {\n protected constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Generic runtime failure wrapper when no specific error type applies\n */\nexport class RuntimeClientError extends TypedClientError {\n constructor(\n public readonly operation: string,\n public override readonly cause?: unknown,\n ) {\n super(\n `Operation \"${operation}\" failed: ${\n cause instanceof Error ? cause.message : String(cause ?? \"unknown error\")\n }`,\n );\n }\n}\n\n/**\n * Thrown when a workflow is not found in the contract\n */\nexport class WorkflowNotFoundError extends TypedClientError {\n constructor(\n public readonly workflowName: string,\n public readonly availableWorkflows: string[],\n ) {\n super(\n `Workflow \"${workflowName}\" not found in contract. Available workflows: ${availableWorkflows.join(\", \")}`,\n );\n }\n}\n\n/**\n * Thrown when workflow input or output validation fails\n */\nexport class WorkflowValidationError extends TypedClientError {\n constructor(\n public readonly workflowName: string,\n public readonly direction: \"input\" | \"output\",\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(\n `Validation failed for workflow \"${workflowName}\" ${direction}: ${JSON.stringify(issues)}`,\n );\n }\n}\n\n/**\n * Thrown when query input or output validation fails\n */\nexport class QueryValidationError extends TypedClientError {\n constructor(\n public readonly queryName: string,\n public readonly direction: \"input\" | \"output\",\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(`Validation failed for query \"${queryName}\" ${direction}: ${JSON.stringify(issues)}`);\n }\n}\n\n/**\n * Thrown when signal input validation fails\n */\nexport class SignalValidationError extends TypedClientError {\n constructor(\n public readonly signalName: string,\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(`Validation failed for signal \"${signalName}\": ${JSON.stringify(issues)}`);\n }\n}\n\n/**\n * Thrown when update input or output validation fails\n */\nexport class UpdateValidationError extends TypedClientError {\n constructor(\n public readonly updateName: string,\n public readonly direction: \"input\" | \"output\",\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(`Validation failed for update \"${updateName}\" ${direction}: ${JSON.stringify(issues)}`);\n }\n}\n","import { Client, WorkflowHandle } from \"@temporalio/client\";\nimport type { WorkflowStartOptions } from \"@temporalio/client\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ContractDefinition,\n WorkflowDefinition,\n QueryDefinition,\n SignalDefinition,\n UpdateDefinition,\n} from \"@temporal-contract/contract\";\nimport type {\n ClientInferInput,\n ClientInferOutput,\n ClientInferWorkflowQueries,\n ClientInferWorkflowSignals,\n ClientInferWorkflowUpdates,\n} from \"./types.js\";\nimport { Future, Result } from \"@swan-io/boxed\";\nimport {\n WorkflowNotFoundError,\n WorkflowValidationError,\n QueryValidationError,\n SignalValidationError,\n UpdateValidationError,\n RuntimeClientError,\n} from \"./errors.js\";\n\nexport type TypedWorkflowStartOptions<\n TContract extends ContractDefinition,\n TWorkflowName extends keyof TContract[\"workflows\"],\n> = Omit<WorkflowStartOptions, \"taskQueue\" | \"args\"> & {\n args: ClientInferInput<TContract[\"workflows\"][TWorkflowName]>;\n};\n\n/**\n * Typed workflow handle with validated results using Result/Future pattern\n */\nexport type TypedWorkflowHandle<TWorkflow extends WorkflowDefinition> = {\n workflowId: string;\n\n /**\n * Type-safe queries based on workflow definition with Result pattern\n * Each query returns Future<Result<T, Error>> instead of Promise<T>\n */\n queries: {\n [K in keyof ClientInferWorkflowQueries<TWorkflow>]: ClientInferWorkflowQueries<TWorkflow>[K] extends (\n ...args: infer Args\n ) => Future<Result<infer R, Error>>\n ? (...args: Args) => Future<Result<R, QueryValidationError | RuntimeClientError>>\n : never;\n };\n\n /**\n * Type-safe signals based on workflow definition with Result pattern\n * Each signal returns Future<Result<void, Error>> instead of Promise<void>\n */\n signals: {\n [K in keyof ClientInferWorkflowSignals<TWorkflow>]: ClientInferWorkflowSignals<TWorkflow>[K] extends (\n ...args: infer Args\n ) => Future<Result<void, Error>>\n ? (...args: Args) => Future<Result<void, SignalValidationError | RuntimeClientError>>\n : never;\n };\n\n /**\n * Type-safe updates based on workflow definition with Result pattern\n * Each update returns Future<Result<T, Error>> instead of Promise<T>\n */\n updates: {\n [K in keyof ClientInferWorkflowUpdates<TWorkflow>]: ClientInferWorkflowUpdates<TWorkflow>[K] extends (\n ...args: infer Args\n ) => Future<Result<infer R, Error>>\n ? (...args: Args) => Future<Result<R, UpdateValidationError | RuntimeClientError>>\n : never;\n };\n\n /**\n * Get workflow result with Result pattern\n */\n result: () => Future<\n Result<ClientInferOutput<TWorkflow>, WorkflowValidationError | RuntimeClientError>\n >;\n\n /**\n * Terminate workflow with Result pattern\n */\n terminate: (reason?: string) => Future<Result<void, RuntimeClientError>>;\n\n /**\n * Cancel workflow with Result pattern\n */\n cancel: () => Future<Result<void, RuntimeClientError>>;\n\n /**\n * Get workflow execution description including status and metadata\n */\n describe: () => Future<\n Result<Awaited<ReturnType<WorkflowHandle[\"describe\"]>>, RuntimeClientError>\n >;\n\n /**\n * Fetch the workflow execution history\n */\n fetchHistory: () => Future<\n Result<Awaited<ReturnType<WorkflowHandle[\"fetchHistory\"]>>, RuntimeClientError>\n >;\n};\n\n/**\n * Typed Temporal client with Result/Future pattern based on a contract\n *\n * Provides type-safe methods to start and execute workflows\n * defined in the contract, with explicit error handling using Result pattern.\n */\nexport class TypedClient<TContract extends ContractDefinition> {\n private constructor(\n private readonly contract: TContract,\n private readonly client: Client,\n ) {}\n\n /**\n * Create a typed Temporal client with boxed pattern from a contract\n *\n * @example\n * ```ts\n * const connection = await Connection.connect();\n * const temporalClient = new Client({ connection });\n * const client = TypedClient.create(myContract, temporalClient);\n *\n * const result = await client.executeWorkflow('processOrder', {\n * workflowId: 'order-123',\n * args: { ... },\n * });\n *\n * result.match({\n * Ok: (output) => console.log('Success:', output),\n * Error: (error) => console.error('Failed:', error),\n * });\n * ```\n */\n static create<TContract extends ContractDefinition>(\n contract: TContract,\n client: Client,\n ): TypedClient<TContract> {\n return new TypedClient(contract, client);\n }\n\n /**\n * Start a workflow and return a typed handle with Future pattern\n *\n * @example\n * ```ts\n * const handleResult = await client.startWorkflow('processOrder', {\n * workflowId: 'order-123',\n * args: { orderId: 'ORD-123' },\n * workflowExecutionTimeout: '1 day',\n * retry: { maximumAttempts: 3 },\n * });\n *\n * handleResult.match({\n * Ok: async (handle) => {\n * const result = await handle.result();\n * // ... handle result\n * },\n * Error: (error) => console.error('Failed to start:', error),\n * });\n * ```\n */\n startWorkflow<TWorkflowName extends keyof TContract[\"workflows\"]>(\n workflowName: TWorkflowName,\n { args, ...temporalOptions }: TypedWorkflowStartOptions<TContract, TWorkflowName>,\n ): Future<\n Result<\n TypedWorkflowHandle<TContract[\"workflows\"][TWorkflowName]>,\n WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError\n >\n > {\n return Future.make((resolve) => {\n (async () => {\n const definition = this.contract.workflows[workflowName as string];\n\n if (!definition) {\n return Result.Error(createWorkflowNotFoundError(workflowName, this.contract));\n }\n\n const inputResult = await definition.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return Result.Error(\n createWorkflowValidationError(workflowName, \"input\", inputResult.issues),\n );\n }\n\n const validatedInput = inputResult.value as ClientInferInput<\n TContract[\"workflows\"][TWorkflowName]\n >;\n\n // Start workflow (Temporal expects args as array, so wrap single parameter)\n try {\n const handle = await this.client.workflow.start(workflowName as string, {\n ...temporalOptions,\n taskQueue: this.contract.taskQueue,\n args: [validatedInput],\n });\n const typedHandle = this.createTypedHandle(handle, definition) as TypedWorkflowHandle<\n TContract[\"workflows\"][TWorkflowName]\n >;\n return Result.Ok(typedHandle);\n } catch (error) {\n return Result.Error(createRuntimeClientError(\"startWorkflow\", error));\n }\n })()\n .then(resolve)\n .catch((e: unknown) => resolve(Result.Error(createRuntimeClientError(\"unexpected\", e))));\n });\n }\n\n /**\n * Execute a workflow (start and wait for result) with Future/Result pattern\n *\n * @example\n * ```ts\n * const result = await client.executeWorkflow('processOrder', {\n * workflowId: 'order-123',\n * args: { orderId: 'ORD-123' },\n * workflowExecutionTimeout: '1 day',\n * retry: { maximumAttempts: 3 },\n * });\n *\n * result.match({\n * Ok: (output) => console.log('Order processed:', output.status),\n * Error: (error) => console.error('Processing failed:', error),\n * });\n * ```\n */\n executeWorkflow<TWorkflowName extends keyof TContract[\"workflows\"]>(\n workflowName: TWorkflowName,\n { args, ...temporalOptions }: TypedWorkflowStartOptions<TContract, TWorkflowName>,\n ): Future<\n Result<\n ClientInferOutput<TContract[\"workflows\"][TWorkflowName]>,\n WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError\n >\n > {\n return Future.make((resolve) => {\n (async () => {\n const definition = this.contract.workflows[workflowName as string];\n\n if (!definition) {\n return Result.Error(createWorkflowNotFoundError(workflowName, this.contract));\n }\n\n const inputResult = await definition.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return Result.Error(\n createWorkflowValidationError(workflowName, \"input\", inputResult.issues),\n );\n }\n\n const validatedInput = inputResult.value as ClientInferInput<\n TContract[\"workflows\"][TWorkflowName]\n >;\n\n // Execute workflow (Temporal expects args as array, so wrap single parameter)\n try {\n const result = await this.client.workflow.execute(workflowName as string, {\n ...temporalOptions,\n taskQueue: this.contract.taskQueue,\n args: [validatedInput],\n });\n\n // Validate output with Standard Schema\n const outputResult = await definition.output[\"~standard\"].validate(result);\n if (outputResult.issues) {\n return Result.Error(\n createWorkflowValidationError(workflowName, \"output\", outputResult.issues),\n );\n }\n\n return Result.Ok(\n outputResult.value as ClientInferOutput<TContract[\"workflows\"][TWorkflowName]>,\n );\n } catch (error) {\n return Result.Error(createRuntimeClientError(\"executeWorkflow\", error));\n }\n })()\n .then(resolve)\n .catch((e: unknown) => resolve(Result.Error(createRuntimeClientError(\"unexpected\", e))));\n });\n }\n\n /**\n * Get a handle to an existing workflow with Future/Result pattern\n *\n * @example\n * ```ts\n * const handleResult = await client.getHandle('processOrder', 'order-123');\n * handleResult.match({\n * Ok: async (handle) => {\n * const result = await handle.result();\n * // ... handle result\n * },\n * Error: (error) => console.error('Failed to get handle:', error),\n * });\n * ```\n */\n getHandle<TWorkflowName extends keyof TContract[\"workflows\"]>(\n workflowName: TWorkflowName,\n workflowId: string,\n ): Future<\n Result<\n TypedWorkflowHandle<TContract[\"workflows\"][TWorkflowName]>,\n WorkflowNotFoundError | RuntimeClientError\n >\n > {\n return Future.make((resolve) => {\n (async () => {\n const definition = this.contract.workflows[workflowName as string];\n\n if (!definition) {\n return Result.Error(createWorkflowNotFoundError(workflowName, this.contract));\n }\n\n try {\n const handle = this.client.workflow.getHandle(workflowId);\n const typedHandle = this.createTypedHandle(handle, definition) as TypedWorkflowHandle<\n TContract[\"workflows\"][TWorkflowName]\n >;\n return Result.Ok(typedHandle);\n } catch (error) {\n return Result.Error(createRuntimeClientError(\"getHandle\", error));\n }\n })()\n .then(resolve)\n .catch((e: unknown) => resolve(Result.Error(createRuntimeClientError(\"unexpected\", e))));\n });\n }\n\n private createTypedHandle<TWorkflow extends WorkflowDefinition>(\n workflowHandle: WorkflowHandle,\n definition: TWorkflow,\n ): TypedWorkflowHandle<TWorkflow> {\n // Create typed queries proxy with Future/Result\n const queries = {} as TypedWorkflowHandle<TWorkflow>[\"queries\"];\n for (const [queryName, queryDef] of Object.entries(definition.queries ?? {}) as Array<\n [string, QueryDefinition]\n >) {\n (queries as Record<string, unknown>)[queryName] = (\n args: ClientInferInput<typeof queryDef>,\n ): Future<Result<unknown, QueryValidationError | RuntimeClientError>> => {\n return Future.make((resolve) => {\n (async () => {\n const inputResult = await queryDef.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return Result.Error(new QueryValidationError(queryName, \"input\", inputResult.issues));\n }\n\n try {\n const result = await workflowHandle.query(queryName as string, inputResult.value);\n\n const outputResult = await queryDef.output[\"~standard\"].validate(result);\n if (outputResult.issues) {\n return Result.Error(\n new QueryValidationError(queryName, \"output\", outputResult.issues),\n );\n }\n\n return Result.Ok(outputResult.value);\n } catch (error) {\n return Result.Error(createRuntimeClientError(\"query\", error));\n }\n })()\n .then(resolve)\n .catch((e: unknown) =>\n resolve(Result.Error(createRuntimeClientError(\"unexpected\", e))),\n );\n });\n };\n }\n\n // Create typed signals proxy with Future/Result\n const signals = {} as TypedWorkflowHandle<TWorkflow>[\"signals\"];\n for (const [signalName, signalDef] of Object.entries(definition.signals ?? {}) as Array<\n [string, SignalDefinition]\n >) {\n (signals as Record<string, unknown>)[signalName] = (\n args: ClientInferInput<typeof signalDef>,\n ): Future<Result<void, SignalValidationError | RuntimeClientError>> => {\n return Future.make((resolve) => {\n (async () => {\n const inputResult = await signalDef.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return Result.Error(new SignalValidationError(signalName, inputResult.issues));\n }\n\n try {\n await workflowHandle.signal(signalName as string, inputResult.value);\n return Result.Ok(undefined);\n } catch (error) {\n return Result.Error(createRuntimeClientError(\"signal\", error));\n }\n })()\n .then(resolve)\n .catch((e: unknown) =>\n resolve(Result.Error(createRuntimeClientError(\"unexpected\", e))),\n );\n });\n };\n }\n\n // Create typed updates proxy with Future/Result\n const updates = {} as TypedWorkflowHandle<TWorkflow>[\"updates\"];\n for (const [updateName, updateDef] of Object.entries(definition.updates ?? {}) as Array<\n [string, UpdateDefinition]\n >) {\n (updates as Record<string, unknown>)[updateName] = (\n args: ClientInferInput<typeof updateDef>,\n ): Future<Result<unknown, UpdateValidationError | RuntimeClientError>> => {\n return Future.make((resolve) => {\n (async () => {\n const inputResult = await updateDef.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return Result.Error(\n new UpdateValidationError(updateName, \"input\", inputResult.issues),\n );\n }\n\n try {\n const result = await workflowHandle.executeUpdate(updateName as string, {\n args: [inputResult.value],\n });\n\n const outputResult = await updateDef.output[\"~standard\"].validate(result);\n if (outputResult.issues) {\n return Result.Error(\n new UpdateValidationError(updateName, \"output\", outputResult.issues),\n );\n }\n\n return Result.Ok(outputResult.value);\n } catch (error) {\n return Result.Error(createRuntimeClientError(\"update\", error));\n }\n })()\n .then(resolve)\n .catch((e: unknown) =>\n resolve(Result.Error(createRuntimeClientError(\"unexpected\", e))),\n );\n });\n };\n }\n\n return {\n workflowId: workflowHandle.workflowId,\n queries,\n signals,\n updates,\n result: (): Future<\n Result<ClientInferOutput<TWorkflow>, WorkflowValidationError | RuntimeClientError>\n > => {\n return Future.make((resolve) => {\n (async () => {\n try {\n const result = await workflowHandle.result();\n const outputResult = await definition.output[\"~standard\"].validate(result);\n if (outputResult.issues) {\n return Result.Error(\n new WorkflowValidationError(\n workflowHandle.workflowId,\n \"output\",\n outputResult.issues,\n ),\n );\n }\n return Result.Ok(outputResult.value as ClientInferOutput<TWorkflow>);\n } catch (error) {\n return Result.Error(createRuntimeClientError(\"result\", error));\n }\n })()\n .then(resolve)\n .catch((e: unknown) =>\n resolve(Result.Error(createRuntimeClientError(\"unexpected\", e))),\n );\n });\n },\n terminate: (reason?: string): Future<Result<void, RuntimeClientError>> => {\n return Future.fromPromise(workflowHandle.terminate(reason))\n .mapError((error) => createRuntimeClientError(\"terminate\", error))\n .mapOk(() => undefined);\n },\n cancel: (): Future<Result<void, RuntimeClientError>> => {\n return Future.fromPromise(workflowHandle.cancel())\n .mapError((error) => createRuntimeClientError(\"cancel\", error))\n .mapOk(() => undefined);\n },\n describe: (): Future<\n Result<Awaited<ReturnType<WorkflowHandle[\"describe\"]>>, RuntimeClientError>\n > => {\n return Future.fromPromise(workflowHandle.describe()).mapError((error) =>\n createRuntimeClientError(\"describe\", error),\n );\n },\n fetchHistory: (): Future<\n Result<Awaited<ReturnType<WorkflowHandle[\"fetchHistory\"]>>, RuntimeClientError>\n > => {\n return Future.fromPromise(workflowHandle.fetchHistory()).mapError((error) =>\n createRuntimeClientError(\"fetchHistory\", error),\n );\n },\n };\n }\n}\n\nfunction createRuntimeClientError(operation: string, error: unknown): RuntimeClientError {\n return new RuntimeClientError(operation, error);\n}\n\nfunction createWorkflowNotFoundError(\n workflowName: string | number | symbol,\n contract: ContractDefinition,\n): WorkflowNotFoundError {\n return new WorkflowNotFoundError(String(workflowName), Object.keys(contract.workflows));\n}\n\nfunction createWorkflowValidationError(\n workflowName: string | number | symbol,\n direction: \"input\" | \"output\",\n issues: ReadonlyArray<StandardSchemaV1.Issue>,\n): WorkflowValidationError {\n return new WorkflowValidationError(String(workflowName), direction, issues);\n}\n"],"mappings":";;;;;;AAKA,IAAe,mBAAf,cAAwC,MAAM;CAC5C,AAAU,YAAY,SAAiB;AACrC,QAAM,QAAQ;AACd,OAAK,OAAO,KAAK,YAAY;AAC7B,MAAI,MAAM,kBACR,OAAM,kBAAkB,MAAM,KAAK,YAAY;;;;;;AAQrD,IAAa,qBAAb,cAAwC,iBAAiB;CACvD,YACE,AAAgB,WAChB,AAAyB,OACzB;AACA,QACE,cAAc,UAAU,YACtB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,gBAAgB,GAE5E;EAPe;EACS;;;;;;AAa7B,IAAa,wBAAb,cAA2C,iBAAiB;CAC1D,YACE,AAAgB,cAChB,AAAgB,oBAChB;AACA,QACE,aAAa,aAAa,gDAAgD,mBAAmB,KAAK,KAAK,GACxG;EALe;EACA;;;;;;AAWpB,IAAa,0BAAb,cAA6C,iBAAiB;CAC5D,YACE,AAAgB,cAChB,AAAgB,WAChB,AAAgB,QAChB;AACA,QACE,mCAAmC,aAAa,IAAI,UAAU,IAAI,KAAK,UAAU,OAAO,GACzF;EANe;EACA;EACA;;;;;;AAWpB,IAAa,uBAAb,cAA0C,iBAAiB;CACzD,YACE,AAAgB,WAChB,AAAgB,WAChB,AAAgB,QAChB;AACA,QAAM,gCAAgC,UAAU,IAAI,UAAU,IAAI,KAAK,UAAU,OAAO,GAAG;EAJ3E;EACA;EACA;;;;;;AASpB,IAAa,wBAAb,cAA2C,iBAAiB;CAC1D,YACE,AAAgB,YAChB,AAAgB,QAChB;AACA,QAAM,iCAAiC,WAAW,KAAK,KAAK,UAAU,OAAO,GAAG;EAHhE;EACA;;;;;;AASpB,IAAa,wBAAb,cAA2C,iBAAiB;CAC1D,YACE,AAAgB,YAChB,AAAgB,WAChB,AAAgB,QAChB;AACA,QAAM,iCAAiC,WAAW,IAAI,UAAU,IAAI,KAAK,UAAU,OAAO,GAAG;EAJ7E;EACA;EACA;;;;;;;;;;;;ACsBpB,IAAa,cAAb,MAAa,YAAkD;CAC7D,AAAQ,YACN,AAAiB,UACjB,AAAiB,QACjB;EAFiB;EACA;;;;;;;;;;;;;;;;;;;;;;CAuBnB,OAAO,OACL,UACA,QACwB;AACxB,SAAO,IAAI,YAAY,UAAU,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAwB1C,cACE,cACA,EAAE,MAAM,GAAG,mBAMX;AACA,SAAO,OAAO,MAAM,YAAY;AAC9B,IAAC,YAAY;IACX,MAAM,aAAa,KAAK,SAAS,UAAU;AAE3C,QAAI,CAAC,WACH,QAAO,OAAO,MAAM,4BAA4B,cAAc,KAAK,SAAS,CAAC;IAG/E,MAAM,cAAc,MAAM,WAAW,MAAM,aAAa,SAAS,KAAK;AACtE,QAAI,YAAY,OACd,QAAO,OAAO,MACZ,8BAA8B,cAAc,SAAS,YAAY,OAAO,CACzE;IAGH,MAAM,iBAAiB,YAAY;AAKnC,QAAI;KACF,MAAM,SAAS,MAAM,KAAK,OAAO,SAAS,MAAM,cAAwB;MACtE,GAAG;MACH,WAAW,KAAK,SAAS;MACzB,MAAM,CAAC,eAAe;MACvB,CAAC;KACF,MAAM,cAAc,KAAK,kBAAkB,QAAQ,WAAW;AAG9D,YAAO,OAAO,GAAG,YAAY;aACtB,OAAO;AACd,YAAO,OAAO,MAAM,yBAAyB,iBAAiB,MAAM,CAAC;;OAErE,CACD,KAAK,QAAQ,CACb,OAAO,MAAe,QAAQ,OAAO,MAAM,yBAAyB,cAAc,EAAE,CAAC,CAAC,CAAC;IAC1F;;;;;;;;;;;;;;;;;;;;CAqBJ,gBACE,cACA,EAAE,MAAM,GAAG,mBAMX;AACA,SAAO,OAAO,MAAM,YAAY;AAC9B,IAAC,YAAY;IACX,MAAM,aAAa,KAAK,SAAS,UAAU;AAE3C,QAAI,CAAC,WACH,QAAO,OAAO,MAAM,4BAA4B,cAAc,KAAK,SAAS,CAAC;IAG/E,MAAM,cAAc,MAAM,WAAW,MAAM,aAAa,SAAS,KAAK;AACtE,QAAI,YAAY,OACd,QAAO,OAAO,MACZ,8BAA8B,cAAc,SAAS,YAAY,OAAO,CACzE;IAGH,MAAM,iBAAiB,YAAY;AAKnC,QAAI;KACF,MAAM,SAAS,MAAM,KAAK,OAAO,SAAS,QAAQ,cAAwB;MACxE,GAAG;MACH,WAAW,KAAK,SAAS;MACzB,MAAM,CAAC,eAAe;MACvB,CAAC;KAGF,MAAM,eAAe,MAAM,WAAW,OAAO,aAAa,SAAS,OAAO;AAC1E,SAAI,aAAa,OACf,QAAO,OAAO,MACZ,8BAA8B,cAAc,UAAU,aAAa,OAAO,CAC3E;AAGH,YAAO,OAAO,GACZ,aAAa,MACd;aACM,OAAO;AACd,YAAO,OAAO,MAAM,yBAAyB,mBAAmB,MAAM,CAAC;;OAEvE,CACD,KAAK,QAAQ,CACb,OAAO,MAAe,QAAQ,OAAO,MAAM,yBAAyB,cAAc,EAAE,CAAC,CAAC,CAAC;IAC1F;;;;;;;;;;;;;;;;;CAkBJ,UACE,cACA,YAMA;AACA,SAAO,OAAO,MAAM,YAAY;AAC9B,IAAC,YAAY;IACX,MAAM,aAAa,KAAK,SAAS,UAAU;AAE3C,QAAI,CAAC,WACH,QAAO,OAAO,MAAM,4BAA4B,cAAc,KAAK,SAAS,CAAC;AAG/E,QAAI;KACF,MAAM,SAAS,KAAK,OAAO,SAAS,UAAU,WAAW;KACzD,MAAM,cAAc,KAAK,kBAAkB,QAAQ,WAAW;AAG9D,YAAO,OAAO,GAAG,YAAY;aACtB,OAAO;AACd,YAAO,OAAO,MAAM,yBAAyB,aAAa,MAAM,CAAC;;OAEjE,CACD,KAAK,QAAQ,CACb,OAAO,MAAe,QAAQ,OAAO,MAAM,yBAAyB,cAAc,EAAE,CAAC,CAAC,CAAC;IAC1F;;CAGJ,AAAQ,kBACN,gBACA,YACgC;EAEhC,MAAM,UAAU,EAAE;AAClB,OAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,WAAW,WAAW,EAAE,CAAC,CAG1E,CAAC,QAAoC,cACnC,SACuE;AACvE,UAAO,OAAO,MAAM,YAAY;AAC9B,KAAC,YAAY;KACX,MAAM,cAAc,MAAM,SAAS,MAAM,aAAa,SAAS,KAAK;AACpE,SAAI,YAAY,OACd,QAAO,OAAO,MAAM,IAAI,qBAAqB,WAAW,SAAS,YAAY,OAAO,CAAC;AAGvF,SAAI;MACF,MAAM,SAAS,MAAM,eAAe,MAAM,WAAqB,YAAY,MAAM;MAEjF,MAAM,eAAe,MAAM,SAAS,OAAO,aAAa,SAAS,OAAO;AACxE,UAAI,aAAa,OACf,QAAO,OAAO,MACZ,IAAI,qBAAqB,WAAW,UAAU,aAAa,OAAO,CACnE;AAGH,aAAO,OAAO,GAAG,aAAa,MAAM;cAC7B,OAAO;AACd,aAAO,OAAO,MAAM,yBAAyB,SAAS,MAAM,CAAC;;QAE7D,CACD,KAAK,QAAQ,CACb,OAAO,MACN,QAAQ,OAAO,MAAM,yBAAyB,cAAc,EAAE,CAAC,CAAC,CACjE;KACH;;EAKN,MAAM,UAAU,EAAE;AAClB,OAAK,MAAM,CAAC,YAAY,cAAc,OAAO,QAAQ,WAAW,WAAW,EAAE,CAAC,CAG5E,CAAC,QAAoC,eACnC,SACqE;AACrE,UAAO,OAAO,MAAM,YAAY;AAC9B,KAAC,YAAY;KACX,MAAM,cAAc,MAAM,UAAU,MAAM,aAAa,SAAS,KAAK;AACrE,SAAI,YAAY,OACd,QAAO,OAAO,MAAM,IAAI,sBAAsB,YAAY,YAAY,OAAO,CAAC;AAGhF,SAAI;AACF,YAAM,eAAe,OAAO,YAAsB,YAAY,MAAM;AACpE,aAAO,OAAO,GAAG,OAAU;cACpB,OAAO;AACd,aAAO,OAAO,MAAM,yBAAyB,UAAU,MAAM,CAAC;;QAE9D,CACD,KAAK,QAAQ,CACb,OAAO,MACN,QAAQ,OAAO,MAAM,yBAAyB,cAAc,EAAE,CAAC,CAAC,CACjE;KACH;;EAKN,MAAM,UAAU,EAAE;AAClB,OAAK,MAAM,CAAC,YAAY,cAAc,OAAO,QAAQ,WAAW,WAAW,EAAE,CAAC,CAG5E,CAAC,QAAoC,eACnC,SACwE;AACxE,UAAO,OAAO,MAAM,YAAY;AAC9B,KAAC,YAAY;KACX,MAAM,cAAc,MAAM,UAAU,MAAM,aAAa,SAAS,KAAK;AACrE,SAAI,YAAY,OACd,QAAO,OAAO,MACZ,IAAI,sBAAsB,YAAY,SAAS,YAAY,OAAO,CACnE;AAGH,SAAI;MACF,MAAM,SAAS,MAAM,eAAe,cAAc,YAAsB,EACtE,MAAM,CAAC,YAAY,MAAM,EAC1B,CAAC;MAEF,MAAM,eAAe,MAAM,UAAU,OAAO,aAAa,SAAS,OAAO;AACzE,UAAI,aAAa,OACf,QAAO,OAAO,MACZ,IAAI,sBAAsB,YAAY,UAAU,aAAa,OAAO,CACrE;AAGH,aAAO,OAAO,GAAG,aAAa,MAAM;cAC7B,OAAO;AACd,aAAO,OAAO,MAAM,yBAAyB,UAAU,MAAM,CAAC;;QAE9D,CACD,KAAK,QAAQ,CACb,OAAO,MACN,QAAQ,OAAO,MAAM,yBAAyB,cAAc,EAAE,CAAC,CAAC,CACjE;KACH;;AAIN,SAAO;GACL,YAAY,eAAe;GAC3B;GACA;GACA;GACA,cAEK;AACH,WAAO,OAAO,MAAM,YAAY;AAC9B,MAAC,YAAY;AACX,UAAI;OACF,MAAM,SAAS,MAAM,eAAe,QAAQ;OAC5C,MAAM,eAAe,MAAM,WAAW,OAAO,aAAa,SAAS,OAAO;AAC1E,WAAI,aAAa,OACf,QAAO,OAAO,MACZ,IAAI,wBACF,eAAe,YACf,UACA,aAAa,OACd,CACF;AAEH,cAAO,OAAO,GAAG,aAAa,MAAsC;eAC7D,OAAO;AACd,cAAO,OAAO,MAAM,yBAAyB,UAAU,MAAM,CAAC;;SAE9D,CACD,KAAK,QAAQ,CACb,OAAO,MACN,QAAQ,OAAO,MAAM,yBAAyB,cAAc,EAAE,CAAC,CAAC,CACjE;MACH;;GAEJ,YAAY,WAA8D;AACxE,WAAO,OAAO,YAAY,eAAe,UAAU,OAAO,CAAC,CACxD,UAAU,UAAU,yBAAyB,aAAa,MAAM,CAAC,CACjE,YAAY,OAAU;;GAE3B,cAAwD;AACtD,WAAO,OAAO,YAAY,eAAe,QAAQ,CAAC,CAC/C,UAAU,UAAU,yBAAyB,UAAU,MAAM,CAAC,CAC9D,YAAY,OAAU;;GAE3B,gBAEK;AACH,WAAO,OAAO,YAAY,eAAe,UAAU,CAAC,CAAC,UAAU,UAC7D,yBAAyB,YAAY,MAAM,CAC5C;;GAEH,oBAEK;AACH,WAAO,OAAO,YAAY,eAAe,cAAc,CAAC,CAAC,UAAU,UACjE,yBAAyB,gBAAgB,MAAM,CAChD;;GAEJ;;;AAIL,SAAS,yBAAyB,WAAmB,OAAoC;AACvF,QAAO,IAAI,mBAAmB,WAAW,MAAM;;AAGjD,SAAS,4BACP,cACA,UACuB;AACvB,QAAO,IAAI,sBAAsB,OAAO,aAAa,EAAE,OAAO,KAAK,SAAS,UAAU,CAAC;;AAGzF,SAAS,8BACP,cACA,WACA,QACyB;AACzB,QAAO,IAAI,wBAAwB,OAAO,aAAa,EAAE,WAAW,OAAO"}
1
+ {"version":3,"file":"index.mjs","names":["TemporalWorkflowNotFoundError","TemporalWorkflowFailedError","TemporalWorkflowFailedError","TemporalWorkflowNotFoundError"],"sources":["../src/errors.ts","../src/internal.ts","../src/schedule.ts","../src/client.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n/**\n * Base class for all typed client errors with boxed pattern\n */\nabstract class TypedClientError extends Error {\n protected constructor(message: string) {\n super(message);\n this.name = this.constructor.name;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Generic runtime failure wrapper when no specific error type applies\n */\nexport class RuntimeClientError extends TypedClientError {\n constructor(\n public readonly operation: string,\n public override readonly cause?: unknown,\n ) {\n super(\n `Operation \"${operation}\" failed: ${\n cause instanceof Error ? cause.message : String(cause ?? \"unknown error\")\n }`,\n );\n }\n}\n\n/**\n * Thrown when a workflow is not found in the contract\n */\nexport class WorkflowNotFoundError extends TypedClientError {\n constructor(\n public readonly workflowName: string,\n public readonly availableWorkflows: string[],\n ) {\n super(\n `Workflow \"${workflowName}\" not found in contract. Available workflows: ${availableWorkflows.join(\", \")}`,\n );\n }\n}\n\n/**\n * Discriminated variant of {@link RuntimeClientError} surfaced when starting\n * a workflow collides with an existing execution — Temporal's\n * `WorkflowExecutionAlreadyStartedError`. The most common cause is a\n * workflowId reuse policy that rejects duplicates while a previous run is\n * still in retention.\n *\n * Distinguishing this from `RuntimeClientError` lets idempotent callers\n * branch on it explicitly (e.g. fetch the existing handle and continue)\n * without inspecting `error.cause` against a Temporal SDK class.\n */\nexport class WorkflowAlreadyStartedError extends TypedClientError {\n constructor(\n public readonly workflowType: string,\n public readonly workflowId: string,\n public override readonly cause?: unknown,\n ) {\n super(`Workflow \"${workflowType}\" with ID \"${workflowId}\" is already started or in retention.`);\n }\n}\n\n/**\n * Discriminated variant of {@link RuntimeClientError} surfaced when an\n * operation targets a workflow execution that doesn't exist in the\n * namespace — Temporal's `WorkflowNotFoundError` (distinct from this\n * package's contract-level {@link WorkflowNotFoundError}).\n *\n * Returned from:\n * - handle methods: `signal`, `query`, `executeUpdate`, `result`,\n * `terminate`, `cancel`, `describe`, `fetchHistory`\n * - `executeWorkflow` (when the underlying execute call hits a missing\n * execution mid-flight)\n */\nexport class WorkflowExecutionNotFoundError extends TypedClientError {\n constructor(\n public readonly workflowId: string,\n public readonly runId?: string,\n public override readonly cause?: unknown,\n ) {\n super(\n `Workflow execution \"${workflowId}\"${runId ? ` (run \"${runId}\")` : \"\"} not found in namespace.`,\n );\n }\n}\n\n/**\n * Discriminated variant of {@link RuntimeClientError} surfaced when waiting\n * on a workflow's result and the workflow completes with a failure —\n * Temporal's `WorkflowFailedError`.\n *\n * `cause` is the *unwrapped* underlying failure (typically an\n * `ApplicationFailure`, `CancelledFailure`, `TerminatedFailure`, or\n * `TimeoutFailure`) lifted from Temporal's wrapper, so callers can branch\n * on the failure category in one step (`err.cause instanceof\n * ApplicationFailure`) instead of unwrapping twice via the SDK wrapper.\n *\n * Returned from `executeWorkflow` and `handle.result()`.\n */\nexport class WorkflowFailedError extends TypedClientError {\n constructor(\n public readonly workflowId: string,\n public override readonly cause?: unknown,\n ) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? \"unknown failure\");\n super(`Workflow \"${workflowId}\" completed with failure: ${causeMessage}`);\n }\n}\n\n/**\n * Pattern for string keys safe to render with dot notation. A \"safe\" key is a\n * JavaScript identifier (letters/digits/underscore/$, not starting with a\n * digit). Anything else — keys containing dots, spaces, leading digits, the\n * empty string, the literal string `\"0\"` etc. — gets bracket-quoted so the\n * path is unambiguous.\n *\n * This helper is intentionally duplicated with the worker package so each\n * entry point is self-contained; keep the two copies in sync.\n */\nconst SAFE_IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\n/**\n * Render a Standard Schema {@link StandardSchemaV1.Issue} into a human-readable\n * string that includes the failing field's path.\n *\n * Example output:\n * - `at items[0].quantity: Expected number, received undefined`\n * - `at customerId: Expected string, received undefined`\n * - `at user[\"first name\"]: Expected string, received undefined`\n * - `Validation error` *(no path)*\n *\n * Path segments come either as bare `PropertyKey` values or as\n * `{ key: PropertyKey }` objects (per the spec); both are normalized.\n * - Numeric keys → `[N]`\n * - String keys that are valid JS identifiers → bare (first) or `.key`\n * - String keys that aren't valid identifiers → `[\"...\"]` with JSON-style\n * escaping (handles dots, spaces, leading digits, the empty string, the\n * literal string `\"0\"`, embedded quotes, etc.)\n * - Symbol / other `PropertyKey` → `[Symbol(name)]`\n */\nfunction formatIssue(issue: StandardSchemaV1.Issue): string {\n if (issue.path === undefined || issue.path.length === 0) {\n return issue.message;\n }\n let path = \"\";\n for (let i = 0; i < issue.path.length; i++) {\n const segment = issue.path[i];\n const key =\n segment !== null && typeof segment === \"object\" && \"key\" in segment ? segment.key : segment;\n if (typeof key === \"number\") {\n path += `[${key}]`;\n } else if (typeof key === \"string\" && SAFE_IDENTIFIER.test(key)) {\n path += i === 0 ? key : `.${key}`;\n } else if (typeof key === \"string\") {\n // Non-identifier string: bracket-quote with JSON-style escaping so\n // dots, spaces, embedded quotes, and the literal string `\"0\"` are\n // unambiguous from numeric indices and identifier segments.\n path += `[${JSON.stringify(key)}]`;\n } else {\n // Symbol or other PropertyKey — bracket-stringify so it parses\n // unambiguously alongside string segments.\n path += `[${String(key)}]`;\n }\n }\n return `at ${path}: ${issue.message}`;\n}\n\nfunction summarizeIssues(issues: ReadonlyArray<StandardSchemaV1.Issue>): string {\n return issues.map(formatIssue).join(\"; \");\n}\n\n/**\n * Thrown when workflow input or output validation fails\n */\nexport class WorkflowValidationError extends TypedClientError {\n constructor(\n public readonly workflowName: string,\n public readonly direction: \"input\" | \"output\",\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(\n `Validation failed for workflow \"${workflowName}\" ${direction}: ${summarizeIssues(issues)}`,\n );\n }\n}\n\n/**\n * Thrown when query input or output validation fails\n */\nexport class QueryValidationError extends TypedClientError {\n constructor(\n public readonly queryName: string,\n public readonly direction: \"input\" | \"output\",\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(`Validation failed for query \"${queryName}\" ${direction}: ${summarizeIssues(issues)}`);\n }\n}\n\n/**\n * Thrown when signal input validation fails\n */\nexport class SignalValidationError extends TypedClientError {\n constructor(\n public readonly signalName: string,\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(`Validation failed for signal \"${signalName}\": ${summarizeIssues(issues)}`);\n }\n}\n\n/**\n * Thrown when update input or output validation fails\n */\nexport class UpdateValidationError extends TypedClientError {\n constructor(\n public readonly updateName: string,\n public readonly direction: \"input\" | \"output\",\n public readonly issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) {\n super(`Validation failed for update \"${updateName}\" ${direction}: ${summarizeIssues(issues)}`);\n }\n}\n","/**\n * Internal helpers shared across the client package's modules.\n *\n * Not part of the public API — this module is not listed in the package's\n * `exports` map, so consumers can't import from `@temporal-contract/client/internal`.\n * In-package modules and tests import it directly via relative path.\n */\nimport { WorkflowExecutionAlreadyStartedError } from \"@temporalio/client\";\nimport { WorkflowFailedError as TemporalWorkflowFailedError } from \"@temporalio/client\";\nimport { WorkflowNotFoundError as TemporalWorkflowNotFoundError } from \"@temporalio/common\";\nimport { ResultAsync, type Result, err } from \"neverthrow\";\nimport {\n RuntimeClientError,\n WorkflowAlreadyStartedError,\n WorkflowExecutionNotFoundError,\n WorkflowFailedError,\n} from \"./errors.js\";\n\n/**\n * Wrap an async result-producing function in a `ResultAsync`, catching any\n * unhandled rejection as a `RuntimeClientError(\"unexpected\", error)`.\n *\n * The work function is expected to handle its own domain errors and return\n * an `err(...)` for them; the catch here is a safety net for thrown\n * exceptions the work didn't anticipate.\n *\n * Used by `client.ts` (workflow operations) and `schedule.ts` (schedule\n * operations) so the unexpected-rejection shape is identical across the\n * typed client surface.\n */\nexport function makeResultAsync<T, E>(\n work: () => Promise<Result<T, E>>,\n): ResultAsync<T, E | RuntimeClientError> {\n return new ResultAsync<T, E | RuntimeClientError>(\n work().catch((e: unknown) => err(new RuntimeClientError(\"unexpected\", e))),\n );\n}\n\n/**\n * Map a thrown error from `client.workflow.start` / `signalWithStart` into\n * the discriminated union surfaced by the typed client. Specifically\n * recognizes Temporal's `WorkflowExecutionAlreadyStartedError`; everything\n * else falls through to {@link RuntimeClientError}.\n */\nexport function classifyStartError(\n operation: string,\n error: unknown,\n): WorkflowAlreadyStartedError | RuntimeClientError {\n if (error instanceof WorkflowExecutionAlreadyStartedError) {\n return new WorkflowAlreadyStartedError(error.workflowType, error.workflowId, error);\n }\n return new RuntimeClientError(operation, error);\n}\n\n/**\n * Map a thrown error from a workflow handle method (signal, query,\n * executeUpdate, terminate, cancel, describe, fetchHistory) into the\n * discriminated union surfaced by the typed client. Recognizes Temporal's\n * `WorkflowNotFoundError`; everything else falls through to\n * {@link RuntimeClientError}.\n *\n * `fallbackWorkflowId` is used when Temporal's error carries an empty\n * `workflowId` (it normalizes missing IDs to the empty string), so the\n * surfaced error always identifies the targeted execution.\n */\nexport function classifyHandleError(\n operation: string,\n error: unknown,\n fallbackWorkflowId: string,\n): WorkflowExecutionNotFoundError | RuntimeClientError {\n if (error instanceof TemporalWorkflowNotFoundError) {\n return new WorkflowExecutionNotFoundError(\n error.workflowId || fallbackWorkflowId,\n error.runId,\n error,\n );\n }\n return new RuntimeClientError(operation, error);\n}\n\n/**\n * Map a thrown error from `handle.result()` / `client.workflow.execute()`\n * (the latter when waiting on the result phase). Recognizes Temporal's\n * `WorkflowFailedError` and `WorkflowNotFoundError`; everything else falls\n * through to {@link RuntimeClientError}.\n *\n * Temporal's `WorkflowFailedError` is itself a wrapper — the actionable\n * failure (ApplicationFailure, CancelledFailure, TerminatedFailure, etc.)\n * lives on its `cause` field. We forward that inner cause directly so\n * consumers can match `err.cause` against the underlying failure class\n * without an extra unwrap step. (If Temporal's cause is `undefined`, our\n * `cause` is too — same shape as before.)\n */\nexport function classifyResultError(\n operation: string,\n error: unknown,\n workflowId: string,\n): WorkflowFailedError | WorkflowExecutionNotFoundError | RuntimeClientError {\n if (error instanceof TemporalWorkflowFailedError) {\n return new WorkflowFailedError(workflowId, error.cause);\n }\n if (error instanceof TemporalWorkflowNotFoundError) {\n return new WorkflowExecutionNotFoundError(error.workflowId || workflowId, error.runId, error);\n }\n return new RuntimeClientError(operation, error);\n}\n","import type {\n ScheduleClient,\n ScheduleDescription,\n ScheduleHandle,\n ScheduleOptions,\n ScheduleOptionsStartWorkflowAction,\n ScheduleOverlapPolicy,\n ScheduleSpec,\n} from \"@temporalio/client\";\nimport type { ContractDefinition } from \"@temporal-contract/contract\";\nimport { ResultAsync, type Result, ok, err } from \"neverthrow\";\nimport type { ClientInferInput } from \"./types.js\";\nimport { RuntimeClientError, WorkflowNotFoundError, WorkflowValidationError } from \"./errors.js\";\nimport { makeResultAsync } from \"./internal.js\";\n\n/**\n * Workflow-action–level overrides forwarded to Temporal's\n * `ScheduleOptionsStartWorkflowAction`. These live under a nested `action`\n * field so the workflow-level `memo` (per-action workflow metadata) can be\n * set independently from the schedule-level `memo` (metadata on the\n * schedule itself) — Temporal honours both, and they have separate\n * lifecycles.\n *\n * `workflowType` and `taskQueue` are owned by the contract and not exposed.\n */\nexport type TypedScheduleActionOverrides = Pick<\n ScheduleOptionsStartWorkflowAction<never>,\n | \"workflowId\"\n | \"workflowExecutionTimeout\"\n | \"workflowRunTimeout\"\n | \"workflowTaskTimeout\"\n | \"retry\"\n | \"memo\"\n | \"staticDetails\"\n | \"staticSummary\"\n>;\n\n/**\n * Options for {@link TypedScheduleClient.create}.\n *\n * `scheduleId` and `spec` come from Temporal's `ScheduleOptions`. `args` is\n * typed against the destination workflow's input schema. `policies`,\n * `state`, and `memo` mirror Temporal's own schedule-level options.\n * Workflow-action–level overrides nest under {@link action} so memo and\n * other fields with the same name don't collide between the two scopes.\n */\nexport type TypedScheduleCreateOptions<\n TContract extends ContractDefinition,\n TWorkflowName extends keyof TContract[\"workflows\"],\n> = {\n /** Schedule ID. Recommended to use a meaningful business identifier. */\n scheduleId: string;\n /** When the schedule should fire (cron, interval, calendar). */\n spec: ScheduleSpec;\n /** Workflow input — validated against the contract's input schema. */\n args: ClientInferInput<TContract[\"workflows\"][TWorkflowName]>;\n /** Temporal schedule policies (overlap, catchupWindow, pauseOnFailure, etc.). */\n policies?: ScheduleOptions[\"policies\"];\n /** Temporal schedule state (paused, note, limited, etc.). */\n state?: ScheduleOptions[\"state\"];\n /** Schedule-level memo (non-indexed metadata on the schedule itself). */\n memo?: ScheduleOptions[\"memo\"];\n /**\n * Workflow-action–level overrides. `workflowType` and `taskQueue` are\n * derived from the contract, so they don't appear here. Note that\n * `action.memo` is a *workflow-level* memo applied to each spawned run,\n * distinct from the top-level `memo` (which is metadata on the schedule\n * itself).\n */\n action?: TypedScheduleActionOverrides;\n};\n\n/**\n * Typed handle to a schedule. Mirrors Temporal's `ScheduleHandle` lifecycle\n * methods (`pause`, `unpause`, `trigger`, `describe`, `delete`) wrapped in\n * the neverthrow ResultAsync pattern so call sites match the rest of the\n * typed client.\n */\nexport type TypedScheduleHandle = {\n /** This schedule's identifier. */\n readonly scheduleId: string;\n /** Pause the schedule. Optional note becomes part of the audit trail. */\n pause: (note?: string) => ResultAsync<void, RuntimeClientError>;\n /** Resume a paused schedule. */\n unpause: (note?: string) => ResultAsync<void, RuntimeClientError>;\n /** Fire the schedule's action immediately. */\n trigger: (overlap?: ScheduleOverlapPolicy) => ResultAsync<void, RuntimeClientError>;\n /** Delete the schedule. */\n delete: () => ResultAsync<void, RuntimeClientError>;\n /** Fetch the schedule's current description from the server. */\n describe: () => ResultAsync<ScheduleDescription, RuntimeClientError>;\n};\n\n/**\n * Typed wrapper around Temporal's `ScheduleClient`. Exposed as\n * `typedClient.schedule` — keeps the typed-client surface organized the\n * same way Temporal's own `Client.schedule` does.\n */\nexport class TypedScheduleClient<TContract extends ContractDefinition> {\n constructor(\n private readonly contract: TContract,\n private readonly scheduleClient: ScheduleClient,\n ) {}\n\n /**\n * Create a new schedule that, on each fire, starts the named contract\n * workflow with validated args.\n *\n * Validates `args` against the workflow's input schema before dispatching\n * the create request to Temporal. The workflow's `taskQueue` and\n * `workflowType` are pulled from the contract automatically; the typed\n * options shape omits them so call sites don't have to repeat themselves.\n */\n create<TWorkflowName extends keyof TContract[\"workflows\"]>(\n workflowName: TWorkflowName,\n options: TypedScheduleCreateOptions<TContract, TWorkflowName>,\n ): ResultAsync<\n TypedScheduleHandle,\n WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError\n > {\n type Ok = TypedScheduleHandle;\n type Err = WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError;\n const work = async (): Promise<Result<Ok, Err>> => {\n const definition = this.contract.workflows[workflowName as string];\n if (!definition) {\n return err(\n new WorkflowNotFoundError(String(workflowName), Object.keys(this.contract.workflows)),\n );\n }\n\n const inputResult = await definition.input[\"~standard\"].validate(options.args);\n if (inputResult.issues) {\n return err(new WorkflowValidationError(String(workflowName), \"input\", inputResult.issues));\n }\n\n try {\n const overrides = options.action ?? {};\n const action: ScheduleOptionsStartWorkflowAction<never> = {\n type: \"startWorkflow\",\n workflowType: workflowName as string,\n taskQueue: this.contract.taskQueue,\n args: [inputResult.value] as never,\n ...(overrides.workflowId !== undefined ? { workflowId: overrides.workflowId } : {}),\n ...(overrides.workflowExecutionTimeout !== undefined\n ? { workflowExecutionTimeout: overrides.workflowExecutionTimeout }\n : {}),\n ...(overrides.workflowRunTimeout !== undefined\n ? { workflowRunTimeout: overrides.workflowRunTimeout }\n : {}),\n ...(overrides.workflowTaskTimeout !== undefined\n ? { workflowTaskTimeout: overrides.workflowTaskTimeout }\n : {}),\n ...(overrides.retry !== undefined ? { retry: overrides.retry } : {}),\n ...(overrides.memo !== undefined ? { memo: overrides.memo } : {}),\n ...(overrides.staticDetails !== undefined\n ? { staticDetails: overrides.staticDetails }\n : {}),\n ...(overrides.staticSummary !== undefined\n ? { staticSummary: overrides.staticSummary }\n : {}),\n };\n\n const handle = await this.scheduleClient.create({\n scheduleId: options.scheduleId,\n spec: options.spec,\n action,\n ...(options.policies !== undefined ? { policies: options.policies } : {}),\n ...(options.state !== undefined ? { state: options.state } : {}),\n ...(options.memo !== undefined ? { memo: options.memo } : {}),\n });\n return ok(wrapScheduleHandle(handle));\n } catch (error) {\n return err(new RuntimeClientError(\"schedule.create\", error));\n }\n };\n return makeResultAsync(work);\n }\n\n /**\n * Get a typed handle to an existing schedule. Does not validate that the\n * schedule exists — handle methods (`describe`, `pause`, etc.) will\n * surface a `RuntimeClientError` if the underlying ID is unknown.\n */\n getHandle(scheduleId: string): TypedScheduleHandle {\n return wrapScheduleHandle(this.scheduleClient.getHandle(scheduleId));\n }\n}\n\nfunction wrapScheduleHandle(handle: ScheduleHandle): TypedScheduleHandle {\n return {\n scheduleId: handle.scheduleId,\n pause: (note) =>\n ResultAsync.fromPromise(\n handle.pause(note),\n (error) => new RuntimeClientError(\"schedule.pause\", error),\n ).map(() => undefined),\n unpause: (note) =>\n ResultAsync.fromPromise(\n handle.unpause(note),\n (error) => new RuntimeClientError(\"schedule.unpause\", error),\n ).map(() => undefined),\n trigger: (overlap) =>\n ResultAsync.fromPromise(\n handle.trigger(overlap),\n (error) => new RuntimeClientError(\"schedule.trigger\", error),\n ).map(() => undefined),\n delete: () =>\n ResultAsync.fromPromise(\n handle.delete(),\n (error) => new RuntimeClientError(\"schedule.delete\", error),\n ).map(() => undefined),\n describe: () =>\n ResultAsync.fromPromise(\n handle.describe(),\n (error) => new RuntimeClientError(\"schedule.describe\", error),\n ),\n };\n}\n","import { Client, WorkflowHandle } from \"@temporalio/client\";\nimport type { WorkflowSignalWithStartOptions, WorkflowStartOptions } from \"@temporalio/client\";\nimport {\n defineSearchAttributeKey,\n type SearchAttributePair,\n TypedSearchAttributes,\n} from \"@temporalio/common\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ContractDefinition,\n SearchAttributeDefinition,\n SearchAttributeKindToType,\n SignalDefinition,\n WorkflowDefinition,\n} from \"@temporal-contract/contract\";\nimport type {\n ClientInferInput,\n ClientInferOutput,\n ClientInferWorkflowQueries,\n ClientInferWorkflowSignals,\n ClientInferWorkflowUpdates,\n} from \"./types.js\";\nimport { ResultAsync, type Result, ok, err } from \"neverthrow\";\nimport {\n WorkflowAlreadyStartedError,\n WorkflowExecutionNotFoundError,\n WorkflowFailedError,\n WorkflowNotFoundError,\n WorkflowValidationError,\n QueryValidationError,\n SignalValidationError,\n UpdateValidationError,\n RuntimeClientError,\n} from \"./errors.js\";\nimport { TypedScheduleClient } from \"./schedule.js\";\nimport {\n classifyHandleError,\n classifyResultError,\n classifyStartError,\n makeResultAsync,\n} from \"./internal.js\";\nimport { WorkflowExecutionAlreadyStartedError } from \"@temporalio/client\";\nimport { WorkflowFailedError as TemporalWorkflowFailedError } from \"@temporalio/client\";\nimport { WorkflowNotFoundError as TemporalWorkflowNotFoundError } from \"@temporalio/common\";\n\n/**\n * Typed `searchAttributes` map for a workflow, derived from the workflow's\n * declared `searchAttributes`. Each key is constrained to a declared\n * attribute name; each value's type is determined by the attribute's `kind`\n * (e.g. `KEYWORD` → `string`, `INT` → `number`, `DATETIME` → `Date`,\n * `KEYWORD_LIST` → `string[]`).\n *\n * If the workflow declares no search attributes, this resolves to `never`,\n * meaning the `searchAttributes` field is effectively absent from the start\n * options for that workflow.\n */\nexport type TypedSearchAttributeMap<TWorkflow extends WorkflowDefinition> =\n TWorkflow[\"searchAttributes\"] extends Record<string, SearchAttributeDefinition>\n ? {\n [K in keyof TWorkflow[\"searchAttributes\"]]?: SearchAttributeKindToType<\n TWorkflow[\"searchAttributes\"][K][\"kind\"]\n >;\n }\n : never;\n\nexport type TypedWorkflowStartOptions<\n TContract extends ContractDefinition,\n TWorkflowName extends keyof TContract[\"workflows\"],\n> = Omit<\n WorkflowStartOptions,\n \"taskQueue\" | \"args\" | \"searchAttributes\" | \"typedSearchAttributes\"\n> & {\n args: ClientInferInput<TContract[\"workflows\"][TWorkflowName]>;\n /**\n * Indexed search attributes for the started workflow. Keys and value types\n * are constrained to those declared on the workflow's contract via\n * `defineSearchAttribute`. Translated to Temporal's `typedSearchAttributes`\n * before the start request is dispatched.\n */\n searchAttributes?: TypedSearchAttributeMap<TContract[\"workflows\"][TWorkflowName]>;\n};\n\n/**\n * Options for {@link TypedClient.signalWithStart} — typed against both the\n * workflow's input schema and the named signal's input schema.\n */\nexport type TypedSignalWithStartOptions<\n TContract extends ContractDefinition,\n TWorkflowName extends keyof TContract[\"workflows\"],\n TSignalName extends keyof TContract[\"workflows\"][TWorkflowName][\"signals\"] & string,\n> = Omit<\n WorkflowSignalWithStartOptions,\n \"taskQueue\" | \"args\" | \"signal\" | \"signalArgs\" | \"searchAttributes\" | \"typedSearchAttributes\"\n> & {\n args: ClientInferInput<TContract[\"workflows\"][TWorkflowName]>;\n signalName: TSignalName;\n signalArgs: TContract[\"workflows\"][TWorkflowName][\"signals\"][TSignalName] extends SignalDefinition\n ? ClientInferInput<TContract[\"workflows\"][TWorkflowName][\"signals\"][TSignalName]>\n : never;\n /**\n * Indexed search attributes for the started workflow. Keys and value types\n * are constrained to those declared on the workflow's contract via\n * `defineSearchAttribute`. Translated to Temporal's `typedSearchAttributes`\n * before the signalWithStart request is dispatched.\n */\n searchAttributes?: TypedSearchAttributeMap<TContract[\"workflows\"][TWorkflowName]>;\n};\n\n/**\n * Typed workflow handle returned by `signalWithStart`. Adds `signaledRunId`\n * to the standard handle so callers can correlate the signal with the\n * (possibly pre-existing) workflow execution chain.\n */\nexport type TypedWorkflowHandleWithSignaledRunId<TWorkflow extends WorkflowDefinition> =\n TypedWorkflowHandle<TWorkflow> & {\n /**\n * The Run Id of the bound Workflow at the time of `signalWithStart`. Since\n * `signalWithStart` may have signaled an existing Workflow Chain, this is\n * not necessarily the `firstExecutionRunId`.\n */\n readonly signaledRunId: string;\n };\n\n/**\n * Translate the contract's typed `searchAttributes` map (declared\n * name → value) into a Temporal `TypedSearchAttributes` instance, so the\n * Temporal client honours indexing when starting the workflow.\n *\n * Workflows without a `searchAttributes` block (or callers passing no\n * values) skip the conversion entirely and return `undefined`, matching\n * the Temporal SDK's \"absent ≠ empty\" semantics.\n */\nfunction toTypedSearchAttributes(\n workflowDef: WorkflowDefinition,\n values: Record<string, unknown> | undefined,\n): TypedSearchAttributes | undefined {\n if (!values || !workflowDef.searchAttributes) return undefined;\n const pairs: SearchAttributePair[] = [];\n for (const [name, value] of Object.entries(values)) {\n if (value === undefined) continue;\n const def = (workflowDef.searchAttributes as Record<string, SearchAttributeDefinition>)[name];\n if (!def) continue;\n const key = defineSearchAttributeKey(name, def.kind);\n pairs.push({ key, value } as SearchAttributePair);\n }\n return pairs.length > 0 ? new TypedSearchAttributes(pairs) : undefined;\n}\n\n/**\n * Typed workflow handle with validated results using neverthrow Result/ResultAsync\n */\nexport type TypedWorkflowHandle<TWorkflow extends WorkflowDefinition> = {\n workflowId: string;\n\n /**\n * Type-safe queries based on workflow definition with Result pattern\n * Each query returns ResultAsync<T, Error> instead of Promise<T>\n */\n queries: {\n [K in keyof ClientInferWorkflowQueries<TWorkflow>]: ClientInferWorkflowQueries<TWorkflow>[K] extends (\n ...args: infer Args\n ) => ResultAsync<infer R, Error>\n ? (\n ...args: Args\n ) => ResultAsync<\n R,\n QueryValidationError | WorkflowExecutionNotFoundError | RuntimeClientError\n >\n : never;\n };\n\n /**\n * Type-safe signals based on workflow definition with Result pattern\n * Each signal returns ResultAsync<void, Error> instead of Promise<void>\n */\n signals: {\n [K in keyof ClientInferWorkflowSignals<TWorkflow>]: ClientInferWorkflowSignals<TWorkflow>[K] extends (\n ...args: infer Args\n ) => ResultAsync<void, Error>\n ? (\n ...args: Args\n ) => ResultAsync<\n void,\n SignalValidationError | WorkflowExecutionNotFoundError | RuntimeClientError\n >\n : never;\n };\n\n /**\n * Type-safe updates based on workflow definition with Result pattern\n * Each update returns ResultAsync<T, Error> instead of Promise<T>\n */\n updates: {\n [K in keyof ClientInferWorkflowUpdates<TWorkflow>]: ClientInferWorkflowUpdates<TWorkflow>[K] extends (\n ...args: infer Args\n ) => ResultAsync<infer R, Error>\n ? (\n ...args: Args\n ) => ResultAsync<\n R,\n UpdateValidationError | WorkflowExecutionNotFoundError | RuntimeClientError\n >\n : never;\n };\n\n /**\n * Get workflow result with Result pattern\n */\n result: () => ResultAsync<\n ClientInferOutput<TWorkflow>,\n | WorkflowValidationError\n | WorkflowFailedError\n | WorkflowExecutionNotFoundError\n | RuntimeClientError\n >;\n\n /**\n * Terminate workflow with Result pattern\n */\n terminate: (\n reason?: string,\n ) => ResultAsync<void, WorkflowExecutionNotFoundError | RuntimeClientError>;\n\n /**\n * Cancel workflow with Result pattern\n */\n cancel: () => ResultAsync<void, WorkflowExecutionNotFoundError | RuntimeClientError>;\n\n /**\n * Get workflow execution description including status and metadata\n */\n describe: () => ResultAsync<\n Awaited<ReturnType<WorkflowHandle[\"describe\"]>>,\n WorkflowExecutionNotFoundError | RuntimeClientError\n >;\n\n /**\n * Fetch the workflow execution history\n */\n fetchHistory: () => ResultAsync<\n Awaited<ReturnType<WorkflowHandle[\"fetchHistory\"]>>,\n WorkflowExecutionNotFoundError | RuntimeClientError\n >;\n};\n\n/**\n * Typed Temporal client with neverthrow Result/ResultAsync pattern based on a contract\n *\n * Provides type-safe methods to start and execute workflows\n * defined in the contract, with explicit error handling using Result pattern.\n */\nexport class TypedClient<TContract extends ContractDefinition> {\n /**\n * Typed wrapper around Temporal's `client.schedule.create(...)` and\n * related lifecycle methods. Fires the underlying `startWorkflow` action\n * with args validated against the contract's input schema.\n *\n * **Requires `@temporalio/client` 1.16+.** The Schedule API was added in\n * 1.16; on older versions this property is unset and any access throws.\n * The package's peer dep is pinned to `^1.16.0` so the standard install\n * paths surface a peer-dependency warning rather than a runtime crash.\n *\n * @example\n * ```ts\n * const result = await client.schedule.create(\"processOrder\", {\n * scheduleId: \"daily-sweep\",\n * spec: { cronExpressions: [\"0 2 * * *\"] },\n * args: { orderId: \"sweep\" },\n * });\n *\n * result.match(\n * async (handle) => { await handle.pause(\"maintenance\"); },\n * (error) => console.error(\"schedule create failed\", error),\n * );\n * ```\n */\n readonly schedule: TypedScheduleClient<TContract>;\n\n private constructor(\n private readonly contract: TContract,\n private readonly client: Client,\n ) {\n // `client.schedule` is the ScheduleClient wired into Temporal's\n // top-level `Client` since 1.16. Fail early with a clear message if a\n // consumer is on an older version (peer dep is pinned to ^1.16, but\n // installs that ignore peer-dep warnings shouldn't crash with a\n // confusing `Cannot read properties of undefined`).\n if (!client.schedule) {\n throw new Error(\n \"TypedClient requires @temporalio/client >= 1.16 (the Schedule API was added in 1.16). \" +\n \"Found a Client instance without a `schedule` property — please upgrade.\",\n );\n }\n this.schedule = new TypedScheduleClient(contract, client.schedule);\n }\n\n /**\n * Create a typed Temporal client with neverthrow pattern from a contract\n *\n * @example\n * ```ts\n * const connection = await Connection.connect();\n * const temporalClient = new Client({ connection });\n * const client = TypedClient.create(myContract, temporalClient);\n *\n * const result = await client.executeWorkflow('processOrder', {\n * workflowId: 'order-123',\n * args: { ... },\n * });\n *\n * result.match(\n * (output) => console.log('Success:', output),\n * (error) => console.error('Failed:', error),\n * );\n * ```\n */\n static create<TContract extends ContractDefinition>(\n contract: TContract,\n client: Client,\n ): TypedClient<TContract> {\n return new TypedClient(contract, client);\n }\n\n /**\n * Start a workflow and return a typed handle with ResultAsync pattern\n *\n * @example\n * ```ts\n * const handleResult = await client.startWorkflow('processOrder', {\n * workflowId: 'order-123',\n * args: { orderId: 'ORD-123' },\n * workflowExecutionTimeout: '1 day',\n * retry: { maximumAttempts: 3 },\n * });\n *\n * handleResult.match(\n * async (handle) => {\n * const result = await handle.result();\n * // ... handle result\n * },\n * (error) => console.error('Failed to start:', error),\n * );\n * ```\n */\n startWorkflow<TWorkflowName extends keyof TContract[\"workflows\"]>(\n workflowName: TWorkflowName,\n {\n args,\n searchAttributes,\n ...temporalOptions\n }: TypedWorkflowStartOptions<TContract, TWorkflowName>,\n ): ResultAsync<\n TypedWorkflowHandle<TContract[\"workflows\"][TWorkflowName]>,\n | WorkflowNotFoundError\n | WorkflowValidationError\n | WorkflowAlreadyStartedError\n | RuntimeClientError\n > {\n type Ok = TypedWorkflowHandle<TContract[\"workflows\"][TWorkflowName]>;\n type Err =\n | WorkflowNotFoundError\n | WorkflowValidationError\n | WorkflowAlreadyStartedError\n | RuntimeClientError;\n const work = async (): Promise<Result<Ok, Err>> => {\n const definition = this.contract.workflows[workflowName as string];\n if (!definition) {\n return err(createWorkflowNotFoundError(workflowName, this.contract));\n }\n\n const inputResult = await definition.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return err(createWorkflowValidationError(workflowName, \"input\", inputResult.issues));\n }\n\n const typedSearchAttributes = toTypedSearchAttributes(\n definition,\n searchAttributes as Record<string, unknown> | undefined,\n );\n\n try {\n const handle = await this.client.workflow.start(workflowName as string, {\n ...temporalOptions,\n taskQueue: this.contract.taskQueue,\n args: [inputResult.value],\n ...(typedSearchAttributes ? { typedSearchAttributes } : {}),\n });\n return ok(this.createTypedHandle(handle, definition) as Ok);\n } catch (error) {\n return err(classifyStartError(\"startWorkflow\", error));\n }\n };\n return makeResultAsync(work);\n }\n\n /**\n * Send a signal to a workflow, starting it first if it doesn't already exist.\n *\n * Validates both halves of the call against the contract:\n * - `args` against the workflow's input schema\n * - `signalArgs` against the named signal's input schema\n *\n * Returns a `TypedWorkflowHandleWithSignaledRunId` — the same shape as\n * `startWorkflow`'s handle, plus a `signaledRunId` field for correlating\n * the signal with the (possibly pre-existing) workflow execution chain.\n *\n * @example\n * ```ts\n * const result = await client.signalWithStart('processOrder', {\n * workflowId: 'order-123',\n * args: { orderId: 'ORD-123', customerId: 'CUST-1' },\n * signalName: 'cancel',\n * signalArgs: { reason: 'duplicate' },\n * });\n *\n * result.match(\n * (handle) => console.log('signaled run', handle.signaledRunId),\n * (error) => console.error('signalWithStart failed', error),\n * );\n * ```\n */\n signalWithStart<\n TWorkflowName extends keyof TContract[\"workflows\"],\n TSignalName extends keyof TContract[\"workflows\"][TWorkflowName][\"signals\"] & string,\n >(\n workflowName: TWorkflowName,\n {\n args,\n signalName,\n signalArgs,\n searchAttributes,\n ...temporalOptions\n }: TypedSignalWithStartOptions<TContract, TWorkflowName, TSignalName>,\n ): ResultAsync<\n TypedWorkflowHandleWithSignaledRunId<TContract[\"workflows\"][TWorkflowName]>,\n | WorkflowNotFoundError\n | WorkflowValidationError\n | SignalValidationError\n | WorkflowAlreadyStartedError\n | RuntimeClientError\n > {\n type Ok = TypedWorkflowHandleWithSignaledRunId<TContract[\"workflows\"][TWorkflowName]>;\n type Err =\n | WorkflowNotFoundError\n | WorkflowValidationError\n | SignalValidationError\n | WorkflowAlreadyStartedError\n | RuntimeClientError;\n\n const work = async (): Promise<Result<Ok, Err>> => {\n const definition = this.contract.workflows[workflowName as string];\n if (!definition) {\n return err(createWorkflowNotFoundError(workflowName, this.contract));\n }\n\n // Validate workflow input\n const inputResult = await definition.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return err(createWorkflowValidationError(workflowName, \"input\", inputResult.issues));\n }\n\n // Validate signal input\n const signalDef = (definition.signals as Record<string, SignalDefinition> | undefined)?.[\n signalName\n ];\n if (!signalDef) {\n // Type-level constraint should already prevent this; defensive for\n // raw-call / union-typed-name corner cases.\n return err(\n new SignalValidationError(signalName, [\n {\n message: `Signal \"${signalName}\" is not declared on workflow \"${String(workflowName)}\".`,\n },\n ]),\n );\n }\n const signalInputResult = await signalDef.input[\"~standard\"].validate(signalArgs);\n if (signalInputResult.issues) {\n return err(new SignalValidationError(signalName, signalInputResult.issues));\n }\n\n const typedSearchAttributes = toTypedSearchAttributes(\n definition,\n searchAttributes as Record<string, unknown> | undefined,\n );\n\n try {\n const handle = await this.client.workflow.signalWithStart(workflowName as string, {\n ...temporalOptions,\n taskQueue: this.contract.taskQueue,\n args: [inputResult.value],\n signal: signalName,\n signalArgs: [signalInputResult.value],\n ...(typedSearchAttributes ? { typedSearchAttributes } : {}),\n });\n const typed = this.createTypedHandle(handle, definition) as TypedWorkflowHandle<\n TContract[\"workflows\"][TWorkflowName]\n >;\n return ok({ ...typed, signaledRunId: handle.signaledRunId } as Ok);\n } catch (error) {\n return err(classifyStartError(\"signalWithStart\", error));\n }\n };\n return makeResultAsync(work);\n }\n\n /**\n * Execute a workflow (start and wait for result) with ResultAsync pattern\n *\n * @example\n * ```ts\n * const result = await client.executeWorkflow('processOrder', {\n * workflowId: 'order-123',\n * args: { orderId: 'ORD-123' },\n * workflowExecutionTimeout: '1 day',\n * retry: { maximumAttempts: 3 },\n * });\n *\n * result.match(\n * (output) => console.log('Order processed:', output.status),\n * (error) => console.error('Processing failed:', error),\n * );\n * ```\n */\n executeWorkflow<TWorkflowName extends keyof TContract[\"workflows\"]>(\n workflowName: TWorkflowName,\n {\n args,\n searchAttributes,\n ...temporalOptions\n }: TypedWorkflowStartOptions<TContract, TWorkflowName>,\n ): ResultAsync<\n ClientInferOutput<TContract[\"workflows\"][TWorkflowName]>,\n | WorkflowNotFoundError\n | WorkflowValidationError\n | WorkflowAlreadyStartedError\n | WorkflowFailedError\n | WorkflowExecutionNotFoundError\n | RuntimeClientError\n > {\n type Ok = ClientInferOutput<TContract[\"workflows\"][TWorkflowName]>;\n type Err =\n | WorkflowNotFoundError\n | WorkflowValidationError\n | WorkflowAlreadyStartedError\n | WorkflowFailedError\n | WorkflowExecutionNotFoundError\n | RuntimeClientError;\n const work = async (): Promise<Result<Ok, Err>> => {\n const definition = this.contract.workflows[workflowName as string];\n if (!definition) {\n return err(createWorkflowNotFoundError(workflowName, this.contract));\n }\n\n const inputResult = await definition.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return err(createWorkflowValidationError(workflowName, \"input\", inputResult.issues));\n }\n\n const typedSearchAttributes = toTypedSearchAttributes(\n definition,\n searchAttributes as Record<string, unknown> | undefined,\n );\n\n try {\n const result = await this.client.workflow.execute(workflowName as string, {\n ...temporalOptions,\n taskQueue: this.contract.taskQueue,\n args: [inputResult.value],\n ...(typedSearchAttributes ? { typedSearchAttributes } : {}),\n });\n\n const outputResult = await definition.output[\"~standard\"].validate(result);\n if (outputResult.issues) {\n return err(createWorkflowValidationError(workflowName, \"output\", outputResult.issues));\n }\n\n return ok(outputResult.value as Ok);\n } catch (error) {\n // executeWorkflow combines start + result, so it can surface any of\n // the discriminated kinds. Inline the three checks rather than\n // routing through a dedicated helper — this is the only call site\n // that needs the full union.\n if (error instanceof WorkflowExecutionAlreadyStartedError) {\n return err(new WorkflowAlreadyStartedError(error.workflowType, error.workflowId, error));\n }\n if (error instanceof TemporalWorkflowFailedError) {\n // Forward Temporal's nested cause directly — see\n // {@link classifyResultError} for the same rationale: Temporal's\n // `WorkflowFailedError` is a wrapper, and the actionable failure\n // (ApplicationFailure, CancelledFailure, etc.) lives on `.cause`.\n return err(new WorkflowFailedError(temporalOptions.workflowId, error.cause));\n }\n if (error instanceof TemporalWorkflowNotFoundError) {\n return err(\n new WorkflowExecutionNotFoundError(\n error.workflowId || temporalOptions.workflowId,\n error.runId,\n error,\n ),\n );\n }\n return err(createRuntimeClientError(\"executeWorkflow\", error));\n }\n };\n return makeResultAsync(work);\n }\n\n /**\n * Get a handle to an existing workflow with ResultAsync pattern\n *\n * @example\n * ```ts\n * const handleResult = await client.getHandle('processOrder', 'order-123');\n * handleResult.match(\n * async (handle) => {\n * const result = await handle.result();\n * // ... handle result\n * },\n * (error) => console.error('Failed to get handle:', error),\n * );\n * ```\n */\n getHandle<TWorkflowName extends keyof TContract[\"workflows\"]>(\n workflowName: TWorkflowName,\n workflowId: string,\n ): ResultAsync<\n TypedWorkflowHandle<TContract[\"workflows\"][TWorkflowName]>,\n WorkflowNotFoundError | RuntimeClientError\n > {\n type Ok = TypedWorkflowHandle<TContract[\"workflows\"][TWorkflowName]>;\n type Err = WorkflowNotFoundError | RuntimeClientError;\n const work = async (): Promise<Result<Ok, Err>> => {\n const definition = this.contract.workflows[workflowName as string];\n if (!definition) {\n return err(createWorkflowNotFoundError(workflowName, this.contract));\n }\n\n try {\n const handle = this.client.workflow.getHandle(workflowId);\n return ok(this.createTypedHandle(handle, definition) as Ok);\n } catch (error) {\n return err(createRuntimeClientError(\"getHandle\", error));\n }\n };\n return makeResultAsync(work);\n }\n\n private createTypedHandle<TWorkflow extends WorkflowDefinition>(\n workflowHandle: WorkflowHandle,\n definition: TWorkflow,\n ): TypedWorkflowHandle<TWorkflow> {\n const queries = buildValidatedProxy({\n defs: definition.queries,\n operation: \"query\",\n workflowId: workflowHandle.workflowId,\n makeValidationError: (name, direction, issues) =>\n new QueryValidationError(name, direction, issues),\n invoke: (name, validated) => workflowHandle.query(name, validated),\n validateOutput: (def) => def.output,\n }) as TypedWorkflowHandle<TWorkflow>[\"queries\"];\n\n const signals = buildValidatedProxy({\n defs: definition.signals,\n operation: \"signal\",\n workflowId: workflowHandle.workflowId,\n makeValidationError: (name, _direction, issues) => new SignalValidationError(name, issues),\n invoke: async (name, validated) => {\n await workflowHandle.signal(name, validated);\n return undefined;\n },\n validateOutput: () => null,\n }) as TypedWorkflowHandle<TWorkflow>[\"signals\"];\n\n const updates = buildValidatedProxy({\n defs: definition.updates,\n operation: \"update\",\n workflowId: workflowHandle.workflowId,\n makeValidationError: (name, direction, issues) =>\n new UpdateValidationError(name, direction, issues),\n invoke: (name, validated) => workflowHandle.executeUpdate(name, { args: [validated] }),\n validateOutput: (def) => def.output,\n }) as TypedWorkflowHandle<TWorkflow>[\"updates\"];\n\n return {\n workflowId: workflowHandle.workflowId,\n queries,\n signals,\n updates,\n result: (): ResultAsync<\n ClientInferOutput<TWorkflow>,\n | WorkflowValidationError\n | WorkflowFailedError\n | WorkflowExecutionNotFoundError\n | RuntimeClientError\n > => {\n type Ok = ClientInferOutput<TWorkflow>;\n type Err =\n | WorkflowValidationError\n | WorkflowFailedError\n | WorkflowExecutionNotFoundError\n | RuntimeClientError;\n const work = async (): Promise<Result<Ok, Err>> => {\n try {\n const result = await workflowHandle.result();\n const outputResult = await definition.output[\"~standard\"].validate(result);\n if (outputResult.issues) {\n return err(\n new WorkflowValidationError(\n workflowHandle.workflowId,\n \"output\",\n outputResult.issues,\n ),\n );\n }\n return ok(outputResult.value as Ok);\n } catch (error) {\n return err(classifyResultError(\"result\", error, workflowHandle.workflowId));\n }\n };\n return makeResultAsync(work);\n },\n terminate: (\n reason?: string,\n ): ResultAsync<void, WorkflowExecutionNotFoundError | RuntimeClientError> =>\n ResultAsync.fromPromise(workflowHandle.terminate(reason), (error) =>\n classifyHandleError(\"terminate\", error, workflowHandle.workflowId),\n ).map(() => undefined),\n cancel: (): ResultAsync<void, WorkflowExecutionNotFoundError | RuntimeClientError> =>\n ResultAsync.fromPromise(workflowHandle.cancel(), (error) =>\n classifyHandleError(\"cancel\", error, workflowHandle.workflowId),\n ).map(() => undefined),\n describe: (): ResultAsync<\n Awaited<ReturnType<WorkflowHandle[\"describe\"]>>,\n WorkflowExecutionNotFoundError | RuntimeClientError\n > =>\n ResultAsync.fromPromise(workflowHandle.describe(), (error) =>\n classifyHandleError(\"describe\", error, workflowHandle.workflowId),\n ),\n fetchHistory: (): ResultAsync<\n Awaited<ReturnType<WorkflowHandle[\"fetchHistory\"]>>,\n WorkflowExecutionNotFoundError | RuntimeClientError\n > =>\n ResultAsync.fromPromise(workflowHandle.fetchHistory(), (error) =>\n classifyHandleError(\"fetchHistory\", error, workflowHandle.workflowId),\n ),\n };\n }\n}\n\nfunction createRuntimeClientError(operation: string, error: unknown): RuntimeClientError {\n return new RuntimeClientError(operation, error);\n}\n\nfunction createWorkflowNotFoundError(\n workflowName: string | number | symbol,\n contract: ContractDefinition,\n): WorkflowNotFoundError {\n return new WorkflowNotFoundError(String(workflowName), Object.keys(contract.workflows));\n}\n\nfunction createWorkflowValidationError(\n workflowName: string | number | symbol,\n direction: \"input\" | \"output\",\n issues: ReadonlyArray<StandardSchemaV1.Issue>,\n): WorkflowValidationError {\n return new WorkflowValidationError(String(workflowName), direction, issues);\n}\n\ntype DefWithInput = { readonly input: StandardSchemaV1 };\n\ntype ProxyOptions<TDef extends DefWithInput, TValidationError extends Error> = {\n readonly defs: Record<string, TDef> | undefined;\n readonly operation: string;\n /**\n * Workflow ID of the handle these proxies bind to. Used by\n * {@link classifyHandleError} to surface\n * {@link WorkflowExecutionNotFoundError} with the targeted ID even when\n * Temporal's error doesn't carry it.\n */\n readonly workflowId: string;\n readonly makeValidationError: (\n name: string,\n direction: \"input\" | \"output\",\n issues: ReadonlyArray<StandardSchemaV1.Issue>,\n ) => TValidationError;\n readonly invoke: (name: string, validatedInput: unknown) => Promise<unknown>;\n /**\n * Returns the schema to validate the invoke result against, or `null` to skip\n * output validation (used by signals, which don't return a value).\n */\n readonly validateOutput: (def: TDef) => StandardSchemaV1 | null;\n};\n\n/**\n * Build a `{ name: (args) => ResultAsync<...> }` proxy for a contract's\n * queries/signals/updates. The three call sites differ only in how they\n * invoke Temporal and whether they validate output, so the shared\n * input-validate → invoke → output-validate → wrap-Result pipeline lives\n * here once.\n */\nfunction buildValidatedProxy<TDef extends DefWithInput, TValidationError extends Error>({\n defs,\n operation,\n workflowId,\n makeValidationError,\n invoke,\n validateOutput,\n}: ProxyOptions<TDef, TValidationError>): Record<\n string,\n (\n args: unknown,\n ) => ResultAsync<unknown, TValidationError | WorkflowExecutionNotFoundError | RuntimeClientError>\n> {\n const proxy: Record<\n string,\n (\n args: unknown,\n ) => ResultAsync<\n unknown,\n TValidationError | WorkflowExecutionNotFoundError | RuntimeClientError\n >\n > = {};\n if (!defs) return proxy;\n\n for (const [name, def] of Object.entries(defs)) {\n proxy[name] = (args) => {\n const work = async (): Promise<\n Result<unknown, TValidationError | WorkflowExecutionNotFoundError | RuntimeClientError>\n > => {\n const inputResult = await def.input[\"~standard\"].validate(args);\n if (inputResult.issues) {\n return err(makeValidationError(name, \"input\", inputResult.issues));\n }\n\n try {\n const result = await invoke(name, inputResult.value);\n const outputSchema = validateOutput(def);\n if (!outputSchema) {\n return ok(result);\n }\n const outputResult = await outputSchema[\"~standard\"].validate(result);\n if (outputResult.issues) {\n return err(makeValidationError(name, \"output\", outputResult.issues));\n }\n return ok(outputResult.value);\n } catch (error) {\n return err(classifyHandleError(operation, error, workflowId));\n }\n };\n return makeResultAsync(work);\n };\n }\n\n return proxy;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@temporal-contract/client",
3
- "version": "0.2.0",
4
- "description": "Client utilities with Result/Future pattern for consuming temporal-contract workflows",
3
+ "version": "2.0.0",
4
+ "description": "Client utilities with neverthrow Result/ResultAsync for consuming temporal-contract workflows",
5
5
  "keywords": [
6
6
  "client",
7
7
  "contract",
8
- "future",
8
+ "neverthrow",
9
9
  "result",
10
10
  "temporal",
11
11
  "typescript"
@@ -14,14 +14,20 @@
14
14
  "bugs": {
15
15
  "url": "https://github.com/btravers/temporal-contract/issues"
16
16
  },
17
+ "license": "MIT",
18
+ "author": "Benoit TRAVERS <benoit.travers.fr@gmail.com>",
17
19
  "repository": {
18
20
  "type": "git",
19
21
  "url": "https://github.com/btravers/temporal-contract.git",
20
22
  "directory": "packages/client"
21
23
  },
22
- "license": "MIT",
23
- "author": "Benoit TRAVERS <benoit.travers.fr@gmail.com>",
24
+ "files": [
25
+ "dist"
26
+ ],
24
27
  "type": "module",
28
+ "main": "./dist/index.cjs",
29
+ "module": "./dist/index.mjs",
30
+ "types": "./dist/index.d.mts",
25
31
  "exports": {
26
32
  ".": {
27
33
  "import": {
@@ -35,35 +41,32 @@
35
41
  },
36
42
  "./package.json": "./package.json"
37
43
  },
38
- "main": "./dist/index.cjs",
39
- "module": "./dist/index.mjs",
40
- "types": "./dist/index.d.mts",
41
- "files": [
42
- "dist"
43
- ],
44
44
  "dependencies": {
45
45
  "@standard-schema/spec": "1.1.0",
46
- "@swan-io/boxed": "3.2.1",
47
- "@temporal-contract/contract": "0.2.0"
46
+ "@temporal-contract/contract": "2.0.0"
48
47
  },
49
48
  "devDependencies": {
50
- "@temporalio/client": "1.14.1",
51
- "@temporalio/worker": "1.14.1",
52
- "@temporalio/workflow": "1.14.1",
53
- "@types/node": "25.2.3",
54
- "@vitest/coverage-v8": "4.0.18",
55
- "tsdown": "0.20.3",
56
- "typedoc": "0.28.17",
57
- "typedoc-plugin-markdown": "4.10.0",
58
- "typescript": "5.9.3",
59
- "vitest": "4.0.18",
60
- "zod": "4.3.6",
61
- "@temporal-contract/testing": "0.2.0",
62
- "@temporal-contract/tsconfig": "0.2.0",
49
+ "@temporalio/client": "1.17.0",
50
+ "@temporalio/common": "1.17.0",
51
+ "@temporalio/worker": "1.17.0",
52
+ "@temporalio/workflow": "1.17.0",
53
+ "@types/node": "24.12.2",
54
+ "@vitest/coverage-v8": "4.1.5",
55
+ "neverthrow": "8.2.0",
56
+ "tsdown": "0.21.10",
57
+ "typedoc": "0.28.19",
58
+ "typedoc-plugin-markdown": "4.11.0",
59
+ "typescript": "6.0.3",
60
+ "vitest": "4.1.5",
61
+ "zod": "4.4.3",
62
+ "@temporal-contract/testing": "2.0.0",
63
+ "@temporal-contract/tsconfig": "1.0.0",
63
64
  "@temporal-contract/typedoc": "0.1.0"
64
65
  },
65
66
  "peerDependencies": {
66
- "@temporalio/client": "^1"
67
+ "@temporalio/client": "^1.16.0",
68
+ "@temporalio/common": "^1",
69
+ "neverthrow": "^8"
67
70
  },
68
71
  "scripts": {
69
72
  "build": "tsdown src/index.ts --format cjs,esm --dts --clean",