@pam-ai/pam-ordo-contracts 3.28.0 → 3.30.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.
@@ -1,4 +1,4 @@
1
- import type { ConversationSearchMatch, MentionRef, ResolveMentionResult, SearchInboxContactsParams } from './index.js';
1
+ import type { ConversationSearchMatch, MentionRef, ResolveMentionResult, SearchInboxContactsParams, SendInboxMessageCommand } from './index.js';
2
2
  type Assert<T extends true> = T;
3
3
  type Accepts<Value, Shape> = Value extends Shape ? true : false;
4
4
  type Rejects<Value, Shape> = Value extends Shape ? false : true;
@@ -148,5 +148,41 @@ export type ConversationSearchMatchInvariants = [
148
148
  facets: [];
149
149
  }, ConversationSearchMatch>>
150
150
  ];
151
+ /**
152
+ * A send carries words, media, or both — and DASH-342 made the first optional,
153
+ * which is the change that needs guarding. `body` alone still sends, media
154
+ * alone now sends, and neither is not a message.
155
+ */
156
+ type SendBase = {
157
+ operationId: 'op-1';
158
+ clientOrgId: 'rooftop-1';
159
+ customer: never;
160
+ conversationId: null;
161
+ ownershipDisposition: never;
162
+ };
163
+ type Attachment = {
164
+ storageKey: 'ordo/rooftop-1/conversation-1/1757700000000-6f1c.jpg';
165
+ contentType: 'image/jpeg';
166
+ };
167
+ export type SendInboxMessageCommandInvariants = [
168
+ Assert<Accepts<SendBase & {
169
+ body: 'Your van is ready.';
170
+ }, SendInboxMessageCommand>>,
171
+ Assert<Accepts<SendBase & {
172
+ attachments: [Attachment];
173
+ }, SendInboxMessageCommand>>,
174
+ Assert<Accepts<SendBase & {
175
+ body: 'Here it is.';
176
+ attachments: [Attachment];
177
+ }, SendInboxMessageCommand>>,
178
+ Assert<Rejects<SendBase, SendInboxMessageCommand>>,
179
+ Assert<Rejects<SendBase & {
180
+ attachments: [];
181
+ }, SendInboxMessageCommand>>,
182
+ Assert<Rejects<SendBase & {
183
+ body: 'Hello';
184
+ attachments: [];
185
+ }, SendInboxMessageCommand>>
186
+ ];
151
187
  export {};
152
188
  //# sourceMappingURL=contract-invariants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract-invariants.d.ts","sourceRoot":"","sources":["../src/contract-invariants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract-invariants.d.ts","sourceRoot":"","sources":["../src/contract-invariants.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"contract-invariants.js","sourceRoot":"","sources":["../src/contract-invariants.ts"],"names":[],"mappings":"AAgGA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAmB;IACjD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"contract-invariants.js","sourceRoot":"","sources":["../src/contract-invariants.ts"],"names":[],"mappings":"AAiGA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAmB;IACjD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC"}
@@ -178,6 +178,30 @@ export interface paths {
178
178
  patch?: never;
179
179
  trace?: never;
180
180
  };
