@tbox.cn/app-module-member 0.2.0 → 0.8.7

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 (63) hide show
  1. package/AGENTS.md +16 -0
  2. package/README.md +99 -11
  3. package/dist/chunk-EPQEF43P.js +1581 -0
  4. package/dist/chunk-QWGRWD5C.js +766 -0
  5. package/dist/client/index.d.ts +2 -2
  6. package/dist/client/index.js +1 -1
  7. package/dist/index.d.ts +2 -3
  8. package/dist/index.js +12 -2
  9. package/dist/member-372B74DY.css +1740 -0
  10. package/dist/server/index.d.ts +657 -286
  11. package/dist/server/index.js +11 -1
  12. package/package.json +25 -16
  13. package/skills/member/SKILL.md +141 -0
  14. package/skills/member/references/enrollment.md +34 -0
  15. package/skills/member/references/points-and-card.md +24 -0
  16. package/src/client/cards/index.ts +10 -0
  17. package/src/client/cards/member-card-summary/index.tsx +375 -0
  18. package/src/client/cards/member-enrollment-cta/index.tsx +61 -0
  19. package/src/client/cards/member-enrollment-form/index.tsx +181 -0
  20. package/src/client/cards/member-enrollment-status/index.tsx +65 -0
  21. package/src/client/cards/member-info/index.tsx +60 -0
  22. package/src/client/cards/member-login-cta/index.tsx +81 -0
  23. package/src/client/cards/member-point-usage-list/index.tsx +53 -0
  24. package/src/client/cards/view.ts +39 -0
  25. package/src/client/components/ImageWithFallback.tsx +38 -0
  26. package/src/client/index.ts +6 -4
  27. package/src/client/styles/member.css +1740 -0
  28. package/src/client/types/css.d.ts +2 -0
  29. package/src/server/action.ts +348 -0
  30. package/src/server/cards/index.ts +7 -7
  31. package/src/server/cards/member-card-summary/meta.ts +26 -5
  32. package/src/server/cards/member-card-summary/samples.ts +272 -0
  33. package/src/server/cards/member-enrollment-cta/meta.ts +19 -0
  34. package/src/server/cards/member-enrollment-form/meta.ts +10 -6
  35. package/src/server/cards/member-enrollment-status/meta.ts +5 -6
  36. package/src/server/cards/member-info/meta.ts +1 -1
  37. package/src/server/cards/member-login-cta/meta.ts +16 -0
  38. package/src/server/cards/member-point-usage-list/meta.ts +2 -3
  39. package/src/server/handler.ts +159 -119
  40. package/src/server/index.ts +129 -50
  41. package/src/server/ports.ts +66 -0
  42. package/src/server/service.ts +94 -80
  43. package/src/server/status.ts +87 -0
  44. package/src/server/subject-binding.ts +19 -0
  45. package/src/server/tool.ts +469 -99
  46. package/tbox.module.json +124 -0
  47. package/tests/cards-render.test.tsx +526 -0
  48. package/tests/enrollment.test.ts +121 -0
  49. package/tests/ports-resolve.test.ts +95 -0
  50. package/tests/preference-memory.test.ts +86 -0
  51. package/tests/samples.test.ts +61 -0
  52. package/tests/service.test.ts +593 -35
  53. package/tests/skills.test.ts +65 -0
  54. package/tests/snapshot-service.test.ts +75 -0
  55. package/tests/status.test.ts +127 -0
  56. package/tests/view.test.ts +33 -0
  57. package/tsup.config.ts +9 -1
  58. package/dist/chunk-JGZGLFO6.js +0 -111
  59. package/dist/chunk-ZV6B36AO.js +0 -613
  60. package/src/client/cards/index.tsx +0 -135
  61. package/src/server/cards/member-coupon-detail/meta.ts +0 -19
  62. package/src/server/cards/member-coupon-list/meta.ts +0 -18
  63. package/tbox.component.json +0 -28
