@shipfox/api-integration-jira 12.0.0 → 12.1.1

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 (91) hide show
  1. package/.turbo/turbo-build.log +17 -2
  2. package/CHANGELOG.md +26 -0
  3. package/README.md +58 -2
  4. package/dist/api/client.d.ts +19 -0
  5. package/dist/api/client.d.ts.map +1 -1
  6. package/dist/api/client.js +87 -1
  7. package/dist/api/client.js.map +1 -1
  8. package/dist/core/agent-tools-provider.d.ts +26 -0
  9. package/dist/core/agent-tools-provider.d.ts.map +1 -0
  10. package/dist/core/agent-tools-provider.js +130 -0
  11. package/dist/core/agent-tools-provider.js.map +1 -0
  12. package/dist/core/agent-tools.d.ts +16 -0
  13. package/dist/core/agent-tools.d.ts.map +1 -0
  14. package/dist/core/agent-tools.js +441 -0
  15. package/dist/core/agent-tools.js.map +1 -0
  16. package/dist/core/errors.d.ts.map +1 -1
  17. package/dist/core/scopes.d.ts +1 -1
  18. package/dist/core/scopes.d.ts.map +1 -1
  19. package/dist/core/tokens.d.ts +2 -0
  20. package/dist/core/tokens.d.ts.map +1 -1
  21. package/dist/core/tokens.js +129 -37
  22. package/dist/core/tokens.js.map +1 -1
  23. package/dist/db/db.d.ts +72 -4
  24. package/dist/db/db.d.ts.map +1 -1
  25. package/dist/db/installations.d.ts +23 -7
  26. package/dist/db/installations.d.ts.map +1 -1
  27. package/dist/db/installations.js +42 -19
  28. package/dist/db/installations.js.map +1 -1
  29. package/dist/db/schema/installations.d.ts +35 -1
  30. package/dist/db/schema/installations.d.ts.map +1 -1
  31. package/dist/db/schema/installations.js +12 -2
  32. package/dist/db/schema/installations.js.map +1 -1
  33. package/dist/db/schema/pending-selections.d.ts +1 -1
  34. package/dist/index.d.ts +21 -6
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +17 -5
  37. package/dist/index.js.map +1 -1
  38. package/dist/presentation/dto/integrations.d.ts.map +1 -1
  39. package/dist/temporal/activities/index.d.ts +2 -0
  40. package/dist/temporal/activities/index.d.ts.map +1 -0
  41. package/dist/temporal/activities/index.js +3 -0
  42. package/dist/temporal/activities/index.js.map +1 -0
  43. package/dist/temporal/activities/refresh-jira-tokens.d.ts +20 -0
  44. package/dist/temporal/activities/refresh-jira-tokens.d.ts.map +1 -0
  45. package/dist/temporal/activities/refresh-jira-tokens.js +58 -0
  46. package/dist/temporal/activities/refresh-jira-tokens.js.map +1 -0
  47. package/dist/temporal/constants.d.ts +6 -0
  48. package/dist/temporal/constants.d.ts.map +1 -0
  49. package/dist/temporal/constants.js +8 -0
  50. package/dist/temporal/constants.js.map +1 -0
  51. package/dist/temporal/worker.d.ts +9 -0
  52. package/dist/temporal/worker.d.ts.map +1 -0
  53. package/dist/temporal/worker.js +26 -0
  54. package/dist/temporal/worker.js.map +1 -0
  55. package/dist/temporal/workflows/index.bundle.js +25225 -0
  56. package/dist/temporal/workflows/index.bundle.meta.json +1 -0
  57. package/dist/temporal/workflows/index.d.ts +2 -0
  58. package/dist/temporal/workflows/index.d.ts.map +1 -0
  59. package/dist/temporal/workflows/index.js +3 -0
  60. package/dist/temporal/workflows/index.js.map +1 -0
  61. package/dist/temporal/workflows/refresh-jira-tokens-cron.d.ts +2 -0
  62. package/dist/temporal/workflows/refresh-jira-tokens-cron.d.ts.map +1 -0
  63. package/dist/temporal/workflows/refresh-jira-tokens-cron.js +20 -0
  64. package/dist/temporal/workflows/refresh-jira-tokens-cron.js.map +1 -0
  65. package/dist/tsconfig.test.tsbuildinfo +1 -1
  66. package/drizzle/0001_jira-token-refresh-state.sql +12 -0
  67. package/drizzle/meta/0001_snapshot.json +245 -0
  68. package/drizzle/meta/_journal.json +7 -0
  69. package/package.json +12 -5
  70. package/src/api/client.test.ts +304 -12
  71. package/src/api/client.ts +122 -1
  72. package/src/core/agent-tools-provider.test.ts +299 -0
  73. package/src/core/agent-tools-provider.ts +175 -0
  74. package/src/core/agent-tools.ts +450 -0
  75. package/src/core/tokens-refresh.test.ts +221 -4
  76. package/src/core/tokens.test.ts +1 -1
  77. package/src/core/tokens.ts +153 -33
  78. package/src/db/installations.test.ts +84 -2
  79. package/src/db/installations.ts +81 -21
  80. package/src/db/schema/installations.ts +21 -1
  81. package/src/index.test.ts +34 -0
  82. package/src/index.ts +47 -3
  83. package/src/temporal/activities/index.ts +5 -0
  84. package/src/temporal/activities/refresh-jira-tokens.test.ts +156 -0
  85. package/src/temporal/activities/refresh-jira-tokens.ts +88 -0
  86. package/src/temporal/constants.ts +8 -0
  87. package/src/temporal/worker.ts +39 -0
  88. package/src/temporal/workflows/index.ts +1 -0
  89. package/src/temporal/workflows/refresh-jira-tokens-cron.ts +19 -0
  90. package/test/factories/jira-installation.ts +4 -0
  91. package/tsconfig.build.tsbuildinfo +1 -1