181
+ "/v1/inbox/conversations/{conversationId}/interactions/{interactionId}/attachments/{attachmentId}/url": {
182
+ parameters: {
183
+ query?: never;
184
+ header?: never;
185
+ path?: never;
186
+ cookie?: never;
187
+ };
188
+ /**
189
+ * Mint a short-lived URL for one attachment's bytes
190
+ * @description Exchange an attachment identifier for a URL a browser can fetch.
191
+ * WHY THIS IS NOT ON THE INTERACTION READ. A Conversation's detail read returns every Interaction it has, and hydrates bodies under a budget it can exhaust. Minting a storage credential for every attachment on every one of those reads would spend that budget on media nobody scrolls to, and would put an expiring secret inside a response a client is entitled to hold. So the attachment travels with the Interaction and the credential is asked for separately, once, by a reader that is about to show it.
192
+ * ADDRESSED THROUGH ITS CONVERSATION because that is what authorizes it. The same visibility rule as the Conversation detail read applies: a reader who cannot see the Conversation cannot mint a URL for anything inside it, and the attachment identifier alone is not a grant.
193
+ * NOT A REDIRECT TO THE BYTES. It returns the URL as data so a client can see the expiry, decide whether to re-read, and fetch on its own terms — rather than following a redirect it cannot inspect from an `img` tag.
194
+ * EXPECT TO CALL IT AGAIN. The URL lapses; the attachment does not. A client that has held one past `expiresAt`, or that is refused by the storage host, re-reads here rather than reporting a failure.
195
+ */
196
+ get: operations["getInboxInteractionAttachmentUrl"];
197
+ put?: never;
198
+ post?: never;
199
+ delete?: never;
200
+ options?: never;
201
+ head?: never;
202
+ patch?: never;
203
+ trace?: never;
204
+ };
181
205
  "/v1/inbox/contacts": {
182
206
  parameters: {
183
207
  query?: never;
@@ -1400,8 +1424,68 @@ export interface components {
1400
1424
  /** Format: date-time */
1401
1425
  occurredAt: string;
1402
1426
  body?: components["schemas"]["HydratedText"] | null;
1427
+ /**
1428
+ * @description Media carried by this Interaction — the photo of the damage, the insurance document, the voice note. Before this field an Interaction could say what was written and never that anything was attached, so a reader saw an empty bubble where a Customer had sent a picture.
1429
+ * ABSENT AND EMPTY MEAN THE SAME THING and a consumer must not distinguish them. Optional only to keep this addition a minor version; a producer that predates DASH-342 simply omits it.
1430
+ * AN UNATTACHED INTERACTION IS THE ORDINARY CASE. Most SMS carries no media, and every call, RO event and internal comment carries none by construction, so an empty list is not a hydration gap. A gap is reported the way every other one is, on the attachment's own `availability`.
1431
+ * CARRIES NO URL, deliberately. Minting a fetch credential for every attachment on every read spends the hydration budget on media nobody scrolls to, and bakes an expiry into a response a client may cache. A reader asks for one attachment's URL when it is about to show that attachment.
1432
+ */
1433
+ attachments?: components["schemas"]["InteractionAttachmentV1"][];
1403
1434
  availability: components["schemas"]["Availability"];
1404
1435
  };
1436
+ /**
1437
+ * @description One piece of media an advisor is sending, named by the handle its upload issued rather than carried inline.
1438
+ * A HANDLE, NEVER BYTES. The dashboard uploads to storage under a key the server minted from the authenticated session, and this command names that key. Ordo never receives the bytes, never signs for them and never inspects them; it authorizes the send and passes the reference on. A command that carried media inline would put megabytes through a fingerprinted, replayable command path, and would put the decision about what a handset can display in the one place that knows least about it.
1439
+ * THE ROOFTOP IS PROVED FROM THE KEY, NOT FROM THE CALLER. A storage key is supplied by a client, so a producer must confirm the key belongs to the rooftop the caller is authorized for before it is used. Accepting it on trust would let a caller name another dealership's object and have it delivered on their behalf.
1440
+ * THE DECLARED TYPE IS A HINT. The messaging platform conforms media to what a carrier will deliver, and decides from the bytes it holds rather than from what a browser claimed at pick time.
1441
+ */
1442
+ OutboundAttachmentV1: {
1443
+ /** @description Opaque reference to the uploaded object, exactly as the upload grant issued it. Not a URL, and not addressable by a browser. */
1444
+ storageKey: string;
1445
+ /** @description What the client believes it uploaded. Required here, unlike its inbound sibling, because a sender always knows what it chose — but still advisory, and never the basis for a delivery decision. */
1446
+ contentType: string;
1447
+ /** @description The name to present to the reader, when the client captured one. */
1448
+ fileName?: string | null;
1449
+ /** @description Size of the uploaded original, when known. Advisory: it describes what was uploaded, not what will travel, because conforming changes it. */
1450
+ byteSize?: number | null;
1451
+ };
1452
+ /**
1453
+ * @description One piece of media on an Interaction, described well enough to render a card for it without fetching a byte.
1454
+ * THE KIND IS PUBLISHED RATHER THAN DERIVED. A consumer that classifies media by testing whether its content type starts with `image/` shows a download chip for a photograph the moment a provider omits the type or sends `application/octet-stream`, which it does routinely. The system that mastered the record knows the filename and the source as well as the declared type, so it decides once, here, and every consumer agrees.
1455
+ */
1456
+ InteractionAttachmentV1: {
1457
+ /**
1458
+ * Format: uuid
1459
+ * @description Stable identifier for this attachment, addressable at the attachment-url read. Stable across reads of the same Interaction so a client may cache against it, and opaque, so the storage key it resolves to is never published to a browser.
1460
+ */
1461
+ id: string;
1462
+ /**
1463
+ * @description How to present it. FILE is the honest answer for anything with no inline player — a PDF, a contact card — and also for media whose type could not be determined, which renders as a named file rather than as a broken image.
1464
+ * @enum {string}
1465
+ */
1466
+ kind: "IMAGE" | "VIDEO" | "AUDIO" | "FILE";
1467
+ /** @description The declared MIME type, or null when the source recorded none. That null is why `kind` exists, and `kind` is not derived from this. */
1468
+ contentType?: string | null;
1469
+ /** @description Original filename, when the source recorded one. */
1470
+ fileName?: string | null;
1471
+ /** @description Size in bytes, when the source recorded one. */
1472
+ byteSize?: number | null;
1473
+ /** @description Whether this attachment can currently be fetched. One whose stored object has aged out, or whose metadata predates the storage key, is present and unavailable rather than absent: a reader must be able to say that something was sent and cannot be shown, which is a different thing from nothing having been sent. */
1474
+ availability: components["schemas"]["Availability"];
1475
+ };
1476
+ /**
1477
+ * @description A short-lived authorized URL for one attachment's bytes.
1478
+ * DELIBERATELY SHORT-LIVED, AND DELIBERATELY NOT PART OF THE INTERACTION READ. The URL is a credential: whoever holds it can fetch the bytes without passing back through this API. A client reads it when it is about to show the attachment rather than storing it, and treats a rejection from the storage host as "ask again" rather than as an error to show somebody.
1479
+ */
1480
+ InteractionAttachmentUrlV1: {
1481
+ /** @description Fetch the bytes from here. Do not persist it. */
1482
+ url: string;
1483
+ /**
1484
+ * Format: date-time
1485
+ * @description When the URL stops working. Published so a client can re-read before it lapses rather than discovering the expiry as a failed image load.
1486
+ */
1487
+ expiresAt: string;
1488
+ };
1405
1489
  MentionRef: {
1406
1490
  /** Format: uuid */
1407
1491
  id: string;
@@ -1721,6 +1805,8 @@ export interface components {
1721
1805
  senderUserExternalId?: string;
1722
1806
  /** @enum {string} */
1723
1807
  lineType?: "pam" | "rooftop" | "advisor";
1808
+ /** @description Verified recipient advisor User for an inbound Customer SMS to an advisor-owned line. This is not the sender and must be resolved within clientOrgId before routing. */
1809
+ recipientUserExternalId?: string;
1724
1810
  dynamoLocator?: components["schemas"]["ProducerDynamoLocatorV1"];
1725
1811
  };
1726
1812
  ProducerRepairOrderTransitionV1: {
@@ -2223,6 +2309,11 @@ export interface components {
2223
2309
  * @enum {string}
2224
2310
  */
2225
2311
  OutboundMessageOwnershipDisposition: "PRESERVE" | "TAKE";
2312
+ /**
2313
+ * @description Send a message to a Customer, with words, media, or both.
2314
+ * EITHER MAY BE ABSENT, BUT NOT BOTH, which the `anyOf` below states. A message carrying only a photograph is an ordinary thing to send and was previously unexpressible, because `body` was required; a message carrying neither is not a message.
2315
+ * OMIT, NEVER EMPTY. A producer fingerprints the parsed command to make a retry idempotent, and an absent field and an empty one do not hash alike. So `body` has no empty form and `attachments` has no empty form — a send with no media omits the field rather than passing `[]`, and the schema enforces it so the two spellings can never diverge in the wild.
2316
+ */
2226
2317
  SendInboxMessageCommand: {
2227
2318
  operationId: string;
2228
2319
  clientOrgId: string;
@@ -2232,7 +2323,12 @@ export interface components {
2232
2323
  * @description The Conversation observed by the caller, or null when contact search reported NONE. Ordo revalidates it against the canonical Customer and safely finds or creates the Conversation under its tenant lock.
2233
2324
  */
2234
2325
  conversationId: string | null;
2235
- body: string;
2326
+ body?: string;
2327
+ /**
2328
+ * @description Media to send with this message, in the order the reader should see it.
2329
+ * TEN, BECAUSE THAT IS WHAT A COMPOSER SHOULD OFFER, not because the wire cannot carry more. How many provider messages it takes to deliver these is the messaging platform's business, and a set too large for one is split rather than refused — but it remains ONE Interaction carrying N attachments, whatever the transport did.
2330
+ */
2331
+ attachments?: components["schemas"]["OutboundAttachmentV1"][];
2236
2332
  ownershipDisposition: components["schemas"]["OutboundMessageOwnershipDisposition"];
2237
2333
  };
2238
2334
  /** @enum {string} */
@@ -2377,6 +2473,16 @@ export interface components {
2377
2473
  "application/json": components["schemas"]["CommandResult"];
2378
2474
  };
2379
2475
  };
2476
+ /** @description A short-lived authorized URL for the attachment's bytes. */
2477
+ InteractionAttachmentUrlIssued: {
2478
+ headers: {
2479
+ "x-correlation-id": components["headers"]["CorrelationId"];
2480
+ [name: string]: unknown;
2481
+ };
2482
+ content: {
2483
+ "application/json": components["schemas"]["InteractionAttachmentUrlV1"];
2484
+ };
2485
+ };
2380
2486
  /** @description Applied or idempotently replayed internal-comment result. */
2381
2487
  InternalCommentApplied: {
2382
2488
  headers: {
@@ -2544,6 +2650,8 @@ export interface components {
2544
2650
  /** @description Authorized rooftop context. For commands this value must match body.clientOrgId; neither value is trusted without DASH-233 resolution. */
2545
2651
  ClientOrgId: string;
2546
2652
  ConversationId: string;
2653
+ InteractionId: string;
2654
+ AttachmentId: string;
2547
2655
  StaffUserId: string;
2548
2656
  };
2549
2657
  requestBodies: {
@@ -3035,6 +3143,32 @@ export interface operations {
3035
3143
  503: components["responses"]["ServiceUnavailable"];
3036
3144
  };
3037
3145
  };
3146
+ getInboxInteractionAttachmentUrl: {
3147
+ parameters: {
3148
+ query?: never;
3149
+ header: {
3150
+ /** @description Authorized rooftop context. For commands this value must match body.clientOrgId; neither value is trusted without DASH-233 resolution. */
3151
+ "x-client-org-id": components["parameters"]["ClientOrgId"];
3152
+ };
3153
+ path: {
3154
+ conversationId: components["parameters"]["ConversationId"];
3155
+ interactionId: components["parameters"]["InteractionId"];
3156
+ attachmentId: components["parameters"]["AttachmentId"];
3157
+ };
3158
+ cookie?: never;
3159
+ };
3160
+ requestBody?: never;
3161
+ responses: {
3162
+ 200: components["responses"]["InteractionAttachmentUrlIssued"];
3163
+ 400: components["responses"]["BadRequest"];
3164
+ 401: components["responses"]["Unauthorized"];
3165
+ 403: components["responses"]["Forbidden"];
3166
+ 404: components["responses"]["NotFound"];
3167
+ 500: components["responses"]["InternalError"];
3168
+ 501: components["responses"]["NotImplemented"];
3169
+ 503: components["responses"]["ServiceUnavailable"];
3170
+ };
3171
+ };
3038
3172
  searchInboxContacts: {
3039
3173
  parameters: {
3040
3174
  query?: {