@fourier-labs/harbour-contracts 0.96.0 → 0.97.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 (32) hide show
  1. package/contract-release.json +26 -26
  2. package/dist/gen-ts/app-integrations-declaration.d.ts +5 -0
  3. package/dist/gen-ts/contract-release.d.ts +6 -6
  4. package/dist/gen-ts/contract-release.js +6 -6
  5. package/dist/gen-ts/data-grant-v2.d.ts +4 -4
  6. package/dist/gen-ts/deployment-app-registration.d.ts +7 -3
  7. package/dist/gen-ts/file-arrival.d.ts +1 -1
  8. package/dist/gen-ts/integration-execute-input-rules.d.ts +130 -0
  9. package/dist/gen-ts/integration-execute-input-rules.js +42 -0
  10. package/dist/gen-ts/integration-execute-request.d.ts +5 -3
  11. package/dist/gen-ts/integration-execute-result.d.ts +36 -0
  12. package/dist/gen-ts/integration-operations.d.ts +35 -0
  13. package/dist/gen-ts/integration-operations.js +45 -0
  14. package/dist/gen-ts/saas-connection.d.ts +6 -6
  15. package/gen-ts/app-integrations-declaration.ts +5 -0
  16. package/gen-ts/contract-release.ts +6 -6
  17. package/gen-ts/data-grant-v2.ts +12 -2
  18. package/gen-ts/deployment-app-registration.ts +12 -3
  19. package/gen-ts/file-arrival.ts +5 -1
  20. package/gen-ts/integration-execute-input-rules.ts +42 -0
  21. package/gen-ts/integration-execute-request.ts +10 -3
  22. package/gen-ts/integration-execute-result.ts +36 -0
  23. package/gen-ts/integration-operations.ts +45 -0
  24. package/gen-ts/saas-connection.ts +18 -3
  25. package/package.json +1 -1
  26. package/schema/app-integrations-declaration.schema.json +71 -1
  27. package/schema/data-grant-v2.schema.json +2 -2
  28. package/schema/deployment-app-registration.schema.json +21 -4
  29. package/schema/file-arrival.schema.json +3 -1
  30. package/schema/integration-execute-request.schema.json +358 -10
  31. package/schema/integration-execute-result.schema.json +156 -1
  32. package/schema/saas-connection.schema.json +3 -3
@@ -806,5 +806,50 @@ export const IntegrationOperations = {
806
806
  "readOnly": true,
807
807
  "declaredMode": false,
808
808
  "idempotencyKey": false
809
+ },
810
+ "zohobooks.salesorder.list": {
811
+ "kind": "saas",
812
+ "identities": [
813
+ "user"
814
+ ],
815
+ "readOnly": true,
816
+ "declaredMode": false,
817
+ "idempotencyKey": false
818
+ },
819
+ "zohobooks.salesorder.read": {
820
+ "kind": "saas",
821
+ "identities": [
822
+ "user"
823
+ ],
824
+ "readOnly": true,
825
+ "declaredMode": false,
826
+ "idempotencyKey": false
827
+ },
828
+ "zohobooks.invoice.reviseDraft": {
829
+ "kind": "saas",
830
+ "identities": [
831
+ "user"
832
+ ],
833
+ "readOnly": false,
834
+ "declaredMode": false,
835
+ "idempotencyKey": true
836
+ },
837
+ "zohobooks.creditnote.create": {
838
+ "kind": "saas",
839
+ "identities": [
840
+ "user"
841
+ ],
842
+ "readOnly": false,
843
+ "declaredMode": false,
844
+ "idempotencyKey": true
845
+ },
846
+ "zohobooks.creditnote.read": {
847
+ "kind": "saas",
848
+ "identities": [
849
+ "user"
850
+ ],
851
+ "readOnly": true,
852
+ "declaredMode": false,
853
+ "idempotencyKey": false
809
854
  }
810
855
  };
@@ -55,15 +55,15 @@ export interface SaasConnection {
55
55
  * Operations IT allows apps to request on this connection: the provider's own SaaS operations (Slack: slack.channel.history, slack.message.post, slack.message.update, slack.message.delete, slack.dm.send, slack.user.lookup; Gmail: gmail.thread.list, gmail.thread.read, gmail.message.read, gmail.message.send, gmail.attachment.read; Basecamp (0.76.0): basecamp.project.list, basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create, basecamp.todo.complete, basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post, basecamp.people.list; SharePoint (0.78.0): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create, sharepoint.item.update, sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read, sharepoint.file.upload; Google Workspace and Microsoft 365 (0.86.0): the calendar.*, drive.*, docs.*, sheets.*, outlook.*, onedrive.*, excel.* and teams.* operations of the connection's provider). Never warehouse.view.read. Phone (0.82.0): phone.sms.list; 0.83.0 adds phone.number.get. Seventy-eight SaaS operations in all since 0.86.0.
