@yss123/cage-admin 0.2.0 → 0.3.1

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 (52) hide show
  1. package/README.md +31 -3
  2. package/dist/bootstrap.d.ts +27 -1
  3. package/dist/bootstrap.js +52 -16
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/catalog.d.ts +6 -0
  6. package/dist/catalog.js +7 -0
  7. package/dist/catalog.js.map +1 -1
  8. package/dist/diagnostics.d.ts +14 -0
  9. package/dist/diagnostics.js +163 -0
  10. package/dist/diagnostics.js.map +1 -0
  11. package/dist/domain/constraints.d.ts +23 -0
  12. package/dist/domain/constraints.js +27 -0
  13. package/dist/domain/constraints.js.map +1 -1
  14. package/dist/domain/index.d.ts +5 -0
  15. package/dist/domain/index.js +5 -0
  16. package/dist/domain/index.js.map +1 -1
  17. package/dist/domain/org.d.ts +82 -1
  18. package/dist/domain/org.js +98 -4
  19. package/dist/domain/org.js.map +1 -1
  20. package/dist/http.d.ts +11 -0
  21. package/dist/http.js +24 -0
  22. package/dist/http.js.map +1 -1
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.js +5 -0
  25. package/dist/index.js.map +1 -1
  26. package/package.json +3 -2
  27. package/ui/dist/app/shell.js +39 -5
  28. package/ui/dist/app.js +10 -0
  29. package/ui/dist/modules/audit/audit-page.js +12 -0
  30. package/ui/dist/modules/audit/index.js +4 -0
  31. package/ui/dist/modules/auth/index.js +4 -0
  32. package/ui/dist/modules/auth/login-page.js +8 -0
  33. package/ui/dist/modules/models/index.js +5 -0
  34. package/ui/dist/modules/models/models-page.js +60 -0
  35. package/ui/dist/modules/operations/index.js +4 -0
  36. package/ui/dist/modules/operations/operations-page.js +15 -0
  37. package/ui/dist/modules/operations/sync-page.js +12 -0
  38. package/ui/dist/modules/org/index.js +4 -0
  39. package/ui/dist/modules/org/org-page.js +30 -0
  40. package/ui/dist/modules/personalities/index.js +5 -0
  41. package/ui/dist/modules/personalities/personalities-page.js +161 -0
  42. package/ui/dist/modules/roles/index.js +4 -0
  43. package/ui/dist/modules/roles/roles-page.js +40 -0
  44. package/ui/dist/modules/tasks/index.js +5 -0
  45. package/ui/dist/modules/tasks/operations-pages.js +107 -0
  46. package/ui/dist/modules/tasks/tasks-page.js +44 -12
  47. package/ui/dist/shared/api.js +84 -2
  48. package/ui/dist/shared/dom.js +36 -0
  49. package/ui/dist/shared/labels.js +29 -0
  50. package/ui/dist/shared/navigation.js +7 -0
  51. package/ui/index.html +1 -0
  52. package/ui/style.css +118 -0
package/ui/style.css CHANGED
@@ -1,3 +1,5 @@
1
+ /* 系统管理页面样式:基础变量、应用壳、表单表格、授权编辑与 AI 配置区按既有层叠顺序组织。
2
+ * 页面状态由 TS 添加类名或属性,CSS 只负责显示、布局和响应式适配,不承载授权判断或业务状态转换。 */
1
3
  /* 管理工作台采用同一套色彩与间距。仅为桌面排版,不引入远程字体或 UI 运行时。 */
