@fourier-labs/harbour-contracts 0.92.0 → 0.93.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,12 +1,12 @@
1
1
  {
2
2
  "schema": "harbour.contract-release/1.0",
3
- "repositoryVersion": "0.92.0.0",
4
- "publishVersion": "0.92.0",
5
- "publishTag": "v0.92.0",
6
- "schemasDigest": "sha256:5b6aede1f569d02bf976d5331c9e8eb1e657b062be28fb89565ff50acd105c5a",
3
+ "repositoryVersion": "0.93.0.0",
4
+ "publishVersion": "0.93.0",
5
+ "publishTag": "v0.93.0",
6
+ "schemasDigest": "sha256:9fe4dd0a739805bd2029674641576a428d728fa4cd17667e1f87538ab08e14e5",
7
7
  "aiFixturesDigest": "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6",
8
- "generatedGoDigest": "sha256:64d78d9952ac08558ad956eb4c923677a0691e6260743c0dbc367b57e59ea822",
9
- "generatedTypeScriptDigest": "sha256:a99c149dbeb2b081bd460b95df4d44e29cc95e2fe2c737f4b012b7449c0c94d3",
8
+ "generatedGoDigest": "sha256:ba1a5b846bd8b5352b117601634df3d7fdb0e66782a3bac220b2574254407102",
9
+ "generatedTypeScriptDigest": "sha256:68bd763bc5f48338e257c1f48d72542fb73a70f0b26758faaaebb546dc5752e3",
10
10
  "generatedExclusions": {
11
11
  "gen-go/contract_release.go": "contains the generated aggregate digests (self-reference)",
12
12
  "gen-ts/contract-release.ts": "contains the generated aggregate digests (self-reference)"
@@ -57,8 +57,8 @@
57
57
  "schema/identity-context.schema.json": "sha256:a0be3d3499b70f1641887ec66ab5b21ca5ab71063e9209290905738943a36e59",
58
58
  "schema/integration-connect-result.schema.json": "sha256:3f254b67ef739dc1fa395bdc8c4dc93359b16d481dba2a2d777aa5b6f34b7af8",
59
59
  "schema/integration-error-details.schema.json": "sha256:5a290584b1542b2b8cdd4966869126180ce29c1f0dd250dca7fb68c05e76b8e9",
60
- "schema/integration-execute-request.schema.json": "sha256:c2475e7161b32d128bc0a6d67c0c34c9cb7e6baa56bb4b70000eae12a5c705d7",
61
- "schema/integration-execute-result.schema.json": "sha256:ec4bd04064b0d999636304eba9e89f2254b423c944d4ca352c9fd6229c5114e1",
60
+ "schema/integration-execute-request.schema.json": "sha256:52afdb416c37d4fd911eafec3e63831ff7778dd70bc756102e44f8c6bb099fc0",
61
+ "schema/integration-execute-result.schema.json": "sha256:d85f135e8ba43e82e08bf13f720e3cc7988c6fa99da2bd727642a48342404b8f",
62
62
  "schema/internal-configuration-request.schema.json": "sha256:229d44a3458f68dceddfba802e5c1adcd95523a45af29b93b972706b88461a7d",
63
63
  "schema/kit-bundle-manifest.schema.json": "sha256:d8fc6ca9c30d791e785b021687e084e9171c0ea1a3a176d0f1582fcccf2c0e19",
64
64
  "schema/kit-lock.schema.json": "sha256:a48154d9471e49a893d928f7b0e1e0bc77708a4a7edce4fdf14073203e0e8987",
@@ -113,11 +113,11 @@
113
113
  "gen-go/contracts_test.go": "sha256:56376287cb1548be1b35ab4c65d6f0b558c5d34885f7a47cb3d9e8d786607bf5",
114
114
  "gen-go/doc.go": "sha256:316d610ce568597a2ce6f38e9782e34fa5920f6f51ab0866e6d061b8a41cd822",
115
115
  "gen-go/error_category.go": "sha256:b2ddea22dcfa030f1a45e721e635485b0bd816cf1f38e7654628a653f5ed4583",
116
- "gen-go/integration_execute_input_rules.go": "sha256:2f12620e797a82c6f6218133e26bacf225df33a10649cc1f4ea9b409b2f8e9f1",
116
+ "gen-go/integration_execute_input_rules.go": "sha256:6dbb58be21c9f92256cbaee4be35322ef27372d8ec49abb8d6be719af01f9237",
117
117
  "gen-go/integration_execute_input_rules_test.go": "sha256:6db850bbdfc31f60ac7ce6ec5cade4f5260b1836e56b2727efbfeee56db7a706",
118
118
  "gen-go/integration_operations.go": "sha256:1ba7ea4e118a2c4c8dd735b460b18d8658fbd7fd74e601ae372aff2844322f35",
119
119
  "gen-go/schema_documents.go": "sha256:c19c0d540f602ee997a84b90e20702d9bc63ed7d27aec267e76c04655fc182e0",
120
- "gen-go/types.go": "sha256:ee3e0ff2fc983f2cd2110d6d5169599c4fdad1ec5d9fb676a541a9b2e68f3198",
120
+ "gen-go/types.go": "sha256:2a522bd0dac6904ac36bf6b6c0050c269e554a45b27c1d2becb9a002047de896",
121
121
  "gen-go/version_state.go": "sha256:4ef8abb126414c0025cf2c59bc9c79a74ef4a2ff89e8f316cbf05acc872371c1"
122
122
  },
123
123
  "generatedTypeScript": {
@@ -171,9 +171,9 @@
171
171
  "gen-ts/index.ts": "sha256:258bdcaa0d8d26dd2bb996d3ddb0b4bf4533db83d1b7f0d35a2a2af85c728117",
172
172
  "gen-ts/integration-connect-result.ts": "sha256:4b10f169b6e1af364e9b418de21caa9fadbfb77b43cbff77d741cfae0b52180c",
173
173
  "gen-ts/integration-error-details.ts": "sha256:e73cb5942373ef88b2d8e03a1de56d5a69e71069ecd14e68396f7edba1f60780",
174
- "gen-ts/integration-execute-input-rules.ts": "sha256:40e59de0d0977071e6438ad2149dc0513395adf7201aad95ab3d61e25a6c4e1d",
175
- "gen-ts/integration-execute-request.ts": "sha256:8c42d88cf9a553e0f3b24b8b2763a26a4e3ed81592f6540e274ef3e9e1caa9c8",
176
- "gen-ts/integration-execute-result.ts": "sha256:dd4e235b1a9d8201c8e2ce65088097d7bf9c1079f5b06f56501f2621bc654415",
174
+ "gen-ts/integration-execute-input-rules.ts": "sha256:f340553858e61476e0c20a2c9b607adfaa6d0a8aa7f5e42279e9fc477e624425",
175
+ "gen-ts/integration-execute-request.ts": "sha256:df8a4eff42cd1a51ba084e4eaa9bf541bc39499844b861d11125a940a927b32b",
176
+ "gen-ts/integration-execute-result.ts": "sha256:ebc136b0da21100319bf8201cc5688295844702d40384c07435461fa4a90be0f",
177
177
  "gen-ts/integration-operations.ts": "sha256:9e1f0b330a86eb63b7999b7f78b1da08dcefa0582325917581d98879fa25899f",
178
178
  "gen-ts/internal-configuration-request.ts": "sha256:7032437797473fa1c581d134adef2f3d4b4f4132f482cd17743e9d47097886bc",
179
179
  "gen-ts/kit-bundle-manifest.ts": "sha256:73f5271d2eb3b5ce91e28933c5ab6883615c72a3808aa386f860f58f6df8edf6",
@@ -1,7 +1,7 @@
1
- export declare const ContractRepositoryVersion: "0.92.0.0";
2
- export declare const ContractPublishVersion: "0.92.0";
3
- export declare const ContractPublishTag: "v0.92.0";
4
- export declare const ContractSchemasDigest: "sha256:5b6aede1f569d02bf976d5331c9e8eb1e657b062be28fb89565ff50acd105c5a";
1
+ export declare const ContractRepositoryVersion: "0.93.0.0";
2
+ export declare const ContractPublishVersion: "0.93.0";
3
+ export declare const ContractPublishTag: "v0.93.0";
4
+ export declare const ContractSchemasDigest: "sha256:9fe4dd0a739805bd2029674641576a428d728fa4cd17667e1f87538ab08e14e5";
5
5
  export declare const ContractAiFixturesDigest: "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
6
- export declare const ContractGeneratedGoDigest: "sha256:64d78d9952ac08558ad956eb4c923677a0691e6260743c0dbc367b57e59ea822";
7
- export declare const ContractGeneratedTypeScriptDigest: "sha256:a99c149dbeb2b081bd460b95df4d44e29cc95e2fe2c737f4b012b7449c0c94d3";
6
+ export declare const ContractGeneratedGoDigest: "sha256:ba1a5b846bd8b5352b117601634df3d7fdb0e66782a3bac220b2574254407102";
7
+ export declare const ContractGeneratedTypeScriptDigest: "sha256:68bd763bc5f48338e257c1f48d72542fb73a70f0b26758faaaebb546dc5752e3";
@@ -1,9 +1,9 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
- export const ContractRepositoryVersion = "0.92.0.0";
4
- export const ContractPublishVersion = "0.92.0";
5
- export const ContractPublishTag = "v0.92.0";
6
- export const ContractSchemasDigest = "sha256:5b6aede1f569d02bf976d5331c9e8eb1e657b062be28fb89565ff50acd105c5a";
3
+ export const ContractRepositoryVersion = "0.93.0.0";
4
+ export const ContractPublishVersion = "0.93.0";
5
+ export const ContractPublishTag = "v0.93.0";
6
+ export const ContractSchemasDigest = "sha256:9fe4dd0a739805bd2029674641576a428d728fa4cd17667e1f87538ab08e14e5";
7
7
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6";
8
- export const ContractGeneratedGoDigest = "sha256:64d78d9952ac08558ad956eb4c923677a0691e6260743c0dbc367b57e59ea822";
9
- export const ContractGeneratedTypeScriptDigest = "sha256:a99c149dbeb2b081bd460b95df4d44e29cc95e2fe2c737f4b012b7449c0c94d3";
8
+ export const ContractGeneratedGoDigest = "sha256:ba1a5b846bd8b5352b117601634df3d7fdb0e66782a3bac220b2574254407102";
9
+ export const ContractGeneratedTypeScriptDigest = "sha256:68bd763bc5f48338e257c1f48d72542fb73a70f0b26758faaaebb546dc5752e3";
@@ -2268,6 +2268,13 @@ export declare const IntegrationExecuteInputRules: {
2268
2268
  readonly minLength: 0;
2269
2269
  readonly maxLength: 2000;
2270
2270
  };
2271
+ readonly purchaseOrderItemId: {
2272
+ readonly kind: "string";
2273
+ readonly required: false;
2274
+ readonly minLength: 0;
2275
+ readonly maxLength: 32;
2276
+ readonly pattern: "^[0-9]{1,32}$";
2277
+ };
2271
2278
  };
2272
2279
  };