56
56
  *
57
57
  * @minItems 1
58
- * @maxItems 86
58
+ * @maxItems 91
59
59
  */
60
- operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf')[];
60
+ operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read')[];
61
61
  /**
62
62
  * Explicit user-mode operations eligible for automatic app access, subject to the connection operation ceiling and personal consent. Empty means review all; absent inherits company defaults or the existing userModeApproval migration rule. Governance validates provider and mode compatibility. Background execution still requires personal background consent, not a separate admin grant.
63
63
  *
64
- * @maxItems 86
64
+ * @maxItems 91
65
65
  */
66
- automaticUserOperations?: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf')[];
66
+ automaticUserOperations?: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read')[];
67
67
  /**
68
68
  * Reusable permissions for admitted builders on explicit shared SaaS resources. Governance checks registered resources, provider/mode compatibility and the connection operation ceiling. Connection version and audit record changes; no per-entry approval metadata.
69
69
  *
@@ -168,9 +168,9 @@ export interface ReusableSaasAccess {
168
168
  mode: 'app' | 'user';
169
169
  /**
170
170
  * @minItems 1
171
- * @maxItems 86
171
+ * @maxItems 91
172
172
  */
173
- operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf')[];
173
+ operations: ('slack.channel.history' | 'slack.message.post' | 'slack.message.update' | 'slack.message.delete' | 'slack.dm.send' | 'slack.user.lookup' | 'gmail.thread.list' | 'gmail.thread.read' | 'gmail.message.read' | 'gmail.message.send' | 'gmail.attachment.read' | 'basecamp.project.list' | 'basecamp.todolist.list' | 'basecamp.todo.list' | 'basecamp.todo.create' | 'basecamp.todo.complete' | 'basecamp.message.list' | 'basecamp.message.post' | 'basecamp.comment.list' | 'basecamp.comment.post' | 'basecamp.campfire.post' | 'basecamp.people.list' | 'sharepoint.list.list' | 'sharepoint.item.list' | 'sharepoint.item.create' | 'sharepoint.item.update' | 'sharepoint.drive.list' | 'sharepoint.file.list' | 'sharepoint.file.search' | 'sharepoint.file.read' | 'sharepoint.file.upload' | 'phone.sms.list' | 'phone.number.get' | 'calendar.calendar.list' | 'calendar.event.list' | 'calendar.event.read' | 'calendar.event.create' | 'calendar.event.update' | 'calendar.event.cancel' | 'drive.file.list' | 'drive.file.search' | 'drive.file.read' | 'drive.file.upload' | 'drive.folder.create' | 'docs.document.read' | 'docs.document.create' | 'docs.document.append' | 'docs.text.replace' | 'sheets.spreadsheet.read' | 'sheets.values.read' | 'sheets.values.append' | 'sheets.values.update' | 'sheets.values.clear' | 'sheets.spreadsheet.create' | 'outlook.message.list' | 'outlook.message.read' | 'outlook.attachment.read' | 'outlook.message.send' | 'outlook.message.reply' | 'outlook.event.list' | 'outlook.event.read' | 'outlook.event.create' | 'outlook.event.update' | 'outlook.event.cancel' | 'onedrive.file.list' | 'onedrive.file.search' | 'onedrive.file.read' | 'onedrive.file.upload' | 'onedrive.folder.create' | 'excel.worksheet.list' | 'excel.range.read' | 'excel.range.update' | 'excel.table.list' | 'excel.row.add' | 'excel.worksheet.add' | 'teams.message.list' | 'teams.message.post' | 'teams.reply.post' | 'warehouse.view.read' | 'warehouse.table.append' | 'service.request' | 'zohobooks.contact.list' | 'zohobooks.purchaseorder.list' | 'zohobooks.purchaseorder.read' | 'zohobooks.bill.create' | 'zohobooks.bill.read' | 'zohobooks.invoice.create' | 'zohobooks.invoice.read' | 'zohobooks.invoice.pdf' | 'zohobooks.salesorder.list' | 'zohobooks.salesorder.read' | 'zohobooks.invoice.reviseDraft' | 'zohobooks.creditnote.create' | 'zohobooks.creditnote.read')[];
174
174
  }
