@bounty-ai/agent-sdk 0.1.1 → 0.1.2

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
@@ -28,15 +28,19 @@ __export(index_exports, {
28
28
  computeWebhookSignature: () => computeWebhookSignature,
29
29
  createAssignmentSlugRouter: () => createAssignmentSlugRouter,
30
30
  createAutoSubmitAssignmentHandler: () => createAutoSubmitAssignmentHandler,
31
+ createEmailDeliveryAction: () => createEmailDeliveryAction,
31
32
  createExpressWebhookHandler: () => createExpressWebhookHandler,
32
33
  createFastifyWebhookHandler: () => createFastifyWebhookHandler,
33
34
  createHonoWebhookHandler: () => createHonoWebhookHandler,
35
+ createIntegrationAction: () => createIntegrationAction,
34
36
  createNextWebhookHandler: () => createNextWebhookHandler,
35
37
  createTablePayload: () => createTablePayload,
36
38
  createTableResult: () => createTableResult,
37
39
  createWebhookHandler: () => createWebhookHandler,
38
40
  executeWebhook: () => executeWebhook,
39
41
  getContractVersion: () => getContractVersion,
42
+ isEmailDeliveryAction: () => isEmailDeliveryAction,
43
+ isIntegrationAction: () => isIntegrationAction,
40
44
  parseAssignmentV1: () => parseAssignmentV1,
41
45
  toAssignmentEnvelopeV1: () => toAssignmentEnvelopeV1,
42
46
  verifyWebhookSignature: () => verifyWebhookSignature
@@ -89,7 +93,8 @@ var AgentClient = class {
89
93
  };
90
94
  await this.post(`/agent/assignments/submit`, {
91
95
  assignment_id: input.assignmentId,
92
- ...payload
96
+ ...payload,
97
+ ...input.actions ? { actions: input.actions } : {}
93
98
  });
94
99
  }
95
100
  async submitError(input) {
@@ -422,7 +427,8 @@ function defaultSubmitRequest(params) {
422
427
  return {
423
428
  assignmentId: params.assignment.assignment_id,
424
429
  status: "verifying",
425
- result: params.result
430
+ result: params.result,
431
+ ...params.actions && params.actions.length > 0 ? { actions: params.actions } : {}
426
432
  };
427
433
  }
428
434
  function defaultSubmitErrorRequest(params) {
@@ -434,6 +440,21 @@ function defaultSubmitErrorRequest(params) {
434
440
  function asClient(client) {
435
441
  return client instanceof AgentClient ? client : new AgentClient(client);
436
442
  }
443
+ function normalizeExecutionOutput(output) {
444
+ if (output && typeof output === "object" && !Array.isArray(output) && "result" in output && output.result && typeof output.result === "object" && !Array.isArray(output.result)) {
445
+ const actions = "actions" in output && Array.isArray(output.actions) ? output.actions : void 0;
446
+ return {
447
+ result: output.result,
448
+ ...actions && actions.length > 0 ? { actions } : {}
449
+ };
450
+ }
451
+ if (!output || typeof output !== "object" || Array.isArray(output)) {
452
+ throw new SdkError("Assignment execution must return an object result");
453
+ }
454
+ return {
455
+ result: output
456
+ };
457
+ }
437
458
  function createAssignmentSlugRouter(options) {
438
459
  const normalize = options.normalizeSlug ?? ((slug) => slug);
439
460
  const normalizedHandlers = /* @__PURE__ */ new Map();
@@ -455,12 +476,21 @@ function createAutoSubmitAssignmentHandler(options) {
455
476
  const logger = options.logger;
456
477
  async function processAssignment(assignment) {
457
478
  try {
458
- const result = await options.runAssignment({ assignment });
459
- const submitRequest = options.createSubmitRequest ? options.createSubmitRequest({ assignment, result }) : defaultSubmitRequest({ assignment, result });
479
+ const execution = normalizeExecutionOutput(await options.runAssignment({ assignment }));
480
+ const submitRequest = options.createSubmitRequest ? options.createSubmitRequest({
481
+ assignment,
482
+ result: execution.result,
483
+ ...execution.actions ? { actions: execution.actions } : {}
484
+ }) : defaultSubmitRequest({
485
+ assignment,
486
+ result: execution.result,
487
+ ...execution.actions ? { actions: execution.actions } : {}
488
+ });
460
489
  await client.submitResult(submitRequest);
461
490
  logger?.info?.("[agent-sdk] assignment_submitted", {
462
491
  assignmentId: assignment.assignment_id,
463
- status: submitRequest.status
492
+ status: submitRequest.status,
493
+ actionCount: submitRequest.actions?.length ?? 0
464
494
  });
465
495
  } catch (error) {
466
496
  const submitErrorRequest = options.createSubmitErrorRequest ? options.createSubmitErrorRequest({ assignment, error }) : defaultSubmitErrorRequest({ assignment, error });
@@ -490,6 +520,77 @@ function createAutoSubmitAssignmentHandler(options) {
490
520
  };
491
521
  }
492
522
 
523
+ // src/integrations.ts
524
+ function normalizeRecipients(recipients, label) {
525
+ if (!Array.isArray(recipients) || recipients.length === 0) {
526
+ throw new Error(`${label} must include at least one recipient`);
527
+ }
528
+ return recipients.map((recipient, index) => {
529
+ if (!recipient || typeof recipient.email !== "string" || recipient.email.trim().length === 0) {
530
+ throw new Error(`${label}[${index}] is missing email`);
531
+ }
532
+ return {
533
+ email: recipient.email.trim(),
534
+ ...typeof recipient.name === "string" && recipient.name.trim().length > 0 ? { name: recipient.name.trim() } : {}
535
+ };
536
+ });
537
+ }
538
+ function createIntegrationAction(input) {
539
+ if (typeof input.type !== "string" || input.type.trim().length === 0) {
540
+ throw new Error("type is required");
541
+ }
542
+ if (typeof input.operation !== "string" || input.operation.trim().length === 0) {
543
+ throw new Error("operation is required");
544
+ }
545
+ if (!input.input || typeof input.input !== "object" || Array.isArray(input.input)) {
546
+ throw new Error("input must be an object");
547
+ }
548
+ return {
549
+ type: input.type.trim(),
550
+ ...typeof input.actionKey === "string" && input.actionKey.trim().length > 0 ? { actionKey: input.actionKey.trim() } : {},
551
+ operation: input.operation.trim(),
552
+ input,
553
+ ...input.metadata ? { metadata: input.metadata } : {}
554
+ };
555
+ }
556
+ function createEmailDeliveryInput(input) {
557
+ if (typeof input.subject !== "string" || input.subject.trim().length === 0) {
558
+ throw new Error("Email subject is required");
559
+ }
560
+ if (typeof input.textBody !== "string" || input.textBody.trim().length === 0) {
561
+ throw new Error("Email textBody is required");
562
+ }
563
+ return {
564
+ to: normalizeRecipients(input.to, "to"),
565
+ ...input.cc && input.cc.length > 0 ? { cc: normalizeRecipients(input.cc, "cc") } : {},
566
+ ...input.bcc && input.bcc.length > 0 ? { bcc: normalizeRecipients(input.bcc, "bcc") } : {},
567
+ subject: input.subject.trim(),
568
+ textBody: input.textBody.trim(),
569
+ ...typeof input.htmlBody === "string" && input.htmlBody.trim().length > 0 ? { htmlBody: input.htmlBody } : {}
570
+ };
571
+ }
572
+ function createEmailDeliveryAction(input) {
573
+ const emailInput = createEmailDeliveryInput(input);
574
+ return {
575
+ ...createIntegrationAction({
576
+ ...input.actionKey ? { actionKey: input.actionKey } : {},
577
+ type: "email",
578
+ operation: input.mode,
579
+ input: emailInput,
580
+ ...input.metadata ? { metadata: input.metadata } : {}
581
+ }),
582
+ type: "email",
583
+ operation: input.mode,
584
+ input: emailInput
585
+ };
586
+ }
587
+ function isIntegrationAction(action) {
588
+ return typeof action.type === "string" && typeof action.operation === "string";
589
+ }
590
+ function isEmailDeliveryAction(action) {
591
+ return action.type === "email" && (action.operation === "draft" || action.operation === "send");
592
+ }
593
+
493
594
  // src/results.ts
494
595
  var DEFAULT_CONTACT_FIELDS = ["email", "phone", "profile_url", "linkedin_url"];
495
596
  function hasValue(value) {
@@ -545,15 +646,19 @@ function createTableResult(rows, options = {}) {
545
646
  computeWebhookSignature,
546
647
  createAssignmentSlugRouter,
547
648
  createAutoSubmitAssignmentHandler,
649
+ createEmailDeliveryAction,
548
650
  createExpressWebhookHandler,
549
651
  createFastifyWebhookHandler,
550
652
  createHonoWebhookHandler,
653
+ createIntegrationAction,
551
654
  createNextWebhookHandler,
552
655
  createTablePayload,
553
656
  createTableResult,
554
657
  createWebhookHandler,
555
658
  executeWebhook,
556
659
  getContractVersion,
660
+ isEmailDeliveryAction,
661
+ isIntegrationAction,
557
662
  parseAssignmentV1,
558
663
  toAssignmentEnvelopeV1,
559
664
  verifyWebhookSignature
@@ -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/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 AssignmentSlugRouterOptions,\n type AutoSubmitAssignmentHandlerOptions,\n} from \"./runtime\";\nexport { getContractVersion, parseAssignmentV1, toAssignmentEnvelopeV1 } from \"./contracts\";\nexport {\n createTablePayload,\n createTableResult,\n type CreateTableResultOptions,\n type TablePayload,\n type TableRow,\n} from \"./results\";\nexport type {\n ApiErrorBody,\n Assignment,\n AssignmentAckRequest,\n AssignmentAckStatus,\n AssignmentEnvelopeV1,\n AssignmentOutcome,\n AssignmentResult,\n AssignmentResultOutput,\n AssignmentResultSchema,\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 });\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 { Assignment, AssignmentResult, SubmitErrorRequest, SubmitResultRequest } 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<Record<string, unknown>>;\n acceptAssignment?: (params: { assignment: Assignment }) => Promise<AssignmentResult> | AssignmentResult;\n createSubmitRequest?: (params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n }) => SubmitResultRequest;\n createSubmitErrorRequest?: (params: { assignment: Assignment; error: unknown }) => SubmitErrorRequest;\n executionMode?: \"background\" | \"blocking\";\n logger?: RuntimeLogger;\n};\n\nexport type AssignmentExecutionHandler = (params: { assignment: Assignment }) => Promise<Record<string, unknown>>;\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}): SubmitResultRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n status: \"verifying\",\n result: params.result,\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\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 result = await options.runAssignment({ assignment });\n const submitRequest = options.createSubmitRequest\n ? options.createSubmitRequest({ assignment, result })\n : defaultSubmitRequest({ assignment, result });\n await client.submitResult(submitRequest);\n logger?.info?.(\"[agent-sdk] assignment_submitted\", {\n assignmentId: assignment.assignment_id,\n status: submitRequest.status,\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 { 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 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":[]}
package/dist/index.d.cts CHANGED
@@ -35,6 +35,32 @@ type AssignmentResult = {
35
35
  result?: Record<string, unknown>;
36
36
  error?: string;
37
37
  };
38
+ type EmailRecipient = {
39
+ email: string;
40
+ name?: string;
41
+ };
42
+ type EmailOutreachMode = "draft" | "send";
43
+ type EmailDeliveryInput = {
44
+ to: EmailRecipient[];
45
+ cc?: EmailRecipient[];
46
+ bcc?: EmailRecipient[];
47
+ subject: string;
48
+ textBody: string;
49
+ htmlBody?: string;
50
+ };
51
+ type IntegrationAction = {
52
+ type: string;
53
+ actionKey?: string;
54
+ operation: string;
55
+ input: Record<string, unknown>;
56
+ metadata?: Record<string, unknown>;
57
+ };
58
+ type EmailDeliveryAction = IntegrationAction & {
59
+ type: "email";
60
+ operation: EmailOutreachMode;
61
+ input: EmailDeliveryInput;
62
+ };
63
+ type AssignmentAction = IntegrationAction;
38
64
  type AssignmentAckStatus = "accepted" | "rejected";
39
65
  type AssignmentAckRequest = {
40
66
  status: AssignmentAckStatus;
@@ -50,6 +76,7 @@ type SubmitResultRequest = {
50
76
  status: AssignmentStatus;
51
77
  result?: Record<string, unknown>;
52
78
  error?: string;
79
+ actions?: AssignmentAction[];
53
80
  };
54
81
  type SubmitErrorRequest = {
55
82
  assignmentId: string;
@@ -158,13 +185,14 @@ type AutoSubmitAssignmentHandlerOptions = {
158
185
  client: AgentClient | ClientOptions;
159
186
  runAssignment: (params: {
160
187
  assignment: Assignment;
161
- }) => Promise<Record<string, unknown>>;
188
+ }) => Promise<AssignmentExecutionOutput>;
162
189
  acceptAssignment?: (params: {
163
190
  assignment: Assignment;
164
191
  }) => Promise<AssignmentResult> | AssignmentResult;
165
192
  createSubmitRequest?: (params: {
166
193
  assignment: Assignment;
167
194
  result: Record<string, unknown>;
195
+ actions?: AssignmentAction[];
168
196
  }) => SubmitResultRequest;
169
197
  createSubmitErrorRequest?: (params: {
170
198
  assignment: Assignment;
@@ -173,9 +201,14 @@ type AutoSubmitAssignmentHandlerOptions = {
173
201
  executionMode?: "background" | "blocking";
174
202
  logger?: RuntimeLogger;
175
203
  };
204
+ type AssignmentExecutionResult = {
205
+ result: Record<string, unknown>;
206
+ actions?: AssignmentAction[];
207
+ };
208
+ type AssignmentExecutionOutput = Record<string, unknown> | AssignmentExecutionResult;
176
209
  type AssignmentExecutionHandler = (params: {
177
210
  assignment: Assignment;
178
- }) => Promise<Record<string, unknown>>;
211
+ }) => Promise<AssignmentExecutionOutput>;
179
212
  type AssignmentSlugRouterOptions = {
180
213
  handlers: Record<string, AssignmentExecutionHandler>;
181
214
  fallback?: AssignmentExecutionHandler;
@@ -190,6 +223,29 @@ declare function parseAssignmentV1(body: string): Assignment;
190
223
  declare function toAssignmentEnvelopeV1(assignment: Assignment): AssignmentEnvelopeV1;
191
224
  declare function getContractVersion(): SdkContractVersion;
192
225
 
226
+ type CreateIntegrationActionInput = {
227
+ actionKey?: string;
228
+ type: string;
229
+ operation: string;
230
+ input: Record<string, unknown>;
231
+ metadata?: Record<string, unknown>;
232
+ };
233
+ type CreateEmailDeliveryActionInput = {
234
+ actionKey?: string;
235
+ mode: "draft" | "send";
236
+ to: EmailRecipient[];
237
+ cc?: EmailRecipient[];
238
+ bcc?: EmailRecipient[];
239
+ subject: string;
240
+ textBody: string;
241
+ htmlBody?: string;
242
+ metadata?: Record<string, unknown>;
243
+ };
244
+ declare function createIntegrationAction(input: CreateIntegrationActionInput): IntegrationAction;
245
+ declare function createEmailDeliveryAction(input: CreateEmailDeliveryActionInput): EmailDeliveryAction;
246
+ declare function isIntegrationAction(action: AssignmentAction): action is IntegrationAction;
247
+ declare function isEmailDeliveryAction(action: AssignmentAction): action is EmailDeliveryAction;
248
+
193
249
  type TableRow = Record<string, unknown>;
194
250
  type TablePayload = {
195
251
  table: {
@@ -210,4 +266,4 @@ type CreateTableResultOptions = {
210
266
  declare function createTablePayload(rows: TableRow[], options?: CreateTableResultOptions): TablePayload;
211
267
  declare function createTableResult(rows: TableRow[], options?: CreateTableResultOptions): Pick<AssignmentResult, "result">;
212
268
 
213
- export { AgentClient, ApiError, type ApiErrorBody, type Assignment, type AssignmentAckRequest, type AssignmentAckStatus, type AssignmentEnvelopeV1, type AssignmentExecutionHandler, type AssignmentOutcome, type AssignmentResult, type AssignmentResultOutput, type AssignmentResultSchema, type AssignmentSlugRouterOptions, type AssignmentStatus, type AutoSubmitAssignmentHandlerOptions, type ClientOptions, type CreateTableResultOptions, DEFAULT_SIGNATURE_HEADER, DEFAULT_TIMESTAMP_HEADER, type OutcomePayload, type SdkContractVersion, SdkError, type SubmitErrorRequest, type SubmitResultRequest, type TablePayload, type TableRow, type WebhookHandlerOptions, type WebhookHttpResponse, type WebhookInput, computeWebhookSignature, createAssignmentSlugRouter, createAutoSubmitAssignmentHandler, createExpressWebhookHandler, createFastifyWebhookHandler, createHonoWebhookHandler, createNextWebhookHandler, createTablePayload, createTableResult, createWebhookHandler, executeWebhook, getContractVersion, parseAssignmentV1, toAssignmentEnvelopeV1, verifyWebhookSignature };
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 };
package/dist/index.d.ts CHANGED
@@ -35,6 +35,32 @@ type AssignmentResult = {
35
35
  result?: Record<string, unknown>;
36
36
  error?: string;
37
37
  };
38
+ type EmailRecipient = {
39
+ email: string;
40
+ name?: string;
41
+ };
42
+ type EmailOutreachMode = "draft" | "send";
43
+ type EmailDeliveryInput = {
44
+ to: EmailRecipient[];
45
+ cc?: EmailRecipient[];
46
+ bcc?: EmailRecipient[];
47
+ subject: string;
48
+ textBody: string;
49
+ htmlBody?: string;
50
+ };
51
+ type IntegrationAction = {
52
+ type: string;
53
+ actionKey?: string;
54
+ operation: string;
55
+ input: Record<string, unknown>;
56
+ metadata?: Record<string, unknown>;
57
+ };
58
+ type EmailDeliveryAction = IntegrationAction & {
59
+ type: "email";
60
+ operation: EmailOutreachMode;
61
+ input: EmailDeliveryInput;
62
+ };
63
+ type AssignmentAction = IntegrationAction;
38
64
  type AssignmentAckStatus = "accepted" | "rejected";
39
65
  type AssignmentAckRequest = {
40
66
  status: AssignmentAckStatus;
@@ -50,6 +76,7 @@ type SubmitResultRequest = {
50
76
  status: AssignmentStatus;
51
77
  result?: Record<string, unknown>;
52
78
  error?: string;
79
+ actions?: AssignmentAction[];
53
80
  };
54
81
  type SubmitErrorRequest = {
55
82
  assignmentId: string;
@@ -158,13 +185,14 @@ type AutoSubmitAssignmentHandlerOptions = {
158
185
  client: AgentClient | ClientOptions;
159
186
  runAssignment: (params: {
160
187
  assignment: Assignment;
161
- }) => Promise<Record<string, unknown>>;
188
+ }) => Promise<AssignmentExecutionOutput>;
162
189
  acceptAssignment?: (params: {
163
190
  assignment: Assignment;
164
191
  }) => Promise<AssignmentResult> | AssignmentResult;
165
192
  createSubmitRequest?: (params: {
166
193
  assignment: Assignment;
167
194
  result: Record<string, unknown>;
195
+ actions?: AssignmentAction[];
168
196
  }) => SubmitResultRequest;
169
197
  createSubmitErrorRequest?: (params: {
170
198
  assignment: Assignment;
@@ -173,9 +201,14 @@ type AutoSubmitAssignmentHandlerOptions = {
173
201
  executionMode?: "background" | "blocking";
174
202
  logger?: RuntimeLogger;
175
203
  };
204
+ type AssignmentExecutionResult = {
205
+ result: Record<string, unknown>;
206
+ actions?: AssignmentAction[];
207
+ };
208
+ type AssignmentExecutionOutput = Record<string, unknown> | AssignmentExecutionResult;
176
209
  type AssignmentExecutionHandler = (params: {
177
210
  assignment: Assignment;
178
- }) => Promise<Record<string, unknown>>;
211
+ }) => Promise<AssignmentExecutionOutput>;
179
212
  type AssignmentSlugRouterOptions = {
180
213
  handlers: Record<string, AssignmentExecutionHandler>;
181
214
  fallback?: AssignmentExecutionHandler;
@@ -190,6 +223,29 @@ declare function parseAssignmentV1(body: string): Assignment;
190
223
  declare function toAssignmentEnvelopeV1(assignment: Assignment): AssignmentEnvelopeV1;
191
224
  declare function getContractVersion(): SdkContractVersion;
192
225
 
226
+ type CreateIntegrationActionInput = {
227
+ actionKey?: string;
228
+ type: string;
229
+ operation: string;
230
+ input: Record<string, unknown>;
231
+ metadata?: Record<string, unknown>;
232
+ };
233
+ type CreateEmailDeliveryActionInput = {
234
+ actionKey?: string;
235
+ mode: "draft" | "send";
236
+ to: EmailRecipient[];
237
+ cc?: EmailRecipient[];
238
+ bcc?: EmailRecipient[];
239
+ subject: string;
240
+ textBody: string;
241
+ htmlBody?: string;
242
+ metadata?: Record<string, unknown>;
243
+ };
244
+ declare function createIntegrationAction(input: CreateIntegrationActionInput): IntegrationAction;
245
+ declare function createEmailDeliveryAction(input: CreateEmailDeliveryActionInput): EmailDeliveryAction;
246
+ declare function isIntegrationAction(action: AssignmentAction): action is IntegrationAction;
247
+ declare function isEmailDeliveryAction(action: AssignmentAction): action is EmailDeliveryAction;
248
+
193
249
  type TableRow = Record<string, unknown>;
194
250
  type TablePayload = {
195
251
  table: {
@@ -210,4 +266,4 @@ type CreateTableResultOptions = {
210
266
  declare function createTablePayload(rows: TableRow[], options?: CreateTableResultOptions): TablePayload;
211
267
  declare function createTableResult(rows: TableRow[], options?: CreateTableResultOptions): Pick<AssignmentResult, "result">;
212
268
 
213
- export { AgentClient, ApiError, type ApiErrorBody, type Assignment, type AssignmentAckRequest, type AssignmentAckStatus, type AssignmentEnvelopeV1, type AssignmentExecutionHandler, type AssignmentOutcome, type AssignmentResult, type AssignmentResultOutput, type AssignmentResultSchema, type AssignmentSlugRouterOptions, type AssignmentStatus, type AutoSubmitAssignmentHandlerOptions, type ClientOptions, type CreateTableResultOptions, DEFAULT_SIGNATURE_HEADER, DEFAULT_TIMESTAMP_HEADER, type OutcomePayload, type SdkContractVersion, SdkError, type SubmitErrorRequest, type SubmitResultRequest, type TablePayload, type TableRow, type WebhookHandlerOptions, type WebhookHttpResponse, type WebhookInput, computeWebhookSignature, createAssignmentSlugRouter, createAutoSubmitAssignmentHandler, createExpressWebhookHandler, createFastifyWebhookHandler, createHonoWebhookHandler, createNextWebhookHandler, createTablePayload, createTableResult, createWebhookHandler, executeWebhook, getContractVersion, parseAssignmentV1, toAssignmentEnvelopeV1, verifyWebhookSignature };
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 };
package/dist/index.js CHANGED
@@ -44,7 +44,8 @@ var AgentClient = class {
44
44
  };
45
45
  await this.post(`/agent/assignments/submit`, {
46
46
  assignment_id: input.assignmentId,
47
- ...payload
47
+ ...payload,
48
+ ...input.actions ? { actions: input.actions } : {}
48
49
  });
49
50
  }
50
51
  async submitError(input) {
@@ -377,7 +378,8 @@ function defaultSubmitRequest(params) {
377
378
  return {
378
379
  assignmentId: params.assignment.assignment_id,
379
380
  status: "verifying",
380
- result: params.result
381
+ result: params.result,
382
+ ...params.actions && params.actions.length > 0 ? { actions: params.actions } : {}
381
383
  };
382
384
  }
383
385
  function defaultSubmitErrorRequest(params) {
@@ -389,6 +391,21 @@ function defaultSubmitErrorRequest(params) {
389
391
  function asClient(client) {
390
392
  return client instanceof AgentClient ? client : new AgentClient(client);
391
393
  }
394
+ function normalizeExecutionOutput(output) {
395
+ if (output && typeof output === "object" && !Array.isArray(output) && "result" in output && output.result && typeof output.result === "object" && !Array.isArray(output.result)) {
396
+ const actions = "actions" in output && Array.isArray(output.actions) ? output.actions : void 0;
397
+ return {
398
+ result: output.result,
399
+ ...actions && actions.length > 0 ? { actions } : {}
400
+ };
401
+ }
402
+ if (!output || typeof output !== "object" || Array.isArray(output)) {
403
+ throw new SdkError("Assignment execution must return an object result");
404
+ }
405
+ return {
406
+ result: output
407
+ };
408
+ }
392
409
  function createAssignmentSlugRouter(options) {
393
410
  const normalize = options.normalizeSlug ?? ((slug) => slug);
394
411
  const normalizedHandlers = /* @__PURE__ */ new Map();
@@ -410,12 +427,21 @@ function createAutoSubmitAssignmentHandler(options) {
410
427
  const logger = options.logger;
411
428
  async function processAssignment(assignment) {
412
429
  try {
413
- const result = await options.runAssignment({ assignment });
414
- const submitRequest = options.createSubmitRequest ? options.createSubmitRequest({ assignment, result }) : defaultSubmitRequest({ assignment, result });
430
+ const execution = normalizeExecutionOutput(await options.runAssignment({ assignment }));
431
+ const submitRequest = options.createSubmitRequest ? options.createSubmitRequest({
432
+ assignment,
433
+ result: execution.result,
434
+ ...execution.actions ? { actions: execution.actions } : {}
435
+ }) : defaultSubmitRequest({
436
+ assignment,
437
+ result: execution.result,
438
+ ...execution.actions ? { actions: execution.actions } : {}
439
+ });
415
440
  await client.submitResult(submitRequest);
416
441
  logger?.info?.("[agent-sdk] assignment_submitted", {
417
442
  assignmentId: assignment.assignment_id,
418
- status: submitRequest.status
443
+ status: submitRequest.status,
444
+ actionCount: submitRequest.actions?.length ?? 0
419
445
  });
420
446
  } catch (error) {
421
447
  const submitErrorRequest = options.createSubmitErrorRequest ? options.createSubmitErrorRequest({ assignment, error }) : defaultSubmitErrorRequest({ assignment, error });
@@ -445,6 +471,77 @@ function createAutoSubmitAssignmentHandler(options) {
445
471
  };
446
472
  }
447
473
 
474
+ // src/integrations.ts
475
+ function normalizeRecipients(recipients, label) {
476
+ if (!Array.isArray(recipients) || recipients.length === 0) {
477
+ throw new Error(`${label} must include at least one recipient`);
478
+ }
479
+ return recipients.map((recipient, index) => {
480
+ if (!recipient || typeof recipient.email !== "string" || recipient.email.trim().length === 0) {
481
+ throw new Error(`${label}[${index}] is missing email`);
482
+ }
483
+ return {
484
+ email: recipient.email.trim(),
485
+ ...typeof recipient.name === "string" && recipient.name.trim().length > 0 ? { name: recipient.name.trim() } : {}
486
+ };
487
+ });
488
+ }
489
+ function createIntegrationAction(input) {
490
+ if (typeof input.type !== "string" || input.type.trim().length === 0) {
491
+ throw new Error("type is required");
492
+ }
493
+ if (typeof input.operation !== "string" || input.operation.trim().length === 0) {
494
+ throw new Error("operation is required");
495
+ }
496
+ if (!input.input || typeof input.input !== "object" || Array.isArray(input.input)) {
497
+ throw new Error("input must be an object");
498
+ }
499
+ return {
500
+ type: input.type.trim(),
501
+ ...typeof input.actionKey === "string" && input.actionKey.trim().length > 0 ? { actionKey: input.actionKey.trim() } : {},
502
+ operation: input.operation.trim(),
503
+ input,
504
+ ...input.metadata ? { metadata: input.metadata } : {}
505
+ };
506
+ }
507
+ function createEmailDeliveryInput(input) {
508
+ if (typeof input.subject !== "string" || input.subject.trim().length === 0) {
509
+ throw new Error("Email subject is required");
510
+ }
511
+ if (typeof input.textBody !== "string" || input.textBody.trim().length === 0) {
512
+ throw new Error("Email textBody is required");
513
+ }
514
+ return {
515
+ to: normalizeRecipients(input.to, "to"),
516
+ ...input.cc && input.cc.length > 0 ? { cc: normalizeRecipients(input.cc, "cc") } : {},
517
+ ...input.bcc && input.bcc.length > 0 ? { bcc: normalizeRecipients(input.bcc, "bcc") } : {},
518
+ subject: input.subject.trim(),
519
+ textBody: input.textBody.trim(),
520
+ ...typeof input.htmlBody === "string" && input.htmlBody.trim().length > 0 ? { htmlBody: input.htmlBody } : {}
521
+ };
522
+ }
523
+ function createEmailDeliveryAction(input) {
524
+ const emailInput = createEmailDeliveryInput(input);
525
+ return {
526
+ ...createIntegrationAction({
527
+ ...input.actionKey ? { actionKey: input.actionKey } : {},
528
+ type: "email",
529
+ operation: input.mode,
530
+ input: emailInput,
531
+ ...input.metadata ? { metadata: input.metadata } : {}
532
+ }),
533
+ type: "email",
534
+ operation: input.mode,
535
+ input: emailInput
536
+ };
537
+ }
538
+ function isIntegrationAction(action) {
539
+ return typeof action.type === "string" && typeof action.operation === "string";
540
+ }
541
+ function isEmailDeliveryAction(action) {
542
+ return action.type === "email" && (action.operation === "draft" || action.operation === "send");
543
+ }
544
+
448
545
  // src/results.ts
449
546
  var DEFAULT_CONTACT_FIELDS = ["email", "phone", "profile_url", "linkedin_url"];
450
547
  function hasValue(value) {
@@ -499,15 +596,19 @@ export {
499
596
  computeWebhookSignature,
500
597
  createAssignmentSlugRouter,
501
598
  createAutoSubmitAssignmentHandler,
599
+ createEmailDeliveryAction,
502
600
  createExpressWebhookHandler,
503
601
  createFastifyWebhookHandler,
504
602
  createHonoWebhookHandler,
603
+ createIntegrationAction,
505
604
  createNextWebhookHandler,
506
605
  createTablePayload,
507
606
  createTableResult,
508
607
  createWebhookHandler,
509
608
  executeWebhook,
510
609
  getContractVersion,
610
+ isEmailDeliveryAction,
611
+ isIntegrationAction,
511
612
  parseAssignmentV1,
512
613
  toAssignmentEnvelopeV1,
513
614
  verifyWebhookSignature
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/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 });\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 { Assignment, AssignmentResult, SubmitErrorRequest, SubmitResultRequest } 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<Record<string, unknown>>;\n acceptAssignment?: (params: { assignment: Assignment }) => Promise<AssignmentResult> | AssignmentResult;\n createSubmitRequest?: (params: {\n assignment: Assignment;\n result: Record<string, unknown>;\n }) => SubmitResultRequest;\n createSubmitErrorRequest?: (params: { assignment: Assignment; error: unknown }) => SubmitErrorRequest;\n executionMode?: \"background\" | \"blocking\";\n logger?: RuntimeLogger;\n};\n\nexport type AssignmentExecutionHandler = (params: { assignment: Assignment }) => Promise<Record<string, unknown>>;\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}): SubmitResultRequest {\n return {\n assignmentId: params.assignment.assignment_id,\n status: \"verifying\",\n result: params.result,\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\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 result = await options.runAssignment({ assignment });\n const submitRequest = options.createSubmitRequest\n ? options.createSubmitRequest({ assignment, result })\n : defaultSubmitRequest({ assignment, result });\n await client.submitResult(submitRequest);\n logger?.info?.(\"[agent-sdk] assignment_submitted\", {\n assignmentId: assignment.assignment_id,\n status: submitRequest.status,\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 { 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 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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bounty-ai/agent-sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Bounty agent SDK for receiving assignments and submitting results",
5
5
  "main": "./dist/index.cjs",
6
6
  "scripts": {