@adcp/sdk 15.4.0 → 15.5.0

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 (115) hide show
  1. package/dist/lib/advanced.d.mts +2 -2
  2. package/dist/lib/advanced.d.ts +2 -2
  3. package/dist/lib/advanced.js +8 -2
  4. package/dist/lib/advanced.mjs +8 -2
  5. package/dist/lib/core/AgentClient.d.mts +4 -0
  6. package/dist/lib/core/AgentClient.d.ts +4 -0
  7. package/dist/lib/core/AgentClient.js +8 -0
  8. package/dist/lib/core/AgentClient.mjs +8 -0
  9. package/dist/lib/core/SingleAgentClient.d.mts +154 -0
  10. package/dist/lib/core/SingleAgentClient.d.ts +154 -0
  11. package/dist/lib/core/SingleAgentClient.js +661 -23
  12. package/dist/lib/core/SingleAgentClient.mjs +666 -23
  13. package/dist/lib/core/agent-discovery-cache.d.mts +103 -0
  14. package/dist/lib/core/agent-discovery-cache.d.ts +103 -0
  15. package/dist/lib/core/agent-discovery-cache.js +121 -0
  16. package/dist/lib/core/agent-discovery-cache.mjs +92 -0
  17. package/dist/lib/index.d.mts +5 -3
  18. package/dist/lib/index.d.ts +5 -3
  19. package/dist/lib/index.js +7 -0
  20. package/dist/lib/index.mjs +6 -0
  21. package/dist/lib/protocols/index.d.mts +2 -2
  22. package/dist/lib/protocols/index.d.ts +2 -2
  23. package/dist/lib/protocols/index.js +1 -1
  24. package/dist/lib/protocols/index.mjs +1 -1
  25. package/dist/lib/protocols/mcp-call-context.d.mts +109 -0
  26. package/dist/lib/protocols/mcp-call-context.d.ts +109 -0
  27. package/dist/lib/protocols/mcp-call-context.js +221 -0
  28. package/dist/lib/protocols/mcp-call-context.mjs +186 -0
  29. package/dist/lib/protocols/mcp-modern.d.mts +9 -1
  30. package/dist/lib/protocols/mcp-modern.d.ts +9 -1
  31. package/dist/lib/protocols/mcp-modern.js +180 -104
  32. package/dist/lib/protocols/mcp-modern.mjs +193 -104
  33. package/dist/lib/protocols/mcp-scope.d.mts +15 -0
  34. package/dist/lib/protocols/mcp-scope.d.ts +15 -0
  35. package/dist/lib/protocols/mcp.d.mts +4 -2
  36. package/dist/lib/protocols/mcp.d.ts +4 -2
  37. package/dist/lib/protocols/mcp.js +178 -154
  38. package/dist/lib/protocols/mcp.mjs +189 -153
  39. package/dist/lib/protocols/transportDiagnostics.d.mts +33 -1
  40. package/dist/lib/protocols/transportDiagnostics.d.ts +33 -1
  41. package/dist/lib/protocols/transportDiagnostics.js +128 -12
  42. package/dist/lib/protocols/transportDiagnostics.mjs +128 -12
  43. package/dist/lib/reporting/gcs/index.d.mts +2 -0
  44. package/dist/lib/reporting/gcs/index.d.ts +2 -0
  45. package/dist/lib/reporting/gcs/index.js +3 -0
  46. package/dist/lib/reporting/gcs/index.mjs +2 -0
  47. package/dist/lib/reporting/gcs/row-provider.d.mts +32 -0
  48. package/dist/lib/reporting/gcs/row-provider.d.ts +32 -0
  49. package/dist/lib/reporting/gcs/row-provider.js +205 -0
  50. package/dist/lib/reporting/gcs/row-provider.mjs +188 -0
  51. package/dist/lib/reporting/ledger/change-feed.d.mts +41 -0
  52. package/dist/lib/reporting/ledger/change-feed.d.ts +41 -0
  53. package/dist/lib/reporting/ledger/change-feed.js +101 -0
  54. package/dist/lib/reporting/ledger/change-feed.mjs +74 -0
  55. package/dist/lib/reporting/ledger/handler.js +22 -8
  56. package/dist/lib/reporting/ledger/handler.mjs +22 -8
  57. package/dist/lib/reporting/ledger/index.d.mts +4 -0
  58. package/dist/lib/reporting/ledger/index.d.ts +4 -0
  59. package/dist/lib/reporting/ledger/index.js +9 -1
  60. package/dist/lib/reporting/ledger/index.mjs +4 -0
  61. package/dist/lib/reporting/ledger/managed-postgres.d.mts +2 -0
  62. package/dist/lib/reporting/ledger/managed-postgres.d.ts +2 -0
  63. package/dist/lib/reporting/ledger/managed-postgres.js +21 -1
  64. package/dist/lib/reporting/ledger/managed-postgres.mjs +21 -1
  65. package/dist/lib/reporting/ledger/managed.d.mts +9 -0
  66. package/dist/lib/reporting/ledger/managed.d.ts +9 -0
  67. package/dist/lib/reporting/ledger/managed.js +18 -0
  68. package/dist/lib/reporting/ledger/managed.mjs +18 -0
  69. package/dist/lib/reporting/ledger/postgres.d.mts +175 -0
  70. package/dist/lib/reporting/ledger/postgres.d.ts +175 -0
  71. package/dist/lib/reporting/ledger/postgres.js +851 -26
  72. package/dist/lib/reporting/ledger/postgres.mjs +859 -26
  73. package/dist/lib/reporting/ledger/producer.js +10 -1
  74. package/dist/lib/reporting/ledger/producer.mjs +10 -1
  75. package/dist/lib/reporting/ledger/row-storage-errors.d.mts +7 -0
  76. package/dist/lib/reporting/ledger/row-storage-errors.d.ts +7 -0
  77. package/dist/lib/reporting/ledger/row-storage-errors.js +41 -0
  78. package/dist/lib/reporting/ledger/row-storage-errors.mjs +16 -0
  79. package/dist/lib/reporting/ledger/row-storage-migration.d.mts +41 -0
  80. package/dist/lib/reporting/ledger/row-storage-migration.d.ts +41 -0
  81. package/dist/lib/reporting/ledger/row-storage-migration.js +234 -0
  82. package/dist/lib/reporting/ledger/row-storage-migration.mjs +208 -0
  83. package/dist/lib/reporting/ledger/row-storage-object.d.mts +112 -0
  84. package/dist/lib/reporting/ledger/row-storage-object.d.ts +112 -0
  85. package/dist/lib/reporting/ledger/row-storage-object.js +281 -0
  86. package/dist/lib/reporting/ledger/row-storage-object.mjs +239 -0
  87. package/dist/lib/reporting/ledger/row-storage-provider-io.d.mts +51 -0
  88. package/dist/lib/reporting/ledger/row-storage-provider-io.d.ts +51 -0
  89. package/dist/lib/reporting/ledger/row-storage-provider-io.js +152 -0
  90. package/dist/lib/reporting/ledger/row-storage-provider-io.mjs +119 -0
  91. package/dist/lib/reporting/ledger/row-storage.d.mts +224 -0
  92. package/dist/lib/reporting/ledger/row-storage.d.ts +224 -0
  93. package/dist/lib/reporting/ledger/row-storage.js +692 -0
  94. package/dist/lib/reporting/ledger/row-storage.mjs +680 -0
  95. package/dist/lib/reporting/ledger/types.d.mts +8 -0
  96. package/dist/lib/reporting/ledger/types.d.ts +8 -0
  97. package/dist/lib/reporting/service/index.d.mts +41 -1
  98. package/dist/lib/reporting/service/index.d.ts +41 -1
  99. package/dist/lib/reporting/service/index.js +68 -1
  100. package/dist/lib/reporting/service/index.mjs +70 -1
  101. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  102. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  103. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  104. package/dist/lib/version.d.mts +3 -3
  105. package/dist/lib/version.d.ts +3 -3
  106. package/dist/lib/version.js +3 -3
  107. package/dist/lib/version.mjs +3 -3
  108. package/docs/README.md +1 -1
  109. package/docs/TYPE-SUMMARY.md +35 -2
  110. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +142 -0
  111. package/docs/guides/EXISTING-PLATFORM.md +43 -12
  112. package/docs/guides/REPORTING-LEDGER.md +209 -0
  113. package/docs/llms.txt +4 -2
  114. package/docs/migration-14.x-rc-worksheet.md +4 -4
  115. package/package.json +1 -1
