@openwop/openwop 1.3.0 → 1.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.
package/src/types.ts CHANGED
@@ -75,6 +75,68 @@ export interface Capabilities {
75
75
  * host-defined / unbounded. */
76
76
  maxParticipants?: number;
77
77
  };
78
+ /** RFC 0100. Host exposes itself as an A2A (Agent2Agent) agent. `supported`
79
+ * alone ⇒ the synchronous `message/send` → poll `tasks/get` round-trip
80
+ * (`a2a-integration.md`). The optional flags gate the RFC 0100 async/durable
81
+ * additions. Absent ⇒ no A2A advertisement. */
82
+ a2a?: {
83
+ /** Host exposes itself as an A2A agent. */
84
+ supported: boolean;
85
+ /** A2A 0.3 well-known agent card URL (`/.well-known/agent-card.json`). */
86
+ agentCardUrl: string;
87
+ /** `message/stream` + `tasks/resubscribe` (RFC 0100 §3 resubscribe re-attach). */
88
+ streaming?: boolean;
89
+ /** A2A push-notification config (RFC 0100 §4); a caller-supplied
90
+ * `pushConfig.url` is SSRF-validated (`a2a-push-egress-ssrf`). */
91
+ pushNotifications?: boolean;
92
+ /** RFC 0100 §2. Host persists the projected `A2ATaskState` per backing run;
93
+ * `tasks/get` returns live state after disconnect. Absent/false ⇒
94
+ * synchronous round-trip only. */
95
+ durableTasks?: boolean;
96
+ };
97
+ /** RFC 0109. Host stamps the optional non-secret `agent.model`
98
+ * (`{ provider, model }`) on `role:'agent'` conversation turns, recording
99
+ * which model produced the turn (read verbatim on `:fork`). Absent ⇒ no
100
+ * provenance; the host omits `agent.model`. */
101
+ conversationTurnModelProvenance?: {
102
+ /** Toggle — `true` when the host stamps `agent.model`. */
103
+ supported: boolean;
104
+ };
105
+ /** RFC 0110. Host emits the ephemeral `channel.presence` RunEvent (online +
106
+ * per-member typing) for `type:'channel'` conversations. Presence is live
107
+ * state — the host never persists it to the replayable event log and it
108
+ * never affects replay / `:fork`. Membership-gated (default-deny, CTI-1).
109
+ * Absent ⇒ no presence. */
110
+ channelPresence?: {
111
+ /** Toggle — `true` when the host emits `channel.presence`. */
112
+ supported: boolean;
113
+ };
114
+ /** Capability advertisement for the host AI-proxy (`aiProviders` in
115
+ * `capabilities.md`). Absent ⇒ the host advertises no AI-proxy surface.
116
+ * Carries BYOK policy plus the RFC 0105/0106/0108 self-hosted / speech /
117
+ * real-time-voice flags. The wire object MAY carry additional fields
118
+ * (`input`, `authModes`, `maxInlineMediaBytes`) not modeled here. */
119
+ aiProviders?: AIProvidersCapability;
120
+ /** RFC 0104. Portable HITL approver-routing advertisement. When
121
+ * `approverRouting.supported`, the host honors the OPTIONAL, ADVISORY
122
+ * `approverGroupRefs` / `approverRoleRefs` / `audience` fields on the
123
+ * `kind:'approval'` interrupt payload (the SDK carries the interrupt
124
+ * payload opaquely as `data`, so those advisory fields ride that opaque
125
+ * object), resolves the advertised `refKinds` against its own RBAC, and
126
+ * ENFORCES eligibility at resolve time. Absent ⇒ the host ignores them. */
127
+ interrupt?: {
128
+ approverRouting?: {
129
+ /** Host honors the RFC 0104 approver-routing fields. */
130
+ supported: boolean;
131
+ /** Ref kinds the host actually resolves: `'group'` ⇒ honors
132
+ * `approverGroupRefs`, `'role'` ⇒ honors `approverRoleRefs`. Absent ⇒
133
+ * advisory-only passthrough (the host resolves neither). */
134
+ refKinds?: readonly ('group' | 'role')[];
135
+ /** Host honors the `audience` notification-targeting override.
136
+ * Absent/`false` ⇒ the host notifies the resolved eligible union. */
137
+ audience?: boolean;
138
+ };
139
+ };
78
140
  extensions?: Record<string, unknown>;
