@bounty-ai/agent-sdk 0.1.2 → 0.1.3

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.
package/dist/index.cjs CHANGED
@@ -105,6 +105,11 @@ var AgentClient = class {
105
105
  ...input.details ? { result: { details: input.details } } : {}
106
106
  });
107
107
  }
108
+ async getAssignmentReplies(assignmentId) {
109
+ return await this.postJson(`/agent/assignments/replies`, {
110
+ assignment_id: assignmentId
111
+ });
112
+ }
108
113
  async post(path, body) {
109
114
  const response = await this.fetchImpl(`${this.baseUrl}${path}`, {
110
115
  method: "POST",
@@ -118,6 +123,20 @@ var AgentClient = class {
118
123
  throw await this.toApiError(response);
119
124
  }
120
125
  }
126
+ async postJson(path, body) {
127
+ const response = await this.fetchImpl(`${this.baseUrl}${path}`, {
128
+ method: "POST",
129
+ headers: {
130
+ "content-type": "application/json",
131
+ authorization: `Bearer ${this.apiKey}`
132
+ },
133
+ body: JSON.stringify(body)
134
+ });
135
+ if (!response.ok) {
136
+ throw await this.toApiError(response);
137
+ }
138
+ return await response.json();
139
+ }
121
140
  async toApiError(response) {
122
141
  const raw = await response.text();
123
142
  let parsed = null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts","../src/signature.ts","../src/contracts.ts","../src/webhook.ts","../src/adapters.ts","../src/runtime.ts","../src/integrations.ts","../src/results.ts"],"sourcesContent":["export { SdkError, ApiError } from \"./errors\";\nexport { AgentClient, type ClientOptions } from \"./client\";\nexport { computeWebhookSignature, verifyWebhookSignature } from \"./signature\";\nexport {\n DEFAULT_SIGNATURE_HEADER,\n DEFAULT_TIMESTAMP_HEADER,\n createWebhookHandler,\n executeWebhook,\n} from \"./webhook\";\nexport {\n createExpressWebhookHandler,\n createFastifyWebhookHandler,\n createHonoWebhookHandler,\n createNextWebhookHandler,\n} from \"./adapters\";\nexport {\n createAssignmentSlugRouter,\n createAutoSubmitAssignmentHandler,\n type AssignmentExecutionHandler,\n type AssignmentExecutionResult,\n type AssignmentSlugRouterOptions,\n type AutoSubmitAssignmentHandlerOptions,\n} from \"./runtime\";\nexport { getContractVersion, parseAssignmentV1, toAssignmentEnvelopeV1 } from \"./contracts\";\nexport {\n createEmailDeliveryAction,\n createIntegrationAction,\n isEmailDeliveryAction,\n isIntegrationAction,\n type CreateEmailDeliveryActionInput,\n type CreateIntegrationActionInput,\n} from \"./integrations\";\nexport {\n createTablePayload,\n createTableResult,\n type CreateTableResultOptions,\n type TablePayload,\n type TableRow,\n} from \"./results\";\nexport type {\n ApiErrorBody,\n Assignment,\n AssignmentAction,\n AssignmentAckRequest,\n AssignmentAckStatus,\n AssignmentEnvelopeV1,\n AssignmentOutcome,\n AssignmentResult,\n AssignmentResultOutput,\n AssignmentResultSchema,\n EmailDeliveryAction,\n EmailDeliveryInput,\n EmailOutreachMode,\n EmailRecipient,\n IntegrationAction,\n AssignmentStatus,\n OutcomePayload,\n SdkContractVersion,\n SubmitErrorRequest,\n SubmitResultRequest,\n WebhookInput,\n} from \"./types\";\nexport type { WebhookHandlerOptions, WebhookHttpResponse } from \"./webhook\";\n","import type { ApiErrorBody } from \"./types\";\n\nexport class SdkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SdkError\";\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number;\n readonly code: string | undefined;\n readonly body: ApiErrorBody | null;\n readonly retryable: boolean;\n\n constructor(params: {\n status: number;\n message: string;\n code: string | undefined;\n body: ApiErrorBody | null;\n }) {\n super(params.message);\n this.name = \"ApiError\";\n this.status = params.status;\n this.code = params.code;\n this.body = params.body;\n this.retryable = params.status === 429 || params.status >= 500;\n }\n}\n","import { ApiError } from \"./errors\";\nimport type {\n ApiErrorBody,\n AssignmentAckRequest,\n AssignmentResult,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\nexport type ClientOptions = {\n baseUrl: string;\n apiKey: string;\n fetchImpl?: typeof fetch;\n};\n\nexport class AgentClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async ackAssignment(assignmentId: string, request: AssignmentAckRequest): Promise<void> {\n await this.post(`/agent/assignments/ack`, {\n assignment_id: assignmentId,\n ...request,\n });\n }\n\n async submitResult(input: SubmitResultRequest): Promise<void> {\n const payload: AssignmentResult = {\n status: input.status,\n ...(input.result ? { result: input.result } : {}),\n ...(input.error ? { error: input.error } : {}),\n };\n\n await this.post(`/agent/assignments/submit`, {\n assignment_id: input.assignmentId,\n ...payload,\n ...(input.actions ? { actions: input.actions } : {}),\n });\n }\n\n async submitError(input: SubmitErrorRequest): Promise<void> {\n await this.submitResult({\n assignmentId: input.assignmentId,\n status: \"timed_out\",\n error: input.error,\n ...(input.details ? { result: { details: input.details } } : {}),\n });\n }\n\n private async post(path: string, body: Record<string, unknown>): Promise<void> {\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await this.toApiError(response);\n }\n }\n\n private async toApiError(response: Response): Promise<ApiError> {\n const raw = await response.text();\n let parsed: ApiErrorBody | null = null;\n\n if (raw) {\n try {\n parsed = JSON.parse(raw) as ApiErrorBody;\n } catch {\n parsed = { message: raw };\n }\n }\n\n return new ApiError({\n status: response.status,\n message:\n parsed?.message ?? `API request failed (${response.status}): ${raw || response.statusText}`,\n code: parsed?.code,\n body: parsed,\n });\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { SdkError } from \"./errors\";\n\nexport function computeWebhookSignature(params: {\n webhookSecret: string;\n timestamp: string;\n body: string;\n}) {\n const signedPayload = `${params.timestamp}.${params.body}`;\n const digest = createHmac(\"sha256\", params.webhookSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n return `sha256=${digest}`;\n}\n\nexport function verifyWebhookSignature(params: {\n webhookSecret: string;\n timestamp?: string;\n body: string;\n signature?: string;\n}) {\n if (!params.timestamp || !params.signature) {\n throw new SdkError(\"Missing webhook timestamp or signature\");\n }\n\n const expected = computeWebhookSignature({\n webhookSecret: params.webhookSecret,\n timestamp: params.timestamp,\n body: params.body,\n });\n\n const expectedBuffer = Buffer.from(expected, \"utf8\");\n const actualBuffer = Buffer.from(params.signature, \"utf8\");\n\n if (expectedBuffer.length !== actualBuffer.length) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n\n if (!timingSafeEqual(expectedBuffer, actualBuffer)) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n}\n","import { SdkError } from \"./errors\";\nimport type { Assignment, AssignmentEnvelopeV1, AssignmentResultSchema, SdkContractVersion } from \"./types\";\n\nconst CONTRACT_VERSION: SdkContractVersion = \"v1\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction parseAssignmentRecord(record: Record<string, unknown>): Assignment {\n if (typeof record.assignment_id !== \"string\") {\n throw new SdkError(\"Missing assignment_id\");\n }\n if (typeof record.template_slug !== \"string\") {\n throw new SdkError(\"Missing template_slug\");\n }\n if (!isObject(record.outcome)) {\n throw new SdkError(\"Missing outcome\");\n }\n if (!isObject(record.result_schema)) {\n throw new SdkError(\"Missing result_schema\");\n }\n\n const outcome = record.outcome;\n if (typeof outcome.title !== \"string\") {\n throw new SdkError(\"Missing outcome.title\");\n }\n if (!isObject(outcome.payload)) {\n throw new SdkError(\"Missing outcome.payload\");\n }\n\n const parsedResultSchema = record.result_schema as AssignmentResultSchema;\n\n return {\n assignment_id: record.assignment_id,\n template_slug: record.template_slug,\n result_schema: parsedResultSchema,\n outcome: {\n title: outcome.title,\n payload: outcome.payload,\n ...(typeof outcome.requested_unit_price_value === \"number\"\n ? { requested_unit_price_value: outcome.requested_unit_price_value }\n : {}),\n ...(typeof outcome.requested_total_price_value === \"number\"\n ? { requested_total_price_value: outcome.requested_total_price_value }\n : {}),\n ...(typeof outcome.currency === \"string\" ? { currency: outcome.currency } : {}),\n ...(typeof outcome.time_window === \"string\" ? { time_window: outcome.time_window } : {}),\n },\n };\n}\n\nexport function parseAssignmentV1(body: string): Assignment {\n let payload: unknown;\n try {\n payload = JSON.parse(body);\n } catch {\n throw new SdkError(\"Invalid JSON payload\");\n }\n\n if (!isObject(payload)) {\n throw new SdkError(\"Invalid assignment payload\");\n }\n\n if (payload.version !== CONTRACT_VERSION) {\n throw new SdkError(\"Unsupported assignment contract version\");\n }\n if (!isObject(payload.assignment)) {\n throw new SdkError(\"Missing assignment envelope payload\");\n }\n\n return parseAssignmentRecord(payload.assignment);\n}\n\nexport function toAssignmentEnvelopeV1(assignment: Assignment): AssignmentEnvelopeV1 {\n return {\n version: CONTRACT_VERSION,\n assignment,\n };\n}\n\nexport function getContractVersion(): SdkContractVersion {\n return CONTRACT_VERSION;\n}\n","import { SdkError } from \"./errors\";\nimport { parseAssignmentV1 } from \"./contracts\";\nimport { verifyWebhookSignature } from \"./signature\";\nimport type { Assignment, AssignmentResult, WebhookInput } from \"./types\";\n\nexport const DEFAULT_SIGNATURE_HEADER = \"x-bounty-signature\";\nexport const DEFAULT_TIMESTAMP_HEADER = \"x-bounty-timestamp\";\n\nexport type WebhookHandlerOptions = {\n webhookSecret: string;\n onAssignment: (params: { assignment: Assignment }) => Promise<AssignmentResult>;\n verifySignature?: boolean;\n};\n\nexport type WebhookHttpResponse = {\n status: number;\n body: AssignmentResult;\n};\n\nexport function createWebhookHandler(options: WebhookHandlerOptions) {\n const shouldVerify = options.verifySignature ?? true;\n\n return async function handleWebhook(input: WebhookInput): Promise<AssignmentResult> {\n if (shouldVerify) {\n verifyWebhookSignature({\n webhookSecret: options.webhookSecret,\n body: input.body,\n ...(input.signature ? { signature: input.signature } : {}),\n ...(input.timestamp ? { timestamp: input.timestamp } : {}),\n });\n }\n\n const assignment = parseAssignmentV1(input.body);\n return options.onAssignment({ assignment });\n };\n}\n\nexport async function executeWebhook(\n handler: ReturnType<typeof createWebhookHandler>,\n input: WebhookInput,\n): Promise<WebhookHttpResponse> {\n try {\n const body = await handler(input);\n return {\n status: 200,\n body,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n const sdkError = error instanceof SdkError ? error : new SdkError(message);\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: sdkError.message,\n },\n };\n }\n}\n","import {\n DEFAULT_SIGNATURE_HEADER,\n DEFAULT_TIMESTAMP_HEADER,\n createWebhookHandler,\n executeWebhook,\n type WebhookHttpResponse,\n type WebhookHandlerOptions,\n} from \"./webhook\";\nimport { SdkError } from \"./errors\";\n\nfunction headerValue(headers: Record<string, string | string[] | undefined>, key: string) {\n const value = headers[key] ?? headers[key.toLowerCase()];\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n}\n\nfunction normalizeBody(body: unknown): string {\n if (typeof body === \"string\") {\n return body;\n }\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n if (body === undefined || body === null) {\n return \"\";\n }\n return JSON.stringify(body);\n}\n\nasync function readExpressBody(req: {\n body?: unknown;\n rawBody?: string | Buffer;\n on?: (event: string, listener: (...args: unknown[]) => void) => void;\n}) {\n if (typeof req.rawBody === \"string\" || Buffer.isBuffer(req.rawBody)) {\n return normalizeBody(req.rawBody);\n }\n\n if (req.body !== undefined) {\n if (typeof req.body === \"object\" && req.body !== null && !Buffer.isBuffer(req.body)) {\n throw new SdkError(\n \"Express webhook route must receive raw bytes. Mount webhook routes before express.json() or exclude them from JSON parsing.\",\n );\n }\n return normalizeBody(req.body);\n }\n\n if (!req.on) {\n return \"\";\n }\n\n return await new Promise<string>((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n req.on?.(\"data\", (chunk: unknown) => {\n if (typeof chunk === \"string\") {\n chunks.push(Buffer.from(chunk, \"utf8\"));\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n }\n });\n req.on?.(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n req.on?.(\"error\", (error: unknown) => {\n reject(error);\n });\n });\n}\n\nfunction toWebhookInput(params: {\n body: string;\n signature: string | undefined;\n timestamp: string | undefined;\n}) {\n return {\n body: params.body,\n ...(params.signature ? { signature: params.signature } : {}),\n ...(params.timestamp ? { timestamp: params.timestamp } : {}),\n };\n}\n\nfunction toBadRequest(error: unknown): WebhookHttpResponse {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: message,\n },\n };\n}\n\nexport function createExpressWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function expressWebhook(\n req: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n res: {\n status: (code: number) => { json: (payload: unknown) => void };\n },\n ) {\n let result: WebhookHttpResponse;\n try {\n const body = await readExpressBody(req);\n result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(req.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(req.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n } catch (error) {\n result = toBadRequest(error);\n }\n\n res.status(result.status).json(result.body);\n };\n}\n\nexport function createFastifyWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function fastifyWebhook(\n request: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n reply: {\n code: (statusCode: number) => { send: (payload: unknown) => void };\n },\n ) {\n const body = request.rawBody ?? normalizeBody(request.body);\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(request.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(request.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n reply.code(result.status).send(result.body);\n };\n}\n\nexport function createNextWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function nextWebhook(request: Request): Promise<Response> {\n const body = await request.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: request.headers.get(DEFAULT_SIGNATURE_HEADER) ?? undefined,\n timestamp: request.headers.get(DEFAULT_TIMESTAMP_HEADER) ?? undefined,\n }),\n );\n\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n\nexport function createHonoWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function honoWebhook(c: {\n req: {\n text: () => Promise<string>;\n header: (name: string) => string | undefined;\n };\n json: (payload: unknown, status?: number) => Response;\n }) {\n const body = await c.req.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: c.req.header(DEFAULT_SIGNATURE_HEADER),\n timestamp: c.req.header(DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n return c.json(result.body, result.status);\n };\n}\n","import { AgentClient, type ClientOptions } from \"./client\";\nimport { SdkError } from \"./errors\";\nimport type {\n Assignment,\n AssignmentAction,\n AssignmentResult,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\ntype RuntimeLogger = {\n info?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n};\n\nexport type AutoSubmitAssignmentHandlerOptions = {\n client: AgentClient | ClientOptions;\n runAssignment: (params: { assignment: Assignment }) => Promise<AssignmentExecutionOutput>;\n acceptAssignment?: (params: { assignment: Assignment }) => Promise<AssignmentResult> | AssignmentResult;\n createSubmitRequest?: (params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n }) => SubmitResultRequest;\n createSubmitErrorRequest?: (params: { assignment: Assignment; error: unknown }) => SubmitErrorRequest;\n executionMode?: \"background\" | \"blocking\";\n logger?: RuntimeLogger;\n};\n\nexport type AssignmentExecutionResult = {\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n};\n\nexport type AssignmentExecutionOutput = Record<string, unknown> | AssignmentExecutionResult;\n\nexport type AssignmentExecutionHandler = (\n params: { assignment: Assignment },\n) => Promise<AssignmentExecutionOutput>;\n\nexport type AssignmentSlugRouterOptions = {\n handlers: Record<string, AssignmentExecutionHandler>;\n fallback?: AssignmentExecutionHandler;\n normalizeSlug?: (slug: string) => string;\n};\n\nfunction toMessage(error: unknown) {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return \"Unknown assignment execution error\";\n}\n\nfunction defaultAcceptedResponse(assignment: Assignment): AssignmentResult {\n return {\n status: \"assigned\",\n result: {\n accepted: true,\n assignment_id: assignment.assignment_id,\n },\n };\n}\n\nfunction defaultSubmitRequest(params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n}): SubmitResultRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n status: \"verifying\",\n result: params.result,\n ...(params.actions && params.actions.length > 0 ? { actions: params.actions } : {}),\n };\n}\n\nfunction defaultSubmitErrorRequest(params: { assignment: Assignment; error: unknown }): SubmitErrorRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n error: toMessage(params.error),\n };\n}\n\nfunction asClient(client: AgentClient | ClientOptions) {\n return client instanceof AgentClient ? client : new AgentClient(client);\n}\n\nfunction normalizeExecutionOutput(output: AssignmentExecutionOutput): AssignmentExecutionResult {\n if (\n output &&\n typeof output === \"object\" &&\n !Array.isArray(output) &&\n \"result\" in output &&\n output.result &&\n typeof output.result === \"object\" &&\n !Array.isArray(output.result)\n ) {\n const actions =\n \"actions\" in output && Array.isArray(output.actions)\n ? (output.actions as AssignmentAction[])\n : undefined;\n return {\n result: output.result as Record<string, unknown>,\n ...(actions && actions.length > 0 ? { actions } : {}),\n };\n }\n\n if (!output || typeof output !== \"object\" || Array.isArray(output)) {\n throw new SdkError(\"Assignment execution must return an object result\");\n }\n\n return {\n result: output as Record<string, unknown>,\n };\n}\n\nexport function createAssignmentSlugRouter(options: AssignmentSlugRouterOptions): AssignmentExecutionHandler {\n const normalize = options.normalizeSlug ?? ((slug: string) => slug);\n const normalizedHandlers = new Map<string, AssignmentExecutionHandler>();\n\n for (const [slug, handler] of Object.entries(options.handlers)) {\n normalizedHandlers.set(normalize(slug), handler);\n }\n\n return async ({ assignment }) => {\n const slug = normalize(assignment.template_slug);\n const handler = normalizedHandlers.get(slug) ?? options.fallback;\n if (!handler) {\n throw new SdkError(`No assignment handler registered for template slug \"${assignment.template_slug}\"`);\n }\n return handler({ assignment });\n };\n}\n\nexport function createAutoSubmitAssignmentHandler(options: AutoSubmitAssignmentHandlerOptions) {\n const client = asClient(options.client);\n const mode = options.executionMode ?? \"background\";\n const logger = options.logger;\n\n async function processAssignment(assignment: Assignment) {\n try {\n const execution = normalizeExecutionOutput(await options.runAssignment({ assignment }));\n const submitRequest = options.createSubmitRequest\n ? options.createSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n })\n : defaultSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n });\n await client.submitResult(submitRequest);\n logger?.info?.(\"[agent-sdk] assignment_submitted\", {\n assignmentId: assignment.assignment_id,\n status: submitRequest.status,\n actionCount: submitRequest.actions?.length ?? 0,\n });\n } catch (error) {\n const submitErrorRequest = options.createSubmitErrorRequest\n ? options.createSubmitErrorRequest({ assignment, error })\n : defaultSubmitErrorRequest({ assignment, error });\n await client.submitError(submitErrorRequest);\n logger?.error?.(\"[agent-sdk] assignment_failed\", {\n assignmentId: assignment.assignment_id,\n error: submitErrorRequest.error,\n });\n }\n }\n\n return async function onAssignment({ assignment }: { assignment: Assignment }): Promise<AssignmentResult> {\n const accepted = options.acceptAssignment\n ? await options.acceptAssignment({ assignment })\n : defaultAcceptedResponse(assignment);\n\n if (accepted.status !== \"assigned\") {\n return accepted;\n }\n\n if (mode === \"blocking\") {\n await processAssignment(assignment);\n } else {\n void processAssignment(assignment).catch((error) => {\n logger?.error?.(\"[agent-sdk] assignment_background_failure\", {\n assignmentId: assignment.assignment_id,\n error: toMessage(error),\n });\n });\n }\n\n return accepted;\n };\n}\n","import type {\n AssignmentAction,\n EmailDeliveryAction,\n EmailDeliveryInput,\n EmailRecipient,\n IntegrationAction,\n} from \"./types\";\n\nexport type CreateIntegrationActionInput = {\n actionKey?: string;\n type: string;\n operation: string;\n input: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport type CreateEmailDeliveryActionInput = {\n actionKey?: string;\n mode: \"draft\" | \"send\";\n to: EmailRecipient[];\n cc?: EmailRecipient[];\n bcc?: EmailRecipient[];\n subject: string;\n textBody: string;\n htmlBody?: string;\n metadata?: Record<string, unknown>;\n};\n\nfunction normalizeRecipients(recipients: EmailRecipient[], label: string) {\n if (!Array.isArray(recipients) || recipients.length === 0) {\n throw new Error(`${label} must include at least one recipient`);\n }\n return recipients.map((recipient, index) => {\n if (!recipient || typeof recipient.email !== \"string\" || recipient.email.trim().length === 0) {\n throw new Error(`${label}[${index}] is missing email`);\n }\n return {\n email: recipient.email.trim(),\n ...(typeof recipient.name === \"string\" && recipient.name.trim().length > 0\n ? { name: recipient.name.trim() }\n : {}),\n };\n });\n}\n\nexport function createIntegrationAction(input: CreateIntegrationActionInput): IntegrationAction {\n if (typeof input.type !== \"string\" || input.type.trim().length === 0) {\n throw new Error(\"type is required\");\n }\n if (typeof input.operation !== \"string\" || input.operation.trim().length === 0) {\n throw new Error(\"operation is required\");\n }\n if (!input.input || typeof input.input !== \"object\" || Array.isArray(input.input)) {\n throw new Error(\"input must be an object\");\n }\n\n return {\n type: input.type.trim(),\n ...(typeof input.actionKey === \"string\" && input.actionKey.trim().length > 0\n ? { actionKey: input.actionKey.trim() }\n : {}),\n operation: input.operation.trim(),\n input,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n };\n}\n\nfunction createEmailDeliveryInput(input: CreateEmailDeliveryActionInput): EmailDeliveryInput {\n if (typeof input.subject !== \"string\" || input.subject.trim().length === 0) {\n throw new Error(\"Email subject is required\");\n }\n if (typeof input.textBody !== \"string\" || input.textBody.trim().length === 0) {\n throw new Error(\"Email textBody is required\");\n }\n\n return {\n to: normalizeRecipients(input.to, \"to\"),\n ...(input.cc && input.cc.length > 0 ? { cc: normalizeRecipients(input.cc, \"cc\") } : {}),\n ...(input.bcc && input.bcc.length > 0 ? { bcc: normalizeRecipients(input.bcc, \"bcc\") } : {}),\n subject: input.subject.trim(),\n textBody: input.textBody.trim(),\n ...(typeof input.htmlBody === \"string\" && input.htmlBody.trim().length > 0\n ? { htmlBody: input.htmlBody }\n : {}),\n };\n}\n\nexport function createEmailDeliveryAction(\n input: CreateEmailDeliveryActionInput,\n): EmailDeliveryAction {\n const emailInput = createEmailDeliveryInput(input);\n return {\n ...createIntegrationAction({\n ...(input.actionKey ? { actionKey: input.actionKey } : {}),\n type: \"email\",\n operation: input.mode,\n input: emailInput as unknown as Record<string, unknown>,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n }),\n type: \"email\",\n operation: input.mode,\n input: emailInput,\n };\n}\n\nexport function isIntegrationAction(action: AssignmentAction): action is IntegrationAction {\n return typeof action.type === \"string\" && typeof action.operation === \"string\";\n}\n\nexport function isEmailDeliveryAction(action: AssignmentAction): action is EmailDeliveryAction {\n return action.type === \"email\" && (action.operation === \"draft\" || action.operation === \"send\");\n}\n","import type { AssignmentResult } from \"./types\";\n\nexport type TableRow = Record<string, unknown>;\n\nexport type TablePayload = {\n table: {\n columns: string[];\n rows: TableRow[];\n };\n row_count: number;\n rows_unique: boolean;\n has_contact_method: boolean;\n summary?: string;\n};\n\nexport type CreateTableResultOptions = {\n columns?: string[];\n summary?: string;\n contactFields?: string[];\n dedupeBy?: string[];\n};\n\nconst DEFAULT_CONTACT_FIELDS = [\"email\", \"phone\", \"profile_url\", \"linkedin_url\"];\n\nfunction hasValue(value: unknown) {\n if (typeof value === \"string\") {\n return value.trim().length > 0;\n }\n return value !== null && value !== undefined;\n}\n\nfunction deriveColumns(rows: TableRow[]) {\n const ordered: string[] = [];\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n if (!ordered.includes(key)) {\n ordered.push(key);\n }\n }\n }\n return ordered;\n}\n\nfunction makeRowKey(row: TableRow, keys: string[]) {\n const normalized = keys.map((key) => [key, row[key]]);\n return JSON.stringify(normalized);\n}\n\nexport function createTablePayload(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): TablePayload {\n const columns = options.columns ?? deriveColumns(rows);\n const dedupeKeys = options.dedupeBy && options.dedupeBy.length > 0 ? options.dedupeBy : columns;\n const contactFields =\n options.contactFields && options.contactFields.length > 0\n ? options.contactFields\n : DEFAULT_CONTACT_FIELDS;\n\n const uniqueCount = new Set(rows.map((row) => makeRowKey(row, dedupeKeys))).size;\n const hasContactMethod = rows.every((row) => contactFields.some((field) => hasValue(row[field])));\n\n return {\n table: {\n columns,\n rows,\n },\n row_count: rows.length,\n rows_unique: uniqueCount === rows.length,\n has_contact_method: hasContactMethod,\n ...(options.summary ? { summary: options.summary } : {}),\n };\n}\n\nexport function createTableResult(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): Pick<AssignmentResult, \"result\"> {\n return {\n result: createTablePayload(rows, options),\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts","../src/signature.ts","../src/contracts.ts","../src/webhook.ts","../src/adapters.ts","../src/runtime.ts","../src/integrations.ts","../src/results.ts"],"sourcesContent":["export { SdkError, ApiError } from \"./errors\";\nexport { AgentClient, type ClientOptions } from \"./client\";\nexport { computeWebhookSignature, verifyWebhookSignature } from \"./signature\";\nexport {\n DEFAULT_SIGNATURE_HEADER,\n DEFAULT_TIMESTAMP_HEADER,\n createWebhookHandler,\n executeWebhook,\n} from \"./webhook\";\nexport {\n createExpressWebhookHandler,\n createFastifyWebhookHandler,\n createHonoWebhookHandler,\n createNextWebhookHandler,\n} from \"./adapters\";\nexport {\n createAssignmentSlugRouter,\n createAutoSubmitAssignmentHandler,\n type AssignmentExecutionHandler,\n type AssignmentExecutionResult,\n type AssignmentSlugRouterOptions,\n type AutoSubmitAssignmentHandlerOptions,\n} from \"./runtime\";\nexport { getContractVersion, parseAssignmentV1, toAssignmentEnvelopeV1 } from \"./contracts\";\nexport {\n createEmailDeliveryAction,\n createIntegrationAction,\n isEmailDeliveryAction,\n isIntegrationAction,\n type CreateEmailDeliveryActionInput,\n type CreateIntegrationActionInput,\n} from \"./integrations\";\nexport {\n createTablePayload,\n createTableResult,\n type CreateTableResultOptions,\n type TablePayload,\n type TableRow,\n} from \"./results\";\nexport type {\n ApiErrorBody,\n Assignment,\n AssignmentAction,\n AssignmentAckRequest,\n AssignmentAckStatus,\n AssignmentReplyConversation,\n AssignmentReplyMessage,\n AssignmentReplyProvider,\n AssignmentEnvelopeV1,\n AssignmentOutcome,\n AssignmentResult,\n AssignmentResultOutput,\n AssignmentResultSchema,\n GetAssignmentRepliesResponse,\n EmailDeliveryAction,\n EmailDeliveryInput,\n EmailOutreachMode,\n EmailRecipient,\n IntegrationAction,\n AssignmentStatus,\n OutcomePayload,\n SdkContractVersion,\n SubmitErrorRequest,\n SubmitResultRequest,\n WebhookInput,\n} from \"./types\";\nexport type { WebhookHandlerOptions, WebhookHttpResponse } from \"./webhook\";\n","import type { ApiErrorBody } from \"./types\";\n\nexport class SdkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SdkError\";\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number;\n readonly code: string | undefined;\n readonly body: ApiErrorBody | null;\n readonly retryable: boolean;\n\n constructor(params: {\n status: number;\n message: string;\n code: string | undefined;\n body: ApiErrorBody | null;\n }) {\n super(params.message);\n this.name = \"ApiError\";\n this.status = params.status;\n this.code = params.code;\n this.body = params.body;\n this.retryable = params.status === 429 || params.status >= 500;\n }\n}\n","import { ApiError } from \"./errors\";\nimport type {\n ApiErrorBody,\n AssignmentAckRequest,\n AssignmentResult,\n GetAssignmentRepliesResponse,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\nexport type ClientOptions = {\n baseUrl: string;\n apiKey: string;\n fetchImpl?: typeof fetch;\n};\n\nexport class AgentClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async ackAssignment(assignmentId: string, request: AssignmentAckRequest): Promise<void> {\n await this.post(`/agent/assignments/ack`, {\n assignment_id: assignmentId,\n ...request,\n });\n }\n\n async submitResult(input: SubmitResultRequest): Promise<void> {\n const payload: AssignmentResult = {\n status: input.status,\n ...(input.result ? { result: input.result } : {}),\n ...(input.error ? { error: input.error } : {}),\n };\n\n await this.post(`/agent/assignments/submit`, {\n assignment_id: input.assignmentId,\n ...payload,\n ...(input.actions ? { actions: input.actions } : {}),\n });\n }\n\n async submitError(input: SubmitErrorRequest): Promise<void> {\n await this.submitResult({\n assignmentId: input.assignmentId,\n status: \"timed_out\",\n error: input.error,\n ...(input.details ? { result: { details: input.details } } : {}),\n });\n }\n\n async getAssignmentReplies(assignmentId: string): Promise<GetAssignmentRepliesResponse> {\n return await this.postJson<GetAssignmentRepliesResponse>(`/agent/assignments/replies`, {\n assignment_id: assignmentId,\n });\n }\n\n private async post(path: string, body: Record<string, unknown>): Promise<void> {\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await this.toApiError(response);\n }\n }\n\n private async postJson<T>(path: string, body: Record<string, unknown>): Promise<T> {\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await this.toApiError(response);\n }\n\n return (await response.json()) as T;\n }\n\n private async toApiError(response: Response): Promise<ApiError> {\n const raw = await response.text();\n let parsed: ApiErrorBody | null = null;\n\n if (raw) {\n try {\n parsed = JSON.parse(raw) as ApiErrorBody;\n } catch {\n parsed = { message: raw };\n }\n }\n\n return new ApiError({\n status: response.status,\n message:\n parsed?.message ?? `API request failed (${response.status}): ${raw || response.statusText}`,\n code: parsed?.code,\n body: parsed,\n });\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { SdkError } from \"./errors\";\n\nexport function computeWebhookSignature(params: {\n webhookSecret: string;\n timestamp: string;\n body: string;\n}) {\n const signedPayload = `${params.timestamp}.${params.body}`;\n const digest = createHmac(\"sha256\", params.webhookSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n return `sha256=${digest}`;\n}\n\nexport function verifyWebhookSignature(params: {\n webhookSecret: string;\n timestamp?: string;\n body: string;\n signature?: string;\n}) {\n if (!params.timestamp || !params.signature) {\n throw new SdkError(\"Missing webhook timestamp or signature\");\n }\n\n const expected = computeWebhookSignature({\n webhookSecret: params.webhookSecret,\n timestamp: params.timestamp,\n body: params.body,\n });\n\n const expectedBuffer = Buffer.from(expected, \"utf8\");\n const actualBuffer = Buffer.from(params.signature, \"utf8\");\n\n if (expectedBuffer.length !== actualBuffer.length) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n\n if (!timingSafeEqual(expectedBuffer, actualBuffer)) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n}\n","import { SdkError } from \"./errors\";\nimport type { Assignment, AssignmentEnvelopeV1, AssignmentResultSchema, SdkContractVersion } from \"./types\";\n\nconst CONTRACT_VERSION: SdkContractVersion = \"v1\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction parseAssignmentRecord(record: Record<string, unknown>): Assignment {\n if (typeof record.assignment_id !== \"string\") {\n throw new SdkError(\"Missing assignment_id\");\n }\n if (typeof record.template_slug !== \"string\") {\n throw new SdkError(\"Missing template_slug\");\n }\n if (!isObject(record.outcome)) {\n throw new SdkError(\"Missing outcome\");\n }\n if (!isObject(record.result_schema)) {\n throw new SdkError(\"Missing result_schema\");\n }\n\n const outcome = record.outcome;\n if (typeof outcome.title !== \"string\") {\n throw new SdkError(\"Missing outcome.title\");\n }\n if (!isObject(outcome.payload)) {\n throw new SdkError(\"Missing outcome.payload\");\n }\n\n const parsedResultSchema = record.result_schema as AssignmentResultSchema;\n\n return {\n assignment_id: record.assignment_id,\n template_slug: record.template_slug,\n result_schema: parsedResultSchema,\n outcome: {\n title: outcome.title,\n payload: outcome.payload,\n ...(typeof outcome.requested_unit_price_value === \"number\"\n ? { requested_unit_price_value: outcome.requested_unit_price_value }\n : {}),\n ...(typeof outcome.requested_total_price_value === \"number\"\n ? { requested_total_price_value: outcome.requested_total_price_value }\n : {}),\n ...(typeof outcome.currency === \"string\" ? { currency: outcome.currency } : {}),\n ...(typeof outcome.time_window === \"string\" ? { time_window: outcome.time_window } : {}),\n },\n };\n}\n\nexport function parseAssignmentV1(body: string): Assignment {\n let payload: unknown;\n try {\n payload = JSON.parse(body);\n } catch {\n throw new SdkError(\"Invalid JSON payload\");\n }\n\n if (!isObject(payload)) {\n throw new SdkError(\"Invalid assignment payload\");\n }\n\n if (payload.version !== CONTRACT_VERSION) {\n throw new SdkError(\"Unsupported assignment contract version\");\n }\n if (!isObject(payload.assignment)) {\n throw new SdkError(\"Missing assignment envelope payload\");\n }\n\n return parseAssignmentRecord(payload.assignment);\n}\n\nexport function toAssignmentEnvelopeV1(assignment: Assignment): AssignmentEnvelopeV1 {\n return {\n version: CONTRACT_VERSION,\n assignment,\n };\n}\n\nexport function getContractVersion(): SdkContractVersion {\n return CONTRACT_VERSION;\n}\n","import { SdkError } from \"./errors\";\nimport { parseAssignmentV1 } from \"./contracts\";\nimport { verifyWebhookSignature } from \"./signature\";\nimport type { Assignment, AssignmentResult, WebhookInput } from \"./types\";\n\nexport const DEFAULT_SIGNATURE_HEADER = \"x-bounty-signature\";\nexport const DEFAULT_TIMESTAMP_HEADER = \"x-bounty-timestamp\";\n\nexport type WebhookHandlerOptions = {\n webhookSecret: string;\n onAssignment: (params: { assignment: Assignment }) => Promise<AssignmentResult>;\n verifySignature?: boolean;\n};\n\nexport type WebhookHttpResponse = {\n status: number;\n body: AssignmentResult;\n};\n\nexport function createWebhookHandler(options: WebhookHandlerOptions) {\n const shouldVerify = options.verifySignature ?? true;\n\n return async function handleWebhook(input: WebhookInput): Promise<AssignmentResult> {\n if (shouldVerify) {\n verifyWebhookSignature({\n webhookSecret: options.webhookSecret,\n body: input.body,\n ...(input.signature ? { signature: input.signature } : {}),\n ...(input.timestamp ? { timestamp: input.timestamp } : {}),\n });\n }\n\n const assignment = parseAssignmentV1(input.body);\n return options.onAssignment({ assignment });\n };\n}\n\nexport async function executeWebhook(\n handler: ReturnType<typeof createWebhookHandler>,\n input: WebhookInput,\n): Promise<WebhookHttpResponse> {\n try {\n const body = await handler(input);\n return {\n status: 200,\n body,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n const sdkError = error instanceof SdkError ? error : new SdkError(message);\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: sdkError.message,\n },\n };\n }\n}\n","import {\n DEFAULT_SIGNATURE_HEADER,\n DEFAULT_TIMESTAMP_HEADER,\n createWebhookHandler,\n executeWebhook,\n type WebhookHttpResponse,\n type WebhookHandlerOptions,\n} from \"./webhook\";\nimport { SdkError } from \"./errors\";\n\nfunction headerValue(headers: Record<string, string | string[] | undefined>, key: string) {\n const value = headers[key] ?? headers[key.toLowerCase()];\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n}\n\nfunction normalizeBody(body: unknown): string {\n if (typeof body === \"string\") {\n return body;\n }\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n if (body === undefined || body === null) {\n return \"\";\n }\n return JSON.stringify(body);\n}\n\nasync function readExpressBody(req: {\n body?: unknown;\n rawBody?: string | Buffer;\n on?: (event: string, listener: (...args: unknown[]) => void) => void;\n}) {\n if (typeof req.rawBody === \"string\" || Buffer.isBuffer(req.rawBody)) {\n return normalizeBody(req.rawBody);\n }\n\n if (req.body !== undefined) {\n if (typeof req.body === \"object\" && req.body !== null && !Buffer.isBuffer(req.body)) {\n throw new SdkError(\n \"Express webhook route must receive raw bytes. Mount webhook routes before express.json() or exclude them from JSON parsing.\",\n );\n }\n return normalizeBody(req.body);\n }\n\n if (!req.on) {\n return \"\";\n }\n\n return await new Promise<string>((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n req.on?.(\"data\", (chunk: unknown) => {\n if (typeof chunk === \"string\") {\n chunks.push(Buffer.from(chunk, \"utf8\"));\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n }\n });\n req.on?.(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n req.on?.(\"error\", (error: unknown) => {\n reject(error);\n });\n });\n}\n\nfunction toWebhookInput(params: {\n body: string;\n signature: string | undefined;\n timestamp: string | undefined;\n}) {\n return {\n body: params.body,\n ...(params.signature ? { signature: params.signature } : {}),\n ...(params.timestamp ? { timestamp: params.timestamp } : {}),\n };\n}\n\nfunction toBadRequest(error: unknown): WebhookHttpResponse {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: message,\n },\n };\n}\n\nexport function createExpressWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function expressWebhook(\n req: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n res: {\n status: (code: number) => { json: (payload: unknown) => void };\n },\n ) {\n let result: WebhookHttpResponse;\n try {\n const body = await readExpressBody(req);\n result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(req.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(req.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n } catch (error) {\n result = toBadRequest(error);\n }\n\n res.status(result.status).json(result.body);\n };\n}\n\nexport function createFastifyWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function fastifyWebhook(\n request: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n reply: {\n code: (statusCode: number) => { send: (payload: unknown) => void };\n },\n ) {\n const body = request.rawBody ?? normalizeBody(request.body);\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(request.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(request.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n reply.code(result.status).send(result.body);\n };\n}\n\nexport function createNextWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function nextWebhook(request: Request): Promise<Response> {\n const body = await request.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: request.headers.get(DEFAULT_SIGNATURE_HEADER) ?? undefined,\n timestamp: request.headers.get(DEFAULT_TIMESTAMP_HEADER) ?? undefined,\n }),\n );\n\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n\nexport function createHonoWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function honoWebhook(c: {\n req: {\n text: () => Promise<string>;\n header: (name: string) => string | undefined;\n };\n json: (payload: unknown, status?: number) => Response;\n }) {\n const body = await c.req.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: c.req.header(DEFAULT_SIGNATURE_HEADER),\n timestamp: c.req.header(DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n return c.json(result.body, result.status);\n };\n}\n","import { AgentClient, type ClientOptions } from \"./client\";\nimport { SdkError } from \"./errors\";\nimport type {\n Assignment,\n AssignmentAction,\n AssignmentResult,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\ntype RuntimeLogger = {\n info?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n};\n\nexport type AutoSubmitAssignmentHandlerOptions = {\n client: AgentClient | ClientOptions;\n runAssignment: (params: { assignment: Assignment }) => Promise<AssignmentExecutionOutput>;\n acceptAssignment?: (params: { assignment: Assignment }) => Promise<AssignmentResult> | AssignmentResult;\n createSubmitRequest?: (params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n }) => SubmitResultRequest;\n createSubmitErrorRequest?: (params: { assignment: Assignment; error: unknown }) => SubmitErrorRequest;\n executionMode?: \"background\" | \"blocking\";\n logger?: RuntimeLogger;\n};\n\nexport type AssignmentExecutionResult = {\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n};\n\nexport type AssignmentExecutionOutput = Record<string, unknown> | AssignmentExecutionResult;\n\nexport type AssignmentExecutionHandler = (\n params: { assignment: Assignment },\n) => Promise<AssignmentExecutionOutput>;\n\nexport type AssignmentSlugRouterOptions = {\n handlers: Record<string, AssignmentExecutionHandler>;\n fallback?: AssignmentExecutionHandler;\n normalizeSlug?: (slug: string) => string;\n};\n\nfunction toMessage(error: unknown) {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return \"Unknown assignment execution error\";\n}\n\nfunction defaultAcceptedResponse(assignment: Assignment): AssignmentResult {\n return {\n status: \"assigned\",\n result: {\n accepted: true,\n assignment_id: assignment.assignment_id,\n },\n };\n}\n\nfunction defaultSubmitRequest(params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n}): SubmitResultRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n status: \"verifying\",\n result: params.result,\n ...(params.actions && params.actions.length > 0 ? { actions: params.actions } : {}),\n };\n}\n\nfunction defaultSubmitErrorRequest(params: { assignment: Assignment; error: unknown }): SubmitErrorRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n error: toMessage(params.error),\n };\n}\n\nfunction asClient(client: AgentClient | ClientOptions) {\n return client instanceof AgentClient ? client : new AgentClient(client);\n}\n\nfunction normalizeExecutionOutput(output: AssignmentExecutionOutput): AssignmentExecutionResult {\n if (\n output &&\n typeof output === \"object\" &&\n !Array.isArray(output) &&\n \"result\" in output &&\n output.result &&\n typeof output.result === \"object\" &&\n !Array.isArray(output.result)\n ) {\n const actions =\n \"actions\" in output && Array.isArray(output.actions)\n ? (output.actions as AssignmentAction[])\n : undefined;\n return {\n result: output.result as Record<string, unknown>,\n ...(actions && actions.length > 0 ? { actions } : {}),\n };\n }\n\n if (!output || typeof output !== \"object\" || Array.isArray(output)) {\n throw new SdkError(\"Assignment execution must return an object result\");\n }\n\n return {\n result: output as Record<string, unknown>,\n };\n}\n\nexport function createAssignmentSlugRouter(options: AssignmentSlugRouterOptions): AssignmentExecutionHandler {\n const normalize = options.normalizeSlug ?? ((slug: string) => slug);\n const normalizedHandlers = new Map<string, AssignmentExecutionHandler>();\n\n for (const [slug, handler] of Object.entries(options.handlers)) {\n normalizedHandlers.set(normalize(slug), handler);\n }\n\n return async ({ assignment }) => {\n const slug = normalize(assignment.template_slug);\n const handler = normalizedHandlers.get(slug) ?? options.fallback;\n if (!handler) {\n throw new SdkError(`No assignment handler registered for template slug \"${assignment.template_slug}\"`);\n }\n return handler({ assignment });\n };\n}\n\nexport function createAutoSubmitAssignmentHandler(options: AutoSubmitAssignmentHandlerOptions) {\n const client = asClient(options.client);\n const mode = options.executionMode ?? \"background\";\n const logger = options.logger;\n\n async function processAssignment(assignment: Assignment) {\n try {\n const execution = normalizeExecutionOutput(await options.runAssignment({ assignment }));\n const submitRequest = options.createSubmitRequest\n ? options.createSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n })\n : defaultSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n });\n await client.submitResult(submitRequest);\n logger?.info?.(\"[agent-sdk] assignment_submitted\", {\n assignmentId: assignment.assignment_id,\n status: submitRequest.status,\n actionCount: submitRequest.actions?.length ?? 0,\n });\n } catch (error) {\n const submitErrorRequest = options.createSubmitErrorRequest\n ? options.createSubmitErrorRequest({ assignment, error })\n : defaultSubmitErrorRequest({ assignment, error });\n await client.submitError(submitErrorRequest);\n logger?.error?.(\"[agent-sdk] assignment_failed\", {\n assignmentId: assignment.assignment_id,\n error: submitErrorRequest.error,\n });\n }\n }\n\n return async function onAssignment({ assignment }: { assignment: Assignment }): Promise<AssignmentResult> {\n const accepted = options.acceptAssignment\n ? await options.acceptAssignment({ assignment })\n : defaultAcceptedResponse(assignment);\n\n if (accepted.status !== \"assigned\") {\n return accepted;\n }\n\n if (mode === \"blocking\") {\n await processAssignment(assignment);\n } else {\n void processAssignment(assignment).catch((error) => {\n logger?.error?.(\"[agent-sdk] assignment_background_failure\", {\n assignmentId: assignment.assignment_id,\n error: toMessage(error),\n });\n });\n }\n\n return accepted;\n };\n}\n","import type {\n AssignmentAction,\n EmailDeliveryAction,\n EmailDeliveryInput,\n EmailRecipient,\n IntegrationAction,\n} from \"./types\";\n\nexport type CreateIntegrationActionInput = {\n actionKey?: string;\n type: string;\n operation: string;\n input: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport type CreateEmailDeliveryActionInput = {\n actionKey?: string;\n mode: \"draft\" | \"send\";\n to: EmailRecipient[];\n cc?: EmailRecipient[];\n bcc?: EmailRecipient[];\n subject: string;\n textBody: string;\n htmlBody?: string;\n metadata?: Record<string, unknown>;\n};\n\nfunction normalizeRecipients(recipients: EmailRecipient[], label: string) {\n if (!Array.isArray(recipients) || recipients.length === 0) {\n throw new Error(`${label} must include at least one recipient`);\n }\n return recipients.map((recipient, index) => {\n if (!recipient || typeof recipient.email !== \"string\" || recipient.email.trim().length === 0) {\n throw new Error(`${label}[${index}] is missing email`);\n }\n return {\n email: recipient.email.trim(),\n ...(typeof recipient.name === \"string\" && recipient.name.trim().length > 0\n ? { name: recipient.name.trim() }\n : {}),\n };\n });\n}\n\nexport function createIntegrationAction(input: CreateIntegrationActionInput): IntegrationAction {\n if (typeof input.type !== \"string\" || input.type.trim().length === 0) {\n throw new Error(\"type is required\");\n }\n if (typeof input.operation !== \"string\" || input.operation.trim().length === 0) {\n throw new Error(\"operation is required\");\n }\n if (!input.input || typeof input.input !== \"object\" || Array.isArray(input.input)) {\n throw new Error(\"input must be an object\");\n }\n\n return {\n type: input.type.trim(),\n ...(typeof input.actionKey === \"string\" && input.actionKey.trim().length > 0\n ? { actionKey: input.actionKey.trim() }\n : {}),\n operation: input.operation.trim(),\n input,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n };\n}\n\nfunction createEmailDeliveryInput(input: CreateEmailDeliveryActionInput): EmailDeliveryInput {\n if (typeof input.subject !== \"string\" || input.subject.trim().length === 0) {\n throw new Error(\"Email subject is required\");\n }\n if (typeof input.textBody !== \"string\" || input.textBody.trim().length === 0) {\n throw new Error(\"Email textBody is required\");\n }\n\n return {\n to: normalizeRecipients(input.to, \"to\"),\n ...(input.cc && input.cc.length > 0 ? { cc: normalizeRecipients(input.cc, \"cc\") } : {}),\n ...(input.bcc && input.bcc.length > 0 ? { bcc: normalizeRecipients(input.bcc, \"bcc\") } : {}),\n subject: input.subject.trim(),\n textBody: input.textBody.trim(),\n ...(typeof input.htmlBody === \"string\" && input.htmlBody.trim().length > 0\n ? { htmlBody: input.htmlBody }\n : {}),\n };\n}\n\nexport function createEmailDeliveryAction(\n input: CreateEmailDeliveryActionInput,\n): EmailDeliveryAction {\n const emailInput = createEmailDeliveryInput(input);\n return {\n ...createIntegrationAction({\n ...(input.actionKey ? { actionKey: input.actionKey } : {}),\n type: \"email\",\n operation: input.mode,\n input: emailInput as unknown as Record<string, unknown>,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n }),\n type: \"email\",\n operation: input.mode,\n input: emailInput,\n };\n}\n\nexport function isIntegrationAction(action: AssignmentAction): action is IntegrationAction {\n return typeof action.type === \"string\" && typeof action.operation === \"string\";\n}\n\nexport function isEmailDeliveryAction(action: AssignmentAction): action is EmailDeliveryAction {\n return action.type === \"email\" && (action.operation === \"draft\" || action.operation === \"send\");\n}\n","import type { AssignmentResult } from \"./types\";\n\nexport type TableRow = Record<string, unknown>;\n\nexport type TablePayload = {\n table: {\n columns: string[];\n rows: TableRow[];\n };\n row_count: number;\n rows_unique: boolean;\n has_contact_method: boolean;\n summary?: string;\n};\n\nexport type CreateTableResultOptions = {\n columns?: string[];\n summary?: string;\n contactFields?: string[];\n dedupeBy?: string[];\n};\n\nconst DEFAULT_CONTACT_FIELDS = [\"email\", \"phone\", \"profile_url\", \"linkedin_url\"];\n\nfunction hasValue(value: unknown) {\n if (typeof value === \"string\") {\n return value.trim().length > 0;\n }\n return value !== null && value !== undefined;\n}\n\nfunction deriveColumns(rows: TableRow[]) {\n const ordered: string[] = [];\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n if (!ordered.includes(key)) {\n ordered.push(key);\n }\n }\n }\n return ordered;\n}\n\nfunction makeRowKey(row: TableRow, keys: string[]) {\n const normalized = keys.map((key) => [key, row[key]]);\n return JSON.stringify(normalized);\n}\n\nexport function createTablePayload(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): TablePayload {\n const columns = options.columns ?? deriveColumns(rows);\n const dedupeKeys = options.dedupeBy && options.dedupeBy.length > 0 ? options.dedupeBy : columns;\n const contactFields =\n options.contactFields && options.contactFields.length > 0\n ? options.contactFields\n : DEFAULT_CONTACT_FIELDS;\n\n const uniqueCount = new Set(rows.map((row) => makeRowKey(row, dedupeKeys))).size;\n const hasContactMethod = rows.every((row) => contactFields.some((field) => hasValue(row[field])));\n\n return {\n table: {\n columns,\n rows,\n },\n row_count: rows.length,\n rows_unique: uniqueCount === rows.length,\n has_contact_method: hasContactMethod,\n ...(options.summary ? { summary: options.summary } : {}),\n };\n}\n\nexport function createTableResult(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): Pick<AssignmentResult, \"result\"> {\n return {\n result: createTablePayload(rows, options),\n };\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -83,6 +83,26 @@ type SubmitErrorRequest = {
83
83
  error: string;
84
84
  details?: Record<string, unknown>;
85
85
  };
86
+ type AssignmentReplyProvider = "gmail";
87
+ type AssignmentReplyMessage = {
88
+ provider: AssignmentReplyProvider;
89
+ message_id?: string;
90
+ thread_id?: string;
91
+ from?: string;
92
+ to?: string;
93
+ subject?: string;
94
+ body?: string;
95
+ sent_at?: number;
96
+ };
97
+ type AssignmentReplyConversation = {
98
+ provider: AssignmentReplyProvider;
99
+ sent: AssignmentReplyMessage;
100
+ replies: AssignmentReplyMessage[];
101
+ };
102
+ type GetAssignmentRepliesResponse = {
103
+ assignment_id: string;
104
+ conversations: AssignmentReplyConversation[];
105
+ };
86
106
  type ApiErrorBody = {
87
107
  code?: string;
88
108
  message?: string;
@@ -118,7 +138,9 @@ declare class AgentClient {
118
138
  ackAssignment(assignmentId: string, request: AssignmentAckRequest): Promise<void>;
119
139
  submitResult(input: SubmitResultRequest): Promise<void>;
120
140
  submitError(input: SubmitErrorRequest): Promise<void>;
141
+ getAssignmentReplies(assignmentId: string): Promise<GetAssignmentRepliesResponse>;
121
142
  private post;
143
+ private postJson;
122
144
  private toApiError;
123
145
  }
124
146
 
@@ -266,4 +288,4 @@ type CreateTableResultOptions = {
266
288
  declare function createTablePayload(rows: TableRow[], options?: CreateTableResultOptions): TablePayload;
267
289
  declare function createTableResult(rows: TableRow[], options?: CreateTableResultOptions): Pick<AssignmentResult, "result">;
268
290
 
269
- export { AgentClient, ApiError, type ApiErrorBody, type Assignment, type AssignmentAckRequest, type AssignmentAckStatus, type AssignmentAction, type AssignmentEnvelopeV1, type AssignmentExecutionHandler, type AssignmentExecutionResult, type AssignmentOutcome, type AssignmentResult, type AssignmentResultOutput, type AssignmentResultSchema, type AssignmentSlugRouterOptions, type AssignmentStatus, type AutoSubmitAssignmentHandlerOptions, type ClientOptions, type CreateEmailDeliveryActionInput, type CreateIntegrationActionInput, type CreateTableResultOptions, DEFAULT_SIGNATURE_HEADER, DEFAULT_TIMESTAMP_HEADER, type EmailDeliveryAction, type EmailDeliveryInput, type EmailOutreachMode, type EmailRecipient, type IntegrationAction, type OutcomePayload, type SdkContractVersion, SdkError, type SubmitErrorRequest, type SubmitResultRequest, type TablePayload, type TableRow, type WebhookHandlerOptions, type WebhookHttpResponse, type WebhookInput, computeWebhookSignature, createAssignmentSlugRouter, createAutoSubmitAssignmentHandler, createEmailDeliveryAction, createExpressWebhookHandler, createFastifyWebhookHandler, createHonoWebhookHandler, createIntegrationAction, createNextWebhookHandler, createTablePayload, createTableResult, createWebhookHandler, executeWebhook, getContractVersion, isEmailDeliveryAction, isIntegrationAction, parseAssignmentV1, toAssignmentEnvelopeV1, verifyWebhookSignature };
291
+ export { AgentClient, ApiError, type ApiErrorBody, type Assignment, type AssignmentAckRequest, type AssignmentAckStatus, type AssignmentAction, type AssignmentEnvelopeV1, type AssignmentExecutionHandler, type AssignmentExecutionResult, type AssignmentOutcome, type AssignmentReplyConversation, type AssignmentReplyMessage, type AssignmentReplyProvider, type AssignmentResult, type AssignmentResultOutput, type AssignmentResultSchema, type AssignmentSlugRouterOptions, type AssignmentStatus, type AutoSubmitAssignmentHandlerOptions, type ClientOptions, type CreateEmailDeliveryActionInput, type CreateIntegrationActionInput, type CreateTableResultOptions, DEFAULT_SIGNATURE_HEADER, DEFAULT_TIMESTAMP_HEADER, type EmailDeliveryAction, type EmailDeliveryInput, type EmailOutreachMode, type EmailRecipient, type GetAssignmentRepliesResponse, type IntegrationAction, type OutcomePayload, type SdkContractVersion, SdkError, type SubmitErrorRequest, type SubmitResultRequest, type TablePayload, type TableRow, type WebhookHandlerOptions, type WebhookHttpResponse, type WebhookInput, computeWebhookSignature, createAssignmentSlugRouter, createAutoSubmitAssignmentHandler, createEmailDeliveryAction, createExpressWebhookHandler, createFastifyWebhookHandler, createHonoWebhookHandler, createIntegrationAction, createNextWebhookHandler, createTablePayload, createTableResult, createWebhookHandler, executeWebhook, getContractVersion, isEmailDeliveryAction, isIntegrationAction, parseAssignmentV1, toAssignmentEnvelopeV1, verifyWebhookSignature };
package/dist/index.d.ts CHANGED
@@ -83,6 +83,26 @@ type SubmitErrorRequest = {
83
83
  error: string;
84
84
  details?: Record<string, unknown>;
85
85
  };
86
+ type AssignmentReplyProvider = "gmail";
87
+ type AssignmentReplyMessage = {
88
+ provider: AssignmentReplyProvider;
89
+ message_id?: string;
90
+ thread_id?: string;
91
+ from?: string;
92
+ to?: string;
93
+ subject?: string;
94
+ body?: string;
95
+ sent_at?: number;
96
+ };
97
+ type AssignmentReplyConversation = {
98
+ provider: AssignmentReplyProvider;
99
+ sent: AssignmentReplyMessage;
100
+ replies: AssignmentReplyMessage[];
101
+ };
102
+ type GetAssignmentRepliesResponse = {
103
+ assignment_id: string;
104
+ conversations: AssignmentReplyConversation[];
105
+ };
86
106
  type ApiErrorBody = {
87
107
  code?: string;
88
108
  message?: string;
@@ -118,7 +138,9 @@ declare class AgentClient {
118
138
  ackAssignment(assignmentId: string, request: AssignmentAckRequest): Promise<void>;
119
139
  submitResult(input: SubmitResultRequest): Promise<void>;
120
140
  submitError(input: SubmitErrorRequest): Promise<void>;
141
+ getAssignmentReplies(assignmentId: string): Promise<GetAssignmentRepliesResponse>;
121
142
  private post;
143
+ private postJson;
122
144
  private toApiError;
123
145
  }
124
146
 
@@ -266,4 +288,4 @@ type CreateTableResultOptions = {
266
288
  declare function createTablePayload(rows: TableRow[], options?: CreateTableResultOptions): TablePayload;
267
289
  declare function createTableResult(rows: TableRow[], options?: CreateTableResultOptions): Pick<AssignmentResult, "result">;
268
290
 
269
- export { AgentClient, ApiError, type ApiErrorBody, type Assignment, type AssignmentAckRequest, type AssignmentAckStatus, type AssignmentAction, type AssignmentEnvelopeV1, type AssignmentExecutionHandler, type AssignmentExecutionResult, type AssignmentOutcome, type AssignmentResult, type AssignmentResultOutput, type AssignmentResultSchema, type AssignmentSlugRouterOptions, type AssignmentStatus, type AutoSubmitAssignmentHandlerOptions, type ClientOptions, type CreateEmailDeliveryActionInput, type CreateIntegrationActionInput, type CreateTableResultOptions, DEFAULT_SIGNATURE_HEADER, DEFAULT_TIMESTAMP_HEADER, type EmailDeliveryAction, type EmailDeliveryInput, type EmailOutreachMode, type EmailRecipient, type IntegrationAction, type OutcomePayload, type SdkContractVersion, SdkError, type SubmitErrorRequest, type SubmitResultRequest, type TablePayload, type TableRow, type WebhookHandlerOptions, type WebhookHttpResponse, type WebhookInput, computeWebhookSignature, createAssignmentSlugRouter, createAutoSubmitAssignmentHandler, createEmailDeliveryAction, createExpressWebhookHandler, createFastifyWebhookHandler, createHonoWebhookHandler, createIntegrationAction, createNextWebhookHandler, createTablePayload, createTableResult, createWebhookHandler, executeWebhook, getContractVersion, isEmailDeliveryAction, isIntegrationAction, parseAssignmentV1, toAssignmentEnvelopeV1, verifyWebhookSignature };
291
+ export { AgentClient, ApiError, type ApiErrorBody, type Assignment, type AssignmentAckRequest, type AssignmentAckStatus, type AssignmentAction, type AssignmentEnvelopeV1, type AssignmentExecutionHandler, type AssignmentExecutionResult, type AssignmentOutcome, type AssignmentReplyConversation, type AssignmentReplyMessage, type AssignmentReplyProvider, type AssignmentResult, type AssignmentResultOutput, type AssignmentResultSchema, type AssignmentSlugRouterOptions, type AssignmentStatus, type AutoSubmitAssignmentHandlerOptions, type ClientOptions, type CreateEmailDeliveryActionInput, type CreateIntegrationActionInput, type CreateTableResultOptions, DEFAULT_SIGNATURE_HEADER, DEFAULT_TIMESTAMP_HEADER, type EmailDeliveryAction, type EmailDeliveryInput, type EmailOutreachMode, type EmailRecipient, type GetAssignmentRepliesResponse, type IntegrationAction, type OutcomePayload, type SdkContractVersion, SdkError, type SubmitErrorRequest, type SubmitResultRequest, type TablePayload, type TableRow, type WebhookHandlerOptions, type WebhookHttpResponse, type WebhookInput, computeWebhookSignature, createAssignmentSlugRouter, createAutoSubmitAssignmentHandler, createEmailDeliveryAction, createExpressWebhookHandler, createFastifyWebhookHandler, createHonoWebhookHandler, createIntegrationAction, createNextWebhookHandler, createTablePayload, createTableResult, createWebhookHandler, executeWebhook, getContractVersion, isEmailDeliveryAction, isIntegrationAction, parseAssignmentV1, toAssignmentEnvelopeV1, verifyWebhookSignature };
package/dist/index.js CHANGED
@@ -56,6 +56,11 @@ var AgentClient = class {
56
56
  ...input.details ? { result: { details: input.details } } : {}
57
57
  });
58
58
  }
59
+ async getAssignmentReplies(assignmentId) {
60
+ return await this.postJson(`/agent/assignments/replies`, {
61
+ assignment_id: assignmentId
62
+ });
63
+ }
59
64
  async post(path, body) {
60
65
  const response = await this.fetchImpl(`${this.baseUrl}${path}`, {
61
66
  method: "POST",
@@ -69,6 +74,20 @@ var AgentClient = class {
69
74
  throw await this.toApiError(response);
70
75
  }
71
76
  }
77
+ async postJson(path, body) {
78
+ const response = await this.fetchImpl(`${this.baseUrl}${path}`, {
79
+ method: "POST",
80
+ headers: {
81
+ "content-type": "application/json",
82
+ authorization: `Bearer ${this.apiKey}`
83
+ },
84
+ body: JSON.stringify(body)
85
+ });
86
+ if (!response.ok) {
87
+ throw await this.toApiError(response);
88
+ }
89
+ return await response.json();
90
+ }
72
91
  async toApiError(response) {
73
92
  const raw = await response.text();
74
93
  let parsed = null;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/signature.ts","../src/contracts.ts","../src/webhook.ts","../src/adapters.ts","../src/runtime.ts","../src/integrations.ts","../src/results.ts"],"sourcesContent":["import type { ApiErrorBody } from \"./types\";\n\nexport class SdkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SdkError\";\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number;\n readonly code: string | undefined;\n readonly body: ApiErrorBody | null;\n readonly retryable: boolean;\n\n constructor(params: {\n status: number;\n message: string;\n code: string | undefined;\n body: ApiErrorBody | null;\n }) {\n super(params.message);\n this.name = \"ApiError\";\n this.status = params.status;\n this.code = params.code;\n this.body = params.body;\n this.retryable = params.status === 429 || params.status >= 500;\n }\n}\n","import { ApiError } from \"./errors\";\nimport type {\n ApiErrorBody,\n AssignmentAckRequest,\n AssignmentResult,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\nexport type ClientOptions = {\n baseUrl: string;\n apiKey: string;\n fetchImpl?: typeof fetch;\n};\n\nexport class AgentClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async ackAssignment(assignmentId: string, request: AssignmentAckRequest): Promise<void> {\n await this.post(`/agent/assignments/ack`, {\n assignment_id: assignmentId,\n ...request,\n });\n }\n\n async submitResult(input: SubmitResultRequest): Promise<void> {\n const payload: AssignmentResult = {\n status: input.status,\n ...(input.result ? { result: input.result } : {}),\n ...(input.error ? { error: input.error } : {}),\n };\n\n await this.post(`/agent/assignments/submit`, {\n assignment_id: input.assignmentId,\n ...payload,\n ...(input.actions ? { actions: input.actions } : {}),\n });\n }\n\n async submitError(input: SubmitErrorRequest): Promise<void> {\n await this.submitResult({\n assignmentId: input.assignmentId,\n status: \"timed_out\",\n error: input.error,\n ...(input.details ? { result: { details: input.details } } : {}),\n });\n }\n\n private async post(path: string, body: Record<string, unknown>): Promise<void> {\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await this.toApiError(response);\n }\n }\n\n private async toApiError(response: Response): Promise<ApiError> {\n const raw = await response.text();\n let parsed: ApiErrorBody | null = null;\n\n if (raw) {\n try {\n parsed = JSON.parse(raw) as ApiErrorBody;\n } catch {\n parsed = { message: raw };\n }\n }\n\n return new ApiError({\n status: response.status,\n message:\n parsed?.message ?? `API request failed (${response.status}): ${raw || response.statusText}`,\n code: parsed?.code,\n body: parsed,\n });\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { SdkError } from \"./errors\";\n\nexport function computeWebhookSignature(params: {\n webhookSecret: string;\n timestamp: string;\n body: string;\n}) {\n const signedPayload = `${params.timestamp}.${params.body}`;\n const digest = createHmac(\"sha256\", params.webhookSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n return `sha256=${digest}`;\n}\n\nexport function verifyWebhookSignature(params: {\n webhookSecret: string;\n timestamp?: string;\n body: string;\n signature?: string;\n}) {\n if (!params.timestamp || !params.signature) {\n throw new SdkError(\"Missing webhook timestamp or signature\");\n }\n\n const expected = computeWebhookSignature({\n webhookSecret: params.webhookSecret,\n timestamp: params.timestamp,\n body: params.body,\n });\n\n const expectedBuffer = Buffer.from(expected, \"utf8\");\n const actualBuffer = Buffer.from(params.signature, \"utf8\");\n\n if (expectedBuffer.length !== actualBuffer.length) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n\n if (!timingSafeEqual(expectedBuffer, actualBuffer)) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n}\n","import { SdkError } from \"./errors\";\nimport type { Assignment, AssignmentEnvelopeV1, AssignmentResultSchema, SdkContractVersion } from \"./types\";\n\nconst CONTRACT_VERSION: SdkContractVersion = \"v1\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction parseAssignmentRecord(record: Record<string, unknown>): Assignment {\n if (typeof record.assignment_id !== \"string\") {\n throw new SdkError(\"Missing assignment_id\");\n }\n if (typeof record.template_slug !== \"string\") {\n throw new SdkError(\"Missing template_slug\");\n }\n if (!isObject(record.outcome)) {\n throw new SdkError(\"Missing outcome\");\n }\n if (!isObject(record.result_schema)) {\n throw new SdkError(\"Missing result_schema\");\n }\n\n const outcome = record.outcome;\n if (typeof outcome.title !== \"string\") {\n throw new SdkError(\"Missing outcome.title\");\n }\n if (!isObject(outcome.payload)) {\n throw new SdkError(\"Missing outcome.payload\");\n }\n\n const parsedResultSchema = record.result_schema as AssignmentResultSchema;\n\n return {\n assignment_id: record.assignment_id,\n template_slug: record.template_slug,\n result_schema: parsedResultSchema,\n outcome: {\n title: outcome.title,\n payload: outcome.payload,\n ...(typeof outcome.requested_unit_price_value === \"number\"\n ? { requested_unit_price_value: outcome.requested_unit_price_value }\n : {}),\n ...(typeof outcome.requested_total_price_value === \"number\"\n ? { requested_total_price_value: outcome.requested_total_price_value }\n : {}),\n ...(typeof outcome.currency === \"string\" ? { currency: outcome.currency } : {}),\n ...(typeof outcome.time_window === \"string\" ? { time_window: outcome.time_window } : {}),\n },\n };\n}\n\nexport function parseAssignmentV1(body: string): Assignment {\n let payload: unknown;\n try {\n payload = JSON.parse(body);\n } catch {\n throw new SdkError(\"Invalid JSON payload\");\n }\n\n if (!isObject(payload)) {\n throw new SdkError(\"Invalid assignment payload\");\n }\n\n if (payload.version !== CONTRACT_VERSION) {\n throw new SdkError(\"Unsupported assignment contract version\");\n }\n if (!isObject(payload.assignment)) {\n throw new SdkError(\"Missing assignment envelope payload\");\n }\n\n return parseAssignmentRecord(payload.assignment);\n}\n\nexport function toAssignmentEnvelopeV1(assignment: Assignment): AssignmentEnvelopeV1 {\n return {\n version: CONTRACT_VERSION,\n assignment,\n };\n}\n\nexport function getContractVersion(): SdkContractVersion {\n return CONTRACT_VERSION;\n}\n","import { SdkError } from \"./errors\";\nimport { parseAssignmentV1 } from \"./contracts\";\nimport { verifyWebhookSignature } from \"./signature\";\nimport type { Assignment, AssignmentResult, WebhookInput } from \"./types\";\n\nexport const DEFAULT_SIGNATURE_HEADER = \"x-bounty-signature\";\nexport const DEFAULT_TIMESTAMP_HEADER = \"x-bounty-timestamp\";\n\nexport type WebhookHandlerOptions = {\n webhookSecret: string;\n onAssignment: (params: { assignment: Assignment }) => Promise<AssignmentResult>;\n verifySignature?: boolean;\n};\n\nexport type WebhookHttpResponse = {\n status: number;\n body: AssignmentResult;\n};\n\nexport function createWebhookHandler(options: WebhookHandlerOptions) {\n const shouldVerify = options.verifySignature ?? true;\n\n return async function handleWebhook(input: WebhookInput): Promise<AssignmentResult> {\n if (shouldVerify) {\n verifyWebhookSignature({\n webhookSecret: options.webhookSecret,\n body: input.body,\n ...(input.signature ? { signature: input.signature } : {}),\n ...(input.timestamp ? { timestamp: input.timestamp } : {}),\n });\n }\n\n const assignment = parseAssignmentV1(input.body);\n return options.onAssignment({ assignment });\n };\n}\n\nexport async function executeWebhook(\n handler: ReturnType<typeof createWebhookHandler>,\n input: WebhookInput,\n): Promise<WebhookHttpResponse> {\n try {\n const body = await handler(input);\n return {\n status: 200,\n body,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n const sdkError = error instanceof SdkError ? error : new SdkError(message);\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: sdkError.message,\n },\n };\n }\n}\n","import {\n DEFAULT_SIGNATURE_HEADER,\n DEFAULT_TIMESTAMP_HEADER,\n createWebhookHandler,\n executeWebhook,\n type WebhookHttpResponse,\n type WebhookHandlerOptions,\n} from \"./webhook\";\nimport { SdkError } from \"./errors\";\n\nfunction headerValue(headers: Record<string, string | string[] | undefined>, key: string) {\n const value = headers[key] ?? headers[key.toLowerCase()];\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n}\n\nfunction normalizeBody(body: unknown): string {\n if (typeof body === \"string\") {\n return body;\n }\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n if (body === undefined || body === null) {\n return \"\";\n }\n return JSON.stringify(body);\n}\n\nasync function readExpressBody(req: {\n body?: unknown;\n rawBody?: string | Buffer;\n on?: (event: string, listener: (...args: unknown[]) => void) => void;\n}) {\n if (typeof req.rawBody === \"string\" || Buffer.isBuffer(req.rawBody)) {\n return normalizeBody(req.rawBody);\n }\n\n if (req.body !== undefined) {\n if (typeof req.body === \"object\" && req.body !== null && !Buffer.isBuffer(req.body)) {\n throw new SdkError(\n \"Express webhook route must receive raw bytes. Mount webhook routes before express.json() or exclude them from JSON parsing.\",\n );\n }\n return normalizeBody(req.body);\n }\n\n if (!req.on) {\n return \"\";\n }\n\n return await new Promise<string>((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n req.on?.(\"data\", (chunk: unknown) => {\n if (typeof chunk === \"string\") {\n chunks.push(Buffer.from(chunk, \"utf8\"));\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n }\n });\n req.on?.(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n req.on?.(\"error\", (error: unknown) => {\n reject(error);\n });\n });\n}\n\nfunction toWebhookInput(params: {\n body: string;\n signature: string | undefined;\n timestamp: string | undefined;\n}) {\n return {\n body: params.body,\n ...(params.signature ? { signature: params.signature } : {}),\n ...(params.timestamp ? { timestamp: params.timestamp } : {}),\n };\n}\n\nfunction toBadRequest(error: unknown): WebhookHttpResponse {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: message,\n },\n };\n}\n\nexport function createExpressWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function expressWebhook(\n req: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n res: {\n status: (code: number) => { json: (payload: unknown) => void };\n },\n ) {\n let result: WebhookHttpResponse;\n try {\n const body = await readExpressBody(req);\n result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(req.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(req.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n } catch (error) {\n result = toBadRequest(error);\n }\n\n res.status(result.status).json(result.body);\n };\n}\n\nexport function createFastifyWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function fastifyWebhook(\n request: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n reply: {\n code: (statusCode: number) => { send: (payload: unknown) => void };\n },\n ) {\n const body = request.rawBody ?? normalizeBody(request.body);\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(request.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(request.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n reply.code(result.status).send(result.body);\n };\n}\n\nexport function createNextWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function nextWebhook(request: Request): Promise<Response> {\n const body = await request.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: request.headers.get(DEFAULT_SIGNATURE_HEADER) ?? undefined,\n timestamp: request.headers.get(DEFAULT_TIMESTAMP_HEADER) ?? undefined,\n }),\n );\n\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n\nexport function createHonoWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function honoWebhook(c: {\n req: {\n text: () => Promise<string>;\n header: (name: string) => string | undefined;\n };\n json: (payload: unknown, status?: number) => Response;\n }) {\n const body = await c.req.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: c.req.header(DEFAULT_SIGNATURE_HEADER),\n timestamp: c.req.header(DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n return c.json(result.body, result.status);\n };\n}\n","import { AgentClient, type ClientOptions } from \"./client\";\nimport { SdkError } from \"./errors\";\nimport type {\n Assignment,\n AssignmentAction,\n AssignmentResult,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\ntype RuntimeLogger = {\n info?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n};\n\nexport type AutoSubmitAssignmentHandlerOptions = {\n client: AgentClient | ClientOptions;\n runAssignment: (params: { assignment: Assignment }) => Promise<AssignmentExecutionOutput>;\n acceptAssignment?: (params: { assignment: Assignment }) => Promise<AssignmentResult> | AssignmentResult;\n createSubmitRequest?: (params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n }) => SubmitResultRequest;\n createSubmitErrorRequest?: (params: { assignment: Assignment; error: unknown }) => SubmitErrorRequest;\n executionMode?: \"background\" | \"blocking\";\n logger?: RuntimeLogger;\n};\n\nexport type AssignmentExecutionResult = {\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n};\n\nexport type AssignmentExecutionOutput = Record<string, unknown> | AssignmentExecutionResult;\n\nexport type AssignmentExecutionHandler = (\n params: { assignment: Assignment },\n) => Promise<AssignmentExecutionOutput>;\n\nexport type AssignmentSlugRouterOptions = {\n handlers: Record<string, AssignmentExecutionHandler>;\n fallback?: AssignmentExecutionHandler;\n normalizeSlug?: (slug: string) => string;\n};\n\nfunction toMessage(error: unknown) {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return \"Unknown assignment execution error\";\n}\n\nfunction defaultAcceptedResponse(assignment: Assignment): AssignmentResult {\n return {\n status: \"assigned\",\n result: {\n accepted: true,\n assignment_id: assignment.assignment_id,\n },\n };\n}\n\nfunction defaultSubmitRequest(params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n}): SubmitResultRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n status: \"verifying\",\n result: params.result,\n ...(params.actions && params.actions.length > 0 ? { actions: params.actions } : {}),\n };\n}\n\nfunction defaultSubmitErrorRequest(params: { assignment: Assignment; error: unknown }): SubmitErrorRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n error: toMessage(params.error),\n };\n}\n\nfunction asClient(client: AgentClient | ClientOptions) {\n return client instanceof AgentClient ? client : new AgentClient(client);\n}\n\nfunction normalizeExecutionOutput(output: AssignmentExecutionOutput): AssignmentExecutionResult {\n if (\n output &&\n typeof output === \"object\" &&\n !Array.isArray(output) &&\n \"result\" in output &&\n output.result &&\n typeof output.result === \"object\" &&\n !Array.isArray(output.result)\n ) {\n const actions =\n \"actions\" in output && Array.isArray(output.actions)\n ? (output.actions as AssignmentAction[])\n : undefined;\n return {\n result: output.result as Record<string, unknown>,\n ...(actions && actions.length > 0 ? { actions } : {}),\n };\n }\n\n if (!output || typeof output !== \"object\" || Array.isArray(output)) {\n throw new SdkError(\"Assignment execution must return an object result\");\n }\n\n return {\n result: output as Record<string, unknown>,\n };\n}\n\nexport function createAssignmentSlugRouter(options: AssignmentSlugRouterOptions): AssignmentExecutionHandler {\n const normalize = options.normalizeSlug ?? ((slug: string) => slug);\n const normalizedHandlers = new Map<string, AssignmentExecutionHandler>();\n\n for (const [slug, handler] of Object.entries(options.handlers)) {\n normalizedHandlers.set(normalize(slug), handler);\n }\n\n return async ({ assignment }) => {\n const slug = normalize(assignment.template_slug);\n const handler = normalizedHandlers.get(slug) ?? options.fallback;\n if (!handler) {\n throw new SdkError(`No assignment handler registered for template slug \"${assignment.template_slug}\"`);\n }\n return handler({ assignment });\n };\n}\n\nexport function createAutoSubmitAssignmentHandler(options: AutoSubmitAssignmentHandlerOptions) {\n const client = asClient(options.client);\n const mode = options.executionMode ?? \"background\";\n const logger = options.logger;\n\n async function processAssignment(assignment: Assignment) {\n try {\n const execution = normalizeExecutionOutput(await options.runAssignment({ assignment }));\n const submitRequest = options.createSubmitRequest\n ? options.createSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n })\n : defaultSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n });\n await client.submitResult(submitRequest);\n logger?.info?.(\"[agent-sdk] assignment_submitted\", {\n assignmentId: assignment.assignment_id,\n status: submitRequest.status,\n actionCount: submitRequest.actions?.length ?? 0,\n });\n } catch (error) {\n const submitErrorRequest = options.createSubmitErrorRequest\n ? options.createSubmitErrorRequest({ assignment, error })\n : defaultSubmitErrorRequest({ assignment, error });\n await client.submitError(submitErrorRequest);\n logger?.error?.(\"[agent-sdk] assignment_failed\", {\n assignmentId: assignment.assignment_id,\n error: submitErrorRequest.error,\n });\n }\n }\n\n return async function onAssignment({ assignment }: { assignment: Assignment }): Promise<AssignmentResult> {\n const accepted = options.acceptAssignment\n ? await options.acceptAssignment({ assignment })\n : defaultAcceptedResponse(assignment);\n\n if (accepted.status !== \"assigned\") {\n return accepted;\n }\n\n if (mode === \"blocking\") {\n await processAssignment(assignment);\n } else {\n void processAssignment(assignment).catch((error) => {\n logger?.error?.(\"[agent-sdk] assignment_background_failure\", {\n assignmentId: assignment.assignment_id,\n error: toMessage(error),\n });\n });\n }\n\n return accepted;\n };\n}\n","import type {\n AssignmentAction,\n EmailDeliveryAction,\n EmailDeliveryInput,\n EmailRecipient,\n IntegrationAction,\n} from \"./types\";\n\nexport type CreateIntegrationActionInput = {\n actionKey?: string;\n type: string;\n operation: string;\n input: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport type CreateEmailDeliveryActionInput = {\n actionKey?: string;\n mode: \"draft\" | \"send\";\n to: EmailRecipient[];\n cc?: EmailRecipient[];\n bcc?: EmailRecipient[];\n subject: string;\n textBody: string;\n htmlBody?: string;\n metadata?: Record<string, unknown>;\n};\n\nfunction normalizeRecipients(recipients: EmailRecipient[], label: string) {\n if (!Array.isArray(recipients) || recipients.length === 0) {\n throw new Error(`${label} must include at least one recipient`);\n }\n return recipients.map((recipient, index) => {\n if (!recipient || typeof recipient.email !== \"string\" || recipient.email.trim().length === 0) {\n throw new Error(`${label}[${index}] is missing email`);\n }\n return {\n email: recipient.email.trim(),\n ...(typeof recipient.name === \"string\" && recipient.name.trim().length > 0\n ? { name: recipient.name.trim() }\n : {}),\n };\n });\n}\n\nexport function createIntegrationAction(input: CreateIntegrationActionInput): IntegrationAction {\n if (typeof input.type !== \"string\" || input.type.trim().length === 0) {\n throw new Error(\"type is required\");\n }\n if (typeof input.operation !== \"string\" || input.operation.trim().length === 0) {\n throw new Error(\"operation is required\");\n }\n if (!input.input || typeof input.input !== \"object\" || Array.isArray(input.input)) {\n throw new Error(\"input must be an object\");\n }\n\n return {\n type: input.type.trim(),\n ...(typeof input.actionKey === \"string\" && input.actionKey.trim().length > 0\n ? { actionKey: input.actionKey.trim() }\n : {}),\n operation: input.operation.trim(),\n input,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n };\n}\n\nfunction createEmailDeliveryInput(input: CreateEmailDeliveryActionInput): EmailDeliveryInput {\n if (typeof input.subject !== \"string\" || input.subject.trim().length === 0) {\n throw new Error(\"Email subject is required\");\n }\n if (typeof input.textBody !== \"string\" || input.textBody.trim().length === 0) {\n throw new Error(\"Email textBody is required\");\n }\n\n return {\n to: normalizeRecipients(input.to, \"to\"),\n ...(input.cc && input.cc.length > 0 ? { cc: normalizeRecipients(input.cc, \"cc\") } : {}),\n ...(input.bcc && input.bcc.length > 0 ? { bcc: normalizeRecipients(input.bcc, \"bcc\") } : {}),\n subject: input.subject.trim(),\n textBody: input.textBody.trim(),\n ...(typeof input.htmlBody === \"string\" && input.htmlBody.trim().length > 0\n ? { htmlBody: input.htmlBody }\n : {}),\n };\n}\n\nexport function createEmailDeliveryAction(\n input: CreateEmailDeliveryActionInput,\n): EmailDeliveryAction {\n const emailInput = createEmailDeliveryInput(input);\n return {\n ...createIntegrationAction({\n ...(input.actionKey ? { actionKey: input.actionKey } : {}),\n type: \"email\",\n operation: input.mode,\n input: emailInput as unknown as Record<string, unknown>,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n }),\n type: \"email\",\n operation: input.mode,\n input: emailInput,\n };\n}\n\nexport function isIntegrationAction(action: AssignmentAction): action is IntegrationAction {\n return typeof action.type === \"string\" && typeof action.operation === \"string\";\n}\n\nexport function isEmailDeliveryAction(action: AssignmentAction): action is EmailDeliveryAction {\n return action.type === \"email\" && (action.operation === \"draft\" || action.operation === \"send\");\n}\n","import type { AssignmentResult } from \"./types\";\n\nexport type TableRow = Record<string, unknown>;\n\nexport type TablePayload = {\n table: {\n columns: string[];\n rows: TableRow[];\n };\n row_count: number;\n rows_unique: boolean;\n has_contact_method: boolean;\n summary?: string;\n};\n\nexport type CreateTableResultOptions = {\n columns?: string[];\n summary?: string;\n contactFields?: string[];\n dedupeBy?: string[];\n};\n\nconst DEFAULT_CONTACT_FIELDS = [\"email\", \"phone\", \"profile_url\", \"linkedin_url\"];\n\nfunction hasValue(value: unknown) {\n if (typeof value === \"string\") {\n return value.trim().length > 0;\n }\n return value !== null && value !== undefined;\n}\n\nfunction deriveColumns(rows: TableRow[]) {\n const ordered: string[] = [];\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n if (!ordered.includes(key)) {\n ordered.push(key);\n }\n }\n }\n return ordered;\n}\n\nfunction makeRowKey(row: TableRow, keys: string[]) {\n const normalized = keys.map((key) => [key, row[key]]);\n return JSON.stringify(normalized);\n}\n\nexport function createTablePayload(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): TablePayload {\n const columns = options.columns ?? deriveColumns(rows);\n const dedupeKeys = options.dedupeBy && options.dedupeBy.length > 0 ? options.dedupeBy : columns;\n const contactFields =\n options.contactFields && options.contactFields.length > 0\n ? options.contactFields\n : DEFAULT_CONTACT_FIELDS;\n\n const uniqueCount = new Set(rows.map((row) => makeRowKey(row, dedupeKeys))).size;\n const hasContactMethod = rows.every((row) => contactFields.some((field) => hasValue(row[field])));\n\n return {\n table: {\n columns,\n rows,\n },\n row_count: rows.length,\n rows_unique: uniqueCount === rows.length,\n has_contact_method: hasContactMethod,\n ...(options.summary ? { summary: options.summary } : {}),\n };\n}\n\nexport function createTableResult(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): Pick<AssignmentResult, \"result\"> {\n return {\n result: createTablePayload(rows, options),\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/signature.ts","../src/contracts.ts","../src/webhook.ts","../src/adapters.ts","../src/runtime.ts","../src/integrations.ts","../src/results.ts"],"sourcesContent":["import type { ApiErrorBody } from \"./types\";\n\nexport class SdkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SdkError\";\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number;\n readonly code: string | undefined;\n readonly body: ApiErrorBody | null;\n readonly retryable: boolean;\n\n constructor(params: {\n status: number;\n message: string;\n code: string | undefined;\n body: ApiErrorBody | null;\n }) {\n super(params.message);\n this.name = \"ApiError\";\n this.status = params.status;\n this.code = params.code;\n this.body = params.body;\n this.retryable = params.status === 429 || params.status >= 500;\n }\n}\n","import { ApiError } from \"./errors\";\nimport type {\n ApiErrorBody,\n AssignmentAckRequest,\n AssignmentResult,\n GetAssignmentRepliesResponse,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\nexport type ClientOptions = {\n baseUrl: string;\n apiKey: string;\n fetchImpl?: typeof fetch;\n};\n\nexport class AgentClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.apiKey = options.apiKey;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async ackAssignment(assignmentId: string, request: AssignmentAckRequest): Promise<void> {\n await this.post(`/agent/assignments/ack`, {\n assignment_id: assignmentId,\n ...request,\n });\n }\n\n async submitResult(input: SubmitResultRequest): Promise<void> {\n const payload: AssignmentResult = {\n status: input.status,\n ...(input.result ? { result: input.result } : {}),\n ...(input.error ? { error: input.error } : {}),\n };\n\n await this.post(`/agent/assignments/submit`, {\n assignment_id: input.assignmentId,\n ...payload,\n ...(input.actions ? { actions: input.actions } : {}),\n });\n }\n\n async submitError(input: SubmitErrorRequest): Promise<void> {\n await this.submitResult({\n assignmentId: input.assignmentId,\n status: \"timed_out\",\n error: input.error,\n ...(input.details ? { result: { details: input.details } } : {}),\n });\n }\n\n async getAssignmentReplies(assignmentId: string): Promise<GetAssignmentRepliesResponse> {\n return await this.postJson<GetAssignmentRepliesResponse>(`/agent/assignments/replies`, {\n assignment_id: assignmentId,\n });\n }\n\n private async post(path: string, body: Record<string, unknown>): Promise<void> {\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await this.toApiError(response);\n }\n }\n\n private async postJson<T>(path: string, body: Record<string, unknown>): Promise<T> {\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await this.toApiError(response);\n }\n\n return (await response.json()) as T;\n }\n\n private async toApiError(response: Response): Promise<ApiError> {\n const raw = await response.text();\n let parsed: ApiErrorBody | null = null;\n\n if (raw) {\n try {\n parsed = JSON.parse(raw) as ApiErrorBody;\n } catch {\n parsed = { message: raw };\n }\n }\n\n return new ApiError({\n status: response.status,\n message:\n parsed?.message ?? `API request failed (${response.status}): ${raw || response.statusText}`,\n code: parsed?.code,\n body: parsed,\n });\n }\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { SdkError } from \"./errors\";\n\nexport function computeWebhookSignature(params: {\n webhookSecret: string;\n timestamp: string;\n body: string;\n}) {\n const signedPayload = `${params.timestamp}.${params.body}`;\n const digest = createHmac(\"sha256\", params.webhookSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n return `sha256=${digest}`;\n}\n\nexport function verifyWebhookSignature(params: {\n webhookSecret: string;\n timestamp?: string;\n body: string;\n signature?: string;\n}) {\n if (!params.timestamp || !params.signature) {\n throw new SdkError(\"Missing webhook timestamp or signature\");\n }\n\n const expected = computeWebhookSignature({\n webhookSecret: params.webhookSecret,\n timestamp: params.timestamp,\n body: params.body,\n });\n\n const expectedBuffer = Buffer.from(expected, \"utf8\");\n const actualBuffer = Buffer.from(params.signature, \"utf8\");\n\n if (expectedBuffer.length !== actualBuffer.length) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n\n if (!timingSafeEqual(expectedBuffer, actualBuffer)) {\n throw new SdkError(\"Invalid webhook signature\");\n }\n}\n","import { SdkError } from \"./errors\";\nimport type { Assignment, AssignmentEnvelopeV1, AssignmentResultSchema, SdkContractVersion } from \"./types\";\n\nconst CONTRACT_VERSION: SdkContractVersion = \"v1\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction parseAssignmentRecord(record: Record<string, unknown>): Assignment {\n if (typeof record.assignment_id !== \"string\") {\n throw new SdkError(\"Missing assignment_id\");\n }\n if (typeof record.template_slug !== \"string\") {\n throw new SdkError(\"Missing template_slug\");\n }\n if (!isObject(record.outcome)) {\n throw new SdkError(\"Missing outcome\");\n }\n if (!isObject(record.result_schema)) {\n throw new SdkError(\"Missing result_schema\");\n }\n\n const outcome = record.outcome;\n if (typeof outcome.title !== \"string\") {\n throw new SdkError(\"Missing outcome.title\");\n }\n if (!isObject(outcome.payload)) {\n throw new SdkError(\"Missing outcome.payload\");\n }\n\n const parsedResultSchema = record.result_schema as AssignmentResultSchema;\n\n return {\n assignment_id: record.assignment_id,\n template_slug: record.template_slug,\n result_schema: parsedResultSchema,\n outcome: {\n title: outcome.title,\n payload: outcome.payload,\n ...(typeof outcome.requested_unit_price_value === \"number\"\n ? { requested_unit_price_value: outcome.requested_unit_price_value }\n : {}),\n ...(typeof outcome.requested_total_price_value === \"number\"\n ? { requested_total_price_value: outcome.requested_total_price_value }\n : {}),\n ...(typeof outcome.currency === \"string\" ? { currency: outcome.currency } : {}),\n ...(typeof outcome.time_window === \"string\" ? { time_window: outcome.time_window } : {}),\n },\n };\n}\n\nexport function parseAssignmentV1(body: string): Assignment {\n let payload: unknown;\n try {\n payload = JSON.parse(body);\n } catch {\n throw new SdkError(\"Invalid JSON payload\");\n }\n\n if (!isObject(payload)) {\n throw new SdkError(\"Invalid assignment payload\");\n }\n\n if (payload.version !== CONTRACT_VERSION) {\n throw new SdkError(\"Unsupported assignment contract version\");\n }\n if (!isObject(payload.assignment)) {\n throw new SdkError(\"Missing assignment envelope payload\");\n }\n\n return parseAssignmentRecord(payload.assignment);\n}\n\nexport function toAssignmentEnvelopeV1(assignment: Assignment): AssignmentEnvelopeV1 {\n return {\n version: CONTRACT_VERSION,\n assignment,\n };\n}\n\nexport function getContractVersion(): SdkContractVersion {\n return CONTRACT_VERSION;\n}\n","import { SdkError } from \"./errors\";\nimport { parseAssignmentV1 } from \"./contracts\";\nimport { verifyWebhookSignature } from \"./signature\";\nimport type { Assignment, AssignmentResult, WebhookInput } from \"./types\";\n\nexport const DEFAULT_SIGNATURE_HEADER = \"x-bounty-signature\";\nexport const DEFAULT_TIMESTAMP_HEADER = \"x-bounty-timestamp\";\n\nexport type WebhookHandlerOptions = {\n webhookSecret: string;\n onAssignment: (params: { assignment: Assignment }) => Promise<AssignmentResult>;\n verifySignature?: boolean;\n};\n\nexport type WebhookHttpResponse = {\n status: number;\n body: AssignmentResult;\n};\n\nexport function createWebhookHandler(options: WebhookHandlerOptions) {\n const shouldVerify = options.verifySignature ?? true;\n\n return async function handleWebhook(input: WebhookInput): Promise<AssignmentResult> {\n if (shouldVerify) {\n verifyWebhookSignature({\n webhookSecret: options.webhookSecret,\n body: input.body,\n ...(input.signature ? { signature: input.signature } : {}),\n ...(input.timestamp ? { timestamp: input.timestamp } : {}),\n });\n }\n\n const assignment = parseAssignmentV1(input.body);\n return options.onAssignment({ assignment });\n };\n}\n\nexport async function executeWebhook(\n handler: ReturnType<typeof createWebhookHandler>,\n input: WebhookInput,\n): Promise<WebhookHttpResponse> {\n try {\n const body = await handler(input);\n return {\n status: 200,\n body,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n const sdkError = error instanceof SdkError ? error : new SdkError(message);\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: sdkError.message,\n },\n };\n }\n}\n","import {\n DEFAULT_SIGNATURE_HEADER,\n DEFAULT_TIMESTAMP_HEADER,\n createWebhookHandler,\n executeWebhook,\n type WebhookHttpResponse,\n type WebhookHandlerOptions,\n} from \"./webhook\";\nimport { SdkError } from \"./errors\";\n\nfunction headerValue(headers: Record<string, string | string[] | undefined>, key: string) {\n const value = headers[key] ?? headers[key.toLowerCase()];\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n}\n\nfunction normalizeBody(body: unknown): string {\n if (typeof body === \"string\") {\n return body;\n }\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) {\n return body.toString(\"utf8\");\n }\n if (body === undefined || body === null) {\n return \"\";\n }\n return JSON.stringify(body);\n}\n\nasync function readExpressBody(req: {\n body?: unknown;\n rawBody?: string | Buffer;\n on?: (event: string, listener: (...args: unknown[]) => void) => void;\n}) {\n if (typeof req.rawBody === \"string\" || Buffer.isBuffer(req.rawBody)) {\n return normalizeBody(req.rawBody);\n }\n\n if (req.body !== undefined) {\n if (typeof req.body === \"object\" && req.body !== null && !Buffer.isBuffer(req.body)) {\n throw new SdkError(\n \"Express webhook route must receive raw bytes. Mount webhook routes before express.json() or exclude them from JSON parsing.\",\n );\n }\n return normalizeBody(req.body);\n }\n\n if (!req.on) {\n return \"\";\n }\n\n return await new Promise<string>((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n req.on?.(\"data\", (chunk: unknown) => {\n if (typeof chunk === \"string\") {\n chunks.push(Buffer.from(chunk, \"utf8\"));\n } else if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n }\n });\n req.on?.(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n req.on?.(\"error\", (error: unknown) => {\n reject(error);\n });\n });\n}\n\nfunction toWebhookInput(params: {\n body: string;\n signature: string | undefined;\n timestamp: string | undefined;\n}) {\n return {\n body: params.body,\n ...(params.signature ? { signature: params.signature } : {}),\n ...(params.timestamp ? { timestamp: params.timestamp } : {}),\n };\n}\n\nfunction toBadRequest(error: unknown): WebhookHttpResponse {\n const message = error instanceof Error ? error.message : \"Unexpected webhook error\";\n return {\n status: 400,\n body: {\n status: \"rejected\",\n error: message,\n },\n };\n}\n\nexport function createExpressWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function expressWebhook(\n req: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n res: {\n status: (code: number) => { json: (payload: unknown) => void };\n },\n ) {\n let result: WebhookHttpResponse;\n try {\n const body = await readExpressBody(req);\n result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(req.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(req.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n } catch (error) {\n result = toBadRequest(error);\n }\n\n res.status(result.status).json(result.body);\n };\n}\n\nexport function createFastifyWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function fastifyWebhook(\n request: {\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n rawBody?: string;\n },\n reply: {\n code: (statusCode: number) => { send: (payload: unknown) => void };\n },\n ) {\n const body = request.rawBody ?? normalizeBody(request.body);\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: headerValue(request.headers, DEFAULT_SIGNATURE_HEADER),\n timestamp: headerValue(request.headers, DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n reply.code(result.status).send(result.body);\n };\n}\n\nexport function createNextWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function nextWebhook(request: Request): Promise<Response> {\n const body = await request.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: request.headers.get(DEFAULT_SIGNATURE_HEADER) ?? undefined,\n timestamp: request.headers.get(DEFAULT_TIMESTAMP_HEADER) ?? undefined,\n }),\n );\n\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n\nexport function createHonoWebhookHandler(options: WebhookHandlerOptions) {\n const handler = createWebhookHandler(options);\n\n return async function honoWebhook(c: {\n req: {\n text: () => Promise<string>;\n header: (name: string) => string | undefined;\n };\n json: (payload: unknown, status?: number) => Response;\n }) {\n const body = await c.req.text();\n const result = await executeWebhook(\n handler,\n toWebhookInput({\n body,\n signature: c.req.header(DEFAULT_SIGNATURE_HEADER),\n timestamp: c.req.header(DEFAULT_TIMESTAMP_HEADER),\n }),\n );\n\n return c.json(result.body, result.status);\n };\n}\n","import { AgentClient, type ClientOptions } from \"./client\";\nimport { SdkError } from \"./errors\";\nimport type {\n Assignment,\n AssignmentAction,\n AssignmentResult,\n SubmitErrorRequest,\n SubmitResultRequest,\n} from \"./types\";\n\ntype RuntimeLogger = {\n info?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n};\n\nexport type AutoSubmitAssignmentHandlerOptions = {\n client: AgentClient | ClientOptions;\n runAssignment: (params: { assignment: Assignment }) => Promise<AssignmentExecutionOutput>;\n acceptAssignment?: (params: { assignment: Assignment }) => Promise<AssignmentResult> | AssignmentResult;\n createSubmitRequest?: (params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n }) => SubmitResultRequest;\n createSubmitErrorRequest?: (params: { assignment: Assignment; error: unknown }) => SubmitErrorRequest;\n executionMode?: \"background\" | \"blocking\";\n logger?: RuntimeLogger;\n};\n\nexport type AssignmentExecutionResult = {\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n};\n\nexport type AssignmentExecutionOutput = Record<string, unknown> | AssignmentExecutionResult;\n\nexport type AssignmentExecutionHandler = (\n params: { assignment: Assignment },\n) => Promise<AssignmentExecutionOutput>;\n\nexport type AssignmentSlugRouterOptions = {\n handlers: Record<string, AssignmentExecutionHandler>;\n fallback?: AssignmentExecutionHandler;\n normalizeSlug?: (slug: string) => string;\n};\n\nfunction toMessage(error: unknown) {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return \"Unknown assignment execution error\";\n}\n\nfunction defaultAcceptedResponse(assignment: Assignment): AssignmentResult {\n return {\n status: \"assigned\",\n result: {\n accepted: true,\n assignment_id: assignment.assignment_id,\n },\n };\n}\n\nfunction defaultSubmitRequest(params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n actions?: AssignmentAction[];\n}): SubmitResultRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n status: \"verifying\",\n result: params.result,\n ...(params.actions && params.actions.length > 0 ? { actions: params.actions } : {}),\n };\n}\n\nfunction defaultSubmitErrorRequest(params: { assignment: Assignment; error: unknown }): SubmitErrorRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n error: toMessage(params.error),\n };\n}\n\nfunction asClient(client: AgentClient | ClientOptions) {\n return client instanceof AgentClient ? client : new AgentClient(client);\n}\n\nfunction normalizeExecutionOutput(output: AssignmentExecutionOutput): AssignmentExecutionResult {\n if (\n output &&\n typeof output === \"object\" &&\n !Array.isArray(output) &&\n \"result\" in output &&\n output.result &&\n typeof output.result === \"object\" &&\n !Array.isArray(output.result)\n ) {\n const actions =\n \"actions\" in output && Array.isArray(output.actions)\n ? (output.actions as AssignmentAction[])\n : undefined;\n return {\n result: output.result as Record<string, unknown>,\n ...(actions && actions.length > 0 ? { actions } : {}),\n };\n }\n\n if (!output || typeof output !== \"object\" || Array.isArray(output)) {\n throw new SdkError(\"Assignment execution must return an object result\");\n }\n\n return {\n result: output as Record<string, unknown>,\n };\n}\n\nexport function createAssignmentSlugRouter(options: AssignmentSlugRouterOptions): AssignmentExecutionHandler {\n const normalize = options.normalizeSlug ?? ((slug: string) => slug);\n const normalizedHandlers = new Map<string, AssignmentExecutionHandler>();\n\n for (const [slug, handler] of Object.entries(options.handlers)) {\n normalizedHandlers.set(normalize(slug), handler);\n }\n\n return async ({ assignment }) => {\n const slug = normalize(assignment.template_slug);\n const handler = normalizedHandlers.get(slug) ?? options.fallback;\n if (!handler) {\n throw new SdkError(`No assignment handler registered for template slug \"${assignment.template_slug}\"`);\n }\n return handler({ assignment });\n };\n}\n\nexport function createAutoSubmitAssignmentHandler(options: AutoSubmitAssignmentHandlerOptions) {\n const client = asClient(options.client);\n const mode = options.executionMode ?? \"background\";\n const logger = options.logger;\n\n async function processAssignment(assignment: Assignment) {\n try {\n const execution = normalizeExecutionOutput(await options.runAssignment({ assignment }));\n const submitRequest = options.createSubmitRequest\n ? options.createSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n })\n : defaultSubmitRequest({\n assignment,\n result: execution.result,\n ...(execution.actions ? { actions: execution.actions } : {}),\n });\n await client.submitResult(submitRequest);\n logger?.info?.(\"[agent-sdk] assignment_submitted\", {\n assignmentId: assignment.assignment_id,\n status: submitRequest.status,\n actionCount: submitRequest.actions?.length ?? 0,\n });\n } catch (error) {\n const submitErrorRequest = options.createSubmitErrorRequest\n ? options.createSubmitErrorRequest({ assignment, error })\n : defaultSubmitErrorRequest({ assignment, error });\n await client.submitError(submitErrorRequest);\n logger?.error?.(\"[agent-sdk] assignment_failed\", {\n assignmentId: assignment.assignment_id,\n error: submitErrorRequest.error,\n });\n }\n }\n\n return async function onAssignment({ assignment }: { assignment: Assignment }): Promise<AssignmentResult> {\n const accepted = options.acceptAssignment\n ? await options.acceptAssignment({ assignment })\n : defaultAcceptedResponse(assignment);\n\n if (accepted.status !== \"assigned\") {\n return accepted;\n }\n\n if (mode === \"blocking\") {\n await processAssignment(assignment);\n } else {\n void processAssignment(assignment).catch((error) => {\n logger?.error?.(\"[agent-sdk] assignment_background_failure\", {\n assignmentId: assignment.assignment_id,\n error: toMessage(error),\n });\n });\n }\n\n return accepted;\n };\n}\n","import type {\n AssignmentAction,\n EmailDeliveryAction,\n EmailDeliveryInput,\n EmailRecipient,\n IntegrationAction,\n} from \"./types\";\n\nexport type CreateIntegrationActionInput = {\n actionKey?: string;\n type: string;\n operation: string;\n input: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport type CreateEmailDeliveryActionInput = {\n actionKey?: string;\n mode: \"draft\" | \"send\";\n to: EmailRecipient[];\n cc?: EmailRecipient[];\n bcc?: EmailRecipient[];\n subject: string;\n textBody: string;\n htmlBody?: string;\n metadata?: Record<string, unknown>;\n};\n\nfunction normalizeRecipients(recipients: EmailRecipient[], label: string) {\n if (!Array.isArray(recipients) || recipients.length === 0) {\n throw new Error(`${label} must include at least one recipient`);\n }\n return recipients.map((recipient, index) => {\n if (!recipient || typeof recipient.email !== \"string\" || recipient.email.trim().length === 0) {\n throw new Error(`${label}[${index}] is missing email`);\n }\n return {\n email: recipient.email.trim(),\n ...(typeof recipient.name === \"string\" && recipient.name.trim().length > 0\n ? { name: recipient.name.trim() }\n : {}),\n };\n });\n}\n\nexport function createIntegrationAction(input: CreateIntegrationActionInput): IntegrationAction {\n if (typeof input.type !== \"string\" || input.type.trim().length === 0) {\n throw new Error(\"type is required\");\n }\n if (typeof input.operation !== \"string\" || input.operation.trim().length === 0) {\n throw new Error(\"operation is required\");\n }\n if (!input.input || typeof input.input !== \"object\" || Array.isArray(input.input)) {\n throw new Error(\"input must be an object\");\n }\n\n return {\n type: input.type.trim(),\n ...(typeof input.actionKey === \"string\" && input.actionKey.trim().length > 0\n ? { actionKey: input.actionKey.trim() }\n : {}),\n operation: input.operation.trim(),\n input,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n };\n}\n\nfunction createEmailDeliveryInput(input: CreateEmailDeliveryActionInput): EmailDeliveryInput {\n if (typeof input.subject !== \"string\" || input.subject.trim().length === 0) {\n throw new Error(\"Email subject is required\");\n }\n if (typeof input.textBody !== \"string\" || input.textBody.trim().length === 0) {\n throw new Error(\"Email textBody is required\");\n }\n\n return {\n to: normalizeRecipients(input.to, \"to\"),\n ...(input.cc && input.cc.length > 0 ? { cc: normalizeRecipients(input.cc, \"cc\") } : {}),\n ...(input.bcc && input.bcc.length > 0 ? { bcc: normalizeRecipients(input.bcc, \"bcc\") } : {}),\n subject: input.subject.trim(),\n textBody: input.textBody.trim(),\n ...(typeof input.htmlBody === \"string\" && input.htmlBody.trim().length > 0\n ? { htmlBody: input.htmlBody }\n : {}),\n };\n}\n\nexport function createEmailDeliveryAction(\n input: CreateEmailDeliveryActionInput,\n): EmailDeliveryAction {\n const emailInput = createEmailDeliveryInput(input);\n return {\n ...createIntegrationAction({\n ...(input.actionKey ? { actionKey: input.actionKey } : {}),\n type: \"email\",\n operation: input.mode,\n input: emailInput as unknown as Record<string, unknown>,\n ...(input.metadata ? { metadata: input.metadata } : {}),\n }),\n type: \"email\",\n operation: input.mode,\n input: emailInput,\n };\n}\n\nexport function isIntegrationAction(action: AssignmentAction): action is IntegrationAction {\n return typeof action.type === \"string\" && typeof action.operation === \"string\";\n}\n\nexport function isEmailDeliveryAction(action: AssignmentAction): action is EmailDeliveryAction {\n return action.type === \"email\" && (action.operation === \"draft\" || action.operation === \"send\");\n}\n","import type { AssignmentResult } from \"./types\";\n\nexport type TableRow = Record<string, unknown>;\n\nexport type TablePayload = {\n table: {\n columns: string[];\n rows: TableRow[];\n };\n row_count: number;\n rows_unique: boolean;\n has_contact_method: boolean;\n summary?: string;\n};\n\nexport type CreateTableResultOptions = {\n columns?: string[];\n summary?: string;\n contactFields?: string[];\n dedupeBy?: string[];\n};\n\nconst DEFAULT_CONTACT_FIELDS = [\"email\", \"phone\", \"profile_url\", \"linkedin_url\"];\n\nfunction hasValue(value: unknown) {\n if (typeof value === \"string\") {\n return value.trim().length > 0;\n }\n return value !== null && value !== undefined;\n}\n\nfunction deriveColumns(rows: TableRow[]) {\n const ordered: string[] = [];\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n if (!ordered.includes(key)) {\n ordered.push(key);\n }\n }\n }\n return ordered;\n}\n\nfunction makeRowKey(row: TableRow, keys: string[]) {\n const normalized = keys.map((key) => [key, row[key]]);\n return JSON.stringify(normalized);\n}\n\nexport function createTablePayload(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): TablePayload {\n const columns = options.columns ?? deriveColumns(rows);\n const dedupeKeys = options.dedupeBy && options.dedupeBy.length > 0 ? options.dedupeBy : columns;\n const contactFields =\n options.contactFields && options.contactFields.length > 0\n ? options.contactFields\n : DEFAULT_CONTACT_FIELDS;\n\n const uniqueCount = new Set(rows.map((row) => makeRowKey(row, dedupeKeys))).size;\n const hasContactMethod = rows.every((row) => contactFields.some((field) => hasValue(row[field])));\n\n return {\n table: {\n columns,\n rows,\n },\n row_count: rows.length,\n rows_unique: uniqueCount === rows.length,\n has_contact_method: hasContactMethod,\n ...(options.summary ? { summary: options.summary } : {}),\n };\n}\n\nexport function createTableResult(\n rows: TableRow[],\n options: CreateTableResultOptions = {},\n): Pick<AssignmentResult, \"result\"> {\n return {\n result: createTablePayload(rows, options),\n };\n}\n"],"mappings":";AAEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAKT;AACD,UAAM,OAAO,OAAO;AACpB,SAAK,OAAO;AACZ,SAAK,SAAS,OAAO;AACrB,SAAK,OAAO,OAAO;AACnB,SAAK,OAAO,OAAO;AACnB,SAAK,YAAY,OAAO,WAAW,OAAO,OAAO,UAAU;AAAA,EAC7D;AACF;;;ACZO,IAAM,cAAN,MAAkB;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAwB;AAClC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,cAAsB,SAA8C;AACtF,UAAM,KAAK,KAAK,0BAA0B;AAAA,MACxC,eAAe;AAAA,MACf,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAA2C;AAC5D,UAAM,UAA4B;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,MAC/C,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,IAC9C;AAEA,UAAM,KAAK,KAAK,6BAA6B;AAAA,MAC3C,eAAe,MAAM;AAAA,MACrB,GAAG;AAAA,MACH,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,OAA0C;AAC1D,UAAM,KAAK,aAAa;AAAA,MACtB,cAAc,MAAM;AAAA,MACpB,QAAQ;AAAA,MACR,OAAO,MAAM;AAAA,MACb,GAAI,MAAM,UAAU,EAAE,QAAQ,EAAE,SAAS,MAAM,QAAQ,EAAE,IAAI,CAAC;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,qBAAqB,cAA6D;AACtF,WAAO,MAAM,KAAK,SAAuC,8BAA8B;AAAA,MACrF,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,KAAK,MAAc,MAA8C;AAC7E,UAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM,KAAK,WAAW,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAc,SAAY,MAAc,MAA2C;AACjF,UAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM,KAAK,WAAW,QAAQ;AAAA,IACtC;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAAA,EAEA,MAAc,WAAW,UAAuC;AAC9D,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,QAAI,SAA8B;AAElC,QAAI,KAAK;AACP,UAAI;AACF,iBAAS,KAAK,MAAM,GAAG;AAAA,MACzB,QAAQ;AACN,iBAAS,EAAE,SAAS,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,IAAI,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,SACE,QAAQ,WAAW,uBAAuB,SAAS,MAAM,MAAM,OAAO,SAAS,UAAU;AAAA,MAC3F,MAAM,QAAQ;AAAA,MACd,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;ACnHA,SAAS,YAAY,uBAAuB;AAGrC,SAAS,wBAAwB,QAIrC;AACD,QAAM,gBAAgB,GAAG,OAAO,SAAS,IAAI,OAAO,IAAI;AACxD,QAAM,SAAS,WAAW,UAAU,OAAO,aAAa,EACrD,OAAO,eAAe,MAAM,EAC5B,OAAO,KAAK;AACf,SAAO,UAAU,MAAM;AACzB;AAEO,SAAS,uBAAuB,QAKpC;AACD,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,WAAW;AAC1C,UAAM,IAAI,SAAS,wCAAwC;AAAA,EAC7D;AAEA,QAAM,WAAW,wBAAwB;AAAA,IACvC,eAAe,OAAO;AAAA,IACtB,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,EACf,CAAC;AAED,QAAM,iBAAiB,OAAO,KAAK,UAAU,MAAM;AACnD,QAAM,eAAe,OAAO,KAAK,OAAO,WAAW,MAAM;AAEzD,MAAI,eAAe,WAAW,aAAa,QAAQ;AACjD,UAAM,IAAI,SAAS,2BAA2B;AAAA,EAChD;AAEA,MAAI,CAAC,gBAAgB,gBAAgB,YAAY,GAAG;AAClD,UAAM,IAAI,SAAS,2BAA2B;AAAA,EAChD;AACF;;;ACtCA,IAAM,mBAAuC;AAE7C,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU;AACrC;AAEA,SAAS,sBAAsB,QAA6C;AAC1E,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,CAAC,SAAS,OAAO,OAAO,GAAG;AAC7B,UAAM,IAAI,SAAS,iBAAiB;AAAA,EACtC;AACA,MAAI,CAAC,SAAS,OAAO,aAAa,GAAG;AACnC,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AAEA,QAAM,UAAU,OAAO;AACvB,MAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,CAAC,SAAS,QAAQ,OAAO,GAAG;AAC9B,UAAM,IAAI,SAAS,yBAAyB;AAAA,EAC9C;AAEA,QAAM,qBAAqB,OAAO;AAElC,SAAO;AAAA,IACL,eAAe,OAAO;AAAA,IACtB,eAAe,OAAO;AAAA,IACtB,eAAe;AAAA,IACf,SAAS;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,GAAI,OAAO,QAAQ,+BAA+B,WAC9C,EAAE,4BAA4B,QAAQ,2BAA2B,IACjE,CAAC;AAAA,MACL,GAAI,OAAO,QAAQ,gCAAgC,WAC/C,EAAE,6BAA6B,QAAQ,4BAA4B,IACnE,CAAC;AAAA,MACL,GAAI,OAAO,QAAQ,aAAa,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MAC7E,GAAI,OAAO,QAAQ,gBAAgB,WAAW,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IACxF;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,MAA0B;AAC1D,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,IAAI;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,SAAS,sBAAsB;AAAA,EAC3C;AAEA,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,SAAS,4BAA4B;AAAA,EACjD;AAEA,MAAI,QAAQ,YAAY,kBAAkB;AACxC,UAAM,IAAI,SAAS,yCAAyC;AAAA,EAC9D;AACA,MAAI,CAAC,SAAS,QAAQ,UAAU,GAAG;AACjC,UAAM,IAAI,SAAS,qCAAqC;AAAA,EAC1D;AAEA,SAAO,sBAAsB,QAAQ,UAAU;AACjD;AAEO,SAAS,uBAAuB,YAA8C;AACnF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,qBAAyC;AACvD,SAAO;AACT;;;AC9EO,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AAajC,SAAS,qBAAqB,SAAgC;AACnE,QAAM,eAAe,QAAQ,mBAAmB;AAEhD,SAAO,eAAe,cAAc,OAAgD;AAClF,QAAI,cAAc;AAChB,6BAAuB;AAAA,QACrB,eAAe,QAAQ;AAAA,QACvB,MAAM,MAAM;AAAA,QACZ,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,QACxD,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,kBAAkB,MAAM,IAAI;AAC/C,WAAO,QAAQ,aAAa,EAAE,WAAW,CAAC;AAAA,EAC5C;AACF;AAEA,eAAsB,eACpB,SACA,OAC8B;AAC9B,MAAI;AACF,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAM,WAAW,iBAAiB,WAAW,QAAQ,IAAI,SAAS,OAAO;AACzE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;AChDA,SAAS,YAAY,SAAwD,KAAa;AACxF,QAAM,QAAQ,QAAQ,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC;AACvD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAuB;AAC5C,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,eAAe,OAAO,SAAS,IAAI,GAAG;AAC1D,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACA,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAU,IAAI;AAC5B;AAEA,eAAe,gBAAgB,KAI5B;AACD,MAAI,OAAO,IAAI,YAAY,YAAY,OAAO,SAAS,IAAI,OAAO,GAAG;AACnE,WAAO,cAAc,IAAI,OAAO;AAAA,EAClC;AAEA,MAAI,IAAI,SAAS,QAAW;AAC1B,QAAI,OAAO,IAAI,SAAS,YAAY,IAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,IAAI,IAAI,GAAG;AACnF,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,cAAc,IAAI,IAAI;AAAA,EAC/B;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACpD,UAAM,SAAuB,CAAC;AAC9B,QAAI,KAAK,QAAQ,CAAC,UAAmB;AACnC,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,KAAK,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,MACxC,WAAW,iBAAiB,YAAY;AACtC,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,OAAO,MAAM;AACpB,cAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,IAChD,CAAC;AACD,QAAI,KAAK,SAAS,CAAC,UAAmB;AACpC,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAe,QAIrB;AACD,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC1D,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC5D;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,SAAgC;AAC1E,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,eACpB,KAKA,KAGA;AACA,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,GAAG;AACtC,eAAS,MAAM;AAAA,QACb;AAAA,QACA,eAAe;AAAA,UACb;AAAA,UACA,WAAW,YAAY,IAAI,SAAS,wBAAwB;AAAA,UAC5D,WAAW,YAAY,IAAI,SAAS,wBAAwB;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,eAAS,aAAa,KAAK;AAAA,IAC7B;AAEA,QAAI,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEO,SAAS,4BAA4B,SAAgC;AAC1E,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,eACpB,SAKA,OAGA;AACA,UAAM,OAAO,QAAQ,WAAW,cAAc,QAAQ,IAAI;AAC1D,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,YAAY,QAAQ,SAAS,wBAAwB;AAAA,QAChE,WAAW,YAAY,QAAQ,SAAS,wBAAwB;AAAA,MAClE,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEO,SAAS,yBAAyB,SAAgC;AACvE,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,YAAY,SAAqC;AACrE,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,QAAQ,QAAQ,IAAI,wBAAwB,KAAK;AAAA,QAC5D,WAAW,QAAQ,QAAQ,IAAI,wBAAwB,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,SAAS,KAAK,UAAU,OAAO,IAAI,GAAG;AAAA,MAC/C,QAAQ,OAAO;AAAA,MACf,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,yBAAyB,SAAgC;AACvE,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,YAAY,GAM/B;AACD,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,EAAE,IAAI,OAAO,wBAAwB;AAAA,QAChD,WAAW,EAAE,IAAI,OAAO,wBAAwB;AAAA,MAClD,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,EAC1C;AACF;;;ACtJA,SAAS,UAAU,OAAgB;AACjC,MAAI,iBAAiB,SAAS,MAAM,QAAQ,KAAK,EAAE,SAAS,GAAG;AAC7D,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,YAA0C;AACzE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,eAAe,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAIN;AACtB,SAAO;AAAA,IACL,cAAc,OAAO,WAAW;AAAA,IAChC,QAAQ;AAAA,IACR,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,IAAI,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,EACnF;AACF;AAEA,SAAS,0BAA0B,QAAwE;AACzG,SAAO;AAAA,IACL,cAAc,OAAO,WAAW;AAAA,IAChC,OAAO,UAAU,OAAO,KAAK;AAAA,EAC/B;AACF;AAEA,SAAS,SAAS,QAAqC;AACrD,SAAO,kBAAkB,cAAc,SAAS,IAAI,YAAY,MAAM;AACxE;AAEA,SAAS,yBAAyB,QAA8D;AAC9F,MACE,UACA,OAAO,WAAW,YAClB,CAAC,MAAM,QAAQ,MAAM,KACrB,YAAY,UACZ,OAAO,UACP,OAAO,OAAO,WAAW,YACzB,CAAC,MAAM,QAAQ,OAAO,MAAM,GAC5B;AACA,UAAM,UACJ,aAAa,UAAU,MAAM,QAAQ,OAAO,OAAO,IAC9C,OAAO,UACR;AACN,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,SAAS,mDAAmD;AAAA,EACxE;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,2BAA2B,SAAkE;AAC3G,QAAM,YAAY,QAAQ,kBAAkB,CAAC,SAAiB;AAC9D,QAAM,qBAAqB,oBAAI,IAAwC;AAEvE,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AAC9D,uBAAmB,IAAI,UAAU,IAAI,GAAG,OAAO;AAAA,EACjD;AAEA,SAAO,OAAO,EAAE,WAAW,MAAM;AAC/B,UAAM,OAAO,UAAU,WAAW,aAAa;AAC/C,UAAM,UAAU,mBAAmB,IAAI,IAAI,KAAK,QAAQ;AACxD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,SAAS,uDAAuD,WAAW,aAAa,GAAG;AAAA,IACvG;AACA,WAAO,QAAQ,EAAE,WAAW,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,kCAAkC,SAA6C;AAC7F,QAAM,SAAS,SAAS,QAAQ,MAAM;AACtC,QAAM,OAAO,QAAQ,iBAAiB;AACtC,QAAM,SAAS,QAAQ;AAEvB,iBAAe,kBAAkB,YAAwB;AACvD,QAAI;AACF,YAAM,YAAY,yBAAyB,MAAM,QAAQ,cAAc,EAAE,WAAW,CAAC,CAAC;AACtF,YAAM,gBAAgB,QAAQ,sBAC1B,QAAQ,oBAAoB;AAAA,QAC1B;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC5D,CAAC,IACD,qBAAqB;AAAA,QACnB;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC5D,CAAC;AACL,YAAM,OAAO,aAAa,aAAa;AACvC,cAAQ,OAAO,oCAAoC;AAAA,QACjD,cAAc,WAAW;AAAA,QACzB,QAAQ,cAAc;AAAA,QACtB,aAAa,cAAc,SAAS,UAAU;AAAA,MAChD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,qBAAqB,QAAQ,2BAC/B,QAAQ,yBAAyB,EAAE,YAAY,MAAM,CAAC,IACtD,0BAA0B,EAAE,YAAY,MAAM,CAAC;AACnD,YAAM,OAAO,YAAY,kBAAkB;AAC3C,cAAQ,QAAQ,iCAAiC;AAAA,QAC/C,cAAc,WAAW;AAAA,QACzB,OAAO,mBAAmB;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,eAAe,aAAa,EAAE,WAAW,GAA0D;AACxG,UAAM,WAAW,QAAQ,mBACrB,MAAM,QAAQ,iBAAiB,EAAE,WAAW,CAAC,IAC7C,wBAAwB,UAAU;AAEtC,QAAI,SAAS,WAAW,YAAY;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,YAAY;AACvB,YAAM,kBAAkB,UAAU;AAAA,IACpC,OAAO;AACL,WAAK,kBAAkB,UAAU,EAAE,MAAM,CAAC,UAAU;AAClD,gBAAQ,QAAQ,6CAA6C;AAAA,UAC3D,cAAc,WAAW;AAAA,UACzB,OAAO,UAAU,KAAK;AAAA,QACxB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;;;ACrKA,SAAS,oBAAoB,YAA8B,OAAe;AACxE,MAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,UAAM,IAAI,MAAM,GAAG,KAAK,sCAAsC;AAAA,EAChE;AACA,SAAO,WAAW,IAAI,CAAC,WAAW,UAAU;AAC1C,QAAI,CAAC,aAAa,OAAO,UAAU,UAAU,YAAY,UAAU,MAAM,KAAK,EAAE,WAAW,GAAG;AAC5F,YAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,oBAAoB;AAAA,IACvD;AACA,WAAO;AAAA,MACL,OAAO,UAAU,MAAM,KAAK;AAAA,MAC5B,GAAI,OAAO,UAAU,SAAS,YAAY,UAAU,KAAK,KAAK,EAAE,SAAS,IACrE,EAAE,MAAM,UAAU,KAAK,KAAK,EAAE,IAC9B,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AACH;AAEO,SAAS,wBAAwB,OAAwD;AAC9F,MAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,EAAE,WAAW,GAAG;AACpE,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AACA,MAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,KAAK,EAAE,WAAW,GAAG;AAC9E,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,MAAI,CAAC,MAAM,SAAS,OAAO,MAAM,UAAU,YAAY,MAAM,QAAQ,MAAM,KAAK,GAAG;AACjF,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,KAAK,KAAK;AAAA,IACtB,GAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,KAAK,EAAE,SAAS,IACvE,EAAE,WAAW,MAAM,UAAU,KAAK,EAAE,IACpC,CAAC;AAAA,IACL,WAAW,MAAM,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,yBAAyB,OAA2D;AAC3F,MAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC1E,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,MAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,EAAE,WAAW,GAAG;AAC5E,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,IAAI,oBAAoB,MAAM,IAAI,IAAI;AAAA,IACtC,GAAI,MAAM,MAAM,MAAM,GAAG,SAAS,IAAI,EAAE,IAAI,oBAAoB,MAAM,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,IACrF,GAAI,MAAM,OAAO,MAAM,IAAI,SAAS,IAAI,EAAE,KAAK,oBAAoB,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,IAC1F,SAAS,MAAM,QAAQ,KAAK;AAAA,IAC5B,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,GAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,EAAE,SAAS,IACrE,EAAE,UAAU,MAAM,SAAS,IAC3B,CAAC;AAAA,EACP;AACF;AAEO,SAAS,0BACd,OACqB;AACrB,QAAM,aAAa,yBAAyB,KAAK;AACjD,SAAO;AAAA,IACL,GAAG,wBAAwB;AAAA,MACzB,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACxD,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,OAAO;AAAA,MACP,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACvD,CAAC;AAAA,IACD,MAAM;AAAA,IACN,WAAW,MAAM;AAAA,IACjB,OAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,QAAuD;AACzF,SAAO,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,cAAc;AACxE;AAEO,SAAS,sBAAsB,QAAyD;AAC7F,SAAO,OAAO,SAAS,YAAY,OAAO,cAAc,WAAW,OAAO,cAAc;AAC1F;;;ACzFA,IAAM,yBAAyB,CAAC,SAAS,SAAS,eAAe,cAAc;AAE/E,SAAS,SAAS,OAAgB;AAChC,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,KAAK,EAAE,SAAS;AAAA,EAC/B;AACA,SAAO,UAAU,QAAQ,UAAU;AACrC;AAEA,SAAS,cAAc,MAAkB;AACvC,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,MAAM;AACtB,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAAe,MAAgB;AACjD,QAAM,aAAa,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;AACpD,SAAO,KAAK,UAAU,UAAU;AAClC;AAEO,SAAS,mBACd,MACA,UAAoC,CAAC,GACvB;AACd,QAAM,UAAU,QAAQ,WAAW,cAAc,IAAI;AACrD,QAAM,aAAa,QAAQ,YAAY,QAAQ,SAAS,SAAS,IAAI,QAAQ,WAAW;AACxF,QAAM,gBACJ,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,IACpD,QAAQ,gBACR;AAEN,QAAM,cAAc,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,KAAK,UAAU,CAAC,CAAC,EAAE;AAC5E,QAAM,mBAAmB,KAAK,MAAM,CAAC,QAAQ,cAAc,KAAK,CAAC,UAAU,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;AAEhG,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,aAAa,gBAAgB,KAAK;AAAA,IAClC,oBAAoB;AAAA,IACpB,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,EACxD;AACF;AAEO,SAAS,kBACd,MACA,UAAoC,CAAC,GACH;AAClC,SAAO;AAAA,IACL,QAAQ,mBAAmB,MAAM,OAAO;AAAA,EAC1C;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bounty-ai/agent-sdk",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Bounty agent SDK for receiving assignments and submitting results",
5
5
  "main": "./dist/index.cjs",
6
6
  "scripts": {