airbyte-agent-linear 0.19.18__py3-none-any.whl

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 (55) hide show
  1. airbyte_agent_linear/__init__.py +43 -0
  2. airbyte_agent_linear/_vendored/__init__.py +1 -0
  3. airbyte_agent_linear/_vendored/connector_sdk/__init__.py +82 -0
  4. airbyte_agent_linear/_vendored/connector_sdk/auth_strategies.py +1123 -0
  5. airbyte_agent_linear/_vendored/connector_sdk/auth_template.py +135 -0
  6. airbyte_agent_linear/_vendored/connector_sdk/cloud_utils/__init__.py +5 -0
  7. airbyte_agent_linear/_vendored/connector_sdk/cloud_utils/client.py +213 -0
  8. airbyte_agent_linear/_vendored/connector_sdk/connector_model_loader.py +957 -0
  9. airbyte_agent_linear/_vendored/connector_sdk/constants.py +78 -0
  10. airbyte_agent_linear/_vendored/connector_sdk/exceptions.py +23 -0
  11. airbyte_agent_linear/_vendored/connector_sdk/executor/__init__.py +31 -0
  12. airbyte_agent_linear/_vendored/connector_sdk/executor/hosted_executor.py +197 -0
  13. airbyte_agent_linear/_vendored/connector_sdk/executor/local_executor.py +1504 -0
  14. airbyte_agent_linear/_vendored/connector_sdk/executor/models.py +190 -0
  15. airbyte_agent_linear/_vendored/connector_sdk/extensions.py +655 -0
  16. airbyte_agent_linear/_vendored/connector_sdk/http/__init__.py +37 -0
  17. airbyte_agent_linear/_vendored/connector_sdk/http/adapters/__init__.py +9 -0
  18. airbyte_agent_linear/_vendored/connector_sdk/http/adapters/httpx_adapter.py +251 -0
  19. airbyte_agent_linear/_vendored/connector_sdk/http/config.py +98 -0
  20. airbyte_agent_linear/_vendored/connector_sdk/http/exceptions.py +119 -0
  21. airbyte_agent_linear/_vendored/connector_sdk/http/protocols.py +114 -0
  22. airbyte_agent_linear/_vendored/connector_sdk/http/response.py +102 -0
  23. airbyte_agent_linear/_vendored/connector_sdk/http_client.py +679 -0
  24. airbyte_agent_linear/_vendored/connector_sdk/logging/__init__.py +11 -0
  25. airbyte_agent_linear/_vendored/connector_sdk/logging/logger.py +264 -0
  26. airbyte_agent_linear/_vendored/connector_sdk/logging/types.py +92 -0
  27. airbyte_agent_linear/_vendored/connector_sdk/observability/__init__.py +11 -0
  28. airbyte_agent_linear/_vendored/connector_sdk/observability/models.py +19 -0
  29. airbyte_agent_linear/_vendored/connector_sdk/observability/redactor.py +81 -0
  30. airbyte_agent_linear/_vendored/connector_sdk/observability/session.py +94 -0
  31. airbyte_agent_linear/_vendored/connector_sdk/performance/__init__.py +6 -0
  32. airbyte_agent_linear/_vendored/connector_sdk/performance/instrumentation.py +57 -0
  33. airbyte_agent_linear/_vendored/connector_sdk/performance/metrics.py +93 -0
  34. airbyte_agent_linear/_vendored/connector_sdk/schema/__init__.py +75 -0
  35. airbyte_agent_linear/_vendored/connector_sdk/schema/base.py +161 -0
  36. airbyte_agent_linear/_vendored/connector_sdk/schema/components.py +238 -0
  37. airbyte_agent_linear/_vendored/connector_sdk/schema/connector.py +131 -0
  38. airbyte_agent_linear/_vendored/connector_sdk/schema/extensions.py +109 -0
  39. airbyte_agent_linear/_vendored/connector_sdk/schema/operations.py +146 -0
  40. airbyte_agent_linear/_vendored/connector_sdk/schema/security.py +213 -0
  41. airbyte_agent_linear/_vendored/connector_sdk/secrets.py +182 -0
  42. airbyte_agent_linear/_vendored/connector_sdk/telemetry/__init__.py +10 -0
  43. airbyte_agent_linear/_vendored/connector_sdk/telemetry/config.py +32 -0
  44. airbyte_agent_linear/_vendored/connector_sdk/telemetry/events.py +58 -0
  45. airbyte_agent_linear/_vendored/connector_sdk/telemetry/tracker.py +151 -0
  46. airbyte_agent_linear/_vendored/connector_sdk/types.py +241 -0
  47. airbyte_agent_linear/_vendored/connector_sdk/utils.py +60 -0
  48. airbyte_agent_linear/_vendored/connector_sdk/validation.py +822 -0
  49. airbyte_agent_linear/connector.py +460 -0
  50. airbyte_agent_linear/connector_model.py +780 -0
  51. airbyte_agent_linear/models.py +221 -0
  52. airbyte_agent_linear/types.py +44 -0
  53. airbyte_agent_linear-0.19.18.dist-info/METADATA +101 -0
  54. airbyte_agent_linear-0.19.18.dist-info/RECORD +55 -0
  55. airbyte_agent_linear-0.19.18.dist-info/WHEEL +4 -0