79
141
  // Network-handshake superset (all `(future)` fields per capabilities.md)
80
142
  implementation?: { name?: string; version?: string; vendor?: string };
@@ -520,16 +582,63 @@ export type AIPolicyDenyReason =
520
582
  * that don't enforce per-provider policies.
521
583
  */
522
584
  export interface AIProvidersCapability {
523
- /** Provider ids the host's AI-proxy can route to. */
524
- supported: readonly string[];
585
+ /** Provider ids the host's AI-proxy can route to. Optional per
586
+ * `capabilities.schema.json` (the `aiProviders` block has no required
587
+ * fields); a host advertising the block normally lists them. */
588
+ supported?: readonly string[];
525
589
  /** Subset of `supported` for which BYOK is permitted. */
526
- byok: readonly string[];
590
+ byok?: readonly string[];
527
591
  /** Optional 4-mode policy enforcement advertisement. */
528
592
  policies?: {
529
593
  modes: readonly AIPolicyMode[];
530
594
  scopes?: readonly string[];
531
595
  errorCode?: string;
532
596
  };
597
+ /** RFC 0108. Subset of `supported` whose entries are operator-/tenant-
598
+ * configured OpenAI-compatible endpoints (Ollama / vLLM / LM Studio / any
599
+ * `/v1/chat/completions`-compatible server), as opposed to a host-managed
600
+ * connection to a known public vendor. Each entry also appears in
601
+ * `supported` and MAY also appear in `byok`. The id is an OPAQUE label that
602
+ * MUST NOT encode the endpoint's network location (RFC 0108 §A.3), and a
603
+ * client MUST NOT infer model capabilities from it (§B) — the authoritative
604
+ * sources are `modelCapabilities.advertised[]` and `aiProviders.input`. */
605
+ selfHosted?: readonly string[];
606
+ /** RFC 0105. Present (value MUST be `'supported'`) ⇒ the host exposes speech
607
+ * synthesis via the host-side `ctx.callSpeechSynthesizer`. Absent ⇒ no TTS
608
+ * (a call is rejected with `speech_synthesis_unsupported`). */
609
+ speechSynthesis?: 'supported';
610
+ /** RFC 0106. Optional real-time voice profile. Absent ⇒ no live voice. The
611
+ * sub-flags gate streaming STT / chunked TTS and turn-taking; the host
612
+ * enforces that `turnDetection`/`bargeIn` require `transcription`. */
613
+ realtimeVoice?: {
614
+ /** Present (`'streaming'`) ⇒ host exposes streaming `ctx.callTranscriber`. */
615
+ transcription?: 'streaming';
616
+ /** Present (`'streaming'`) ⇒ `ctx.callSpeechSynthesizer` honors `stream:true`.
617
+ * Requires `aiProviders.speechSynthesis: 'supported'`. */
618
+ synthesis?: 'streaming';
619
+ /** Endpointing sophistication; requires `transcription`. */
620
+ turnDetection?: 'vad' | 'semantic';
621
+ /** Present (`'supported'`) ⇒ host emits `voice.barge_in`/`voice.cancelled`
622
+ * on overlapping speech; requires `transcription`. */
623
+ bargeIn?: 'supported';
624
+ };
625
+ /** RFC 0116. Provider-scoped advert that the host honors the AI-envelope
626
+ * `generate` request's optional `cachePrefixId` (a tenant-namespaced,
627
+ * secret-free label) as a routing hint into the routed provider's
628
+ * server-side context cache. Absent ⇒ the host ignores `cachePrefixId`
629
+ * (no error). The cache MUST be keyed by `(resolved tenant, cachePrefixId)`
630
+ * (SECURITY invariant `prompt-prefix-cache-cross-tenant-isolation`) and a
631
+ * hit/miss MUST NOT change the recorded envelope or
632
+ * `provider.usage.inputTokens`/`outputTokens` (replay-invariant). NOT a
633
+ * universal claim — `providers` scopes it per routed provider. */
634
+ promptPrefixCache?: {
635
+ /** Whether the host honors `cachePrefixId`. */
636
+ supported: boolean;
637
+ /** Subset of `supported` for which `cachePrefixId` is honored (prefix
638
+ * caching is provider-specific, e.g. Anthropic ephemeral). A request
639
+ * whose routed provider is not listed has `cachePrefixId` ignored. */
640
+ providers?: readonly string[];
641
+ };
533
642
  }
