@adcp/sdk 14.0.0-rc.37 → 14.0.0-rc.38

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 (35) hide show
  1. package/dist/lib/reporting/content-mismatch.d.mts +126 -0
  2. package/dist/lib/reporting/content-mismatch.d.ts +126 -0
  3. package/dist/lib/reporting/content-mismatch.js +90 -0
  4. package/dist/lib/reporting/content-mismatch.mjs +66 -0
  5. package/dist/lib/reporting/index.d.mts +3 -1
  6. package/dist/lib/reporting/index.d.ts +3 -1
  7. package/dist/lib/reporting/index.js +3 -0
  8. package/dist/lib/reporting/index.mjs +2 -0
  9. package/dist/lib/reporting/reconciliation.d.mts +362 -2
  10. package/dist/lib/reporting/reconciliation.d.ts +362 -2
  11. package/dist/lib/reporting/reconciliation.js +1051 -7
  12. package/dist/lib/reporting/reconciliation.mjs +1053 -7
  13. package/dist/lib/schemas/index.d.mts +22 -1
  14. package/dist/lib/schemas/index.d.ts +22 -1
  15. package/dist/lib/schemas/index.js +7 -0
  16. package/dist/lib/schemas/index.mjs +7 -0
  17. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  18. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  19. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  20. package/dist/lib/validation/schema-loader.d.mts +9 -1
  21. package/dist/lib/validation/schema-loader.d.ts +9 -1
  22. package/dist/lib/validation/schema-loader.js +65 -8
  23. package/dist/lib/validation/schema-loader.mjs +64 -8
  24. package/dist/lib/version.d.mts +3 -3
  25. package/dist/lib/version.d.ts +3 -3
  26. package/dist/lib/version.js +3 -3
  27. package/dist/lib/version.mjs +3 -3
  28. package/docs/TYPE-SUMMARY.md +1 -1
  29. package/docs/guides/EXISTING-PLATFORM.md +45 -1
  30. package/docs/guides/MEDIA-BUY-3.2-COMPATIBILITY.md +53 -0
  31. package/docs/guides/REPORTING-RECONCILIATION.md +50 -0
  32. package/docs/llms.txt +1 -1
  33. package/docs/migration-14.x-rc-worksheet.md +59 -4
  34. package/package.json +1 -1
  35. package/skills/build-seller-agent/SKILL.md +2 -0
@@ -1,4 +1,5 @@
1
- import type { GetReportingStatusRequest, GetReportingStatusResponse, ReportingCanonicalContentDigest, ReportingControlTotal, ReportingMaterialization, ReportingObligation, ReportingReceipt, ReportingRevision, SyncReportingReceiptsRequest, SyncReportingReceiptsResponse } from '../types/tools.generated.mjs';
1
+ import type { GetReportingStatusRequest, GetReportingStatusResponse, ReportingCanonicalContentDigest, ReportingControlTotal, ReportingMaterialization, ReportingObligation, ReportingReceipt, ReportingConsumerStatus, ReportingRevision, SyncReportingReceiptsRequest, SyncReportingReceiptsResponse } from '../types/tools.generated.mjs';
2
+ import { type ReportingMismatchCodeV1 } from './content-mismatch.mjs';
2
3
  import { type ReportingCredentialProvider, type ReportingManifestInspectorOptions, type ReportingResourceReader } from './inspection.mjs';
