@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 +110 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +59 -3
- package/dist/index.d.ts +59 -3
- package/dist/index.js +106 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
459
|
-
const submitRequest = options.createSubmitRequest ? options.createSubmitRequest({
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAKT;AACD,UAAM,OAAO,OAAO;AACpB,SAAK,OAAO;AACZ,SAAK,SAAS,OAAO;AACrB,SAAK,OAAO,OAAO;AACnB,SAAK,OAAO,OAAO;AACnB,SAAK,YAAY,OAAO,WAAW,OAAO,OAAO,UAAU;AAAA,EAC7D;AACF;;;ACbO,IAAM,cAAN,MAAkB;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAwB;AAClC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,cAAsB,SAA8C;AACtF,UAAM,KAAK,KAAK,0BAA0B;AAAA,MACxC,eAAe;AAAA,MACf,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAA2C;AAC5D,UAAM,UAA4B;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,MAC/C,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,IAC9C;AAEA,UAAM,KAAK,KAAK,6BAA6B;AAAA,MAC3C,eAAe,MAAM;AAAA,MACrB,GAAG;AAAA,MACH,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,OAA0C;AAC1D,UAAM,KAAK,aAAa;AAAA,MACtB,cAAc,MAAM;AAAA,MACpB,QAAQ;AAAA,MACR,OAAO,MAAM;AAAA,MACb,GAAI,MAAM,UAAU,EAAE,QAAQ,EAAE,SAAS,MAAM,QAAQ,EAAE,IAAI,CAAC;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,KAAK,MAAc,MAA8C;AAC7E,UAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM,KAAK,WAAW,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,UAAuC;AAC9D,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,QAAI,SAA8B;AAElC,QAAI,KAAK;AACP,UAAI;AACF,iBAAS,KAAK,MAAM,GAAG;AAAA,MACzB,QAAQ;AACN,iBAAS,EAAE,SAAS,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,IAAI,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,SACE,QAAQ,WAAW,uBAAuB,SAAS,MAAM,MAAM,OAAO,SAAS,UAAU;AAAA,MAC3F,MAAM,QAAQ;AAAA,MACd,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC3FA,yBAA4C;AAGrC,SAAS,wBAAwB,QAIrC;AACD,QAAM,gBAAgB,GAAG,OAAO,SAAS,IAAI,OAAO,IAAI;AACxD,QAAM,aAAS,+BAAW,UAAU,OAAO,aAAa,EACrD,OAAO,eAAe,MAAM,EAC5B,OAAO,KAAK;AACf,SAAO,UAAU,MAAM;AACzB;AAEO,SAAS,uBAAuB,QAKpC;AACD,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,WAAW;AAC1C,UAAM,IAAI,SAAS,wCAAwC;AAAA,EAC7D;AAEA,QAAM,WAAW,wBAAwB;AAAA,IACvC,eAAe,OAAO;AAAA,IACtB,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,EACf,CAAC;AAED,QAAM,iBAAiB,OAAO,KAAK,UAAU,MAAM;AACnD,QAAM,eAAe,OAAO,KAAK,OAAO,WAAW,MAAM;AAEzD,MAAI,eAAe,WAAW,aAAa,QAAQ;AACjD,UAAM,IAAI,SAAS,2BAA2B;AAAA,EAChD;AAEA,MAAI,KAAC,oCAAgB,gBAAgB,YAAY,GAAG;AAClD,UAAM,IAAI,SAAS,2BAA2B;AAAA,EAChD;AACF;;;ACtCA,IAAM,mBAAuC;AAE7C,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU;AACrC;AAEA,SAAS,sBAAsB,QAA6C;AAC1E,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,CAAC,SAAS,OAAO,OAAO,GAAG;AAC7B,UAAM,IAAI,SAAS,iBAAiB;AAAA,EACtC;AACA,MAAI,CAAC,SAAS,OAAO,aAAa,GAAG;AACnC,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AAEA,QAAM,UAAU,OAAO;AACvB,MAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,CAAC,SAAS,QAAQ,OAAO,GAAG;AAC9B,UAAM,IAAI,SAAS,yBAAyB;AAAA,EAC9C;AAEA,QAAM,qBAAqB,OAAO;AAElC,SAAO;AAAA,IACL,eAAe,OAAO;AAAA,IACtB,eAAe,OAAO;AAAA,IACtB,eAAe;AAAA,IACf,SAAS;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,GAAI,OAAO,QAAQ,+BAA+B,WAC9C,EAAE,4BAA4B,QAAQ,2BAA2B,IACjE,CAAC;AAAA,MACL,GAAI,OAAO,QAAQ,gCAAgC,WAC/C,EAAE,6BAA6B,QAAQ,4BAA4B,IACnE,CAAC;AAAA,MACL,GAAI,OAAO,QAAQ,aAAa,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MAC7E,GAAI,OAAO,QAAQ,gBAAgB,WAAW,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IACxF;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,MAA0B;AAC1D,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,IAAI;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,SAAS,sBAAsB;AAAA,EAC3C;AAEA,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,SAAS,4BAA4B;AAAA,EACjD;AAEA,MAAI,QAAQ,YAAY,kBAAkB;AACxC,UAAM,IAAI,SAAS,yCAAyC;AAAA,EAC9D;AACA,MAAI,CAAC,SAAS,QAAQ,UAAU,GAAG;AACjC,UAAM,IAAI,SAAS,qCAAqC;AAAA,EAC1D;AAEA,SAAO,sBAAsB,QAAQ,UAAU;AACjD;AAEO,SAAS,uBAAuB,YAA8C;AACnF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,qBAAyC;AACvD,SAAO;AACT;;;AC9EO,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AAajC,SAAS,qBAAqB,SAAgC;AACnE,QAAM,eAAe,QAAQ,mBAAmB;AAEhD,SAAO,eAAe,cAAc,OAAgD;AAClF,QAAI,cAAc;AAChB,6BAAuB;AAAA,QACrB,eAAe,QAAQ;AAAA,QACvB,MAAM,MAAM;AAAA,QACZ,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,QACxD,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,kBAAkB,MAAM,IAAI;AAC/C,WAAO,QAAQ,aAAa,EAAE,WAAW,CAAC;AAAA,EAC5C;AACF;AAEA,eAAsB,eACpB,SACA,OAC8B;AAC9B,MAAI;AACF,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAM,WAAW,iBAAiB,WAAW,QAAQ,IAAI,SAAS,OAAO;AACzE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;AChDA,SAAS,YAAY,SAAwD,KAAa;AACxF,QAAM,QAAQ,QAAQ,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC;AACvD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAuB;AAC5C,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,eAAe,OAAO,SAAS,IAAI,GAAG;AAC1D,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACA,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAU,IAAI;AAC5B;AAEA,eAAe,gBAAgB,KAI5B;AACD,MAAI,OAAO,IAAI,YAAY,YAAY,OAAO,SAAS,IAAI,OAAO,GAAG;AACnE,WAAO,cAAc,IAAI,OAAO;AAAA,EAClC;AAEA,MAAI,IAAI,SAAS,QAAW;AAC1B,QAAI,OAAO,IAAI,SAAS,YAAY,IAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,IAAI,IAAI,GAAG;AACnF,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,cAAc,IAAI,IAAI;AAAA,EAC/B;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACpD,UAAM,SAAuB,CAAC;AAC9B,QAAI,KAAK,QAAQ,CAAC,UAAmB;AACnC,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,KAAK,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,MACxC,WAAW,iBAAiB,YAAY;AACtC,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,OAAO,MAAM;AACpB,cAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,IAChD,CAAC;AACD,QAAI,KAAK,SAAS,CAAC,UAAmB;AACpC,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAe,QAIrB;AACD,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC1D,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC5D;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,SAAgC;AAC1E,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,eACpB,KAKA,KAGA;AACA,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,GAAG;AACtC,eAAS,MAAM;AAAA,QACb;AAAA,QACA,eAAe;AAAA,UACb;AAAA,UACA,WAAW,YAAY,IAAI,SAAS,wBAAwB;AAAA,UAC5D,WAAW,YAAY,IAAI,SAAS,wBAAwB;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,eAAS,aAAa,KAAK;AAAA,IAC7B;AAEA,QAAI,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEO,SAAS,4BAA4B,SAAgC;AAC1E,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,eACpB,SAKA,OAGA;AACA,UAAM,OAAO,QAAQ,WAAW,cAAc,QAAQ,IAAI;AAC1D,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,YAAY,QAAQ,SAAS,wBAAwB;AAAA,QAChE,WAAW,YAAY,QAAQ,SAAS,wBAAwB;AAAA,MAClE,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEO,SAAS,yBAAyB,SAAgC;AACvE,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,YAAY,SAAqC;AACrE,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,QAAQ,QAAQ,IAAI,wBAAwB,KAAK;AAAA,QAC5D,WAAW,QAAQ,QAAQ,IAAI,wBAAwB,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,SAAS,KAAK,UAAU,OAAO,IAAI,GAAG;AAAA,MAC/C,QAAQ,OAAO;AAAA,MACf,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,yBAAyB,SAAgC;AACvE,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,YAAY,GAM/B;AACD,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,EAAE,IAAI,OAAO,wBAAwB;AAAA,QAChD,WAAW,EAAE,IAAI,OAAO,wBAAwB;AAAA,MAClD,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,EAC1C;AACF;;;ACtJA,SAAS,UAAU,OAAgB;AACjC,MAAI,iBAAiB,SAAS,MAAM,QAAQ,KAAK,EAAE,SAAS,GAAG;AAC7D,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,YAA0C;AACzE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,eAAe,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAIN;AACtB,SAAO;AAAA,IACL,cAAc,OAAO,WAAW;AAAA,IAChC,QAAQ;AAAA,IACR,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,IAAI,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,EACnF;AACF;AAEA,SAAS,0BAA0B,QAAwE;AACzG,SAAO;AAAA,IACL,cAAc,OAAO,WAAW;AAAA,IAChC,OAAO,UAAU,OAAO,KAAK;AAAA,EAC/B;AACF;AAEA,SAAS,SAAS,QAAqC;AACrD,SAAO,kBAAkB,cAAc,SAAS,IAAI,YAAY,MAAM;AACxE;AAEA,SAAS,yBAAyB,QAA8D;AAC9F,MACE,UACA,OAAO,WAAW,YAClB,CAAC,MAAM,QAAQ,MAAM,KACrB,YAAY,UACZ,OAAO,UACP,OAAO,OAAO,WAAW,YACzB,CAAC,MAAM,QAAQ,OAAO,MAAM,GAC5B;AACA,UAAM,UACJ,aAAa,UAAU,MAAM,QAAQ,OAAO,OAAO,IAC9C,OAAO,UACR;AACN,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,SAAS,mDAAmD;AAAA,EACxE;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,2BAA2B,SAAkE;AAC3G,QAAM,YAAY,QAAQ,kBAAkB,CAAC,SAAiB;AAC9D,QAAM,qBAAqB,oBAAI,IAAwC;AAEvE,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AAC9D,uBAAmB,IAAI,UAAU,IAAI,GAAG,OAAO;AAAA,EACjD;AAEA,SAAO,OAAO,EAAE,WAAW,MAAM;AAC/B,UAAM,OAAO,UAAU,WAAW,aAAa;AAC/C,UAAM,UAAU,mBAAmB,IAAI,IAAI,KAAK,QAAQ;AACxD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,SAAS,uDAAuD,WAAW,aAAa,GAAG;AAAA,IACvG;AACA,WAAO,QAAQ,EAAE,WAAW,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,kCAAkC,SAA6C;AAC7F,QAAM,SAAS,SAAS,QAAQ,MAAM;AACtC,QAAM,OAAO,QAAQ,iBAAiB;AACtC,QAAM,SAAS,QAAQ;AAEvB,iBAAe,kBAAkB,YAAwB;AACvD,QAAI;AACF,YAAM,YAAY,yBAAyB,MAAM,QAAQ,cAAc,EAAE,WAAW,CAAC,CAAC;AACtF,YAAM,gBAAgB,QAAQ,sBAC1B,QAAQ,oBAAoB;AAAA,QAC1B;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC5D,CAAC,IACD,qBAAqB;AAAA,QACnB;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC5D,CAAC;AACL,YAAM,OAAO,aAAa,aAAa;AACvC,cAAQ,OAAO,oCAAoC;AAAA,QACjD,cAAc,WAAW;AAAA,QACzB,QAAQ,cAAc;AAAA,QACtB,aAAa,cAAc,SAAS,UAAU;AAAA,MAChD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,qBAAqB,QAAQ,2BAC/B,QAAQ,yBAAyB,EAAE,YAAY,MAAM,CAAC,IACtD,0BAA0B,EAAE,YAAY,MAAM,CAAC;AACnD,YAAM,OAAO,YAAY,kBAAkB;AAC3C,cAAQ,QAAQ,iCAAiC;AAAA,QAC/C,cAAc,WAAW;AAAA,QACzB,OAAO,mBAAmB;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,eAAe,aAAa,EAAE,WAAW,GAA0D;AACxG,UAAM,WAAW,QAAQ,mBACrB,MAAM,QAAQ,iBAAiB,EAAE,WAAW,CAAC,IAC7C,wBAAwB,UAAU;AAEtC,QAAI,SAAS,WAAW,YAAY;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,YAAY;AACvB,YAAM,kBAAkB,UAAU;AAAA,IACpC,OAAO;AACL,WAAK,kBAAkB,UAAU,EAAE,MAAM,CAAC,UAAU;AAClD,gBAAQ,QAAQ,6CAA6C;AAAA,UAC3D,cAAc,WAAW;AAAA,UACzB,OAAO,UAAU,KAAK;AAAA,QACxB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;;;ACrKA,SAAS,oBAAoB,YAA8B,OAAe;AACxE,MAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,UAAM,IAAI,MAAM,GAAG,KAAK,sCAAsC;AAAA,EAChE;AACA,SAAO,WAAW,IAAI,CAAC,WAAW,UAAU;AAC1C,QAAI,CAAC,aAAa,OAAO,UAAU,UAAU,YAAY,UAAU,MAAM,KAAK,EAAE,WAAW,GAAG;AAC5F,YAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,oBAAoB;AAAA,IACvD;AACA,WAAO;AAAA,MACL,OAAO,UAAU,MAAM,KAAK;AAAA,MAC5B,GAAI,OAAO,UAAU,SAAS,YAAY,UAAU,KAAK,KAAK,EAAE,SAAS,IACrE,EAAE,MAAM,UAAU,KAAK,KAAK,EAAE,IAC9B,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AACH;AAEO,SAAS,wBAAwB,OAAwD;AAC9F,MAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,EAAE,WAAW,GAAG;AACpE,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AACA,MAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,KAAK,EAAE,WAAW,GAAG;AAC9E,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,MAAI,CAAC,MAAM,SAAS,OAAO,MAAM,UAAU,YAAY,MAAM,QAAQ,MAAM,KAAK,GAAG;AACjF,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,KAAK,KAAK;AAAA,IACtB,GAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,KAAK,EAAE,SAAS,IACvE,EAAE,WAAW,MAAM,UAAU,KAAK,EAAE,IACpC,CAAC;AAAA,IACL,WAAW,MAAM,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,yBAAyB,OAA2D;AAC3F,MAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC1E,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,MAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,EAAE,WAAW,GAAG;AAC5E,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,IAAI,oBAAoB,MAAM,IAAI,IAAI;AAAA,IACtC,GAAI,MAAM,MAAM,MAAM,GAAG,SAAS,IAAI,EAAE,IAAI,oBAAoB,MAAM,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,IACrF,GAAI,MAAM,OAAO,MAAM,IAAI,SAAS,IAAI,EAAE,KAAK,oBAAoB,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,IAC1F,SAAS,MAAM,QAAQ,KAAK;AAAA,IAC5B,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,GAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,EAAE,SAAS,IACrE,EAAE,UAAU,MAAM,SAAS,IAC3B,CAAC;AAAA,EACP;AACF;AAEO,SAAS,0BACd,OACqB;AACrB,QAAM,aAAa,yBAAyB,KAAK;AACjD,SAAO;AAAA,IACL,GAAG,wBAAwB;AAAA,MACzB,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACxD,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,OAAO;AAAA,MACP,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACvD,CAAC;AAAA,IACD,MAAM;AAAA,IACN,WAAW,MAAM;AAAA,IACjB,OAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,QAAuD;AACzF,SAAO,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,cAAc;AACxE;AAEO,SAAS,sBAAsB,QAAyD;AAC7F,SAAO,OAAO,SAAS,YAAY,OAAO,cAAc,WAAW,OAAO,cAAc;AAC1F;;;ACzFA,IAAM,yBAAyB,CAAC,SAAS,SAAS,eAAe,cAAc;AAE/E,SAAS,SAAS,OAAgB;AAChC,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,KAAK,EAAE,SAAS;AAAA,EAC/B;AACA,SAAO,UAAU,QAAQ,UAAU;AACrC;AAEA,SAAS,cAAc,MAAkB;AACvC,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,MAAM;AACtB,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAAe,MAAgB;AACjD,QAAM,aAAa,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;AACpD,SAAO,KAAK,UAAU,UAAU;AAClC;AAEO,SAAS,mBACd,MACA,UAAoC,CAAC,GACvB;AACd,QAAM,UAAU,QAAQ,WAAW,cAAc,IAAI;AACrD,QAAM,aAAa,QAAQ,YAAY,QAAQ,SAAS,SAAS,IAAI,QAAQ,WAAW;AACxF,QAAM,gBACJ,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,IACpD,QAAQ,gBACR;AAEN,QAAM,cAAc,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,KAAK,UAAU,CAAC,CAAC,EAAE;AAC5E,QAAM,mBAAmB,KAAK,MAAM,CAAC,QAAQ,cAAc,KAAK,CAAC,UAAU,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;AAEhG,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,aAAa,gBAAgB,KAAK;AAAA,IAClC,oBAAoB;AAAA,IACpB,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,EACxD;AACF;AAEO,SAAS,kBACd,MACA,UAAoC,CAAC,GACH;AAClC,SAAO;AAAA,IACL,QAAQ,mBAAmB,MAAM,OAAO;AAAA,EAC1C;AACF;","names":[]}
|
package/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<
|
|
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<
|
|
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<
|
|
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<
|
|
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
|
|
414
|
-
const submitRequest = options.createSubmitRequest ? options.createSubmitRequest({
|
|
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":";AAEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,WAAN,cAAuB,SAAS;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAKT;AACD,UAAM,OAAO,OAAO;AACpB,SAAK,OAAO;AACZ,SAAK,SAAS,OAAO;AACrB,SAAK,OAAO,OAAO;AACnB,SAAK,OAAO,OAAO;AACnB,SAAK,YAAY,OAAO,WAAW,OAAO,OAAO,UAAU;AAAA,EAC7D;AACF;;;ACbO,IAAM,cAAN,MAAkB;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAwB;AAClC,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,cAAsB,SAA8C;AACtF,UAAM,KAAK,KAAK,0BAA0B;AAAA,MACxC,eAAe;AAAA,MACf,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAA2C;AAC5D,UAAM,UAA4B;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,MAC/C,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,IAC9C;AAEA,UAAM,KAAK,KAAK,6BAA6B;AAAA,MAC3C,eAAe,MAAM;AAAA,MACrB,GAAG;AAAA,MACH,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,OAA0C;AAC1D,UAAM,KAAK,aAAa;AAAA,MACtB,cAAc,MAAM;AAAA,MACpB,QAAQ;AAAA,MACR,OAAO,MAAM;AAAA,MACb,GAAI,MAAM,UAAU,EAAE,QAAQ,EAAE,SAAS,MAAM,QAAQ,EAAE,IAAI,CAAC;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,KAAK,MAAc,MAA8C;AAC7E,UAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,MAAM,KAAK,WAAW,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,UAAuC;AAC9D,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,QAAI,SAA8B;AAElC,QAAI,KAAK;AACP,UAAI;AACF,iBAAS,KAAK,MAAM,GAAG;AAAA,MACzB,QAAQ;AACN,iBAAS,EAAE,SAAS,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,IAAI,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,MACjB,SACE,QAAQ,WAAW,uBAAuB,SAAS,MAAM,MAAM,OAAO,SAAS,UAAU;AAAA,MAC3F,MAAM,QAAQ;AAAA,MACd,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC3FA,SAAS,YAAY,uBAAuB;AAGrC,SAAS,wBAAwB,QAIrC;AACD,QAAM,gBAAgB,GAAG,OAAO,SAAS,IAAI,OAAO,IAAI;AACxD,QAAM,SAAS,WAAW,UAAU,OAAO,aAAa,EACrD,OAAO,eAAe,MAAM,EAC5B,OAAO,KAAK;AACf,SAAO,UAAU,MAAM;AACzB;AAEO,SAAS,uBAAuB,QAKpC;AACD,MAAI,CAAC,OAAO,aAAa,CAAC,OAAO,WAAW;AAC1C,UAAM,IAAI,SAAS,wCAAwC;AAAA,EAC7D;AAEA,QAAM,WAAW,wBAAwB;AAAA,IACvC,eAAe,OAAO;AAAA,IACtB,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,EACf,CAAC;AAED,QAAM,iBAAiB,OAAO,KAAK,UAAU,MAAM;AACnD,QAAM,eAAe,OAAO,KAAK,OAAO,WAAW,MAAM;AAEzD,MAAI,eAAe,WAAW,aAAa,QAAQ;AACjD,UAAM,IAAI,SAAS,2BAA2B;AAAA,EAChD;AAEA,MAAI,CAAC,gBAAgB,gBAAgB,YAAY,GAAG;AAClD,UAAM,IAAI,SAAS,2BAA2B;AAAA,EAChD;AACF;;;ACtCA,IAAM,mBAAuC;AAE7C,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU;AACrC;AAEA,SAAS,sBAAsB,QAA6C;AAC1E,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,CAAC,SAAS,OAAO,OAAO,GAAG;AAC7B,UAAM,IAAI,SAAS,iBAAiB;AAAA,EACtC;AACA,MAAI,CAAC,SAAS,OAAO,aAAa,GAAG;AACnC,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AAEA,QAAM,UAAU,OAAO;AACvB,MAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,UAAM,IAAI,SAAS,uBAAuB;AAAA,EAC5C;AACA,MAAI,CAAC,SAAS,QAAQ,OAAO,GAAG;AAC9B,UAAM,IAAI,SAAS,yBAAyB;AAAA,EAC9C;AAEA,QAAM,qBAAqB,OAAO;AAElC,SAAO;AAAA,IACL,eAAe,OAAO;AAAA,IACtB,eAAe,OAAO;AAAA,IACtB,eAAe;AAAA,IACf,SAAS;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,GAAI,OAAO,QAAQ,+BAA+B,WAC9C,EAAE,4BAA4B,QAAQ,2BAA2B,IACjE,CAAC;AAAA,MACL,GAAI,OAAO,QAAQ,gCAAgC,WAC/C,EAAE,6BAA6B,QAAQ,4BAA4B,IACnE,CAAC;AAAA,MACL,GAAI,OAAO,QAAQ,aAAa,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MAC7E,GAAI,OAAO,QAAQ,gBAAgB,WAAW,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IACxF;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,MAA0B;AAC1D,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,IAAI;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,SAAS,sBAAsB;AAAA,EAC3C;AAEA,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,SAAS,4BAA4B;AAAA,EACjD;AAEA,MAAI,QAAQ,YAAY,kBAAkB;AACxC,UAAM,IAAI,SAAS,yCAAyC;AAAA,EAC9D;AACA,MAAI,CAAC,SAAS,QAAQ,UAAU,GAAG;AACjC,UAAM,IAAI,SAAS,qCAAqC;AAAA,EAC1D;AAEA,SAAO,sBAAsB,QAAQ,UAAU;AACjD;AAEO,SAAS,uBAAuB,YAA8C;AACnF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,qBAAyC;AACvD,SAAO;AACT;;;AC9EO,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AAajC,SAAS,qBAAqB,SAAgC;AACnE,QAAM,eAAe,QAAQ,mBAAmB;AAEhD,SAAO,eAAe,cAAc,OAAgD;AAClF,QAAI,cAAc;AAChB,6BAAuB;AAAA,QACrB,eAAe,QAAQ;AAAA,QACvB,MAAM,MAAM;AAAA,QACZ,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,QACxD,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,kBAAkB,MAAM,IAAI;AAC/C,WAAO,QAAQ,aAAa,EAAE,WAAW,CAAC;AAAA,EAC5C;AACF;AAEA,eAAsB,eACpB,SACA,OAC8B;AAC9B,MAAI;AACF,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAM,WAAW,iBAAiB,WAAW,QAAQ,IAAI,SAAS,OAAO;AACzE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;AChDA,SAAS,YAAY,SAAwD,KAAa;AACxF,QAAM,QAAQ,QAAQ,GAAG,KAAK,QAAQ,IAAI,YAAY,CAAC;AACvD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAuB;AAC5C,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,eAAe,OAAO,SAAS,IAAI,GAAG;AAC1D,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACA,MAAI,SAAS,UAAa,SAAS,MAAM;AACvC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAU,IAAI;AAC5B;AAEA,eAAe,gBAAgB,KAI5B;AACD,MAAI,OAAO,IAAI,YAAY,YAAY,OAAO,SAAS,IAAI,OAAO,GAAG;AACnE,WAAO,cAAc,IAAI,OAAO;AAAA,EAClC;AAEA,MAAI,IAAI,SAAS,QAAW;AAC1B,QAAI,OAAO,IAAI,SAAS,YAAY,IAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,IAAI,IAAI,GAAG;AACnF,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,cAAc,IAAI,IAAI;AAAA,EAC/B;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACpD,UAAM,SAAuB,CAAC;AAC9B,QAAI,KAAK,QAAQ,CAAC,UAAmB;AACnC,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,KAAK,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,MACxC,WAAW,iBAAiB,YAAY;AACtC,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,OAAO,MAAM;AACpB,cAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,IAChD,CAAC;AACD,QAAI,KAAK,SAAS,CAAC,UAAmB;AACpC,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAe,QAIrB;AACD,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,IAC1D,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;AAAA,EAC5D;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,SAAgC;AAC1E,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,eACpB,KAKA,KAGA;AACA,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,GAAG;AACtC,eAAS,MAAM;AAAA,QACb;AAAA,QACA,eAAe;AAAA,UACb;AAAA,UACA,WAAW,YAAY,IAAI,SAAS,wBAAwB;AAAA,UAC5D,WAAW,YAAY,IAAI,SAAS,wBAAwB;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,eAAS,aAAa,KAAK;AAAA,IAC7B;AAEA,QAAI,OAAO,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEO,SAAS,4BAA4B,SAAgC;AAC1E,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,eACpB,SAKA,OAGA;AACA,UAAM,OAAO,QAAQ,WAAW,cAAc,QAAQ,IAAI;AAC1D,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,YAAY,QAAQ,SAAS,wBAAwB;AAAA,QAChE,WAAW,YAAY,QAAQ,SAAS,wBAAwB;AAAA,MAClE,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,OAAO,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EAC5C;AACF;AAEO,SAAS,yBAAyB,SAAgC;AACvE,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,YAAY,SAAqC;AACrE,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,QAAQ,QAAQ,IAAI,wBAAwB,KAAK;AAAA,QAC5D,WAAW,QAAQ,QAAQ,IAAI,wBAAwB,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,SAAS,KAAK,UAAU,OAAO,IAAI,GAAG;AAAA,MAC/C,QAAQ,OAAO;AAAA,MACf,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,yBAAyB,SAAgC;AACvE,QAAM,UAAU,qBAAqB,OAAO;AAE5C,SAAO,eAAe,YAAY,GAM/B;AACD,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,eAAe;AAAA,QACb;AAAA,QACA,WAAW,EAAE,IAAI,OAAO,wBAAwB;AAAA,QAChD,WAAW,EAAE,IAAI,OAAO,wBAAwB;AAAA,MAClD,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,KAAK,OAAO,MAAM,OAAO,MAAM;AAAA,EAC1C;AACF;;;ACtJA,SAAS,UAAU,OAAgB;AACjC,MAAI,iBAAiB,SAAS,MAAM,QAAQ,KAAK,EAAE,SAAS,GAAG;AAC7D,WAAO,MAAM;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,YAA0C;AACzE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,eAAe,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAIN;AACtB,SAAO;AAAA,IACL,cAAc,OAAO,WAAW;AAAA,IAChC,QAAQ;AAAA,IACR,QAAQ,OAAO;AAAA,IACf,GAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,IAAI,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,EACnF;AACF;AAEA,SAAS,0BAA0B,QAAwE;AACzG,SAAO;AAAA,IACL,cAAc,OAAO,WAAW;AAAA,IAChC,OAAO,UAAU,OAAO,KAAK;AAAA,EAC/B;AACF;AAEA,SAAS,SAAS,QAAqC;AACrD,SAAO,kBAAkB,cAAc,SAAS,IAAI,YAAY,MAAM;AACxE;AAEA,SAAS,yBAAyB,QAA8D;AAC9F,MACE,UACA,OAAO,WAAW,YAClB,CAAC,MAAM,QAAQ,MAAM,KACrB,YAAY,UACZ,OAAO,UACP,OAAO,OAAO,WAAW,YACzB,CAAC,MAAM,QAAQ,OAAO,MAAM,GAC5B;AACA,UAAM,UACJ,aAAa,UAAU,MAAM,QAAQ,OAAO,OAAO,IAC9C,OAAO,UACR;AACN,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,SAAS,mDAAmD;AAAA,EACxE;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,2BAA2B,SAAkE;AAC3G,QAAM,YAAY,QAAQ,kBAAkB,CAAC,SAAiB;AAC9D,QAAM,qBAAqB,oBAAI,IAAwC;AAEvE,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AAC9D,uBAAmB,IAAI,UAAU,IAAI,GAAG,OAAO;AAAA,EACjD;AAEA,SAAO,OAAO,EAAE,WAAW,MAAM;AAC/B,UAAM,OAAO,UAAU,WAAW,aAAa;AAC/C,UAAM,UAAU,mBAAmB,IAAI,IAAI,KAAK,QAAQ;AACxD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,SAAS,uDAAuD,WAAW,aAAa,GAAG;AAAA,IACvG;AACA,WAAO,QAAQ,EAAE,WAAW,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,kCAAkC,SAA6C;AAC7F,QAAM,SAAS,SAAS,QAAQ,MAAM;AACtC,QAAM,OAAO,QAAQ,iBAAiB;AACtC,QAAM,SAAS,QAAQ;AAEvB,iBAAe,kBAAkB,YAAwB;AACvD,QAAI;AACF,YAAM,YAAY,yBAAyB,MAAM,QAAQ,cAAc,EAAE,WAAW,CAAC,CAAC;AACtF,YAAM,gBAAgB,QAAQ,sBAC1B,QAAQ,oBAAoB;AAAA,QAC1B;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC5D,CAAC,IACD,qBAAqB;AAAA,QACnB;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,GAAI,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC5D,CAAC;AACL,YAAM,OAAO,aAAa,aAAa;AACvC,cAAQ,OAAO,oCAAoC;AAAA,QACjD,cAAc,WAAW;AAAA,QACzB,QAAQ,cAAc;AAAA,QACtB,aAAa,cAAc,SAAS,UAAU;AAAA,MAChD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,qBAAqB,QAAQ,2BAC/B,QAAQ,yBAAyB,EAAE,YAAY,MAAM,CAAC,IACtD,0BAA0B,EAAE,YAAY,MAAM,CAAC;AACnD,YAAM,OAAO,YAAY,kBAAkB;AAC3C,cAAQ,QAAQ,iCAAiC;AAAA,QAC/C,cAAc,WAAW;AAAA,QACzB,OAAO,mBAAmB;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,eAAe,aAAa,EAAE,WAAW,GAA0D;AACxG,UAAM,WAAW,QAAQ,mBACrB,MAAM,QAAQ,iBAAiB,EAAE,WAAW,CAAC,IAC7C,wBAAwB,UAAU;AAEtC,QAAI,SAAS,WAAW,YAAY;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,YAAY;AACvB,YAAM,kBAAkB,UAAU;AAAA,IACpC,OAAO;AACL,WAAK,kBAAkB,UAAU,EAAE,MAAM,CAAC,UAAU;AAClD,gBAAQ,QAAQ,6CAA6C;AAAA,UAC3D,cAAc,WAAW;AAAA,UACzB,OAAO,UAAU,KAAK;AAAA,QACxB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;;;ACrKA,SAAS,oBAAoB,YAA8B,OAAe;AACxE,MAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,UAAM,IAAI,MAAM,GAAG,KAAK,sCAAsC;AAAA,EAChE;AACA,SAAO,WAAW,IAAI,CAAC,WAAW,UAAU;AAC1C,QAAI,CAAC,aAAa,OAAO,UAAU,UAAU,YAAY,UAAU,MAAM,KAAK,EAAE,WAAW,GAAG;AAC5F,YAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,oBAAoB;AAAA,IACvD;AACA,WAAO;AAAA,MACL,OAAO,UAAU,MAAM,KAAK;AAAA,MAC5B,GAAI,OAAO,UAAU,SAAS,YAAY,UAAU,KAAK,KAAK,EAAE,SAAS,IACrE,EAAE,MAAM,UAAU,KAAK,KAAK,EAAE,IAC9B,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AACH;AAEO,SAAS,wBAAwB,OAAwD;AAC9F,MAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,EAAE,WAAW,GAAG;AACpE,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AACA,MAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,KAAK,EAAE,WAAW,GAAG;AAC9E,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,MAAI,CAAC,MAAM,SAAS,OAAO,MAAM,UAAU,YAAY,MAAM,QAAQ,MAAM,KAAK,GAAG;AACjF,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,KAAK,KAAK;AAAA,IACtB,GAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,KAAK,EAAE,SAAS,IACvE,EAAE,WAAW,MAAM,UAAU,KAAK,EAAE,IACpC,CAAC;AAAA,IACL,WAAW,MAAM,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,yBAAyB,OAA2D;AAC3F,MAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC1E,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,MAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,EAAE,WAAW,GAAG;AAC5E,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,IAAI,oBAAoB,MAAM,IAAI,IAAI;AAAA,IACtC,GAAI,MAAM,MAAM,MAAM,GAAG,SAAS,IAAI,EAAE,IAAI,oBAAoB,MAAM,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,IACrF,GAAI,MAAM,OAAO,MAAM,IAAI,SAAS,IAAI,EAAE,KAAK,oBAAoB,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,IAC1F,SAAS,MAAM,QAAQ,KAAK;AAAA,IAC5B,UAAU,MAAM,SAAS,KAAK;AAAA,IAC9B,GAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,EAAE,SAAS,IACrE,EAAE,UAAU,MAAM,SAAS,IAC3B,CAAC;AAAA,EACP;AACF;AAEO,SAAS,0BACd,OACqB;AACrB,QAAM,aAAa,yBAAyB,KAAK;AACjD,SAAO;AAAA,IACL,GAAG,wBAAwB;AAAA,MACzB,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACxD,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,OAAO;AAAA,MACP,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACvD,CAAC;AAAA,IACD,MAAM;AAAA,IACN,WAAW,MAAM;AAAA,IACjB,OAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,QAAuD;AACzF,SAAO,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,cAAc;AACxE;AAEO,SAAS,sBAAsB,QAAyD;AAC7F,SAAO,OAAO,SAAS,YAAY,OAAO,cAAc,WAAW,OAAO,cAAc;AAC1F;;;ACzFA,IAAM,yBAAyB,CAAC,SAAS,SAAS,eAAe,cAAc;AAE/E,SAAS,SAAS,OAAgB;AAChC,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,KAAK,EAAE,SAAS;AAAA,EAC/B;AACA,SAAO,UAAU,QAAQ,UAAU;AACrC;AAEA,SAAS,cAAc,MAAkB;AACvC,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,MAAM;AACtB,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAAe,MAAgB;AACjD,QAAM,aAAa,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;AACpD,SAAO,KAAK,UAAU,UAAU;AAClC;AAEO,SAAS,mBACd,MACA,UAAoC,CAAC,GACvB;AACd,QAAM,UAAU,QAAQ,WAAW,cAAc,IAAI;AACrD,QAAM,aAAa,QAAQ,YAAY,QAAQ,SAAS,SAAS,IAAI,QAAQ,WAAW;AACxF,QAAM,gBACJ,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,IACpD,QAAQ,gBACR;AAEN,QAAM,cAAc,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,KAAK,UAAU,CAAC,CAAC,EAAE;AAC5E,QAAM,mBAAmB,KAAK,MAAM,CAAC,QAAQ,cAAc,KAAK,CAAC,UAAU,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;AAEhG,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,aAAa,gBAAgB,KAAK;AAAA,IAClC,oBAAoB;AAAA,IACpB,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,EACxD;AACF;AAEO,SAAS,kBACd,MACA,UAAoC,CAAC,GACH;AAClC,SAAO;AAAA,IACL,QAAQ,mBAAmB,MAAM,OAAO;AAAA,EAC1C;AACF;","names":[]}
|