@@ -30,6 +30,7 @@ __export(transportDiagnostics_exports, {
30
30
  module.exports = __toCommonJS(transportDiagnostics_exports);
31
31
  var import_global_async_local_storage = require('../utils/global-async-local-storage.js');
32
32
  var import_node_crypto = require("node:crypto");
33
+ var import_mcp_call_context = require('./mcp-call-context.js');
33
34
  const BODY_SNIPPET_LIMIT = 64 * 1024;
34
35
  const BODY_SNIPPET_TIMEOUT_MS = 1e3;
35
36
  const OBSERVER_FLUSH_TIMEOUT_MS = 5e3;
@@ -110,7 +111,7 @@ function wrapFetchWithTransportDiagnostics(upstream) {
110
111
  const url = sanitizeTransportUrl(getUrl(input));
111
112
  const requestHeaders = sanitizeTransportHeaders(mergeRequestHeaders(input, init));
112
113
  const requestBody = bodySnippet(init?.body);
113
- const baseEvent = {
114
+ const correlation = {
114
115
  agentId: slot.agentId,
115
116
  protocol: slot.protocol,
116
117
  transportRequestId,
@@ -122,11 +123,15 @@ function wrapFetchWithTransportDiagnostics(upstream) {
122
123
  method,
123
124
  url,
124
125
  requestHeaders,
126
+ startedAt
127
+ };
128
+ const signal = getSignal(input, init);
129
+ const baseEvent = {
130
+ ...correlation,
125
131
  ...requestBody && {
126
132
  requestBody: requestBody.body,
127
133
  requestBodyTruncated: requestBody.truncated
128
- },
129
- startedAt
134
+ }
130
135
  };
131
136
  emitTransportActivity(handler, {
132
137
  type: "request_started",
@@ -148,13 +153,18 @@ function wrapFetchWithTransportDiagnostics(upstream) {
148
153
  };
149
154
  const responseBody = responseBodySnippet(response);
150
155
  if (!responseBody) {
151
- emitTransportActivity(
152
- handler,
153
- response.body ? {
154
- ...responseEvent,
155
- responseBodyTruncated: true
156
- } : responseEvent
157
- );
156
+ if (!response.body) {
157
+ emitTransportActivity(handler, responseEvent);
158
+ return response;
159
+ }
160
+ const observer = observeResponseBody(response, handler, correlation, startedAtMs, signal);
161
+ emitTransportActivity(handler, {
162
+ ...responseEvent,
163
+ responseBodyTruncated: true,
164
+ ...observer && { streaming: true }
165
+ });
166
+ observer?.start();
167
+ return observer?.response ?? response;
158
168
  } else {
159
169
  void responseBody.then(
160
170
  (captured) => {
@@ -188,8 +198,13 @@ function wrapFetchWithTransportDiagnostics(upstream) {
188
198
  return wrapped;
189
199
  }
190
200
  function emitTransportActivity(handler, event) {
201
+ return dispatchTransportActivity(handler, event, true);
202
+ }
203
+ function emitUntrackedTransportActivity(handler, event) {
204
+ void dispatchTransportActivity(handler, event, false);
205
+ }
206
+ function dispatchTransportActivity(handler, event, track) {
191
207
  try {
192
- const slot = transportDiagnosticsStorage.getStore();
193
208
  const frozen = Object.freeze(structuredClone(event));
194
209
  const pending = Promise.resolve().then(() => handler(frozen)).then(
195
210
  () => {
@@ -197,12 +212,113 @@ function emitTransportActivity(handler, event) {
197
212
  () => {
198
213
  }
199
214
  );
200
- slot?.pending.push(pending);
215
+ if (track) transportDiagnosticsStorage.getStore()?.pending.push(pending);
201
216
  return pending;
202
217
  } catch {
203
218
  return void 0;
204
219
  }
205
220
  }
221
+ function observeResponseBody(response, handler, correlation, startedAtMs, signal) {
222
+ const source = response.body;
223
+ if (!source) return void 0;
224
+ let reader;
225
+ try {
226
+ reader = source.getReader();
227
+ } catch {
228
+ return void 0;
229
+ }
230
+ const { status: httpStatus, statusText } = response;
231
+ let bytes = 0;
232
+ let finished = false;
233
+ const release = () => {
234
+ try {
235
+ reader.releaseLock();
236
+ } catch {
237
+ }
238
+ };
239
+ const onAbort = () => finish((0, import_mcp_call_context.isMCPCallCompleted)(signal?.reason) ? "cancelled" : "aborted", signal?.reason);
240
+ const finish = (outcome, error) => {
241
+ if (finished) return;
242
+ finished = true;
243
+ signal?.removeEventListener("abort", onAbort);
244
+ try {
245
+ const resolved = outcome !== "ended" && signal?.aborted ? (0, import_mcp_call_context.isMCPCallCompleted)(signal.reason) ? "cancelled" : "aborted" : outcome;
246
+ const event = {
247
+ ...correlation,
248
+ type: "response_completed",
249
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
250
+ durationMs: Date.now() - startedAtMs,
251
+ httpStatus,
252
+ statusText,
253
+ outcome: resolved,
254
+ bytes
255
+ };
256
+ if (error !== void 0 && (resolved === "errored" || resolved === "aborted")) {
257
+ event.errorName = error instanceof Error ? error.name : typeof error;
258
+ event.errorMessage = sanitizeDiagnosticText(error instanceof Error ? error.message : String(error));
259
+ }
260
+ emitUntrackedTransportActivity(handler, event);
261
+ } catch {
262
+ }
263
+ };
264
+ const classify = (error) => error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError") ? "aborted" : "errored";
265
+ const stream = new ReadableStream(
266
+ {
267
+ async pull(controller) {
268
+ try {
269
+ const { done, value } = await reader.read();
270
+ if (done) {
271
+ finish("ended");
272
+ release();
273
+ controller.close();
274
+ return;
275
+ }
276
+ if (typeof value?.byteLength === "number") bytes += value.byteLength;
277
+ controller.enqueue(value);
278
+ } catch (error) {
279
+ finish(classify(error), error);
280
+ release();
281
+ throw error;
282
+ }
283
+ },
284
+ cancel(reason) {
285
+ finish("cancelled", reason);
286
+ return reader.cancel(reason).finally(release);
287
+ }
288
+ },
289
+ { highWaterMark: 0 }
290
+ );
291
+ let rebuilt;
292
+ try {
293
+ rebuilt = new Response(stream, {
294
+ status: response.status,
295
+ statusText: response.statusText,
296
+ headers: response.headers
297
+ });
298
+ } catch {
299
+ reader.releaseLock();
300
+ return void 0;
301
+ }
302
+ preserveResponseMetadata(response, rebuilt);
303
+ const start = () => {
304
+ reader.closed.catch((error) => finish(classify(error), error));
305
+ if (signal?.aborted) onAbort();
306
+ else signal?.addEventListener("abort", onAbort, { once: true });
307
+ };
308
+ return { response: rebuilt, start };
309
+ }
310
+ function preserveResponseMetadata(from, to) {
311
+ for (const key of ["url", "redirected", "type"]) {
312
+ try {
313
+ Object.defineProperty(to, key, { value: from[key], enumerable: true, configurable: true });
314
+ } catch {
315
+ }
316
+ }
317
+ }
318
+ function getSignal(input, init) {
319
+ if (init?.signal) return init.signal;
320
+ return input instanceof Request ? input.signal : void 0;
321
+ }
206
322
  function getUrl(input) {
207
323
  return typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
208
324
  }
@@ -5,6 +5,7 @@ const __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));
5
5
  const require2 = __adcpCreateRequire(import.meta.url);
6
6
  import { globalAsyncLocalStorage } from "../utils/global-async-local-storage.mjs";
7
7
  import { createHmac, randomUUID } from "node:crypto";
8
+ import { isMCPCallCompleted } from "./mcp-call-context.mjs";
8
9
  const BODY_SNIPPET_LIMIT = 64 * 1024;
9
10
  const BODY_SNIPPET_TIMEOUT_MS = 1e3;
10
11
  const OBSERVER_FLUSH_TIMEOUT_MS = 5e3;
@@ -85,7 +86,7 @@ function wrapFetchWithTransportDiagnostics(upstream) {
85
86
  const url = sanitizeTransportUrl(getUrl(input));
86
87
  const requestHeaders = sanitizeTransportHeaders(mergeRequestHeaders(input, init));
87
88
  const requestBody = bodySnippet(init?.body);
88
- const baseEvent = {
89
+ const correlation = {
89
90
  agentId: slot.agentId,
90
91
  protocol: slot.protocol,
91
92
  transportRequestId,
@@ -97,11 +98,15 @@ function wrapFetchWithTransportDiagnostics(upstream) {
97
98
  method,
98
99
  url,
99
100
  requestHeaders,
101
+ startedAt
102
+ };
103
+ const signal = getSignal(input, init);
104
+ const baseEvent = {
105
+ ...correlation,
100
106
  ...requestBody && {
101
107
  requestBody: requestBody.body,
102
108
  requestBodyTruncated: requestBody.truncated
103
- },
104
- startedAt
109
+ }
105
110
  };
106
111
  emitTransportActivity(handler, {
107
112
  type: "request_started",
@@ -123,13 +128,18 @@ function wrapFetchWithTransportDiagnostics(upstream) {
123
128
  };
124
129
  const responseBody = responseBodySnippet(response);
125
130
  if (!responseBody) {
126
- emitTransportActivity(
127
- handler,
128
- response.body ? {
129
- ...responseEvent,
130
- responseBodyTruncated: true
131
- } : responseEvent
132
- );
131
+ if (!response.body) {
132
+ emitTransportActivity(handler, responseEvent);
133
+ return response;
134
+ }
135
+ const observer = observeResponseBody(response, handler, correlation, startedAtMs, signal);
136
+ emitTransportActivity(handler, {
137
+ ...responseEvent,
138
+ responseBodyTruncated: true,
139
+ ...observer && { streaming: true }
140
+ });
141
+ observer?.start();
142
+ return observer?.response ?? response;
133
143
  } else {
134
144
  void responseBody.then(
135
145
  (captured) => {
@@ -163,8 +173,13 @@ function wrapFetchWithTransportDiagnostics(upstream) {
163
173
  return wrapped;
164
174
  }
165
175
  function emitTransportActivity(handler, event) {
176
+ return dispatchTransportActivity(handler, event, true);
177
+ }
178
+ function emitUntrackedTransportActivity(handler, event) {
179
+ void dispatchTransportActivity(handler, event, false);
180
+ }
181
+ function dispatchTransportActivity(handler, event, track) {
166
182
  try {
167
- const slot = transportDiagnosticsStorage.getStore();
168
183
  const frozen = Object.freeze(structuredClone(event));
169
184
  const pending = Promise.resolve().then(() => handler(frozen)).then(
170
185
  () => {
@@ -172,12 +187,113 @@ function emitTransportActivity(handler, event) {
172
187
  () => {
173
188
  }
174
189
  );
175
- slot?.pending.push(pending);
190
+ if (track) transportDiagnosticsStorage.getStore()?.pending.push(pending);
176
191
  return pending;
177
192
  } catch {
178
193
  return void 0;
179
194
  }
180
195
  }
196
+ function observeResponseBody(response, handler, correlation, startedAtMs, signal) {
197
+ const source = response.body;
198
+ if (!source) return void 0;
199
+ let reader;
200
+ try {
201
+ reader = source.getReader();
202
+ } catch {
203
+ return void 0;
204
+ }
205
+ const { status: httpStatus, statusText } = response;
206
+ let bytes = 0;
207
+ let finished = false;
208
+ const release = () => {
209
+ try {
210
+ reader.releaseLock();
211
+ } catch {
212
+ }
213
+ };
214
+ const onAbort = () => finish(isMCPCallCompleted(signal?.reason) ? "cancelled" : "aborted", signal?.reason);
215
+ const finish = (outcome, error) => {
216
+ if (finished) return;
217
+ finished = true;
218
+ signal?.removeEventListener("abort", onAbort);
219
+ try {
220
+ const resolved = outcome !== "ended" && signal?.aborted ? isMCPCallCompleted(signal.reason) ? "cancelled" : "aborted" : outcome;
221
+ const event = {
222
+ ...correlation,
223
+ type: "response_completed",
224
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
225
+ durationMs: Date.now() - startedAtMs,
226
+ httpStatus,
227
+ statusText,
228
+ outcome: resolved,
229
+ bytes
230
+ };
231
+ if (error !== void 0 && (resolved === "errored" || resolved === "aborted")) {
232
+ event.errorName = error instanceof Error ? error.name : typeof error;
233
+ event.errorMessage = sanitizeDiagnosticText(error instanceof Error ? error.message : String(error));
234
+ }
235
+ emitUntrackedTransportActivity(handler, event);
236
+ } catch {
237
+ }
238
+ };
239
+ const classify = (error) => error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError") ? "aborted" : "errored";
240
+ const stream = new ReadableStream(
241
+ {
242
+ async pull(controller) {
243
+ try {
244
+ const { done, value } = await reader.read();
245
+ if (done) {
246
+ finish("ended");
247
+ release();
248
+ controller.close();
249
+ return;
250
+ }
251
+ if (typeof value?.byteLength === "number") bytes += value.byteLength;
252
+ controller.enqueue(value);
253
+ } catch (error) {
254
+ finish(classify(error), error);
255
+ release();
256
+ throw error;
257
+ }
258
+ },
259
+ cancel(reason) {
260
+ finish("cancelled", reason);
261
+ return reader.cancel(reason).finally(release);
262
+ }
263
+ },
264
+ { highWaterMark: 0 }
265
+ );
266
+ let rebuilt;
267
+ try {
268
+ rebuilt = new Response(stream, {
269
+ status: response.status,
270
+ statusText: response.statusText,
271
+ headers: response.headers
272
+ });
273
+ } catch {
274
+ reader.releaseLock();
275
+ return void 0;
276
+ }
277
+ preserveResponseMetadata(response, rebuilt);
278
+ const start = () => {
279
+ reader.closed.catch((error) => finish(classify(error), error));
280
+ if (signal?.aborted) onAbort();
281
+ else signal?.addEventListener("abort", onAbort, { once: true });
282
+ };
283
+ return { response: rebuilt, start };
284
+ }
285
+ function preserveResponseMetadata(from, to) {
286
+ for (const key of ["url", "redirected", "type"]) {
287
+ try {
288
+ Object.defineProperty(to, key, { value: from[key], enumerable: true, configurable: true });
289
+ } catch {
290
+ }
291
+ }
292
+ }
293
+ function getSignal(input, init) {
294
+ if (init?.signal) return init.signal;
295
+ return input instanceof Request ? input.signal : void 0;
296
+ }
181
297
  function getUrl(input) {
182
298
  return typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
183
299
  }
@@ -5,3 +5,5 @@ export { createGcsReportingResourceReaderV1, createGcsReportingReferenceResolver
5
5
  export type { GcsReportingReadScopeV1, GcsReportingReadAuthorizationV1, GcsReportingReaderOptionsV1 } from './reader.mjs';
6
6
  export { createGcsReportingManagedDeliveryAdapterV1 } from './adapter.mjs';
7
7
  export type { CreateGcsReportingManagedDeliveryAdapterOptionsV1 } from './adapter.mjs';
8
+ export { createGcsReportingRowObjectProviderV1 } from './row-provider.mjs';
9
+ export type { CreateGcsReportingRowObjectProviderOptionsV1 } from './row-provider.mjs';
@@ -5,3 +5,5 @@ export { createGcsReportingResourceReaderV1, createGcsReportingReferenceResolver
5
5
  export type { GcsReportingReadScopeV1, GcsReportingReadAuthorizationV1, GcsReportingReaderOptionsV1 } from './reader';
6
6
  export { createGcsReportingManagedDeliveryAdapterV1 } from './adapter';
7
7
  export type { CreateGcsReportingManagedDeliveryAdapterOptionsV1 } from './adapter';
8
+ export { createGcsReportingRowObjectProviderV1 } from './row-provider';
9
+ export type { CreateGcsReportingRowObjectProviderOptionsV1 } from './row-provider';
@@ -23,6 +23,7 @@ __export(gcs_exports, {
23
23
  createGcsReportingObjectFenceV1: () => import_fence.createGcsReportingObjectFenceV1,
24
24
  createGcsReportingReferenceResolverV1: () => import_reader.createGcsReportingReferenceResolverV1,
25
25
  createGcsReportingResourceReaderV1: () => import_reader.createGcsReportingResourceReaderV1,
26
+ createGcsReportingRowObjectProviderV1: () => import_row_provider.createGcsReportingRowObjectProviderV1,
26
27
  isReportingGcsFenceError: () => import_errors.isReportingGcsFenceError
27
28
  });
28
29
  module.exports = __toCommonJS(gcs_exports);
@@ -30,6 +31,7 @@ var import_fence = require('./fence.js');
30
31
  var import_errors = require('./errors.js');
31
32
  var import_reader = require('./reader.js');
32
33
  var import_adapter = require('./adapter.js');
34
+ var import_row_provider = require('./row-provider.js');
33
35
  // Annotate the CommonJS export names for ESM import in node:
34
36
  0 && (module.exports = {
35
37
  ReportingGcsFenceError,
@@ -37,5 +39,6 @@ var import_adapter = require('./adapter.js');
37
39
  createGcsReportingObjectFenceV1,
38
40
  createGcsReportingReferenceResolverV1,
39
41
  createGcsReportingResourceReaderV1,
42
+ createGcsReportingRowObjectProviderV1,
40
43
  isReportingGcsFenceError
41
44
  });
@@ -2,11 +2,13 @@ import { createGcsReportingObjectFenceV1 } from "./fence.mjs";
2
2
  import { ReportingGcsFenceError, isReportingGcsFenceError } from "./errors.mjs";
3
3
  import { createGcsReportingResourceReaderV1, createGcsReportingReferenceResolverV1 } from "./reader.mjs";
4
4
  import { createGcsReportingManagedDeliveryAdapterV1 } from "./adapter.mjs";
5
+ import { createGcsReportingRowObjectProviderV1 } from "./row-provider.mjs";
5
6
  export {
6
7
  ReportingGcsFenceError,
7
8
  createGcsReportingManagedDeliveryAdapterV1,
8
9
  createGcsReportingObjectFenceV1,
9
10
  createGcsReportingReferenceResolverV1,
10
11
  createGcsReportingResourceReaderV1,
12
+ createGcsReportingRowObjectProviderV1,
11
13
  isReportingGcsFenceError
12
14
  };
@@ -0,0 +1,32 @@
1
+ import type { BucketMetadata, Storage } from '@google-cloud/storage';
2
+ import type { ReportingRowObjectProviderV1 } from '../ledger/row-storage-object.mjs';
3
+ export interface CreateGcsReportingRowObjectProviderOptionsV1 {
4
+ /** Official client used by bindings without a `credentialRef`. */
5
+ storage?: Storage;
6
+ /**
7
+ * Official clients keyed by `credentialRef`. This map is the closed set of
8
+ * references a binding may name; an unknown reference fails `UNSAFE_BINDING`.
9
+ */
10
+ clients?: Readonly<Record<string, Storage>>;
11
+ }
12
+ /**
13
+ * Row-binding bucket policy (shared persistence spec §3.4). Unlike the Managed
14
+ * Delivery probe, versioning, soft delete and retention are allowed as
15
+ * backstops. Refused: buckets without uniform bucket-level access or enforced
16
+ * public access prevention, and any lifecycle `Delete` rule that can match a
17
+ * live object under the binding prefix (no prefix filter, or a prefix that
18
+ * overlaps it). Rules limited to noncurrent versions are allowed.
19
+ */
20
+ export declare function assertGcsReportingRowBucketPolicyV1(metadata: BucketMetadata, prefix: string): void;
21
+ /**
22
+ * Google Cloud Storage row-object provider (`@adcp/sdk/reporting/gcs`).
23
+ *
24
+ * Inject official `Storage` clients with host-owned, keyless credentials.
25
+ * Bindings use `location: { bucket }`; `credentialRef` selects an injected
26
+ * client. Writes are single-request uploads with `ifGenerationMatch: 0`, so an
27
+ * existing object is never replaced; the recorded native version is the
28
+ * object generation, and reads and deletes pin it. Objects are stored without
29
+ * `Content-Encoding`, and reads request raw stored bytes, so GCS never
30
+ * transcodes them.
31
+ */
32
+ export declare function createGcsReportingRowObjectProviderV1(options: CreateGcsReportingRowObjectProviderOptionsV1): ReportingRowObjectProviderV1;
@@ -0,0 +1,32 @@
1
+ import type { BucketMetadata, Storage } from '@google-cloud/storage';
2
+ import type { ReportingRowObjectProviderV1 } from '../ledger/row-storage-object';
3
+ export interface CreateGcsReportingRowObjectProviderOptionsV1 {
4
+ /** Official client used by bindings without a `credentialRef`. */
5
+ storage?: Storage;
6
+ /**
7
+ * Official clients keyed by `credentialRef`. This map is the closed set of
8
+ * references a binding may name; an unknown reference fails `UNSAFE_BINDING`.
9
+ */
10
+ clients?: Readonly<Record<string, Storage>>;
11
+ }
12
+ /**
13
+ * Row-binding bucket policy (shared persistence spec §3.4). Unlike the Managed
14
+ * Delivery probe, versioning, soft delete and retention are allowed as
15
+ * backstops. Refused: buckets without uniform bucket-level access or enforced
16
+ * public access prevention, and any lifecycle `Delete` rule that can match a
17
+ * live object under the binding prefix (no prefix filter, or a prefix that
18
+ * overlaps it). Rules limited to noncurrent versions are allowed.
19
+ */
20
+ export declare function assertGcsReportingRowBucketPolicyV1(metadata: BucketMetadata, prefix: string): void;
21
+ /**
22
+ * Google Cloud Storage row-object provider (`@adcp/sdk/reporting/gcs`).
23
+ *
24
+ * Inject official `Storage` clients with host-owned, keyless credentials.
25
+ * Bindings use `location: { bucket }`; `credentialRef` selects an injected
26
+ * client. Writes are single-request uploads with `ifGenerationMatch: 0`, so an
27
+ * existing object is never replaced; the recorded native version is the
28
+ * object generation, and reads and deletes pin it. Objects are stored without
29
+ * `Content-Encoding`, and reads request raw stored bytes, so GCS never
30
+ * transcodes them.
31
+ */
32
+ export declare function createGcsReportingRowObjectProviderV1(options: CreateGcsReportingRowObjectProviderOptionsV1): ReportingRowObjectProviderV1;