deepline 0.3.87 → 0.3.88

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.
Files changed (65) hide show
  1. package/dist/bundling-sources/sdk/src/client.ts +2 -2
  2. package/dist/bundling-sources/sdk/src/monitor-fleet-contract.ts +1 -1
  3. package/dist/bundling-sources/sdk/src/plays/bundle-play-file.ts +1 -1
  4. package/dist/bundling-sources/sdk/src/release.ts +1 -1
  5. package/dist/bundling-sources/shared_libs/monitors/org-monitor-limits.ts +1 -1
  6. package/dist/bundling-sources/shared_libs/play-runtime/runtime-env.ts +0 -6
  7. package/dist/bundling-sources/shared_libs/play-runtime/tool-http-errors.ts +1 -1
  8. package/dist/bundling-sources/shared_libs/play-runtime/tool-result.ts +1 -1
  9. package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +0 -302
  10. package/dist/bundling-sources/shared_libs/plays/email-status.ts +1 -1
  11. package/dist/bundling-sources/shared_libs/plays/tool-category-descriptions.ts +2 -2
  12. package/dist/bundling-sources/shared_libs/runtime-env.ts +0 -6
  13. package/dist/cli/index.js +4 -6
  14. package/dist/cli/index.mjs +4 -6
  15. package/dist/index.d.mts +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.js +3 -3
  18. package/dist/index.mjs +3 -3
  19. package/dist/install-integrity.json +2 -45
  20. package/package.json +1 -3
  21. package/dist/bundling-sources/shared_libs/integration-contracts/AGENTS.md +0 -9
  22. package/dist/bundling-sources/shared_libs/integration-contracts/README.md +0 -3
  23. package/dist/bundling-sources/shared_libs/integration-contracts/index.ts +0 -2
  24. package/dist/bundling-sources/shared_libs/monitors/analytics-install-guides.ts +0 -77
  25. package/dist/bundling-sources/shared_libs/monitors/billing/charges.ts +0 -125
  26. package/dist/bundling-sources/shared_libs/monitors/billing/policy-builders.ts +0 -686
  27. package/dist/bundling-sources/shared_libs/monitors/billing/pricing.ts +0 -54
  28. package/dist/bundling-sources/shared_libs/monitors/billing/public-pricing.ts +0 -72
  29. package/dist/bundling-sources/shared_libs/monitors/billing/session.ts +0 -45
  30. package/dist/bundling-sources/shared_libs/monitors/billing/state.ts +0 -454
  31. package/dist/bundling-sources/shared_libs/monitors/billing/tamradar.ts +0 -260
  32. package/dist/bundling-sources/shared_libs/monitors/billing/types.ts +0 -215
  33. package/dist/bundling-sources/shared_libs/monitors/callback-security.ts +0 -333
  34. package/dist/bundling-sources/shared_libs/monitors/cursor-page.ts +0 -42
  35. package/dist/bundling-sources/shared_libs/monitors/framework-managed-payload-fields.ts +0 -71
  36. package/dist/bundling-sources/shared_libs/monitors/generated/provider-monitor-callback-admission-targets.ts +0 -16
  37. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +0 -267
  38. package/dist/bundling-sources/shared_libs/monitors/inbound-publish-key.ts +0 -39
  39. package/dist/bundling-sources/shared_libs/monitors/inbound-queue.ts +0 -82
  40. package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +0 -473
  41. package/dist/bundling-sources/shared_libs/monitors/package.json +0 -29
  42. package/dist/bundling-sources/shared_libs/monitors/provider-callback-verification.ts +0 -1125
  43. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-capability.ts +0 -964
  44. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-consumer-health.ts +0 -56
  45. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-errors.ts +0 -131
  46. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-identity-claims.ts +0 -527
  47. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-legacy-aliases.ts +0 -16
  48. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-priority-execution.ts +0 -56
  49. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-public-aliases.ts +0 -28
  50. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-runtime-read-eligibility.ts +0 -38
  51. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-status.ts +0 -10
  52. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-upstream-identity.ts +0 -112
  53. package/dist/bundling-sources/shared_libs/monitors/provider-webhook-monitor-runtime.ts +0 -300
  54. package/dist/bundling-sources/shared_libs/monitors/quickstart-prompts.ts +0 -22
  55. package/dist/bundling-sources/shared_libs/monitors/snitcher-install-validation.ts +0 -93
  56. package/dist/bundling-sources/shared_libs/monitors/snitcher-ip2company.ts +0 -332
  57. package/dist/bundling-sources/shared_libs/monitors/snitcher-radar.ts +0 -221
  58. package/dist/bundling-sources/shared_libs/monitors/starter-templates.ts +0 -105
  59. package/dist/bundling-sources/shared_libs/monitors/tracking-provider-guidance.ts +0 -73
  60. package/dist/bundling-sources/shared_libs/monitors/tracking-provider-integrations.ts +0 -81
  61. package/dist/bundling-sources/shared_libs/monitors/tsconfig.json +0 -10
  62. package/dist/bundling-sources/shared_libs/security/header-safe-env.ts +0 -28
  63. package/dist/bundling-sources/shared_libs/security/secret-redaction.ts +0 -267
  64. /package/dist/bundling-sources/shared_libs/{integration-contracts/bettercontact/execution-policy.ts → integrations/bettercontact-execution-policy.ts} +0 -0
  65. /package/dist/bundling-sources/shared_libs/{integration-contracts/theirstack/execution-policy.ts → integrations/theirstack-execution-policy.ts} +0 -0
