@fourier-labs/harbour-contracts 0.85.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.
@@ -18,7 +18,8 @@ export type IntegrationExecuteInputFieldRule =
18
18
  | { kind: 'value'; required: boolean; types: readonly IntegrationExecuteInputValueType[]; maxLength?: number; list?: { minItems: number; maxItems: number; types: readonly IntegrationExecuteInputValueType[] } }
19
19
  | { kind: 'boolean'; required: boolean }
20
20
  | { kind: 'record'; required: boolean; minProperties: number; maxProperties: number; types: readonly IntegrationExecuteInputRecordValueType[]; maxLength?: number }
21
- | { kind: 'record[]'; required: boolean; minItems: number; maxItems: number; minProperties: number; maxProperties: number; types: readonly IntegrationExecuteInputRecordValueType[]; maxLength?: number };
21
+ | { kind: 'record[]'; required: boolean; minItems: number; maxItems: number; minProperties: number; maxProperties: number; types: readonly IntegrationExecuteInputRecordValueType[]; maxLength?: number }
22
+ | { kind: 'matrix'; required: boolean; minItems: number; maxItems: number; row: { minItems: number; maxItems: number }; types: readonly IntegrationExecuteInputRecordValueType[]; maxLength?: number };
22
23
 
23
24
  /** The scalar types a `value` input accepts, alone or in its list form. */
24
25
  export type IntegrationExecuteInputValueType = 'string' | 'number' | 'boolean';
@@ -280,6 +281,383 @@ export const IntegrationExecuteInputRules = {
280
281
  idempotencyKey: false,
281
282
  fields: {},
282
283
  },