534
643
 
535
644
  /**
@@ -787,6 +896,104 @@ export interface OutputChunkPayload {
787
896
  [key: string]: unknown;
788
897
  }
789
898
 
899
+ // ─── RFC 0106 voice.* run-event payloads ────────────────────────────────
900
+ // Mirror `run-event-payloads.schema.json`. These events are emitted on the
901
+ // durable event log by the host-side `ctx.callTranscriber` /
902
+ // `ctx.callSpeechSynthesizer(stream:true)` methods (out of client-SDK scope);
903
+ // a client tails them off the run event stream.
904
+
905
+ /** `voice.speech_start` (RFC 0106). Host detected start of speech. */
906
+ export interface VoiceSpeechStartPayload {
907
+ /** Milliseconds since the turn/session epoch. */
908
+ atMs: number;
909
+ [key: string]: unknown;
910
+ }
911
+
912
+ /** `voice.transcript` (RFC 0106). An interim or final transcript fragment.
913
+ * `contentTrust` is REQUIRED and always `'untrusted'` — live transcript is
914
+ * untrusted ingress (`voice-transcript-untrusted`); consumers MUST NOT
915
+ * promote it to higher authority. */
916
+ export interface VoiceTranscriptPayload {
917
+ text: string;
918
+ /** `true` once the fragment is finalized (committed at `voice.turn_commit`). */
919
+ isFinal: boolean;
920
+ atMs: number;
921
+ /** Always `'untrusted'`. */
922
+ contentTrust: 'untrusted';
923
+ /** Stable prefix carried across interim revisions. */
924
+ committedPrefix?: string;
925
+ /** Provider-formatted variant (punctuation/casing). */
926
+ formatted?: string;
927
+ /** Provider stability score for an interim fragment. */
928
+ stability?: number;
929
+ [key: string]: unknown;
930
+ }
931
+
932
+ /** `voice.endpoint_candidate` (RFC 0106). A `semantic` turn detector's
933
+ * candidate end-of-turn, distinct from the committed `voice.turn_commit`. */
934
+ export interface VoiceEndpointCandidatePayload {
935
+ atMs: number;
936
+ /** Detector confidence in the candidate endpoint. */
937
+ confidence?: number;
938
+ [key: string]: unknown;
939
+ }
940
+
941
+ /** `voice.turn_commit` (RFC 0106). The turn is committed; `finalText` is the
942
+ * settled transcript the `ctx.callTranscriber` Promise resolves with. */
943
+ export interface VoiceTurnCommitPayload {
944
+ atMs: number;
945
+ finalText: string;
946
+ [key: string]: unknown;
947
+ }
948
+
949
+ /** `voice.synthesis_chunk` (RFC 0106). Metadata for a streamed-synthesis
950
+ * clause-boundary chunk; bytes ride `url`/`streamRef` (or inline `base64`
951
+ * only under the host cap), never inlined past the cap. */
952
+ export interface VoiceSynthesisChunkPayload {
953
+ /** Monotonic chunk sequence within the synthesis. */
954
+ seq: number;
955
+ mimeType: string;
956
+ /** Host-served URL for the chunk bytes. */
957
+ url?: string;
958
+ /** Live-conduit handle for the chunk bytes. */
959
+ streamRef?: string;
960
+ /** Inline bytes — present only under the host's inline cap. */
961
+ base64?: string;
962
+ durationMs?: number;
963
+ /** `true` for the final chunk of the synthesis. */
964
+ final?: boolean;
965
+ [key: string]: unknown;
966
+ }
967
+
968
+ /** `voice.barge_in` (RFC 0106). Overlapping speech detected during playback. */
969
+ export interface VoiceBargeInPayload {
970
+ atMs: number;
971
+ [key: string]: unknown;
972
+ }
973
+
974
+ /** `voice.cancelled` (RFC 0106). Downstream work cancelled (e.g. after a
975
+ * barge-in); no synthesis chunk follows. */
976
+ export interface VoiceCancelledPayload {
977
+ atMs: number;
978
+ /** Host-defined cancellation reason. */
979
+ reason?: string;
980
+ [key: string]: unknown;
981
+ }
982
+
983
+ /** `channel.presence` (RFC 0110). EPHEMERAL online + typing presence for a
984
+ * `type:'channel'` conversation. Observable on the LIVE run-event stream
985
+ * only — the host MUST NOT persist it to the replayable event log, so it is
986
+ * ABSENT on replay / `POST /v1/runs/{runId}:fork`. Membership-gated: every
987
+ * ref is a current participant (opaque RFC 0041 subject refs, non-PII). */
988
+ export interface ChannelPresencePayload {
989
+ conversationId: string;
990
+ /** Subject refs of members currently present (subset of participants). */
991
+ present: readonly string[];
992
+ /** Subset of `present` currently typing (boolean-by-presence; no free text). */
993
+ typing?: readonly string[];
994
+ [key: string]: unknown;
995
+ }
996
+
790
997
  /** A `RunEventDoc` narrowed to a specific event-type discriminator +
791
998
  * payload shape. Returned by the `isAgent*` type guards in
792
999
  * `event-helpers.ts`. */
