@gadmin2n/schematics 0.0.70 → 0.0.72

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 (28) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +21 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +9 -1
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package-lock.json +15579 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -3
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +16 -4
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +2 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.controller.ts +106 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.module.ts +10 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +569 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +1159 -481
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.env +1 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +1 -1
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +130 -3
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +5 -5
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +2 -2
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +15 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -43
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +1 -1
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -4
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -4
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +536 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +671 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +9 -60
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +2 -2
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +3 -1
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +11 -11
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +12 -0
  28. package/package.json +1 -1
@@ -1 +1,2 @@
1
1
  VITE_BACKEND_URL=http://localhost:8000
2
+ VITE_AGENT_BASE_URL=https://knot.woa.com
@@ -10,7 +10,7 @@
10
10
  "@dnd-kit/modifiers": "^9.0.0",
11
11
  "@dnd-kit/sortable": "^7.0.2",
12
12
  "@dnd-kit/utilities": "^3.2.2",
13
- "@gadmin2n/react-common": "^0.0.61",
13
+ "@gadmin2n/react-common": "^0.0.62",
14
14
  "@monaco-editor/react": "^4.7.0",
15
15
  "@refinedev/antd": "^5.47.0",
16
16
  "@refinedev/cli": "^2.16.51",
@@ -123,6 +123,15 @@ export const SKILL_MENU_CONFIG: Record<string, InspectorAction[]> = {
123
123
  skill: null,
124
124
  actionKey: 'deleteData',
125
125
  },
126
+ {
127
+ label: '管理定时任务',
128
+ skill: 'cron-job-management',
129
+ requiresInput: true,
130
+ inputPlaceholder:
131
+ '请描述定时任务需求,例如:\n- 新增每天凌晨 2 点执行的数据同步任务(cron: 0 2 * * *)\n- 修改 sync-data 任务的执行频率为每 30 分钟一次\n- 取消/删除 cleanup-expired-tokens 任务',
132
+ promptSuffix:
133
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
134
+ },
126
135
  ],
127
136
 
128
137
  /** 表单页(create / edit)专属操作 */
@@ -133,6 +142,8 @@ export const SKILL_MENU_CONFIG: Record<string, InspectorAction[]> = {
133
142
  requiresInput: true,
134
143
  inputPlaceholder:
135
144
  '请描述步骤划分,例如:\n第一步:基本信息(名称、类型)\n第二步:配置参数\n第三步:确认提交',
145
+ promptSuffix:
146
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
136
147
  },
