@isomorph.ai/app-sdk 1.13.1 → 1.14.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.
package/README.md CHANGED
@@ -121,7 +121,54 @@ await isomorph.integrations.execute('company-gmail', {
121
121
  });
122
122
  ```
123
123
 
124
- (1.8.0; contracts 0.71.0)
124
+ Basecamp runs as the signed-in person after their consent. `basecamp.project.list`
125
+ reads the company's pinned Basecamp account on the fixed `account` resource; every
126
+ other operation names a project alias IT mapped to one project. Ids are strings of
127
+ digits; a body is `plain` text unless `contentFormat: 'html'` says otherwise; a
128
+ create or post is an explicit action with a fresh UUID.
129
+
130
+ ```ts
131
+ // The account's projects, then one project's to-do lists and open to-dos
132
+ const { projects } = await isomorph.integrations.execute('company-basecamp', {
133
+ operation: 'basecamp.project.list', resource: 'account', input: {},
134
+ });
135
+ const lists = await isomorph.integrations.execute('company-basecamp', {
136
+ operation: 'basecamp.todolist.list', resource: 'launch', input: {},
137
+ });
138
+ const open = await isomorph.integrations.execute('company-basecamp', {
139
+ operation: 'basecamp.todo.list', resource: 'launch', input: { todolistId: lists.todolists[0].id },
140
+ });
141
+ // open.nextPageToken, when hasMore, is the next read's pageToken
142
+
143
+ // A to-do assigned to a person the project lists, then marked complete
144
+ const { people } = await isomorph.integrations.execute('company-basecamp', {
145
+ operation: 'basecamp.people.list', resource: 'launch', input: {},
146
+ });
147
+ const todo = await isomorph.integrations.execute('company-basecamp', {
148
+ operation: 'basecamp.todo.create', resource: 'launch',
149
+ input: { todolistId: lists.todolists[0].id, content: 'Confirm the venue', dueOn: '2026-10-20', assigneeIds: [people[0].id], notify: true },
150
+ idempotencyKey: crypto.randomUUID(),
151
+ });
152
+ await isomorph.integrations.execute('company-basecamp', {
153
+ operation: 'basecamp.todo.complete', resource: 'launch', input: { todoId: todo.id },
154
+ });
155
+
156
+ // The message board (boardMessages), a comment on one post, and a Campfire line
157
+ const board = await isomorph.integrations.execute('company-basecamp', {
158
+ operation: 'basecamp.message.list', resource: 'launch', input: {},
159
+ });
160
+ await isomorph.integrations.execute('company-basecamp', {
161
+ operation: 'basecamp.comment.post', resource: 'launch',
162
+ input: { recordingId: board.boardMessages[0].id, content: '<p>Done — see <b>the report</b>.</p>', contentFormat: 'html' },
163
+ idempotencyKey: crypto.randomUUID(),
164
+ });
165
+ await isomorph.integrations.execute('company-basecamp', {
166
+ operation: 'basecamp.campfire.post', resource: 'launch', input: { content: 'Launch checklist is complete.' },
167
+ idempotencyKey: crypto.randomUUID(),
168
+ });
169
+ ```
170
+
171
+ (1.14.0; contracts 0.76.0)
125
172
 
126
173
  ## Browser read tools
127
174
 
package/dist/index.d.ts CHANGED
@@ -238,6 +238,136 @@ export interface GmailMessageSendRequest {
238
238
  /** A fresh UUID per authorized Send action, reused only to retry that action. */
239
239
  idempotencyKey: string;
240
240
  }
241
+ /** How Basecamp reads a body: `plain` (the default; escaped, newlines kept) or `html` (Basecamp rich text as written). */
242
+ export type BasecampContentFormat = 'plain' | 'html';
243
+ /** Lists the projects of the company's pinned Basecamp account the signed-in person can see; resource `account`. */
244
+ export interface BasecampProjectListRequest {
245
+ operation: 'basecamp.project.list';
246
+ resource: string;
247
+ input?: {
248
+ /** The `nextPageToken` of the previous page; leave it out to read the first page. */
249
+ pageToken?: string;
250
+ /** `active` projects (the default) or `archived` ones. */
251
+ projectStatus?: 'active' | 'archived';
252
+ };
253
+ }
254
+ /** Lists one project's to-do lists; resource is a project alias. */
255
+ export interface BasecampTodolistListRequest {
256
+ operation: 'basecamp.todolist.list';
257
+ resource: string;
258
+ input?: {
259
+ pageToken?: string;
260
+ };
261
+ }
262
+ /** Lists one to-do list's open to-dos (or its completed ones); resource is a project alias. */
263
+ export interface BasecampTodoListRequest {
264
+ operation: 'basecamp.todo.list';
265
+ resource: string;
266
+ input: {
267
+ /** The `id` a `basecamp.todolist.list` result named. */
268
+ todolistId: string;
269
+ /** True to read the completed to-dos instead of the open ones. */
270
+ completed?: boolean;
271
+ pageToken?: string;
272
+ };
273
+ }
274
+ /** Creates one to-do as the signed-in person; an explicit action with its own idempotency key. */
275
+ export interface BasecampTodoCreateRequest {
276
+ operation: 'basecamp.todo.create';
277
+ resource: string;
278
+ input: {
279
+ todolistId: string;
280
+ /** The to-do's title, 1 to 1000 characters. */
281
+ content: string;
282
+ /** Notes under the title, at most 16 KiB. */
283
+ description?: string;
284
+ /** How `description` is read; `plain` when absent. */
285
+ contentFormat?: BasecampContentFormat;
286
+ /** The due date as `YYYY-MM-DD`. */
287
+ dueOn?: string;
288
+ /** 1 to 20 people to assign, by the `id` a `basecamp.people.list` result named. */
289
+ assigneeIds?: string[];
290
+ /** Whether Basecamp notifies the assignees. */
291
+ notify?: boolean;
292
+ };
293
+ /** A fresh UUID per authorized action, reused only to retry that action. */
294
+ idempotencyKey: string;
295
+ }
296
+ /** Marks one to-do complete; the same outcome however often it runs, so no idempotency key. */
297
+ export interface BasecampTodoCompleteRequest {
298
+ operation: 'basecamp.todo.complete';
299
+ resource: string;
300
+ input: {
301
+ /** The `id` a `basecamp.todo.list` result named. */
302
+ todoId: string;
303
+ };
304
+ }
305
+ /** Lists one project's message board, newest first; resource is a project alias. */
306
+ export interface BasecampMessageListRequest {
307
+ operation: 'basecamp.message.list';
308
+ resource: string;
309
+ input?: {
310
+ pageToken?: string;
311
+ };
312
+ }
313
+ /** Posts one message to the project's message board as the signed-in person. */
314
+ export interface BasecampMessagePostRequest {
315
+ operation: 'basecamp.message.post';
316
+ resource: string;
317
+ input: {
318
+ /** 1 to 256 characters. */
319
+ subject: string;
320
+ /** The body, 1 to 65536 characters. */
321
+ content: string;
322
+ /** How `content` is read; `plain` when absent. */
323
+ contentFormat?: BasecampContentFormat;
324
+ };
325
+ /** A fresh UUID per authorized action, reused only to retry that action. */
326
+ idempotencyKey: string;
327
+ }
328
+ /** Lists the comments on one recording (a message, a to-do), oldest first. */
329
+ export interface BasecampCommentListRequest {
330
+ operation: 'basecamp.comment.list';
331
+ resource: string;
332
+ input: {
333
+ /** The `id` of the message or to-do a list result named. */
334
+ recordingId: string;
335
+ pageToken?: string;
336
+ };
337
+ }
338
+ /** Comments on one recording as the signed-in person. */
339
+ export interface BasecampCommentPostRequest {
340
+ operation: 'basecamp.comment.post';
341
+ resource: string;
342
+ input: {
343
+ recordingId: string;
344
+ /** 1 to 16384 characters. */
345
+ content: string;
346
+ contentFormat?: BasecampContentFormat;
347
+ };
348
+ /** A fresh UUID per authorized action, reused only to retry that action. */
349
+ idempotencyKey: string;
350
+ }
351
+ /** Posts one line to the project's Campfire chat as the signed-in person. */
352
+ export interface BasecampCampfirePostRequest {
353
+ operation: 'basecamp.campfire.post';
354
+ resource: string;
355
+ input: {
356
+ /** 1 to 4000 characters. */
357
+ content: string;
358
+ contentFormat?: BasecampContentFormat;
359
+ };
360
+ /** A fresh UUID per authorized action, reused only to retry that action. */
361
+ idempotencyKey: string;
362
+ }
363
+ /** Lists the people on one project; their `id` is what `basecamp.todo.create` takes in `assigneeIds`. */
364
+ export interface BasecampPeopleListRequest {
365
+ operation: 'basecamp.people.list';
366
+ resource: string;
367
+ input?: {
368
+ pageToken?: string;
369
+ };
370
+ }
241
371
  export interface ServiceRequest {
242
372
  operation: 'service.request';
243
373
  resource?: never;
@@ -255,7 +385,7 @@ export interface ServiceRequestResult {
255
385
  headers: Record<string, string>;
256
386
  body: unknown;
257
387
  }
258
- export type IntegrationRequest = ServiceRequest | SlackChannelHistoryRequest | SlackMessagePostRequest | SlackMessageUpdateRequest | SlackMessageDeleteRequest | SlackDmSendRequest | SlackUserLookupRequest | WarehouseViewReadRequest | GmailThreadListRequest | GmailThreadReadRequest | GmailMessageReadRequest | GmailAttachmentReadRequest | GmailMessageSendRequest;
388
+ export type IntegrationRequest = ServiceRequest | SlackChannelHistoryRequest | SlackMessagePostRequest | SlackMessageUpdateRequest | SlackMessageDeleteRequest | SlackDmSendRequest | SlackUserLookupRequest | WarehouseViewReadRequest | GmailThreadListRequest | GmailThreadReadRequest | GmailMessageReadRequest | GmailAttachmentReadRequest | GmailMessageSendRequest | BasecampProjectListRequest | BasecampTodolistListRequest | BasecampTodoListRequest | BasecampTodoCreateRequest | BasecampTodoCompleteRequest | BasecampMessageListRequest | BasecampMessagePostRequest | BasecampCommentListRequest | BasecampCommentPostRequest | BasecampCampfirePostRequest | BasecampPeopleListRequest;
259
389
  export type IntegrationOperation = IntegrationRequest['operation'];
260
390
  export interface SlackMessage {
261
391
  id: string;
@@ -341,7 +471,109 @@ export interface GmailMessageSendResult {
341
471
  messageId: string;
342
472
  threadId: string;
343
473
  }
344
- export type IntegrationResult<R extends IntegrationRequest> = R extends ServiceRequest ? ServiceRequestResult : R extends SlackChannelHistoryRequest ? SlackChannelHistoryResult : R extends SlackMessagePostRequest | SlackMessageUpdateRequest | SlackMessageDeleteRequest ? SlackMessagePostResult : R extends SlackDmSendRequest ? SlackDmSendResult : R extends SlackUserLookupRequest ? SlackUserLookupResult : R extends WarehouseViewReadRequest ? WarehouseViewReadResult : R extends GmailThreadListRequest ? GmailThreadListResult : R extends GmailThreadReadRequest ? GmailThreadReadResult : R extends GmailMessageReadRequest ? GmailMessageReadResult : R extends GmailAttachmentReadRequest ? GmailAttachmentReadResult : R extends GmailMessageSendRequest ? GmailMessageSendResult : never;
474
+ /** A person named on a Basecamp recording: an author or an assignee. */
475
+ export interface BasecampPersonRef {
476
+ id: string;
477
+ name: string;
478
+ }
479
+ /** One enabled tool of a project, from its dock: `name` is Basecamp's kind (todoset, message_board, chat, schedule, vault, questionnaire, inbox, kanban_board), `title` what the project calls it. */
480
+ export interface BasecampTool {
481
+ id: string;
482
+ name: string;
483
+ title: string;
484
+ }
485
+ export interface BasecampProject {
486
+ /** What IT maps a project alias to on the connection. */
487
+ id: string;
488
+ name: string;
489
+ description?: string;
490
+ appUrl: string;
491
+ tools: BasecampTool[];
492
+ }
493
+ export interface BasecampTodolist {
494
+ /** What `basecamp.todo.list` and `basecamp.todo.create` take as `todolistId`. */
495
+ id: string;
496
+ name: string;
497
+ description?: string;
498
+ /** Basecamp's `completed_ratio`, e.g. `3/10`. */
499
+ completedRatio: string;
500
+ appUrl: string;
501
+ }
502
+ export interface BasecampTodo {
503
+ id: string;
504
+ /** The to-do's title. */
505
+ content: string;
506
+ /** Its notes as plain text; empty when none. */
507
+ description: string;
508
+ completed: boolean;
509
+ /** `YYYY-MM-DD`, when set. */
510
+ dueOn?: string;
511
+ assignees: BasecampPersonRef[];
512
+ appUrl: string;
513
+ createdAt: string;
514
+ }
515
+ /** One message-board post; its `id` is a `recordingId` for `basecamp.comment.list` and `basecamp.comment.post`. */
516
+ export interface BasecampMessage {
517
+ id: string;
518
+ subject: string;
519
+ content: string;
520
+ author: BasecampPersonRef;
521
+ createdAt: string;
522
+ appUrl: string;
523
+ commentsCount: number;
524
+ }
525
+ export interface BasecampComment {
526
+ id: string;
527
+ content: string;
528
+ author: BasecampPersonRef;
529
+ createdAt: string;
530
+ appUrl: string;
531
+ }
532
+ export interface BasecampPerson {
533
+ /** What `basecamp.todo.create` takes in `assigneeIds`. */
534
+ id: string;
535
+ name: string;
536
+ /** When Basecamp shows them. */
537
+ email?: string;
538
+ title?: string;
539
+ /** Whether the person administers the Basecamp account. */
540
+ admin: boolean;
541
+ }
542
+ /** One page of a Basecamp list; `nextPageToken` is present only when `hasMore` and is the next read's `pageToken`. */
543
+ export interface BasecampPage {
544
+ hasMore: boolean;
545
+ nextPageToken?: string;
546
+ }
547
+ export interface BasecampProjectListResult extends BasecampPage {
548
+ projects: BasecampProject[];
549
+ }
550
+ export interface BasecampTodolistListResult extends BasecampPage {
551
+ todolists: BasecampTodolist[];
552
+ }
553
+ export interface BasecampTodoListResult extends BasecampPage {
554
+ todos: BasecampTodo[];
555
+ }
556
+ /** `boardMessages`, not `messages`: that is the Slack history shape. */
557
+ export interface BasecampMessageListResult extends BasecampPage {
558
+ boardMessages: BasecampMessage[];
559
+ }
560
+ export interface BasecampCommentListResult extends BasecampPage {
561
+ comments: BasecampComment[];
562
+ }
563
+ export interface BasecampPeopleListResult extends BasecampPage {
564
+ people: BasecampPerson[];
565
+ }
566
+ /** The new recording and its Basecamp page, for a person to open. */
567
+ export interface BasecampRecordingResult {
568
+ id: string;
569
+ appUrl: string;
570
+ }
571
+ /** `completed` is always true: the to-do is complete whether this call or an earlier one completed it. */
572
+ export interface BasecampTodoCompleteResult {
573
+ id: string;
574
+ completed: true;
575
+ }
576
+ export type IntegrationResult<R extends IntegrationRequest> = R extends ServiceRequest ? ServiceRequestResult : R extends SlackChannelHistoryRequest ? SlackChannelHistoryResult : R extends SlackMessagePostRequest | SlackMessageUpdateRequest | SlackMessageDeleteRequest ? SlackMessagePostResult : R extends SlackDmSendRequest ? SlackDmSendResult : R extends SlackUserLookupRequest ? SlackUserLookupResult : R extends WarehouseViewReadRequest ? WarehouseViewReadResult : R extends GmailThreadListRequest ? GmailThreadListResult : R extends GmailThreadReadRequest ? GmailThreadReadResult : R extends GmailMessageReadRequest ? GmailMessageReadResult : R extends GmailAttachmentReadRequest ? GmailAttachmentReadResult : R extends GmailMessageSendRequest ? GmailMessageSendResult : R extends BasecampProjectListRequest ? BasecampProjectListResult : R extends BasecampTodolistListRequest ? BasecampTodolistListResult : R extends BasecampTodoListRequest ? BasecampTodoListResult : R extends BasecampMessageListRequest ? BasecampMessageListResult : R extends BasecampCommentListRequest ? BasecampCommentListResult : R extends BasecampPeopleListRequest ? BasecampPeopleListResult : R extends BasecampTodoCreateRequest | BasecampMessagePostRequest | BasecampCommentPostRequest | BasecampCampfirePostRequest ? BasecampRecordingResult : R extends BasecampTodoCompleteRequest ? BasecampTodoCompleteResult : never;
345
577
  export type IntegrationConnectResult = {
346
578
  status: 'connected';
347
579
  accountLabel: string;
@@ -53,6 +53,9 @@ export type IntegrationExecuteInputFieldRule = {
53
53
  maxItems: number;
54
54
  types: readonly IntegrationExecuteInputValueType[];
55
55
  };
56
+ } | {
57
+ kind: 'boolean';
58
+ required: boolean;
56
59
  };
57
60
  /** The scalar types a `value` input accepts, alone or in its list form. */
58
61
  export type IntegrationExecuteInputValueType = 'string' | 'number' | 'boolean';
@@ -355,6 +358,217 @@ export declare const IntegrationExecuteInputRules: {
355
358
  };
356
359
  };
357
360
  };
361
+ readonly "basecamp.project.list": {
362
+ readonly idempotencyKey: false;
363
+ readonly fields: {
364
+ readonly pageToken: {
365
+ readonly kind: "string";
366
+ readonly required: false;
367
+ readonly minLength: 1;
368
+ readonly maxLength: 256;
369
+ };
370
+ readonly projectStatus: {
371
+ readonly kind: "enum";
372
+ readonly required: false;
373
+ readonly values: readonly ["active", "archived"];
374
+ };
375
+ };
376
+ };
377
+ readonly "basecamp.todolist.list": {
378
+ readonly idempotencyKey: false;
379
+ readonly fields: {
380
+ readonly pageToken: {
381
+ readonly kind: "string";
382
+ readonly required: false;
383
+ readonly minLength: 1;
384
+ readonly maxLength: 256;
385
+ };
386
+ };
387
+ };
388
+ readonly "basecamp.todo.list": {
389
+ readonly idempotencyKey: false;
390
+ readonly fields: {
391
+ readonly todolistId: {
392
+ readonly kind: "string";
393
+ readonly required: true;
394
+ readonly minLength: 0;
395
+ readonly pattern: "^[0-9]{1,20}$";
396
+ };
397
+ readonly completed: {
398
+ readonly kind: "boolean";
399
+ readonly required: false;
400
+ };
401
+ readonly pageToken: {
402
+ readonly kind: "string";
403
+ readonly required: false;
404
+ readonly minLength: 1;
405
+ readonly maxLength: 256;
406
+ };
407
+ };
408
+ };
409
+ readonly "basecamp.todo.create": {
410
+ readonly idempotencyKey: true;
411
+ readonly fields: {
412
+ readonly todolistId: {
413
+ readonly kind: "string";
414
+ readonly required: true;
415
+ readonly minLength: 0;
416
+ readonly pattern: "^[0-9]{1,20}$";
417
+ };
418
+ readonly content: {
419
+ readonly kind: "string";
420
+ readonly required: true;
421
+ readonly minLength: 1;
422
+ readonly maxLength: 1000;
423
+ };
424
+ readonly description: {
425
+ readonly kind: "string";
426
+ readonly required: false;
427
+ readonly minLength: 1;
428
+ readonly maxLength: 16384;
429
+ };
430
+ readonly contentFormat: {
431
+ readonly kind: "enum";
432
+ readonly required: false;
433
+ readonly values: readonly ["plain", "html"];
434
+ readonly default: "plain";
435
+ };
436
+ readonly dueOn: {
437
+ readonly kind: "string";
438
+ readonly required: false;
439
+ readonly minLength: 0;
440
+ readonly pattern: "^\\d{4}-\\d{2}-\\d{2}$";
441
+ };
442
+ readonly assigneeIds: {
443
+ readonly kind: "string[]";
444
+ readonly required: false;
445
+ readonly minItems: 1;
446
+ readonly maxItems: 20;
447
+ readonly uniqueItems: true;
448
+ readonly item: {
449
+ readonly minLength: 0;
450
+ readonly pattern: "^[0-9]{1,20}$";
451
+ };
452
+ };
453
+ readonly notify: {
454
+ readonly kind: "boolean";
455
+ readonly required: false;
456
+ };
457
+ };
458
+ };
459
+ readonly "basecamp.todo.complete": {
460
+ readonly idempotencyKey: false;
461
+ readonly fields: {
462
+ readonly todoId: {
463
+ readonly kind: "string";
464
+ readonly required: true;
465
+ readonly minLength: 0;
466
+ readonly pattern: "^[0-9]{1,20}$";
467
+ };
468
+ };
469
+ };
470
+ readonly "basecamp.message.list": {
471
+ readonly idempotencyKey: false;
472
+ readonly fields: {
473
+ readonly pageToken: {
474
+ readonly kind: "string";
475
+ readonly required: false;
476
+ readonly minLength: 1;
477
+ readonly maxLength: 256;
478
+ };
479
+ };
480
+ };
481
+ readonly "basecamp.message.post": {
482
+ readonly idempotencyKey: true;
483
+ readonly fields: {
484
+ readonly subject: {
485
+ readonly kind: "string";
486
+ readonly required: true;
487
+ readonly minLength: 1;
488
+ readonly maxLength: 256;
489
+ };
490
+ readonly content: {
491
+ readonly kind: "string";
492
+ readonly required: true;
493
+ readonly minLength: 1;
494
+ readonly maxLength: 65536;
495
+ };
496
+ readonly contentFormat: {
497
+ readonly kind: "enum";
498
+ readonly required: false;
499
+ readonly values: readonly ["plain", "html"];
500
+ readonly default: "plain";
501
+ };
502
+ };
503
+ };
504
+ readonly "basecamp.comment.list": {
505
+ readonly idempotencyKey: false;
506
+ readonly fields: {
507
+ readonly recordingId: {
508
+ readonly kind: "string";
509
+ readonly required: true;
510
+ readonly minLength: 0;
511
+ readonly pattern: "^[0-9]{1,20}$";
512
+ };
513
+ readonly pageToken: {
514
+ readonly kind: "string";
515
+ readonly required: false;
516
+ readonly minLength: 1;
517
+ readonly maxLength: 256;
518
+ };
519
+ };
520
+ };
521
+ readonly "basecamp.comment.post": {
522
+ readonly idempotencyKey: true;
523
+ readonly fields: {
524
+ readonly recordingId: {
525
+ readonly kind: "string";
526
+ readonly required: true;
527
+ readonly minLength: 0;
528
+ readonly pattern: "^[0-9]{1,20}$";
529
+ };
530
+ readonly content: {
531
+ readonly kind: "string";
532
+ readonly required: true;
533
+ readonly minLength: 1;
534
+ readonly maxLength: 16384;
535
+ };
536
+ readonly contentFormat: {
537
+ readonly kind: "enum";
538
+ readonly required: false;
539
+ readonly values: readonly ["plain", "html"];
540
+ readonly default: "plain";
541
+ };
542
+ };
543
+ };
544
+ readonly "basecamp.campfire.post": {
545
+ readonly idempotencyKey: true;
546
+ readonly fields: {
547
+ readonly content: {
548
+ readonly kind: "string";
549
+ readonly required: true;
550
+ readonly minLength: 1;
551
+ readonly maxLength: 4000;
552
+ };
553
+ readonly contentFormat: {
554
+ readonly kind: "enum";
555
+ readonly required: false;
556
+ readonly values: readonly ["plain", "html"];
557
+ readonly default: "plain";
558
+ };
559
+ };
560
+ };
561
+ readonly "basecamp.people.list": {
562
+ readonly idempotencyKey: false;
563
+ readonly fields: {
564
+ readonly pageToken: {
565
+ readonly kind: "string";
566
+ readonly required: false;
567
+ readonly minLength: 1;
568
+ readonly maxLength: 256;
569
+ };
570
+ };
571
+ };
358
572
  readonly "warehouse.view.read": {
359
573
  readonly idempotencyKey: false;
360
574
  readonly fields: {
@@ -91,6 +91,87 @@ export const IntegrationExecuteInputRules = {
91
91
  attachmentId: { kind: "string", required: true, minLength: 1, maxLength: 512 },
92
92
  },
93
93
  },
94
+ "basecamp.project.list": {
95
+ idempotencyKey: false,
96
+ fields: {
97
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 256 },
98
+ projectStatus: { kind: "enum", required: false, values: ["active", "archived"] },
99
+ },
100
+ },
101
+ "basecamp.todolist.list": {
102
+ idempotencyKey: false,
103
+ fields: {
104
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 256 },
105
+ },
106
+ },
107
+ "basecamp.todo.list": {
108
+ idempotencyKey: false,
109
+ fields: {
110
+ todolistId: { kind: "string", required: true, minLength: 0, pattern: "^[0-9]{1,20}$" },
111
+ completed: { kind: "boolean", required: false },
112
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 256 },
113
+ },
114
+ },
115
+ "basecamp.todo.create": {
116
+ idempotencyKey: true,
117
+ fields: {
118
+ todolistId: { kind: "string", required: true, minLength: 0, pattern: "^[0-9]{1,20}$" },
119
+ content: { kind: "string", required: true, minLength: 1, maxLength: 1000 },
120
+ description: { kind: "string", required: false, minLength: 1, maxLength: 16384 },
121
+ contentFormat: { kind: "enum", required: false, values: ["plain", "html"], default: "plain" },
122
+ dueOn: { kind: "string", required: false, minLength: 0, pattern: "^\\d{4}-\\d{2}-\\d{2}$" },
123
+ assigneeIds: { kind: "string[]", required: false, minItems: 1, maxItems: 20, uniqueItems: true, item: { minLength: 0, pattern: "^[0-9]{1,20}$" } },
124
+ notify: { kind: "boolean", required: false },
125
+ },
126
+ },
127
+ "basecamp.todo.complete": {
128
+ idempotencyKey: false,
129
+ fields: {
130
+ todoId: { kind: "string", required: true, minLength: 0, pattern: "^[0-9]{1,20}$" },
131
+ },
132
+ },
133
+ "basecamp.message.list": {
134
+ idempotencyKey: false,
135
+ fields: {
136
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 256 },
137
+ },
138
+ },
139
+ "basecamp.message.post": {
140
+ idempotencyKey: true,
141
+ fields: {
142
+ subject: { kind: "string", required: true, minLength: 1, maxLength: 256 },
143
+ content: { kind: "string", required: true, minLength: 1, maxLength: 65536 },
144
+ contentFormat: { kind: "enum", required: false, values: ["plain", "html"], default: "plain" },
145
+ },
146
+ },
147
+ "basecamp.comment.list": {
148
+ idempotencyKey: false,
149
+ fields: {
150
+ recordingId: { kind: "string", required: true, minLength: 0, pattern: "^[0-9]{1,20}$" },
151
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 256 },
152
+ },
153
+ },
154
+ "basecamp.comment.post": {
155
+ idempotencyKey: true,
156
+ fields: {
157
+ recordingId: { kind: "string", required: true, minLength: 0, pattern: "^[0-9]{1,20}$" },
158
+ content: { kind: "string", required: true, minLength: 1, maxLength: 16384 },
159
+ contentFormat: { kind: "enum", required: false, values: ["plain", "html"], default: "plain" },
160
+ },
161
+ },
162
+ "basecamp.campfire.post": {
163
+ idempotencyKey: true,
164
+ fields: {
165
+ content: { kind: "string", required: true, minLength: 1, maxLength: 4000 },
166
+ contentFormat: { kind: "enum", required: false, values: ["plain", "html"], default: "plain" },
167
+ },
168
+ },
169
+ "basecamp.people.list": {
170
+ idempotencyKey: false,
171
+ fields: {
172
+ pageToken: { kind: "string", required: false, minLength: 1, maxLength: 256 },
173
+ },
174
+ },
94
175
  "warehouse.view.read": {
95
176
  idempotencyKey: false,
96
177
  fields: {
@@ -188,6 +269,10 @@ function checkField(operation, path, name, field, value) {
188
269
  if (value === null || typeof value !== 'object' || Array.isArray(value))
189
270
  return refuse(path, `${path} must be a JSON object`);
190
271
  return { ok: true, value };
272
+ case 'boolean':
273
+ if (typeof value !== 'boolean')
274
+ return refuse(path, `${path} must be a boolean`);
275
+ return { ok: true, value };
191
276
  case 'integer':
192
277
  if (typeof value !== 'number' || !Number.isInteger(value) || value < field.minimum || value > field.maximum)
193
278
  return refuse(path, `${path} must be an integer between ${field.minimum} and ${field.maximum}`);
@@ -77,6 +77,83 @@ export declare const IntegrationOperations: {
77
77
  readonly declaredMode: false;
78
78
  readonly idempotencyKey: false;
79
79
  };
80
+ readonly "basecamp.project.list": {
81
+ readonly kind: "saas";
82
+ readonly identities: readonly ["user"];
83
+ readonly readOnly: true;
84
+ readonly declaredMode: false;
85
+ readonly idempotencyKey: false;
86
+ };
87
+ readonly "basecamp.todolist.list": {
88
+ readonly kind: "saas";
89
+ readonly identities: readonly ["user"];
90
+ readonly readOnly: true;
91
+ readonly declaredMode: false;
92
+ readonly idempotencyKey: false;
93
+ };
94
+ readonly "basecamp.todo.list": {
95
+ readonly kind: "saas";
96
+ readonly identities: readonly ["user"];
97
+ readonly readOnly: true;
98
+ readonly declaredMode: false;
99
+ readonly idempotencyKey: false;
100
+ };
101
+ readonly "basecamp.todo.create": {
102
+ readonly kind: "saas";
103
+ readonly identities: readonly ["user"];
104
+ readonly readOnly: false;
105
+ readonly declaredMode: false;
106
+ readonly idempotencyKey: true;
107
+ };
108
+ readonly "basecamp.todo.complete": {
109
+ readonly kind: "saas";
110
+ readonly identities: readonly ["user"];
111
+ readonly readOnly: false;
112
+ readonly declaredMode: false;
113
+ readonly idempotencyKey: false;
114
+ };
115
+ readonly "basecamp.message.list": {
116
+ readonly kind: "saas";
117
+ readonly identities: readonly ["user"];
118
+ readonly readOnly: true;
119
+ readonly declaredMode: false;
120
+ readonly idempotencyKey: false;
121
+ };
122
+ readonly "basecamp.message.post": {
123
+ readonly kind: "saas";
124
+ readonly identities: readonly ["user"];
125
+ readonly readOnly: false;
126
+ readonly declaredMode: false;
127
+ readonly idempotencyKey: true;
128
+ };
129
+ readonly "basecamp.comment.list": {
130
+ readonly kind: "saas";
131
+ readonly identities: readonly ["user"];
132
+ readonly readOnly: true;
133
+ readonly declaredMode: false;
134
+ readonly idempotencyKey: false;
135
+ };
136
+ readonly "basecamp.comment.post": {
137
+ readonly kind: "saas";
138
+ readonly identities: readonly ["user"];
139
+ readonly readOnly: false;
140
+ readonly declaredMode: false;
141
+ readonly idempotencyKey: true;
142
+ };
143
+ readonly "basecamp.campfire.post": {
144
+ readonly kind: "saas";
145
+ readonly identities: readonly ["user"];
146
+ readonly readOnly: false;
147
+ readonly declaredMode: false;
148
+ readonly idempotencyKey: true;
149
+ };
150
+ readonly "basecamp.people.list": {
151
+ readonly kind: "saas";
152
+ readonly identities: readonly ["user"];
153
+ readonly readOnly: true;
154
+ readonly declaredMode: false;
155
+ readonly idempotencyKey: false;
156
+ };
80
157
  readonly "warehouse.view.read": {
81
158
  readonly kind: "database";
82
159
  readonly identities: readonly ["app"];
@@ -105,6 +105,105 @@ export const IntegrationOperations = {
105
105
  "declaredMode": false,
106
106
  "idempotencyKey": false
107
107
  },
108
+ "basecamp.project.list": {
109
+ "kind": "saas",
110
+ "identities": [
111
+ "user"
112
+ ],
113
+ "readOnly": true,
114
+ "declaredMode": false,
115
+ "idempotencyKey": false
116
+ },
117
+ "basecamp.todolist.list": {
118
+ "kind": "saas",
119
+ "identities": [
120
+ "user"
121
+ ],
122
+ "readOnly": true,
123
+ "declaredMode": false,
124
+ "idempotencyKey": false
125
+ },
126
+ "basecamp.todo.list": {
127
+ "kind": "saas",
128
+ "identities": [
129
+ "user"
130
+ ],
131
+ "readOnly": true,
132
+ "declaredMode": false,
133
+ "idempotencyKey": false
134
+ },
135
+ "basecamp.todo.create": {
136
+ "kind": "saas",
137
+ "identities": [
138
+ "user"
139
+ ],
140
+ "readOnly": false,
141
+ "declaredMode": false,
142
+ "idempotencyKey": true
143
+ },
144
+ "basecamp.todo.complete": {
145
+ "kind": "saas",
146
+ "identities": [
147
+ "user"
148
+ ],
149
+ "readOnly": false,
150
+ "declaredMode": false,
151
+ "idempotencyKey": false
152
+ },
153
+ "basecamp.message.list": {
154
+ "kind": "saas",
155
+ "identities": [
156
+ "user"
157
+ ],
158
+ "readOnly": true,
159
+ "declaredMode": false,
160
+ "idempotencyKey": false
161
+ },
162
+ "basecamp.message.post": {
163
+ "kind": "saas",
164
+ "identities": [
165
+ "user"
166
+ ],
167
+ "readOnly": false,
168
+ "declaredMode": false,
169
+ "idempotencyKey": true
170
+ },
171
+ "basecamp.comment.list": {
172
+ "kind": "saas",
173
+ "identities": [
174
+ "user"
175
+ ],
176
+ "readOnly": true,
177
+ "declaredMode": false,
178
+ "idempotencyKey": false
179
+ },
180
+ "basecamp.comment.post": {
181
+ "kind": "saas",
182
+ "identities": [
183
+ "user"
184
+ ],
185
+ "readOnly": false,
186
+ "declaredMode": false,
187
+ "idempotencyKey": true
188
+ },
189
+ "basecamp.campfire.post": {
190
+ "kind": "saas",
191
+ "identities": [
192
+ "user"
193
+ ],
194
+ "readOnly": false,
195
+ "declaredMode": false,
196
+ "idempotencyKey": true
197
+ },
198
+ "basecamp.people.list": {
199
+ "kind": "saas",
200
+ "identities": [
201
+ "user"
202
+ ],
203
+ "readOnly": true,
204
+ "declaredMode": false,
205
+ "idempotencyKey": false
206
+ },
108
207
  "warehouse.view.read": {
109
208
  "kind": "database",
110
209
  "identities": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isomorph.ai/app-sdk",
3
- "version": "1.13.1",
3
+ "version": "1.14.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",