2273
2280
  };
@@ -701,6 +701,7 @@ export const IntegrationExecuteInputRules = {
701
701
  rate: { kind: "string", required: true, minLength: 0, maxLength: 17, pattern: "^[0-9]{1,10}(\\.[0-9]{1,6})?$" },
702
702
  taxId: { kind: "string", required: false, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
703
703
  description: { kind: "string", required: false, minLength: 0, maxLength: 2000 },
704
+ purchaseOrderItemId: { kind: "string", required: false, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
704
705
  } },
705
706
  },
706
707
  },
@@ -375,6 +375,7 @@ export type IntegrationExecuteRequest = {
375
375
  rate: string;
376
376
  taxId?: string;
377
377
  description?: string;
378
+ purchaseOrderItemId?: string;
378
379
  }[];
379
380
  };
380
381
  /**
@@ -303,6 +303,8 @@ export type IntegrationExecuteResult = {
303
303
  rate: string;
304
304
  total: string;
305
305
  description?: string;
306
+ lineItemId?: string;
307
+ purchaseOrderItemId?: string;
306
308
  }[];
307
309
  };
308
310
  /**
@@ -333,6 +335,8 @@ export type IntegrationExecuteResult = {
333
335
  rate: string;
334
336
  total: string;
335
337
  description?: string;
338
+ lineItemId?: string;
339
+ purchaseOrderItemId?: string;
336
340
  }[];
337
341
  }[];
338
342
  };
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable */
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
- export const ContractRepositoryVersion = "0.92.0.0" as const;
5
- export const ContractPublishVersion = "0.92.0" as const;
6
- export const ContractPublishTag = "v0.92.0" as const;
7
- export const ContractSchemasDigest = "sha256:5b6aede1f569d02bf976d5331c9e8eb1e657b062be28fb89565ff50acd105c5a" as const;
4
+ export const ContractRepositoryVersion = "0.93.0.0" as const;
5
+ export const ContractPublishVersion = "0.93.0" as const;
6
+ export const ContractPublishTag = "v0.93.0" as const;
7
+ export const ContractSchemasDigest = "sha256:9fe4dd0a739805bd2029674641576a428d728fa4cd17667e1f87538ab08e14e5" as const;
8
8
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
9
- export const ContractGeneratedGoDigest = "sha256:64d78d9952ac08558ad956eb4c923677a0691e6260743c0dbc367b57e59ea822" as const;
10
- export const ContractGeneratedTypeScriptDigest = "sha256:a99c149dbeb2b081bd460b95df4d44e29cc95e2fe2c737f4b012b7449c0c94d3" as const;
9
+ export const ContractGeneratedGoDigest = "sha256:ba1a5b846bd8b5352b117601634df3d7fdb0e66782a3bac220b2574254407102" as const;
10
+ export const ContractGeneratedTypeScriptDigest = "sha256:68bd763bc5f48338e257c1f48d72542fb73a70f0b26758faaaebb546dc5752e3" as const;
@@ -730,6 +730,7 @@ export const IntegrationExecuteInputRules = {
730
730
  rate: { kind: "string", required: true, minLength: 0, maxLength: 17, pattern: "^[0-9]{1,10}(\\.[0-9]{1,6})?$" },
731
731
  taxId: { kind: "string", required: false, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
732
732
  description: { kind: "string", required: false, minLength: 0, maxLength: 2000 },
733
+ purchaseOrderItemId: { kind: "string", required: false, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
733
734
  } },
734
735
  },