@@ -0,0 +1,441 @@
1
+ const issueIdOrKeySchema = stringSchema('Jira issue ID or key, such as ENG-123');
2
+ const projectIdOrKeySchema = stringSchema('Jira project ID or key, such as ENG');
3
+ const fieldsSchema = recordSchema('Jira issue fields keyed by their REST API field name');
4
+ const updateSchema = recordSchema('Jira issue field update operations');
5
+ const fieldNamesSchema = arraySchema(stringSchema('Jira field name'));
6
+ const propertiesSchema = arraySchema(stringSchema('Jira issue property key'));
7
+ export const jiraAgentToolCatalog = [
8
+ tool({
9
+ id: 'get_issue',
10
+ description: 'Retrieve a Jira issue by its ID or key.',
11
+ sensitivity: 'read',
12
+ sensitive: false,
13
+ requiredScope: 'read',
14
+ inputSchema: objectSchema({
15
+ idOrKey: issueIdOrKeySchema,
16
+ fields: fieldNamesSchema,
17
+ fieldsByKeys: booleanSchema('Interpret fields by their keys instead of IDs'),
18
+ expand: stringSchema('Comma-separated Jira issue expansions'),
19
+ properties: propertiesSchema,
20
+ updateHistory: booleanSchema('Record this issue as viewed by the authorizing user')
21
+ }, [
22
+ 'idOrKey'
23
+ ])
24
+ }),
25
+ tool({
26
+ id: 'search_issues',
27
+ description: 'Search Jira issues with a JQL query.',
28
+ sensitivity: 'read',
29
+ sensitive: false,
30
+ requiredScope: 'read',
31
+ inputSchema: objectSchema({
32
+ jql: stringSchema('Jira Query Language expression'),
33
+ maxResults: integerSchema('Maximum number of issues to return'),
34
+ nextPageToken: stringSchema('Pagination token from a previous search'),
35
+ fields: fieldNamesSchema,
36
+ fieldsByKeys: booleanSchema('Interpret fields by their keys instead of IDs'),
37
+ expand: stringSchema('Comma-separated Jira issue expansions'),
38
+ properties: propertiesSchema,
39
+ reconcileIssues: arraySchema(integerSchema('Issue ID to reconcile for read-after-write'))
40
+ }, [
41
+ 'jql'
42
+ ])
43
+ }),
44
+ tool({
45
+ id: 'get_issue_comments',
46
+ description: 'List the comments on a Jira issue.',
47
+ sensitivity: 'read',
48
+ sensitive: false,
49
+ requiredScope: 'read',
50
+ inputSchema: objectSchema({
51
+ idOrKey: issueIdOrKeySchema,
52
+ startAt: integerSchema('Zero-based comment offset'),
53
+ maxResults: integerSchema('Maximum number of comments to return'),
54
+ orderBy: stringSchema('Comment ordering expression'),
55
+ expand: stringSchema('Comma-separated Jira comment expansions')
56
+ }, [
57
+ 'idOrKey'
58
+ ])
59
+ }),
60
+ tool({
61
+ id: 'get_issue_transitions',
62
+ description: 'List the workflow transitions available for a Jira issue.',
63
+ sensitivity: 'read',
64
+ sensitive: false,
65
+ requiredScope: 'read',
66
+ inputSchema: objectSchema({
67
+ idOrKey: issueIdOrKeySchema,
68
+ expand: stringSchema('Comma-separated transition expansions, such as transitions.fields')
69
+ }, [
70
+ 'idOrKey'
71
+ ])
72
+ }),
73
+ tool({
74
+ id: 'get_project',
75
+ description: 'Retrieve a Jira project by its ID or key.',
76
+ sensitivity: 'read',
77
+ sensitive: false,
78
+ requiredScope: 'read',
79
+ inputSchema: objectSchema({
80
+ idOrKey: projectIdOrKeySchema,
81
+ expand: stringSchema('Comma-separated Jira project expansions'),
82
+ properties: propertiesSchema
83
+ }, [
84
+ 'idOrKey'
85
+ ])
86
+ }),
87
+ tool({
88
+ id: 'get_user',
89
+ description: 'Retrieve a Jira user by Atlassian account ID.',
90
+ sensitivity: 'read',
91
+ sensitive: false,
92
+ requiredScope: 'read',
93
+ inputSchema: objectSchema({
94
+ accountId: stringSchema('Atlassian account ID'),
95
+ expand: stringSchema('Comma-separated Jira user expansions')
96
+ }, [
97
+ 'accountId'
98
+ ])
99
+ }),
100
+ tool({
101
+ id: 'create_issue',
102
+ description: 'Create a Jira issue using Jira REST issue fields. If both a project key and project ID or both an issue type name and issue type ID are supplied, the ID takes precedence.',
103
+ sensitivity: 'write',
104
+ sensitive: false,
105
+ requiredScope: 'write',
106
+ inputSchema: objectSchema({
107
+ projectKey: stringSchema('Jira project key; projectId takes precedence if both are supplied'),
108
+ projectId: stringSchema('Jira project ID; takes precedence over projectKey'),
109
+ summary: stringSchema('Issue summary'),
110
+ issueType: stringSchema('Issue type name; issueTypeId takes precedence if both are supplied'),
111
+ issueTypeId: stringSchema('Issue type ID; takes precedence over issueType'),
112
+ assigneeAccountId: stringSchema('Atlassian account ID to assign'),
113
+ priority: stringSchema('Jira priority name'),
114
+ labels: arraySchema(stringSchema('Jira label')),
115
+ body: stringSchema('Plain-text issue description'),
116
+ fields: fieldsSchema,
117
+ update: updateSchema
118
+ }, [
119
+ 'summary'
120
+ ])
121
+ }),
122
+ tool({
123
+ id: 'update_issue',
124
+ description: 'Update a Jira issue using Jira REST issue fields.',
125
+ sensitivity: 'write',
126
+ sensitive: false,
127
+ requiredScope: 'write',
128
+ inputSchema: objectSchema({
129
+ idOrKey: issueIdOrKeySchema,
130
+ summary: stringSchema('Replacement issue summary'),
131
+ issueType: stringSchema('Replacement issue type name; issueTypeId takes precedence if both are supplied'),
132
+ issueTypeId: stringSchema('Replacement issue type ID; takes precedence over issueType'),
133
+ assigneeAccountId: stringSchema('Atlassian account ID to assign'),
134
+ priority: stringSchema('Replacement Jira priority name'),
135
+ labels: arraySchema(stringSchema('Replacement Jira labels')),
136
+ body: stringSchema('Plain-text replacement issue description'),
137
+ fields: fieldsSchema,
138
+ update: updateSchema
139
+ }, [
140
+ 'idOrKey'
141
+ ])
142
+ }),
143
+ tool({
144
+ id: 'add_comment',
145
+ description: 'Add a plain-text comment to a Jira issue.',
146
+ sensitivity: 'write',
147
+ sensitive: false,
148
+ requiredScope: 'write',
149
+ inputSchema: objectSchema({
150
+ idOrKey: issueIdOrKeySchema,
151
+ body: stringSchema('Plain-text comment body')
152
+ }, [
153
+ 'idOrKey',
154
+ 'body'
155
+ ])
156
+ }),
157
+ tool({
158
+ id: 'transition_issue',
159
+ description: 'Move a Jira issue through a workflow transition.',
160
+ sensitivity: 'write',
161
+ sensitive: false,
162
+ requiredScope: 'write',
163
+ inputSchema: objectSchema({
164
+ idOrKey: issueIdOrKeySchema,
165
+ transitionId: stringSchema('Jira workflow transition ID'),
166
+ fields: fieldsSchema,
167
+ update: updateSchema
168
+ }, [
169
+ 'idOrKey',
170
+ 'transitionId'
171
+ ])
172
+ }),
173
+ tool({
174
+ id: 'assign_issue',
175
+ description: 'Assign or unassign a Jira issue by Atlassian account ID.',
176
+ sensitivity: 'write',
177
+ sensitive: false,
178
+ requiredScope: 'write',
179
+ inputSchema: objectSchema({
180
+ idOrKey: issueIdOrKeySchema,
181
+ accountId: nullableStringSchema('Atlassian account ID, or null to unassign')
182
+ }, [
183
+ 'idOrKey',
184
+ 'accountId'
185
+ ])
186
+ })
187
+ ];
188
+ export const jiraAgentToolSelectionCatalog = buildJiraAgentToolSelectionCatalog(jiraAgentToolCatalog);
189
+ export const JIRA_TOOL_OPERATIONS = {
190
+ get_issue: {
191
+ method: 'GET',
192
+ path: (args)=>issuePath(args),
193
+ query: (args)=>definedArguments(args, [
194
+ 'fields',
195
+ 'fieldsByKeys',
196
+ 'expand',
197
+ 'properties',
198
+ 'updateHistory'
199
+ ])
200
+ },
201
+ search_issues: {
202
+ method: 'POST',
203
+ path: ()=>'/search/jql',
204
+ body: (args)=>definedArguments(args, [
205
+ 'jql',
206
+ 'maxResults',
207
+ 'nextPageToken',
208
+ 'fields',
209
+ 'fieldsByKeys',
210
+ 'expand',
211
+ 'properties',
212
+ 'reconcileIssues'
213
+ ])
214
+ },
215
+ get_issue_comments: {
216
+ method: 'GET',
217
+ path: (args)=>issuePath(args, 'comment'),
218
+ query: (args)=>definedArguments(args, [
219
+ 'startAt',
220
+ 'maxResults',
221
+ 'orderBy',
222
+ 'expand'
223
+ ])
224
+ },
225
+ get_issue_transitions: {
226
+ method: 'GET',
227
+ path: (args)=>issuePath(args, 'transitions'),
228
+ query: (args)=>definedArguments(args, [
229
+ 'expand'
230
+ ])
231
+ },
232
+ get_project: {
233
+ method: 'GET',
234
+ path: (args)=>`/project/${encodeURIComponent(stringArgument(args, 'idOrKey'))}`,
235
+ query: (args)=>definedArguments(args, [
236
+ 'expand',
237
+ 'properties'
238
+ ])
239
+ },
240
+ get_user: {
241
+ method: 'GET',
242
+ path: ()=>'/user',
243
+ query: (args)=>definedArguments(args, [
244
+ 'accountId',
245
+ 'expand'
246
+ ])
247
+ },
248
+ create_issue: {
249
+ method: 'POST',
250
+ path: ()=>'/issue',
251
+ body: (args)=>issueWriteBody(args)
252
+ },
253
+ update_issue: {
254
+ method: 'PUT',
255
+ path: (args)=>issuePath(args),
256
+ body: (args)=>issueWriteBody(args)
257
+ },
258
+ add_comment: {
259
+ method: 'POST',
260
+ path: (args)=>issuePath(args, 'comment'),
261
+ body: (args)=>({
262
+ body: jiraPlainTextToAdf(stringArgument(args, 'body'))
263
+ })
264
+ },
265
+ transition_issue: {
266
+ method: 'POST',
267
+ path: (args)=>issuePath(args, 'transitions'),
268
+ body: (args)=>transitionBody(args)
269
+ },
270
+ assign_issue: {
271
+ method: 'PUT',
272
+ path: (args)=>issuePath(args, 'assignee'),
273
+ body: (args)=>({
274
+ accountId: args.accountId
275
+ })
276
+ }
277
+ };
278
+ export function jiraPlainTextToAdf(body) {
279
+ return {
280
+ type: 'doc',
281
+ version: 1,
282
+ content: [
283
+ {
284
+ type: 'paragraph',
285
+ content: [
286
+ {
287
+ type: 'text',
288
+ text: body
289
+ }
290
+ ]
291
+ }
292
+ ]
293
+ };
294
+ }
295
+ function buildJiraAgentToolSelectionCatalog(catalog) {
296
+ return {
297
+ selectors: catalog.map((entry)=>({
298
+ token: entry.id,
299
+ kind: 'standalone',
300
+ sensitivity: entry.sensitivity,
301
+ sensitive: entry.sensitive
302
+ }))
303
+ };
304
+ }
305
+ function issuePath(args, suffix = '') {
306
+ return `/issue/${encodeURIComponent(stringArgument(args, 'idOrKey'))}${suffix ? `/${suffix}` : ''}`;
307
+ }
308
+ function issueWriteBody(args) {
309
+ const body = {};
310
+ const fields = issueFields(args);
311
+ if (Object.keys(fields).length > 0) body.fields = fields;
312
+ if (isRecord(args.update)) body.update = args.update;
313
+ return body;
314
+ }
315
+ function issueFields(args) {
316
+ const fields = isRecord(args.fields) ? {
317
+ ...args.fields
318
+ } : {};
319
+ const projectKey = stringArgumentOrUndefined(args, 'projectKey');
320
+ const projectId = stringArgumentOrUndefined(args, 'projectId');
321
+ const summary = stringArgumentOrUndefined(args, 'summary');
322
+ const issueType = stringArgumentOrUndefined(args, 'issueType');
323
+ const issueTypeId = stringArgumentOrUndefined(args, 'issueTypeId');
324
+ const assigneeAccountId = args.assigneeAccountId;
325
+ const priority = stringArgumentOrUndefined(args, 'priority');
326
+ if (projectKey !== undefined) fields.project = {
327
+ key: projectKey
328
+ };
329
+ if (projectId !== undefined) fields.project = {
330
+ id: projectId
331
+ };
332
+ if (summary !== undefined) fields.summary = summary;
333
+ if (issueType !== undefined) fields.issuetype = {
334
+ name: issueType
335
+ };
336
+ if (issueTypeId !== undefined) fields.issuetype = {
337
+ id: issueTypeId
338
+ };
339
+ if (typeof assigneeAccountId === 'string') fields.assignee = {
340
+ accountId: assigneeAccountId
341
+ };
342
+ if (priority !== undefined) fields.priority = {
343
+ name: priority
344
+ };
345
+ if (Array.isArray(args.labels)) fields.labels = args.labels;
346
+ if (typeof args.body === 'string') fields.description = jiraPlainTextToAdf(args.body);
347
+ return fields;
348
+ }
349
+ function transitionBody(args) {
350
+ const body = {
351
+ transition: {
352
+ id: stringArgument(args, 'transitionId')
353
+ }
354
+ };
355
+ const fields = isRecord(args.fields) ? args.fields : undefined;
356
+ if (fields !== undefined) body.fields = fields;
357
+ if (isRecord(args.update)) body.update = args.update;
358
+ return body;
359
+ }
360
+ function definedArguments(args, names) {
361
+ return Object.fromEntries(names.map((name)=>[
362
+ name,
363
+ args[name]
364
+ ]).filter(([, value])=>value !== undefined));
365
+ }
366
+ function stringArgument(args, name) {
367
+ const value = args[name];
368
+ return typeof value === 'string' ? value : String(value ?? '');
369
+ }
370
+ function stringArgumentOrUndefined(args, name) {
371
+ const value = args[name];
372
+ return typeof value === 'string' ? value : undefined;
373
+ }
374
+ function isRecord(value) {
375
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
376
+ }
377
+ function tool(input) {
378
+ return input;
379
+ }
380
+ function objectSchema(properties, required = []) {
381
+ return {
382
+ type: 'object',
383
+ additionalProperties: false,
384
+ properties,
385
+ ...required.length > 0 ? {
386
+ required
387
+ } : {}
388
+ };
389
+ }
390
+ function recordSchema(description) {
391
+ return {
392
+ type: 'object',
393
+ additionalProperties: true,
394
+ ...description === undefined ? {} : {
395
+ description
396
+ }
397
+ };
398
+ }
399
+ function stringSchema(description) {
400
+ return {
401
+ type: 'string',
402
+ ...description === undefined ? {} : {
403
+ description
404
+ }
405
+ };
406
+ }
407
+ function nullableStringSchema(description) {
408
+ return {
409
+ type: [
410
+ 'string',
411
+ 'null'
412
+ ],
413
+ ...description === undefined ? {} : {
414
+ description
415
+ }
416
+ };
417
+ }
418
+ function integerSchema(description) {
419
+ return {
420
+ type: 'integer',
421
+ ...description === undefined ? {} : {
422
+ description
423
+ }
424
+ };
425
+ }
426
+ function booleanSchema(description) {
427
+ return {
428
+ type: 'boolean',
429
+ ...description === undefined ? {} : {
430
+ description
431
+ }
432
+ };
433
+ }
434
+ function arraySchema(items) {
435
+ return {
436
+ type: 'array',
437
+ items
438
+ };
439
+ }
440
+
441
+ //# sourceMappingURL=agent-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/agent-tools.ts"],"sourcesContent":["import type {\n JiraAgentToolId,\n JiraAgentToolRequiredScope,\n JiraAgentToolCatalogEntry as JiraDtoAgentToolCatalogEntry,\n} from '@shipfox/api-integration-jira-dto';\nimport type {\n AgentToolCatalogEntry,\n AgentToolJsonSchema,\n AgentToolSelectionCatalog,\n AgentToolSelector,\n} from '@shipfox/api-integration-spi';\nimport type {JiraAgentToolHttpMethod, JiraAgentToolQueryValue} from '#api/client.js';\n\nexport type JiraAgentToolCatalogEntry = JiraDtoAgentToolCatalogEntry;\nexport type {JiraAgentToolId, JiraAgentToolRequiredScope};\n\ninterface JiraAgentToolCatalogInput {\n id: JiraAgentToolId;\n description: string;\n sensitivity: 'read' | 'write';\n sensitive: boolean;\n requiredScope: JiraAgentToolRequiredScope;\n inputSchema: AgentToolJsonSchema;\n}\n\nconst issueIdOrKeySchema = stringSchema('Jira issue ID or key, such as ENG-123');\nconst projectIdOrKeySchema = stringSchema('Jira project ID or key, such as ENG');\nconst fieldsSchema = recordSchema('Jira issue fields keyed by their REST API field name');\nconst updateSchema = recordSchema('Jira issue field update operations');\nconst fieldNamesSchema = arraySchema(stringSchema('Jira field name'));\nconst propertiesSchema = arraySchema(stringSchema('Jira issue property key'));\n\nexport const jiraAgentToolCatalog = [\n tool({\n id: 'get_issue',\n description: 'Retrieve a Jira issue by its ID or key.',\n sensitivity: 'read',\n sensitive: false,\n requiredScope: 'read',\n inputSchema: objectSchema(\n {\n idOrKey: issueIdOrKeySchema,\n fields: fieldNamesSchema,\n fieldsByKeys: booleanSchema('Interpret fields by their keys instead of IDs'),\n expand: stringSchema('Comma-separated Jira issue expansions'),\n properties: propertiesSchema,\n updateHistory: booleanSchema('Record this issue as viewed by the authorizing user'),\n },\n ['idOrKey'],\n ),\n }),\n tool({\n id: 'search_issues',\n description: 'Search Jira issues with a JQL query.',\n sensitivity: 'read',\n sensitive: false,\n requiredScope: 'read',\n inputSchema: objectSchema(\n {\n jql: stringSchema('Jira Query Language expression'),\n maxResults: integerSchema('Maximum number of issues to return'),\n nextPageToken: stringSchema('Pagination token from a previous search'),\n fields: fieldNamesSchema,\n fieldsByKeys: booleanSchema('Interpret fields by their keys instead of IDs'),\n expand: stringSchema('Comma-separated Jira issue expansions'),\n properties: propertiesSchema,\n reconcileIssues: arraySchema(integerSchema('Issue ID to reconcile for read-after-write')),\n },\n ['jql'],\n ),\n }),\n tool({\n id: 'get_issue_comments',\n description: 'List the comments on a Jira issue.',\n sensitivity: 'read',\n sensitive: false,\n requiredScope: 'read',\n inputSchema: objectSchema(\n {\n idOrKey: issueIdOrKeySchema,\n startAt: integerSchema('Zero-based comment offset'),\n maxResults: integerSchema('Maximum number of comments to return'),\n orderBy: stringSchema('Comment ordering expression'),\n expand: stringSchema('Comma-separated Jira comment expansions'),\n },\n ['idOrKey'],\n ),\n }),\n tool({\n id: 'get_issue_transitions',\n description: 'List the workflow transitions available for a Jira issue.',\n sensitivity: 'read',\n sensitive: false,\n requiredScope: 'read',\n inputSchema: objectSchema(\n {\n idOrKey: issueIdOrKeySchema,\n expand: stringSchema('Comma-separated transition expansions, such as transitions.fields'),\n },\n ['idOrKey'],\n ),\n }),\n tool({\n id: 'get_project',\n description: 'Retrieve a Jira project by its ID or key.',\n sensitivity: 'read',\n sensitive: false,\n requiredScope: 'read',\n inputSchema: objectSchema(\n {\n idOrKey: projectIdOrKeySchema,\n expand: stringSchema('Comma-separated Jira project expansions'),\n properties: propertiesSchema,\n },\n ['idOrKey'],\n ),\n }),\n tool({\n id: 'get_user',\n description: 'Retrieve a Jira user by Atlassian account ID.',\n sensitivity: 'read',\n sensitive: false,\n requiredScope: 'read',\n inputSchema: objectSchema(\n {\n accountId: stringSchema('Atlassian account ID'),\n expand: stringSchema('Comma-separated Jira user expansions'),\n },\n ['accountId'],\n ),\n }),\n tool({\n id: 'create_issue',\n description:\n 'Create a Jira issue using Jira REST issue fields. If both a project key and project ID or both an issue type name and issue type ID are supplied, the ID takes precedence.',\n sensitivity: 'write',\n sensitive: false,\n requiredScope: 'write',\n inputSchema: objectSchema(\n {\n projectKey: stringSchema(\n 'Jira project key; projectId takes precedence if both are supplied',\n ),\n projectId: stringSchema('Jira project ID; takes precedence over projectKey'),\n summary: stringSchema('Issue summary'),\n issueType: stringSchema(\n 'Issue type name; issueTypeId takes precedence if both are supplied',\n ),\n issueTypeId: stringSchema('Issue type ID; takes precedence over issueType'),\n assigneeAccountId: stringSchema('Atlassian account ID to assign'),\n priority: stringSchema('Jira priority name'),\n labels: arraySchema(stringSchema('Jira label')),\n body: stringSchema('Plain-text issue description'),\n fields: fieldsSchema,\n update: updateSchema,\n },\n ['summary'],\n ),\n }),\n tool({\n id: 'update_issue',\n description: 'Update a Jira issue using Jira REST issue fields.',\n sensitivity: 'write',\n sensitive: false,\n requiredScope: 'write',\n inputSchema: objectSchema(\n {\n idOrKey: issueIdOrKeySchema,\n summary: stringSchema('Replacement issue summary'),\n issueType: stringSchema(\n 'Replacement issue type name; issueTypeId takes precedence if both are supplied',\n ),\n issueTypeId: stringSchema('Replacement issue type ID; takes precedence over issueType'),\n assigneeAccountId: stringSchema('Atlassian account ID to assign'),\n priority: stringSchema('Replacement Jira priority name'),\n labels: arraySchema(stringSchema('Replacement Jira labels')),\n body: stringSchema('Plain-text replacement issue description'),\n fields: fieldsSchema,\n update: updateSchema,\n },\n ['idOrKey'],\n ),\n }),\n tool({\n id: 'add_comment',\n description: 'Add a plain-text comment to a Jira issue.',\n sensitivity: 'write',\n sensitive: false,\n requiredScope: 'write',\n inputSchema: objectSchema(\n {\n idOrKey: issueIdOrKeySchema,\n body: stringSchema('Plain-text comment body'),\n },\n ['idOrKey', 'body'],\n ),\n }),\n tool({\n id: 'transition_issue',\n description: 'Move a Jira issue through a workflow transition.',\n sensitivity: 'write',\n sensitive: false,\n requiredScope: 'write',\n inputSchema: objectSchema(\n {\n idOrKey: issueIdOrKeySchema,\n transitionId: stringSchema('Jira workflow transition ID'),\n fields: fieldsSchema,\n update: updateSchema,\n },\n ['idOrKey', 'transitionId'],\n ),\n }),\n tool({\n id: 'assign_issue',\n description: 'Assign or unassign a Jira issue by Atlassian account ID.',\n sensitivity: 'write',\n sensitive: false,\n requiredScope: 'write',\n inputSchema: objectSchema(\n {\n idOrKey: issueIdOrKeySchema,\n accountId: nullableStringSchema('Atlassian account ID, or null to unassign'),\n },\n ['idOrKey', 'accountId'],\n ),\n }),\n] as const satisfies readonly JiraAgentToolCatalogEntry[];\n\nexport const jiraAgentToolSelectionCatalog =\n buildJiraAgentToolSelectionCatalog(jiraAgentToolCatalog);\n\nexport interface JiraToolOperation {\n method: JiraAgentToolHttpMethod;\n path: (args: Record<string, unknown>) => string;\n query?: ((args: Record<string, unknown>) => Record<string, JiraAgentToolQueryValue>) | undefined;\n body?: ((args: Record<string, unknown>) => unknown) | undefined;\n}\n\nexport const JIRA_TOOL_OPERATIONS: Record<JiraAgentToolId, JiraToolOperation> = {\n get_issue: {\n method: 'GET',\n path: (args) => issuePath(args),\n query: (args) =>\n definedArguments(args, ['fields', 'fieldsByKeys', 'expand', 'properties', 'updateHistory']),\n },\n search_issues: {\n method: 'POST',\n path: () => '/search/jql',\n body: (args) =>\n definedArguments(args, [\n 'jql',\n 'maxResults',\n 'nextPageToken',\n 'fields',\n 'fieldsByKeys',\n 'expand',\n 'properties',\n 'reconcileIssues',\n ]),\n },\n get_issue_comments: {\n method: 'GET',\n path: (args) => issuePath(args, 'comment'),\n query: (args) => definedArguments(args, ['startAt', 'maxResults', 'orderBy', 'expand']),\n },\n get_issue_transitions: {\n method: 'GET',\n path: (args) => issuePath(args, 'transitions'),\n query: (args) => definedArguments(args, ['expand']),\n },\n get_project: {\n method: 'GET',\n path: (args) => `/project/${encodeURIComponent(stringArgument(args, 'idOrKey'))}`,\n query: (args) => definedArguments(args, ['expand', 'properties']),\n },\n get_user: {\n method: 'GET',\n path: () => '/user',\n query: (args) => definedArguments(args, ['accountId', 'expand']),\n },\n create_issue: {\n method: 'POST',\n path: () => '/issue',\n body: (args) => issueWriteBody(args),\n },\n update_issue: {\n method: 'PUT',\n path: (args) => issuePath(args),\n body: (args) => issueWriteBody(args),\n },\n add_comment: {\n method: 'POST',\n path: (args) => issuePath(args, 'comment'),\n body: (args) => ({body: jiraPlainTextToAdf(stringArgument(args, 'body'))}),\n },\n transition_issue: {\n method: 'POST',\n path: (args) => issuePath(args, 'transitions'),\n body: (args) => transitionBody(args),\n },\n assign_issue: {\n method: 'PUT',\n path: (args) => issuePath(args, 'assignee'),\n body: (args) => ({accountId: args.accountId}),\n },\n};\n\nexport function jiraPlainTextToAdf(body: string): Record<string, unknown> {\n return {\n type: 'doc',\n version: 1,\n content: [\n {\n type: 'paragraph',\n content: [{type: 'text', text: body}],\n },\n ],\n };\n}\n\nfunction buildJiraAgentToolSelectionCatalog(\n catalog: readonly AgentToolCatalogEntry<JiraAgentToolRequiredScope>[],\n): AgentToolSelectionCatalog {\n return {\n selectors: catalog.map(\n (entry): AgentToolSelector => ({\n token: entry.id,\n kind: 'standalone',\n sensitivity: entry.sensitivity,\n sensitive: entry.sensitive,\n }),\n ),\n };\n}\n\nfunction issuePath(args: Record<string, unknown>, suffix = ''): string {\n return `/issue/${encodeURIComponent(stringArgument(args, 'idOrKey'))}${suffix ? `/${suffix}` : ''}`;\n}\n\nfunction issueWriteBody(args: Record<string, unknown>): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n const fields = issueFields(args);\n if (Object.keys(fields).length > 0) body.fields = fields;\n if (isRecord(args.update)) body.update = args.update;\n return body;\n}\n\nfunction issueFields(args: Record<string, unknown>): Record<string, unknown> {\n const fields = isRecord(args.fields) ? {...args.fields} : {};\n const projectKey = stringArgumentOrUndefined(args, 'projectKey');\n const projectId = stringArgumentOrUndefined(args, 'projectId');\n const summary = stringArgumentOrUndefined(args, 'summary');\n const issueType = stringArgumentOrUndefined(args, 'issueType');\n const issueTypeId = stringArgumentOrUndefined(args, 'issueTypeId');\n const assigneeAccountId = args.assigneeAccountId;\n const priority = stringArgumentOrUndefined(args, 'priority');\n\n if (projectKey !== undefined) fields.project = {key: projectKey};\n if (projectId !== undefined) fields.project = {id: projectId};\n if (summary !== undefined) fields.summary = summary;\n if (issueType !== undefined) fields.issuetype = {name: issueType};\n if (issueTypeId !== undefined) fields.issuetype = {id: issueTypeId};\n if (typeof assigneeAccountId === 'string') fields.assignee = {accountId: assigneeAccountId};\n if (priority !== undefined) fields.priority = {name: priority};\n if (Array.isArray(args.labels)) fields.labels = args.labels;\n if (typeof args.body === 'string') fields.description = jiraPlainTextToAdf(args.body);\n\n return fields;\n}\n\nfunction transitionBody(args: Record<string, unknown>): Record<string, unknown> {\n const body: Record<string, unknown> = {\n transition: {id: stringArgument(args, 'transitionId')},\n };\n const fields = isRecord(args.fields) ? args.fields : undefined;\n if (fields !== undefined) body.fields = fields;\n if (isRecord(args.update)) body.update = args.update;\n return body;\n}\n\nfunction definedArguments(\n args: Record<string, unknown>,\n names: readonly string[],\n): Record<string, JiraAgentToolQueryValue> {\n return Object.fromEntries(\n names.map((name) => [name, args[name]] as const).filter(([, value]) => value !== undefined),\n ) as Record<string, JiraAgentToolQueryValue>;\n}\n\nfunction stringArgument(args: Record<string, unknown>, name: string): string {\n const value = args[name];\n return typeof value === 'string' ? value : String(value ?? '');\n}\n\nfunction stringArgumentOrUndefined(\n args: Record<string, unknown>,\n name: string,\n): string | undefined {\n const value = args[name];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction tool(input: JiraAgentToolCatalogInput): JiraAgentToolCatalogEntry {\n return input;\n}\n\nfunction objectSchema(\n properties: Record<string, AgentToolJsonSchema>,\n required: string[] = [],\n): AgentToolJsonSchema {\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n ...(required.length > 0 ? {required} : {}),\n };\n}\n\nfunction recordSchema(description?: string): AgentToolJsonSchema {\n return {\n type: 'object',\n additionalProperties: true,\n ...(description === undefined ? {} : {description}),\n };\n}\n\nfunction stringSchema(description?: string): AgentToolJsonSchema {\n return {type: 'string', ...(description === undefined ? {} : {description})};\n}\n\nfunction nullableStringSchema(description?: string): AgentToolJsonSchema {\n return {type: ['string', 'null'], ...(description === undefined ? {} : {description})};\n}\n\nfunction integerSchema(description?: string): AgentToolJsonSchema {\n return {type: 'integer', ...(description === undefined ? {} : {description})};\n}\n\nfunction booleanSchema(description?: string): AgentToolJsonSchema {\n return {type: 'boolean', ...(description === undefined ? {} : {description})};\n}\n\nfunction arraySchema(items: AgentToolJsonSchema): AgentToolJsonSchema {\n return {type: 'array', items};\n}\n"],"names":["issueIdOrKeySchema","stringSchema","projectIdOrKeySchema","fieldsSchema","recordSchema","updateSchema","fieldNamesSchema","arraySchema","propertiesSchema","jiraAgentToolCatalog","tool","id","description","sensitivity","sensitive","requiredScope","inputSchema","objectSchema","idOrKey","fields","fieldsByKeys","booleanSchema","expand","properties","updateHistory","jql","maxResults","integerSchema","nextPageToken","reconcileIssues","startAt","orderBy","accountId","projectKey","projectId","summary","issueType","issueTypeId","assigneeAccountId","priority","labels","body","update","transitionId","nullableStringSchema","jiraAgentToolSelectionCatalog","buildJiraAgentToolSelectionCatalog","JIRA_TOOL_OPERATIONS","get_issue","method","path","args","issuePath","query","definedArguments","search_issues","get_issue_comments","get_issue_transitions","get_project","encodeURIComponent","stringArgument","get_user","create_issue","issueWriteBody","update_issue","add_comment","jiraPlainTextToAdf","transition_issue","transitionBody","assign_issue","type","version","content","text","catalog","selectors","map","entry","token","kind","suffix","issueFields","Object","keys","length","isRecord","stringArgumentOrUndefined","undefined","project","key","issuetype","name","assignee","Array","isArray","transition","names","fromEntries","filter","value","String","input","required","additionalProperties","items"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AAEtE,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,YAAY,EAAE,MAAM;CAIjC;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,YAAY,EAAE,MAAM;CAIjC;AAED,qBAAa,iCAAkC,SAAQ,KAAK;gBAC9C,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAMlD;AAED,qBAAa,4BAA6B,SAAQ,wBAAwB;CAAG;AAE7E,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,SAA+B;CAInD;AAED,qBAAa,kCAAmC,SAAQ,KAAK;;CAK5D;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,aAAa,EAAE,MAAM;aACrB,mBAAmB,EAAE,MAAM,GAAG,SAAS;gBADvC,aAAa,EAAE,MAAM,EACrB,mBAAmB,EAAE,MAAM,GAAG,SAAS;CAK1D;AAED,qBAAa,mCAAoC,SAAQ,KAAK;aAChC,aAAa,EAAE,MAAM,EAAE;gBAAvB,aAAa,EAAE,MAAM,EAAE;CAIpD;AAED,qBAAa,gCAAiC,SAAQ,KAAK;;CAO1D;AAED,qBAAa,kCAAmC,SAAQ,KAAK;gBAC/C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,gCAAiC,SAAQ,KAAK;gBAC7C,YAAY,EAAE,MAAM;CAIjC;AAED,qBAAa,2BAA4B,SAAQ,KAAK;aACxB,YAAY,EAAE,MAAM;gBAApB,YAAY,EAAE,MAAM;CAIjD;AAED,qBAAa,8BAA+B,SAAQ,KAAK;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iCAAkC,SAAQ,KAAK;;CAK3D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AAEtE,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,YAAY,YAAY,EAAE,MAAM,EAG/B;CACF;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,YAAY,YAAY,EAAE,MAAM,EAG/B;CACF;AAED,qBAAa,iCAAkC,SAAQ,KAAK;IAC1D,YAAY,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAKhD;CACF;AAED,qBAAa,4BAA6B,SAAQ,wBAAwB;CAAG;AAE7E,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAO,SAA+B,EAGjD;CACF;AAED,qBAAa,kCAAmC,SAAQ,KAAK;IAC3D,cAGC;CACF;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,aAAa,EAAE,MAAM;aACrB,mBAAmB,EAAE,MAAM,GAAG,SAAS;IAFzD,YACkB,aAAa,EAAE,MAAM,EACrB,mBAAmB,EAAE,MAAM,GAAG,SAAS,EAIxD;CACF;AAED,qBAAa,mCAAoC,SAAQ,KAAK;aAChC,aAAa,EAAE,MAAM,EAAE;IAAnD,YAA4B,aAAa,EAAE,MAAM,EAAE,EAGlD;CACF;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IACzD,cAKC;CACF;AAED,qBAAa,kCAAmC,SAAQ,KAAK;IAC3D,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,qBAAa,gCAAiC,SAAQ,KAAK;IACzD,YAAY,YAAY,EAAE,MAAM,EAG/B;CACF;AAED,qBAAa,2BAA4B,SAAQ,KAAK;aACxB,YAAY,EAAE,MAAM;IAAhD,YAA4B,YAAY,EAAE,MAAM,EAG/C;CACF;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,qBAAa,iCAAkC,SAAQ,KAAK;IAC1D,cAGC;CACF"}
@@ -1,4 +1,4 @@
1
- export declare const JIRA_OAUTH_SCOPES: readonly ["read:jira-work", "write:jira-work", "read:jira-user", "manage:jira-webhook", "offline_access"];
1
+ export declare const JIRA_OAUTH_SCOPES: readonly ['read:jira-work', 'write:jira-work', 'read:jira-user', 'manage:jira-webhook', 'offline_access'];
2
2
  export declare function formatJiraOAuthScopes(): string;