@@ -942,6 +1149,83 @@ export interface AIEnvelopeErrorPayload {
942
1149
  details?: Record<string, unknown>;
943
1150
  }
944
1151
 
1152
+ /**
1153
+ * Payload of the core `ui.a2ui-surface` envelope kind (RFC 0102 — A2UI
1154
+ * agent-authored interface surfaces, `schemas/envelopes/ui.a2ui-surface.schema.json`).
1155
+ * An advertised, optional core kind beside the `media.*` family: a declarative
1156
+ * interactive UI a consumer renders with native widgets, routing user actions
1157
+ * back **without executing agent-supplied code**.
1158
+ *
1159
+ * `surface` is the closed component tree, kept loose here (`Record<string,
1160
+ * unknown>`) — it is rendered by a dedicated A2UI renderer the SDK does not
1161
+ * provide, and matches the SDK convention of keeping complex nested shapes
1162
+ * structural (cf. `ClarificationRequestPayload.questions[].schema`).
1163
+ *
1164
+ * NOTE: the broader AI-envelope surface (`AIEnvelope`, `EnvelopeMeta`, the
1165
+ * universal payloads) is currently modeled only in this TypeScript SDK; the
1166
+ * Python and Go SDKs do not yet model AI envelopes. `A2UISurfacePayload`
1167
+ * therefore lands here only; cross-SDK AI-envelope modeling is a separate
1168
+ * follow-on (tracked in PARITY.md), not part of RFC 0102.
1169
+ */
1170
+ export interface A2UISurfacePayload {
1171
+ /** The A2UI catalog version the surface targets. A host-enumerated,
1172
+ * growing set (currently `'0.9.1'`); a consumer MUST refuse an unknown /
1173
+ * higher version with `unknown_schema_version`. Typed as `string` (not a
1174
+ * pinned literal) so the read-type stays forward-compatible as the host's
1175
+ * supported set grows; the consumer enforces refuse-unknown at runtime. */
1176
+ catalogVersion: string;
1177
+ /** The A2UI surface document — a closed component tree, self-contained and
1178
+ * renderable from the payload alone (never a live reference into an
1179
+ * external catalog). Kept structural; rendered by an A2UI renderer. */
1180
+ surface: Record<string, unknown>;
1181
+ /** OPTIONAL model reasoning (RFC 0030 §A), conventionally first. */
1182
+ reasoning?: string;
1183
+ }
1184
+
1185
+ /**
1186
+ * RFC 0114 — a single RFC 6902 (JSON-Patch) operation inside an
1187
+ * {@link A2uiSurfaceDeltaFrame}. The `test` op is deliberately EXCLUDED (a
1188
+ * fire-and-forget transport frame cannot act on a failed conditional);
1189
+ * `move`/`copy` are permitted but OPTIONAL for a host to emit.
1190
+ */
1191
+ export interface A2uiSurfacePatchOp {
1192
+ /** RFC 6902 operation. `test` is excluded by RFC 0114. */
1193
+ op: 'add' | 'remove' | 'replace' | 'move' | 'copy';
1194
+ /** RFC 6901 JSON-Pointer into the target surface. */
1195
+ path: string;
1196
+ /** RFC 6901 JSON-Pointer source for `move`/`copy`. */
1197
+ from?: string;
1198
+ /** The value for `add`/`replace`. Walked by the SR-1 redaction harness
1199
+ * exactly like a full-surface value. */
1200
+ value?: unknown;
1201
+ }
1202
+
1203
+ /**
1204
+ * RFC 0114 — a HOST-SIDE TRANSPORT frame carrying an RFC 6902 delta over a
1205
+ * recorded `ui.a2ui-surface` envelope ({@link A2UISurfacePayload}). Delivered
1206
+ * ONLY over the run event stream (`GET /v1/runs/{runId}/events`) to a subscriber
1207
+ * that negotiated `?a2uiDelta=1`; every other consumer (the event-log read,
1208
+ * replay, `:fork`, any non-negotiating subscriber) receives the materialized
1209
+ * FULL surface. This is NOT a recorded-envelope shape — the recorded
1210
+ * `ui.a2ui-surface` payload is unchanged and always full. The consumer applies
1211
+ * `patch` to the surface last delivered under `surfaceRef`, then re-validates
1212
+ * the result against the closed `catalogVersion` catalog before render; on any
1213
+ * apply/validation failure it falls back fail-closed and the host
1214
+ * re-materializes the full surface. Per
1215
+ * `schemas/a2ui-surface-delta-frame.schema.json`. A host advertises support via
1216
+ * the `a2uiSurface.deltaTransport` capability flag.
1217
+ */
1218
+ export interface A2uiSurfaceDeltaFrame {
1219
+ /** The recorded `ui.a2ui-surface` envelope id this delta patches. */
1220
+ surfaceRef: string;
1221
+ /** MUST equal the referenced full surface's `catalogVersion`; a
1222
+ * catalog-version change MUST start from a fresh full surface. */
1223
+ catalogVersion: string;
1224
+ /** A non-empty RFC 6902 document applied over the surface last delivered
1225
+ * under `surfaceRef`. */
1226
+ patch: A2uiSurfacePatchOp[];
1227
+ }
1228
+
945
1229
  // ── RFC 0027 + RFC 0028 — Prompt library (spec/v1/prompts.md) ──