@@ -0,0 +1,272 @@
1
+ /**
2
+ * member-card-summary 附加预览样本(沉淀自 mall dev-gallery 会员卡面画廊)。
3
+ *
4
+ * 方法论(迁移自画廊维护约定):
5
+ * - 覆盖基准是组件实际读取的 data 分支(四档 variant / 卡图缺失 / 外链失败 / 跑马灯文案 /
6
+ * 权益图标失败兜底 / 单条偏好 / 历史态),而非 sampleData 的形状;
7
+ * - 视觉等价的输入合并为一格,note 列全合并口径;
8
+ * - 样本即契约:data 必须 dataSchema 校验通过且无 shape 外键(tests/samples.test.ts 双断言)。
9
+ *
10
+ * 素材中立化(画廊时期权益图标指向厂商 CDN,模块样本按仓库铁律净化):
11
+ * - 卡面底图/积分规则长图:无网络依赖的内联 SVG data URI(画廊原实现随行);
12
+ * - 权益图标:内联 SVG 按变体分色——验证的是「图标配色压不压得住卡面底色」与四列网格
13
+ * 换行(低两档 14 项、高两档 15 项的数量差异照实铺),不是图标的图案还原度
14
+ * (真实图标由 provider 运行时下发;图案语义兜底归组件内 ImageWithFallback);
15
+ * - 卡图/图标的外链失败分支刻意保留 example.com 占位(该分支本身是合法预览态)。
16
+ */
17
+ import type { CardSample } from '@tbox.cn/app-contracts';
18
+ import type { MemberCardSummaryCardData } from '@tbox.cn/app-contracts-mall';
19
+
20
+ /** 卡面底图:底色随 variant 走(前三档浅底深字、black 深底浅字——与模块 CSS 叠字色配对) */
21
+ function cardFace(from: string, to: string): string {
22
+ // 真实卡图恒自带卡名与「我的积分」字样(labelsEmbedded 恒 true),前端只叠积分数字。
23
+ // 两块半透明色块代表那两行字的占位——不写真文字是为了不依赖 SVG 内的中文字体,
24
+ // 要判断的本来也只是「数字有没有压到图上已有元素」。`#` 在 data URI 里须写成 %23。
25
+ const marks
26
+ = '<rect x="58" y="52" width="210" height="42" rx="8" fill="%23000000" opacity="0.14"/>'
27
+ + '<rect x="58" y="130" width="132" height="26" rx="6" fill="%23000000" opacity="0.10"/>';
28
+ return 'data:image/svg+xml;utf8,'
29
+ + '<svg xmlns="http://www.w3.org/2000/svg" width="672" height="347">'
30
+ + '<defs><linearGradient id="f" x1="0" y1="0" x2="1" y2="1">'
31
+ + `<stop offset="0" stop-color="%23${from}"/><stop offset="1" stop-color="%23${to}"/>`
32
+ + '</linearGradient></defs>'
33
+ + '<rect width="672" height="347" fill="url(%23f)"/>'
34
+ + '<circle cx="548" cy="60" r="150" fill="%23ffffff" opacity="0.16"/>'
35
+ + marks
36
+ + '</svg>';
37
+ }
38
+
39
+ const FACE = {
40
+ blue: cardFace('dce8fb', 'aecdf5'),
41
+ silver: cardFace('eef1f7', 'c4cddf'),
42
+ gold: cardFace('f9ecca', 'e3c283'),
43
+ black: cardFace('1b1e26', '4a412c'),
44
+ };
45
+
46
+ /** 积分规则长图占位(弹层内容):只需一张有高度的图验证弹层滚动与关闭 */
47
+ const POINTS_RULE_IMAGE
48
+ = 'data:image/svg+xml;utf8,'
49
+ + '<svg xmlns="http://www.w3.org/2000/svg" width="750" height="1600">'
50
+ + '<rect width="750" height="1600" fill="%23fffdf8"/>'
51
+ + '<rect x="60" y="80" width="380" height="44" rx="10" fill="%23e2c78f"/>'
52
+ + '<rect x="60" y="180" width="630" height="24" rx="8" fill="%23ece7dd"/>'
53
+ + '<rect x="60" y="230" width="560" height="24" rx="8" fill="%23ece7dd"/>'
54
+ + '<rect x="60" y="280" width="610" height="24" rx="8" fill="%23ece7dd"/>'
55
+ + '<rect x="60" y="700" width="630" height="24" rx="8" fill="%23ece7dd"/>'
56
+ + '<rect x="60" y="1500" width="400" height="24" rx="8" fill="%23ece7dd"/>'
57
+ + '</svg>';
58
+
59
+ /**
60
+ * 权益图标占位(按变体分色):圆形徽标 + 随 benefitRef 稳定变化的几何图形。
61
+ * 同一项权益在四个等级下是不同颜色版本的图标——用同一套几何图形配四档配色,
62
+ * 保留「图标配色 vs 卡面底色」这一四档卡面唯一真正要比的东西。
63
+ */
64
+ const ICON_COLORS: Record<
65
+ NonNullable<MemberCardSummaryCardData['presentation']>['variant'],
66
+ { fg: string; bg: string }
67
+ > = {
68
+ blue: { fg: '254077', bg: 'dce8fb' },
69
+ silver: { fg: '303443', bg: 'e8ecf3' },
70
+ gold: { fg: '683d08', bg: 'f3e3b8' },
71
+ black: { fg: 'e9d7ac', bg: '2a2d35' },
72
+ };
73
+
74
+ function benefitIcon(variant: keyof typeof ICON_COLORS, benefitRef: string): string {
75
+ const { fg, bg } = ICON_COLORS[variant];
76
+ // 图形随 benefitRef 散列到四条分支(圆/环/方/三角)——同权益跨档同形、跨权益异形
77
+ let hash = 0;
78
+ for (const ch of benefitRef) hash = (hash * 31 + ch.charCodeAt(0)) >>> 0;
79
+ const shape = hash % 4;
80
+ const drawn =
81
+ shape === 0
82
+ ? `<circle cx="24" cy="24" r="10" fill="%23${fg}"/>`
83
+ : shape === 1
84
+ ? `<circle cx="24" cy="24" r="10" fill="none" stroke="%23${fg}" stroke-width="5"/>`
85
+ : shape === 2
86
+ ? `<rect x="15" y="15" width="18" height="18" rx="4" fill="%23${fg}"/>`
87
+ : `<path d="M24 12 L36 34 L12 34 Z" fill="%23${fg}"/>`;
88
+ return `data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48"><rect width="48" height="48" rx="12" fill="%23${bg}"/>${drawn}</svg>`;
89
+ }
90
+
91
+ /** 四档各自的完整权益列表(名称/顺序照画廊采集快照;低两档 14 项,高两档 15 项)。 */
92
+ function benefitsOf(variant: keyof typeof ICON_COLORS): NonNullable<MemberCardSummaryCardData['benefits']> {
93
+ const BASE_NAMES: ReadonlyArray<{ ref: string; name: string; description?: string }> = [
94
+ { ref: 'benefit:points', name: '消费积分' },
95
+ { ref: 'benefit:gifts', name: '积分换礼' },
96
+ { ref: 'benefit:events', name: '会员活动' },
97
+ { ref: 'benefit:express', name: '顺丰85折' },
98
+ { ref: 'benefit:points-parking', name: '积分兑停车' },
99
+ { ref: 'benefit:storage', name: '物品存储' },
100
+ { ref: 'benefit:care', name: '暖心守护' },
101
+ { ref: 'benefit:pet', name: '萌宠驿站' },
102
+ { ref: 'benefit:service', name: '专属客服' },
103
+ { ref: 'benefit:umbrella', name: '雨伞租借' },
104
+ { ref: 'benefit:wheelchair', name: '轮椅租借' },
105
+ { ref: 'benefit:stroller', name: '婴儿车租借' },
106
+ { ref: 'benefit:birthday', name: '生日礼遇' },
107
+ { ref: 'benefit:wifi', name: '免费WIFI' },
108
+ ];
109
+ const items = BASE_NAMES.map((b) => ({
110
+ benefitRef: b.ref,
111
+ name: b.name,
112
+ iconUrl: benefitIcon(variant, b.ref),
113
+ }));
114
+ // 高两档多出的正是停车那项(金:免 1 小时 / 黑:免 2 小时)——数量差异是卡面该体现的东西
115
+ if (variant === 'gold' || variant === 'black') {
116
+ return [
117
+ {
118
+ benefitRef: 'benefit:parking',
119
+ name: '免费停车',
120
+ iconUrl: benefitIcon(variant, 'benefit:parking'),
121
+ ...(variant === 'gold' ? { description: '可免1小时' } : { description: '可免2小时' }),
122
+ },
123
+ ...items,
124
+ ];
125
+ }
126
+ return items;
127
+ }
128
+
129
+ const PROGRESS_SHORT = {
130
+ daySpentCents: 12_345,
131
+ yearSpentCents: 500_000,
132
+ percent: 25,
133
+ message: '今日已消费123.45元',
134
+ };
135
+
136
+ export const samples: CardSample<MemberCardSummaryCardData>[] = [
137
+ {
138
+ label: '卡面·金卡',
139
+ note: '基准形态:卡名与「我的积分」由卡图自带,前端只叠积分数。带 pointsRuleImageUrl 时触发器是盖在卡图自印按钮上的透明热区(视觉上看不出,弹层态需手动点它)',
140
+ group: '会员卡面(四档 variant)',
141
+ data: {
142
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '金卡会员', status: 'active',
143
+ availablePoints: 860, cardImageUrl: FACE.gold, pointsRuleImageUrl: POINTS_RULE_IMAGE,
144
+ presentation: { variant: 'gold', labelsEmbedded: true },
145
+ progress: PROGRESS_SHORT, benefits: benefitsOf('gold'),
146
+ },
147
+ },
148
+ {
149
+ label: '卡面·蓝卡',
150
+ note: 'variant=blue(入门等级)——叠字对比度之外,权益 14 项且无「免费停车」,与金/黑的 15 项对照',
151
+ group: '会员卡面(四档 variant)',
152
+ data: {
153
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '悦享卡', status: 'active',
154
+ availablePoints: 120, cardImageUrl: FACE.blue,
155
+ presentation: { variant: 'blue', labelsEmbedded: true },
156
+ progress: { daySpentCents: 0, yearSpentCents: 8_800, percent: 4, message: '年累计已消费88.00元' },
157
+ benefits: benefitsOf('blue'),
158
+ },
159
+ },
160
+ {
161
+ label: '卡面·银卡',
162
+ note: 'variant=silver——浅底最容易压不住白字;权益同为 14 项,图标是银卡配色版',
163
+ group: '会员卡面(四档 variant)',
164
+ data: {
165
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '银卡会员', status: 'active',
166
+ availablePoints: 3_400, cardImageUrl: FACE.silver,
167
+ presentation: { variant: 'silver', labelsEmbedded: true },
168
+ progress: { daySpentCents: 4_500, yearSpentCents: 120_000, percent: 48, message: '今日已消费45.00元,年累计已消费1200.00元' },
169
+ benefits: benefitsOf('silver'),
170
+ },
171
+ },
172
+ {
173
+ label: '卡面·黑金卡',
174
+ note: 'variant=black(最高等级)——金色描边与深底的层次;15 项权益,免费停车带「可免2小时」说明',
175
+ group: '会员卡面(四档 variant)',
176
+ data: {
177
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '黑金会员', status: 'active',
178
+ availablePoints: 128_600, cardImageUrl: FACE.black,
179
+ presentation: { variant: 'black', labelsEmbedded: true },
180
+ progress: { daySpentCents: 98_800, yearSpentCents: 2_400_000, percent: 100, message: '年累计已消费24000.00元,已达最高等级' },
181
+ benefits: benefitsOf('black'),
182
+ },
183
+ },
184
+ {
185
+ label: '卡面·卡图缺失',
186
+ note: 'presentation 在但 cardImageUrl 缺省——退到渐变兜底底纹,叠字排布应不变',
187
+ group: '卡面素材分支',
188
+ data: {
189
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '金卡会员', status: 'active',
190
+ availablePoints: 860,
191
+ presentation: { variant: 'gold', labelsEmbedded: true },
192
+ progress: PROGRESS_SHORT, benefits: benefitsOf('gold'),
193
+ },
194
+ },
195
+ {
196
+ label: '卡面·外链加载失败',
197
+ note: '线上卡图 404 / 断网的实况——ImageWithFallback 占位不应把卡面撑变形',
198
+ group: '卡面素材分支',
199
+ data: {
200
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '金卡会员', status: 'active',
201
+ availablePoints: 860, cardImageUrl: 'https://assets.example.com/member/gold-card.png',
202
+ presentation: { variant: 'gold', labelsEmbedded: true },
203
+ progress: PROGRESS_SHORT, benefits: benefitsOf('gold'),
204
+ },
205
+ },
206
+ {
207
+ label: '卡面·进度长文案',
208
+ note: 'progress.message 超 24 字触发 --scroll 跑马灯;percent=0 时进度条应可见轨道',
209
+ group: '卡面素材分支',
210
+ data: {
211
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '金卡会员', status: 'active',
212
+ availablePoints: 860, cardImageUrl: FACE.gold,
213
+ presentation: { variant: 'gold', labelsEmbedded: true },
214
+ progress: {
215
+ daySpentCents: 0, yearSpentCents: 0, percent: 0,
216
+ message: '今年还没有消费记录,累计消费满5000.00元可升级为银卡会员',
217
+ },
218
+ benefits: benefitsOf('gold'),
219
+ },
220
+ },
221
+ {
222
+ label: '卡面·无进度无权益',
223
+ note: 'progress 与 benefits 同时缺省——只剩卡面 + 偏好引导,检查底部收口',
224
+ group: '卡面素材分支',
225
+ data: {
226
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '悦享卡', status: 'active',
227
+ availablePoints: 0, cardImageUrl: FACE.blue,
228
+ presentation: { variant: 'blue', labelsEmbedded: true },
229
+ },
230
+ },
231
+ {
232
+ label: '卡面·权益图标失败',
233
+ note: 'iconUrl 加载失败 → 按权益名匹配的兜底图标(停车/积分/活动/其它四条分支)',
234
+ group: '卡面素材分支',
235
+ data: {
236
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '金卡会员', status: 'active',
237
+ availablePoints: 860, cardImageUrl: FACE.gold,
238
+ presentation: { variant: 'gold', labelsEmbedded: true },
239
+ progress: PROGRESS_SHORT,
240
+ benefits: [
241
+ { benefitRef: 'b1', name: '免费停车', iconUrl: 'https://assets.example.com/x.png' },
242
+ { benefitRef: 'b2', name: '消费积分', iconUrl: 'https://assets.example.com/x.png' },
243
+ { benefitRef: 'b3', name: '会员活动', iconUrl: 'https://assets.example.com/x.png' },
244
+ { benefitRef: 'b4', name: '生日礼遇', iconUrl: 'https://assets.example.com/x.png' },
245
+ ],
246
+ },
247
+ },
248
+ {
249
+ label: '卡面·单条偏好',
250
+ note: 'preferencePrompts 显式给一项——缺省时组件兜底成 contracts 固定三项,单项时看按钮是否被拉伸',
251
+ group: '偏好引导分支',
252
+ data: {
253
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '金卡会员', status: 'active',
254
+ availablePoints: 860, cardImageUrl: FACE.gold,
255
+ presentation: { variant: 'gold', labelsEmbedded: true },
256
+ progress: PROGRESS_SHORT, benefits: benefitsOf('gold'),
257
+ preferencePrompts: [{ value: '我常来吃美食', query: '推荐值得去的餐饮美食门店' }],
258
+ },
259
+ },
260
+ {
261
+ label: '卡面·历史卡',
262
+ note: 'isHistory——偏好引导按钮全禁用(点了也不会发消息),卡面与权益区照常渲染',
263
+ group: '偏好引导分支',
264
+ data: {
265
+ userId: 'u_1001', cardRef: 'card:u_1001', cardDisplay: '金卡会员', status: 'active',
266
+ availablePoints: 860, cardImageUrl: FACE.gold,
267
+ presentation: { variant: 'gold', labelsEmbedded: true },
268
+ progress: PROGRESS_SHORT, benefits: benefitsOf('gold'),
269
+ },
270
+ isHistory: true,
271
+ },
272
+ ];
@@ -0,0 +1,19 @@
1
+ import type { CardMeta } from '@tbox.cn/app-contracts';
2
+ import { memberEnrollmentCtaCardDataSchema } from '@tbox.cn/app-contracts-mall';
3
+
4
+ const meta: CardMeta<typeof memberEnrollmentCtaCardDataSchema> = {
5
+ cardType: 'member-enrollment-cta',
6
+ dataSchema: memberEnrollmentCtaCardDataSchema,
7
+ displayName: '开卡入会',
8
+ description: '开卡入会引导卡——点击后跳转 alipays 链接完成入会',
9
+ sampleData: {
10
+ userId: 'u_1001',
11
+ authState: 'authenticated',
12
+ state: 'not_enrolled',
13
+ enrollUrl: 'alipays://platformapi/startapp?appId=demo&page=v/index/index',
14
+ title: '入会后继续',
15
+ },
16
+ schemaVersion: 2,
17
+ };
18
+
19
+ export default meta;
@@ -4,19 +4,23 @@ import { memberEnrollmentFormCardDataSchema } from '@tbox.cn/app-contracts-mall'
4
4
  const meta: CardMeta<typeof memberEnrollmentFormCardDataSchema> = {
5
5
  cardType: 'member-enrollment-form',
6
6
  dataSchema: memberEnrollmentFormCardDataSchema,
7
- allowedTools: ['queryEnrollmentForm'],
8
7
  displayName: '入会表单',
9
- description: '会员入会表单(写动作 member.enroll,grant 闭环)',
8
+ description: '会员入会表单(支付宝授权预填 + 手动降级;动作 member.request-alipay-authorization / member.enroll',
10
9
  sampleData: {
11
10
  userId: 'u_1001',
12
11
  state: 'not_enrolled',
12
+ formVersion: 'v2026.08',
13
13
  fields: [
14
- { fieldId: 'name', label: '姓名', required: true },
15
- { fieldId: 'phone', label: '手机号', required: true },
14
+ { fieldId: 'mobile', label: '手机号', type: 'tel', required: true, placeholder: '请输入手机号' },
15
+ { fieldId: 'displayName', label: '姓名', type: 'text', required: false },
16
16
  ],
17
- actionId: 'member.enroll',
17
+ consents: [
18
+ { consentId: 'privacy', version: '1', title: '隐私政策', required: true },
19
+ { consentId: 'membership-terms', version: '1', title: '会员服务条款', required: false },
20
+ ],
21
+ authorization: { status: 'required' },
18
22
  },
19
- schemaVersion: 1,
23
+ schemaVersion: 2,
20
24
  };