@@ -0,0 +1,780 @@
1
+ """
2
+ Connector model for linear.
3
+
4
+ This file is auto-generated from the connector definition at build time.
5
+ DO NOT EDIT MANUALLY - changes will be overwritten on next generation.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from ._vendored.connector_sdk.types import (
11
+ Action,
12
+ AuthConfig,
13
+ AuthType,
14
+ ConnectorModel,
15
+ EndpointDefinition,
16
+ EntityDefinition,
17
+ )
18
+ from ._vendored.connector_sdk.schema.security import (
19
+ AirbyteAuthConfig,
20
+ AuthConfigFieldSpec,
21
+ )
22
+ from ._vendored.connector_sdk.schema.components import (
23
+ PathOverrideConfig,
24
+ )
25
+ from uuid import (
26
+ UUID,
27
+ )
28
+
29
+ LinearConnectorModel: ConnectorModel = ConnectorModel(
30
+ id=UUID('1c5d8316-ed42-4473-8fbc-2626f03f070c'),
31
+ name='linear',
32
+ version='0.1.1',
33
+ base_url='https://api.linear.app',
34
+ auth=AuthConfig(
35
+ type=AuthType.API_KEY,
36
+ config={'header': 'Authorization', 'in': 'header'},
37
+ user_config_spec=AirbyteAuthConfig(
38
+ type='object',
39
+ required=['api_key'],
40
+ properties={
41
+ 'api_key': AuthConfigFieldSpec(
42
+ title='API Key',
43
+ description='API authentication key',
44
+ ),
45
+ },
46
+ auth_mapping={'api_key': '${api_key}'},
47
+ ),
48
+ ),
49
+ entities=[
50
+ EntityDefinition(
51
+ name='issues',
52
+ actions=[Action.LIST, Action.GET],
53
+ endpoints={
54
+ Action.LIST: EndpointDefinition(
55
+ method='POST',
56
+ path='/graphql:listIssues',
57
+ path_override=PathOverrideConfig(
58
+ path='/graphql',
59
+ ),
60
+ action=Action.LIST,
61
+ description='Returns a paginated list of issues via GraphQL with pagination support',
62
+ query_params=['first', 'after'],
63
+ query_params_schema={
64
+ 'first': {
65
+ 'type': 'integer',
66
+ 'required': False,
67
+ 'default': 50,
68
+ },
69
+ 'after': {'type': 'string', 'required': False},
70
+ },
71
+ response_schema={
72
+ 'type': 'object',
73
+ 'description': 'GraphQL response for issues list',
74
+ 'properties': {
75
+ 'data': {
76
+ 'type': 'object',
77
+ 'properties': {
78
+ 'issues': {
79
+ 'type': 'object',
80
+ 'properties': {
81
+ 'nodes': {
82
+ 'type': 'array',
83
+ 'items': {
84
+ 'type': 'object',
85
+ 'description': 'Linear issue object',
86
+ 'properties': {
87
+ 'id': {'type': 'string', 'description': 'Unique issue identifier'},
88
+ 'title': {'type': 'string', 'description': 'Issue title'},
89
+ 'description': {
90
+ 'oneOf': [
91
+ {'type': 'string'},
92
+ {'type': 'null'},
93
+ ],
94
+ 'description': 'Issue description',
95
+ },
96
+ 'state': {
97
+ 'oneOf': [
98
+ {
99
+ 'type': 'object',
100
+ 'properties': {
101
+ 'name': {'type': 'string'},
102
+ },
103
+ },
104
+ {'type': 'null'},
105
+ ],
106
+ 'description': 'Issue state',
107
+ },
108
+ 'priority': {
109
+ 'oneOf': [
110
+ {'type': 'number'},
111
+ {'type': 'null'},
112
+ ],
113
+ 'description': 'Issue priority (0-4)',
114
+ },
115
+ 'assignee': {
116
+ 'oneOf': [
117
+ {
118
+ 'type': 'object',
119
+ 'properties': {
120
+ 'name': {'type': 'string'},
121
+ 'email': {'type': 'string'},
122
+ },
123
+ },
124
+ {'type': 'null'},
125
+ ],
126
+ 'description': 'Assigned user',
127
+ },
128
+ 'createdAt': {
129
+ 'type': 'string',
130
+ 'format': 'date-time',
131
+ 'description': 'Creation timestamp',
132
+ },
133
+ 'updatedAt': {
134
+ 'type': 'string',
135
+ 'format': 'date-time',
136
+ 'description': 'Last update timestamp',
137
+ },
138
+ },
139
+ 'required': ['id', 'title'],
140
+ 'x-airbyte-entity-name': 'issues',
141
+ },
142
+ },
143
+ 'pageInfo': {
144
+ 'type': 'object',
145
+ 'description': 'Pagination information',
146
+ 'properties': {
147
+ 'hasNextPage': {'type': 'boolean', 'description': 'Whether there are more items available'},
148
+ 'endCursor': {
149
+ 'type': ['string', 'null'],
150
+ 'description': 'Cursor to fetch next page',
151
+ },
152
+ },
153
+ },
154
+ },
155
+ },
156
+ },
157
+ },
158
+ },
159
+ },
160
+ graphql_body={
161
+ 'type': 'graphql',
162
+ 'query': 'query($first: Int, $after: String) { issues(first: $first, after: $after) { nodes { id title description state { name } priority assignee { name email } createdAt updatedAt } pageInfo { hasNextPage endCursor } } }',
163
+ 'variables': {'first': '{{ first }}', 'after': '{{ after }}'},
164
+ },
165
+ ),
166
+ Action.GET: EndpointDefinition(
167
+ method='POST',
168
+ path='/graphql:getIssue',
169
+ path_override=PathOverrideConfig(
170
+ path='/graphql',
171
+ ),
172
+ action=Action.GET,
173
+ description='Get a single issue by ID via GraphQL',
174
+ query_params=['id'],
175
+ query_params_schema={
176
+ 'id': {'type': 'string', 'required': True},
177
+ },
178
+ response_schema={
179
+ 'type': 'object',
180
+ 'description': 'GraphQL response for single issue',
181
+ 'properties': {
182
+ 'data': {
183
+ 'type': 'object',
184
+ 'properties': {
185
+ 'issue': {
186
+ 'type': 'object',
187
+ 'description': 'Linear issue object',
188
+ 'properties': {
189
+ 'id': {'type': 'string', 'description': 'Unique issue identifier'},
190
+ 'title': {'type': 'string', 'description': 'Issue title'},
191
+ 'description': {
192
+ 'oneOf': [
193
+ {'type': 'string'},
194
+ {'type': 'null'},
195
+ ],
196
+ 'description': 'Issue description',
197
+ },
198
+ 'state': {
199
+ 'oneOf': [
200
+ {
201
+ 'type': 'object',
202
+ 'properties': {
203
+ 'name': {'type': 'string'},
204
+ },
205
+ },
206
+ {'type': 'null'},
207
+ ],
208
+ 'description': 'Issue state',
209
+ },
210
+ 'priority': {
211
+ 'oneOf': [
212
+ {'type': 'number'},
213
+ {'type': 'null'},
214
+ ],
215
+ 'description': 'Issue priority (0-4)',
216
+ },
217
+ 'assignee': {
218
+ 'oneOf': [
219
+ {
220
+ 'type': 'object',
221
+ 'properties': {
222
+ 'name': {'type': 'string'},
223
+ 'email': {'type': 'string'},
224
+ },
225
+ },
226
+ {'type': 'null'},
227
+ ],
228
+ 'description': 'Assigned user',
229
+ },
230
+ 'createdAt': {
231
+ 'type': 'string',
232
+ 'format': 'date-time',
233
+ 'description': 'Creation timestamp',
234
+ },
235
+ 'updatedAt': {
236
+ 'type': 'string',
237
+ 'format': 'date-time',
238
+ 'description': 'Last update timestamp',
239
+ },
240
+ },
241
+ 'required': ['id', 'title'],
242
+ 'x-airbyte-entity-name': 'issues',
243
+ },
244
+ },
245
+ },
246
+ },
247
+ },
248
+ graphql_body={
249
+ 'type': 'graphql',
250
+ 'query': 'query($id: String!) { issue(id: $id) { id title description state { name } priority assignee { name email } createdAt updatedAt } }',
251
+ 'variables': {'id': '{{ id }}'},
252
+ },
253
+ ),
254
+ },
255
+ entity_schema={
256
+ 'type': 'object',
257
+ 'description': 'Linear issue object',
258
+ 'properties': {
259
+ 'id': {'type': 'string', 'description': 'Unique issue identifier'},
260
+ 'title': {'type': 'string', 'description': 'Issue title'},
261
+ 'description': {
262
+ 'oneOf': [
263
+ {'type': 'string'},
264
+ {'type': 'null'},
265
+ ],
266
+ 'description': 'Issue description',
267
+ },
268
+ 'state': {
269
+ 'oneOf': [
270
+ {
271
+ 'type': 'object',
272
+ 'properties': {
273
+ 'name': {'type': 'string'},
274
+ },
275
+ },
276
+ {'type': 'null'},
277
+ ],
278
+ 'description': 'Issue state',
279
+ },
280
+ 'priority': {
281
+ 'oneOf': [
282
+ {'type': 'number'},
283
+ {'type': 'null'},
284
+ ],
285
+ 'description': 'Issue priority (0-4)',
286
+ },
287
+ 'assignee': {
288
+ 'oneOf': [
289
+ {
290
+ 'type': 'object',
291
+ 'properties': {
292
+ 'name': {'type': 'string'},
293
+ 'email': {'type': 'string'},
294
+ },
295
+ },
296
+ {'type': 'null'},
297
+ ],
298
+ 'description': 'Assigned user',
299
+ },
300
+ 'createdAt': {
301
+ 'type': 'string',
302
+ 'format': 'date-time',
303
+ 'description': 'Creation timestamp',
304
+ },
305
+ 'updatedAt': {
306
+ 'type': 'string',
307
+ 'format': 'date-time',
308
+ 'description': 'Last update timestamp',
309
+ },
310
+ },
311
+ 'required': ['id', 'title'],
312
+ 'x-airbyte-entity-name': 'issues',
313
+ },
314
+ ),
315
+ EntityDefinition(
316
+ name='projects',
317
+ actions=[Action.LIST, Action.GET],
318
+ endpoints={
319
+ Action.LIST: EndpointDefinition(
320
+ method='POST',
321
+ path='/graphql:listProjects',
322
+ path_override=PathOverrideConfig(
323
+ path='/graphql',
324
+ ),
325
+ action=Action.LIST,
326
+ description='Returns a paginated list of projects via GraphQL with pagination support',
327
+ query_params=['first', 'after'],
328
+ query_params_schema={
329
+ 'first': {
330
+ 'type': 'integer',
331
+ 'required': False,
332
+ 'default': 50,
333
+ },
334
+ 'after': {'type': 'string', 'required': False},
335
+ },
336
+ response_schema={
337
+ 'type': 'object',
338
+ 'description': 'GraphQL response for projects list',
339
+ 'properties': {
340
+ 'data': {
341
+ 'type': 'object',
342
+ 'properties': {
343
+ 'projects': {
344
+ 'type': 'object',
345
+ 'properties': {
346
+ 'nodes': {
347
+ 'type': 'array',
348
+ 'items': {
349
+ 'type': 'object',
350
+ 'description': 'Linear project object',
351
+ 'properties': {
352
+ 'id': {'type': 'string', 'description': 'Unique project identifier'},
353
+ 'name': {'type': 'string', 'description': 'Project name'},
354
+ 'description': {
355
+ 'oneOf': [
356
+ {'type': 'string'},
357
+ {'type': 'null'},
358
+ ],
359
+ 'description': 'Project description',
360
+ },
361
+ 'state': {
362
+ 'oneOf': [
363
+ {'type': 'string'},
364
+ {'type': 'null'},
365
+ ],
366
+ 'description': 'Project state (planned, started, paused, completed, canceled)',
367
+ },
368
+ 'startDate': {
369
+ 'oneOf': [
370
+ {'type': 'string', 'format': 'date'},
371
+ {'type': 'null'},
372
+ ],
373
+ 'description': 'Project start date',
374
+ },
375
+ 'targetDate': {
376
+ 'oneOf': [
377
+ {'type': 'string', 'format': 'date'},
378
+ {'type': 'null'},
379
+ ],
380
+ 'description': 'Project target date',
381
+ },
382
+ 'lead': {
383
+ 'oneOf': [
384
+ {
385
+ 'type': 'object',
386
+ 'properties': {
387
+ 'name': {'type': 'string'},
388
+ 'email': {'type': 'string'},
389
+ },
390
+ },
391
+ {'type': 'null'},
392
+ ],
393
+ 'description': 'Project lead',
394
+ },
395
+ 'createdAt': {
396
+ 'type': 'string',
397
+ 'format': 'date-time',
398
+ 'description': 'Creation timestamp',
399
+ },
400
+ 'updatedAt': {
401
+ 'type': 'string',
402
+ 'format': 'date-time',
403
+ 'description': 'Last update timestamp',
404
+ },
405
+ },
406
+ 'required': ['id', 'name'],
407
+ 'x-airbyte-entity-name': 'projects',
408
+ },
409
+ },
410
+ 'pageInfo': {
411
+ 'type': 'object',
412
+ 'description': 'Pagination information',
413
+ 'properties': {
414
+ 'hasNextPage': {'type': 'boolean', 'description': 'Whether there are more items available'},
415
+ 'endCursor': {
416
+ 'type': ['string', 'null'],
417
+ 'description': 'Cursor to fetch next page',
418
+ },
419
+ },
420
+ },
421
+ },
422
+ },
423
+ },
424
+ },
425
+ },
426
+ },
427
+ graphql_body={
428
+ 'type': 'graphql',
429
+ 'query': 'query($first: Int, $after: String) { projects(first: $first, after: $after) { nodes { id name description state startDate targetDate lead { name email } createdAt updatedAt } pageInfo { hasNextPage endCursor } } }',
430
+ 'variables': {'first': '{{ first }}', 'after': '{{ after }}'},
431
+ },
432
+ ),
433
+ Action.GET: EndpointDefinition(
434
+ method='POST',
435
+ path='/graphql:getProject',
436
+ path_override=PathOverrideConfig(
437
+ path='/graphql',
438
+ ),
439
+ action=Action.GET,
440
+ description='Get a single project by ID via GraphQL',
441
+ query_params=['id'],
442
+ query_params_schema={
443
+ 'id': {'type': 'string', 'required': True},
444
+ },
445
+ response_schema={
446
+ 'type': 'object',
447
+ 'description': 'GraphQL response for single project',
448
+ 'properties': {
449
+ 'data': {
450
+ 'type': 'object',
451
+ 'properties': {
452
+ 'project': {
453
+ 'type': 'object',
454
+ 'description': 'Linear project object',
455
+ 'properties': {
456
+ 'id': {'type': 'string', 'description': 'Unique project identifier'},
457
+ 'name': {'type': 'string', 'description': 'Project name'},
458
+ 'description': {
459
+ 'oneOf': [
460
+ {'type': 'string'},
461
+ {'type': 'null'},
462
+ ],
463
+ 'description': 'Project description',
464
+ },
465
+ 'state': {
466
+ 'oneOf': [
467
+ {'type': 'string'},
468
+ {'type': 'null'},
469
+ ],
470
+ 'description': 'Project state (planned, started, paused, completed, canceled)',
471
+ },
472
+ 'startDate': {
473
+ 'oneOf': [
474
+ {'type': 'string', 'format': 'date'},
475
+ {'type': 'null'},
476
+ ],
477
+ 'description': 'Project start date',
478
+ },
479
+ 'targetDate': {
480
+ 'oneOf': [
481
+ {'type': 'string', 'format': 'date'},
482
+ {'type': 'null'},
483
+ ],
484
+ 'description': 'Project target date',
485
+ },
486
+ 'lead': {
487
+ 'oneOf': [
488
+ {
489
+ 'type': 'object',
490
+ 'properties': {
491
+ 'name': {'type': 'string'},
492
+ 'email': {'type': 'string'},
493
+ },
494
+ },
495
+ {'type': 'null'},
496
+ ],
497
+ 'description': 'Project lead',
498
+ },
499
+ 'createdAt': {
500
+ 'type': 'string',
501
+ 'format': 'date-time',
502
+ 'description': 'Creation timestamp',
503
+ },
504
+ 'updatedAt': {
505
+ 'type': 'string',
506
+ 'format': 'date-time',
507
+ 'description': 'Last update timestamp',
508
+ },
509
+ },
510
+ 'required': ['id', 'name'],
511
+ 'x-airbyte-entity-name': 'projects',
512
+ },
513
+ },
514
+ },
515
+ },
516
+ },
517
+ graphql_body={
518
+ 'type': 'graphql',
519
+ 'query': 'query($id: String!) { project(id: $id) { id name description state startDate targetDate lead { name email } createdAt updatedAt } }',
520
+ 'variables': {'id': '{{ id }}'},
521
+ },
522
+ ),
523
+ },
524
+ entity_schema={
525
+ 'type': 'object',
526
+ 'description': 'Linear project object',
527
+ 'properties': {
528
+ 'id': {'type': 'string', 'description': 'Unique project identifier'},
529
+ 'name': {'type': 'string', 'description': 'Project name'},
530
+ 'description': {
531
+ 'oneOf': [
532
+ {'type': 'string'},
533
+ {'type': 'null'},
534
+ ],
535
+ 'description': 'Project description',
536
+ },
537
+ 'state': {
538
+ 'oneOf': [
539
+ {'type': 'string'},
540
+ {'type': 'null'},
541
+ ],
542
+ 'description': 'Project state (planned, started, paused, completed, canceled)',
543
+ },
544
+ 'startDate': {
545
+ 'oneOf': [
546
+ {'type': 'string', 'format': 'date'},
547
+ {'type': 'null'},
548
+ ],
549
+ 'description': 'Project start date',
550
+ },
551
+ 'targetDate': {
552
+ 'oneOf': [
553
+ {'type': 'string', 'format': 'date'},
554
+ {'type': 'null'},
555
+ ],
556
+ 'description': 'Project target date',
557
+ },
558
+ 'lead': {
559
+ 'oneOf': [
560
+ {
561
+ 'type': 'object',
562
+ 'properties': {
563
+ 'name': {'type': 'string'},
564
+ 'email': {'type': 'string'},
565
+ },
566
+ },
567
+ {'type': 'null'},
568
+ ],
569
+ 'description': 'Project lead',
570
+ },
571
+ 'createdAt': {
572
+ 'type': 'string',
573
+ 'format': 'date-time',
574
+ 'description': 'Creation timestamp',
575
+ },
576
+ 'updatedAt': {
577
+ 'type': 'string',
578
+ 'format': 'date-time',
579
+ 'description': 'Last update timestamp',
580
+ },
581
+ },
582
+ 'required': ['id', 'name'],
583
+ 'x-airbyte-entity-name': 'projects',
584
+ },
585
+ ),
586
+ EntityDefinition(
587
+ name='teams',
588
+ actions=[Action.LIST, Action.GET],
589
+ endpoints={
590
+ Action.LIST: EndpointDefinition(
591
+ method='POST',
592
+ path='/graphql:listTeams',
593
+ path_override=PathOverrideConfig(
594
+ path='/graphql',
595
+ ),
596
+ action=Action.LIST,
597
+ description='Returns a list of teams via GraphQL with pagination support',
598
+ query_params=['first', 'after'],
599
+ query_params_schema={
600
+ 'first': {
601
+ 'type': 'integer',
602
+ 'required': False,
603
+ 'default': 50,
604
+ },
605
+ 'after': {'type': 'string', 'required': False},
606
+ },
607
+ response_schema={
608
+ 'type': 'object',
609
+ 'description': 'GraphQL response for teams list',
610
+ 'properties': {
611
+ 'data': {
612
+ 'type': 'object',
613
+ 'properties': {
614
+ 'teams': {
615
+ 'type': 'object',
616
+ 'properties': {
617
+ 'nodes': {
618
+ 'type': 'array',
619
+ 'items': {
620
+ 'type': 'object',
621
+ 'description': 'Linear team object',
622
+ 'properties': {
623
+ 'id': {'type': 'string', 'description': 'Unique team identifier'},
624
+ 'name': {'type': 'string', 'description': 'Team name'},
625
+ 'key': {'type': 'string', 'description': 'Team key (short identifier)'},
626
+ 'description': {
627
+ 'oneOf': [
628
+ {'type': 'string'},
629
+ {'type': 'null'},
630
+ ],
631
+ 'description': 'Team description',
632
+ },
633
+ 'timezone': {
634
+ 'oneOf': [
635
+ {'type': 'string'},
636
+ {'type': 'null'},
637
+ ],
638
+ 'description': 'Team timezone',
639
+ },
640
+ 'createdAt': {
641
+ 'type': 'string',
642
+ 'format': 'date-time',
643
+ 'description': 'Creation timestamp',
644
+ },
645
+ 'updatedAt': {
646
+ 'type': 'string',
647
+ 'format': 'date-time',
648
+ 'description': 'Last update timestamp',
649
+ },
650
+ },
651
+ 'required': ['id', 'name', 'key'],
652
+ 'x-airbyte-entity-name': 'teams',
653
+ },
654
+ },
655
+ 'pageInfo': {
656
+ 'type': 'object',
657
+ 'description': 'Pagination information',
658
+ 'properties': {
659
+ 'hasNextPage': {'type': 'boolean', 'description': 'Whether there are more items available'},
660
+ 'endCursor': {
661
+ 'type': ['string', 'null'],
662
+ 'description': 'Cursor to fetch next page',
663
+ },
664
+ },
665
+ },
666
+ },
667
+ },
668
+ },
669
+ },
670
+ },
671
+ },
672
+ graphql_body={
673
+ 'type': 'graphql',
674
+ 'query': 'query($first: Int, $after: String) { teams(first: $first, after: $after) { nodes { id name key description timezone createdAt updatedAt } pageInfo { hasNextPage endCursor } } }',
675
+ 'variables': {'first': '{{ first }}', 'after': '{{ after }}'},
676
+ },
677
+ ),
678
+ Action.GET: EndpointDefinition(
679
+ method='POST',
680
+ path='/graphql:getTeam',
681
+ path_override=PathOverrideConfig(
682
+ path='/graphql',
683
+ ),
684
+ action=Action.GET,
685
+ description='Get a single team by ID via GraphQL',
686
+ query_params=['id'],
687
+ query_params_schema={
688
+ 'id': {'type': 'string', 'required': True},
689
+ },
690
+ response_schema={
691
+ 'type': 'object',
692
+ 'description': 'GraphQL response for single team',
693
+ 'properties': {
694
+ 'data': {
695
+ 'type': 'object',
696
+ 'properties': {
697
+ 'team': {
698
+ 'type': 'object',
699
+ 'description': 'Linear team object',
700
+ 'properties': {
701
+ 'id': {'type': 'string', 'description': 'Unique team identifier'},
702
+ 'name': {'type': 'string', 'description': 'Team name'},
703
+ 'key': {'type': 'string', 'description': 'Team key (short identifier)'},
704
+ 'description': {
705
+ 'oneOf': [
706
+ {'type': 'string'},
707
+ {'type': 'null'},
708
+ ],
709
+ 'description': 'Team description',
710
+ },
711
+ 'timezone': {
712
+ 'oneOf': [
713
+ {'type': 'string'},
714
+ {'type': 'null'},
715
+ ],
716
+ 'description': 'Team timezone',
717
+ },
718
+ 'createdAt': {
719
+ 'type': 'string',
720
+ 'format': 'date-time',
721
+ 'description': 'Creation timestamp',
722
+ },
723
+ 'updatedAt': {
724
+ 'type': 'string',
725
+ 'format': 'date-time',
726
+ 'description': 'Last update timestamp',
727
+ },
728
+ },
729
+ 'required': ['id', 'name', 'key'],
730
+ 'x-airbyte-entity-name': 'teams',
731
+ },
732
+ },
733
+ },
734
+ },
735
+ },
736
+ graphql_body={
737
+ 'type': 'graphql',
738
+ 'query': 'query($id: String!) { team(id: $id) { id name key description timezone createdAt updatedAt } }',
739
+ 'variables': {'id': '{{ id }}'},
740
+ },
741
+ ),
742
+ },
743
+ entity_schema={
744
+ 'type': 'object',
745
+ 'description': 'Linear team object',
746
+ 'properties': {
747
+ 'id': {'type': 'string', 'description': 'Unique team identifier'},
748
+ 'name': {'type': 'string', 'description': 'Team name'},
749
+ 'key': {'type': 'string', 'description': 'Team key (short identifier)'},
750
+ 'description': {
751
+ 'oneOf': [
752
+ {'type': 'string'},
753
+ {'type': 'null'},
754
+ ],
755
+ 'description': 'Team description',
756
+ },
757
+ 'timezone': {
758
+ 'oneOf': [
759
+ {'type': 'string'},
760
+ {'type': 'null'},
761
+ ],
762
+ 'description': 'Team timezone',
763
+ },
764
+ 'createdAt': {
765
+ 'type': 'string',
766
+ 'format': 'date-time',
767
+ 'description': 'Creation timestamp',
768
+ },
769
+ 'updatedAt': {
770
+ 'type': 'string',
771
+ 'format': 'date-time',
772
+ 'description': 'Last update timestamp',
773
+ },
774
+ },
775
+ 'required': ['id', 'name', 'key'],
776
+ 'x-airbyte-entity-name': 'teams',
777
+ },
778
+ ),
779
+ ],
780
+ )