175
175
  export interface DevelopmentPreapproval {
176
176
  /**
@@ -94,6 +94,11 @@ export type DeclaredConnection = {
94
94
  'zohobooks.invoice.create'?: UserModeChannelOperation;
95
95
  'zohobooks.invoice.read'?: UserModeChannelOperation;
96
96
  'zohobooks.invoice.pdf'?: UserModeChannelOperation;
97
+ 'zohobooks.salesorder.list'?: UserModeChannelOperation;
98
+ 'zohobooks.salesorder.read'?: UserModeChannelOperation;
99
+ 'zohobooks.invoice.reviseDraft'?: UserModeChannelOperation;
100
+ 'zohobooks.creditnote.create'?: UserModeChannelOperation;
101
+ 'zohobooks.creditnote.read'?: UserModeChannelOperation;
97
102
  };
98
103
  };
99
104
  export type IntegrationConnectionKind = 'saas' | 'database' | 'service';
@@ -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.96.0.0" as const;
5
- export const ContractPublishVersion = "0.96.0" as const;
6
- export const ContractPublishTag = "v0.96.0" as const;
7
- export const ContractSchemasDigest = "sha256:0baae0630687f4345db30f36b86d1821c4769728187b825db6d63c63c8dc229b" as const;
4
+ export const ContractRepositoryVersion = "0.97.0.0" as const;
5
+ export const ContractPublishVersion = "0.97.0" as const;
6
+ export const ContractPublishTag = "v0.97.0" as const;
7
+ export const ContractSchemasDigest = "sha256:96d7ca6fc25f98bb0b35598d8d72eb68cabd841d4b8b644330dea37fbed0916f" as const;
8
8
  export const ContractAiFixturesDigest = "sha256:edac31c92e146ca1c40130f2fb5649db82e24b8cd1ac758153b90612052fddb6" as const;
9
- export const ContractGeneratedGoDigest = "sha256:725161b06837cacb79c92fd28ed00ef96b132a86ac5d5531ee1b3c3ce0fbb905" as const;
10
- export const ContractGeneratedTypeScriptDigest = "sha256:b6116203eda0c74ae1cb5ebe2ad9c54f0d73759d7eca1b571dd7aab13ee9c3a6" as const;
9
+ export const ContractGeneratedGoDigest = "sha256:628254d6676684c7356611eaa434890fa28ad7cf78a487ec407d33b4aa8dad0a" as const;
10
+ export const ContractGeneratedTypeScriptDigest = "sha256:db0823b4134a04e599b159fab0fd439c88160541bdf67c58b568758c98a8dfcc" as const;
@@ -35,7 +35,7 @@ export interface DataGrantV2 {
35
35
  /**
36
36
  * Approved operations; each must match this grant's mode. Empty until the first approval. At most the seventy-eight SaaS operations (0.86.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, two phone, forty-five Google Workspace and Microsoft 365); a database grant holds up to two (warehouse.view.read, warehouse.table.append).
37
37
  *
38
- * @maxItems 86
38
+ * @maxItems 91
39
39
  */
40
40
  operations: (
41
41
  | 'slack.channel.history'
@@ -127,6 +127,11 @@ export interface DataGrantV2 {
127
127
  | 'zohobooks.invoice.create'
128
128
  | 'zohobooks.invoice.read'
129
129
  | 'zohobooks.invoice.pdf'
130
+ | 'zohobooks.salesorder.list'
131
+ | 'zohobooks.salesorder.read'
132
+ | 'zohobooks.invoice.reviseDraft'
133
+ | 'zohobooks.creditnote.create'
134
+ | 'zohobooks.creditnote.read'
130
135
  )[];
131
136
  /**
132
137
  * Approved logical resources. Never inherited by wildcard. Empty until the first approval.
@@ -197,7 +202,7 @@ export interface IntegrationResource {
197
202
  */
198
203
  export interface ReviewedIntegrationScope {
199
204
  /**
200
- * @maxItems 86
205
+ * @maxItems 91
201
206
  */
202
207
  operations: (
203
208
  | 'slack.channel.history'
@@ -289,6 +294,11 @@ export interface ReviewedIntegrationScope {
289
294
  | 'zohobooks.invoice.create'
290
295
  | 'zohobooks.invoice.read'
291
296
  | 'zohobooks.invoice.pdf'
297
+ | 'zohobooks.salesorder.list'
298
+ | 'zohobooks.salesorder.read'
299
+ | 'zohobooks.invoice.reviseDraft'
300
+ | 'zohobooks.creditnote.create'
301
+ | 'zohobooks.creditnote.read'
292
302
  )[];
293
303
  /**
294
304
  * @maxItems 64
@@ -70,13 +70,22 @@ export type EventJobs = {
70
70
  type: 'file.created';
71
71
  connection: string;
72
72
  resource: string;
73
- folderId: string;
73
+ folderId?: string;
74
74
  driveId?: string;
75
75
  /**
76
76
  * @minItems 1
77
- * @maxItems 2
77
+ * @maxItems 4
78
78
  */
79
- mimeTypes?: ('application/pdf' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')[];
79
+ mimeTypes?: (
80
+ | 'application/pdf'
81
+ | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
82
+ | 'image/png'
83
+ | 'image/jpeg'
84
+ )[];
85
+ /**
86
+ * The app owner may select a folder at runtime within the declared connection and resource.
87
+ */
88
+ configurableFolder?: true;
80
89
  };
81
90
  }[];
82
91
 
@@ -9,7 +9,11 @@ export type FileArrival = {
9
9
  folderId: string;
10
10
  driveId?: string;
11
11
  name: string;
12
- mimeType: 'application/pdf' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
12
+ mimeType:
13
+ | 'application/pdf'
14
+ | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
15
+ | 'image/png'
16
+ | 'image/jpeg';
13
17
  size: number;
14
18
  createdAt: string;
15
19
  observedAt: string;
@@ -758,6 +758,7 @@ export const IntegrationExecuteInputRules = {
758
758
  rate: { kind: "string", required: true, minLength: 0, maxLength: 17, pattern: "^[0-9]{1,10}(\\.[0-9]{1,6})?$" },
759
759
  taxId: { kind: "string", required: false, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
760
760
  description: { kind: "string", required: false, minLength: 0, maxLength: 2000 },
761
+ salesOrderItemId: { kind: "string", required: false, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
761
762
  } },
762
763
  },
763
764
  },
@@ -773,6 +774,47 @@ export const IntegrationExecuteInputRules = {
773
774
  documentId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
774
775
  },
775
776
  },
777
+ "zohobooks.salesorder.list": {
778
+ idempotencyKey: false,
779
+ fields: {
780
+ customerId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
781
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
782
+ },
783
+ },
784
+ "zohobooks.salesorder.read": {
785
+ idempotencyKey: false,
786
+ fields: {
787
+ documentId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
788
+ },
789
+ },
790
+ "zohobooks.invoice.reviseDraft": {
791
+ idempotencyKey: true,
792
+ fields: {
793
+ documentId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
794
+ lineItems: { kind: "object[]", required: true, minItems: 1, maxItems: 100, fields: {
795
+ lineItemId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
796
+ quantity: { kind: "string", required: true, minLength: 0, maxLength: 17, pattern: "^[0-9]{1,10}(\\.[0-9]{1,6})?$" },
797
+ } },
798
+ },
799
+ },
800
+ "zohobooks.creditnote.create": {
801
+ idempotencyKey: true,
802
+ fields: {
803
+ documentId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
804
+ documentDate: { kind: "string", required: true, minLength: 0, maxLength: 10, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
805
+ referenceNumber: { kind: "string", required: false, minLength: 1, maxLength: 100 },
806
+ lineItems: { kind: "object[]", required: true, minItems: 1, maxItems: 100, fields: {
807
+ lineItemId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
808
+ quantity: { kind: "string", required: true, minLength: 0, maxLength: 17, pattern: "^[0-9]{1,10}(\\.[0-9]{1,6})?$" },
809
+ } },
810
+ },
811
+ },
812
+ "zohobooks.creditnote.read": {
813
+ idempotencyKey: false,
814
+ fields: {
815
+ documentId: { kind: "string", required: true, minLength: 0, maxLength: 32, pattern: "^[0-9]{1,32}$" },
816
+ },
817
+ },
776
818
  } as const satisfies Record<string, IntegrationExecuteOperationRule>;
777
819
 
778
820
  export type IntegrationExecuteOperation = keyof typeof IntegrationExecuteInputRules;
@@ -101,7 +101,12 @@ export type IntegrationExecuteRequest = {
101
101
  | 'zohobooks.bill.read'
102
102
  | 'zohobooks.invoice.create'
103
103
  | 'zohobooks.invoice.read'
104
- | 'zohobooks.invoice.pdf';
104
+ | 'zohobooks.invoice.pdf'
105
+ | 'zohobooks.salesorder.list'
106
+ | 'zohobooks.salesorder.read'
107
+ | 'zohobooks.invoice.reviseDraft'
108
+ | 'zohobooks.creditnote.create'
109
+ | 'zohobooks.creditnote.read';
105
110
  /**
106
111
  * Tenant-wide logical alias of a connection (governance sourceId) or of a resource under it.
107
112
  */
@@ -462,12 +467,14 @@ export type IntegrationExecuteRequest = {
462
467
  * @maxItems 100
463
468
  */
464
469
  lineItems?: {
465
- itemId: string;
470
+ itemId?: string;
466
471
  quantity: string;
467
- rate: string;
472
+ rate?: string;
468
473
  taxId?: string;
469
474
  description?: string;
470
475
  purchaseOrderItemId?: string;
476
+ lineItemId?: string;
477
+ salesOrderItemId?: string;
471
478
  }[];
472
479
  };
473
480
  /**
@@ -308,7 +308,11 @@ export type IntegrationExecuteResult = {
308
308
  description?: string;
309
309
  lineItemId?: string;
310
310
  purchaseOrderItemId?: string;
311
+ sku?: string;
312
+ taxId?: string;
313
+ isInvoiced?: boolean;
311
314
  }[];
315
+ referenceNumber?: string;
312
316
  };
313
317
  /**
314
318
  * @maxItems 100
@@ -340,7 +344,11 @@ export type IntegrationExecuteResult = {
340
344
  description?: string;
341
345
  lineItemId?: string;
342
346
  purchaseOrderItemId?: string;
347
+ sku?: string;
348
+ taxId?: string;
349
+ isInvoiced?: boolean;
343
350
  }[];
351
+ referenceNumber?: string;
344
352
  }[];
345
353
  /**
346
354
  * Resolved reply recipients, when supplied by the provider adapter. Outlook uses replyTo when present, otherwise from. Optional for backward compatibility.
@@ -348,6 +356,34 @@ export type IntegrationExecuteResult = {
348
356
  * @maxItems 50
349
357
  */
350
358
  replyTo?: string[];
359
+ /**
360
+ * @maxItems 100
361
+ */
362
+ booksSalesOrders?: {
363
+ id: string;
364
+ number: string;
365
+ status: string;
366
+ currency: string;
367
+ total: string;
368
+ vendorId?: string;
369
+ customerId?: string;
370
+ /**
371
+ * @maxItems 100
372
+ */
373
+ lineItems: {
374
+ itemId: string;
375
+ quantity: string;
376
+ rate: string;
377
+ total: string;
378
+ description?: string;
379
+ lineItemId?: string;
380
+ purchaseOrderItemId?: string;
381
+ sku?: string;
382
+ taxId?: string;
383
+ isInvoiced?: boolean;
384
+ }[];
385
+ referenceNumber?: string;
386
+ }[];
351
387
  };
352
388
  /**
353
389
  * An event's state (0.86.0): confirmed (Google `confirmed`, Graph not cancelled and not tentative), tentative, or cancelled.
@@ -807,5 +807,50 @@ export const IntegrationOperations = {
807
807
  "readOnly": true,
808
808
  "declaredMode": false,
809
809
  "idempotencyKey": false
810
+ },
811
+ "zohobooks.salesorder.list": {
812
+ "kind": "saas",
813
+ "identities": [
814
+ "user"
815
+ ],
816
+ "readOnly": true,
817
+ "declaredMode": false,
818
+ "idempotencyKey": false
819
+ },
820
+ "zohobooks.salesorder.read": {
821
+ "kind": "saas",
822
+ "identities": [
823
+ "user"
824
+ ],
825
+ "readOnly": true,
826
+ "declaredMode": false,
827
+ "idempotencyKey": false
828
+ },
829
+ "zohobooks.invoice.reviseDraft": {
830
+ "kind": "saas",
831
+ "identities": [
832
+ "user"
833
+ ],
834
+ "readOnly": false,
835
+ "declaredMode": false,
836
+ "idempotencyKey": true
837
+ },
838
+ "zohobooks.creditnote.create": {
839
+ "kind": "saas",
840
+ "identities": [
841
+ "user"
842
+ ],
843
+ "readOnly": false,
844
+ "declaredMode": false,
845
+ "idempotencyKey": true
846
+ },
847
+ "zohobooks.creditnote.read": {
848
+ "kind": "saas",
849
+ "identities": [
850
+ "user"
851
+ ],
852
+ "readOnly": true,
853
+ "declaredMode": false,
854
+ "idempotencyKey": false
810
855
  }
811
856
  } as const;
@@ -73,7 +73,7 @@ export interface SaasConnection {
73
73
  * Operations IT allows apps to request on this connection: the provider's own SaaS operations (Slack: slack.channel.history, slack.message.post, slack.message.update, slack.message.delete, slack.dm.send, slack.user.lookup; Gmail: gmail.thread.list, gmail.thread.read, gmail.message.read, gmail.message.send, gmail.attachment.read; Basecamp (0.76.0): basecamp.project.list, basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create, basecamp.todo.complete, basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post, basecamp.people.list; SharePoint (0.78.0): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create, sharepoint.item.update, sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read, sharepoint.file.upload; Google Workspace and Microsoft 365 (0.86.0): the calendar.*, drive.*, docs.*, sheets.*, outlook.*, onedrive.*, excel.* and teams.* operations of the connection's provider). Never warehouse.view.read. Phone (0.82.0): phone.sms.list; 0.83.0 adds phone.number.get. Seventy-eight SaaS operations in all since 0.86.0.
74
74
  *
75
75
  * @minItems 1
76
- * @maxItems 86
76
+ * @maxItems 91
77
77
  */
78
78
  operations: (
79
79
  | 'slack.channel.history'
@@ -165,11 +165,16 @@ export interface SaasConnection {
165
165
  | 'zohobooks.invoice.create'
166
166
  | 'zohobooks.invoice.read'
167
167
  | 'zohobooks.invoice.pdf'
168
+ | 'zohobooks.salesorder.list'
169
+ | 'zohobooks.salesorder.read'
170
+ | 'zohobooks.invoice.reviseDraft'
171
+ | 'zohobooks.creditnote.create'
172
+ | 'zohobooks.creditnote.read'
168
173
  )[];
169
174
  /**
170
175
  * Explicit user-mode operations eligible for automatic app access, subject to the connection operation ceiling and personal consent. Empty means review all; absent inherits company defaults or the existing userModeApproval migration rule. Governance validates provider and mode compatibility. Background execution still requires personal background consent, not a separate admin grant.
171
176
  *
172
- * @maxItems 86
177
+ * @maxItems 91
173
178
  */
174
179
  automaticUserOperations?: (
175
180
  | 'slack.channel.history'
@@ -261,6 +266,11 @@ export interface SaasConnection {
261
266
  | 'zohobooks.invoice.create'
262
267
  | 'zohobooks.invoice.read'
263
268
  | 'zohobooks.invoice.pdf'
269
+ | 'zohobooks.salesorder.list'
270
+ | 'zohobooks.salesorder.read'
271
+ | 'zohobooks.invoice.reviseDraft'
272
+ | 'zohobooks.creditnote.create'
273
+ | 'zohobooks.creditnote.read'
264
274
  )[];
265
275
  /**
266
276
  * Reusable permissions for admitted builders on explicit shared SaaS resources. Governance checks registered resources, provider/mode compatibility and the connection operation ceiling. Connection version and audit record changes; no per-entry approval metadata.
@@ -366,7 +376,7 @@ export interface ReusableSaasAccess {
366
376
  mode: 'app' | 'user';
367
377
  /**
368
378
  * @minItems 1
369
- * @maxItems 86
379
+ * @maxItems 91
370
380
  */
371
381
  operations: (
372
382
  | 'slack.channel.history'
@@ -458,6 +468,11 @@ export interface ReusableSaasAccess {
458
468
  | 'zohobooks.invoice.create'
459
469
  | 'zohobooks.invoice.read'
460
470
  | 'zohobooks.invoice.pdf'
471
+ | 'zohobooks.salesorder.list'
472
+ | 'zohobooks.salesorder.read'
473
+ | 'zohobooks.invoice.reviseDraft'
474
+ | 'zohobooks.creditnote.create'
475
+ | 'zohobooks.creditnote.read'
461
476
  )[];
462
477
  }
463
478
  export interface DevelopmentPreapproval {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.96.0",
3
+ "version": "0.97.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,
@@ -141,7 +141,12 @@
141
141
  "zohobooks.bill.read",
142
142
  "zohobooks.invoice.create",
143
143
  "zohobooks.invoice.read",
144
- "zohobooks.invoice.pdf"
144
+ "zohobooks.invoice.pdf",
145
+ "zohobooks.salesorder.list",
146
+ "zohobooks.salesorder.read",
147
+ "zohobooks.invoice.reviseDraft",
148
+ "zohobooks.creditnote.create",
149
+ "zohobooks.creditnote.read"
145
150
  ],
146
151
  "description": "Closed operation set. Extending it is a contracts change. 0.86.0 (ADR 0032) adds the forty-five Google Workspace and Microsoft 365 operations, every one user mode only: on the provider's fixed alias for the signed-in person's own data, calendar.calendar.list, calendar.event.list, calendar.event.read, calendar.event.create (a receipted write: explicit action, idempotencyKey), calendar.event.update and calendar.event.cancel (idempotent at Google, no key); drive.file.list, drive.file.search, drive.file.read, drive.file.upload and drive.folder.create (receipted writes); docs.document.read, docs.document.create (receipted), docs.document.append and docs.text.replace (no key); sheets.spreadsheet.read, sheets.values.read, sheets.values.append (receipted), sheets.values.update and sheets.values.clear (no key), sheets.spreadsheet.create (receipted); outlook.message.list, outlook.message.read, outlook.attachment.read, outlook.message.send and outlook.message.reply (receipted sends, as gmail.message.send), outlook.event.list, outlook.event.read, outlook.event.create (receipted), outlook.event.update and outlook.event.cancel (no key); onedrive.file.list, onedrive.file.search, onedrive.file.read, onedrive.file.upload and onedrive.folder.create (receipted); excel.worksheet.list, excel.range.read, excel.range.update (no key), excel.table.list, excel.row.add and excel.worksheet.add (receipted); and on a Teams channel alias (a key of the connection's `channels` map) teams.message.list, teams.message.post and teams.reply.post (receipted). 0.78.0 (ADR 0024) adds the nine SharePoint operations, every one user mode only on a site alias (a key of the connection's `channels` map, holding a Microsoft Graph site id): sharepoint.list.list, sharepoint.item.list, sharepoint.item.create (a receipted write: explicit action, idempotencyKey), sharepoint.item.update (a PATCH, idempotent at Graph, no key), sharepoint.drive.list, sharepoint.file.list, sharepoint.file.search, sharepoint.file.read and sharepoint.file.upload (a receipted write). 0.76.0 (ADR 0022) adds the eleven Basecamp operations, every one user mode only like gmail.*: basecamp.project.list (the projects of the company's pinned Basecamp account; its resource is the fixed `account` alias), and on one mapped project (the resource is a project alias, a key of the connection's `channels` map) basecamp.todolist.list, basecamp.todo.list, basecamp.todo.create (a receipted write: explicit action, idempotencyKey), basecamp.todo.complete (idempotent at Basecamp, no key), basecamp.message.list, basecamp.message.post, basecamp.comment.list, basecamp.comment.post, basecamp.campfire.post (the three posts are receipted writes) and basecamp.people.list. gmail.message.send (0.50.0) sends one email as the signed-in person: a send like slack.message.post (explicit Send, idempotencyKey, write receipt) under user identity; since 0.71.0 it may carry an HTML body and attachments. slack.message.post (0.53.0) runs in the mode the app declares: app (the company's Slack app, under the IT-approved per-app name) or user (the signed-in person, after their consent); since 0.55.0 each call names which of the approved modes it runs under. 0.71.0 (ADR 0018) adds slack.message.update and slack.message.delete (declared mode, like post), slack.dm.send (app mode: a direct message to 1..8 workspace members named by email), slack.user.lookup (app mode: email to Slack user id), gmail.thread.read (every message of one thread) and gmail.attachment.read (one attachment's bytes), and lets slack.channel.history run in app mode as well as user mode. 0.82.0 (ADR 0028) adds phone.sms.list (app mode only, a number alias from a phone connection's `channels` map: the SMS received on that number since a time) and warehouse.table.append (app mode only on a database connection, a receipted write with idempotencyKey: rows appended to a view alias whose mapping says `access: append`). 0.83.0 (ADR 0029) adds phone.number.get (app mode only, read-only, no input, on a number alias from a phone connection's `channels` map: the E.164 number that alias maps to, so the app — or a computer-use agent it drives — can type it into a portal that signs in by mobile number). 0.85.0 (ADR 0031) raises warehouse.table.append's `rows` from 1..500 to 1..5000 records (the byte cap stays governance's, now 8 MiB), so a downloaded report of a few thousand rows lands in one call."
147
152
  },
@@ -599,6 +604,21 @@
599
604
  },
600
605
  "zohobooks.invoice.pdf": {
601
606
  "$ref": "#/definitions/UserModeChannelOperation"
607
+ },
608
+ "zohobooks.salesorder.list": {
609
+ "$ref": "#/definitions/UserModeChannelOperation"
610
+ },
611
+ "zohobooks.salesorder.read": {
612
+ "$ref": "#/definitions/UserModeChannelOperation"
613
+ },
614
+ "zohobooks.invoice.reviseDraft": {
615
+ "$ref": "#/definitions/UserModeChannelOperation"
616
+ },
617
+ "zohobooks.creditnote.create": {
618
+ "$ref": "#/definitions/UserModeChannelOperation"
619
+ },
620
+ "zohobooks.creditnote.read": {
621
+ "$ref": "#/definitions/UserModeChannelOperation"
602
622
  }
603
623
  }
604
624
  }
