@tappify/extension-sdk 2.0.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/LICENSE +21 -0
- package/dist/chunk-2DBSVKAU.cjs +65 -0
- package/dist/chunk-2DBSVKAU.cjs.map +1 -0
- package/dist/chunk-3YWVYA42.cjs +142 -0
- package/dist/chunk-3YWVYA42.cjs.map +1 -0
- package/dist/chunk-4C5Z3CIK.mjs +26 -0
- package/dist/chunk-4C5Z3CIK.mjs.map +1 -0
- package/dist/chunk-5AAPD5WV.cjs +250 -0
- package/dist/chunk-5AAPD5WV.cjs.map +1 -0
- package/dist/chunk-7KIKOH5H.cjs +26 -0
- package/dist/chunk-7KIKOH5H.cjs.map +1 -0
- package/dist/chunk-BDCX6LRQ.mjs +250 -0
- package/dist/chunk-BDCX6LRQ.mjs.map +1 -0
- package/dist/chunk-CSTYBKZC.mjs +65 -0
- package/dist/chunk-CSTYBKZC.mjs.map +1 -0
- package/dist/chunk-IGK2AP6J.mjs +142 -0
- package/dist/chunk-IGK2AP6J.mjs.map +1 -0
- package/dist/chunk-MNDVYPEP.mjs +302 -0
- package/dist/chunk-MNDVYPEP.mjs.map +1 -0
- package/dist/chunk-OPPYEA7F.cjs +33 -0
- package/dist/chunk-OPPYEA7F.cjs.map +1 -0
- package/dist/chunk-PYJMJF44.cjs +302 -0
- package/dist/chunk-PYJMJF44.cjs.map +1 -0
- package/dist/chunk-QHM7XNRK.mjs +33 -0
- package/dist/chunk-QHM7XNRK.mjs.map +1 -0
- package/dist/chunk-RMUWRESK.cjs +365 -0
- package/dist/chunk-RMUWRESK.cjs.map +1 -0
- package/dist/chunk-ZT35X7KL.mjs +365 -0
- package/dist/chunk-ZT35X7KL.mjs.map +1 -0
- package/dist/codegen.cjs +300 -0
- package/dist/codegen.cjs.map +1 -0
- package/dist/codegen.d.cts +432 -0
- package/dist/codegen.d.ts +432 -0
- package/dist/codegen.mjs +272 -0
- package/dist/codegen.mjs.map +1 -0
- package/dist/constants-DJ_KgZpN.d.cts +449 -0
- package/dist/constants-DJ_KgZpN.d.ts +449 -0
- package/dist/context-Dt6xh_5t.d.cts +30 -0
- package/dist/context-Ml7k_V14.d.ts +30 -0
- package/dist/errors-COsBh7kd.d.cts +88 -0
- package/dist/errors-COsBh7kd.d.ts +88 -0
- package/dist/handler-CZIlZ5vu.d.ts +227 -0
- package/dist/handler-kU9Jf36K.d.cts +227 -0
- package/dist/host.cjs +24 -0
- package/dist/host.cjs.map +1 -0
- package/dist/host.d.cts +24 -0
- package/dist/host.d.ts +24 -0
- package/dist/host.mjs +24 -0
- package/dist/host.mjs.map +1 -0
- package/dist/index.cjs +698 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1016 -0
- package/dist/index.d.ts +1016 -0
- package/dist/index.mjs +698 -0
- package/dist/index.mjs.map +1 -0
- package/dist/manifest.cjs +872 -0
- package/dist/manifest.cjs.map +1 -0
- package/dist/manifest.d.cts +432 -0
- package/dist/manifest.d.ts +432 -0
- package/dist/manifest.mjs +872 -0
- package/dist/manifest.mjs.map +1 -0
- package/dist/matchers-Cz93AK1n.d.cts +74 -0
- package/dist/matchers-Cz93AK1n.d.ts +74 -0
- package/dist/server.cjs +210 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +243 -0
- package/dist/server.d.ts +243 -0
- package/dist/server.mjs +210 -0
- package/dist/server.mjs.map +1 -0
- package/dist/styles.css +367 -0
- package/dist/testing/index.cjs +887 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +512 -0
- package/dist/testing/index.d.ts +512 -0
- package/dist/testing/index.mjs +887 -0
- package/dist/testing/index.mjs.map +1 -0
- package/dist/testing/jest.cjs +17 -0
- package/dist/testing/jest.cjs.map +1 -0
- package/dist/testing/jest.d.cts +12 -0
- package/dist/testing/jest.d.ts +12 -0
- package/dist/testing/jest.mjs +17 -0
- package/dist/testing/jest.mjs.map +1 -0
- package/dist/testing/vitest.cjs +15 -0
- package/dist/testing/vitest.cjs.map +1 -0
- package/dist/testing/vitest.d.cts +10 -0
- package/dist/testing/vitest.d.ts +10 -0
- package/dist/testing/vitest.mjs +15 -0
- package/dist/testing/vitest.mjs.map +1 -0
- package/dist/types-DDAGLpov.d.ts +715 -0
- package/dist/types-DrpQSv_2.d.cts +715 -0
- package/dist/vite.cjs +1344 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.cts +434 -0
- package/dist/vite.d.ts +434 -0
- package/dist/vite.mjs +1314 -0
- package/dist/vite.mjs.map +1 -0
- package/package.json +268 -0
- package/schema/extension-v2.json +1500 -0
|
@@ -0,0 +1,1500 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://schema.tappify.ai/extension/v2.json",
|
|
4
|
+
"title": "Tappify extension manifest",
|
|
5
|
+
"description": "The tappify.extension.json file at the root of an extension repository.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "The URL of this JSON Schema. Editors read it for completion and inline validation."
|
|
11
|
+
},
|
|
12
|
+
"id": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"pattern": "^[a-z][a-z0-9-]{2,39}$",
|
|
15
|
+
"description": "The identifier for this extension, unique across the Tap Store and fixed after the first publish."
|
|
16
|
+
},
|
|
17
|
+
"name": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"minLength": 2,
|
|
20
|
+
"maxLength": 40,
|
|
21
|
+
"description": "The name owners see in the Tap Store and on every surface this extension renders."
|
|
22
|
+
},
|
|
23
|
+
"description": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"minLength": 10,
|
|
26
|
+
"maxLength": 200,
|
|
27
|
+
"description": "The one line owners read on the Tap Store card and on the install screen."
|
|
28
|
+
},
|
|
29
|
+
"icon": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"minLength": 1,
|
|
32
|
+
"maxLength": 200,
|
|
33
|
+
"description": "The icon file carried in the bundle, as a path relative to the manifest. Square png or svg, at most 512 KB."
|
|
34
|
+
},
|
|
35
|
+
"category": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"enum": [
|
|
38
|
+
"market_data",
|
|
39
|
+
"subscriptions",
|
|
40
|
+
"product_analytics",
|
|
41
|
+
"crashes",
|
|
42
|
+
"attribution",
|
|
43
|
+
"experiments",
|
|
44
|
+
"messaging",
|
|
45
|
+
"session_replay",
|
|
46
|
+
"localization",
|
|
47
|
+
"design",
|
|
48
|
+
"ci_cd",
|
|
49
|
+
"trackers",
|
|
50
|
+
"support",
|
|
51
|
+
"chat",
|
|
52
|
+
"ad_monetization",
|
|
53
|
+
"warehouse",
|
|
54
|
+
"compliance",
|
|
55
|
+
"additional_stores"
|
|
56
|
+
],
|
|
57
|
+
"description": "The Tap Store section owners browse and filter by."
|
|
58
|
+
},
|
|
59
|
+
"sdk": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"minLength": 1,
|
|
62
|
+
"maxLength": 60,
|
|
63
|
+
"description": "The SDK range this build targets, such as \"^2.0.0\". The host serves one major at a time and rejects a range that excludes it."
|
|
64
|
+
},
|
|
65
|
+
"visibility": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"enum": [
|
|
68
|
+
"public",
|
|
69
|
+
"unlisted",
|
|
70
|
+
"private"
|
|
71
|
+
],
|
|
72
|
+
"description": "Who can find and install this extension. \"public\" lists it in the Tap Store and needs all five listing fields; \"unlisted\" installs by link; \"private\" installs only in your own workspace."
|
|
73
|
+
},
|
|
74
|
+
"installScope": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"enum": [
|
|
77
|
+
"project",
|
|
78
|
+
"organization"
|
|
79
|
+
],
|
|
80
|
+
"description": "Whether one install belongs to a single project or to a whole organization. An organization install contributes no pages, tabs, widgets or series, because those render on a project."
|
|
81
|
+
},
|
|
82
|
+
"scopes": {
|
|
83
|
+
"minItems": 1,
|
|
84
|
+
"maxItems": 19,
|
|
85
|
+
"type": "array",
|
|
86
|
+
"items": {
|
|
87
|
+
"type": "object",
|
|
88
|
+
"properties": {
|
|
89
|
+
"key": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"enum": [
|
|
92
|
+
"ui:render",
|
|
93
|
+
"projects:read",
|
|
94
|
+
"analytics:read",
|
|
95
|
+
"store.metadata:read",
|
|
96
|
+
"reviews:read",
|
|
97
|
+
"crashes:read",
|
|
98
|
+
"revenue:read",
|
|
99
|
+
"metrics:write",
|
|
100
|
+
"alerts:write",
|
|
101
|
+
"insights:write",
|
|
102
|
+
"ai:tools",
|
|
103
|
+
"ai:actions",
|
|
104
|
+
"store.metadata:write",
|
|
105
|
+
"autopilot:trigger",
|
|
106
|
+
"work:create",
|
|
107
|
+
"work:sync",
|
|
108
|
+
"storage:write",
|
|
109
|
+
"messaging:send",
|
|
110
|
+
"ai:skills"
|
|
111
|
+
],
|
|
112
|
+
"description": "The scope key, from the scopes reference."
|
|
113
|
+
},
|
|
114
|
+
"justification": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"minLength": 20,
|
|
117
|
+
"maxLength": 500,
|
|
118
|
+
"description": "Why this extension asks for the scope, in your own words. Shown on the consent screen, and required for the scopes that ask for one."
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"required": [
|
|
122
|
+
"key"
|
|
123
|
+
],
|
|
124
|
+
"additionalProperties": false
|
|
125
|
+
},
|
|
126
|
+
"description": "The permissions an owner grants at install. Declare only what your contributions use."
|
|
127
|
+
},
|
|
128
|
+
"contributes": {
|
|
129
|
+
"type": "object",
|
|
130
|
+
"properties": {
|
|
131
|
+
"pages": {
|
|
132
|
+
"maxItems": 20,
|
|
133
|
+
"type": "array",
|
|
134
|
+
"items": {
|
|
135
|
+
"type": "object",
|
|
136
|
+
"properties": {
|
|
137
|
+
"id": {
|
|
138
|
+
"type": "string",
|
|
139
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
140
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
141
|
+
},
|
|
142
|
+
"title": {
|
|
143
|
+
"type": "string",
|
|
144
|
+
"minLength": 1,
|
|
145
|
+
"maxLength": 60,
|
|
146
|
+
"description": "The label owners read on this contribution."
|
|
147
|
+
},
|
|
148
|
+
"entry": {
|
|
149
|
+
"type": "string",
|
|
150
|
+
"minLength": 1,
|
|
151
|
+
"maxLength": 200,
|
|
152
|
+
"description": "The source file that renders this contribution, as a path relative to the manifest. It has to be present as an expose in the built bundle."
|
|
153
|
+
},
|
|
154
|
+
"nav": {
|
|
155
|
+
"type": "boolean",
|
|
156
|
+
"description": "Whether this page also gets an entry in the project navigation. The route `/projects/:projectId/ext/:extensionId/:pageId` exists either way."
|
|
157
|
+
},
|
|
158
|
+
"mobile": {
|
|
159
|
+
"type": "boolean",
|
|
160
|
+
"description": "Whether this surface is drawn on phone layouts. Defaults to true; set false to hide it there."
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"required": [
|
|
164
|
+
"id",
|
|
165
|
+
"title",
|
|
166
|
+
"entry"
|
|
167
|
+
],
|
|
168
|
+
"additionalProperties": false
|
|
169
|
+
},
|
|
170
|
+
"description": "Pages of this extension's own, each on its own route under the project. `nav: true` also puts one in the project navigation."
|
|
171
|
+
},
|
|
172
|
+
"tabs": {
|
|
173
|
+
"maxItems": 20,
|
|
174
|
+
"type": "array",
|
|
175
|
+
"items": {
|
|
176
|
+
"type": "object",
|
|
177
|
+
"properties": {
|
|
178
|
+
"id": {
|
|
179
|
+
"type": "string",
|
|
180
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
181
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
182
|
+
},
|
|
183
|
+
"title": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"minLength": 1,
|
|
186
|
+
"maxLength": 60,
|
|
187
|
+
"description": "The label owners read on this contribution."
|
|
188
|
+
},
|
|
189
|
+
"entry": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"minLength": 1,
|
|
192
|
+
"maxLength": 200,
|
|
193
|
+
"description": "The source file that renders this contribution, as a path relative to the manifest. It has to be present as an expose in the built bundle."
|
|
194
|
+
},
|
|
195
|
+
"page": {
|
|
196
|
+
"type": "string",
|
|
197
|
+
"enum": [
|
|
198
|
+
"overview",
|
|
199
|
+
"analytics",
|
|
200
|
+
"deployments",
|
|
201
|
+
"ai_chat"
|
|
202
|
+
],
|
|
203
|
+
"description": "The host page this tab sits on."
|
|
204
|
+
},
|
|
205
|
+
"mobile": {
|
|
206
|
+
"type": "boolean",
|
|
207
|
+
"description": "Whether this surface is drawn on phone layouts. Defaults to true; set false to hide it there."
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"required": [
|
|
211
|
+
"id",
|
|
212
|
+
"title",
|
|
213
|
+
"entry",
|
|
214
|
+
"page"
|
|
215
|
+
],
|
|
216
|
+
"additionalProperties": false
|
|
217
|
+
},
|
|
218
|
+
"description": "Tabs beside the host's own on a named host page."
|
|
219
|
+
},
|
|
220
|
+
"widgets": {
|
|
221
|
+
"maxItems": 20,
|
|
222
|
+
"type": "array",
|
|
223
|
+
"items": {
|
|
224
|
+
"type": "object",
|
|
225
|
+
"properties": {
|
|
226
|
+
"id": {
|
|
227
|
+
"type": "string",
|
|
228
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
229
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
230
|
+
},
|
|
231
|
+
"title": {
|
|
232
|
+
"type": "string",
|
|
233
|
+
"minLength": 1,
|
|
234
|
+
"maxLength": 60,
|
|
235
|
+
"description": "The label owners read on this contribution."
|
|
236
|
+
},
|
|
237
|
+
"entry": {
|
|
238
|
+
"type": "string",
|
|
239
|
+
"minLength": 1,
|
|
240
|
+
"maxLength": 200,
|
|
241
|
+
"description": "The source file that renders this contribution, as a path relative to the manifest. It has to be present as an expose in the built bundle."
|
|
242
|
+
},
|
|
243
|
+
"page": {
|
|
244
|
+
"type": "string",
|
|
245
|
+
"enum": [
|
|
246
|
+
"overview",
|
|
247
|
+
"analytics",
|
|
248
|
+
"deployments",
|
|
249
|
+
"ai_chat"
|
|
250
|
+
],
|
|
251
|
+
"description": "The host page this widget renders on."
|
|
252
|
+
},
|
|
253
|
+
"slot": {
|
|
254
|
+
"type": "string",
|
|
255
|
+
"enum": [
|
|
256
|
+
"kpi-row",
|
|
257
|
+
"insights",
|
|
258
|
+
"sidebar",
|
|
259
|
+
"below-chart",
|
|
260
|
+
"below-list"
|
|
261
|
+
],
|
|
262
|
+
"description": "The named anchor on that page. A slot that is not on the page fails validation."
|
|
263
|
+
},
|
|
264
|
+
"size": {
|
|
265
|
+
"type": "string",
|
|
266
|
+
"enum": [
|
|
267
|
+
"1x1",
|
|
268
|
+
"2x1",
|
|
269
|
+
"2x2"
|
|
270
|
+
],
|
|
271
|
+
"description": "The widget's footprint in the slot grid, as columns by rows. Every slot takes all three."
|
|
272
|
+
},
|
|
273
|
+
"expandable": {
|
|
274
|
+
"type": "boolean",
|
|
275
|
+
"description": "Whether owners can open the same component in the expand panel."
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"required": [
|
|
279
|
+
"id",
|
|
280
|
+
"title",
|
|
281
|
+
"entry",
|
|
282
|
+
"page",
|
|
283
|
+
"slot",
|
|
284
|
+
"size"
|
|
285
|
+
],
|
|
286
|
+
"additionalProperties": false
|
|
287
|
+
},
|
|
288
|
+
"description": "Cards drawn into a named slot on a host page."
|
|
289
|
+
},
|
|
290
|
+
"series": {
|
|
291
|
+
"maxItems": 20,
|
|
292
|
+
"type": "array",
|
|
293
|
+
"items": {
|
|
294
|
+
"type": "object",
|
|
295
|
+
"properties": {
|
|
296
|
+
"id": {
|
|
297
|
+
"type": "string",
|
|
298
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
299
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
300
|
+
},
|
|
301
|
+
"label": {
|
|
302
|
+
"type": "string",
|
|
303
|
+
"minLength": 1,
|
|
304
|
+
"maxLength": 60,
|
|
305
|
+
"description": "The label owners read on this contribution."
|
|
306
|
+
},
|
|
307
|
+
"chart": {
|
|
308
|
+
"type": "string",
|
|
309
|
+
"enum": [
|
|
310
|
+
"installs-activity",
|
|
311
|
+
"conversion",
|
|
312
|
+
"release-cadence"
|
|
313
|
+
],
|
|
314
|
+
"description": "The host chart this line is drawn on."
|
|
315
|
+
},
|
|
316
|
+
"metric": {
|
|
317
|
+
"type": "string",
|
|
318
|
+
"minLength": 1,
|
|
319
|
+
"maxLength": 60,
|
|
320
|
+
"description": "The connector metric this line plots. It has to be one the connector declares."
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"required": [
|
|
324
|
+
"id",
|
|
325
|
+
"label",
|
|
326
|
+
"chart",
|
|
327
|
+
"metric"
|
|
328
|
+
],
|
|
329
|
+
"additionalProperties": false
|
|
330
|
+
},
|
|
331
|
+
"description": "Lines drawn onto a host chart from a metric the connector writes. The host draws the line on the chart this names and puts the vendor in the chart legend; a stale metric is drawn dashed with the time of its last sync."
|
|
332
|
+
},
|
|
333
|
+
"banners": {
|
|
334
|
+
"maxItems": 20,
|
|
335
|
+
"type": "array",
|
|
336
|
+
"items": {
|
|
337
|
+
"type": "object",
|
|
338
|
+
"properties": {
|
|
339
|
+
"id": {
|
|
340
|
+
"type": "string",
|
|
341
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
342
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
343
|
+
},
|
|
344
|
+
"page": {
|
|
345
|
+
"type": "string",
|
|
346
|
+
"enum": [
|
|
347
|
+
"overview",
|
|
348
|
+
"analytics",
|
|
349
|
+
"deployments",
|
|
350
|
+
"ai_chat"
|
|
351
|
+
],
|
|
352
|
+
"description": "The host page this banner appears on."
|
|
353
|
+
},
|
|
354
|
+
"event": {
|
|
355
|
+
"type": "string",
|
|
356
|
+
"pattern": "^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$",
|
|
357
|
+
"description": "The event that raises it. Declare the same name under `contributes.webhooks` with `as: \"banner\"`."
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
"required": [
|
|
361
|
+
"id",
|
|
362
|
+
"page",
|
|
363
|
+
"event"
|
|
364
|
+
],
|
|
365
|
+
"additionalProperties": false
|
|
366
|
+
},
|
|
367
|
+
"description": "Banners raised on a host page by a webhook declared with as: \"banner\". The host draws one at the top of that page, carrying the `why` sentence from the delivery, until the owner dismisses it."
|
|
368
|
+
},
|
|
369
|
+
"rowActions": {
|
|
370
|
+
"maxItems": 20,
|
|
371
|
+
"type": "array",
|
|
372
|
+
"items": {
|
|
373
|
+
"type": "object",
|
|
374
|
+
"properties": {
|
|
375
|
+
"id": {
|
|
376
|
+
"type": "string",
|
|
377
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
378
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
379
|
+
},
|
|
380
|
+
"title": {
|
|
381
|
+
"type": "string",
|
|
382
|
+
"minLength": 1,
|
|
383
|
+
"maxLength": 60,
|
|
384
|
+
"description": "The label owners read on this contribution."
|
|
385
|
+
},
|
|
386
|
+
"table": {
|
|
387
|
+
"type": "string",
|
|
388
|
+
"enum": [
|
|
389
|
+
"analytics.keywords",
|
|
390
|
+
"analytics.reviews",
|
|
391
|
+
"deployments.releases",
|
|
392
|
+
"deployments.builds"
|
|
393
|
+
],
|
|
394
|
+
"description": "The host table whose row menu gains this entry."
|
|
395
|
+
},
|
|
396
|
+
"entry": {
|
|
397
|
+
"type": "string",
|
|
398
|
+
"minLength": 1,
|
|
399
|
+
"maxLength": 200,
|
|
400
|
+
"description": "The source file that renders this contribution, as a path relative to the manifest. It has to be present as an expose in the built bundle."
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
"required": [
|
|
404
|
+
"id",
|
|
405
|
+
"title",
|
|
406
|
+
"table",
|
|
407
|
+
"entry"
|
|
408
|
+
],
|
|
409
|
+
"additionalProperties": false
|
|
410
|
+
},
|
|
411
|
+
"description": "Actions offered on a row of a host table."
|
|
412
|
+
},
|
|
413
|
+
"markers": {
|
|
414
|
+
"maxItems": 20,
|
|
415
|
+
"type": "array",
|
|
416
|
+
"items": {
|
|
417
|
+
"type": "object",
|
|
418
|
+
"properties": {
|
|
419
|
+
"id": {
|
|
420
|
+
"type": "string",
|
|
421
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
422
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
423
|
+
},
|
|
424
|
+
"label": {
|
|
425
|
+
"type": "string",
|
|
426
|
+
"minLength": 1,
|
|
427
|
+
"maxLength": 60,
|
|
428
|
+
"description": "The label owners read on this contribution."
|
|
429
|
+
},
|
|
430
|
+
"chart": {
|
|
431
|
+
"anyOf": [
|
|
432
|
+
{
|
|
433
|
+
"type": "string",
|
|
434
|
+
"enum": [
|
|
435
|
+
"installs-activity",
|
|
436
|
+
"conversion",
|
|
437
|
+
"release-cadence"
|
|
438
|
+
]
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
"type": "string",
|
|
442
|
+
"const": "*"
|
|
443
|
+
}
|
|
444
|
+
],
|
|
445
|
+
"description": "The host chart this marker is drawn on, or `*` for every chart."
|
|
446
|
+
},
|
|
447
|
+
"event": {
|
|
448
|
+
"type": "string",
|
|
449
|
+
"pattern": "^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$",
|
|
450
|
+
"description": "The event that places it on the time axis. Declare the same name under `contributes.webhooks` with `as: \"event\"`."
|
|
451
|
+
},
|
|
452
|
+
"glyph": {
|
|
453
|
+
"type": "string",
|
|
454
|
+
"minLength": 1,
|
|
455
|
+
"maxLength": 2,
|
|
456
|
+
"description": "The one or two characters drawn at the marker."
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
"required": [
|
|
460
|
+
"id",
|
|
461
|
+
"label",
|
|
462
|
+
"chart",
|
|
463
|
+
"event",
|
|
464
|
+
"glyph"
|
|
465
|
+
],
|
|
466
|
+
"additionalProperties": false
|
|
467
|
+
},
|
|
468
|
+
"description": "Markers drawn on a host chart by a webhook declared with as: \"event\". Needs the `ui:render` and `alerts:write` scopes. The host draws the glyph on the chart time axis at the moment the delivery arrived, with the vendor named on hover."
|
|
469
|
+
},
|
|
470
|
+
"settings": {
|
|
471
|
+
"type": "object",
|
|
472
|
+
"properties": {
|
|
473
|
+
"entry": {
|
|
474
|
+
"type": "string",
|
|
475
|
+
"minLength": 1,
|
|
476
|
+
"maxLength": 200,
|
|
477
|
+
"description": "The source file that renders this contribution, as a path relative to the manifest. It has to be present as an expose in the built bundle."
|
|
478
|
+
},
|
|
479
|
+
"schema": {
|
|
480
|
+
"type": "object",
|
|
481
|
+
"propertyNames": {
|
|
482
|
+
"type": "string"
|
|
483
|
+
},
|
|
484
|
+
"additionalProperties": {},
|
|
485
|
+
"description": "The JSON Schema for the values owners fill in. It becomes `TapSettingsProps[\"values\"]` and the reserved `settings` singleton."
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
"required": [
|
|
489
|
+
"entry",
|
|
490
|
+
"schema"
|
|
491
|
+
],
|
|
492
|
+
"additionalProperties": false,
|
|
493
|
+
"description": "The settings panel owners open for this install."
|
|
494
|
+
},
|
|
495
|
+
"storage": {
|
|
496
|
+
"type": "object",
|
|
497
|
+
"propertyNames": {
|
|
498
|
+
"type": "string",
|
|
499
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
500
|
+
},
|
|
501
|
+
"additionalProperties": {
|
|
502
|
+
"type": "object",
|
|
503
|
+
"properties": {
|
|
504
|
+
"scope": {
|
|
505
|
+
"type": "string",
|
|
506
|
+
"enum": [
|
|
507
|
+
"user",
|
|
508
|
+
"install",
|
|
509
|
+
"organization"
|
|
510
|
+
],
|
|
511
|
+
"description": "Who the documents belong to: one `user`, the whole `install`, or the `organization`."
|
|
512
|
+
},
|
|
513
|
+
"singleton": {
|
|
514
|
+
"type": "boolean",
|
|
515
|
+
"description": "Whether the collection holds exactly one document rather than many."
|
|
516
|
+
},
|
|
517
|
+
"schema": {
|
|
518
|
+
"type": "object",
|
|
519
|
+
"propertyNames": {
|
|
520
|
+
"type": "string"
|
|
521
|
+
},
|
|
522
|
+
"additionalProperties": {},
|
|
523
|
+
"description": "The JSON Schema for one document in this collection."
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
"required": [
|
|
527
|
+
"scope",
|
|
528
|
+
"schema"
|
|
529
|
+
],
|
|
530
|
+
"additionalProperties": false
|
|
531
|
+
},
|
|
532
|
+
"description": "The hosted storage collections this extension reads and writes. At most 10, and the name \"settings\" is reserved. Needs the `storage:write` scope."
|
|
533
|
+
},
|
|
534
|
+
"connector": {
|
|
535
|
+
"type": "object",
|
|
536
|
+
"properties": {
|
|
537
|
+
"auth": {
|
|
538
|
+
"type": "object",
|
|
539
|
+
"properties": {
|
|
540
|
+
"method": {
|
|
541
|
+
"type": "string",
|
|
542
|
+
"enum": [
|
|
543
|
+
"none",
|
|
544
|
+
"api_key",
|
|
545
|
+
"oauth"
|
|
546
|
+
],
|
|
547
|
+
"description": "The credential flow owners go through at install."
|
|
548
|
+
},
|
|
549
|
+
"fields": {
|
|
550
|
+
"maxItems": 20,
|
|
551
|
+
"type": "array",
|
|
552
|
+
"items": {
|
|
553
|
+
"type": "object",
|
|
554
|
+
"properties": {
|
|
555
|
+
"name": {
|
|
556
|
+
"type": "string",
|
|
557
|
+
"pattern": "^[a-z][a-z0-9_]*$",
|
|
558
|
+
"description": "The key your server reads this value back as."
|
|
559
|
+
},
|
|
560
|
+
"label": {
|
|
561
|
+
"type": "string",
|
|
562
|
+
"minLength": 1,
|
|
563
|
+
"maxLength": 60,
|
|
564
|
+
"description": "The label owners read above the input."
|
|
565
|
+
},
|
|
566
|
+
"type": {
|
|
567
|
+
"type": "string",
|
|
568
|
+
"enum": [
|
|
569
|
+
"text",
|
|
570
|
+
"password",
|
|
571
|
+
"textarea",
|
|
572
|
+
"file",
|
|
573
|
+
"select"
|
|
574
|
+
],
|
|
575
|
+
"description": "How the input is drawn to the owner."
|
|
576
|
+
},
|
|
577
|
+
"required": {
|
|
578
|
+
"type": "boolean",
|
|
579
|
+
"description": "Whether owners have to fill it in before the install works."
|
|
580
|
+
},
|
|
581
|
+
"options": {
|
|
582
|
+
"type": "array",
|
|
583
|
+
"items": {
|
|
584
|
+
"type": "string"
|
|
585
|
+
},
|
|
586
|
+
"description": "The choices offered, for a `select` field."
|
|
587
|
+
},
|
|
588
|
+
"help": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"maxLength": 200,
|
|
591
|
+
"description": "The hint drawn under the input."
|
|
592
|
+
}
|
|
593
|
+
},
|
|
594
|
+
"required": [
|
|
595
|
+
"name",
|
|
596
|
+
"label",
|
|
597
|
+
"type",
|
|
598
|
+
"required"
|
|
599
|
+
],
|
|
600
|
+
"additionalProperties": false
|
|
601
|
+
},
|
|
602
|
+
"description": "The credentials owners enter. They reach your server as `credentials` on every call."
|
|
603
|
+
},
|
|
604
|
+
"oauth": {
|
|
605
|
+
"type": "object",
|
|
606
|
+
"properties": {
|
|
607
|
+
"authorizationUrl": {
|
|
608
|
+
"type": "string",
|
|
609
|
+
"format": "uri",
|
|
610
|
+
"pattern": "^https:\\/\\/.*",
|
|
611
|
+
"description": "Where owners are sent to approve access."
|
|
612
|
+
},
|
|
613
|
+
"tokenUrl": {
|
|
614
|
+
"type": "string",
|
|
615
|
+
"format": "uri",
|
|
616
|
+
"pattern": "^https:\\/\\/.*",
|
|
617
|
+
"description": "Where the authorization code is exchanged for a token."
|
|
618
|
+
},
|
|
619
|
+
"scopes": {
|
|
620
|
+
"type": "array",
|
|
621
|
+
"items": {
|
|
622
|
+
"type": "string"
|
|
623
|
+
},
|
|
624
|
+
"description": "The scopes asked of the outside service. These are that service's scopes, not Tappify's."
|
|
625
|
+
}
|
|
626
|
+
},
|
|
627
|
+
"required": [
|
|
628
|
+
"authorizationUrl",
|
|
629
|
+
"tokenUrl",
|
|
630
|
+
"scopes"
|
|
631
|
+
],
|
|
632
|
+
"additionalProperties": false,
|
|
633
|
+
"description": "The endpoints, for `method: \"oauth\"`."
|
|
634
|
+
}
|
|
635
|
+
},
|
|
636
|
+
"required": [
|
|
637
|
+
"method"
|
|
638
|
+
],
|
|
639
|
+
"additionalProperties": false,
|
|
640
|
+
"description": "How owners authenticate this connector."
|
|
641
|
+
},
|
|
642
|
+
"sync": {
|
|
643
|
+
"type": "string",
|
|
644
|
+
"enum": [
|
|
645
|
+
"5m",
|
|
646
|
+
"15m",
|
|
647
|
+
"1h",
|
|
648
|
+
"6h",
|
|
649
|
+
"24h"
|
|
650
|
+
],
|
|
651
|
+
"description": "How often Tappify asks your server to sync."
|
|
652
|
+
},
|
|
653
|
+
"metrics": {
|
|
654
|
+
"maxItems": 50,
|
|
655
|
+
"type": "array",
|
|
656
|
+
"items": {
|
|
657
|
+
"type": "object",
|
|
658
|
+
"properties": {
|
|
659
|
+
"key": {
|
|
660
|
+
"type": "string",
|
|
661
|
+
"pattern": "^[a-z][a-z0-9_]*$",
|
|
662
|
+
"description": "The metric key. A series names it to draw its line."
|
|
663
|
+
},
|
|
664
|
+
"label": {
|
|
665
|
+
"type": "string",
|
|
666
|
+
"minLength": 1,
|
|
667
|
+
"maxLength": 60,
|
|
668
|
+
"description": "The label owners read on the metric."
|
|
669
|
+
},
|
|
670
|
+
"unit": {
|
|
671
|
+
"type": "string",
|
|
672
|
+
"enum": [
|
|
673
|
+
"count",
|
|
674
|
+
"ratio",
|
|
675
|
+
"currency",
|
|
676
|
+
"seconds",
|
|
677
|
+
"bytes"
|
|
678
|
+
],
|
|
679
|
+
"description": "How the value is formatted."
|
|
680
|
+
},
|
|
681
|
+
"kind": {
|
|
682
|
+
"type": "string",
|
|
683
|
+
"enum": [
|
|
684
|
+
"gauge",
|
|
685
|
+
"counter"
|
|
686
|
+
],
|
|
687
|
+
"description": "Whether the value is a level at a point in time (`gauge`) or accumulates (`counter`)."
|
|
688
|
+
},
|
|
689
|
+
"dimensions": {
|
|
690
|
+
"maxItems": 10,
|
|
691
|
+
"type": "array",
|
|
692
|
+
"items": {
|
|
693
|
+
"type": "object",
|
|
694
|
+
"properties": {
|
|
695
|
+
"key": {
|
|
696
|
+
"type": "string",
|
|
697
|
+
"pattern": "^[a-z][a-z0-9_]*$",
|
|
698
|
+
"description": "The dimension key."
|
|
699
|
+
},
|
|
700
|
+
"label": {
|
|
701
|
+
"type": "string",
|
|
702
|
+
"minLength": 1,
|
|
703
|
+
"maxLength": 60,
|
|
704
|
+
"description": "The label owners read on the dimension."
|
|
705
|
+
}
|
|
706
|
+
},
|
|
707
|
+
"required": [
|
|
708
|
+
"key",
|
|
709
|
+
"label"
|
|
710
|
+
],
|
|
711
|
+
"additionalProperties": false
|
|
712
|
+
},
|
|
713
|
+
"description": "The breakdowns this metric can be split by."
|
|
714
|
+
},
|
|
715
|
+
"backfillDays": {
|
|
716
|
+
"type": "integer",
|
|
717
|
+
"minimum": 1,
|
|
718
|
+
"maximum": 90,
|
|
719
|
+
"description": "How many days of history to fetch on the first sync."
|
|
720
|
+
}
|
|
721
|
+
},
|
|
722
|
+
"required": [
|
|
723
|
+
"key",
|
|
724
|
+
"label",
|
|
725
|
+
"unit",
|
|
726
|
+
"kind"
|
|
727
|
+
],
|
|
728
|
+
"additionalProperties": false
|
|
729
|
+
},
|
|
730
|
+
"description": "The metrics this connector writes into the metrics store. Needs the `metrics:write` scope."
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
"additionalProperties": false,
|
|
734
|
+
"description": "How this extension authenticates against an outside service, how often it syncs, and the metrics it writes."
|
|
735
|
+
},
|
|
736
|
+
"webhooks": {
|
|
737
|
+
"maxItems": 20,
|
|
738
|
+
"type": "array",
|
|
739
|
+
"items": {
|
|
740
|
+
"type": "object",
|
|
741
|
+
"properties": {
|
|
742
|
+
"event": {
|
|
743
|
+
"type": "string",
|
|
744
|
+
"pattern": "^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$",
|
|
745
|
+
"description": "The event name your server posts, as `domain.thing`."
|
|
746
|
+
},
|
|
747
|
+
"as": {
|
|
748
|
+
"type": "string",
|
|
749
|
+
"enum": [
|
|
750
|
+
"alert",
|
|
751
|
+
"banner",
|
|
752
|
+
"event"
|
|
753
|
+
],
|
|
754
|
+
"description": "What Tappify turns it into: an inbox `alert`, a page `banner`, or an `event` a chart marker and `tap.data.subscribe` can read."
|
|
755
|
+
},
|
|
756
|
+
"payload": {
|
|
757
|
+
"type": "object",
|
|
758
|
+
"propertyNames": {
|
|
759
|
+
"type": "string"
|
|
760
|
+
},
|
|
761
|
+
"additionalProperties": {},
|
|
762
|
+
"description": "The JSON Schema for the body your server posts. An alert or a banner has to carry `why`."
|
|
763
|
+
}
|
|
764
|
+
},
|
|
765
|
+
"required": [
|
|
766
|
+
"event",
|
|
767
|
+
"as",
|
|
768
|
+
"payload"
|
|
769
|
+
],
|
|
770
|
+
"additionalProperties": false
|
|
771
|
+
},
|
|
772
|
+
"description": "The events this extension's server posts to Tappify, and what each one becomes. An `alert` or a `banner` needs the `alerts:write` scope."
|
|
773
|
+
},
|
|
774
|
+
"ai": {
|
|
775
|
+
"type": "object",
|
|
776
|
+
"properties": {
|
|
777
|
+
"tools": {
|
|
778
|
+
"maxItems": 15,
|
|
779
|
+
"type": "array",
|
|
780
|
+
"items": {
|
|
781
|
+
"type": "object",
|
|
782
|
+
"properties": {
|
|
783
|
+
"id": {
|
|
784
|
+
"type": "string",
|
|
785
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
786
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
787
|
+
},
|
|
788
|
+
"description": {
|
|
789
|
+
"type": "string",
|
|
790
|
+
"minLength": 10,
|
|
791
|
+
"maxLength": 500,
|
|
792
|
+
"description": "What this tool does, in the words the assistant reads when it decides whether to call it."
|
|
793
|
+
},
|
|
794
|
+
"input": {
|
|
795
|
+
"type": "object",
|
|
796
|
+
"propertyNames": {
|
|
797
|
+
"type": "string"
|
|
798
|
+
},
|
|
799
|
+
"additionalProperties": {},
|
|
800
|
+
"description": "The JSON Schema for the arguments the assistant passes. The assistant reads the `title` and `description` strings inside it, so they are scanned at publish and the whole schema is bounded at 16 KB."
|
|
801
|
+
},
|
|
802
|
+
"returns": {
|
|
803
|
+
"type": "string",
|
|
804
|
+
"enum": [
|
|
805
|
+
"comparison",
|
|
806
|
+
"table",
|
|
807
|
+
"series",
|
|
808
|
+
"list",
|
|
809
|
+
"value"
|
|
810
|
+
],
|
|
811
|
+
"description": "The card the host draws from the result."
|
|
812
|
+
},
|
|
813
|
+
"cost": {
|
|
814
|
+
"type": "string",
|
|
815
|
+
"enum": [
|
|
816
|
+
"low",
|
|
817
|
+
"medium",
|
|
818
|
+
"high"
|
|
819
|
+
],
|
|
820
|
+
"description": "Roughly what one call costs to serve, so the assistant can prefer a cheaper tool."
|
|
821
|
+
},
|
|
822
|
+
"cache": {
|
|
823
|
+
"type": "string",
|
|
824
|
+
"enum": [
|
|
825
|
+
"1m",
|
|
826
|
+
"5m",
|
|
827
|
+
"1h"
|
|
828
|
+
],
|
|
829
|
+
"description": "How long an identical call may be served from cache instead of reaching your server."
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
"required": [
|
|
833
|
+
"id",
|
|
834
|
+
"description",
|
|
835
|
+
"input",
|
|
836
|
+
"returns",
|
|
837
|
+
"cost"
|
|
838
|
+
],
|
|
839
|
+
"additionalProperties": false
|
|
840
|
+
},
|
|
841
|
+
"description": "The tools the assistant may call on your server. Needs the `ai:tools` scope."
|
|
842
|
+
},
|
|
843
|
+
"mentions": {
|
|
844
|
+
"maxItems": 10,
|
|
845
|
+
"type": "array",
|
|
846
|
+
"items": {
|
|
847
|
+
"type": "object",
|
|
848
|
+
"properties": {
|
|
849
|
+
"id": {
|
|
850
|
+
"type": "string",
|
|
851
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
852
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
853
|
+
},
|
|
854
|
+
"label": {
|
|
855
|
+
"type": "string",
|
|
856
|
+
"minLength": 1,
|
|
857
|
+
"maxLength": 60,
|
|
858
|
+
"description": "The label owners read on this contribution."
|
|
859
|
+
},
|
|
860
|
+
"list": {
|
|
861
|
+
"type": "string",
|
|
862
|
+
"minLength": 1,
|
|
863
|
+
"maxLength": 200,
|
|
864
|
+
"description": "The path that answers the picker with `{ items: [{ id, label }] }`. The host always calls `/tappify/mentions/<id>` under `server.baseUrl` — the route `createTappifyHandler` serves — so write that path here; it records the route, it does not choose it."
|
|
865
|
+
}
|
|
866
|
+
},
|
|
867
|
+
"required": [
|
|
868
|
+
"id",
|
|
869
|
+
"label",
|
|
870
|
+
"list"
|
|
871
|
+
],
|
|
872
|
+
"additionalProperties": false
|
|
873
|
+
},
|
|
874
|
+
"description": "The things owners can name with @ in chat, and where to list them. Needs the `ai:tools` scope."
|
|
875
|
+
},
|
|
876
|
+
"actions": {
|
|
877
|
+
"maxItems": 10,
|
|
878
|
+
"type": "array",
|
|
879
|
+
"items": {
|
|
880
|
+
"type": "object",
|
|
881
|
+
"properties": {
|
|
882
|
+
"id": {
|
|
883
|
+
"type": "string",
|
|
884
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
885
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
886
|
+
},
|
|
887
|
+
"description": {
|
|
888
|
+
"type": "string",
|
|
889
|
+
"minLength": 10,
|
|
890
|
+
"maxLength": 500,
|
|
891
|
+
"description": "What this action does, in the words the owner will read on the approval card."
|
|
892
|
+
},
|
|
893
|
+
"input": {
|
|
894
|
+
"type": "object",
|
|
895
|
+
"propertyNames": {
|
|
896
|
+
"type": "string"
|
|
897
|
+
},
|
|
898
|
+
"additionalProperties": {},
|
|
899
|
+
"description": "The JSON Schema for the arguments the assistant passes. The assistant reads the `title` and `description` strings inside it, so they are scanned at publish and the whole schema is bounded at 16 KB."
|
|
900
|
+
},
|
|
901
|
+
"approval": {
|
|
902
|
+
"type": "boolean",
|
|
903
|
+
"const": true,
|
|
904
|
+
"description": "Always true. An action goes through an owner approval; there is no way to opt out."
|
|
905
|
+
},
|
|
906
|
+
"reversible": {
|
|
907
|
+
"type": "boolean",
|
|
908
|
+
"description": "Whether the owner can undo it after it runs."
|
|
909
|
+
},
|
|
910
|
+
"scope": {
|
|
911
|
+
"type": "string",
|
|
912
|
+
"enum": [
|
|
913
|
+
"ui:render",
|
|
914
|
+
"projects:read",
|
|
915
|
+
"analytics:read",
|
|
916
|
+
"store.metadata:read",
|
|
917
|
+
"reviews:read",
|
|
918
|
+
"crashes:read",
|
|
919
|
+
"revenue:read",
|
|
920
|
+
"metrics:write",
|
|
921
|
+
"alerts:write",
|
|
922
|
+
"insights:write",
|
|
923
|
+
"ai:tools",
|
|
924
|
+
"ai:actions",
|
|
925
|
+
"store.metadata:write",
|
|
926
|
+
"autopilot:trigger",
|
|
927
|
+
"work:create",
|
|
928
|
+
"work:sync",
|
|
929
|
+
"storage:write",
|
|
930
|
+
"messaging:send",
|
|
931
|
+
"ai:skills"
|
|
932
|
+
],
|
|
933
|
+
"description": "The scope this action needs. Declare it under `scopes` as well."
|
|
934
|
+
},
|
|
935
|
+
"estimatesCost": {
|
|
936
|
+
"type": "boolean",
|
|
937
|
+
"description": "Whether the approval card will show what the action costs."
|
|
938
|
+
}
|
|
939
|
+
},
|
|
940
|
+
"required": [
|
|
941
|
+
"id",
|
|
942
|
+
"description",
|
|
943
|
+
"input",
|
|
944
|
+
"approval",
|
|
945
|
+
"reversible",
|
|
946
|
+
"scope"
|
|
947
|
+
],
|
|
948
|
+
"additionalProperties": false
|
|
949
|
+
},
|
|
950
|
+
"description": "The actions the assistant may run, each behind an owner approval. Needs the `ai:actions` scope, and each action's own scope. `tap.actions.run` creates the run and resolves with it; the host draws the approval card and calls your server only once the owner approves."
|
|
951
|
+
},
|
|
952
|
+
"knowledge": {
|
|
953
|
+
"maxItems": 20,
|
|
954
|
+
"type": "array",
|
|
955
|
+
"items": {
|
|
956
|
+
"type": "object",
|
|
957
|
+
"properties": {
|
|
958
|
+
"id": {
|
|
959
|
+
"type": "string",
|
|
960
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
961
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
962
|
+
},
|
|
963
|
+
"category": {
|
|
964
|
+
"type": "string",
|
|
965
|
+
"enum": [
|
|
966
|
+
"metric_definitions",
|
|
967
|
+
"gotchas",
|
|
968
|
+
"setup"
|
|
969
|
+
],
|
|
970
|
+
"description": "What kind of knowledge the file carries."
|
|
971
|
+
},
|
|
972
|
+
"file": {
|
|
973
|
+
"type": "string",
|
|
974
|
+
"minLength": 1,
|
|
975
|
+
"maxLength": 200,
|
|
976
|
+
"description": "The markdown file in the bundle, as a path relative to the manifest."
|
|
977
|
+
}
|
|
978
|
+
},
|
|
979
|
+
"required": [
|
|
980
|
+
"id",
|
|
981
|
+
"category",
|
|
982
|
+
"file"
|
|
983
|
+
],
|
|
984
|
+
"additionalProperties": false
|
|
985
|
+
},
|
|
986
|
+
"description": "Markdown the assistant indexes and cites when it answers about this extension."
|
|
987
|
+
},
|
|
988
|
+
"skills": {
|
|
989
|
+
"maxItems": 5,
|
|
990
|
+
"type": "array",
|
|
991
|
+
"items": {
|
|
992
|
+
"type": "object",
|
|
993
|
+
"properties": {
|
|
994
|
+
"id": {
|
|
995
|
+
"type": "string",
|
|
996
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
997
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
998
|
+
},
|
|
999
|
+
"name": {
|
|
1000
|
+
"type": "string",
|
|
1001
|
+
"minLength": 1,
|
|
1002
|
+
"maxLength": 60,
|
|
1003
|
+
"description": "The skill name the assistant matches on."
|
|
1004
|
+
},
|
|
1005
|
+
"description": {
|
|
1006
|
+
"type": "string",
|
|
1007
|
+
"minLength": 10,
|
|
1008
|
+
"maxLength": 300,
|
|
1009
|
+
"description": "When the assistant should reach for this skill."
|
|
1010
|
+
},
|
|
1011
|
+
"file": {
|
|
1012
|
+
"type": "string",
|
|
1013
|
+
"minLength": 1,
|
|
1014
|
+
"maxLength": 200,
|
|
1015
|
+
"description": "The markdown file in the bundle, as a path relative to the manifest."
|
|
1016
|
+
},
|
|
1017
|
+
"tools": {
|
|
1018
|
+
"maxItems": 15,
|
|
1019
|
+
"type": "array",
|
|
1020
|
+
"items": {
|
|
1021
|
+
"type": "string"
|
|
1022
|
+
},
|
|
1023
|
+
"description": "The tool ids this skill is allowed to use."
|
|
1024
|
+
}
|
|
1025
|
+
},
|
|
1026
|
+
"required": [
|
|
1027
|
+
"id",
|
|
1028
|
+
"name",
|
|
1029
|
+
"description",
|
|
1030
|
+
"file"
|
|
1031
|
+
],
|
|
1032
|
+
"additionalProperties": false
|
|
1033
|
+
},
|
|
1034
|
+
"description": "Markdown procedures that shape how the assistant works. Needs the `ai:skills` scope."
|
|
1035
|
+
},
|
|
1036
|
+
"prompts": {
|
|
1037
|
+
"maxItems": 20,
|
|
1038
|
+
"type": "array",
|
|
1039
|
+
"items": {
|
|
1040
|
+
"type": "object",
|
|
1041
|
+
"properties": {
|
|
1042
|
+
"id": {
|
|
1043
|
+
"type": "string",
|
|
1044
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
1045
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
1046
|
+
},
|
|
1047
|
+
"title": {
|
|
1048
|
+
"type": "string",
|
|
1049
|
+
"minLength": 1,
|
|
1050
|
+
"maxLength": 60,
|
|
1051
|
+
"description": "The label owners read on this contribution."
|
|
1052
|
+
},
|
|
1053
|
+
"template": {
|
|
1054
|
+
"type": "string",
|
|
1055
|
+
"minLength": 1,
|
|
1056
|
+
"maxLength": 2000,
|
|
1057
|
+
"description": "The prompt text, with `{{project.*}}`, `{{context.*}}` and `{{input.*}}` placeholders. The owner sees it resolved before it is sent."
|
|
1058
|
+
},
|
|
1059
|
+
"surfaces": {
|
|
1060
|
+
"minItems": 1,
|
|
1061
|
+
"type": "array",
|
|
1062
|
+
"items": {
|
|
1063
|
+
"type": "string",
|
|
1064
|
+
"enum": [
|
|
1065
|
+
"chat_suggestion",
|
|
1066
|
+
"widget",
|
|
1067
|
+
"page",
|
|
1068
|
+
"result_card"
|
|
1069
|
+
]
|
|
1070
|
+
},
|
|
1071
|
+
"description": "Where the host draws this prompt as a chip."
|
|
1072
|
+
},
|
|
1073
|
+
"after": {
|
|
1074
|
+
"maxItems": 15,
|
|
1075
|
+
"type": "array",
|
|
1076
|
+
"items": {
|
|
1077
|
+
"type": "string"
|
|
1078
|
+
},
|
|
1079
|
+
"description": "The tool ids whose results this prompt follows up on. They have to be this extension's own."
|
|
1080
|
+
},
|
|
1081
|
+
"input": {
|
|
1082
|
+
"type": "object",
|
|
1083
|
+
"propertyNames": {
|
|
1084
|
+
"type": "string"
|
|
1085
|
+
},
|
|
1086
|
+
"additionalProperties": {},
|
|
1087
|
+
"description": "The JSON Schema for a short form the owner fills in before the prompt is sent."
|
|
1088
|
+
}
|
|
1089
|
+
},
|
|
1090
|
+
"required": [
|
|
1091
|
+
"id",
|
|
1092
|
+
"title",
|
|
1093
|
+
"template",
|
|
1094
|
+
"surfaces"
|
|
1095
|
+
],
|
|
1096
|
+
"additionalProperties": false
|
|
1097
|
+
},
|
|
1098
|
+
"description": "Prompt templates the host offers owners as chips. Needs the `ai:skills` scope."
|
|
1099
|
+
},
|
|
1100
|
+
"context": {
|
|
1101
|
+
"maxItems": 3,
|
|
1102
|
+
"type": "array",
|
|
1103
|
+
"items": {
|
|
1104
|
+
"type": "object",
|
|
1105
|
+
"properties": {
|
|
1106
|
+
"id": {
|
|
1107
|
+
"type": "string",
|
|
1108
|
+
"pattern": "^[a-z][a-z0-9-]{1,39}$",
|
|
1109
|
+
"description": "The id for this contribution, and the handle the host and your generated types refer to it by."
|
|
1110
|
+
},
|
|
1111
|
+
"description": {
|
|
1112
|
+
"type": "string",
|
|
1113
|
+
"minLength": 10,
|
|
1114
|
+
"maxLength": 300,
|
|
1115
|
+
"description": "What context this provider adds to the turn."
|
|
1116
|
+
},
|
|
1117
|
+
"when": {
|
|
1118
|
+
"minItems": 1,
|
|
1119
|
+
"type": "array",
|
|
1120
|
+
"items": {
|
|
1121
|
+
"type": "string",
|
|
1122
|
+
"enum": [
|
|
1123
|
+
"turn_start",
|
|
1124
|
+
"mention"
|
|
1125
|
+
]
|
|
1126
|
+
},
|
|
1127
|
+
"description": "When the host calls your server for it."
|
|
1128
|
+
},
|
|
1129
|
+
"cache": {
|
|
1130
|
+
"type": "string",
|
|
1131
|
+
"enum": [
|
|
1132
|
+
"1m",
|
|
1133
|
+
"5m",
|
|
1134
|
+
"1h"
|
|
1135
|
+
],
|
|
1136
|
+
"description": "How long the context may be reused before refetching."
|
|
1137
|
+
}
|
|
1138
|
+
},
|
|
1139
|
+
"required": [
|
|
1140
|
+
"id",
|
|
1141
|
+
"description",
|
|
1142
|
+
"when"
|
|
1143
|
+
],
|
|
1144
|
+
"additionalProperties": false
|
|
1145
|
+
},
|
|
1146
|
+
"description": "Providers the host calls to put your data in front of the assistant. Needs the `ai:skills` scope."
|
|
1147
|
+
}
|
|
1148
|
+
},
|
|
1149
|
+
"additionalProperties": false,
|
|
1150
|
+
"description": "What this extension offers the assistant: tools, mentions, actions, knowledge, skills, prompts and context providers."
|
|
1151
|
+
},
|
|
1152
|
+
"work": {
|
|
1153
|
+
"type": "object",
|
|
1154
|
+
"properties": {
|
|
1155
|
+
"kind": {
|
|
1156
|
+
"type": "string",
|
|
1157
|
+
"enum": [
|
|
1158
|
+
"tracker",
|
|
1159
|
+
"docs",
|
|
1160
|
+
"chat"
|
|
1161
|
+
],
|
|
1162
|
+
"description": "What kind of destination this is."
|
|
1163
|
+
},
|
|
1164
|
+
"container": {
|
|
1165
|
+
"type": "object",
|
|
1166
|
+
"properties": {
|
|
1167
|
+
"label": {
|
|
1168
|
+
"type": "string",
|
|
1169
|
+
"minLength": 1,
|
|
1170
|
+
"maxLength": 60,
|
|
1171
|
+
"description": "What you call a container, such as \"Project\", \"Space\" or \"Channel\". Owners read it when they pick one."
|
|
1172
|
+
},
|
|
1173
|
+
"list": {
|
|
1174
|
+
"type": "string",
|
|
1175
|
+
"minLength": 1,
|
|
1176
|
+
"description": "The path under `server.baseUrl` that lists the containers an owner can choose from."
|
|
1177
|
+
}
|
|
1178
|
+
},
|
|
1179
|
+
"required": [
|
|
1180
|
+
"label",
|
|
1181
|
+
"list"
|
|
1182
|
+
],
|
|
1183
|
+
"additionalProperties": false,
|
|
1184
|
+
"description": "Where items land, and how owners pick one."
|
|
1185
|
+
},
|
|
1186
|
+
"creates": {
|
|
1187
|
+
"minItems": 1,
|
|
1188
|
+
"type": "array",
|
|
1189
|
+
"items": {
|
|
1190
|
+
"type": "string",
|
|
1191
|
+
"enum": [
|
|
1192
|
+
"issue",
|
|
1193
|
+
"page",
|
|
1194
|
+
"message"
|
|
1195
|
+
]
|
|
1196
|
+
},
|
|
1197
|
+
"description": "What this destination can create."
|
|
1198
|
+
},
|
|
1199
|
+
"fields": {
|
|
1200
|
+
"type": "object",
|
|
1201
|
+
"properties": {
|
|
1202
|
+
"priority": {
|
|
1203
|
+
"type": "array",
|
|
1204
|
+
"items": {
|
|
1205
|
+
"type": "string"
|
|
1206
|
+
},
|
|
1207
|
+
"description": "Your own priority names, highest first."
|
|
1208
|
+
},
|
|
1209
|
+
"labels": {
|
|
1210
|
+
"type": "boolean",
|
|
1211
|
+
"description": "Whether items carry labels."
|
|
1212
|
+
},
|
|
1213
|
+
"assignee": {
|
|
1214
|
+
"type": "boolean",
|
|
1215
|
+
"description": "Whether items carry an assignee."
|
|
1216
|
+
},
|
|
1217
|
+
"required": {
|
|
1218
|
+
"type": "array",
|
|
1219
|
+
"items": {
|
|
1220
|
+
"type": "string"
|
|
1221
|
+
},
|
|
1222
|
+
"description": "The fields an owner has to fill in before you can create."
|
|
1223
|
+
}
|
|
1224
|
+
},
|
|
1225
|
+
"required": [
|
|
1226
|
+
"required"
|
|
1227
|
+
],
|
|
1228
|
+
"additionalProperties": false,
|
|
1229
|
+
"description": "What a created item carries."
|
|
1230
|
+
},
|
|
1231
|
+
"attachments": {
|
|
1232
|
+
"type": "array",
|
|
1233
|
+
"items": {
|
|
1234
|
+
"type": "string",
|
|
1235
|
+
"enum": [
|
|
1236
|
+
"image",
|
|
1237
|
+
"link"
|
|
1238
|
+
]
|
|
1239
|
+
},
|
|
1240
|
+
"description": "What can be attached to a created item."
|
|
1241
|
+
},
|
|
1242
|
+
"comments": {
|
|
1243
|
+
"type": "string",
|
|
1244
|
+
"enum": [
|
|
1245
|
+
"two-way",
|
|
1246
|
+
"none"
|
|
1247
|
+
],
|
|
1248
|
+
"description": "Whether comments sync back and forth or not at all."
|
|
1249
|
+
},
|
|
1250
|
+
"status": {
|
|
1251
|
+
"type": "object",
|
|
1252
|
+
"properties": {
|
|
1253
|
+
"webhook": {
|
|
1254
|
+
"type": "string",
|
|
1255
|
+
"pattern": "^[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*$",
|
|
1256
|
+
"description": "The event your server posts when an item changes status."
|
|
1257
|
+
},
|
|
1258
|
+
"map": {
|
|
1259
|
+
"type": "object",
|
|
1260
|
+
"properties": {
|
|
1261
|
+
"open": {
|
|
1262
|
+
"type": "array",
|
|
1263
|
+
"items": {
|
|
1264
|
+
"type": "string"
|
|
1265
|
+
},
|
|
1266
|
+
"description": "Your own status names that mean not started."
|
|
1267
|
+
},
|
|
1268
|
+
"in_progress": {
|
|
1269
|
+
"type": "array",
|
|
1270
|
+
"items": {
|
|
1271
|
+
"type": "string"
|
|
1272
|
+
},
|
|
1273
|
+
"description": "Your own status names that mean under way."
|
|
1274
|
+
},
|
|
1275
|
+
"done": {
|
|
1276
|
+
"type": "array",
|
|
1277
|
+
"items": {
|
|
1278
|
+
"type": "string"
|
|
1279
|
+
},
|
|
1280
|
+
"description": "Your own status names that mean finished."
|
|
1281
|
+
}
|
|
1282
|
+
},
|
|
1283
|
+
"required": [
|
|
1284
|
+
"open",
|
|
1285
|
+
"in_progress",
|
|
1286
|
+
"done"
|
|
1287
|
+
],
|
|
1288
|
+
"additionalProperties": false,
|
|
1289
|
+
"description": "Your status names, grouped into the three stages Tappify draws."
|
|
1290
|
+
}
|
|
1291
|
+
},
|
|
1292
|
+
"required": [
|
|
1293
|
+
"webhook",
|
|
1294
|
+
"map"
|
|
1295
|
+
],
|
|
1296
|
+
"additionalProperties": false,
|
|
1297
|
+
"description": "How status travels back from your system."
|
|
1298
|
+
},
|
|
1299
|
+
"identity": {
|
|
1300
|
+
"type": "string",
|
|
1301
|
+
"enum": [
|
|
1302
|
+
"user",
|
|
1303
|
+
"install"
|
|
1304
|
+
],
|
|
1305
|
+
"description": "Whether items are created as the owner who asked (`user`) or as the install itself."
|
|
1306
|
+
}
|
|
1307
|
+
},
|
|
1308
|
+
"required": [
|
|
1309
|
+
"kind",
|
|
1310
|
+
"container",
|
|
1311
|
+
"creates",
|
|
1312
|
+
"fields",
|
|
1313
|
+
"attachments",
|
|
1314
|
+
"comments",
|
|
1315
|
+
"identity"
|
|
1316
|
+
],
|
|
1317
|
+
"additionalProperties": false,
|
|
1318
|
+
"description": "The work destination this extension creates issues, pages or messages in. Needs the `work:create` and `work:sync` scopes."
|
|
1319
|
+
}
|
|
1320
|
+
},
|
|
1321
|
+
"additionalProperties": false,
|
|
1322
|
+
"description": "What this extension adds to the host. At most 20 UI contributions in total, and a page, tab, widget, row action, marker or settings panel needs the `ui:render` scope."
|
|
1323
|
+
},
|
|
1324
|
+
"server": {
|
|
1325
|
+
"type": "object",
|
|
1326
|
+
"properties": {
|
|
1327
|
+
"baseUrl": {
|
|
1328
|
+
"type": "string",
|
|
1329
|
+
"format": "uri",
|
|
1330
|
+
"pattern": "^https:\\/\\/.*",
|
|
1331
|
+
"description": "Where the host calls your server. `<baseUrl>/tappify/health` answers 200 within three seconds at publish."
|
|
1332
|
+
},
|
|
1333
|
+
"sandboxBaseUrl": {
|
|
1334
|
+
"type": "string",
|
|
1335
|
+
"format": "uri",
|
|
1336
|
+
"pattern": "^https:\\/\\/.*",
|
|
1337
|
+
"description": "Where dev installs and sandbox projects call instead. Defaults to `baseUrl`."
|
|
1338
|
+
},
|
|
1339
|
+
"procedures": {
|
|
1340
|
+
"type": "object",
|
|
1341
|
+
"propertyNames": {
|
|
1342
|
+
"type": "string",
|
|
1343
|
+
"pattern": "^[a-zA-Z][a-zA-Z0-9_-]{1,59}$"
|
|
1344
|
+
},
|
|
1345
|
+
"additionalProperties": {
|
|
1346
|
+
"type": "object",
|
|
1347
|
+
"properties": {
|
|
1348
|
+
"input": {
|
|
1349
|
+
"type": "object",
|
|
1350
|
+
"propertyNames": {
|
|
1351
|
+
"type": "string"
|
|
1352
|
+
},
|
|
1353
|
+
"additionalProperties": {},
|
|
1354
|
+
"description": "The JSON Schema for the argument your handler receives. The host validates against it before calling."
|
|
1355
|
+
},
|
|
1356
|
+
"output": {
|
|
1357
|
+
"type": "object",
|
|
1358
|
+
"propertyNames": {
|
|
1359
|
+
"type": "string"
|
|
1360
|
+
},
|
|
1361
|
+
"additionalProperties": {},
|
|
1362
|
+
"description": "The JSON Schema for what your handler returns."
|
|
1363
|
+
},
|
|
1364
|
+
"cache": {
|
|
1365
|
+
"type": "string",
|
|
1366
|
+
"enum": [
|
|
1367
|
+
"1m",
|
|
1368
|
+
"5m",
|
|
1369
|
+
"1h"
|
|
1370
|
+
],
|
|
1371
|
+
"description": "How long an identical call may be served from cache instead of reaching your server."
|
|
1372
|
+
},
|
|
1373
|
+
"kind": {
|
|
1374
|
+
"type": "string",
|
|
1375
|
+
"enum": [
|
|
1376
|
+
"read",
|
|
1377
|
+
"write"
|
|
1378
|
+
],
|
|
1379
|
+
"description": "Whether this procedure only reads or also changes something."
|
|
1380
|
+
}
|
|
1381
|
+
},
|
|
1382
|
+
"required": [
|
|
1383
|
+
"input",
|
|
1384
|
+
"output"
|
|
1385
|
+
],
|
|
1386
|
+
"additionalProperties": false
|
|
1387
|
+
},
|
|
1388
|
+
"description": "The procedures the host may call on your server, by name, each with its input and output schema. At most 30."
|
|
1389
|
+
},
|
|
1390
|
+
"events": {
|
|
1391
|
+
"type": "array",
|
|
1392
|
+
"items": {
|
|
1393
|
+
"type": "string",
|
|
1394
|
+
"enum": [
|
|
1395
|
+
"release.shipped",
|
|
1396
|
+
"metadata.changed",
|
|
1397
|
+
"keyword.set_changed",
|
|
1398
|
+
"screenshots.updated",
|
|
1399
|
+
"price.changed",
|
|
1400
|
+
"featuring.started",
|
|
1401
|
+
"score.changed",
|
|
1402
|
+
"incident.opened",
|
|
1403
|
+
"incident.resolved",
|
|
1404
|
+
"playbook.step_approved",
|
|
1405
|
+
"review.thread_opened",
|
|
1406
|
+
"review.thread_resolved",
|
|
1407
|
+
"approval.requested",
|
|
1408
|
+
"digest.sent",
|
|
1409
|
+
"install.created",
|
|
1410
|
+
"install.paused",
|
|
1411
|
+
"install.resumed",
|
|
1412
|
+
"install.revoked",
|
|
1413
|
+
"install.token_rotated",
|
|
1414
|
+
"scopes.changed",
|
|
1415
|
+
"settings.changed"
|
|
1416
|
+
]
|
|
1417
|
+
},
|
|
1418
|
+
"description": "The Tappify events your server subscribes to. Each is delivered to `POST /tappify/events` as it happens, with the same body every host-to-vendor call carries."
|
|
1419
|
+
}
|
|
1420
|
+
},
|
|
1421
|
+
"required": [
|
|
1422
|
+
"baseUrl"
|
|
1423
|
+
],
|
|
1424
|
+
"additionalProperties": false,
|
|
1425
|
+
"description": "Your own server: where the host calls it, and what it answers. Required once you declare a connector, a webhook, an assistant contribution, a work destination or a procedure."
|
|
1426
|
+
},
|
|
1427
|
+
"telemetry": {
|
|
1428
|
+
"maxItems": 20,
|
|
1429
|
+
"type": "array",
|
|
1430
|
+
"items": {
|
|
1431
|
+
"type": "string",
|
|
1432
|
+
"maxLength": 60,
|
|
1433
|
+
"pattern": "^[a-z][a-z0-9_]*$"
|
|
1434
|
+
},
|
|
1435
|
+
"description": "The telemetry names this extension may report. `tap.telemetry.event` rejects a name that is not declared here."
|
|
1436
|
+
},
|
|
1437
|
+
"listing": {
|
|
1438
|
+
"type": "object",
|
|
1439
|
+
"properties": {
|
|
1440
|
+
"longDescription": {
|
|
1441
|
+
"type": "string",
|
|
1442
|
+
"minLength": 1,
|
|
1443
|
+
"maxLength": 5000,
|
|
1444
|
+
"description": "The body of your listing page, in markdown."
|
|
1445
|
+
},
|
|
1446
|
+
"screenshots": {
|
|
1447
|
+
"minItems": 1,
|
|
1448
|
+
"maxItems": 6,
|
|
1449
|
+
"type": "array",
|
|
1450
|
+
"items": {
|
|
1451
|
+
"type": "string",
|
|
1452
|
+
"minLength": 1
|
|
1453
|
+
},
|
|
1454
|
+
"description": "Screenshot files carried in the bundle, as paths relative to the manifest. png at 1600 by 1000."
|
|
1455
|
+
},
|
|
1456
|
+
"website": {
|
|
1457
|
+
"type": "string",
|
|
1458
|
+
"format": "uri",
|
|
1459
|
+
"pattern": "^https:\\/\\/.*",
|
|
1460
|
+
"description": "Where owners go to learn more about this extension."
|
|
1461
|
+
},
|
|
1462
|
+
"supportUrl": {
|
|
1463
|
+
"type": "string",
|
|
1464
|
+
"format": "uri",
|
|
1465
|
+
"pattern": "^https:\\/\\/.*",
|
|
1466
|
+
"description": "Where owners go when something breaks."
|
|
1467
|
+
},
|
|
1468
|
+
"privacyUrl": {
|
|
1469
|
+
"type": "string",
|
|
1470
|
+
"format": "uri",
|
|
1471
|
+
"pattern": "^https:\\/\\/.*",
|
|
1472
|
+
"description": "Your privacy policy, linked from the consent screen before anyone installs."
|
|
1473
|
+
}
|
|
1474
|
+
},
|
|
1475
|
+
"additionalProperties": false,
|
|
1476
|
+
"description": "What owners read on your Tap Store listing page. A public extension needs all five fields."
|
|
1477
|
+
},
|
|
1478
|
+
"pricing": {
|
|
1479
|
+
"not": {},
|
|
1480
|
+
"description": "Reserved. Tappify sets pricing outside the manifest, so a manifest that carries this field fails validation."
|
|
1481
|
+
},
|
|
1482
|
+
"score": {
|
|
1483
|
+
"not": {},
|
|
1484
|
+
"description": "Reserved. Tappify computes the quality score, so a manifest that carries this field fails validation."
|
|
1485
|
+
}
|
|
1486
|
+
},
|
|
1487
|
+
"required": [
|
|
1488
|
+
"id",
|
|
1489
|
+
"name",
|
|
1490
|
+
"description",
|
|
1491
|
+
"icon",
|
|
1492
|
+
"category",
|
|
1493
|
+
"sdk",
|
|
1494
|
+
"visibility",
|
|
1495
|
+
"installScope",
|
|
1496
|
+
"scopes",
|
|
1497
|
+
"contributes"
|
|
1498
|
+
],
|
|
1499
|
+
"additionalProperties": false
|
|
1500
|
+
}
|