735
736
  },
@@ -467,6 +467,7 @@ export type IntegrationExecuteRequest = {
467
467
  rate: string;
468
468
  taxId?: string;
469
469
  description?: string;
470
+ purchaseOrderItemId?: string;
470
471
  }[];
471
472
  };
472
473
  /**
@@ -306,6 +306,8 @@ export type IntegrationExecuteResult = {
306
306
  rate: string;
307
307
  total: string;
308
308
  description?: string;
309
+ lineItemId?: string;
310
+ purchaseOrderItemId?: string;
309
311
  }[];
310
312
  };
311
313
  /**
@@ -336,6 +338,8 @@ export type IntegrationExecuteResult = {
336
338
  rate: string;
337
339
  total: string;
338
340
  description?: string;
341
+ lineItemId?: string;
342
+ purchaseOrderItemId?: string;
339
343
  }[];
340
344
  }[];
341
345
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.92.0",
3
+ "version": "0.93.0",
4
4
  "description": "Single source of truth for every data shape that crosses a boundary between Isomorph components.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -638,6 +638,11 @@
638
638
  "description": {
639
639
  "type": "string",
640
640
  "maxLength": 2000
641
+ },
642
+ "purchaseOrderItemId": {
643
+ "type": "string",
644
+ "pattern": "^[0-9]{1,32}$",
645
+ "maxLength": 32
641
646
  }
642
647
  }
643
648
  }
@@ -3561,6 +3566,26 @@
3561
3566
  "documentNumber",
3562
3567
  "documentDate",
3563
3568
  "lineItems"
3569
+ ],
3570
+ "allOf": [
3571
+ {
3572
+ "if": {
3573
+ "required": [
3574
+ "purchaseOrderId"
3575
+ ]
3576
+ },
3577
+ "then": {
3578
+ "properties": {
3579
+ "lineItems": {
3580
+ "items": {
3581
+ "required": [
3582
+ "purchaseOrderItemId"
3583
+ ]
3584
+ }
3585
+ }
3586
+ }
3587
+ }
3588
+ }
3564
3589
  ]
3565
3590
  }
3566
3591
  },
@@ -3633,7 +3658,49 @@
3633
3658
  "customerId",
3634
3659
  "documentDate",
3635
3660
  "lineItems"
3636
- ]
3661
+ ],
3662
+ "properties": {
3663
+ "lineItems": {
3664
+ "type": "array",
3665
+ "minItems": 1,
3666
+ "maxItems": 100,
3667
+ "items": {
3668
+ "type": "object",
3669
+ "additionalProperties": false,
3670
+ "required": [
3671
+ "itemId",
3672
+ "quantity",
3673
+ "rate"
3674
+ ],
3675
+ "properties": {
3676
+ "itemId": {
3677
+ "type": "string",
3678
+ "pattern": "^[0-9]{1,32}$",
3679
+ "maxLength": 32
3680
+ },
3681
+ "quantity": {
3682
+ "type": "string",
3683
+ "pattern": "^[0-9]{1,10}(\\.[0-9]{1,6})?$",
3684
+ "maxLength": 17
3685
+ },
3686
+ "rate": {
3687
+ "type": "string",
3688
+ "pattern": "^[0-9]{1,10}(\\.[0-9]{1,6})?$",
3689
+ "maxLength": 17
3690
+ },
3691
+ "taxId": {
3692
+ "type": "string",
3693
+ "pattern": "^[0-9]{1,32}$",
3694
+ "maxLength": 32
3695
+ },
3696
+ "description": {
3697
+ "type": "string",
3698
+ "maxLength": 2000
3699
+ }
3700
+ }
3701
+ }
3702
+ }
3703
+ }
3637
3704
  }
3638
3705
  },
3639
3706
  "required": [
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schemas.harbour.dev/integration-execute-result.schema.json",
4
4
  "title": "IntegrationExecuteResult",
5
- "description": "The `data` member of a successful execute response `{data, requestId}`; the SDK unwraps `data`. Exactly one of the operation results (eighty-one operations since 0.86.0, ADR 0018, ADR 0022, ADR 0024, ADR 0028, ADR 0029 and ADR 0032): slack.channel.history -> {messages, hasMore, nextCursor?} (plain text/IDs/time, plus the display name and emoji icon a per-app-named app post carries — authorName/authorIcon, 0.55.0 — never the provider payload; `nextCursor` when hasMore, to pass as the next read's `cursor`); slack.message.post, slack.message.update, slack.message.delete -> {messageId} (the Slack ts); slack.dm.send -> {messageId, channelId} (the ts and the DM channel it went to); slack.user.lookup -> {userId, displayName}; gmail.thread.list -> {threads, hasMore, nextPageToken?} (newest matching threads; each `messageId` is the thread's newest message, what gmail.message.read takes; `nextPageToken` when hasMore); gmail.thread.read -> {id, emails} (every message of the thread, oldest first, each shaped like a gmail.message.read result); gmail.message.read -> {id, threadId, subject, from, to, date, text, truncated, attachments?} (headers plus the plain text with html stripped, cut at 16 KiB with `truncated` set; `attachments` lists the files without their bytes, which gmail.attachment.read fetches by id); gmail.attachment.read -> {filename, mimeType, size, dataBase64}; gmail.message.send -> {messageId, threadId} (the Gmail ids of the sent message and its thread); warehouse.view.read -> {rows, truncated} (rows keyed by the selected columns, or for an aggregate read by the groupBy columns then the aggregate aliases; decimal/64-bit values as strings, dates as ISO strings; since 0.70.0 every server sends `truncated`, true when more rows matched than `limit` — the server reads limit+1 rows to know — so the rows are incomplete and must not be totalled or averaged; a server before 0.70.0 omitted it). Basecamp (0.76.0, ADR 0022; every id a string of digits, every page at most 100 items, `nextPageToken` only when hasMore, text cut at 16 KiB like Gmail): basecamp.project.list -> {projects, hasMore, nextPageToken?}; basecamp.todolist.list -> {todolists, hasMore, nextPageToken?}; basecamp.todo.list -> {todos, hasMore, nextPageToken?}; basecamp.message.list -> {boardMessages, hasMore, nextPageToken?} (`boardMessages`, not `messages`, which is the Slack history shape); basecamp.comment.list -> {comments, hasMore, nextPageToken?}; basecamp.people.list -> {people, hasMore, nextPageToken?}; basecamp.todo.create, basecamp.message.post, basecamp.comment.post, basecamp.campfire.post -> {id, appUrl} (the new recording and its Basecamp page); basecamp.todo.complete -> {id, completed} with completed always true. SharePoint (0.78.0, ADR 0024; every id a Microsoft Graph id, `nextPageToken` only when hasMore and up to 2048 characters for a Graph `$skiptoken`): sharepoint.list.list -> {lists, hasMore, nextPageToken?} (at most 100, hidden lists dropped); sharepoint.item.list -> {items, hasMore, nextPageToken?} (at most 50; each item's `fields` are the column values as Graph returns them with the system columns dropped, the whole object cut at 16 KiB); sharepoint.drive.list -> {drives, hasMore, nextPageToken?}; sharepoint.file.list and sharepoint.file.search -> {files, hasMore, nextPageToken?} (at most 100 entries, folders included with isFolder); sharepoint.file.read -> {id, filename, mimeType, size, dataBase64} (the Gmail attachment shape plus the file's id; at most 2 MiB of bytes); sharepoint.item.create -> {id, webUrl} (the new item and its SharePoint page); sharepoint.item.update -> {id}; sharepoint.file.upload -> {id, filename, webUrl} (the stored file, under the name `conflict` rename may have given it). Google Workspace and Microsoft 365 (0.86.0, ADR 0032; every page at most 100 items, `nextPageToken` only when hasMore, up to 2048 characters): calendar.calendar.list -> {calendars, hasMore, nextPageToken?}; calendar.event.list and outlook.event.list -> {events, hasMore, nextPageToken?}; calendar.event.read and outlook.event.read -> the event itself, {id, title, start, end, allDay, timeZone?, location?, description?, attendees, organizer?, webUrl, eventStatus} (the CalendarEvent shape spread at the top level, the way gmail.message.read spreads GmailMessage; `eventStatus`, because `status` is the HTTP status of a service.request result); calendar.event.create and outlook.event.create -> {id, webUrl}; calendar.event.update, calendar.event.cancel, outlook.event.update, outlook.event.cancel -> {id}; drive.file.list, drive.file.search, onedrive.file.list, onedrive.file.search -> {files, hasMore, nextPageToken?} (the SharePoint entry shape); drive.file.read and onedrive.file.read -> {id, filename, mimeType, size, dataBase64} (the sharepoint.file.read shape; `filename` and `mimeType` are the stored or exported name and type); drive.file.upload and onedrive.file.upload -> {id, filename, webUrl}; drive.folder.create and onedrive.folder.create -> {id, webUrl}; docs.document.read -> {id, title, text, revisionId, webUrl, truncated} (the body as plain text cut at 64 KiB); docs.document.create -> {id, webUrl}; docs.document.append -> {id, revisionId}; docs.text.replace -> {id, replaced} (how many occurrences changed); sheets.spreadsheet.read -> {id, title, sheets, webUrl}; sheets.values.read -> {range, values} (the range Google answered with and the cells as rows; a trailing empty row or cell is dropped by Google); sheets.values.append -> {range, updatedRows}; sheets.values.update -> {range, updatedCells}; sheets.values.clear -> {range}; sheets.spreadsheet.create -> {id, webUrl}; outlook.message.list -> {mailMessages, hasMore, nextPageToken?} (`mailMessages`, not `messages`, which is the Slack history shape); outlook.message.read -> the gmail.message.read shape {id, threadId, subject, from, to, date, text, truncated, attachments?} with `threadId` the Graph conversationId; outlook.attachment.read -> {id, filename, mimeType, size, dataBase64}; outlook.message.send and outlook.message.reply -> {id} (the sent message's id, which Graph does not return for a send: governance's own internetMessageId); excel.worksheet.list -> {worksheets}; excel.range.read -> {address, values}; excel.range.update -> {address, updatedCells}; excel.table.list -> {tables}; excel.row.add -> {index, updatedRows} (the index of the first added row); excel.worksheet.add -> {id, name}; teams.message.list -> {teamsMessages, hasMore, nextPageToken?} (`teamsMessages`, apart from Slack's `messages`); teams.message.post and teams.reply.post -> {id, webUrl}. An unknown send outcome is never a result; it is an error with details.code SEND_OUTCOME_UNKNOWN. A whole result over 1 MiB is rejected, never cut down to fit — except a gmail.attachment.read, a sharepoint.file.read, a drive.file.read, an onedrive.file.read or an outlook.attachment.read, whose single file is bounded by its own 2 MiB.",
5
+ "description": "The `data` member of a successful execute response `{data, requestId}`; the SDK unwraps `data`. Exactly one of the operation results (eighty-one operations since 0.86.0, ADR 0018, ADR 0022, ADR 0024, ADR 0028, ADR 0029 and ADR 0032): slack.channel.history -> {messages, hasMore, nextCursor?} (plain text/IDs/time, plus the display name and emoji icon a per-app-named app post carries \u2014 authorName/authorIcon, 0.55.0 \u2014 never the provider payload; `nextCursor` when hasMore, to pass as the next read's `cursor`); slack.message.post, slack.message.update, slack.message.delete -> {messageId} (the Slack ts); slack.dm.send -> {messageId, channelId} (the ts and the DM channel it went to); slack.user.lookup -> {userId, displayName}; gmail.thread.list -> {threads, hasMore, nextPageToken?} (newest matching threads; each `messageId` is the thread's newest message, what gmail.message.read takes; `nextPageToken` when hasMore); gmail.thread.read -> {id, emails} (every message of the thread, oldest first, each shaped like a gmail.message.read result); gmail.message.read -> {id, threadId, subject, from, to, date, text, truncated, attachments?} (headers plus the plain text with html stripped, cut at 16 KiB with `truncated` set; `attachments` lists the files without their bytes, which gmail.attachment.read fetches by id); gmail.attachment.read -> {filename, mimeType, size, dataBase64}; gmail.message.send -> {messageId, threadId} (the Gmail ids of the sent message and its thread); warehouse.view.read -> {rows, truncated} (rows keyed by the selected columns, or for an aggregate read by the groupBy columns then the aggregate aliases; decimal/64-bit values as strings, dates as ISO strings; since 0.70.0 every server sends `truncated`, true when more rows matched than `limit` \u2014 the server reads limit+1 rows to know \u2014 so the rows are incomplete and must not be totalled or averaged; a server before 0.70.0 omitted it). Basecamp (0.76.0, ADR 0022; every id a string of digits, every page at most 100 items, `nextPageToken` only when hasMore, text cut at 16 KiB like Gmail): basecamp.project.list -> {projects, hasMore, nextPageToken?}; basecamp.todolist.list -> {todolists, hasMore, nextPageToken?}; basecamp.todo.list -> {todos, hasMore, nextPageToken?}; basecamp.message.list -> {boardMessages, hasMore, nextPageToken?} (`boardMessages`, not `messages`, which is the Slack history shape); basecamp.comment.list -> {comments, hasMore, nextPageToken?}; basecamp.people.list -> {people, hasMore, nextPageToken?}; basecamp.todo.create, basecamp.message.post, basecamp.comment.post, basecamp.campfire.post -> {id, appUrl} (the new recording and its Basecamp page); basecamp.todo.complete -> {id, completed} with completed always true. SharePoint (0.78.0, ADR 0024; every id a Microsoft Graph id, `nextPageToken` only when hasMore and up to 2048 characters for a Graph `$skiptoken`): sharepoint.list.list -> {lists, hasMore, nextPageToken?} (at most 100, hidden lists dropped); sharepoint.item.list -> {items, hasMore, nextPageToken?} (at most 50; each item's `fields` are the column values as Graph returns them with the system columns dropped, the whole object cut at 16 KiB); sharepoint.drive.list -> {drives, hasMore, nextPageToken?}; sharepoint.file.list and sharepoint.file.search -> {files, hasMore, nextPageToken?} (at most 100 entries, folders included with isFolder); sharepoint.file.read -> {id, filename, mimeType, size, dataBase64} (the Gmail attachment shape plus the file's id; at most 2 MiB of bytes); sharepoint.item.create -> {id, webUrl} (the new item and its SharePoint page); sharepoint.item.update -> {id}; sharepoint.file.upload -> {id, filename, webUrl} (the stored file, under the name `conflict` rename may have given it). Google Workspace and Microsoft 365 (0.86.0, ADR 0032; every page at most 100 items, `nextPageToken` only when hasMore, up to 2048 characters): calendar.calendar.list -> {calendars, hasMore, nextPageToken?}; calendar.event.list and outlook.event.list -> {events, hasMore, nextPageToken?}; calendar.event.read and outlook.event.read -> the event itself, {id, title, start, end, allDay, timeZone?, location?, description?, attendees, organizer?, webUrl, eventStatus} (the CalendarEvent shape spread at the top level, the way gmail.message.read spreads GmailMessage; `eventStatus`, because `status` is the HTTP status of a service.request result); calendar.event.create and outlook.event.create -> {id, webUrl}; calendar.event.update, calendar.event.cancel, outlook.event.update, outlook.event.cancel -> {id}; drive.file.list, drive.file.search, onedrive.file.list, onedrive.file.search -> {files, hasMore, nextPageToken?} (the SharePoint entry shape); drive.file.read and onedrive.file.read -> {id, filename, mimeType, size, dataBase64} (the sharepoint.file.read shape; `filename` and `mimeType` are the stored or exported name and type); drive.file.upload and onedrive.file.upload -> {id, filename, webUrl}; drive.folder.create and onedrive.folder.create -> {id, webUrl}; docs.document.read -> {id, title, text, revisionId, webUrl, truncated} (the body as plain text cut at 64 KiB); docs.document.create -> {id, webUrl}; docs.document.append -> {id, revisionId}; docs.text.replace -> {id, replaced} (how many occurrences changed); sheets.spreadsheet.read -> {id, title, sheets, webUrl}; sheets.values.read -> {range, values} (the range Google answered with and the cells as rows; a trailing empty row or cell is dropped by Google); sheets.values.append -> {range, updatedRows}; sheets.values.update -> {range, updatedCells}; sheets.values.clear -> {range}; sheets.spreadsheet.create -> {id, webUrl}; outlook.message.list -> {mailMessages, hasMore, nextPageToken?} (`mailMessages`, not `messages`, which is the Slack history shape); outlook.message.read -> the gmail.message.read shape {id, threadId, subject, from, to, date, text, truncated, attachments?} with `threadId` the Graph conversationId; outlook.attachment.read -> {id, filename, mimeType, size, dataBase64}; outlook.message.send and outlook.message.reply -> {id} (the sent message's id, which Graph does not return for a send: governance's own internetMessageId); excel.worksheet.list -> {worksheets}; excel.range.read -> {address, values}; excel.range.update -> {address, updatedCells}; excel.table.list -> {tables}; excel.row.add -> {index, updatedRows} (the index of the first added row); excel.worksheet.add -> {id, name}; teams.message.list -> {teamsMessages, hasMore, nextPageToken?} (`teamsMessages`, apart from Slack's `messages`); teams.message.post and teams.reply.post -> {id, webUrl}. An unknown send outcome is never a result; it is an error with details.code SEND_OUTCOME_UNKNOWN. A whole result over 1 MiB is rejected, never cut down to fit \u2014 except a gmail.attachment.read, a sharepoint.file.read, a drive.file.read, an onedrive.file.read or an outlook.attachment.read, whose single file is bounded by its own 2 MiB.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "properties": {
@@ -506,6 +506,14 @@
506
506
  "description": {
507
507
  "type": "string",
508
508
  "maxLength": 2000
509
+ },
510
+ "lineItemId": {
511
+ "type": "string",
512
+ "maxLength": 32
513
+ },
514
+ "purchaseOrderItemId": {
515
+ "type": "string",
516
+ "maxLength": 32
509
517
  }
510
518
  }
511
519
  }
@@ -619,6 +627,14 @@
619
627
  "description": {
620
628
  "type": "string",
621
629
  "maxLength": 2000
630
+ },
631
+ "lineItemId": {
632
+ "type": "string",
633
+ "maxLength": 32
634
+ },
635
+ "purchaseOrderItemId": {
636
+ "type": "string",
637
+ "maxLength": 32
622
638
  }
623
639
  }
624
640
  }