@@ -1085,6 +1105,31 @@
1085
1105
  "required": [
1086
1106
  "zohobooks.invoice.pdf"
1087
1107
  ]
1108
+ },
1109
+ {
1110
+ "required": [
1111
+ "zohobooks.salesorder.list"
1112
+ ]
1113
+ },
1114
+ {
1115
+ "required": [
1116
+ "zohobooks.salesorder.read"
1117
+ ]
1118
+ },
1119
+ {
1120
+ "required": [
1121
+ "zohobooks.invoice.reviseDraft"
1122
+ ]
1123
+ },
1124
+ {
1125
+ "required": [
1126
+ "zohobooks.creditnote.create"
1127
+ ]
1128
+ },
1129
+ {
1130
+ "required": [
1131
+ "zohobooks.creditnote.read"
1132
+ ]
1088
1133
  }
1089
1134
  ]
1090
1135
  }
@@ -1549,6 +1594,31 @@
1549
1594
  "required": [
1550
1595
  "zohobooks.invoice.pdf"
1551
1596
  ]
1597
+ },
1598
+ {
1599
+ "required": [
1600
+ "zohobooks.salesorder.list"
1601
+ ]
1602
+ },
1603
+ {
1604
+ "required": [
1605
+ "zohobooks.salesorder.read"
1606
+ ]
1607
+ },
1608
+ {
1609
+ "required": [
1610
+ "zohobooks.invoice.reviseDraft"
1611
+ ]
1612
+ },
1613
+ {
1614
+ "required": [
1615
+ "zohobooks.creditnote.create"
1616
+ ]
1617
+ },
1618
+ {
1619
+ "required": [
1620
+ "zohobooks.creditnote.read"
1621
+ ]
1552
1622
  }
