@fourier-labs/harbour-contracts 0.84.0 → 0.86.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.
@@ -304,6 +304,411 @@ export const IntegrationOperations = {
304
304
  "declaredMode": false,
305
305
  "idempotencyKey": false
306
306
  },
307
+ "calendar.calendar.list": {
308
+ "kind": "saas",
309
+ "identities": [
310
+ "user"
311
+ ],
312
+ "readOnly": true,
313
+ "declaredMode": false,
314
+ "idempotencyKey": false
315
+ },
316
+ "calendar.event.list": {
317
+ "kind": "saas",
318
+ "identities": [
319
+ "user"
320
+ ],
321
+ "readOnly": true,
322
+ "declaredMode": false,
323
+ "idempotencyKey": false
324
+ },
325
+ "calendar.event.read": {
326
+ "kind": "saas",
327
+ "identities": [
328
+ "user"
329
+ ],
330
+ "readOnly": true,
331
+ "declaredMode": false,
332
+ "idempotencyKey": false
333
+ },
334
+ "calendar.event.create": {
335
+ "kind": "saas",
336
+ "identities": [
337
+ "user"
338
+ ],
339
+ "readOnly": false,
340
+ "declaredMode": false,
341
+ "idempotencyKey": true
342
+ },
343
+ "calendar.event.update": {
344
+ "kind": "saas",
345
+ "identities": [
346
+ "user"
347
+ ],
348
+ "readOnly": false,
349
+ "declaredMode": false,
350
+ "idempotencyKey": false
351
+ },
352
+ "calendar.event.cancel": {
353
+ "kind": "saas",
354
+ "identities": [
355
+ "user"
356
+ ],
357
+ "readOnly": false,
358
+ "declaredMode": false,
359
+ "idempotencyKey": false
360
+ },
361
+ "drive.file.list": {
362
+ "kind": "saas",
363
+ "identities": [
364
+ "user"
365
+ ],
366
+ "readOnly": true,
367
+ "declaredMode": false,
368
+ "idempotencyKey": false
369
+ },
370
+ "drive.file.search": {
371
+ "kind": "saas",
372
+ "identities": [
373
+ "user"
374
+ ],
375
+ "readOnly": true,
376
+ "declaredMode": false,
377
+ "idempotencyKey": false
378
+ },
379
+ "drive.file.read": {
380
+ "kind": "saas",
381
+ "identities": [
382
+ "user"
383
+ ],
384
+ "readOnly": true,
385
+ "declaredMode": false,
386
+ "idempotencyKey": false
387
+ },
388
+ "drive.file.upload": {
389
+ "kind": "saas",
390
+ "identities": [
391
+ "user"
392
+ ],
393
+ "readOnly": false,
394
+ "declaredMode": false,
395
+ "idempotencyKey": true
396
+ },
397
+ "drive.folder.create": {
398
+ "kind": "saas",
399
+ "identities": [
400
+ "user"
401
+ ],
402
+ "readOnly": false,
403
+ "declaredMode": false,
404
+ "idempotencyKey": true
405
+ },
406
+ "docs.document.read": {
407
+ "kind": "saas",
408
+ "identities": [
409
+ "user"
410
+ ],
411
+ "readOnly": true,
412
+ "declaredMode": false,
413
+ "idempotencyKey": false
414
+ },
415
+ "docs.document.create": {
416
+ "kind": "saas",
417
+ "identities": [
418
+ "user"
419
+ ],
420
+ "readOnly": false,
421
+ "declaredMode": false,
422
+ "idempotencyKey": true
423
+ },
424
+ "docs.document.append": {
425
+ "kind": "saas",
426
+ "identities": [
427
+ "user"
428
+ ],
429
+ "readOnly": false,
430
+ "declaredMode": false,
431
+ "idempotencyKey": false
432
+ },
433
+ "docs.text.replace": {
434
+ "kind": "saas",
435
+ "identities": [
436
+ "user"
437
+ ],
438
+ "readOnly": false,
439
+ "declaredMode": false,
440
+ "idempotencyKey": false
441
+ },
442
+ "sheets.spreadsheet.read": {
443
+ "kind": "saas",
444
+ "identities": [
445
+ "user"
446
+ ],
447
+ "readOnly": true,
448
+ "declaredMode": false,
449
+ "idempotencyKey": false
450
+ },
451
+ "sheets.values.read": {
452
+ "kind": "saas",
453
+ "identities": [
454
+ "user"
455
+ ],
456
+ "readOnly": true,
457
+ "declaredMode": false,
458
+ "idempotencyKey": false
459
+ },
460
+ "sheets.values.append": {
461
+ "kind": "saas",
462
+ "identities": [
463
+ "user"
464
+ ],
465
+ "readOnly": false,
466
+ "declaredMode": false,
467
+ "idempotencyKey": true
468
+ },
469
+ "sheets.values.update": {
470
+ "kind": "saas",
471
+ "identities": [
472
+ "user"
473
+ ],
474
+ "readOnly": false,
475
+ "declaredMode": false,
476
+ "idempotencyKey": false
477
+ },
478
+ "sheets.values.clear": {
479
+ "kind": "saas",
480
+ "identities": [
481
+ "user"
482
+ ],
483
+ "readOnly": false,
484
+ "declaredMode": false,
485
+ "idempotencyKey": false
486
+ },
487
+ "sheets.spreadsheet.create": {
488
+ "kind": "saas",
489
+ "identities": [
490
+ "user"
491
+ ],
492
+ "readOnly": false,
493
+ "declaredMode": false,
494
+ "idempotencyKey": true
495
+ },
496
+ "outlook.message.list": {
497
+ "kind": "saas",
498
+ "identities": [
499
+ "user"
500
+ ],
501
+ "readOnly": true,
502
+ "declaredMode": false,
503
+ "idempotencyKey": false
504
+ },
505
+ "outlook.message.read": {
506
+ "kind": "saas",
507
+ "identities": [
508
+ "user"
509
+ ],
510
+ "readOnly": true,
511
+ "declaredMode": false,
512
+ "idempotencyKey": false
513
+ },
514
+ "outlook.attachment.read": {
515
+ "kind": "saas",
516
+ "identities": [
517
+ "user"
518
+ ],
519
+ "readOnly": true,
520
+ "declaredMode": false,
521
+ "idempotencyKey": false
522
+ },
523
+ "outlook.message.send": {
524
+ "kind": "saas",
525
+ "identities": [
526
+ "user"
527
+ ],
528
+ "readOnly": false,
529
+ "declaredMode": false,
530
+ "idempotencyKey": true
531
+ },
532
+ "outlook.message.reply": {
533
+ "kind": "saas",
534
+ "identities": [
535
+ "user"
536
+ ],
537
+ "readOnly": false,
538
+ "declaredMode": false,
539
+ "idempotencyKey": true
540
+ },
541
+ "outlook.event.list": {
542
+ "kind": "saas",
543
+ "identities": [
544
+ "user"
545
+ ],
546
+ "readOnly": true,
547
+ "declaredMode": false,
548
+ "idempotencyKey": false
549
+ },
550
+ "outlook.event.read": {
551
+ "kind": "saas",
552
+ "identities": [
553
+ "user"
554
+ ],
555
+ "readOnly": true,
556
+ "declaredMode": false,
557
+ "idempotencyKey": false
558
+ },
559
+ "outlook.event.create": {
560
+ "kind": "saas",
561
+ "identities": [
562
+ "user"
563
+ ],
564
+ "readOnly": false,
565
+ "declaredMode": false,
566
+ "idempotencyKey": true
567
+ },
568
+ "outlook.event.update": {
569
+ "kind": "saas",
570
+ "identities": [
571
+ "user"
572
+ ],
573
+ "readOnly": false,
574
+ "declaredMode": false,
575
+ "idempotencyKey": false
576
+ },
577
+ "outlook.event.cancel": {
578
+ "kind": "saas",
579
+ "identities": [
580
+ "user"
581
+ ],
582
+ "readOnly": false,
583
+ "declaredMode": false,
584
+ "idempotencyKey": false
585
+ },
586
+ "onedrive.file.list": {
587
+ "kind": "saas",
588
+ "identities": [
589
+ "user"
590
+ ],
591
+ "readOnly": true,
592
+ "declaredMode": false,
593
+ "idempotencyKey": false
594
+ },
595
+ "onedrive.file.search": {
596
+ "kind": "saas",
597
+ "identities": [
598
+ "user"
599
+ ],
600
+ "readOnly": true,
601
+ "declaredMode": false,
602
+ "idempotencyKey": false
603
+ },
604
+ "onedrive.file.read": {
605
+ "kind": "saas",
606
+ "identities": [
607
+ "user"
608
+ ],
609
+ "readOnly": true,
610
+ "declaredMode": false,
611
+ "idempotencyKey": false
612
+ },
613
+ "onedrive.file.upload": {
614
+ "kind": "saas",
615
+ "identities": [
616
+ "user"
617
+ ],
618
+ "readOnly": false,
619
+ "declaredMode": false,
620
+ "idempotencyKey": true
621
+ },
622
+ "onedrive.folder.create": {
623
+ "kind": "saas",
624
+ "identities": [
625
+ "user"
626
+ ],
627
+ "readOnly": false,
628
+ "declaredMode": false,
629
+ "idempotencyKey": true
630
+ },
631
+ "excel.worksheet.list": {
632
+ "kind": "saas",
633
+ "identities": [
634
+ "user"
635
+ ],
636
+ "readOnly": true,
637
+ "declaredMode": false,
638
+ "idempotencyKey": false
639
+ },
640
+ "excel.range.read": {
641
+ "kind": "saas",
642
+ "identities": [
643
+ "user"
644
+ ],
645
+ "readOnly": true,
646
+ "declaredMode": false,
647
+ "idempotencyKey": false
648
+ },
649
+ "excel.range.update": {
650
+ "kind": "saas",
651
+ "identities": [
652
+ "user"
653
+ ],
654
+ "readOnly": false,
655
+ "declaredMode": false,
656
+ "idempotencyKey": false
657
+ },
658
+ "excel.table.list": {
659
+ "kind": "saas",
660
+ "identities": [
661
+ "user"
662
+ ],
663
+ "readOnly": true,
664
+ "declaredMode": false,
665
+ "idempotencyKey": false
666
+ },
667
+ "excel.row.add": {
668
+ "kind": "saas",
669
+ "identities": [
670
+ "user"
671
+ ],
672
+ "readOnly": false,
673
+ "declaredMode": false,
674
+ "idempotencyKey": true
675
+ },
676
+ "excel.worksheet.add": {
677
+ "kind": "saas",
678
+ "identities": [
679
+ "user"
680
+ ],
681
+ "readOnly": false,
682
+ "declaredMode": false,
683
+ "idempotencyKey": true
684
+ },
685
+ "teams.message.list": {
686
+ "kind": "saas",
687
+ "identities": [
688
+ "user"
689
+ ],
690
+ "readOnly": true,
691
+ "declaredMode": false,
692
+ "idempotencyKey": false
693
+ },
694
+ "teams.message.post": {
695
+ "kind": "saas",
696
+ "identities": [
697
+ "user"
698
+ ],
699
+ "readOnly": false,
700
+ "declaredMode": false,
701
+ "idempotencyKey": true
702
+ },
703
+ "teams.reply.post": {
704
+ "kind": "saas",
705
+ "identities": [
706
+ "user"
707
+ ],
708
+ "readOnly": false,
709
+ "declaredMode": false,
710
+ "idempotencyKey": true
711
+ },
307
712
  "warehouse.view.read": {
308
713
  "kind": "database",
309
714
  "identities": [
@@ -2,9 +2,22 @@
2
2
  // Code generated by tools/gen/gen.mjs from schema/*.json. DO NOT EDIT.
3
3
 
4
4
  /**
5
- * Slack carries an installation and a channel map; Gmail is user-consent only; Basecamp is user-consent only with an IT-pinned account and a project map in `channels`; SharePoint (0.78.0) is user-consent only, pinned to the company's Microsoft 365 tenant in `account`, with a site map in `channels`. Phone (0.82.0) is app mode only with no installation: the tenant's inbound SMS numbers (E.164) mapped from aliases in `channels`, and the SMS the platform received on them listed by phone.sms.list; since 0.83.0 an app reads the number an alias maps to with phone.number.get.
5
+ * Slack carries an installation and a channel map; Gmail is user-consent only; Basecamp is user-consent only with an IT-pinned account and a project map in `channels`; SharePoint (0.78.0) is user-consent only, pinned to the company's Microsoft 365 tenant in `account`, with a site map in `channels`. Phone (0.82.0) is app mode only with no installation: the tenant's inbound SMS numbers (E.164) mapped from aliases in `channels`, and the SMS the platform received on them listed by phone.sms.list; since 0.83.0 an app reads the number an alias maps to with phone.number.get. Google Workspace (0.86.0, ADR 0032: calendar, drive, docs, sheets on the Google OAuth client) and Microsoft 365 (outlook, onedrive, excel, teams on the Microsoft client) are user-consent only like Gmail, one connection per provider with its own consent and scopes; the seven personal providers have no `account` and empty `channels` (their one fixed alias is the signed-in person's own calendar, drive, documents, spreadsheets, mailbox or workbooks); teams is pinned to the Microsoft 365 tenant in `account` like SharePoint and maps channel aliases in `channels`.
6
6
  */
7
- export type SaasProvider = 'slack' | 'gmail' | 'basecamp' | 'sharepoint' | 'phone';
7
+ export type SaasProvider =
8
+ | 'slack'
9
+ | 'gmail'
10
+ | 'basecamp'
11
+ | 'sharepoint'
12
+ | 'phone'
13
+ | 'calendar'
14
+ | 'drive'
15
+ | 'docs'
16
+ | 'sheets'
17
+ | 'outlook'
18
+ | 'onedrive'
19
+ | 'excel'
20
+ | 'teams';
8
21
  /**
9
22
  * DISABLED stops every app call immediately (details.code CONNECTION_DISABLED).
10
23
  */
@@ -27,7 +40,7 @@ export type ExternalRecipientMode = 'block' | 'allowlist' | 'allow';
27
40
  export type InstallationName = string;
28
41
 
29
42
  /**
30
- * Tenant-wide SaaS connection record (control table sk SAASCONN#<sourceId>, same tenant partition as database sources; alias uniqueness is enforced across both). One connection per tenant and provider: a single bot installation of the platform-owned provider app and a single logical channel map shared by every app environment (grants, requests and user consent links stay per environment). A Gmail connection has neither installation nor channels: user consent is the only step and its one resource is the fixed `inbox` alias. A Basecamp connection (0.76.0, ADR 0022) has no installation either: IT pins the company's Basecamp `account` (chosen from the accounts IT's own Basecamp sign-in belongs to) and maps project aliases to project ids in `channels`; basecamp.project.list runs on the fixed `account` alias. A SharePoint connection (0.78.0, ADR 0024) is shaped the same way: IT pins the company's Microsoft 365 tenant in `account` (the Entra tenant id and the organisation's display name, from IT's own Microsoft sign-in) and maps site aliases to Microsoft Graph site ids (`hostname,siteCollectionGuid,webGuid`) in `channels`; every sharepoint.* operation runs on a site alias. Contains references, never secrets: installation tokens live under their own token records. The pre-T25 per-environment shape (`clientId`, `clientSecretRef`, `environments`, `installations`) is deprecated: the control plane normalises such a stored record on read and never writes it.
43
+ * Tenant-wide SaaS connection record (control table sk SAASCONN#<sourceId>, same tenant partition as database sources; alias uniqueness is enforced across both). One connection per tenant and provider: a single bot installation of the platform-owned provider app and a single logical channel map shared by every app environment (grants, requests and user consent links stay per environment). A Gmail connection has neither installation nor channels: user consent is the only step and its one resource is the fixed `inbox` alias. A Basecamp connection (0.76.0, ADR 0022) has no installation either: IT pins the company's Basecamp `account` (chosen from the accounts IT's own Basecamp sign-in belongs to) and maps project aliases to project ids in `channels`; basecamp.project.list runs on the fixed `account` alias. A SharePoint connection (0.78.0, ADR 0024) is shaped the same way: IT pins the company's Microsoft 365 tenant in `account` (the Entra tenant id and the organisation's display name, from IT's own Microsoft sign-in) and maps site aliases to Microsoft Graph site ids (`hostname,siteCollectionGuid,webGuid`) in `channels`; every sharepoint.* operation runs on a site alias. The eight Google Workspace and Microsoft 365 connections (0.86.0, ADR 0032) are Gmail-shaped: user consent only, one connection per provider (calendar, drive, docs, sheets on the Google client; outlook, onedrive, excel, teams on the Microsoft client), no installation. Seven of them carry no `account` and empty `channels`, acting on the signed-in person's own data through one fixed alias; a Teams connection pins the Microsoft 365 tenant in `account` like SharePoint and maps channel aliases to `<teamId>/<channelId>` in `channels`. Contains references, never secrets: installation tokens live under their own token records. The pre-T25 per-environment shape (`clientId`, `clientSecretRef`, `environments`, `installations`) is deprecated: the control plane normalises such a stored record on read and never writes it.
31
44
  */
32
45
  export interface SaasConnection {
33
46
  schema: 'harbour.saas-connection/1.0';
@@ -47,19 +60,19 @@ export interface SaasConnection {
47
60
  installation?: SaasInstallation;
48
61
  account?: BasecampAccount;
49
62
  /**
50
- * Logical alias → provider resource id: a Slack channel id, a Basecamp project id, a SharePoint site id or a phone number. Always empty for Gmail.
63
+ * Logical alias → provider resource id: a Slack channel id, a Basecamp project id, a SharePoint site id, a phone number or a Teams channel. Always empty for Gmail and for the seven personal Google Workspace and Microsoft 365 providers (0.86.0: calendar, drive, docs, sheets, outlook, onedrive, excel), whose one fixed alias governance resolves.
51
64
  */
52
65
  channels: {
53
66
  /**
54
- * A Slack channel id (public, non-archived), a Basecamp project id (digits), a SharePoint site id (0.78.0: the Microsoft Graph composite `hostname,siteCollectionGuid,webGuid`) or a phone number (0.82.0: E.164, a leading `+` and digits).
67
+ * A Slack channel id (public, non-archived), a Basecamp project id (digits), a SharePoint site id (0.78.0: the Microsoft Graph composite `hostname,siteCollectionGuid,webGuid`), a phone number (0.82.0: E.164, a leading `+` and digits) or a Teams channel (0.86.0: `<teamId>/<channelId>`, the team's GUID and the channel id `19:...@thread.tacv2`, so the alphabet admits `@`, `!` and `/`).
55
68
  */
56
69
  [k: string]: string;
57
70
  };
58
71
  /**
59
- * 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). Never warehouse.view.read. Phone (0.82.0): phone.sms.list; 0.83.0 adds phone.number.get.
72
+ * 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.
60
73
  *
61
74
  * @minItems 1
62
- * @maxItems 33
75
+ * @maxItems 78
63
76
  */
64
77
  operations: (
65
78
  | 'slack.channel.history'
@@ -95,6 +108,51 @@ export interface SaasConnection {
95
108
  | 'sharepoint.file.upload'
96
109
  | 'phone.sms.list'
97
110
  | 'phone.number.get'
111
+ | 'calendar.calendar.list'
112
+ | 'calendar.event.list'
113
+ | 'calendar.event.read'
114
+ | 'calendar.event.create'
115
+ | 'calendar.event.update'
116
+ | 'calendar.event.cancel'
117
+ | 'drive.file.list'
118
+ | 'drive.file.search'
119
+ | 'drive.file.read'
120
+ | 'drive.file.upload'
121
+ | 'drive.folder.create'
122
+ | 'docs.document.read'
123
+ | 'docs.document.create'
124
+ | 'docs.document.append'
125
+ | 'docs.text.replace'
126
+ | 'sheets.spreadsheet.read'
127
+ | 'sheets.values.read'
128
+ | 'sheets.values.append'
129
+ | 'sheets.values.update'
130
+ | 'sheets.values.clear'
131
+ | 'sheets.spreadsheet.create'
132
+ | 'outlook.message.list'
133
+ | 'outlook.message.read'
134
+ | 'outlook.attachment.read'
135
+ | 'outlook.message.send'
136
+ | 'outlook.message.reply'
137
+ | 'outlook.event.list'
138
+ | 'outlook.event.read'
139
+ | 'outlook.event.create'
140
+ | 'outlook.event.update'
141
+ | 'outlook.event.cancel'
142
+ | 'onedrive.file.list'
143
+ | 'onedrive.file.search'
144
+ | 'onedrive.file.read'
145
+ | 'onedrive.file.upload'
146
+ | 'onedrive.folder.create'
147
+ | 'excel.worksheet.list'
148
+ | 'excel.range.read'
149
+ | 'excel.range.update'
150
+ | 'excel.table.list'
151
+ | 'excel.row.add'
152
+ | 'excel.worksheet.add'
153
+ | 'teams.message.list'
154
+ | 'teams.message.post'
155
+ | 'teams.reply.post'
98
156
  | 'warehouse.view.read'
99
157
  | 'warehouse.table.append'
100
158
  | 'service.request'
@@ -169,7 +227,7 @@ export interface SaasInstallation {
169
227
  botName?: string;
170
228
  }
171
229
  /**
172
- * The pinned provider account (0.76.0, Basecamp; 0.78.0, SharePoint — the name keeps its 0.76.0 spelling so consumers need not move): the one account, among those IT's own provider sign-in belongs to, that every user token on this connection must also belong to and that every resource id in `channels` lives in. For Basecamp the account (digits); for SharePoint the Microsoft 365 tenant (the Entra tenant GUID). Absent until IT chooses it; governance refuses every basecamp.* and sharepoint.* call until then.
230
+ * The pinned provider account (0.76.0, Basecamp; 0.78.0, SharePoint; 0.86.0, Teams — the name keeps its 0.76.0 spelling so consumers need not move): the one account, among those IT's own provider sign-in belongs to, that every user token on this connection must also belong to and that every resource id in `channels` lives in. For Basecamp the account (digits); for SharePoint and Teams the Microsoft 365 tenant (the Entra tenant GUID). Absent until IT chooses it; governance refuses every basecamp.*, sharepoint.* and teams.* call until then. The seven personal Google Workspace and Microsoft 365 providers carry none.
173
231
  */
174
232
  export interface BasecampAccount {
175
233
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fourier-labs/harbour-contracts",
3
- "version": "0.84.0",
3
+ "version": "0.86.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,