3
4
  type ManagedReportingObligation = ReportingObligation & {
4
5
  scope_resolved_at?: string;
@@ -43,6 +44,63 @@ export interface ReportingReconciliationClient {
43
44
  syncReportingReceipts(params: SyncReportingReceiptsRequest, options?: {
44
45
  signal?: AbortSignal;
45
46
  }): Promise<SyncReportingReceiptsResponse>;
47
+ /**
48
+ * rc.3 consumer-status loop. Optional so existing adopters keep working:
49
+ * when it is absent the reconciler still *plans* every status and reports it
50
+ * on the result, it just cannot post. Supply it only against a seller that
51
+ * advertises `consumer_status_task`.
52
+ */
53
+ syncReportingStatus?(params: {
54
+ account?: GetReportingStatusRequest['account'];
55
+ idempotency_key: string;
56
+ statuses: Array<Record<string, unknown>>;
57
+ }, options?: {
58
+ signal?: AbortSignal;
59
+ }): Promise<{
60
+ status?: string;
61
+ results?: unknown[];
62
+ }>;
63
+ /**
64
+ * Exact-revision read, the only way a buyer can *earn* a `received`
65
+ * statement.
66
+ *
67
+ * `observed_revision_content_sha256` is defined as the binding digest
68
+ * "independently recomputed from the exact consumed Core revision binding".
69
+ * Copying the seller's own `revision_content_sha256` out of the ledger would
70
+ * hand that digest back unverified and turn buyer-attributed arrival evidence
71
+ * into an echo. So the reconciler pages `reporting_rows` for the exact
72
+ * revision, concatenates them in cursor order, and recomputes
73
+ * SHA-256(JCS({reporting_revision_id,row_count,control_totals,reporting_rows}))
74
+ * itself.
75
+ *
76
+ * Optional: without it the reconciler still plans `received` and
77
+ * `content_mismatch`, but marks them `suppressed: 'consumption_unavailable'`
78
+ * and posts neither. Attesting consumption we did not perform is the one
79
+ * outcome worse than staying silent.
80
+ */
81
+ getMediaBuyDelivery?(params: {
82
+ account?: GetReportingStatusRequest['account'];
83
+ reporting_revision_id: string;
84
+ pagination?: {
85
+ cursor?: string;
86
+ };
87
+ }, options?: {
88
+ signal?: AbortSignal;
89
+ }): Promise<{
90
+ status?: string;
91
+ reporting_revision_binding?: {
92
+ reporting_revision_id?: string;
93
+ row_count?: number;
94
+ control_totals?: ReportingControlTotal[];
95
+ content_sha256?: string;
96
+ };
97
+ reporting_rows?: unknown[];
98
+ pagination?: {
99
+ has_more?: boolean;
100
+ cursor?: string;
101
+ total_count?: number;
102
+ };
103
+ }>;
46
104
  }
47
105
  export interface ReportingLedger {
48
106
  ledgerSnapshotId: string;
@@ -53,11 +111,33 @@ export interface ReportingLedger {
53
111
  revisions: ManagedReportingRevision[];
54
112
  materializations: ReportingMaterialization[];
55
113
  receipts: ReportingReceipt[];
114
+ /**
115
+ * The authenticated caller's own append-only status history for this scope.
116
+ * Sellers disclose no other consumer's statements, so this is the only way to
117
+ * see the current leaf's *content* — which is what tells the buyer whether it
118
+ * has anything new to say.
119
+ */
120
+ consumerStatuses?: ReportingConsumerStatus[];
56
121
  }
57
122
  export interface ReportingLedgerLimits {
123
+ /** Cursor pages per read. Bounds the ledger walk and each revision row read. */
58
124
  maxPages?: number;
125
+ /** Ledger records (obligations + revisions + adjustments) in one snapshot. */
59
126
  maxRecords?: number;
127
+ /**
128
+ * Wall-clock budget, applied per read: the ledger walk, each receipt write,
129
+ * each posting batch, the summary read — and, shared across all of them, the
130
+ * consumer-status consumption pass.
131
+ */
60
132
  maxLoadMs?: number;
133
+ /**
134
+ * Rows accumulated from one exact-revision read. Separate from `maxRecords`,
135
+ * which bounds *ledger* records: a caller who capped a small ledger at a few
136
+ * hundred records should not thereby cap every revision read at the same
137
+ * number. Defaults to 100,000, and exceeding it suppresses the statement
138
+ * rather than accusing the seller.
139
+ */
140
+ maxRevisionRows?: number;
61
141
  }
62
142
  interface ExpectedReportingPeriodBase {
63
143
  deliveryConfigId: string;
@@ -79,6 +159,65 @@ interface ExpectedReportingPeriodBase {
79
159
  schemaSha256: string;
80
160
  schemaDialect: 'https://json-schema.org/draft/2020-12/schema';
81
161
  schemaRefPolicy: 'local_fragment_only';
162
+ /**
163
+ * `metrics[].name` from the pinned report definition. Supplying it enables
164
+ * the `metric_missing` arm of `content_mismatch`; omitting it means the buyer
165
+ * never claims a promised metric is absent, which is the safe default.
166
+ */
167
+ committedMetrics?: readonly string[];
168
+ /**
169
+ * Units the pinned report definition fixed, keyed by metric/control-total
170
+ * name. Enables the `currency_mismatch` arm. Omit to skip that check.
171
+ */
172
+ metricUnits?: Readonly<Record<string, string>>;
173
+ /**
174
+ * The seller's advertised `automated_recovery_window_seconds`, as the buyer
175
+ * recorded it when accepting the configuration generation.
176
+ *
177
+ * It lives on `reporting-delivery-capabilities.json`, **not** on the
178
+ * obligation, so the ledger cannot supply it — the buyer has to carry its own
179
+ * copy. Without it the SDK cannot compute the rc.3 posting deadline, so it
180
+ * marks nothing overdue and posts nothing automatically: silence is a counted
181
+ * unknown, whereas posting on a guessed clock would churn the status chain.
182
+ */
183
+ automatedRecoveryWindowSeconds?: number;
184
+ /**
185
+ * The accepted configuration generation's `schedule.delivery_sla`, in
186
+ * seconds, as the buyer recorded it.
187
+ *
188
+ * `expected_at` is "the resolved period end plus this duration". The seller
189
+ * publishes `expected_at` on an obligation — but `obligation_missing` exists
190
+ * precisely because there is no obligation, so for that statement the buyer
191
+ * must derive it. Without this pin the SDK cannot prove a missing period is
192
+ * yet owed, so it marks nothing overdue and posts nothing: `expected_period`
193
+ * makes `obligation_missing` valid only at or after `expected_at`, and a
194
+ * statement dated from the period end is rejected outright by a conformant
195
+ * seller.
196
+ */
197
+ deliverySlaSeconds?: number;
198
+ /**
199
+ * Offset used instead of `deliverySlaSeconds` when `requiredFinality` is
200
+ * `official`, if the seller advertises one.
201
+ *
202
+ * `reporting-schedule.json` defines only `delivery_sla`, but this repo's own
203
+ * seller ingest anchors `expected_at` for official-finality generations on a
204
+ * separate `officialAfterMilliseconds` and rejects a missing-status statement
205
+ * dated before it. Without a matching pin a buyer on an official generation
206
+ * posts at `period.end + delivery_sla`, is refused, and — because that
207
+ * statement takes no clock input — rebuilds the identical body and is refused
208
+ * again on every run. Leave it unset when the seller does not advertise one.
209
+ */
210
+ officialAfterSeconds?: number;
211
+ /**
212
+ * `period.source_timezone` for the accepted generation.
213
+ *
214
+ * Preferred over the obligation's echo. The value is part of the
215
+ * consumer-status chain's logical key, so a seller that varies its echo would
216
+ * otherwise make the buyer append a fresh statement on every reconcile; the
217
+ * buyer pinned this when it accepted the generation, and the seller's copy is
218
+ * an echo of that.
219
+ */
220
+ periodSourceTimezone?: string;
82
221
  /** Consumer-pinned finality rule, required whenever an official revision is accepted. */
83
222
  officialFinality?: {
84
223
  policyId: string;
@@ -127,6 +266,42 @@ export interface ReportingCheckpointStore {
127
266
  get(key: ReportingCheckpointKey): Promise<ReportingCheckpoint | undefined>;
128
267
  put(key: ReportingCheckpointKey, checkpoint: ReportingCheckpoint): Promise<void>;
129
268
  }
269
+ /** One consumer-status supersession chain: the logical key the spec defines. */
270
+ export interface ReportingPendingConsumerStatusKey {
271
+ accountId: string;
272
+ deliveryConfigId: string;
273
+ deliveryConfigVersion: number;
274
+ reportDefinitionId: string;
275
+ periodStart: string;
276
+ periodEnd: string;
277
+ }
278
+ export interface ReportingPendingConsumerStatus {
279
+ /** The exact wire statement, replayed verbatim until the seller confirms it. */
280
+ statement: Record<string, unknown>;
281
+ /** Fingerprint of the claim it makes; a changed claim discards it. */
282
+ claimFingerprint: string;
283
+ }
284
+ /**
285
+ * Durable memory of a statement that has been built but not yet confirmed.
286
+ *
287
+ * `status_as_of` for `received` and `unreadable` is *when this consumer
288
+ * consumed the revision* — buyer-attributed arrival evidence that the spec
289
+ * explicitly refuses to let a seller substitute publication time for. That
290
+ * makes it irreducibly stateful: a stateless reconciler cannot reproduce it,
291
+ * so after a lost response it would build a different statement for the same
292
+ * claim.
293
+ *
294
+ * Wire this store and the reconciler replays the original statement
295
+ * byte-for-byte until the seller confirms it, which is the "exact retry" the
296
+ * spec's `immutability` and `idempotency_key` rules are written around. Leave
297
+ * it out and a re-plan is a new, valid statement instead: the chain still ends
298
+ * with exactly one, it just is not literally the same one.
299
+ */
300
+ export interface ReportingPendingConsumerStatusStore {
301
+ get(key: ReportingPendingConsumerStatusKey): Promise<ReportingPendingConsumerStatus | undefined>;
302
+ put(key: ReportingPendingConsumerStatusKey, pending: ReportingPendingConsumerStatus): Promise<void>;
303
+ clear(key: ReportingPendingConsumerStatusKey): Promise<void>;
304
+ }
130
305
  export interface ReportingInspectionContext {
131
306
  obligation: ManagedReportingObligation;
132
307
  revision: ManagedReportingRevision;
@@ -141,12 +316,173 @@ export interface ObligationReconciliation {
141
316
  reportingMaterializationId?: string;
142
317
  reasons: string[];
143
318
  }
319
+ /**
320
+ * One consumer status the buyer owes for an expected period, with the deadline
321
+ * that makes it owed.
322
+ *
323
+ * rc.3 moves the buyer's duty off "before you close the scope" and onto a
324
+ * clock: a current status is owed by `expected_at` plus the seller's advertised
325
+ * `automated_recovery_window_seconds`. A buyer still retrying at that point
326
+ * posts `revision_missing` or `unreadable` and supersedes it later rather than
327
+ * staying silent, because silence is what the seller counts in
328
+ * `obligation_counts.consumer_status_pending`.
329
+ */
330
+ export interface ReportingConsumerStatusPlanV1 {
331
+ deliveryConfigId: string;
332
+ deliveryConfigVersion: number;
333
+ reportDefinitionId: string;
334
+ period: {
335
+ start: string;
336
+ end: string;
337
+ source_timezone: string;
338
+ };
339
+ reportingObligationId?: string;
340
+ reportingRevisionId?: string;
341
+ observedRevisionContentSha256?: string;
342
+ /**
343
+ * The caller's current unsuperseded leaf, when the seller published one. A
344
+ * new statement must name it; omitting it on a chain that already has a leaf
345
+ * fails atomically rather than forking.
346
+ */
347
+ supersedesReportingStatusId?: string;
348
+ consumerStatus: 'received' | 'obligation_missing' | 'revision_missing' | 'unreadable' | 'content_mismatch';
349
+ mismatchCode?: ReportingMismatchCodeV1;
350
+ failureCode?: 'access_denied' | 'resource_not_found' | 'integrity_mismatch' | 'reader_incompatible' | 'transport_failed';
351
+ /** `expected_at` + `automated_recovery_window_seconds`, when both are known. */
352
+ deadline?: string;
353
+ /** True once the deadline has passed — the status is owed now, not at scope close. */
354
+ overdue: boolean;
355
+ /**
356
+ * When the consumer established this status.
357
+ *
358
+ * `undefined` while `requiresConsumption` is still true: a `received`
359
+ * statement is dated from when the revision became consumable *to this
360
+ * consumer*, which is not knowable until the buyer has actually read it.
361
+ */
362
+ statusAsOf?: string;
363
+ /**
364
+ * Earliest instant this statement may legally carry: the later of the
365
+ * instant it became true and the superseded leaf's own `status_as_of`, since
366
+ * `time` forbids a chain from moving backwards.
367
+ */
368
+ statusAsOfFloor: string;
369
+ /**
370
+ * True until the buyer has consumed the named revision and recomputed its
371
+ * binding digest. `received` and `content_mismatch` both require that
372
+ * recomputation, so neither may be posted while this is set.
373
+ */
374
+ requiresConsumption?: boolean;
375
+ /**
376
+ * Why this status was planned but not posted.
377
+ *
378
+ * - `unchanged` — the caller's current leaf already says exactly this. Posting
379
+ * it again would supersede a statement with its own duplicate, forever;
380
+ * `retention_and_limits` calls that pathological churn.
381
+ * - `leaf_undisclosed` — the seller named a current leaf it did not return, so
382
+ * the buyer cannot tell whether it has anything new to say and declines to
383
+ * guess.
384
+ * - `consumption_unavailable` — no exact-revision reader is wired, so the
385
+ * buyer cannot honestly attest consumption.
386
+ * - `posting_unavailable` — no `syncReportingStatus` is wired, so there is
387
+ * nothing to append to. Without this the plan reads as live, due and
388
+ * unsuppressed while silently going nowhere.
389
+ * - `period_identity_unknown` — the seller supplied a `period.source_timezone`
390
+ * that is not a recognized IANA zone. That value is part of the chain's
391
+ * logical key, so substituting one produces a statement the seller refuses
392
+ * on every run; `iana_timezone` forbids the substitution by name.
393
+ * - `local_budget_exhausted` — the buyer's own read budget ran out before it
394
+ * could consume the revision. Self-inflicted, so it is silence rather than
395
+ * an `unreadable` claim against a seller that did nothing wrong.
396
+ * - `deadline_unknown` — no posting deadline could be derived, so this period
397
+ * will never post. Two causes, both named in `reason`: a pin the buyer has
398
+ * to supply is missing, or the seller's own `obligation.expected_at` is
399
+ * unreadable and its `schedule.delivery_sla` did not resolve one either.
400
+ * Without this value a permanent misconfiguration renders exactly like a
401
+ * period that is simply not due yet.
402
+ * - `chain_indeterminate` — the seller's revision chain forked, or the buyer
403
+ * could not walk it. That is the buyer failing to read, not the seller
404
+ * failing to publish, and `revision_missing` would blame the wrong party.
405
+ */
406
+ suppressed?: 'unchanged' | 'leaf_undisclosed' | 'consumption_unavailable' | 'local_budget_exhausted' | 'deadline_unknown' | 'chain_indeterminate' | 'posting_unavailable' | 'period_identity_unknown';
407
+ /**
408
+ * Set when the seller's own `expected_at` is later than the buyer's pinned
409
+ * expectation by more than its recovery window.
410
+ *
411
+ * The statement is still not posted — `expected_period` makes the seller's
412
+ * instant authoritative, and a locally derived one would be refused. But
413
+ * without this the period sits at `overdue: false` with `suppressed` unset,
414
+ * indistinguishable from one that is simply not due yet, which is a silent
415
+ * kill switch for the whole loop. **Alert on it.**
416
+ */
417
+ deadlineBeyondPin?: {
418
+ declared: string;
419
+ pinned: string;
420
+ };
421
+ /** Why this status, in adopter-readable terms. Never a measurement claim. */
422
+ reason: string;
423
+ }
424
+ /**
425
+ * A seller-reported issue the buyer may need to put in front of a human,
426
+ * carried with the escalation destination so an SDK user can page someone
427
+ * without re-reading the capability document.
428
+ */
429
+ export interface ReportingEscalationV1 {
430
+ reportingObligationId: string;
431
+ issueId: string;
432
+ code: string;
433
+ severity: string;
434
+ responsibleParty: string;
435
+ recommendedAction: string;
436
+ /** Fixed at first emission; age the issue from this, not from the read. */
437
+ openedAt?: string;
438
+ issueState?: string;
439
+ /** Inert correlation text. Never dereference or resolve it. */
440
+ externalRef?: string;
441
+ reportingStatusId?: string;
442
+ /**
443
+ * Seller's advertised human escalation path. Display metadata only: agents
444
+ * MUST NOT fetch the URL, send protocol traffic to it, or treat either value
445
+ * as a credential.
446
+ */
447
+ operationsContact?: {
448
+ url?: string;
449
+ email?: string;
450
+ };
451
+ /** True when `recommended_action` is in the `contact_*` family. */
452
+ requiresHumanContact: boolean;
453
+ }
144
454
  export interface ReportingReconciliationResult {
145
455
  definitive: boolean;
146
456
  ledger: ReportingLedger;
147
457
  obligations: ObligationReconciliation[];
148
458
  missingExpectedPeriods: ExpectedReportingPeriod[];
149
459
  submittedReceipts: ReportingReceipt[];
460
+ /** Every status the buyer owes for the reconciled scope, overdue flagged. */
461
+ consumerStatuses: ReportingConsumerStatusPlanV1[];
462
+ /** The subset actually posted through `syncReportingStatus` this run. */
463
+ postedConsumerStatuses: ReportingConsumerStatusPlanV1[];
464
+ /**
465
+ * Statuses the seller rejected item-locally, carrying the errors it returned.
466
+ * `sync_reporting_status` is a partial-success batch, so a rejection is data
467
+ * the caller has to see — swallowing it leaves a buyer believing it has
468
+ * discharged a duty it has not.
469
+ */
470
+ failedConsumerStatuses: Array<{
471
+ plan: ReportingConsumerStatusPlanV1;
472
+ reportingStatusId?: string;
473
+ errors: unknown[];
474
+ }>;
475
+ /**
476
+ * The seller's own count of obligations past the buyer's posting deadline
477
+ * with no current status from this caller. Surfaced verbatim; it is a
478
+ * visibility count over the buyer's silence and never a health input.
479
+ * `undefined` when the read could not establish it: the client carries no
480
+ * `syncReportingStatus` (so this seller is not running the loop), the seller
481
+ * omitted the field, or the summary read failed.
482
+ */
483
+ consumerStatusPending?: number;
484
+ /** Seller-reported issues, with escalation destination attached. */
485
+ escalations: ReportingEscalationV1[];
150
486
  totalsByRevision: Array<{
151
487
  reportingRevisionId: string;
152
488
  rowCount: number;
@@ -165,6 +501,21 @@ interface ReconcileReportingBaseOptions {
165
501
  inspectionRetryBaseDelayMs?: number;
166
502
  ledgerLimits?: ReportingLedgerLimits;
167
503
  now?: Date;
504
+ /**
505
+ * The seller's advertised `operations_contact`, recorded by the buyer from
506
+ * the capability document. Surfaced on every escalation so an SDK user can
507
+ * page a human. Inert display metadata — never dereference it.
508
+ */
509
+ operationsContact?: {
510
+ url?: string;
511
+ email?: string;
512
+ };
513
+ /**
514
+ * Durable memory for statements built but not yet confirmed, so a retry
515
+ * after a lost response is the same statement rather than a new one. Optional;
516
+ * see `ReportingPendingConsumerStatusStore` for what changes without it.
517
+ */
518
+ pendingConsumerStatusStore?: ReportingPendingConsumerStatusStore;
168
519
  }
169
520
  type ReportingCheckpointOptions = {
170
521
  checkpointStore?: never;
@@ -193,7 +544,16 @@ export declare class ReportingReconciliationError extends Error {
193
544
  }
194
545
  export declare function isReportingCoverageEvidence(value: unknown): value is ReportingCoverageEvidence;
195
546
  export declare function loadReportingLedger(client: ReportingReconciliationClient, request: Omit<GetReportingStatusRequest, 'view' | 'pagination'>, maxSnapshotRestarts?: number, limits?: ReportingLedgerLimits): Promise<ReportingLedger>;
196
- export declare function evaluateReportingLedger(ledger: ReportingLedger, expectedPeriods: ExpectedReportingPeriod[] | undefined, now?: Date): Omit<ReportingReconciliationResult, 'submittedReceipts'>;
547
+ export declare function evaluateReportingLedger(ledger: ReportingLedger, expectedPeriods: ExpectedReportingPeriod[] | undefined, now?: Date,
548
+ /**
549
+ * The seller's advertised `operations_contact`, as the buyer recorded it from
550
+ * the capability document. It is not carried on any `get_reporting_status`
551
+ * response, so it cannot be derived here.
552
+ */
553
+ operationsContact?: {
554
+ url?: string;
555
+ email?: string;
556
+ }): Omit<ReportingReconciliationResult, 'submittedReceipts'>;
197
557
  export declare function buildReportingReceipt(context: ReportingInspectionContext, observation: ReportingObservation, reportingReceiptId?: string, observedAt?: string): ReportingReceipt;
198
558
  export declare function reconcileReporting<TCredential = unknown>(options: ReconcileReportingOptions<TCredential>): Promise<ReportingReconciliationResult>;
199
559
  export {};