21
25
 
22
26
  export default meta;
@@ -4,16 +4,15 @@ import { memberEnrollmentStatusCardDataSchema } from '@tbox.cn/app-contracts-mal
4
4
  const meta: CardMeta<typeof memberEnrollmentStatusCardDataSchema> = {
5
5
  cardType: 'member-enrollment-status',
6
6
  dataSchema: memberEnrollmentStatusCardDataSchema,
7
- allowedTools: [],
8
7
  displayName: '入会状态',
9
- description: '入会结果状态(成功/失败 + 会员编号)',
8
+ description: '入会结果状态(pending 态附显式刷新按钮,动作 member.query-enrollment-status)',
10
9
  sampleData: {
11
10
  userId: 'u_1001',
12
- success: true,
13
- memberRef: 'member:u_1001',
14
- state: 'active',
11
+ attemptRef: 'att_1',
12
+ state: 'pending_confirmation',
13
+ message: '厂商确认中,可稍后再刷新',
15
14
  },
16
- schemaVersion: 1,
15
+ schemaVersion: 2,
17
16
  };
18
17
 
19
18
  export default meta;
@@ -4,11 +4,11 @@ import { memberInfoCardDataSchema } from '@tbox.cn/app-contracts-mall';
4
4
  const meta: CardMeta<typeof memberInfoCardDataSchema> = {
5
5
  cardType: 'member-info',
6
6
  dataSchema: memberInfoCardDataSchema,
7
- allowedTools: ['queryMemberInfo'],
8
7
  displayName: '会员信息',
9
8
  description: '会员账户状态与个人资料',
10
9
  sampleData: {
11
10
  userId: 'u_1001',
11
+ authState: 'authenticated',
12
12
  state: 'active',
13
13
  displayName: '示例会员',
14
14
  labels: [{ labelRef: 'member', name: '会员' }],
@@ -0,0 +1,16 @@
1
+ import type { CardMeta } from '@tbox.cn/app-contracts';
2
+ import { memberLoginCtaCardDataSchema } from '@tbox.cn/app-contracts-mall';
3
+
4
+ const meta: CardMeta<typeof memberLoginCtaCardDataSchema> = {
5
+ cardType: 'member-login-cta',
6
+ dataSchema: memberLoginCtaCardDataSchema,
7
+ displayName: '登录引导',
8
+ description: '未登录引导卡——点击跳转商场小程序登录页,登录后回到智能体继续',
9
+ sampleData: {
10
+ loginUrl: 'alipays://platformapi/startapp?appId=demo&page=v/login/index',
11
+ title: '登录后继续',
12
+ },
13
+ schemaVersion: 1,
14
+ };
15
+
16
+ export default meta;
@@ -4,13 +4,12 @@ import { memberPointUsageListCardDataSchema } from '@tbox.cn/app-contracts-mall'
4
4
  const meta: CardMeta<typeof memberPointUsageListCardDataSchema> = {
5
5
  cardType: 'member-point-usage-list',
6
6
  dataSchema: memberPointUsageListCardDataSchema,
7
- allowedTools: ['queryPoints'],
8
7
  displayName: '积分余额与流水',
9
- description: '会员积分余额、等级与变动流水(吸收教学 points 卡)',
8
+ description: '会员积分余额、厂商会员标签与变动流水(吸收教学 points 卡)',
10
9
  sampleData: {
11
10
  userId: 'u_1001',
12
11
  balance: 860,
13
- level: 'gold',
12
+ membershipLabel: '悦享卡',
14
13
  items: [{ usageRecordRef: 'r1', title: '消费奖励', amount: '+100', usedAt: '2026-08-13T00:00:00Z' }],
15
14
  total: 1,
16
15
  },