@plolink/sdk 0.0.4

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 (76) hide show
  1. package/README.md +259 -0
  2. package/dist/chunk-4H4RACSE.js +335 -0
  3. package/dist/chunk-4H4RACSE.js.map +1 -0
  4. package/dist/chunk-IHAAKFEJ.js +219 -0
  5. package/dist/chunk-IHAAKFEJ.js.map +1 -0
  6. package/dist/chunk-JR4HYYQI.cjs +221 -0
  7. package/dist/chunk-JR4HYYQI.cjs.map +1 -0
  8. package/dist/chunk-MD4O7FWT.js +46 -0
  9. package/dist/chunk-MD4O7FWT.js.map +1 -0
  10. package/dist/chunk-NS3DJP2O.cjs +349 -0
  11. package/dist/chunk-NS3DJP2O.cjs.map +1 -0
  12. package/dist/chunk-Y3UJVC2L.cjs +48 -0
  13. package/dist/chunk-Y3UJVC2L.cjs.map +1 -0
  14. package/dist/client-CAjIQKPm.d.cts +193 -0
  15. package/dist/client-CwNikk7i.d.ts +193 -0
  16. package/dist/common/index.cjs +65 -0
  17. package/dist/common/index.cjs.map +1 -0
  18. package/dist/common/index.d.cts +422 -0
  19. package/dist/common/index.d.ts +422 -0
  20. package/dist/common/index.js +4 -0
  21. package/dist/common/index.js.map +1 -0
  22. package/dist/core-77EbLgbp.d.cts +97 -0
  23. package/dist/core-77EbLgbp.d.ts +97 -0
  24. package/dist/index.cjs +350 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +98 -0
  27. package/dist/index.d.ts +98 -0
  28. package/dist/index.js +306 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/modules/agent/index.cjs +21 -0
  31. package/dist/modules/agent/index.cjs.map +1 -0
  32. package/dist/modules/agent/index.d.cts +71 -0
  33. package/dist/modules/agent/index.d.ts +71 -0
  34. package/dist/modules/agent/index.js +19 -0
  35. package/dist/modules/agent/index.js.map +1 -0
  36. package/dist/modules/billing/index.cjs +413 -0
  37. package/dist/modules/billing/index.cjs.map +1 -0
  38. package/dist/modules/billing/index.d.cts +538 -0
  39. package/dist/modules/billing/index.d.ts +538 -0
  40. package/dist/modules/billing/index.js +411 -0
  41. package/dist/modules/billing/index.js.map +1 -0
  42. package/dist/modules/chat/index.cjs +20 -0
  43. package/dist/modules/chat/index.cjs.map +1 -0
  44. package/dist/modules/chat/index.d.cts +68 -0
  45. package/dist/modules/chat/index.d.ts +68 -0
  46. package/dist/modules/chat/index.js +18 -0
  47. package/dist/modules/chat/index.js.map +1 -0
  48. package/dist/modules/psych/index.cjs +20 -0
  49. package/dist/modules/psych/index.cjs.map +1 -0
  50. package/dist/modules/psych/index.d.cts +69 -0
  51. package/dist/modules/psych/index.d.ts +69 -0
  52. package/dist/modules/psych/index.js +18 -0
  53. package/dist/modules/psych/index.js.map +1 -0
  54. package/dist/modules/rbac/index.cjs +197 -0
  55. package/dist/modules/rbac/index.cjs.map +1 -0
  56. package/dist/modules/rbac/index.d.cts +293 -0
  57. package/dist/modules/rbac/index.d.ts +293 -0
  58. package/dist/modules/rbac/index.js +195 -0
  59. package/dist/modules/rbac/index.js.map +1 -0
  60. package/dist/modules/team/index.cjs +54 -0
  61. package/dist/modules/team/index.cjs.map +1 -0
  62. package/dist/modules/team/index.d.cts +91 -0
  63. package/dist/modules/team/index.d.ts +91 -0
  64. package/dist/modules/team/index.js +52 -0
  65. package/dist/modules/team/index.js.map +1 -0
  66. package/dist/modules/virtual-account/index.cjs +293 -0
  67. package/dist/modules/virtual-account/index.cjs.map +1 -0
  68. package/dist/modules/virtual-account/index.d.cts +366 -0
  69. package/dist/modules/virtual-account/index.d.ts +366 -0
  70. package/dist/modules/virtual-account/index.js +291 -0
  71. package/dist/modules/virtual-account/index.js.map +1 -0
  72. package/dist/poller-BlIRbwL4.d.cts +201 -0
  73. package/dist/poller-DWKZjuSw.d.ts +201 -0
  74. package/dist/shared-6ZepUSPW.d.cts +31 -0
  75. package/dist/shared-6ZepUSPW.d.ts +31 -0
  76. package/package.json +96 -0
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 心理测评模块
3
+ *
4
+ * @description
5
+ * 提供心理题库抽题、评测创建、答题提交、结果生成等功能。
6
+ * 随机逻辑在后端处理,前端获取的题目已经打乱。
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { PlolinkClient } from '@plolink/sdk';
11
+ * import { Psychology } from '@plolink/sdk/psych';
12
+ *
13
+ * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });
14
+ * const psych = new Psychology(client);
15
+ *
16
+ * // 抽题并创建评测
17
+ * const assessment = await psych.createAssessment({
18
+ * type: 'big-five',
19
+ * count: 50
20
+ * });
21
+ * ```
22
+ *
23
+ * @module psych
24
+ */
25
+ /**
26
+ * Psychology 模块占位符
27
+ *
28
+ * @description
29
+ * 此模块将在后续版本中实现以下功能:
30
+ * - 题库抽题(后端随机)
31
+ * - 创建心理评测记录
32
+ * - 提交答题结果
33
+ * - 生成评测报告
34
+ * - 防止重复提交
35
+ * - 获取历史评测记录
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * // 未来使用方式(预览)
40
+ * const psych = new Psychology(client);
41
+ *
42
+ * // 创建评测(自动抽题)
43
+ * const assessment = await psych.createAssessment({
44
+ * type: 'big-five',
45
+ * count: 50
46
+ * });
47
+ *
48
+ * // 提交答案
49
+ * const result = await psych.submitAnswers({
50
+ * assessmentId: assessment.id,
51
+ * answers: [
52
+ * { questionId: 1, answer: 'A' },
53
+ * { questionId: 2, answer: 'B' }
54
+ * ]
55
+ * });
56
+ *
57
+ * // 获取评测结果
58
+ * console.log('Assessment result:', result);
59
+ * ```
60
+ */
61
+ declare const PSYCH_MODULE_INFO: {
62
+ readonly name: "psych";
63
+ readonly version: "1.0.0";
64
+ readonly status: "planned";
65
+ readonly features: readonly ["question-sampling", "assessment-create", "answer-submit", "result-generate", "duplicate-prevention", "history-query"];
66
+ };
67
+ type PsychModuleInfo = typeof PSYCH_MODULE_INFO;
68
+
69
+ export { PSYCH_MODULE_INFO, type PsychModuleInfo };
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 心理测评模块
3
+ *
4
+ * @description
5
+ * 提供心理题库抽题、评测创建、答题提交、结果生成等功能。
6
+ * 随机逻辑在后端处理,前端获取的题目已经打乱。
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { PlolinkClient } from '@plolink/sdk';
11
+ * import { Psychology } from '@plolink/sdk/psych';
12
+ *
13
+ * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });
14
+ * const psych = new Psychology(client);
15
+ *
16
+ * // 抽题并创建评测
17
+ * const assessment = await psych.createAssessment({
18
+ * type: 'big-five',
19
+ * count: 50
20
+ * });
21
+ * ```
22
+ *
23
+ * @module psych
24
+ */
25
+ /**
26
+ * Psychology 模块占位符
27
+ *
28
+ * @description
29
+ * 此模块将在后续版本中实现以下功能:
30
+ * - 题库抽题(后端随机)
31
+ * - 创建心理评测记录
32
+ * - 提交答题结果
33
+ * - 生成评测报告
34
+ * - 防止重复提交
35
+ * - 获取历史评测记录
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * // 未来使用方式(预览)
40
+ * const psych = new Psychology(client);
41
+ *
42
+ * // 创建评测(自动抽题)
43
+ * const assessment = await psych.createAssessment({
44
+ * type: 'big-five',
45
+ * count: 50
46
+ * });
47
+ *
48
+ * // 提交答案
49
+ * const result = await psych.submitAnswers({
50
+ * assessmentId: assessment.id,
51
+ * answers: [
52
+ * { questionId: 1, answer: 'A' },
53
+ * { questionId: 2, answer: 'B' }
54
+ * ]
55
+ * });
56
+ *
57
+ * // 获取评测结果
58
+ * console.log('Assessment result:', result);
59
+ * ```
60
+ */
61
+ declare const PSYCH_MODULE_INFO: {
62
+ readonly name: "psych";
63
+ readonly version: "1.0.0";
64
+ readonly status: "planned";
65
+ readonly features: readonly ["question-sampling", "assessment-create", "answer-submit", "result-generate", "duplicate-prevention", "history-query"];
66
+ };
67
+ type PsychModuleInfo = typeof PSYCH_MODULE_INFO;
68
+
69
+ export { PSYCH_MODULE_INFO, type PsychModuleInfo };
@@ -0,0 +1,18 @@
1
+ // src/modules/psych/index.ts
2
+ var PSYCH_MODULE_INFO = {
3
+ name: "psych",
4
+ version: "1.0.0",
5
+ status: "planned",
6
+ features: [
7
+ "question-sampling",
8
+ "assessment-create",
9
+ "answer-submit",
10
+ "result-generate",
11
+ "duplicate-prevention",
12
+ "history-query"
13
+ ]
14
+ };
15
+
16
+ export { PSYCH_MODULE_INFO };
17
+ //# sourceMappingURL=index.js.map
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/psych/index.ts"],"names":[],"mappings":";AA+DO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU;AAAA,IACR,mBAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * 心理测评模块\n * \n * @description\n * 提供心理题库抽题、评测创建、答题提交、结果生成等功能。\n * 随机逻辑在后端处理,前端获取的题目已经打乱。\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Psychology } from '@plolink/sdk/psych';\n * \n * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });\n * const psych = new Psychology(client);\n * \n * // 抽题并创建评测\n * const assessment = await psych.createAssessment({\n * type: 'big-five',\n * count: 50\n * });\n * ```\n * \n * @module psych\n */\n\n// 预留:将在后续实现 Psychology 类\n\n/**\n * Psychology 模块占位符\n * \n * @description\n * 此模块将在后续版本中实现以下功能:\n * - 题库抽题(后端随机)\n * - 创建心理评测记录\n * - 提交答题结果\n * - 生成评测报告\n * - 防止重复提交\n * - 获取历史评测记录\n * \n * @example\n * ```typescript\n * // 未来使用方式(预览)\n * const psych = new Psychology(client);\n * \n * // 创建评测(自动抽题)\n * const assessment = await psych.createAssessment({\n * type: 'big-five',\n * count: 50\n * });\n * \n * // 提交答案\n * const result = await psych.submitAnswers({\n * assessmentId: assessment.id,\n * answers: [\n * { questionId: 1, answer: 'A' },\n * { questionId: 2, answer: 'B' }\n * ]\n * });\n * \n * // 获取评测结果\n * console.log('Assessment result:', result);\n * ```\n */\nexport const PSYCH_MODULE_INFO = {\n name: 'psych',\n version: '1.0.0',\n status: 'planned',\n features: [\n 'question-sampling',\n 'assessment-create',\n 'answer-submit',\n 'result-generate',\n 'duplicate-prevention',\n 'history-query',\n ],\n} as const;\n\n// 导出类型(预留)\nexport type PsychModuleInfo = typeof PSYCH_MODULE_INFO;\n\n"]}
@@ -0,0 +1,197 @@
1
+ 'use strict';
2
+
3
+ var chunkY3UJVC2L_cjs = require('../../chunk-Y3UJVC2L.cjs');
4
+
5
+ // src/modules/rbac/index.ts
6
+ var Rbac = class {
7
+ constructor(client) {
8
+ this.client = client;
9
+ }
10
+ /**
11
+ * 获取所有权限点定义 + 系统角色定义
12
+ * GET /api/v1/permissions
13
+ */
14
+ async getPermissionDefinitions() {
15
+ return this.client.axiosInstance.get("/api/v1/permissions");
16
+ }
17
+ /**
18
+ * 列出团队角色(系统角色 + 自定义角色)
19
+ * GET /api/v1/teams/:teamId/roles
20
+ */
21
+ async listTeamRoles(teamId) {
22
+ if (!teamId || teamId.trim().length === 0) {
23
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
24
+ }
25
+ return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles`);
26
+ }
27
+ /**
28
+ * 创建自定义角色
29
+ * POST /api/v1/teams/:teamId/roles
30
+ */
31
+ async createCustomRole(teamId, params) {
32
+ if (!teamId || teamId.trim().length === 0) {
33
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
34
+ }
35
+ if (!params.name || params.name.trim().length === 0) {
36
+ throw new chunkY3UJVC2L_cjs.PlolinkError("name is required and cannot be empty", "INVALID_PARAMS");
37
+ }
38
+ if (!params.code || params.code.trim().length === 0) {
39
+ throw new chunkY3UJVC2L_cjs.PlolinkError("code is required and cannot be empty", "INVALID_PARAMS");
40
+ }
41
+ if (!Array.isArray(params.permissions)) {
42
+ throw new chunkY3UJVC2L_cjs.PlolinkError("permissions must be an array", "INVALID_PARAMS");
43
+ }
44
+ return this.client.axiosInstance.post(`/api/v1/teams/${teamId}/roles`, params);
45
+ }
46
+ /**
47
+ * 更新自定义角色
48
+ * PUT /api/v1/teams/:teamId/roles/:roleId
49
+ */
50
+ async updateCustomRole(teamId, roleId, params) {
51
+ if (!teamId || teamId.trim().length === 0) {
52
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
53
+ }
54
+ if (!roleId || roleId.trim().length === 0) {
55
+ throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required", "INVALID_PARAMS");
56
+ }
57
+ if (params.name !== void 0 && params.name.trim().length === 0) {
58
+ throw new chunkY3UJVC2L_cjs.PlolinkError("name cannot be empty", "INVALID_PARAMS");
59
+ }
60
+ if (params.code !== void 0 && params.code.trim().length === 0) {
61
+ throw new chunkY3UJVC2L_cjs.PlolinkError("code cannot be empty", "INVALID_PARAMS");
62
+ }
63
+ if (params.permissions !== void 0 && !Array.isArray(params.permissions)) {
64
+ throw new chunkY3UJVC2L_cjs.PlolinkError("permissions must be an array", "INVALID_PARAMS");
65
+ }
66
+ return this.client.axiosInstance.put(`/api/v1/teams/${teamId}/roles/${roleId}`, params);
67
+ }
68
+ /**
69
+ * 删除自定义角色
70
+ * DELETE /api/v1/teams/:teamId/roles/:roleId?force=true
71
+ */
72
+ async deleteCustomRole(teamId, roleId, options) {
73
+ if (!teamId || teamId.trim().length === 0) {
74
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
75
+ }
76
+ if (!roleId || roleId.trim().length === 0) {
77
+ throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required", "INVALID_PARAMS");
78
+ }
79
+ const params = options?.force ? { force: "true" } : void 0;
80
+ return this.client.axiosInstance.delete(`/api/v1/teams/${teamId}/roles/${roleId}`, { params });
81
+ }
82
+ /**
83
+ * 获取角色详情(系统角色或自定义角色)
84
+ * GET /api/v1/teams/:teamId/roles/:roleId
85
+ */
86
+ async getRoleDetail(teamId, roleId) {
87
+ if (!teamId || teamId.trim().length === 0) {
88
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
89
+ }
90
+ if (!roleId || roleId.trim().length === 0) {
91
+ throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required", "INVALID_PARAMS");
92
+ }
93
+ return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles/${roleId}`);
94
+ }
95
+ /**
96
+ * 获取成员的所有角色(带角色信息与权限)
97
+ * GET /api/v1/teams/:teamId/members/:memberId/roles
98
+ */
99
+ async listMemberRoles(teamId, memberId) {
100
+ if (!teamId || teamId.trim().length === 0) {
101
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
102
+ }
103
+ if (!memberId || memberId.trim().length === 0) {
104
+ throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
105
+ }
106
+ return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/members/${memberId}/roles`);
107
+ }
108
+ /**
109
+ * 为成员分配角色(系统/自定义)及数据范围
110
+ * POST /api/v1/teams/:teamId/members/:memberId/roles
111
+ */
112
+ async assignMemberRole(teamId, memberId, params) {
113
+ if (!teamId || teamId.trim().length === 0) {
114
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
115
+ }
116
+ if (!memberId || memberId.trim().length === 0) {
117
+ throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
118
+ }
119
+ if (params.roleType === "SYSTEM" && (!params.roleCode || params.roleCode.trim().length === 0)) {
120
+ throw new chunkY3UJVC2L_cjs.PlolinkError("roleCode is required when roleType is SYSTEM", "INVALID_PARAMS");
121
+ }
122
+ if (params.roleType === "CUSTOM" && (!params.roleId || params.roleId.trim().length === 0)) {
123
+ throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required when roleType is CUSTOM", "INVALID_PARAMS");
124
+ }
125
+ return this.client.axiosInstance.post(
126
+ `/api/v1/teams/${teamId}/members/${memberId}/roles`,
127
+ params
128
+ );
129
+ }
130
+ /**
131
+ * 更新成员角色的数据范围
132
+ * PUT /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId
133
+ */
134
+ async updateMemberRoleScope(teamId, memberId, memberRoleId, params) {
135
+ if (!teamId || teamId.trim().length === 0) {
136
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
137
+ }
138
+ if (!memberId || memberId.trim().length === 0) {
139
+ throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
140
+ }
141
+ if (!memberRoleId || memberRoleId.trim().length === 0) {
142
+ throw new chunkY3UJVC2L_cjs.PlolinkError("memberRoleId is required", "INVALID_PARAMS");
143
+ }
144
+ if (!params.scopeType || params.scopeType.trim().length === 0) {
145
+ throw new chunkY3UJVC2L_cjs.PlolinkError("scopeType is required", "INVALID_PARAMS");
146
+ }
147
+ return this.client.axiosInstance.put(
148
+ `/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`,
149
+ params
150
+ );
151
+ }
152
+ /**
153
+ * 移除成员角色
154
+ * DELETE /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId
155
+ */
156
+ async removeMemberRole(teamId, memberId, memberRoleId) {
157
+ if (!teamId || teamId.trim().length === 0) {
158
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
159
+ }
160
+ if (!memberId || memberId.trim().length === 0) {
161
+ throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
162
+ }
163
+ if (!memberRoleId || memberRoleId.trim().length === 0) {
164
+ throw new chunkY3UJVC2L_cjs.PlolinkError("memberRoleId is required", "INVALID_PARAMS");
165
+ }
166
+ return this.client.axiosInstance.delete(
167
+ `/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`
168
+ );
169
+ }
170
+ /**
171
+ * 快捷授权人才模块(公司访问范围)
172
+ * POST /api/v1/teams/:teamId/members/:memberId/roles/talent
173
+ */
174
+ async quickGrantTalentAccess(teamId, memberId, params) {
175
+ if (!teamId || teamId.trim().length === 0) {
176
+ throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
177
+ }
178
+ if (!memberId || memberId.trim().length === 0) {
179
+ throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
180
+ }
181
+ const roleCode = params?.roleCode;
182
+ if (roleCode && roleCode !== "SUB_UNIT_VIEWER" && roleCode !== "SUB_UNIT_MANAGER") {
183
+ throw new chunkY3UJVC2L_cjs.PlolinkError(
184
+ "roleCode must be SUB_UNIT_VIEWER or SUB_UNIT_MANAGER",
185
+ "INVALID_PARAMS"
186
+ );
187
+ }
188
+ return this.client.axiosInstance.post(
189
+ `/api/v1/teams/${teamId}/members/${memberId}/roles/talent`,
190
+ params ?? {}
191
+ );
192
+ }
193
+ };
194
+
195
+ exports.Rbac = Rbac;
196
+ //# sourceMappingURL=index.cjs.map
197
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/rbac/index.ts"],"names":["PlolinkError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RBAC 模块 (Rbac)\n *\n * @description\n * 提供权限点、角色、成员角色分配等能力封装,覆盖后端 `docs/api/rbac.md` 中的核心接口:\n * - 获取权限点定义 + 系统角色定义\n * - 团队角色管理(系统角色列表 + 自定义角色 CRUD)\n * - 成员角色管理(查询/分配/更新数据范围/移除)\n * - 人才模块快捷授权(SUB_UNIT_VIEWER / SUB_UNIT_MANAGER)\n *\n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Team } from '@plolink/sdk/team';\n * import { Rbac } from '@plolink/sdk/rbac';\n * import { VirtualAccount } from '@plolink/sdk/virtual-account';\n *\n * const client = new PlolinkClient({ token: 'session-or-apikey' });\n * const virtualAccount = new VirtualAccount(client);\n * const team = new Team(client);\n * const rbac = new Rbac(client);\n *\n * const created = await virtualAccount.createVirtualAccount({\n * mode: 'EXISTING_TEAM',\n * teamId: 'team-123',\n * virtualAccountName: 'Bot'\n * });\n *\n * const members = await team.listTeamMembers(created.virtualAccount.virtualAccountTeamId);\n * const memberId = team.getMemberIdByUserId(members, created.virtualAccount.id);\n *\n * await rbac.assignMemberRole(created.virtualAccount.virtualAccountTeamId, memberId, {\n * roleType: 'SYSTEM',\n * roleCode: 'SUB_UNIT_VIEWER',\n * scopeType: 'TEAM'\n * });\n * ```\n *\n * @module rbac\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { PlolinkError } from '../../core/error';\nimport type {\n PermissionDefinitionsResponse,\n TeamRolesResponse,\n CreateCustomRoleParams,\n UpdateCustomRoleParams,\n CustomRoleInfo,\n DeleteRoleResult,\n MemberRoleListItem,\n MemberRoleRecord,\n UpdateMemberRoleScopeParams,\n QuickGrantTalentAccessParams,\n TeamRoleDetail,\n} from '../../types/rbac';\nimport type { AssignRoleParams } from '../../types/shared';\n\nexport type {\n PermissionDefinitionsResponse,\n TeamRolesResponse,\n CreateCustomRoleParams,\n UpdateCustomRoleParams,\n CustomRoleInfo,\n DeleteRoleResult,\n MemberRoleListItem,\n MemberRoleRecord,\n UpdateMemberRoleScopeParams,\n QuickGrantTalentAccessParams,\n TeamRoleDetail,\n} from '../../types/rbac';\n\nexport type { AssignRoleParams, RoleType, ScopeType } from '../../types/shared';\n\nexport class Rbac {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 获取所有权限点定义 + 系统角色定义\n * GET /api/v1/permissions\n */\n public async getPermissionDefinitions(): Promise<PermissionDefinitionsResponse> {\n return this.client.axiosInstance.get('/api/v1/permissions');\n }\n\n /**\n * 列出团队角色(系统角色 + 自定义角色)\n * GET /api/v1/teams/:teamId/roles\n */\n public async listTeamRoles(teamId: string): Promise<TeamRolesResponse> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles`);\n }\n\n /**\n * 创建自定义角色\n * POST /api/v1/teams/:teamId/roles\n */\n public async createCustomRole(teamId: string, params: CreateCustomRoleParams): Promise<CustomRoleInfo> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!params.name || params.name.trim().length === 0) {\n throw new PlolinkError('name is required and cannot be empty', 'INVALID_PARAMS');\n }\n if (!params.code || params.code.trim().length === 0) {\n throw new PlolinkError('code is required and cannot be empty', 'INVALID_PARAMS');\n }\n if (!Array.isArray(params.permissions)) {\n throw new PlolinkError('permissions must be an array', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.post(`/api/v1/teams/${teamId}/roles`, params);\n }\n\n /**\n * 更新自定义角色\n * PUT /api/v1/teams/:teamId/roles/:roleId\n */\n public async updateCustomRole(\n teamId: string,\n roleId: string,\n params: UpdateCustomRoleParams\n ): Promise<CustomRoleInfo> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!roleId || roleId.trim().length === 0) {\n throw new PlolinkError('roleId is required', 'INVALID_PARAMS');\n }\n\n // 允许部分更新,但如果传了 name 就要校验\n if (params.name !== undefined && params.name.trim().length === 0) {\n throw new PlolinkError('name cannot be empty', 'INVALID_PARAMS');\n }\n if (params.code !== undefined && params.code.trim().length === 0) {\n throw new PlolinkError('code cannot be empty', 'INVALID_PARAMS');\n }\n if (params.permissions !== undefined && !Array.isArray(params.permissions)) {\n throw new PlolinkError('permissions must be an array', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.put(`/api/v1/teams/${teamId}/roles/${roleId}`, params);\n }\n\n /**\n * 删除自定义角色\n * DELETE /api/v1/teams/:teamId/roles/:roleId?force=true\n */\n public async deleteCustomRole(\n teamId: string,\n roleId: string,\n options?: { force?: boolean }\n ): Promise<DeleteRoleResult> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!roleId || roleId.trim().length === 0) {\n throw new PlolinkError('roleId is required', 'INVALID_PARAMS');\n }\n const params = options?.force ? { force: 'true' } : undefined;\n return this.client.axiosInstance.delete(`/api/v1/teams/${teamId}/roles/${roleId}`, { params });\n }\n\n /**\n * 获取角色详情(系统角色或自定义角色)\n * GET /api/v1/teams/:teamId/roles/:roleId\n */\n public async getRoleDetail(teamId: string, roleId: string): Promise<TeamRoleDetail> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!roleId || roleId.trim().length === 0) {\n throw new PlolinkError('roleId is required', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles/${roleId}`);\n }\n\n /**\n * 获取成员的所有角色(带角色信息与权限)\n * GET /api/v1/teams/:teamId/members/:memberId/roles\n */\n public async listMemberRoles(teamId: string, memberId: string): Promise<MemberRoleListItem[]> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/members/${memberId}/roles`);\n }\n\n /**\n * 为成员分配角色(系统/自定义)及数据范围\n * POST /api/v1/teams/:teamId/members/:memberId/roles\n */\n public async assignMemberRole(\n teamId: string,\n memberId: string,\n params: AssignRoleParams\n ): Promise<MemberRoleRecord> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n\n // 最小校验(服务端也会校验;这里提前快速失败)\n if (params.roleType === 'SYSTEM' && (!params.roleCode || params.roleCode.trim().length === 0)) {\n throw new PlolinkError('roleCode is required when roleType is SYSTEM', 'INVALID_PARAMS');\n }\n if (params.roleType === 'CUSTOM' && (!params.roleId || params.roleId.trim().length === 0)) {\n throw new PlolinkError('roleId is required when roleType is CUSTOM', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.post(\n `/api/v1/teams/${teamId}/members/${memberId}/roles`,\n params\n );\n }\n\n /**\n * 更新成员角色的数据范围\n * PUT /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId\n */\n public async updateMemberRoleScope(\n teamId: string,\n memberId: string,\n memberRoleId: string,\n params: UpdateMemberRoleScopeParams\n ): Promise<MemberRoleRecord> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n if (!memberRoleId || memberRoleId.trim().length === 0) {\n throw new PlolinkError('memberRoleId is required', 'INVALID_PARAMS');\n }\n if (!params.scopeType || params.scopeType.trim().length === 0) {\n throw new PlolinkError('scopeType is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.put(\n `/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`,\n params\n );\n }\n\n /**\n * 移除成员角色\n * DELETE /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId\n */\n public async removeMemberRole(\n teamId: string,\n memberId: string,\n memberRoleId: string\n ): Promise<DeleteRoleResult> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n if (!memberRoleId || memberRoleId.trim().length === 0) {\n throw new PlolinkError('memberRoleId is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.delete(\n `/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`\n );\n }\n\n /**\n * 快捷授权人才模块(公司访问范围)\n * POST /api/v1/teams/:teamId/members/:memberId/roles/talent\n */\n public async quickGrantTalentAccess(\n teamId: string,\n memberId: string,\n params?: QuickGrantTalentAccessParams\n ): Promise<MemberRoleRecord> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n\n // 轻量校验 roleCode\n const roleCode = params?.roleCode;\n if (roleCode && roleCode !== 'SUB_UNIT_VIEWER' && roleCode !== 'SUB_UNIT_MANAGER') {\n throw new PlolinkError(\n 'roleCode must be SUB_UNIT_VIEWER or SUB_UNIT_MANAGER',\n 'INVALID_PARAMS'\n );\n }\n\n return this.client.axiosInstance.post(\n `/api/v1/teams/${teamId}/members/${memberId}/roles/talent`,\n params ?? {}\n );\n }\n}\n\n\n"]}