284
+ "calendar.calendar.list": {
285
+ idempotencyKey: false,
286
+ fields: {
287
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
288
+ },
289
+ },
290
+ "calendar.event.list": {
291
+ idempotencyKey: false,
292
+ fields: {
293
+ calendarId: { kind: "string", required: false, minLength: 1, maxLength: 256 },
294
+ timeMin: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
295
+ timeMax: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
296
+ q: { kind: "string", required: false, minLength: 1, maxLength: 256 },
297
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
298
+ },
299
+ },
300
+ "calendar.event.read": {
301
+ idempotencyKey: false,
302
+ fields: {
303
+ calendarId: { kind: "string", required: false, minLength: 1, maxLength: 256 },
304
+ eventId: { kind: "string", required: true, minLength: 1, maxLength: 1024 },
305
+ },
306
+ },
307
+ "calendar.event.create": {
308
+ idempotencyKey: true,
309
+ fields: {
310
+ calendarId: { kind: "string", required: false, minLength: 1, maxLength: 256 },
311
+ title: { kind: "string", required: true, minLength: 1, maxLength: 256 },
312
+ start: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
313
+ end: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
314
+ timeZone: { kind: "string", required: false, minLength: 1, maxLength: 64 },
315
+ allDay: { kind: "boolean", required: false },
316
+ description: { kind: "string", required: false, minLength: 1, maxLength: 8000 },
317
+ location: { kind: "string", required: false, minLength: 1, maxLength: 512 },
318
+ attendees: { kind: "string[]", required: false, minItems: 1, maxItems: 100, uniqueItems: true, item: { minLength: 3, maxLength: 254, pattern: "^[^\\s@<>,;\"]+@[^\\s@<>,;\"]+\\.[^\\s@<>,;\"]+$" } },
319
+ notify: { kind: "boolean", required: false },
320
+ },
321
+ },
322
+ "calendar.event.update": {
323
+ idempotencyKey: false,
324
+ fields: {
325
+ calendarId: { kind: "string", required: false, minLength: 1, maxLength: 256 },
326
+ eventId: { kind: "string", required: true, minLength: 1, maxLength: 1024 },
327
+ title: { kind: "string", required: false, minLength: 1, maxLength: 256 },
328
+ start: { kind: "string", required: false, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
329
+ end: { kind: "string", required: false, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
330
+ timeZone: { kind: "string", required: false, minLength: 1, maxLength: 64 },
331
+ description: { kind: "string", required: false, minLength: 1, maxLength: 8000 },
332
+ location: { kind: "string", required: false, minLength: 1, maxLength: 512 },
333
+ attendees: { kind: "string[]", required: false, minItems: 1, maxItems: 100, uniqueItems: true, item: { minLength: 3, maxLength: 254, pattern: "^[^\\s@<>,;\"]+@[^\\s@<>,;\"]+\\.[^\\s@<>,;\"]+$" } },
334
+ notify: { kind: "boolean", required: false },
335
+ },
336
+ },
337
+ "calendar.event.cancel": {
338
+ idempotencyKey: false,
339
+ fields: {
340
+ calendarId: { kind: "string", required: false, minLength: 1, maxLength: 256 },
341
+ eventId: { kind: "string", required: true, minLength: 1, maxLength: 1024 },
342
+ notify: { kind: "boolean", required: false },
343
+ },
344
+ },
345
+ "drive.file.list": {
346
+ idempotencyKey: false,
347
+ fields: {
348
+ folderId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
349
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
350
+ },
351
+ },
352
+ "drive.file.search": {
353
+ idempotencyKey: false,
354
+ fields: {
355
+ q: { kind: "string", required: true, minLength: 1, maxLength: 256 },
356
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
357
+ },
358
+ },
359
+ "drive.file.read": {
360
+ idempotencyKey: false,
361
+ fields: {
362
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
363
+ exportAs: { kind: "enum", required: false, values: ["text", "csv", "pdf"] },
364
+ },
365
+ },
366
+ "drive.file.upload": {
367
+ idempotencyKey: true,
368
+ fields: {
369
+ filename: { kind: "string", required: true, minLength: 1, maxLength: 255 },
370
+ contentType: { kind: "string", required: true, minLength: 1, maxLength: 128 },
371
+ dataBase64: { kind: "string", required: true, minLength: 1, maxLength: 2796203 },
372
+ folderId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
373
+ conflict: { kind: "enum", required: false, values: ["rename", "replace", "fail"], default: "rename" },
374
+ },
375
+ },
376
+ "drive.folder.create": {
377
+ idempotencyKey: true,
378
+ fields: {
379
+ title: { kind: "string", required: true, minLength: 1, maxLength: 256 },
380
+ folderId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
381
+ },
382
+ },
383
+ "docs.document.read": {
384
+ idempotencyKey: false,
385
+ fields: {
386
+ documentId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
387
+ },
388
+ },
389
+ "docs.document.create": {
390
+ idempotencyKey: true,
391
+ fields: {
392
+ title: { kind: "string", required: true, minLength: 1, maxLength: 256 },
393
+ text: { kind: "string", required: false, minLength: 1, maxLength: 65536 },
394
+ },
395
+ },
396
+ "docs.document.append": {
397
+ idempotencyKey: false,
398
+ fields: {
399
+ documentId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
400
+ text: { kind: "string", required: true, minLength: 1, maxLength: 65536 },
401
+ },
402
+ },
403
+ "docs.text.replace": {
404
+ idempotencyKey: false,
405
+ fields: {
406
+ documentId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
407
+ replacements: { kind: "object[]", required: true, minItems: 1, maxItems: 64, fields: {
408
+ find: { kind: "string", required: true, minLength: 1, maxLength: 512 },
409
+ replace: { kind: "string", required: true, minLength: 0, maxLength: 4000 },
410
+ matchCase: { kind: "boolean", required: false },
411
+ } },
412
+ },
413
+ },
414
+ "sheets.spreadsheet.read": {
415
+ idempotencyKey: false,
416
+ fields: {
417
+ spreadsheetId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
418
+ },
419
+ },
420
+ "sheets.values.read": {
421
+ idempotencyKey: false,
422
+ fields: {
423
+ spreadsheetId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
424
+ range: { kind: "string", required: true, minLength: 1, maxLength: 256 },
425
+ },
426
+ },
427
+ "sheets.values.append": {
428
+ idempotencyKey: true,
429
+ fields: {
430
+ spreadsheetId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
431
+ range: { kind: "string", required: true, minLength: 1, maxLength: 256 },
432
+ values: { kind: "matrix", required: true, minItems: 1, maxItems: 1000, row: { minItems: 1, maxItems: 100 }, types: ["string", "number", "boolean", "null"], maxLength: 4000 },
433
+ valueInput: { kind: "enum", required: false, values: ["raw", "user"], default: "user" },
434
+ },
435
+ },
436
+ "sheets.values.update": {
437
+ idempotencyKey: false,
438
+ fields: {
439
+ spreadsheetId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
440
+ range: { kind: "string", required: true, minLength: 1, maxLength: 256 },
441
+ values: { kind: "matrix", required: true, minItems: 1, maxItems: 1000, row: { minItems: 1, maxItems: 100 }, types: ["string", "number", "boolean", "null"], maxLength: 4000 },
442
+ valueInput: { kind: "enum", required: false, values: ["raw", "user"], default: "user" },
443
+ },
444
+ },
445
+ "sheets.values.clear": {
446
+ idempotencyKey: false,
447
+ fields: {
448
+ spreadsheetId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9_-]{10,128}$" },
449
+ range: { kind: "string", required: true, minLength: 1, maxLength: 256 },
450
+ },
451
+ },
452
+ "sheets.spreadsheet.create": {
453
+ idempotencyKey: true,
454
+ fields: {
455
+ title: { kind: "string", required: true, minLength: 1, maxLength: 256 },
456
+ sheets: { kind: "string[]", required: false, minItems: 1, maxItems: 20, uniqueItems: true, item: { minLength: 1, maxLength: 100 } },
457
+ },
458
+ },
459
+ "outlook.message.list": {
460
+ idempotencyKey: false,
461
+ fields: {
462
+ folder: { kind: "string", required: false, minLength: 1, maxLength: 256 },
463
+ q: { kind: "string", required: false, minLength: 1, maxLength: 256 },
464
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
465
+ },
466
+ },
467
+ "outlook.message.read": {
468
+ idempotencyKey: false,
469
+ fields: {
470
+ messageId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9._=-]{1,256}$" },
471
+ },
472
+ },
473
+ "outlook.attachment.read": {
474
+ idempotencyKey: false,
475
+ fields: {
476
+ messageId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9._=-]{1,256}$" },
477
+ attachmentId: { kind: "string", required: true, minLength: 1, maxLength: 512 },
478
+ },
479
+ },
480
+ "outlook.message.send": {
481
+ idempotencyKey: true,
482
+ fields: {
483
+ to: { kind: "string[]", required: true, minItems: 1, maxItems: 50, uniqueItems: true, item: { minLength: 3, maxLength: 254, pattern: "^[^\\s@<>,;\"]+@[^\\s@<>,;\"]+\\.[^\\s@<>,;\"]+$" } },
484
+ cc: { kind: "string[]", required: false, minItems: 1, maxItems: 50, uniqueItems: true, item: { minLength: 3, maxLength: 254, pattern: "^[^\\s@<>,;\"]+@[^\\s@<>,;\"]+\\.[^\\s@<>,;\"]+$" } },
485
+ bcc: { kind: "string[]", required: false, minItems: 1, maxItems: 50, uniqueItems: true, item: { minLength: 3, maxLength: 254, pattern: "^[^\\s@<>,;\"]+@[^\\s@<>,;\"]+\\.[^\\s@<>,;\"]+$" } },
486
+ subject: { kind: "string", required: true, minLength: 1, maxLength: 256 },
487
+ text: { kind: "string", required: true, minLength: 1, maxLength: 4000 },
488
+ html: { kind: "string", required: false, minLength: 1, maxLength: 65536 },
489
+ attachments: { kind: "object[]", required: false, minItems: 1, maxItems: 5, fields: {
490
+ filename: { kind: "string", required: true, minLength: 1, maxLength: 255 },
491
+ contentType: { kind: "string", required: true, minLength: 1, maxLength: 128 },
492
+ dataBase64: { kind: "string", required: true, minLength: 1, maxLength: 2796203 },
493
+ } },
494
+ },
495
+ },
496
+ "outlook.message.reply": {
497
+ idempotencyKey: true,
498
+ fields: {
499
+ messageId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9._=-]{1,256}$" },
500
+ text: { kind: "string", required: true, minLength: 1, maxLength: 4000 },
501
+ },
502
+ },
503
+ "outlook.event.list": {
504
+ idempotencyKey: false,
505
+ fields: {
506
+ start: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
507
+ end: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
508
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
509
+ },
510
+ },
511
+ "outlook.event.read": {
512
+ idempotencyKey: false,
513
+ fields: {
514
+ eventId: { kind: "string", required: true, minLength: 1, maxLength: 1024 },
515
+ },
516
+ },
517
+ "outlook.event.create": {
518
+ idempotencyKey: true,
519
+ fields: {
520
+ title: { kind: "string", required: true, minLength: 1, maxLength: 256 },
521
+ start: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
522
+ end: { kind: "string", required: true, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
523
+ timeZone: { kind: "string", required: false, minLength: 1, maxLength: 64 },
524
+ allDay: { kind: "boolean", required: false },
525
+ description: { kind: "string", required: false, minLength: 1, maxLength: 8000 },
526
+ location: { kind: "string", required: false, minLength: 1, maxLength: 512 },
527
+ attendees: { kind: "string[]", required: false, minItems: 1, maxItems: 100, uniqueItems: true, item: { minLength: 3, maxLength: 254, pattern: "^[^\\s@<>,;\"]+@[^\\s@<>,;\"]+\\.[^\\s@<>,;\"]+$" } },
528
+ notify: { kind: "boolean", required: false },
529
+ },
530
+ },
531
+ "outlook.event.update": {
532
+ idempotencyKey: false,
533
+ fields: {
534
+ eventId: { kind: "string", required: true, minLength: 1, maxLength: 1024 },
535
+ title: { kind: "string", required: false, minLength: 1, maxLength: 256 },
536
+ start: { kind: "string", required: false, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
537
+ end: { kind: "string", required: false, minLength: 1, pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$" },
538
+ timeZone: { kind: "string", required: false, minLength: 1, maxLength: 64 },
539
+ description: { kind: "string", required: false, minLength: 1, maxLength: 8000 },
540
+ location: { kind: "string", required: false, minLength: 1, maxLength: 512 },
541
+ attendees: { kind: "string[]", required: false, minItems: 1, maxItems: 100, uniqueItems: true, item: { minLength: 3, maxLength: 254, pattern: "^[^\\s@<>,;\"]+@[^\\s@<>,;\"]+\\.[^\\s@<>,;\"]+$" } },
542
+ notify: { kind: "boolean", required: false },
543
+ },
544
+ },
545
+ "outlook.event.cancel": {
546
+ idempotencyKey: false,
547
+ fields: {
548
+ eventId: { kind: "string", required: true, minLength: 1, maxLength: 1024 },
549
+ comment: { kind: "string", required: false, minLength: 1, maxLength: 4000 },
550
+ },
551
+ },
552
+ "onedrive.file.list": {
553
+ idempotencyKey: false,
554
+ fields: {
555
+ folderId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
556
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
557
+ },
558
+ },
559
+ "onedrive.file.search": {
560
+ idempotencyKey: false,
561
+ fields: {
562
+ q: { kind: "string", required: true, minLength: 1, maxLength: 256 },
563
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
564
+ },
565
+ },
566
+ "onedrive.file.read": {
567
+ idempotencyKey: false,
568
+ fields: {
569
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
570
+ },
571
+ },
572
+ "onedrive.file.upload": {
573
+ idempotencyKey: true,
574
+ fields: {
575
+ filename: { kind: "string", required: true, minLength: 1, maxLength: 255 },
576
+ contentType: { kind: "string", required: true, minLength: 1, maxLength: 128 },
577
+ dataBase64: { kind: "string", required: true, minLength: 1, maxLength: 2796203 },
578
+ folderId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
579
+ conflict: { kind: "enum", required: false, values: ["rename", "replace", "fail"], default: "rename" },
580
+ },
581
+ },
582
+ "onedrive.folder.create": {
583
+ idempotencyKey: true,
584
+ fields: {
585
+ title: { kind: "string", required: true, minLength: 1, maxLength: 256 },
586
+ folderId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
587
+ },
588
+ },
589
+ "excel.worksheet.list": {
590
+ idempotencyKey: false,
591
+ fields: {
592
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
593
+ driveId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
594
+ },
595
+ },
596
+ "excel.range.read": {
597
+ idempotencyKey: false,
598
+ fields: {
599
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
600
+ driveId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
601
+ worksheet: { kind: "string", required: true, minLength: 1, maxLength: 255 },
602
+ address: { kind: "string", required: false, minLength: 1, maxLength: 64 },
603
+ },
604
+ },
605
+ "excel.range.update": {
606
+ idempotencyKey: false,
607
+ fields: {
608
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
609
+ driveId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
610
+ worksheet: { kind: "string", required: true, minLength: 1, maxLength: 255 },
611
+ address: { kind: "string", required: true, minLength: 1, maxLength: 64 },
612
+ values: { kind: "matrix", required: true, minItems: 1, maxItems: 1000, row: { minItems: 1, maxItems: 100 }, types: ["string", "number", "boolean", "null"], maxLength: 4000 },
613
+ },
614
+ },
615
+ "excel.table.list": {
616
+ idempotencyKey: false,
617
+ fields: {
618
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
619
+ driveId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
620
+ worksheet: { kind: "string", required: false, minLength: 1, maxLength: 255 },
621
+ },
622
+ },
623
+ "excel.row.add": {
624
+ idempotencyKey: true,
625
+ fields: {
626
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
627
+ driveId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
628
+ tableName: { kind: "string", required: true, minLength: 1, maxLength: 255 },
629
+ values: { kind: "matrix", required: true, minItems: 1, maxItems: 1000, row: { minItems: 1, maxItems: 100 }, types: ["string", "number", "boolean", "null"], maxLength: 4000 },
630
+ },
631
+ },
632
+ "excel.worksheet.add": {
633
+ idempotencyKey: true,
634
+ fields: {
635
+ fileId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
636
+ driveId: { kind: "string", required: false, minLength: 0, pattern: "^[A-Za-z0-9!._,=-]{1,256}$" },
637
+ title: { kind: "string", required: true, minLength: 1, maxLength: 256 },
638
+ },
639
+ },
640
+ "teams.message.list": {
641
+ idempotencyKey: false,
642
+ fields: {
643
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 2048 },
644
+ },
645
+ },
646
+ "teams.message.post": {
647
+ idempotencyKey: true,
648
+ fields: {
649
+ text: { kind: "string", required: true, minLength: 1, maxLength: 4000 },
650
+ html: { kind: "string", required: false, minLength: 1, maxLength: 65536 },
651
+ },
652
+ },
653
+ "teams.reply.post": {
654
+ idempotencyKey: true,
655
+ fields: {
656
+ messageId: { kind: "string", required: true, minLength: 0, pattern: "^[A-Za-z0-9._=-]{1,256}$" },
657
+ text: { kind: "string", required: true, minLength: 1, maxLength: 4000 },
658
+ html: { kind: "string", required: false, minLength: 1, maxLength: 65536 },
659
+ },
660
+ },
283
661
  "warehouse.view.read": {
284
662
  idempotencyKey: false,
285
663
  fields: {
@@ -411,6 +789,17 @@ function checkField(operation: string, path: string, name: string, field: Integr
411
789
  }
412
790
  return { ok: true, value };
413
791
  }
792
+ case 'matrix': {
793
+ if (!Array.isArray(value) || value.length < field.minItems || value.length > field.maxItems) return refuse(path, `${path} must list ${field.minItems} to ${field.maxItems} items`);
794
+ for (const [index, row] of value.entries()) {
795
+ if (!Array.isArray(row)) return refuse(path, `${path}[${index}] is not a valid ${name} entry`);
796
+ if (row.length < field.row.minItems || row.length > field.row.maxItems) return refuse(`${path}[${index}]`, `${path}[${index}] must list ${field.row.minItems} to ${field.row.maxItems} items`);
797
+ for (const [column, cell] of row.entries()) {
798
+ if (!isScalar(field.types, field.maxLength, cell)) return refuse(`${path}[${index}][${column}]`, `${path}[${index}][${column}] must be ${either(scalarShapes(field.types, field.maxLength))}`);
799
+ }
800
+ }
801
+ return { ok: true, value };
802
+ }
414
803
  case 'integer':
415
804
  if (typeof value !== 'number' || !Number.isInteger(value) || value < field.minimum || value > field.maximum) return refuse(path, `${path} must be an integer between ${field.minimum} and ${field.maximum}`);
416
805
  return { ok: true, value };