@shuffl/api-contracts 0.1.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/README.md +19 -0
- package/dist/base.d.ts +77 -0
- package/dist/base.js +92 -0
- package/dist/index.d.ts +14018 -0
- package/dist/index.js +329 -0
- package/dist/management-operations.d.ts +1 -0
- package/dist/management-operations.js +973 -0
- package/dist/management.generated.d.ts +11915 -0
- package/dist/management.generated.js +10400 -0
- package/dist/permissions.d.ts +548 -0
- package/dist/permissions.js +115 -0
- package/dist/schemas.d.ts +219 -0
- package/dist/schemas.js +143 -0
- package/openapi.json +148813 -0
- package/package.json +44 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { base } from './base.js';
|
|
3
|
+
import { commandReceiptSchema, managementContract, } from './management.generated.js';
|
|
4
|
+
import { permissionDefinitionSchema, permissionSchema } from './permissions.js';
|
|
5
|
+
import { fineTuneSchema, keepApartSchema, profileSchema, programInput, programPatch, } from './schemas.js';
|
|
6
|
+
export { adminScopes, scopeSchema, scopes } from './base.js';
|
|
7
|
+
export { alwaysAllowedPermissions, grantedPermissions, permissionById, permissionCatalog, permissionDefinitionSchema, permissionIds, permissionSchema, permitsOperation, protocolPermissionIds, scopesForPermissions, } from './permissions.js';
|
|
8
|
+
const id = z.string().min(1).max(128);
|
|
9
|
+
const identifier = z.object({ id });
|
|
10
|
+
export const citationSchema = z.object({
|
|
11
|
+
href: z.string(),
|
|
12
|
+
kind: z.enum(['knowledge', 'manager', 'directory']).optional(),
|
|
13
|
+
passageId: z.string(),
|
|
14
|
+
quote: z.string(),
|
|
15
|
+
sourceId: z.string(),
|
|
16
|
+
title: z.string(),
|
|
17
|
+
versionId: z.string(),
|
|
18
|
+
});
|
|
19
|
+
const pagination = z.object({
|
|
20
|
+
cursor: id.optional(),
|
|
21
|
+
limit: z.number().int().min(1).max(100).default(25),
|
|
22
|
+
});
|
|
23
|
+
export const userSchema = z.object({
|
|
24
|
+
active: z.boolean(),
|
|
25
|
+
bot: z.boolean(),
|
|
26
|
+
email: z.string().nullable(),
|
|
27
|
+
id,
|
|
28
|
+
name: z.string(),
|
|
29
|
+
profile: profileSchema,
|
|
30
|
+
});
|
|
31
|
+
export const programSchema = programInput.extend({
|
|
32
|
+
createdAt: z.iso.datetime(),
|
|
33
|
+
id,
|
|
34
|
+
matchingReviewRequired: z.boolean(),
|
|
35
|
+
nextRunAt: z.iso.datetime(),
|
|
36
|
+
revision: z.number().int().positive(),
|
|
37
|
+
status: z.enum(['active', 'paused', 'archived']),
|
|
38
|
+
summary: z
|
|
39
|
+
.string()
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('What the program does, in the same sentence the editor shows.'),
|
|
42
|
+
workspaceId: id,
|
|
43
|
+
});
|
|
44
|
+
const choice = (value) => z.object({ description: z.string().optional(), label: z.string(), value });
|
|
45
|
+
export const programOptionsSchema = z.object({
|
|
46
|
+
defaults: z.object({
|
|
47
|
+
fineTune: fineTuneSchema,
|
|
48
|
+
keepApart: keepApartSchema,
|
|
49
|
+
strategy: z.literal('new-connections'),
|
|
50
|
+
}),
|
|
51
|
+
fineTune: z.object({
|
|
52
|
+
commonGround: z.array(choice(z.number().int())),
|
|
53
|
+
meetRequests: z.string(),
|
|
54
|
+
mentionCommonGround: z.string(),
|
|
55
|
+
reach: z.array(choice(z.string())),
|
|
56
|
+
}),
|
|
57
|
+
keepApart: z.array(choice(z.string())),
|
|
58
|
+
purposes: z.array(choice(z.string())),
|
|
59
|
+
units: z.array(z.object({ id, kind: z.enum(['department', 'team']), name: z.string() })),
|
|
60
|
+
});
|
|
61
|
+
export const previewSchema = z.object({
|
|
62
|
+
algorithm: z.string(),
|
|
63
|
+
eligible: z.number(),
|
|
64
|
+
exclusions: z.array(z.object({
|
|
65
|
+
count: z.number().int().nonnegative(),
|
|
66
|
+
reason: z.enum([
|
|
67
|
+
'bot',
|
|
68
|
+
'inactive',
|
|
69
|
+
'absent',
|
|
70
|
+
'paused',
|
|
71
|
+
'slack_unavailable',
|
|
72
|
+
'access_unavailable',
|
|
73
|
+
]),
|
|
74
|
+
})),
|
|
75
|
+
fingerprint: z.string(),
|
|
76
|
+
groups: z.array(z.array(id)),
|
|
77
|
+
members: z.array(z.object({ id, name: z.string() })),
|
|
78
|
+
newConnections: z.number(),
|
|
79
|
+
pairWeight: z.number(),
|
|
80
|
+
revision: z.number().int(),
|
|
81
|
+
selected: z.number(),
|
|
82
|
+
unmatched: z.array(id),
|
|
83
|
+
});
|
|
84
|
+
const page = (item) => z.object({ items: z.array(item), nextCursor: id.nullable() });
|
|
85
|
+
export const contract = {
|
|
86
|
+
...managementContract,
|
|
87
|
+
channels: {
|
|
88
|
+
list: base
|
|
89
|
+
.meta({ scope: 'programs:read' })
|
|
90
|
+
.route({
|
|
91
|
+
method: 'GET',
|
|
92
|
+
path: '/channels',
|
|
93
|
+
summary: 'List Slack channels available to Shuffl',
|
|
94
|
+
})
|
|
95
|
+
.output(z.array(z.object({
|
|
96
|
+
id,
|
|
97
|
+
isMember: z.boolean(),
|
|
98
|
+
isPrivate: z.boolean(),
|
|
99
|
+
name: z.string(),
|
|
100
|
+
readiness: z.enum(['ready', 'invite_required', 'missing_scope']),
|
|
101
|
+
}))),
|
|
102
|
+
},
|
|
103
|
+
commands: {
|
|
104
|
+
get: base
|
|
105
|
+
.route({
|
|
106
|
+
method: 'GET',
|
|
107
|
+
path: '/commands/{id}',
|
|
108
|
+
summary: 'Read your own management command receipt',
|
|
109
|
+
})
|
|
110
|
+
.input(z.strictObject({ id: z.string().uuid() }))
|
|
111
|
+
.output(commandReceiptSchema),
|
|
112
|
+
},
|
|
113
|
+
knowledge: {
|
|
114
|
+
...managementContract.knowledge,
|
|
115
|
+
context: base
|
|
116
|
+
.meta({ scope: 'knowledge:read' })
|
|
117
|
+
.route({
|
|
118
|
+
method: 'POST',
|
|
119
|
+
path: '/knowledge/context',
|
|
120
|
+
summary: 'Read nearby passages from the same currently approved version',
|
|
121
|
+
})
|
|
122
|
+
.input(z.strictObject({
|
|
123
|
+
passageId: z.string().regex(/^passage-[1-9]\d{0,2}$/),
|
|
124
|
+
sourceId: z.string().uuid(),
|
|
125
|
+
versionId: z.string().uuid(),
|
|
126
|
+
}))
|
|
127
|
+
.output(z.array(citationSchema).max(3)),
|
|
128
|
+
search: base
|
|
129
|
+
.meta({ scope: 'knowledge:read' })
|
|
130
|
+
.route({
|
|
131
|
+
method: 'POST',
|
|
132
|
+
path: '/knowledge/search',
|
|
133
|
+
summary: 'Search currently approved knowledge and return immutable passage citations',
|
|
134
|
+
})
|
|
135
|
+
.input(z.strictObject({ query: z.string().trim().min(2).max(500) }))
|
|
136
|
+
.output(z.array(citationSchema).max(8)),
|
|
137
|
+
},
|
|
138
|
+
manager: {
|
|
139
|
+
current: base
|
|
140
|
+
.meta({ scope: 'manager:read' })
|
|
141
|
+
.route({
|
|
142
|
+
method: 'GET',
|
|
143
|
+
path: '/manager',
|
|
144
|
+
summary: 'Read the authenticated employee’s own manager context',
|
|
145
|
+
})
|
|
146
|
+
.output(citationSchema.nullable()),
|
|
147
|
+
},
|
|
148
|
+
permissions: {
|
|
149
|
+
list: base
|
|
150
|
+
.route({
|
|
151
|
+
method: 'GET',
|
|
152
|
+
path: '/permissions',
|
|
153
|
+
summary: 'Discover endpoint permissions available to this token',
|
|
154
|
+
})
|
|
155
|
+
.output(z.object({
|
|
156
|
+
catalog: z.array(permissionDefinitionSchema.extend({
|
|
157
|
+
grantable: z.boolean(),
|
|
158
|
+
granted: z.boolean(),
|
|
159
|
+
})),
|
|
160
|
+
permissions: z.array(permissionSchema),
|
|
161
|
+
})),
|
|
162
|
+
},
|
|
163
|
+
programs: {
|
|
164
|
+
...managementContract.programs,
|
|
165
|
+
archive: base
|
|
166
|
+
.meta({ scope: 'programs:write' })
|
|
167
|
+
.route({
|
|
168
|
+
method: 'POST',
|
|
169
|
+
path: '/programs/{id}/archive',
|
|
170
|
+
summary: 'Archive a program',
|
|
171
|
+
})
|
|
172
|
+
.input(identifier)
|
|
173
|
+
.output(programSchema),
|
|
174
|
+
create: base
|
|
175
|
+
.meta({ scope: 'programs:write' })
|
|
176
|
+
.route({
|
|
177
|
+
method: 'POST',
|
|
178
|
+
path: '/programs',
|
|
179
|
+
summary: 'Create a program; reuse requestKey only for the same request',
|
|
180
|
+
})
|
|
181
|
+
.input(z.object({
|
|
182
|
+
draft: z.boolean().default(true),
|
|
183
|
+
program: programInput,
|
|
184
|
+
requestKey: z.string().min(8).max(120),
|
|
185
|
+
}))
|
|
186
|
+
.output(programSchema),
|
|
187
|
+
get: base
|
|
188
|
+
.meta({ scope: 'programs:read' })
|
|
189
|
+
.route({
|
|
190
|
+
method: 'GET',
|
|
191
|
+
path: '/programs/{id}',
|
|
192
|
+
summary: 'Get a program',
|
|
193
|
+
})
|
|
194
|
+
.input(identifier)
|
|
195
|
+
.output(programSchema),
|
|
196
|
+
list: base
|
|
197
|
+
.meta({ scope: 'programs:read' })
|
|
198
|
+
.route({ method: 'GET', path: '/programs', summary: 'List programs' })
|
|
199
|
+
.input(pagination)
|
|
200
|
+
.output(page(programSchema)),
|
|
201
|
+
options: base
|
|
202
|
+
.meta({ scope: 'programs:read' })
|
|
203
|
+
.route({
|
|
204
|
+
method: 'GET',
|
|
205
|
+
path: '/program-options',
|
|
206
|
+
summary: 'List the choices for a Connections program: who should meet whom, keep-apart rules, fine-tuning, defaults, teams and departments',
|
|
207
|
+
})
|
|
208
|
+
.input(z.object({}))
|
|
209
|
+
.output(programOptionsSchema),
|
|
210
|
+
pause: base
|
|
211
|
+
.meta({ scope: 'programs:write' })
|
|
212
|
+
.route({
|
|
213
|
+
method: 'POST',
|
|
214
|
+
path: '/programs/{id}/pause',
|
|
215
|
+
summary: 'Pause a program',
|
|
216
|
+
})
|
|
217
|
+
.input(identifier)
|
|
218
|
+
.output(programSchema),
|
|
219
|
+
preview: base
|
|
220
|
+
.meta({ scope: 'programs:read' })
|
|
221
|
+
.route({
|
|
222
|
+
method: 'POST',
|
|
223
|
+
path: '/programs/{id}/preview',
|
|
224
|
+
summary: 'Preview matches without sending introductions',
|
|
225
|
+
})
|
|
226
|
+
.input(z.object({ id, seed: z.string().min(1).max(128) }))
|
|
227
|
+
.output(previewSchema),
|
|
228
|
+
resume: base
|
|
229
|
+
.meta({ scope: 'programs:write' })
|
|
230
|
+
.route({
|
|
231
|
+
method: 'POST',
|
|
232
|
+
path: '/programs/{id}/resume',
|
|
233
|
+
summary: 'Activate a program and its schedule',
|
|
234
|
+
})
|
|
235
|
+
.input(identifier)
|
|
236
|
+
.output(programSchema),
|
|
237
|
+
syncRoster: base
|
|
238
|
+
.meta({ scope: 'programs:write' })
|
|
239
|
+
.route({
|
|
240
|
+
method: 'POST',
|
|
241
|
+
path: '/programs/{id}/sync-roster',
|
|
242
|
+
summary: 'Refresh program channel membership',
|
|
243
|
+
})
|
|
244
|
+
.input(identifier)
|
|
245
|
+
.output(z.object({ synced: z.boolean() })),
|
|
246
|
+
update: base
|
|
247
|
+
.meta({ scope: 'programs:write' })
|
|
248
|
+
.route({
|
|
249
|
+
method: 'PUT',
|
|
250
|
+
path: '/programs/{id}',
|
|
251
|
+
summary: 'Update a program at an expected revision',
|
|
252
|
+
})
|
|
253
|
+
.input(z.object({
|
|
254
|
+
expectedRevision: z
|
|
255
|
+
.number()
|
|
256
|
+
.int()
|
|
257
|
+
.positive()
|
|
258
|
+
.optional()
|
|
259
|
+
.describe('The revision you read. When given, the update is refused if the program changed since.'),
|
|
260
|
+
id,
|
|
261
|
+
program: programPatch.describe('Only the fields to change. match, match.fineTune and schedule merge field by field; keepApart or fineTune null removes it.'),
|
|
262
|
+
reviewMatching: z.boolean().optional(),
|
|
263
|
+
}))
|
|
264
|
+
.output(programSchema),
|
|
265
|
+
},
|
|
266
|
+
runs: {
|
|
267
|
+
...managementContract.runs,
|
|
268
|
+
get: base
|
|
269
|
+
.meta({ scope: 'runs:read' })
|
|
270
|
+
.route({
|
|
271
|
+
method: 'GET',
|
|
272
|
+
path: '/runs/{id}',
|
|
273
|
+
summary: 'Get the durable status of a run',
|
|
274
|
+
})
|
|
275
|
+
.input(identifier)
|
|
276
|
+
.output(z.object({
|
|
277
|
+
createdAt: z.iso.datetime(),
|
|
278
|
+
id,
|
|
279
|
+
programId: id,
|
|
280
|
+
reason: z.string().nullable(),
|
|
281
|
+
status: z.string(),
|
|
282
|
+
})),
|
|
283
|
+
request: base
|
|
284
|
+
.meta({ scope: 'runs:write' })
|
|
285
|
+
.route({
|
|
286
|
+
method: 'POST',
|
|
287
|
+
path: '/runs',
|
|
288
|
+
summary: 'Queue introductions using a preview and idempotent request key',
|
|
289
|
+
})
|
|
290
|
+
.input(z.object({
|
|
291
|
+
preview: z.object({
|
|
292
|
+
fingerprint: z.string().length(64),
|
|
293
|
+
revision: z.number().int().positive(),
|
|
294
|
+
seed: z.string().min(1).max(128),
|
|
295
|
+
}),
|
|
296
|
+
programId: id,
|
|
297
|
+
requestKey: z.string().min(8).max(120),
|
|
298
|
+
}))
|
|
299
|
+
.output(z.object({ id, status: z.string() })),
|
|
300
|
+
},
|
|
301
|
+
users: {
|
|
302
|
+
...managementContract.users,
|
|
303
|
+
get: base
|
|
304
|
+
.meta({ scope: 'users:read' })
|
|
305
|
+
.route({ method: 'GET', path: '/users/{id}', summary: 'Get a person' })
|
|
306
|
+
.input(identifier)
|
|
307
|
+
.output(userSchema),
|
|
308
|
+
list: base
|
|
309
|
+
.meta({ scope: 'users:read' })
|
|
310
|
+
.route({
|
|
311
|
+
method: 'GET',
|
|
312
|
+
path: '/users',
|
|
313
|
+
summary: 'List people in this workspace',
|
|
314
|
+
})
|
|
315
|
+
.input(pagination.extend({ search: z.string().trim().max(100).optional() }))
|
|
316
|
+
.output(page(userSchema)),
|
|
317
|
+
},
|
|
318
|
+
workspaces: {
|
|
319
|
+
...managementContract.workspaces,
|
|
320
|
+
current: base
|
|
321
|
+
.meta({ scope: null })
|
|
322
|
+
.route({
|
|
323
|
+
method: 'GET',
|
|
324
|
+
path: '/workspace',
|
|
325
|
+
summary: 'Get the workspace bound to this token',
|
|
326
|
+
})
|
|
327
|
+
.output(z.object({ id, name: z.string(), role: z.string() })),
|
|
328
|
+
},
|
|
329
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const managementOperations: readonly [readonly ['runs.dispatch', 'management.dispatchRun', 'runs:write', 'write', 'Dispatch this queued introduction run'], readonly ['operations.dispatchInbox', 'management.dispatchInbox', 'operations:write', 'write', 'Resume already-admitted workspace provider events and support delivery'], readonly ['hr.deliver', 'management.deliverHr', 'hr:write', 'write', 'Deliver your HR reply to the employee'], readonly ['assistant.send', 'management.sendAssistant', 'assistant:write', 'write'], readonly ['credentials.api.create', 'management.createApiToken', 'credentials:write', 'write', 'Delegate a subset of this credential with bounded expiry and inherited revocation'], readonly ['invitations.create', 'management.invite', 'access:write', 'write', 'Invite this person with the selected workspace role'], readonly ['invitations.list', 'management.invitations', 'access:read', 'read'], readonly ['invitations.cancel', 'management.cancelInvitation', 'access:write', 'write'], readonly ['exports.workspace', 'management.export', 'exports:read', 'read'], readonly ['knowledge.uploads.create', 'management.createPdfUpload', 'knowledge:write', 'write'], readonly ['knowledge.uploads.appendPart', 'management.uploadPdfPart', 'knowledge:write', 'write'], readonly ['knowledge.uploads.complete', 'management.completePdfUpload', 'knowledge:write', 'write'], readonly ['knowledge.uploads.retry', 'management.retryPdfUpload', 'knowledge:write', 'write'], readonly ['knowledge.uploads.get', 'management.pdfUpload', 'knowledge:write', 'read'], readonly ['knowledge.sources.importWebsite', 'management.importWebsite', 'knowledge:write', 'write'], readonly ['provisioning.current', 'management.provisioning', 'integrations:read', 'read'], readonly ['sync.current', 'directory.directorySync', 'integrations:read', 'read'], readonly ['sync.connect', 'directory.connectDirectoryProvider', 'integrations:write', 'write', 'Connect a directory sync provider with the credential given'], readonly ['sync.run', 'directory.syncDirectoryConnection', 'integrations:write', 'write'], readonly ['sync.disconnect', 'directory.disconnectDirectoryProvider', 'integrations:write', 'write', 'Disconnect this directory sync provider'], readonly ['sync.request', 'directory.requestDirectorySource', 'integrations:write', 'write'], readonly ['provisioning.configure', 'management.configureProvisioning', 'integrations:write', 'write', 'Change provisioning credentials or employee access policy'], readonly ['credentials.api.list', 'management.apiTokens', 'credentials:read', 'read'], readonly ['credentials.api.revoke', 'management.revokeApiToken', 'credentials:write', 'write'], readonly ['assistant.conversations', 'management.conversations', 'assistant:read', 'read'], readonly ['assistant.history', 'management.conversation', 'assistant:read', 'read'], readonly ['assistant.stop', 'management.stopAnswer', 'assistant:write', 'write'], readonly ['assistant.delete', 'management.deleteConversation', 'assistant:write', 'write'], readonly ['integrations.authorize', 'management.authorizeIntegration', 'integrations:write', 'read'], readonly ['users.details', 'directory.directoryPerson', 'users:read', 'read'], readonly ['users.page', 'people.peoplePage', 'users:read', 'read'], readonly ['users.filterOptions', 'people.peopleFilterOptions', 'users:read', 'read'], readonly ['users.participants', 'people.participants', 'users:read', 'read'], readonly ['users.managers', 'directory.directoryManagers', 'users:read', 'read'], readonly ['users.managerHistory', 'directory.managerHistory', 'users:read', 'read'], readonly ['users.save', 'directory.saveDirectoryPerson', 'users:write', 'write'], readonly ['users.participation', 'people.participation', 'participation:write', 'write'], readonly ['users.profile', 'people.profile', 'profile:write', 'write'], readonly ['timeOff.balances', 'people.timeOffBalances', 'self:read', 'read', 'Read your own time-off balances from the connected HR system'], readonly ['profiles.get', 'profiles.profile', 'users:read', 'read', 'Read a person’s profile as this workspace sees it'], readonly ['profiles.save', 'profiles.saveProfile', 'profile:write', 'write'], readonly ['profiles.settings', 'profiles.saveSettings', 'profile:write', 'write', 'Choose who sees the optional parts of your own profile'], readonly ['profiles.positions.save', 'profiles.savePosition', 'profile:write', 'write'], readonly ['profiles.positions.delete', 'profiles.deletePosition', 'profile:write', 'write'], readonly ['profiles.photo.delete', 'profiles.deletePhoto', 'profile:write', 'write'], readonly ['profiles.cover.delete', 'profiles.deleteCover', 'profile:write', 'write'], readonly ['profiles.draft', 'profiles.draft', 'profile:write', 'write', 'Draft the empty parts of your own profile with Mello; nothing is saved'], readonly ['profiles.employeeNumber', 'profiles.setEmployeeNumber', 'users:write', 'write', 'Set a person’s employee number to an unused number'], readonly ['badges.list', 'badges.list', 'users:read', 'read', 'List the workspace’s badges, who holds them and any open requests you decide'], readonly ['badges.ofPerson', 'badges.ofPerson', 'users:read', 'read'], readonly ['badges.save', 'badges.save', 'profile:write', 'write', 'Create or edit a badge you own'], readonly ['badges.award', 'badges.award', 'profile:write', 'write', 'Give a badge you own to a person'], readonly ['badges.revoke', 'badges.revoke', 'profile:write', 'write'], readonly ['badges.claim', 'badges.claim', 'profile:write', 'write', 'Claim a badge with its code'], readonly ['badges.request', 'badges.request', 'profile:write', 'write'], readonly ['badges.decideRequest', 'badges.decideRequest', 'profile:write', 'write'], readonly ['badges.hideOwn', 'badges.hideOwn', 'profile:write', 'write'], readonly ['badges.setHidden', 'badges.setHidden', 'users:write', 'write'], readonly ['communities.list', 'communities.list', 'users:read', 'read', 'List communities with the members you may see'], readonly ['communities.members', 'communities.members', 'users:read', 'read'], readonly ['communities.ofPerson', 'communities.ofPerson', 'users:read', 'read'], readonly ['communities.save', 'communities.save', 'profile:write', 'write', 'Create or edit a community, optionally tied to a Slack channel'], readonly ['communities.join', 'communities.join', 'profile:write', 'write'], readonly ['communities.leave', 'communities.leave', 'profile:write', 'write'], readonly ['communities.setVisibility', 'communities.setVisibility', 'profile:write', 'write'], readonly ['communities.archive', 'communities.archive', 'profile:write', 'write'], readonly ['communities.removeMember', 'communities.removeMember', 'profile:write', 'write', 'Remove someone from a community, as its owner or moderator'], readonly ['communities.sync', 'communities.sync', 'profile:write', 'write'], readonly ['home.feed', 'home.feed', 'self:read', 'read', 'What happened to people you know, and who Mello thinks you should meet'], readonly ['network.orgChart', 'network.orgChart', 'users:read', 'read', 'Everyone in the workspace with their manager, for the org chart'], readonly ['network.mine', 'network.mine', 'users:read', 'read', 'Who you know and who you should meet'], readonly ['network.ofPerson', 'network.ofPerson', 'users:read', 'read', 'People you and this person both know'], readonly ['network.claim', 'network.claim', 'profile:write', 'write', 'Say you know someone or would like to meet them'], readonly ['users.blockPair', 'people.blockPair', 'users:write', 'write'], readonly ['users.blockedPairs', 'people.blockedPairs', 'users:read', 'read'], readonly ['units.list', 'directory.directoryUnits', 'users:read', 'read'], readonly ['units.save', 'directory.saveDirectoryUnit', 'users:write', 'write'], readonly ['units.archive', 'directory.archiveDirectoryUnit', 'users:write', 'write'], readonly ['access.get', 'directory.employeeAccess', 'access:read', 'read'], readonly ['access.save', 'directory.saveEmployeeAccess', 'access:write', 'write', 'Change employee product access'], readonly ['access.saveRole', 'directory.saveWorkspaceRole', 'access:write', 'write', 'Change a member’s workspace role'], readonly ['identities.list', 'identities.personAccounts', 'identities:read', 'read'], readonly ['identities.slackAccounts', 'identities.slackAccounts', 'identities:read', 'read'], readonly ['identities.webAccounts', 'identities.webAccounts', 'identities:read', 'read'], readonly ['identities.linkSlack', 'identities.linkSlackAccount', 'identities:write', 'write', 'Link a verified Slack account'], readonly ['identities.linkWeb', 'identities.linkWebAccount', 'identities:write', 'write', 'Link a verified web account'], readonly ['identities.unlink', 'identities.unlinkPersonAccount', 'identities:write', 'write', 'Revoke an employee identity link'], readonly ['programs.schedulePreview', 'programs.schedulePreview', 'programs:read', 'read'], readonly ['programs.people', 'programs.people', 'programs:read', 'read'], readonly ['runs.list', 'runs.roundsPage', 'runs:read', 'read'], readonly ['runs.details', 'runs.run', 'runs:read', 'read'], readonly ['runs.retry', 'runs.retry', 'runs:write', 'write', 'Retry introduction delivery'], readonly ['knowledge.sources.list', 'knowledge.list', 'knowledge:manage', 'read'], readonly ['knowledge.sources.get', 'knowledge.read', 'knowledge:manage', 'read'], readonly ['knowledge.policies.coverage', 'knowledge.policyCoverage', 'knowledge:manage', 'read'], readonly ['knowledge.sources.history', 'knowledge.history', 'knowledge:manage', 'read'], readonly ['knowledge.sources.search', 'knowledge.search', 'knowledge:read', 'read'], readonly ['knowledge.sources.save', 'knowledge.save', 'knowledge:write', 'write'], readonly ['knowledge.sources.publish', 'knowledge.publish', 'knowledge:write', 'write', 'Publish this knowledge version to its audience'], readonly ['knowledge.sources.changeAudience', 'knowledge.changeAudience', 'knowledge:write', 'write', 'Change who can read this knowledge source'], readonly ['knowledge.sources.withdraw', 'knowledge.withdraw', 'knowledge:write', 'write'], readonly ['knowledge.sources.archive', 'knowledge.archive', 'knowledge:write', 'write', 'Archive an unpublished knowledge source'], readonly ['knowledge.sources.restore', 'knowledge.restore', 'knowledge:write', 'write', 'Restore an archived knowledge source'], readonly ['knowledge.connections.list', 'knowledge.connections', 'integrations:read', 'read'], readonly ['knowledge.connections.disconnect', 'knowledge.disconnect', 'integrations:write', 'write', 'Disconnect a knowledge provider'], readonly ['knowledge.sources.importConnected', 'knowledge.importConnected', 'knowledge:write', 'write', 'Import a document from a connected Knowledge source'], readonly ['knowledge.connections.browse', 'knowledge.browseConnected', 'integrations:read', 'read', 'List documents a connected Knowledge source can see'], readonly ['knowledge.connections.connect', 'knowledge.connectProvider', 'integrations:write', 'write', 'Connect a Knowledge provider with a token'], readonly ['knowledge.sources.refresh', 'knowledge.refreshSource', 'knowledge:write', 'write'], readonly ['hr.list', 'hrRequests.hrRequests', 'hr:read', 'read'], readonly ['hr.get', 'hrRequests.hrRequest', 'hr:read', 'read'], readonly ['hr.readiness', 'hrRequests.hrReadiness', 'hr:read', 'read'], readonly ['hr.settings', 'hrRequests.hrSettings', 'hr:read', 'read'], readonly ['hr.shareSources', 'hrRequests.hrShareSources', 'hr:read', 'read'], readonly ['hr.command', 'hrRequests.commandHrRequest', 'hr:write', 'write'], readonly ['hr.configure', 'hrRequests.configureHrDestination', 'hr:write', 'write', 'Change the HR request destination'], readonly ['hr.share', 'hrRequests.shareHrRequest', 'hr:write', 'write', 'Share this request with the selected HR responders'], readonly ['hr.retryDelivery', 'hrRequests.retryHrDelivery', 'hr:write', 'write', 'Retry HR request delivery'], readonly ['support.list', 'support.support', 'support:read', 'read'], readonly ['support.get', 'support.supportThread', 'support:read', 'read'], readonly ['support.create', 'support.createSupport', 'support:write', 'write'], readonly ['support.reply', 'support.reply', 'support:write', 'write'], readonly ['support.close', 'support.closeSupport', 'support:write', 'write'], readonly ['support.assign', 'support.assignSupport', 'support:write', 'write'], readonly ['billing.legacy', 'billing.billing', 'billing:read', 'read'], readonly ['billing.current', 'billing.companyBilling', 'billing:read', 'read'], readonly ['billing.initialize', 'billing.initializeCompanyBilling', 'billing:write', 'write'], readonly ['billing.refresh', 'billing.refreshCompanyBilling', 'billing:write', 'write'], readonly ['billing.activateTrial', 'billing.activateCompanyTrial', 'billing:write', 'write', 'Activate the company trial'], readonly ['billing.checkout', 'billing.companyCheckout', 'billing:write', 'write', 'Open checkout for the company subscription'], readonly ['billing.portal', 'billing.companyPortal', 'billing:write', 'write'], readonly ['billing.legacyPortal', 'billing.billingPortal', 'billing:write', 'write'], readonly ['billing.cancelSubscription', 'billing.cancelCompanySubscription', 'billing:write', 'write', 'Cancel the company subscription'], readonly ['operations.activity', 'operations.activity', 'operations:read', 'read'], readonly ['operations.status', 'operations.operations', 'operations:read', 'read'], readonly ['operations.reconcile', 'operations.reconcile', 'operator:write', 'write', 'Reconcile an externally verified delivery outcome'], readonly ['reports.overview', 'reporting.overview', 'reports:read', 'read'], readonly ['reports.connections', 'reporting.connectionsInsights', 'reports:read', 'read'], readonly ['reports.onboarding', 'reporting.onboardingInsights', 'reports:read', 'read'], readonly ['workspaces.status', 'workspaces.workspaceStatus', 'workspace:write', 'write'], readonly ['workspaces.setup', 'setup.setup', 'workspace:read', 'read'], readonly ['workspaces.initialize', 'workspaces.initialize', 'workspace:write', 'write'], readonly ['onboarding.program', 'onboarding.onboardingProgram', 'onboarding:read', 'read'], readonly ['onboarding.saveProgram', 'onboarding.saveOnboardingProgram', 'onboarding:write', 'write', 'Save the onboarding program and its messages'], readonly ['onboarding.candidates', 'onboarding.onboardingCandidates', 'onboarding:read', 'read'], readonly ['onboarding.person', 'onboarding.personOnboarding', 'onboarding:read', 'read'], readonly ['onboarding.enrollmentPreview', 'onboarding.onboardingEnrollmentPreview', 'onboarding:read', 'read'], readonly ['onboarding.previewEnrollment', 'onboarding.previewOnboardingEnrollment', 'onboarding:write', 'write'], readonly ['onboarding.enroll', 'onboarding.enrollOnboarding', 'onboarding:write', 'write', 'Enroll this person in onboarding'], readonly ['onboarding.approve', 'onboarding.approveOnboardingEnrollment', 'onboarding:write', 'write', 'Approve these exact onboarding messages for sending'], readonly ['onboarding.assignBuddy', 'onboarding.assignOnboardingBuddy', 'onboarding:write', 'write'], readonly ['onboarding.update', 'onboarding.updateOnboardingEnrollment', 'onboarding:write', 'write'], readonly ['onboarding.remove', 'onboarding.removeOnboardingEnrollment', 'onboarding:write', 'write'], readonly ['onboarding.retry', 'onboarding.retryOnboardingStep', 'onboarding:write', 'write'], readonly ['onboarding.mine', 'onboarding.myOnboarding', 'self:read', 'read'], readonly ['onboarding.answerCheckIn', 'onboarding.answerOnboardingCheckIn', 'self:write', 'write'], readonly ['onboarding.respondBuddy', 'onboarding.respondBuddyInvitation', 'self:write', 'write'], readonly ['onboarding.buddySuggestions', 'onboarding.buddySuggestions', 'self:read', 'read', 'Suggest coworkers who could be your onboarding buddy'], readonly ['onboarding.askBuddy', 'onboarding.askBuddy', 'self:write', 'write', 'Ask this coworker to be your onboarding buddy'], readonly ['celebrations.program', 'milestones.celebrationProgram', 'celebrations:read', 'read'], readonly ['celebrations.save', 'milestones.saveCelebrationProgram', 'celebrations:write', 'write', 'Save celebration settings; enabling them schedules messages'], readonly ['celebrations.preview', 'milestones.previewCelebration', 'celebrations:read', 'read'], readonly ['celebrations.review', 'milestones.milestoneReview', 'celebrations:read', 'read'], readonly ['celebrations.refresh', 'milestones.refreshMilestones', 'celebrations:write', 'write'], readonly ['celebrations.deliveries', 'milestones.celebrationDeliveries', 'celebrations:read', 'read'], readonly ['celebrations.mine', 'milestones.myCelebrations', 'self:read', 'read'], readonly ['celebrations.preferences', 'milestones.milestonePreferences', 'self:read', 'read'], readonly ['celebrations.savePreferences', 'milestones.saveMilestonePreferences', 'self:write', 'write'], readonly ['notifications.preferences', 'notifications.notificationPreferences', 'self:read', 'read'], readonly ['notifications.save', 'notifications.saveNotificationPreference', 'self:write', 'write'], readonly ['reports.answerFeedback', 'reporting.answerFeedback', 'reports:read', 'read'], readonly ['reports.knowledge', 'reporting.knowledgeActivity', 'reports:read', 'read'], readonly ['reports.knowledgeSource', 'reporting.knowledgeSourceActivity', 'reports:read', 'read'], readonly ['reports.needsYou', 'reporting.needsYouInsights', 'reports:read', 'read'], readonly ['reports.people', 'reporting.peopleInsights', 'reports:read', 'read'], readonly ['knowledge.connections.requests', 'knowledge.sourceRequests', 'integrations:read', 'read'], readonly ['knowledge.connections.request', 'knowledge.requestSource', 'integrations:write', 'write'], readonly ['access.slackWaiting', 'directory.slackAccessWaiting', 'access:read', 'read'], readonly ['access.enableSlack', 'directory.enableSlackAccess', 'access:write', 'write', 'Give these Slack people employee access'], readonly ['workspaces.slackJoinAccess', 'directory.slackJoinAccess', 'workspace:read', 'read'], readonly ['workspaces.saveSlackJoinAccess', 'directory.saveSlackJoinAccess', 'workspace:write', 'write'], readonly ['workspaces.slackProfileLink', 'directory.slackProfileLink', 'workspace:read', 'read'], readonly ['workspaces.saveSlackProfileLink', 'directory.saveSlackProfileLink', 'workspace:write', 'write'], readonly ['workspaces.syncSlackProfileLinks', 'directory.syncSlackProfileLinks', 'workspace:write', 'write', 'Write the Shuffl profile link to every Slack profile again'], readonly ['workspaces.saveAgentSetup', 'setup.saveAgentSetup', 'workspace:write', 'write'], readonly ['workspaces.resendSlackWelcome', 'setup.resendSlackWelcome', 'integrations:write', 'write', 'Send the Slack install welcome to your own Slack DM again'], readonly ['users.activity', 'personActivity.personActivity', 'users:read', 'read'], readonly ['programs.joinChannel', 'programs.joinChannel', 'programs:write', 'write', 'Add Shuffl to this public Slack channel'], readonly ['hr.renameTeam', 'personRoles.renameHrTeam', 'hr:write', 'write'], readonly ['pulse.program', 'pulse.program', 'pulse:read', 'read', 'Read the Pulse settings'], readonly ['pulse.saveProgram', 'pulse.saveProgram', 'pulse:write', 'write', 'Save Pulse settings; enabling Pulse schedules questions to everyone'], readonly ['pulse.questions', 'pulse.questions', 'pulse:read', 'read', 'List the Pulse question library'], readonly ['pulse.addQuestion', 'pulse.addQuestion', 'pulse:write', 'write', 'Add a Pulse question to the library'], readonly ['pulse.addTemplate', 'pulse.addTemplate', 'pulse:write', 'write', 'Add a Pulse question set from a template'], readonly ['pulse.setQuestionStatus', 'pulse.setQuestionStatus', 'pulse:write', 'write', 'Retire or restore a Pulse question'], readonly ['pulse.insights', 'pulse.insights', 'pulse:read', 'read', 'Read Pulse totals and trends (groups of seven or more)'], readonly ['pulse.asked', 'pulse.asked', 'self:read', 'read', 'List the Pulse questions asked so far'], readonly ['pulse.today', 'pulse.today', 'self:read', 'read', 'Read today’s Pulse question'], readonly ['praise.settings', 'praise.settings', 'praise:read', 'read', 'Read the Praise settings'], readonly ['praise.saveSettings', 'praise.saveSettings', 'praise:write', 'write', 'Save the Praise settings and company values'], readonly ['praise.addChannel', 'praise.addChannel', 'praise:write', 'write', 'Read praise from this Slack channel from now on'], readonly ['praise.removeChannel', 'praise.removeChannel', 'praise:write', 'write', 'Stop reading praise from a Slack channel'], readonly ['praise.insights', 'praise.insights', 'praise:read', 'read', 'Read Praise totals by value (groups of seven or more)'], readonly ['praise.feed', 'praise.feed', 'self:read', 'read', 'Read the Praise feed'], readonly ['praise.ofPerson', 'praise.ofPerson', 'self:read', 'read', 'Read the public praise one person received'], readonly ['praise.mine', 'praise.mine', 'self:read', 'read', 'Read praise you gave and received'], readonly ['praise.setDigest', 'praise.setDigest', 'self:write', 'write', 'Choose whether you get the daily Praise digest'], readonly ['praise.setHidden', 'praise.setHidden', 'self:write', 'write', 'Hide or show a praise you received']];
|