137
148
  {
138
149
  label: "将创建页改为'只编辑不新增'",
@@ -147,6 +158,8 @@ export const SKILL_MENU_CONFIG: Record<string, InspectorAction[]> = {
147
158
  requiresInput: true,
148
159
  inputPlaceholder:
149
160
  '请描述保存后的行为,例如:\n- 显示"保存成功"提示后跳转回列表页\n- 弹窗显示提交编号,关闭后留在当前页',
161
+ promptSuffix:
162
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
150
163
  },
151
164
  {
152
165
  label: '在表单顶部添加说明横幅',
@@ -154,6 +167,8 @@ export const SKILL_MENU_CONFIG: Record<string, InspectorAction[]> = {
154
167
  requiresInput: true,
155
168
  inputPlaceholder:
156
169
  '请输入横幅说明文字,例如:\n此表单提交后不可修改,请仔细核对后再提交。',
170
+ promptSuffix:
171
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
157
172
  },
158
173
  {
159
174
  label: '在表单底部添加文档链接',
@@ -161,6 +176,8 @@ export const SKILL_MENU_CONFIG: Record<string, InspectorAction[]> = {
161
176
  requiresInput: true,
162
177
  inputPlaceholder:
163
178
  '请提供链接文字和 URL,例如:\n链接文字"查看配置文档",URL: https://docs.example.com\n链接文字"权限申请指引",URL: https://wiki.example.com/permissions',
179
+ promptSuffix:
180
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
164
181
  },
165
182
  {
166
183
  label: '表单根据当前业务隔离数据',
@@ -222,6 +239,8 @@ export function getInspectorActions(
222
239
  requiresInput: true,
223
240
  inputPlaceholder:
224
241
  '请描述样式要求,例如:用颜色区分状态,ACTIVE 显示绿色,INACTIVE 显示红色',
242
+ promptSuffix:
243
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
225
244
  },
226
245
  {
227
246
  label: '修改表头描述(label)',
@@ -230,6 +249,8 @@ export function getInspectorActions(
230
249
  requiresInput: true,
231
250
  inputPlaceholder:
232
251
  '请分别提供中文和英文名称,例如:\n中文:审核状态\n英文:Review Status\n(翻译 key:resources.{resourceName}.fields.{fieldName})',
252
+ promptSuffix:
253
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
233
254
  },
234
255
  {
235
256
  label: '固定列',
@@ -237,6 +258,8 @@ export function getInspectorActions(
237
258
  promptTemplate: `将 ${col(r, f)} 固定到左侧/右侧`,
238
259
  requiresInput: true,
239
260
  inputPlaceholder: '请指定固定方向:左 / 右',
261
+ promptSuffix:
262
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
240
263
  },
241
264
  {
242
265
  label: '支持行内编辑',
@@ -292,6 +315,8 @@ export function getInspectorActions(
292
315
  requiresInput: true,
293
316
  inputPlaceholder:
294
317
  '请描述要添加的关联字段,例如:添加 author.name 作者姓名',
318
+ promptSuffix:
319
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
295
320
  },
296
321
  {
297
322
  label: '自定义',
@@ -300,6 +325,8 @@ export function getInspectorActions(
300
325
  promptTemplate: `对 ${r} 列表中的 "${f}" 列进行修改`,
301
326
  promptPrefix: '要求:\n',
302
327
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
328
+ promptSuffix:
329
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
303
330
  },
304
331
  ];
305
332
 
@@ -326,6 +353,8 @@ export function getInspectorActions(
326
353
  requiresInput: true,
327
354
  inputPlaceholder:
328
355
  '请分别提供中文和英文名称,例如:\n中文:游戏名称\n英文:Game Name\n(翻译 key:resources.{resourceName}.fields.{fieldName})',
356
+ promptSuffix:
357
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
329
358
  },
330
359
  {
331
360
  label: '字段旁添加帮助提示(含链接)',
@@ -334,6 +363,8 @@ export function getInspectorActions(
334
363
  requiresInput: true,
335
364
  inputPlaceholder:
336
365
  '请描述提示内容,例如:\n提示文字"详见配置文档",链接 https://docs.example.com\n或纯文字:此字段用于关联上游系统的唯一标识',
366
+ promptSuffix:
367
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
337
368
  },
338
369
  {
339
370
  label: '字段联动(显/隐)',
@@ -342,6 +373,8 @@ export function getInspectorActions(
342
373
  requiresInput: true,
343
374
  inputPlaceholder:
344
375
  '请描述联动条件,例如:当"类型"字段值为"高级"时才显示此字段',
376
+ promptSuffix:
377
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
345
378
  },
346
379
  {
347
380
  label: '自定义校验逻辑',
@@ -349,6 +382,8 @@ export function getInspectorActions(
349
382
  promptTemplate: `为 ${formF(r, f)} 添加自定义校验规则`,
350
383
  requiresInput: true,
351
384
  inputPlaceholder: '请描述校验规则,例如:必须是正整数且不超过 100',
385
+ promptSuffix:
386
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
352
387
  },
353
388
  {
354
389
  label: '改为级联选择器',
@@ -357,6 +392,8 @@ export function getInspectorActions(
357
392
  requiresInput: true,
358
393
  inputPlaceholder:
359
394
  '请描述级联层级和数据来源,例如:省 → 市 → 区,数据来自 /api/regions',
395
+ promptSuffix:
396
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
360
397
  },
361
398
  {
362
399
  label: '改为自动补全输入方式',
@@ -372,6 +409,8 @@ export function getInspectorActions(
372
409
  requiresInput: true,
373
410
  inputPlaceholder:
374
411
  '请说明要改为什么控件类型,例如:改为下拉选择(Select DRAFT|PUBLISHED)、改为开关(Boolean)、改为多行文本(Text)、改为数字输入框(Number)',
412
+ promptSuffix:
413
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
375
414
  },
376
415
  {
377
416
  label: '在其后面添加输入字段',
@@ -392,6 +431,8 @@ export function getInspectorActions(
392
431
  requiresInput: true,
393
432
  inputPlaceholder:
394
433
  '请描述数据来源接口,例如:从 /api/games 加载游戏列表作为下拉选项',
434
+ promptSuffix:
435
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
395
436
  },
396
437
  {
397
438
  label: '提交前/回填时转换字段数据',
@@ -400,6 +441,8 @@ export function getInspectorActions(
400
441
  requiresInput: true,
401
442
  inputPlaceholder:
402
443
  '请描述转换规则,例如:提交前将数组转为逗号分隔字符串,回填时再拆回数组',
444
+ promptSuffix:
445
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
403
446
  },
404
447
  {
405
448
  label: '自定义',
@@ -408,6 +451,8 @@ export function getInspectorActions(
408
451
  promptTemplate: `对 ${r} 表单中的 "${f}" 字段进行修改`,
409
452
  promptPrefix: '要求:\n',
410
453
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
454
+ promptSuffix:
455
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
411
456
  },
412
457
  ];
413
458
 
@@ -427,6 +472,8 @@ export function getInspectorActions(
427
472
  requiresInput: true,
428
473
  inputPlaceholder:
429
474
  '请描述样式要求,例如:将 JSON 格式化展示,或用颜色标签渲染状态',
475
+ promptSuffix:
476
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
430
477
  },
431
478
  {
432
479
  label: '修改描述(label)',
@@ -435,6 +482,8 @@ export function getInspectorActions(
435
482
  requiresInput: true,
436
483
  inputPlaceholder:
437
484
  '请分别提供中文和英文名称,例如:\n中文:审核状态\n英文:Review Status\n(翻译 key:resources.{resourceName}.fields.{fieldName})',
485
+ promptSuffix:
486
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
438
487
  },
439
488
  {
440
489
  label: '在其后面添加展示字段',
@@ -455,6 +504,8 @@ export function getInspectorActions(
455
504
  promptTemplate: `对 ${r} 详情页的 "${f}" 字段进行修改`,
456
505
  promptPrefix: '要求:\n',
457
506
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
507
+ promptSuffix:
508
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
458
509
  },
459
510
  ];
460
511
 
@@ -466,6 +517,8 @@ export function getInspectorActions(
466
517
  promptTemplate: `为 ${r} 搜索栏添加模糊匹配过滤(通过修改ui配置)`,
467
518
  requiresInput: true,
468
519
  inputPlaceholder: '请填写要添加模糊搜索的字段名,例如:name、title',
520
+ promptSuffix:
521
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
469
522
  },
470
523
  {
471
524
  label: '增加 下拉 过滤',
@@ -474,6 +527,8 @@ export function getInspectorActions(
474
527
  requiresInput: true,
475
528
  inputPlaceholder:
476
529
  '请填写字段名及选项来源,例如:字段 status,选项 ACTIVE|INACTIVE;或字段 gameId,选项来自关联表 game 的 name 字段',
530
+ promptSuffix:
531
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
477
532
  },
478
533
  {
479
534
  label: '增加 checkbox 过滤',
@@ -482,6 +537,8 @@ export function getInspectorActions(
482
537
  requiresInput: true,
483
538
  inputPlaceholder:
484
539
  '请填写字段名及选项,例如:字段 category,选项:技术|产品|运营',
540
+ promptSuffix:
541
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
485
542
  },
486
543
  {
487
544
  label: '增加 radio 过滤',
@@ -490,6 +547,8 @@ export function getInspectorActions(
490
547
  requiresInput: true,
491
548
  inputPlaceholder:
492
549
  '请填写字段名及选项,例如:字段 type,选项:全部|在线|离线',
550
+ promptSuffix:
551
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
493
552
  },
494
553
  {
495
554
  label: '添加固定过滤(不可清除)',
@@ -498,6 +557,8 @@ export function getInspectorActions(
498
557
  requiresInput: true,
499
558
  inputPlaceholder:
500
559
  '请描述固定过滤条件,例如:始终只显示 status=ACTIVE 的数据,或按当前用户 ID 过滤',
560
+ promptSuffix:
561
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
501
562
  },
502
563
  {
503
564
  label: '移除 过滤字段',
@@ -505,6 +566,8 @@ export function getInspectorActions(
505
566
  promptTemplate: `从 ${r} 搜索栏删除过滤字段`,
506
567
  requiresInput: true,
507
568
  inputPlaceholder: '请填写要删除的过滤字段名',
569
+ promptSuffix:
570
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
508
571
  },
509
572
  {
510
573
  label: '修改描述(label)',
@@ -513,6 +576,8 @@ export function getInspectorActions(
513
576
  requiresInput: true,
514
577
  inputPlaceholder:
515
578
  '请填写字段名,并分别提供中文和英文名称,例如:\n字段:status\n中文:审核状态\n英文:Review Status\n(翻译 key:resources.{resourceName}.fields.{fieldName})',
579
+ promptSuffix:
580
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
516
581
  },
517
582
  {
518
583
  label: '自定义',
@@ -521,6 +586,8 @@ export function getInspectorActions(
521
586
  promptTemplate: `对 ${r} 列表页的搜索栏进行修改`,
522
587
  promptPrefix: '要求:\n',
523
588
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
589
+ promptSuffix:
590
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
524
591
  },
525
592
  ];
526
593
 
@@ -537,6 +604,8 @@ export function getInspectorActions(
537
604
  requiresInput: true,
538
605
  inputPlaceholder:
539
606
  '请描述显示条件,例如:仅角色为 GPU_ADMIN 时才显示新建按钮',
607
+ promptSuffix:
608
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
540
609
  },
541
610
  {
542
611
  label: '修改描述(label)',
@@ -545,6 +614,8 @@ export function getInspectorActions(
545
614
  requiresInput: true,
546
615
  inputPlaceholder:
547
616
  '请分别提供中文和英文,例如:\n中文:新建游戏\n英文:Create Game',
617
+ promptSuffix:
618
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
548
619
  },
549
620
  {
550
621
  label: '移除',
@@ -565,6 +636,8 @@ export function getInspectorActions(
565
636
  promptTemplate: `为 ${r} 列表页工具栏添加按条件显示的 导入按钮`,
566
637
  requiresInput: true,
567
638
  inputPlaceholder: '请描述显示条件',
639
+ promptSuffix:
640
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
568
641
  },
569
642
  {
570
643
  label: '修改描述(label)',
@@ -572,6 +645,8 @@ export function getInspectorActions(
572
645
  promptTemplate: `修改 ${r} 列表页工具栏导入按钮的显示名称(通过 i18n 翻译文件)`,
573
646
  requiresInput: true,
574
647
  inputPlaceholder: '请分别提供中文和英文',
648
+ promptSuffix:
649
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
575
650
  },
576
651
  {
577
652
  label: '移除',
@@ -598,6 +673,8 @@ export function getInspectorActions(
598
673
  promptTemplate: `为 ${r} 列表页工具栏添加按条件显示的 导出按钮`,
599
674
  requiresInput: true,
600
675
  inputPlaceholder: '请描述显示条件',
676
+ promptSuffix:
677
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
601
678
  },
602
679
  {
603
680
  label: '修改描述(label)',
@@ -605,6 +682,8 @@ export function getInspectorActions(
605
682
  promptTemplate: `修改 ${r} 列表页工具栏导出按钮的显示名称(通过 i18n 翻译文件)`,
606
683
  requiresInput: true,
607
684
  inputPlaceholder: '请分别提供中文和英文',
685
+ promptSuffix:
686
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
608
687
  },
609
688
  {
610
689
  label: '移除',
@@ -638,6 +717,8 @@ export function getInspectorActions(
638
717
  promptTemplate: `修改 ${r} 列表页工具栏刷新按钮的显示名称(通过 i18n 翻译文件)`,
639
718
  requiresInput: true,
640
719
  inputPlaceholder: '请分别提供中文和英文',
720
+ promptSuffix:
721
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
641
722
  },
642
723
  {
643
724
  label: '移除',
@@ -668,7 +749,7 @@ export function getInspectorActions(
668
749
  requiresInput: true,
669
750
  promptTemplate: `对 ${r} 列表页的工具栏区域(ListPageHeader 组件)进行修改`,
670
751
  promptPrefix: '要求:\n',
671
- promptSuffix: `注意:ListPageHeader 是公共组件,不可直接修改其源码。\n请优先通过调整列表页中 ListPageHeader 的 render props 来实现;\n如果 render props 无法满足需求,再在列表页内创建局部组件来替代。`,
752
+ promptSuffix: `注意:ListPageHeader 是公共组件,不可直接修改其源码。\n请优先通过调整列表页中 ListPageHeader 的 render props 来实现;\n如果 render props 无法满足需求,再在列表页内创建局部组件来替代。\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动`,
672
753
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
673
754
  },
674
755
  ];
@@ -684,6 +765,8 @@ export function getInspectorActions(
684
765
  '请描述按钮的名称、修改的状态字段和变更目标的值,例如:添加"发布"按钮,将 status 字段从 PENDING 改为 APPROVED' +
685
766
  '\n或者\n' +
686
767
  '请描述按钮名称和要调用的接口,例如:添加"审核"按钮,点击后调用 POST /api/approve/:id',
768
+ promptSuffix:
769
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
687
770
  },
688
771
  {
689
772
  label: '添加 跳转至外部链接 按钮',
@@ -692,6 +775,8 @@ export function getInspectorActions(
692
775
  requiresInput: true,
693
776
  inputPlaceholder:
694
777
  '请描述按钮名称和跳转目标,例如:添加"查看报表"按钮,跳转到 /reports/:id',
778
+ promptSuffix:
779
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
695
780
  },
696
781
  {
697
782
  label: '添加 跳转至站内页面 按钮',
@@ -700,6 +785,8 @@ export function getInspectorActions(
700
785
  requiresInput: true,
701
786
  inputPlaceholder:
702
787
  '请描述按钮名称和目标页面,例如:添加"查看详情"按钮,跳转到 /orders/:id/detail',
788
+ promptSuffix:
789
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
703
790
  },
704
791
  {
705
792
  label: '按条件显示 编辑 按钮 ',
@@ -708,6 +795,8 @@ export function getInspectorActions(
708
795
  requiresInput: true,
709
796
  inputPlaceholder:
710
797
  '请描述隐藏条件,例如:当 status 为 PUBLISHED 时隐藏 编辑 按钮',
798
+ promptSuffix:
799
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
711
800
  },
712
801
  {
713
802
  label: '自定义',
@@ -715,7 +804,7 @@ export function getInspectorActions(
715
804
  requiresInput: true,
716
805
  promptTemplate: `对 ${r} 列表页的行操作区域(RowActions 组件)进行修改`,
717
806
  promptPrefix: '要求:\n',
718
- promptSuffix: `注意:RowActions 是公共组件,不可直接修改其源码。\n请优先通过调整列表页中 RowActions 的 render props 来实现;\n如果 render props 无法满足需求,再在列表页内创建局部组件来替代。`,
807
+ promptSuffix: `注意:RowActions 是公共组件,不可直接修改其源码。\n请优先通过调整列表页中 RowActions 的 render props 来实现;\n如果 render props 无法满足需求,再在列表页内创建局部组件来替代。\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动`,
719
808
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
720
809
  },
721
810
  ];
@@ -753,6 +842,8 @@ export function getInspectorActions(
753
842
  requiresInput: true,
754
843
  inputPlaceholder:
755
844
  '请描述要批量修改的字段和固定值,例如:将 status 批量设为 PUBLISHED',
845
+ promptSuffix:
846
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
756
847
  },
757
848
  {
758
849
  label: '添加(用户输入)',
@@ -761,6 +852,8 @@ export function getInspectorActions(
761
852
  requiresInput: true,
762
853
  inputPlaceholder:
763
854
  '请描述要批量编辑的字段,例如:让用户输入 remark 后批量更新',
855
+ promptSuffix:
856
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
764
857
  },
765
858
  {
766
859
  label: '移除',
@@ -797,7 +890,7 @@ export function getInspectorActions(
797
890
  requiresInput: true,
798
891
  promptTemplate: `对 ${r} 列表页的批量操作区域(BulkActions 组件)进行修改`,
799
892
  promptPrefix: '要求:\n',
800
- promptSuffix: `注意:BulkActions 是公共组件,不可直接修改其源码。\n请优先通过调整列表页中 BulkActions 的 render props(如 renderDeleteButton、extraActions 等)来实现;\n如果 render props 无法满足需求,再在列表页内创建局部组件来替代。`,
893
+ promptSuffix: `注意:BulkActions 是公共组件,不可直接修改其源码。\n请优先通过调整列表页中 BulkActions 的 render props(如 renderDeleteButton、extraActions 等)来实现;\n如果 render props 无法满足需求,再在列表页内创建局部组件来替代。\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动`,
801
894
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
802
895
  },
803
896
  ];
@@ -811,6 +904,8 @@ export function getInspectorActions(
811
904
  requiresInput: true,
812
905
  inputPlaceholder:
813
906
  '请描述修改内容,例如:\n- 改为"xxx 管理后台"\n- 隐藏标题只保留 Logo',
907
+ promptSuffix:
908
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
814
909
  },
815
910
  {
816
911
  label: '修改Logo',
@@ -819,6 +914,8 @@ export function getInspectorActions(
819
914
  requiresInput: true,
820
915
  inputPlaceholder:
821
916
  '请描述修改内容,例如:\n- 替换为图片 Logo(提供图片路径或 URL)\n- 修改 Logo 颜色\n- 隐藏 Logo',
917
+ promptSuffix:
918
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
822
919
  },
823
920
  {
824
921
  label: '自定义',
@@ -827,6 +924,8 @@ export function getInspectorActions(
827
924
  promptTemplate: `对页面标题和 Logo 区域进行修改`,
828
925
  promptPrefix: '要求:\n',
829
926
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
927
+ promptSuffix:
928
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
830
929
  },
831
930
  ];
832
931
 
@@ -839,6 +938,8 @@ export function getInspectorActions(
839
938
  requiresInput: true,
840
939
  inputPlaceholder:
841
940
  '请描述修改内容,例如:\n- 隐藏选择器\n- 修改宽度为 200px\n- 默认选中第一项',
941
+ promptSuffix:
942
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
842
943
  },
843
944
  {
844
945
  label: '修改语言切换',
@@ -847,6 +948,8 @@ export function getInspectorActions(
847
948
  requiresInput: true,
848
949
  inputPlaceholder:
849
950
  '请描述修改内容,例如:\n- 隐藏语言切换\n- 只保留中文,移除多语言切换',
951
+ promptSuffix:
952
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
850
953
  },
851
954
  {
852
955
  label: '修改用户信息(头像/用户名)',
@@ -855,6 +958,8 @@ export function getInspectorActions(
855
958
  requiresInput: true,
856
959
  inputPlaceholder:
857
960
  '请描述修改内容,例如:\n- 隐藏用户名,只显示头像\n- 隐藏头像和用户名\n- 点击用户名跳转到个人主页',
961
+ promptSuffix:
962
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
858
963
  },
859
964
  {
860
965
  label: '修改整体样式',
@@ -863,6 +968,8 @@ export function getInspectorActions(
863
968
  requiresInput: true,
864
969
  inputPlaceholder:
865
970
  '请描述修改内容,例如:\n- 背景色改为深色 #001529\n- 高度改为 48px\n- 左侧添加系统标题文字',
971
+ promptSuffix:
972
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
866
973
  },
867
974
  {
868
975
  label: '自定义',
@@ -871,6 +978,8 @@ export function getInspectorActions(
871
978
  promptTemplate: `对顶部导航栏(App Header 组件)进行修改`,
872
979
  promptPrefix: '要求:\n',
873
980
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
981
+ promptSuffix:
982
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
874
983
  },
875
984
  ];
876
985
 
@@ -887,6 +996,8 @@ export function getInspectorActions(
887
996
  requiresInput: true,
888
997
  inputPlaceholder:
889
998
  '请描述显示条件,例如:仅角色为 ADMIN 时才显示编辑按钮',
999
+ promptSuffix:
1000
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
890
1001
  },
891
1002
  {
892
1003
  label: '修改描述(label)',
@@ -895,6 +1006,8 @@ export function getInspectorActions(
895
1006
  requiresInput: true,
896
1007
  inputPlaceholder:
897
1008
  '请分别提供中文和英文,例如:\n中文:修改\n英文:Edit',
1009
+ promptSuffix:
1010
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
898
1011
  },
899
1012
  {
900
1013
  label: '移除',
@@ -922,6 +1035,8 @@ export function getInspectorActions(
922
1035
  promptTemplate: `为 ${r} 详情页复制按钮添加条件显示逻辑`,
923
1036
  requiresInput: true,
924
1037
  inputPlaceholder: '请描述显示条件',
1038
+ promptSuffix:
1039
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
925
1040
  },
926
1041
  {
927
1042
  label: '修改描述(label)',
@@ -930,6 +1045,8 @@ export function getInspectorActions(
930
1045
  requiresInput: true,
931
1046
  inputPlaceholder:
932
1047
  '请分别提供中文和英文,例如:\n中文:复制\n英文:Clone',
1048
+ promptSuffix:
1049
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
933
1050
  },
934
1051
  {
935
1052
  label: '移除',
@@ -951,6 +1068,8 @@ export function getInspectorActions(
951
1068
  requiresInput: true,
952
1069
  inputPlaceholder:
953
1070
  '请描述显示条件,例如:当 status 为 PUBLISHED 时隐藏删除按钮',
1071
+ promptSuffix:
1072
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
954
1073
  },
955
1074
  {
956
1075
  label: '修改描述(label)',
@@ -959,6 +1078,8 @@ export function getInspectorActions(
959
1078
  requiresInput: true,
960
1079
  inputPlaceholder:
961
1080
  '请分别提供中文和英文,例如:\n中文:删除\n英文:Delete',
1081
+ promptSuffix:
1082
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
962
1083
  },
963
1084
  {
964
1085
  label: '移除',
@@ -987,6 +1108,8 @@ export function getInspectorActions(
987
1108
  requiresInput: true,
988
1109
  inputPlaceholder:
989
1110
  '请分别提供中文和英文,例如:\n中文:刷新\n英文:Refresh',
1111
+ promptSuffix:
1112
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
990
1113
  },
991
1114
  {
992
1115
  label: '移除',
@@ -1005,6 +1128,8 @@ export function getInspectorActions(
1005
1128
  requiresInput: true,
1006
1129
  inputPlaceholder:
1007
1130
  '请描述按钮名称和要调用的接口,例如:添加"审核通过"按钮,点击后调用 POST /api/approve/:id',
1131
+ promptSuffix:
1132
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
1008
1133
  },
1009
1134
  {
1010
1135
  label: '全只读模式(移除所有写操作)',
@@ -1020,6 +1145,8 @@ export function getInspectorActions(
1020
1145
  promptTemplate: `对 ${r} 详情页的操作工具栏(show header 区域)进行修改`,
1021
1146
  promptPrefix: '要求:\n',
1022
1147
  inputPlaceholder: '请描述你希望 AI 执行的自定义操作',
1148
+ promptSuffix:
1149
+ '\n你先理解下这个需求,然后找我澄清需求(非技术方案),我确认后再行动',
1023
1150
  },
1024
1151
  ];
1025
1152
 
@@ -60,7 +60,7 @@ export interface NumCardProps {
60
60
  /** 左侧数字区固定宽度(仅 withChart variant) */
61
61
  numWidth?: number;
62
62
  /** 显示折线图坐标轴(仅 withChart variant,默认 false) */
63
- showAxes?: boolean;
63
+ showAxis?: boolean;
64
64
  /** 智能 Y 轴范围(仅 withChart variant,默认 false) */
65
65
  smartYAxis?: boolean;
66
66
  /** 卡片顶部 header 插槽(仅 withChart variant) */
@@ -163,7 +163,7 @@ export const NumCard: React.FC<NumCardProps> = ({
163
163
  chartTestId,
164
164
  contentHeight = 100,
165
165
  numWidth,
166
- showAxes = false,
166
+ showAxis = false,
167
167
  smartYAxis,
168
168
  header,
169
169
  metricId,
@@ -325,7 +325,7 @@ export const NumCard: React.FC<NumCardProps> = ({
325
325
 
326
326
  // ── withChart variant:左数字 + 右折线图 ─────────────────────────────────
327
327
  if (variant === 'withChart' && showChart) {
328
- const chartAxisProps = showAxes
328
+ const chartAxisProps = showAxis
329
329
  ? {
330
330
  grid: {
331
331
  top: 8,
@@ -436,7 +436,7 @@ export const NumCard: React.FC<NumCardProps> = ({
436
436
  smooth
437
437
  area
438
438
  showGrid={false}
439
- showAxis={showAxes}
439
+ showAxis={showAxis}
440
440
  data={chartData ?? []}
441
441
  unit={typeof unit === 'string' ? unit : ''}
442
442
  height="80%"
@@ -484,7 +484,7 @@ export const NumCard: React.FC<NumCardProps> = ({
484
484
  height: '100%',
485
485
  display: 'flex',
486
486
  flexDirection: 'column',
487
- justifyContent: 'center',
487
+ justifyContent: 'flex-start',
488
488
  ...subStyles?.container,
489
489
  },
490
490
  }}
@@ -20,7 +20,7 @@ export interface NumLineCardProps {
20
20
  chartProps?: Record<string, any>;
21
21
  chartTestId?: string;
22
22
  smartYAxis?: boolean;
23
- showAxes?: boolean;
23
+ showAxis?: boolean;
24
24
  contentHeight?: number;
25
25
  numWidth?: number;
26
26
  loading?: boolean;
@@ -51,7 +51,7 @@ export const NumLineCard: React.FC<NumLineCardProps> = (props) => {
51
51
  chartProps={props.chartProps}
52
52
  chartTestId={props.chartTestId}
53
53
  smartYAxis={props.smartYAxis}
54
- showAxes={props.showAxes}
54
+ showAxis={props.showAxis}
55
55
  contentHeight={props.contentHeight}
56
56
  numWidth={props.numWidth}
57
57
  loading={props.loading}
@@ -276,6 +276,21 @@ export const routeRegistry: Record<string, RouteEntry> = {
276
276
  },
277
277
  },
278
278
  },
279
+ // Agenda Jobs — sortOrder 1080, code: admin.agenda
280
+ agenda: {
281
+ path: 'agenda-jobs',
282
+ children: {
283
+ list: {
284
+ path: '',
285
+ index: true,
286
+ component: lazy(() => import('routes/agenda')),
287
+ },
288
+ show: {
289
+ path: 'show/:jobName',
290
+ component: lazy(() => import('routes/agenda/show')),
291
+ },
292
+ },
293
+ },
279
294
  // 操作日志 — sortOrder 1070, code: admin.audit
280
295
  audits: {
281
296
  path: 'audit-log-list',