946
1230
 
947
1231
  /**
@@ -1371,6 +1655,25 @@ export interface ToolDescriptor {
1371
1655
  latencyHint?: string;
1372
1656
  }
1373
1657
 
1658
+ /**
1659
+ * RFC 0112 — a compact, model-facing projection of `ToolDescriptor`, returned by
1660
+ * `GET /v1/tools?view=compact` (envelope `{ tools: CompactToolDescriptor[] }`) +
1661
+ * `GET /v1/tools/{toolId}?view=compact` when the host advertises
1662
+ * `capabilities.toolCatalog.compactView`. The heavy descriptor fields
1663
+ * (`outputSchema`/`auth`/`egress`/`approval`/`replayPolicy`/`costHint`/`latencyHint`)
1664
+ * are dropped, and any `inputSchema` is bounded to the compact structural subset
1665
+ * (top-level `type: "object"` with `properties`; no
1666
+ * `$ref`/`oneOf`/`allOf`/`anyOf`/`not`/`patternProperties`/`dependentSchemas`).
1667
+ */
1668
+ export interface CompactToolDescriptor {
1669
+ toolId: string;
1670
+ source: 'node-pack' | 'workflow' | 'mcp' | 'connector' | 'host-extension';
1671
+ safetyTier: 'pure' | 'read' | 'write' | 'exec';
1672
+ title?: string;
1673
+ description?: string;
1674
+ inputSchema?: Record<string, unknown>;
1675
+ }
1676
+
1374
1677
  /**
1375
1678
  * RFC 0082 §C — a per-(agentId, version) deployment record, returned by
1376
1679
  * `client.agents.listDeployments` / `transitionDeployment`. Host-runtime state
@@ -1401,3 +1704,96 @@ export interface AgentDeploymentTransition {
1401
1704
  evalRunId?: string;
1402
1705
  reason?: string;
1403
1706
  }
1707
+
1708
+ // ── RFC 0103 Localized content surface (spec/v1/localized-content.md) ──
1709
+ // Mirror schemas/localized-content-*.schema.json. Host-defined structured
1710
+ // content (`data`, `localizations`, `seo`) is kept open per the schemas
1711
+ // (additionalProperties: true) — it is the host's content model, not a
1712
+ // fixed wire shape.
1713
+
1714
+ export type LocalizedContentStatus = 'draft' | 'published';
1715
+
1716
+ /** A content page record (`schemas/localized-content-page.schema.json`). */
1717
+ export interface LocalizedContentPage {
1718
+ pageId: string;
1719
+ slug: string;
1720
+ /** Human-facing page name (admin/authoring label). */
1721
+ name: string;
1722
+ status: LocalizedContentStatus;
1723
+ /** Ordered section ids composing the page. */
1724
+ sectionOrder: readonly string[];
1725
+ /** Open SEO metadata object (host-defined). */
1726
+ seo?: Record<string, unknown>;
1727
+ }
1728
+
1729
+ /** A content section record (`schemas/localized-content-section.schema.json`).
1730
+ * A section is one record: a base `data` payload + a sparse `localizations`
1731
+ * map (BCP-47 keys, never the base locale). */
1732
+ export interface LocalizedContentSection {
1733
+ sectionId: string;
1734
+ sectionType: string;
1735
+ /** Base-locale field payload (host-defined open shape). */
1736
+ data: Record<string, unknown>;
1737
+ /** Per-locale sparse field overlays, keyed by BCP-47 locale. */
1738
+ localizations: Record<string, Record<string, unknown>>;
1739
+ status: LocalizedContentStatus;
1740
+ enabled: boolean;
1741
+ order: number;
1742
+ }
1743
+
1744
+ /** Public delivery response for `GET /v1/content/pages/{slug}` — the negotiated
1745
+ * locale's resolved page + sections (the RFC 0103 `resolveSection` merge is
1746
+ * applied host-side: exact → language-family → base). */
1747
+ export interface LocalizedContentPageResponse {
1748
+ /** Response schema version marker (e.g. `"1"`). */
1749
+ version: string;
1750
+ generatedAt: string;
1751
+ /** The negotiated locale this response was resolved for. */
1752
+ locale: string;
1753
+ slug: string;
1754
+ page: LocalizedContentPage;
1755
+ sections: readonly LocalizedContentSection[];
1756
+ }
1757
+
1758
+ /** Language settings (`schemas/localized-content-language-settings.schema.json`). */
1759
+ export interface LocalizedContentLanguageSettings {
1760
+ baseLocale: string;
1761
+ supportedLocales: readonly string[];
1762
+ autoTranslateOnPublish: boolean;
1763
+ }
1764
+
1765
+ /** Request body for `PUT /v1/content/pages/{pageId}/sections/{sectionId}`. */
1766
+ export interface PutContentSectionRequest {
1767
+ /** Target locale; the baseLocale upserts `data`, else `localizations[locale]`. */
1768
+ locale: string;
1769
+ /** The field overlay for the target locale (host-defined open shape). */
1770
+ data: Record<string, unknown>;
1771
+ }
1772
+
1773
+ // ── RFC 0099 Trigger subscription registration (spec/v1/trigger-bridge.md §F) ──
1774
+
1775
+ /** Registration body for `POST /v1/trigger-subscriptions`
1776
+ * (`schemas/trigger-subscription-registration.schema.json`). */
1777
+ export interface TriggerSubscriptionRegistration {
1778
+ /** External event source descriptor (host-defined: webhook / email / form …). */
1779
+ source: Record<string, unknown>;
1780
+ workflowId: string;
1781
+ dedupEnabled?: boolean;
1782
+ inputMapping?: Record<string, unknown>;
1783
+ retryPolicy?: Record<string, unknown>;
1784
+ verification?: Record<string, unknown>;
1785
+ }
1786
+
1787
+ /** The persisted trigger subscription the host assigns
1788
+ * (`schemas/trigger-subscription.schema.json`). Kept open beyond the
1789
+ * registration fields the host echoes back. */
1790
+ export type TriggerSubscription = Record<string, unknown>;
1791
+
1792
+ /** `201` response for `POST /v1/trigger-subscriptions`. `binding` carries the
1793
+ * source-specific wiring the caller needs (e.g. `{ ingestUrl,
1794
+ * secretFingerprint }` for webhook); the secret is returned ONCE at creation
1795
+ * (SR-1) — persist it, it is not retrievable again. */
1796
+ export interface CreateTriggerSubscriptionResponse {
1797
+ subscription: TriggerSubscription;
1798
+ binding: Record<string, unknown>;
1799
+ }