1553
1623
  ]
1554
1624
  }
@@ -17,7 +17,7 @@
17
17
  "status": { "$ref": "#/definitions/DataGrantV2Status" },
18
18
  "operations": {
19
19
  "type": "array",
20
- "maxItems": 86,
20
+ "maxItems": 91,
21
21
  "uniqueItems": true,
22
22
  "items": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation" },
23
23
  "description": "Approved operations; each must match this grant's mode. Empty until the first approval. At most the seventy-eight SaaS operations (0.86.0: eleven Slack and Gmail, eleven Basecamp, nine SharePoint, two phone, forty-five Google Workspace and Microsoft 365); a database grant holds up to two (warehouse.view.read, warehouse.table.append)."
@@ -65,7 +65,7 @@
65
65
  "description": "Only for SaaS grants mixing reviewed and automatic access: the previously human-reviewed scope. The remaining scope must satisfy current automatic rules. Homogeneous grants continue using approvedBy alone. Governance validates this is a subset of the grant; database behaviour is unchanged.",
66
66
  "properties": {
67
67
  "operations": {
68
- "type": "array", "maxItems": 86, "uniqueItems": true,
68
+ "type": "array", "maxItems": 91, "uniqueItems": true,
69
69
  "items": { "$ref": "app-integrations-declaration.schema.json#/definitions/IntegrationOperation" }
70
70
  },
71
71
  "resources": {