2
4
  :root {
3
5
  color-scheme: light;
@@ -223,6 +225,43 @@ pre {
223
225
  .muted {
224
226
  color: var(--muted);
225
227
  }
228
+ /* 审批提醒使用真实链接保存筛选 URL;选中态和键盘焦点都沿用系统绿色,状态不只靠文字颜色区分。 */
229
+ .approval-filter {
230
+ display: inline-flex;
231
+ align-items: center;
232
+ min-height: 30px;
233
+ padding: 4px 12px;
234
+ border: 1px solid var(--line-strong);
235
+ border-radius: 7px;
236
+ color: var(--ink);
237
+ text-decoration: none;
238
+ }
239
+ .approval-filter.selected {
240
+ background: var(--accent-soft);
241
+ border-color: var(--accent);
242
+ color: var(--accent-dark);
243
+ font-weight: 600;
244
+ }
245
+ .approval-filter:focus-visible {
246
+ outline: 2px solid var(--accent);
247
+ outline-offset: 2px;
248
+ }
249
+ /* 审批页支持窄侧面板:横向溢出仅留在表格内,避免整页滚动后操作按钮落到固定侧栏下。 */
250
+ body:has(.approval-workspace) { min-width: 0; }
251
+ .approval-workspace { min-width: 0; }
252
+ .approval-workspace .table-wrap { max-width: 100%; overflow-x: auto; }
253
+ .approval-workspace .table-toolbar { flex-wrap: wrap; gap: 12px; }
254
+ .approval-workspace table { min-width: 700px; }
255
+ @media (max-width: 700px) {
256
+ body:has(.approval-workspace) .app-sidebar { position: static; width: auto; padding: 16px; }
257
+ body:has(.approval-workspace) .app-sidebar nav { display: flex; flex-wrap: wrap; gap: 4px; }
258
+ body:has(.approval-workspace) .sidebar-bottom { display: none; }
259
+ body:has(.approval-workspace) .app-main { margin-left: 0; }
260
+ body:has(.approval-workspace) .app-topbar { padding: 0 16px; }
261
+ body:has(.approval-workspace) .page-container { padding: 22px 16px; }
262
+ body:has(.approval-workspace) .page-heading,
263
+ body:has(.approval-workspace) .page-footer { flex-wrap: wrap; }
264
+ }
226
265
  .eyebrow {
227
266
  display: block;
228
267
  margin-bottom: 4px;
@@ -1232,6 +1271,18 @@ details summary {
1232
1271
  padding-top: 18px;
1233
1272
  border-top: 1px solid var(--line);
1234
1273
  }
1274
+ .model-overview { display: flex; align-items: center; justify-content: space-between; gap: 24px; padding: 26px 0; }
1275
+ body:has(.model-overview) { min-width: 0; }
1276
+ .model-overview h2 { margin: 8px 0; font-size: 24px; font-weight: 500; }
1277
+ .model-overview p, .model-meta, .model-save-status { color: var(--muted); font-size: 12px; line-height: 1.8; }
1278
+ .model-meta { display: flex; gap: 18px; align-items: center; padding: 0 24px 20px; flex-wrap: wrap; }
1279
+ .model-form { padding: 0 24px 24px; }
1280
+ .model-fields { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 24px; }
1281
+ .model-fields input:not([type=checkbox]) { width: 100%; box-sizing: border-box; }
1282
+ .model-enabled { display: flex; gap: 10px; align-items: center; }
1283
+ .model-actions { display: flex; gap: 12px; align-items: center; border-top: 1px solid var(--line); margin-top: 24px; padding-top: 20px; }
1284
+ .model-save-status { flex: 1; }
1285
+ @media (max-width: 700px) { .model-fields { grid-template-columns: 1fr; } .model-actions, .model-overview { flex-wrap: wrap; } .model-save-status { flex-basis: 100%; } }
1235
1286
  .modal {
1236
1287
  width: 470px;
1237
1288
  max-width: 80vw;
@@ -1575,3 +1626,70 @@ details summary {
1575
1626
  transition: none !important;
1576
1627
  }
1577
1628
  }
1629
+
1630
+ /* 助理性格:预设卡片与并排试聊,沿用管理工作台的绿色和纸面层次。 */
1631
+ body:has(.persona-overview) { min-width: 0; }
1632
+ .persona-overview { display: flex; justify-content: space-between; align-items: center; gap: 24px; padding: 22px 4px 28px; }
1633
+ .persona-overview h2 { margin: 8px 0; font-size: 26px; letter-spacing: -.4px; }
1634
+ .persona-overview p { color: var(--secondary); }
1635
+ .persona-default { display: flex; justify-content: space-between; align-items: center; gap: 20px; padding: 20px 24px; border: 1px solid var(--line); border-radius: 12px; background: #fff; margin-bottom: 18px; }
1636
+ .persona-default p { margin: 4px 0 0; font-size: 11px; color: var(--muted); }
1637
+ .persona-default-actions { display: flex; align-items: center; gap: 10px; }
1638
+ .persona-default select { min-width: 180px; }
1639
+ .persona-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 24px; }
1640
+ .persona-card { display: flex; position: relative; gap: 13px; align-items: flex-start; min-width: 0; padding: 21px 18px 42px; border: 1px solid var(--line); border-radius: 12px; background: #fff; text-align: left; white-space: normal; }
1641
+ .persona-card.selected { border-color: #7baf8f; background: #f0f7ed; box-shadow: inset 0 0 0 1px #7baf8f; }
1642
+ .persona-avatar { display: grid; place-items: center; width: 38px; height: 38px; flex-shrink: 0; border: 1px solid #e2eadc; border-radius: 11px; background: #f8faf5; font-size: 22px; }
1643
+ .persona-card-copy { display: block; min-width: 0; }
1644
+ .persona-card-copy strong { display: block; color: #284f3e; font-size: 14px; margin-bottom: 5px; }
1645
+ .persona-card-copy small { display: -webkit-box; overflow: hidden; -webkit-line-clamp: 2; -webkit-box-orient: vertical; color: var(--secondary); font-size: 11px; line-height: 1.8; font-weight: 400; }
1646
+ .persona-card-tags { position: absolute; right: 16px; bottom: 12px; }
1647
+ .persona-card-tags .badge { font-size: 9px; }
1648
+ .persona-editor-area { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 20px; align-items: start; }
1649
+ .persona-form { padding: 27px; background: #fff; border: 1px solid var(--line); border-radius: 14px; }
1650
+ .persona-section-heading { margin-bottom: 23px; }
1651
+ .persona-section-heading h2, .persona-preview h2 { margin: 7px 0; font-size: 20px; }
1652
+ .persona-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; }
1653
+ .persona-form .field { margin-bottom: 17px; }
1654
+ .persona-form textarea { resize: vertical; min-height: 120px; }
1655
+ .persona-examples { display: grid; gap: 9px; margin: 5px 0 18px; }
1656
+ .persona-examples strong { font-size: 12px; font-weight: 500; }
1657
+ .persona-examples small { color: var(--muted); font-size: 10px; margin-top: -4px; }
1658
+ .persona-enabled { display: flex; align-items: center; gap: 9px; color: var(--secondary); font-size: 12px; }
1659
+ .persona-enabled input { width: auto; }
1660
+ .persona-save-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-top: 22px; margin-top: 22px; border-top: 1px solid var(--line); }
1661
+ .persona-save-status { font-size: 10px; color: var(--secondary); margin: 0; }
1662
+ .persona-preview { position: sticky; top: 20px; padding: 27px; border: 1px solid #d4dfcb; border-radius: 14px; background: #f4f7ee; }
1663
+ .persona-preview-intro { font-size: 11px; color: #7a886d; margin: 0 0 23px; line-height: 1.9; }
1664
+ .persona-preview-answer { min-height: 220px; max-height: 390px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; padding: 18px; border: 1px solid #e0e7d7; border-radius: 10px; background: #fffef9; color: #3d5943; font-size: 13px; line-height: 1.9; }
1665
+ .persona-preview-status { min-height: 20px; margin: 10px 0; color: var(--secondary); font-size: 10px; }
1666
+ .persona-preview textarea { width: 100%; resize: vertical; min-height: 75px; }
1667
+ .persona-preview-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 15px; }
1668
+ @media (max-width: 1250px) { .persona-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .persona-editor-area { grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); } .persona-default { flex-wrap: wrap; } }
1669
+ @media (max-width: 900px) {
1670
+ .persona-editor-area { grid-template-columns: minmax(0, 1fr); }
1671
+ .persona-preview { position: static; }
1672
+ .persona-overview { flex-wrap: wrap; }
1673
+ }
1674
+ @media (max-width: 700px) {
1675
+ body:has(.persona-overview, .model-overview) .app-sidebar { position: static; width: auto; padding: 18px; border-right: 0; border-bottom: 1px solid var(--line); }
1676
+ body:has(.persona-overview, .model-overview) .brand { padding: 0 0 10px; }
1677
+ body:has(.persona-overview, .model-overview) .nav-group { margin-top: 8px; }
1678
+ body:has(.persona-overview, .model-overview) .nav-caption { margin: 0 0 5px; }
1679
+ body:has(.persona-overview, .model-overview) .app-sidebar nav { display: flex; flex-wrap: wrap; gap: 5px; }
1680
+ body:has(.persona-overview, .model-overview) .nav-item { min-height: 38px; padding: 8px 10px; margin: 0; gap: 6px; }
1681
+ body:has(.persona-overview, .model-overview) .sidebar-bottom { padding: 10px 0 0; }
1682
+ body:has(.persona-overview, .model-overview) .workspace-label { display: none; }
1683
+ body:has(.persona-overview, .model-overview) .app-main { margin-left: 0; }
1684
+ body:has(.persona-overview, .model-overview) .app-topbar { padding: 0 18px; gap: 10px; }
1685
+ body:has(.persona-overview, .model-overview) .breadcrumb > :not(strong), body:has(.persona-overview, .model-overview) .account-copy { display: none; }
1686
+ body:has(.persona-overview, .model-overview) .page-container { padding: 24px 16px; }
1687
+ body:has(.persona-overview, .model-overview) .page-heading, body:has(.persona-overview, .model-overview) .page-footer { align-items: flex-start; flex-wrap: wrap; }
1688
+ .persona-grid { grid-template-columns: minmax(0, 1fr); }
1689
+ .persona-default { padding: 18px; }
1690
+ .persona-default-actions { width: 100%; flex-wrap: wrap; }
1691
+ .persona-default select { flex: 1; min-width: 0; }
1692
+ .persona-form, .persona-preview { padding: 20px; }
1693
+ .persona-save-row { flex-wrap: wrap; }
1694
+ .persona-overview h2 { font-size: 23px; }
1695
+ }