3
3
  export declare function assertJiraAuthorizationScopes(scopes: readonly string[]): void;
4
4
  //# sourceMappingURL=scopes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../../src/core/scopes.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,2GAMpB,CAAC;AAEX,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAI7E"}
1
+ {"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../../src/core/scopes.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,YAC5B,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,CACR,CAAC;AAEX,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAI7E"}
@@ -1,6 +1,8 @@
1
+ import type { IntegrationConnectionLifecycleStatus } from '@shipfox/api-integration-spi';
1
2
  import { type JiraApiClient } from '#api/client.js';
2
3
  export interface JiraConnectionResolverResult {
3
4
  workspaceId: string;
5
+ lifecycleStatus: IntegrationConnectionLifecycleStatus;
4
6
  }
5
7
  export interface JiraSecretsStore {
6
8
  getSecret(params: {
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAkBvE,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,MAAM,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjG,UAAU,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KACtC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC,CAAC;IAC3F,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,cAAc,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,cAAc,CA6DvF"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oCAAoC,EAAC,MAAM,8BAA8B,CAAC;AAEvF,OAAO,EAAsB,KAAK,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAkBvE,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,oCAAoC,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,MAAM,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjG,UAAU,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KACtC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC,CAAC;IAC3F,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAC,YAAY,EAAE,MAAM,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,cAAc,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,cAAc,CAgIvF"}