@@ -1,267 +0,0 @@
1
- import { NextResponse } from 'next/server';
2
-
3
- import { MAX_PRIORITY_MONITORS_PER_ORG } from '@deepline/monitors/provider-monitor-priority-execution';
4
-
5
- export const MONITOR_ERROR_FALLBACK_NEXT_ACTION =
6
- "Do not retry blindly. Read the deepline-monitors skill's 'Recover from errors by code' section, inspect the returned message and relevant state, then diagnose this failure.";
7
-
8
- type MonitorErrorPayload = Record<string, unknown>;
9
-
10
- function asRecord(value: unknown): Record<string, unknown> | null {
11
- return value && typeof value === 'object' && !Array.isArray(value)
12
- ? (value as Record<string, unknown>)
13
- : null;
14
- }
15
-
16
- function errorCode(payload: MonitorErrorPayload): string {
17
- const nested = asRecord(payload.error);
18
- const value = nested?.code ?? payload.code;
19
- return typeof value === 'string' ? value : '';
20
- }
21
-
22
- function nestedError(
23
- payload: MonitorErrorPayload,
24
- ): Record<string, unknown> | null {
25
- return asRecord(payload.error);
26
- }
27
-
28
- function upstreamRetryAfterSeconds(
29
- error: Record<string, unknown>,
30
- ): number | null {
31
- const declared = error.retryAfterSeconds;
32
- if (
33
- typeof declared === 'number' &&
34
- Number.isFinite(declared) &&
35
- declared >= 0
36
- ) {
37
- return Math.ceil(declared);
38
- }
39
-
40
- const headers = asRecord(error.headers);
41
- const retryAfter = headers?.['retry-after'];
42
- if (typeof retryAfter !== 'string' || !retryAfter.trim()) return null;
43
- const numeric = Number(retryAfter);
44
- if (Number.isFinite(numeric) && numeric >= 0) return Math.ceil(numeric);
45
-
46
- const retryAt = Date.parse(retryAfter);
47
- if (!Number.isFinite(retryAt)) return null;
48
- return Math.max(0, Math.ceil((retryAt - Date.now()) / 1_000));
49
- }
50
-
51
- /**
52
- * Classify only the monitor-lifecycle upstream failures that are safe to
53
- * explain generically. This deliberately duck-types the integration error:
54
- * monitor route tests and provider adapters can cross module boundaries, but
55
- * the stable discriminant is part of the shared integration error contract.
56
- *
57
- * Do not relay the upstream message or body. They can contain provider account
58
- * identifiers, request details, or provider-only diagnostics. The status and
59
- * normalized Retry-After are enough for a customer to make a safe next move.
60
- */
61
- export function monitorUpstreamFailureResponse(
62
- error: unknown,
63
- ): NextResponse | null {
64
- const upstream = asRecord(error);
65
- if (
66
- upstream?.isIntegrationUpstreamHttpError !== true ||
67
- typeof upstream.status !== 'number'
68
- ) {
69
- return null;
70
- }
71
-
72
- const retryAfterSeconds = upstreamRetryAfterSeconds(upstream);
73
- const retryHeaders =
74
- retryAfterSeconds === null
75
- ? undefined
76
- : { 'retry-after': String(retryAfterSeconds) };
77
-
78
- if (upstream.status === 429) {
79
- return monitorErrorResponse(
80
- {
81
- error: {
82
- code: 'monitor_upstream_rate_limited',
83
- message:
84
- 'The monitor provider is rate limiting lifecycle requests. Deepline could not confirm completion of this lifecycle change.',
85
- upstream_status: upstream.status,
86
- ...(retryAfterSeconds === null
87
- ? {}
88
- : { retry_after_seconds: retryAfterSeconds }),
89
- },
90
- },
91
- { status: 429, headers: retryHeaders },
92
- );
93
- }
94
-
95
- if (upstream.status >= 500 && upstream.status <= 599) {
96
- return monitorErrorResponse(
97
- {
98
- error: {
99
- code: 'monitor_upstream_unavailable',
100
- message:
101
- 'The monitor provider is temporarily unavailable. Deepline could not confirm completion of this lifecycle change.',
102
- upstream_status: upstream.status,
103
- ...(retryAfterSeconds === null
104
- ? {}
105
- : { retry_after_seconds: retryAfterSeconds }),
106
- },
107
- },
108
- { status: 503, headers: retryHeaders },
109
- );
110
- }
111
-
112
- return null;
113
- }
114
-
115
- /**
116
- * Server-owned recovery guidance for every agent-facing monitor error.
117
- * Known codes get an exact next step. Unknown failures deliberately point at
118
- * the monitor skill and prohibit blind retries instead of inventing a fix.
119
- */
120
- export function monitorErrorNextAction(payload: MonitorErrorPayload): string {
121
- const code = errorCode(payload);
122
- const retryAfterMs = payload.retry_after_ms;
123
- const retryAfterSeconds =
124
- nestedError(payload)?.retry_after_seconds ?? payload.retry_after_seconds;
125
-
126
- if (code === 'monitor_access_required') {
127
- return 'Stop monitor work and contact the Deepline team to request access; then rerun `deepline monitors status --json`.';
128
- }
129
- if (code === 'monitor_tool_not_found' || code === 'unknown_monitor_tool') {
130
- return 'Run `deepline monitors available --json`, choose a returned tool id, then retry with that exact id.';
131
- }
132
- if (code === 'deployed_monitor_not_found' || code === 'monitor_not_found') {
133
- return 'Run `deepline monitors list --status all --json`, choose a returned public monitor key, then retry with that key.';
134
- }
135
- if (code === 'ingestion_plane_not_ready') {
136
- return typeof retryAfterMs === 'number'
137
- ? `Wait ${retryAfterMs} ms, then retry the same read or check once.`
138
- : 'Wait for Customer DB provisioning, then retry the same read or check once.';
139
- }
140
- if (code === 'provider_monitor_identity_backfill_in_progress') {
141
- return typeof retryAfterSeconds === 'number'
142
- ? `Wait ${retryAfterSeconds} seconds, then retry the same monitor lifecycle request once. No upstream monitor was created.`
143
- : 'Wait briefly, then retry the same monitor lifecycle request once. No upstream monitor was created.';
144
- }
145
- if (code === 'provider_monitor_capacity_backfill_in_progress') {
146
- return typeof retryAfterSeconds === 'number'
147
- ? `Wait ${retryAfterSeconds} seconds, then retry the same monitor create once. No upstream monitor was created.`
148
- : 'Wait briefly, then retry the same monitor create once. No upstream monitor was created.';
149
- }
150
- if (code === 'ORG_MONITOR_LIMIT_EXCEEDED') {
151
- return 'Run `deepline monitors list --status all --json`; stop watching an account you no longer need, or contact Deepline for a higher account limit.';
152
- }
153
- if (code === 'MONITOR_ENTITY_LIMIT_EXCEEDED') {
154
- return 'This account already carries the maximum number of monitors. Delete one of its monitors, or watch the signal on a different account.';
155
- }
156
- if (code === 'MONITOR_CAPACITY_CLEANUP_REQUIRED') {
157
- return 'Inspect the monitor and complete upstream cleanup before recreating this public key. Do not retry create blindly.';
158
- }
159
- if (code === 'MONITOR_MANAGED_BY_FLEET') {
160
- return 'Change the owning Monitor Fleet or deactivate it before mutating this member directly.';
161
- }
162
- if (code === 'provider_monitor_operation_in_progress') {
163
- return 'Rerun the same deploy or update that started this change. Do not send a different change until it finishes.';
164
- }
165
- if (code === 'provider_monitor_delete_in_progress') {
166
- return 'Rerun the same delete now. Do not deploy, update, or reactivate this monitor until that delete finishes.';
167
- }
168
- if (
169
- code === 'invalid_limit' ||
170
- code === 'invalid_monitor_status' ||
171
- code === 'unknown_monitor_tool_filter' ||
172
- code === 'unknown_deployed_monitor_filter'
173
- ) {
174
- return 'Correct the request using the returned expected, received, or suggestion fields, then retry once.';
175
- }
176
- if (code === 'monitor_deploy_validation_failed') {
177
- return 'Fix every returned issue using its path and suggestion. Rerun `deepline monitors check` for definitions or the relevant dry-run for delete/reactivate; do not mutate until validation passes.';
178
- }
179
- if (code === 'monitor_tool_unavailable') {
180
- return 'Run `deepline monitors available --json`; choose a tool returned for this workspace, or stop and request access to the unavailable capability.';
181
- }
182
- if (code === 'monitor_entitlement_limit_exceeded') {
183
- return 'Run `deepline monitors list --status all --json`; reuse or disable an existing monitor, or ask the user to change entitlement before retrying.';
184
- }
185
- if (code === 'priority_monitor_limit_exceeded') {
186
- return `This workspace already has ${MAX_PRIORITY_MONITORS_PER_ORG} priority radars. Delete or update an existing priority radar only after confirming it is no longer needed, then retry the urgent preview.`;
187
- }
188
- if (code === 'monitor_already_exists') {
189
- const existing = asRecord(nestedError(payload)?.existing_monitor)?.key;
190
- return typeof existing === 'string'
191
- ? `Run \`deepline monitors get ${existing} --json\` to inspect the monitor that owns this identity. Reuse it or contact Deepline support before replacing it; do not delete and redeploy blindly.`
192
- : 'Inspect the returned existing_monitor.key with `deepline monitors get <key> --json`. Reuse that monitor or contact Deepline support before replacing it; do not delete and redeploy blindly.';
193
- }
194
- if (code === 'upstream_monitor_conflict_unresolved') {
195
- const existing = asRecord(nestedError(payload)?.existing_monitor)?.key;
196
- return typeof existing === 'string'
197
- ? `Run \`deepline monitors get ${existing} --json\` to inspect the matching managed monitor, then report this upstream 409 to Deepline support. Do not retry blindly.`
198
- : 'Report this upstream 409 to Deepline support with the returned tool and identity. Do not retry blindly.';
199
- }
200
- if (code === 'monitor_upstream_rate_limited') {
201
- return typeof retryAfterSeconds === 'number'
202
- ? `Wait ${retryAfterSeconds} seconds, then run \`deepline monitors get <key> --json\` to inspect the stored state. Do not retry or create another monitor unless that state confirms the prior lifecycle action was not applied; if it is missing or unclear, contact Deepline support with the returned upstream_status.`
203
- : 'Wait briefly, then run `deepline monitors get <key> --json` to inspect the stored state. Do not retry or create another monitor unless that state confirms the prior lifecycle action was not applied; if it is missing or unclear, contact Deepline support with the returned upstream_status.';
204
- }
205
- if (code === 'monitor_upstream_unavailable') {
206
- return typeof retryAfterSeconds === 'number'
207
- ? `Wait ${retryAfterSeconds} seconds, then run \`deepline monitors get <key> --json\` to inspect the stored state. Do not retry or create another monitor unless that state confirms the prior lifecycle action was not applied; if it is missing or unclear, contact Deepline support with the returned upstream_status.`
208
- : 'Wait briefly, then run `deepline monitors get <key> --json` to inspect the stored state. Do not retry or create another monitor unless that state confirms the prior lifecycle action was not applied; if it is missing or unclear, contact Deepline support with the returned upstream_status.';
209
- }
210
- if (
211
- code === 'monitor_entitlement_required' ||
212
- code === 'monitor_billing_policy_blocked'
213
- ) {
214
- return 'Stop and report the required monitor entitlement or unresolved pricing policy; do not retry until the Deepline team resolves it.';
215
- }
216
- if (code === 'monitor_billing_denied') {
217
- return 'Report the returned required credits, balance, and shortfall, then stop; retry only after the user adds credits or changes the plan.';
218
- }
219
- if (code === 'BILLING_UNAVAILABLE') {
220
- return 'Wait briefly and retry the same read or check once; do not repeat a mutation until its monitor state is verified.';
221
- }
222
- if (
223
- code === 'monitor_billing_settlement_failed' ||
224
- code.includes('cleanup_required') ||
225
- code.includes('cleanup_failed')
226
- ) {
227
- return 'Run `deepline monitors get <key> --json`, report the disabled or repair-required state, and do not repeat the mutation blindly.';
228
- }
229
- if (code === 'no_active_org') {
230
- return 'Select an active organization, verify it with `deepline auth status --json`, then retry.';
231
- }
232
-
233
- return MONITOR_ERROR_FALLBACK_NEXT_ACTION;
234
- }
235
-
236
- export function monitorErrorResponse(
237
- payload: MonitorErrorPayload,
238
- init: { status: number; headers?: HeadersInit },
239
- ): NextResponse {
240
- return NextResponse.json(
241
- {
242
- ...payload,
243
- next_action:
244
- typeof payload.next_action === 'string'
245
- ? payload.next_action
246
- : monitorErrorNextAction(payload),
247
- },
248
- init,
249
- );
250
- }
251
-
252
- /** Add monitor-specific recovery guidance to auth errors created upstream. */
253
- export async function withMonitorErrorNextAction(
254
- response: NextResponse,
255
- ): Promise<NextResponse> {
256
- if (response.status < 400) return response;
257
- const payload = (await response
258
- .clone()
259
- .json()
260
- .catch(() => null)) as unknown;
261
- const record = asRecord(payload);
262
- if (!record) return response;
263
-
264
- const headers = new Headers(response.headers);
265
- headers.delete('content-length');
266
- return monitorErrorResponse(record, { status: response.status, headers });
267
- }
@@ -1,39 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import {
3
- parseProviderCallbackPayload,
4
- providerCallbackWireEventId,
5
- } from '@deepline/monitors/provider-callback-verification';
6
-
7
- // The Neon-free publish idempotency key the thin receiver forwards to the queue
8
- // producer's send(..., { idempotencyKey }). Pure function of what is on the wire:
9
- // (provider, orgId, token) scope + the stable provider event id derived from
10
- // headers+payload. A provider re-POST of the SAME event yields the SAME key
11
- // (deduped at publish); two DISTINCT events yield DIFFERENT keys; a token/org
12
- // swap can never collide. When the provider gives no id, providerCallbackWireEventId
13
- // falls back to a deterministic sha256 of the payload, so the key stays stable
14
- // and content-addressed (never random).
15
- //
16
- // Lives in its own module (not /monitors/inbound-queue) so the thin receiver
17
- // can import the REAL helper even when tests fake the queue producer seam.
18
- export function signalRadarInboundPublishIdempotencyKey(input: {
19
- provider: string;
20
- orgId: string;
21
- token: string;
22
- headers: Headers;
23
- rawBody: string;
24
- }): string {
25
- const payload = parseProviderCallbackPayload({
26
- contentType: input.headers.get('content-type'),
27
- rawBody: input.rawBody,
28
- });
29
-
30
- const eventId = providerCallbackWireEventId({
31
- provider: input.provider,
32
- headers: input.headers,
33
- payload,
34
- });
35
-
36
- return `sr_inbound_${createHash('sha256')
37
- .update(JSON.stringify([input.provider, input.orgId, input.token, eventId]))
38
- .digest('hex')}`;
39
- }
@@ -1,82 +0,0 @@
1
- import { signalRadarInboundPublishIdempotencyKey } from '@deepline/monitors/inbound-publish-key';
2
- import {
3
- classifyInboundFailure,
4
- recordSignalRadarDeadLetter as recordSignalRadarDeadLetterCore,
5
- type InboundFailureClass,
6
- type InboundPgClient,
7
- } from '@/lib/signal-radars/inbound-dead-letter';
8
- import {
9
- send as sendSignalRadarInbound,
10
- SIGNAL_RADAR_INBOUND_TOPIC as SIGNAL_RADAR_INBOUND_TOPIC_VALUE,
11
- type SignalRadarInboundSendOptions,
12
- } from '@/lib/signal-radars/inbound-queue';
13
- import type { SignalRadarInboundMessage } from '@/lib/signal-radars/inbound-message';
14
-
15
- // Public inbound-queue surface used by the thin provider-callback receiver.
16
- // Re-exports the topic + producer and adds the Neon-free publish key helper and
17
- // the retry classifier the receiver/worker share.
18
- export const SIGNAL_RADAR_INBOUND_TOPIC = SIGNAL_RADAR_INBOUND_TOPIC_VALUE;
19
-
20
- function headersToObject(headers: Headers): Record<string, string> {
21
- const result: Record<string, string> = {};
22
- headers.forEach((value, key) => {
23
- result[key.toLowerCase()] = value;
24
- });
25
- return result;
26
- }
27
-
28
- // Re-export the Neon-free publish key helper so the pure-helper test resolves it
29
- // here. The receiver imports it directly from /monitors/inbound-publish-key
30
- // so it gets the real helper even when this module's producer seam is faked.
31
- export { signalRadarInboundPublishIdempotencyKey };
32
-
33
- // Producer wrapper the receiver calls: `send(message, { idempotencyKey })`.
34
- export async function sendSignalRadarInboundMessage(
35
- message: SignalRadarInboundMessage,
36
- options?: SignalRadarInboundSendOptions,
37
- ) {
38
- return sendSignalRadarInbound(message, options);
39
- }
40
-
41
- // Transient (retry) vs permanent (dead-letter) classifier, shared with the
42
- // worker's retry callback. See classifyInboundFailure for the semantics.
43
- export function classifySignalRadarInboundError(
44
- error: unknown,
45
- ): InboundFailureClass {
46
- return classifyInboundFailure(error);
47
- }
48
-
49
- // Positional-client dead-letter writer used by the worker's retry path. Adapts
50
- // the ergonomic call shape to the shared idempotent writer.
51
- export async function recordSignalRadarDeadLetter(
52
- client: InboundPgClient,
53
- input: {
54
- provider: string;
55
- orgId?: string | null;
56
- radarKey?: string | null;
57
- eventIdempotencyKey?: string | null;
58
- payload: Record<string, unknown>;
59
- headers?: Record<string, string>;
60
- attempts: number;
61
- lastError?: string | null;
62
- },
63
- ): Promise<void> {
64
- await recordSignalRadarDeadLetterCore({
65
- client,
66
- message: {
67
- provider: input.provider,
68
- orgId: input.orgId ?? '',
69
- token: '',
70
- radarKey: input.radarKey ?? null,
71
- eventIdempotencyKey: input.eventIdempotencyKey ?? null,
72
- headers: input.headers ?? {},
73
- receivedAt: new Date().toISOString(),
74
- rawBody: JSON.stringify(input.payload ?? {}),
75
- },
76
- error: new Error(input.lastError ?? 'monitor inbound poison message'),
77
- attempts: input.attempts,
78
- });
79
- }
80
-
81
- export type { SignalRadarInboundMessage } from '@/lib/signal-radars/inbound-message';
82
- export { headersToObject };