@nocobase/portal-template-default 1.0.9 → 1.0.11

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 (338) hide show
  1. package/.env.example +5 -0
  2. package/.github/workflows/publish.yml +106 -0
  3. package/.gitignore +33 -0
  4. package/AGENTS.md +19 -0
  5. package/README.MD +61 -180
  6. package/dist/assets/{LineDraw-C0m1GONT.js → LineDraw-iG-ADes-.js} +1 -1
  7. package/dist/assets/{SymbolDraw-CCospe5G.js → SymbolDraw-DXoSw1tM.js} +1 -1
  8. package/dist/assets/VisualMapping-C_ee4Eht.js +1 -0
  9. package/dist/assets/auth-method-demo-DaOCuvsq.js +1 -0
  10. package/dist/assets/auto-login-provider-5Uxza9Ms.js +2 -0
  11. package/dist/assets/auto-login-provider-DyaPGK2D.js +1 -0
  12. package/dist/assets/auto-redirect-provider-CfwRvYOI.js +1 -0
  13. package/dist/assets/auto-redirect-provider-Cr3jmYts.js +1 -0
  14. package/dist/assets/auto-redirect-provider-QkJQRBbG.js +1 -0
  15. package/dist/assets/calendar-DjDRfD5t.js +1 -0
  16. package/dist/assets/card-DuQBOS6A.js +1 -0
  17. package/dist/assets/cas-sign-in-button-CyqG1QME.js +1 -0
  18. package/dist/assets/components-D-ptYjX_.js +20 -0
  19. package/dist/assets/configuration-gate-C08mkkiX.js +1 -0
  20. package/dist/assets/{createClipPathFromCoordSys-uEftn1Mq.js → createClipPathFromCoordSys-wj34-b1B.js} +1 -1
  21. package/dist/assets/createSeriesDataSimply-D0A6SAVQ.js +1 -0
  22. package/dist/assets/customGraphicKeyframeAnimation-DWrhrHL_.js +3 -0
  23. package/dist/assets/demo-BYWHeKUe.js +1 -0
  24. package/dist/assets/demo-CPWoNtx8.js +1 -0
  25. package/dist/assets/demo-CyvJk5zV.js +1 -0
  26. package/dist/assets/demo-D4OiKplc.js +1 -0
  27. package/dist/assets/demo-DBueJg0m.js +1 -0
  28. package/dist/assets/demo-DkIhyiRK.js +1 -0
  29. package/dist/assets/demo-tpTjO0sC.js +1 -0
  30. package/dist/assets/dingtalk-sign-in-button-DSWsSruv.js +1 -0
  31. package/dist/assets/echarts-preview-DxHNfq1C.js +1 -0
  32. package/dist/assets/{echarts-runtime-CEgJbv68.js → echarts-runtime-D8kXn6ME.js} +3 -3
  33. package/dist/assets/{echarts-runtime-advanced-Buhm2BHz.js → echarts-runtime-advanced-QY8v95qK.js} +1 -1
  34. package/dist/assets/{echarts-runtime-common-DLAdBAIa.js → echarts-runtime-common-D-yqAK-r.js} +1 -1
  35. package/dist/assets/{echarts-runtime-components-ypnyLkYx.js → echarts-runtime-components-P4-i8jPU.js} +1 -1
  36. package/dist/assets/{echarts-runtime-hierarchy-ClStquCF.js → echarts-runtime-hierarchy-ByQZ-DbP.js} +1 -1
  37. package/dist/assets/floating-BFVEyPEp.js +15 -0
  38. package/dist/assets/index-BgCbGDMc.js +43 -0
  39. package/dist/assets/index-Btk35Nx-.js +23 -0
  40. package/dist/assets/index-CwNxd66J.js +1 -0
  41. package/dist/assets/index-MB-jfQld.js +686 -0
  42. package/dist/assets/index-NH3aqqQz.css +1 -0
  43. package/dist/assets/index-gFtCXH3o.js +58 -0
  44. package/dist/assets/index-um5hdKdZ.js +23 -0
  45. package/dist/assets/{labelHelper-C137W5gU.js → labelHelper-DQqRy3a_.js} +1 -1
  46. package/dist/assets/ldap-sign-in-form--6Gt3yGq.js +1 -0
  47. package/dist/assets/oidc-sign-in-button-CQdRcR_p.js +1 -0
  48. package/dist/assets/{page-context-Cxx11gzg.js → page-context-CnQ4GYM7.js} +10 -10
  49. package/dist/assets/prompt-card-B2RS4nt2.js +1 -0
  50. package/dist/assets/prompt-output-DZHRM2ft.js +1 -0
  51. package/dist/assets/saml-sign-in-button-BHL5a0JV.js +1 -0
  52. package/dist/assets/{sectorHelper-Fqgz3uEk.js → sectorHelper-DN_Vv6OL.js} +1 -1
  53. package/dist/assets/shortcut-C5x5LQWU.js +47 -0
  54. package/dist/assets/sms-sign-in-form-DTX9GV2I.js +1 -0
  55. package/dist/assets/{static.browser-CfQQzERe.js → static.browser-jI1psK0d.js} +8 -8
  56. package/dist/assets/{switch-DrxImI8F.js → switch-CRL8PmRI.js} +1 -1
  57. package/dist/assets/{tool-cards-BGfsY8JF.js → tool-cards-DFttLAfo.js} +6 -7
  58. package/dist/assets/use-authenticator-sign-in-CRGjzXju.js +1 -0
  59. package/dist/assets/use-dingtalk-sign-in-8WYzJ2jf.js +1 -0
  60. package/dist/assets/use-wecom-sign-in-C9j8wfCD.js +1 -0
  61. package/dist/assets/wecom-sign-in-button-mIS1zGSU.js +1 -0
  62. package/dist/index.html +2 -2
  63. package/dist/index.raw.html +5 -2
  64. package/package.json +3 -5
  65. package/scripts/build-html.mjs +12 -0
  66. package/src/App.css +2 -0
  67. package/src/App.tsx +35 -186
  68. package/src/app/development.tsx +154 -0
  69. package/src/app/extension.ts +5 -0
  70. package/src/app/extensions.tsx +18 -4
  71. package/src/app/routes.tsx +65 -0
  72. package/src/components/access-control/acl-bootstrap.tsx +11 -3
  73. package/src/components/access-control/acl-gate.tsx +7 -6
  74. package/src/components/access-control/can-access.tsx +17 -0
  75. package/src/components/access-control/navigate-to-accessible-resource.tsx +8 -3
  76. package/src/components/app-shell/sidebar.tsx +21 -5
  77. package/src/components/auth/auto-redirect-provider.tsx +2 -1
  78. package/src/extensions/nocobase-acl/README.md +74 -0
  79. package/{registry → src/extensions}/nocobase-acl/components/acl-boundary.tsx +22 -25
  80. package/{registry → src/extensions}/nocobase-acl/components/role-switcher.tsx +26 -23
  81. package/src/extensions/nocobase-acl/demo/acl-preview-provider.tsx +81 -0
  82. package/{registry → src/extensions}/nocobase-acl/demo/boundary-api.tsx +58 -0
  83. package/{registry → src/extensions}/nocobase-acl/demo/index.tsx +243 -105
  84. package/{registry → src/extensions}/nocobase-acl/demo/prompt-generator.tsx +3 -1
  85. package/src/extensions/nocobase-acl/extension.tsx +73 -0
  86. package/{registry → src/extensions}/nocobase-ai/README.md +21 -5
  87. package/{registry → src/extensions}/nocobase-ai/components/chat/chat-composer.tsx +3 -1
  88. package/{registry → src/extensions}/nocobase-ai/components/chat/chat-messages.tsx +38 -3
  89. package/{registry → src/extensions}/nocobase-ai/components/chat/tool-call-card.tsx +1 -9
  90. package/{registry → src/extensions}/nocobase-ai/components/index.ts +5 -0
  91. package/src/extensions/nocobase-ai/components/surfaces/chat-dialog.tsx +17 -0
  92. package/src/extensions/nocobase-ai/components/surfaces/chat-side-panel.tsx +35 -0
  93. package/src/extensions/nocobase-ai/components/surfaces/chat-surface.tsx +108 -0
  94. package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-chat-floating-trigger.tsx +2 -2
  95. package/{registry → src/extensions}/nocobase-ai/demo/configuration-gate.tsx +4 -1
  96. package/{registry → src/extensions}/nocobase-ai/demo/container-showcase.tsx +2 -2
  97. package/{registry → src/extensions}/nocobase-ai/demo/floating.tsx +45 -15
  98. package/{registry → src/extensions}/nocobase-ai/demo/index.tsx +116 -74
  99. package/{registry → src/extensions}/nocobase-ai/demo/prompt-generator.tsx +3 -3
  100. package/{registry → src/extensions}/nocobase-ai/demo/tool-cards.tsx +2 -3
  101. package/src/extensions/nocobase-ai/extension.tsx +160 -0
  102. package/{registry → src/extensions}/nocobase-ai/global-ai-chat.tsx +12 -28
  103. package/{registry → src/extensions}/nocobase-ai/providers/ai-provider.tsx +14 -1
  104. package/{registry → src/extensions}/nocobase-ai/providers/chat-context.tsx +1 -0
  105. package/{registry → src/extensions}/nocobase-ai/providers/chat-provider.tsx +29 -8
  106. package/{registry → src/extensions}/nocobase-ai/providers/use-chat-attachments.ts +6 -1
  107. package/{registry → src/extensions}/nocobase-ai/providers/use-chat-work-context.ts +4 -1
  108. package/{registry → src/extensions}/nocobase-route-surfaces/README.md +2 -1
  109. package/{registry → src/extensions}/nocobase-route-surfaces/demo/index.tsx +33 -7
  110. package/{registry → src/extensions}/nocobase-route-surfaces/demo/scenarios.ts +20 -14
  111. package/{registry → src/extensions}/nocobase-route-surfaces/extension.tsx +55 -52
  112. package/src/{pages/users → extensions/nocobase-users-example}/create.tsx +4 -4
  113. package/src/{pages/users → extensions/nocobase-users-example}/edit.tsx +5 -9
  114. package/src/extensions/nocobase-users-example/extension.tsx +109 -0
  115. package/src/{pages/users → extensions/nocobase-users-example}/form-context.ts +11 -9
  116. package/src/extensions/nocobase-users-example/layout.tsx +16 -0
  117. package/src/{pages/users → extensions/nocobase-users-example}/list.tsx +1 -1
  118. package/src/extensions/nocobase-users-example/locales/en-US.ts +77 -0
  119. package/src/extensions/nocobase-users-example/locales/index.ts +8 -0
  120. package/src/extensions/nocobase-users-example/locales/zh-CN.ts +73 -0
  121. package/src/extensions/nocobase-users-example/optional-ai.ts +67 -0
  122. package/src/{pages/users → extensions/nocobase-users-example}/role-detail.tsx +4 -15
  123. package/src/{pages/users → extensions/nocobase-users-example}/routes.ts +1 -4
  124. package/src/extensions/nocobase-users-example/show.tsx +266 -0
  125. package/src/lib/nocobase/acl/context.ts +32 -0
  126. package/src/lib/nocobase/acl/evaluator.ts +186 -0
  127. package/src/lib/nocobase/acl/hooks.ts +40 -0
  128. package/src/lib/nocobase/acl/index.ts +4 -1
  129. package/src/lib/nocobase/acl/menu.ts +6 -6
  130. package/src/lib/nocobase/acl/record-permissions.ts +37 -7
  131. package/src/lib/nocobase/acl/store-provider.tsx +14 -0
  132. package/src/lib/nocobase/acl/store.ts +92 -86
  133. package/src/lib/nocobase/acl/types.ts +52 -32
  134. package/src/lib/nocobase/auth-session.ts +128 -0
  135. package/src/lib/nocobase/client.ts +48 -50
  136. package/src/locales/en-US.ts +0 -78
  137. package/src/locales/index.ts +2 -7
  138. package/src/locales/zh-CN.ts +0 -74
  139. package/src/providers/access-control.ts +43 -8
  140. package/src/providers/auth-callback.ts +1 -0
  141. package/src/providers/auth.ts +24 -26
  142. package/src/providers/constants.ts +0 -4
  143. package/src/providers/data.ts +14 -26
  144. package/src/providers/runtime-config.ts +40 -0
  145. package/src/vite-env.d.ts +9 -0
  146. package/tests/auth-session-regression.mjs +101 -0
  147. package/tsconfig.json +2 -1
  148. package/vite.config.ts +9 -1
  149. package/dist/assets/VisualMapping-Cbv1v7Cd.js +0 -1
  150. package/dist/assets/ai-employee-shortcut-B253WWow.js +0 -1
  151. package/dist/assets/calendar-B3dXXyIv.js +0 -1
  152. package/dist/assets/chat-inline-xpQ9iq4p.js +0 -1
  153. package/dist/assets/chat-side-panel-layout-BVWsp5rr.js +0 -1
  154. package/dist/assets/components-ChhJaNRc.js +0 -20
  155. package/dist/assets/configuration-gate-Dwdq_lxf.js +0 -1
  156. package/dist/assets/createSeriesDataSimply-CI7l7Ufv.js +0 -1
  157. package/dist/assets/customGraphicKeyframeAnimation-DE3jSfMd.js +0 -3
  158. package/dist/assets/echarts-preview-C-cNUtJF.js +0 -1
  159. package/dist/assets/floating-BarTmn-b.js +0 -13
  160. package/dist/assets/index-BJIcYTdc.js +0 -53
  161. package/dist/assets/index-C6xNKxpg.js +0 -656
  162. package/dist/assets/index-D4JQi1TM.js +0 -54
  163. package/dist/assets/index-YA7-AUO8.css +0 -1
  164. package/dist/assets/index-g8zWVpP9.js +0 -23
  165. package/dist/assets/prompt-card-BsYMW_rq.js +0 -1
  166. package/dist/assets/shortcut-xtghDP63.js +0 -47
  167. package/registry/nocobase-acl/README.md +0 -19
  168. package/registry/nocobase-acl/extension.tsx +0 -71
  169. package/registry/nocobase-acl/tests/acl-regression.mjs +0 -314
  170. package/registry/nocobase-ai/components/surfaces/chat-dialog.tsx +0 -31
  171. package/registry/nocobase-ai/components/surfaces/chat-side-panel.tsx +0 -74
  172. package/registry/nocobase-ai/extension.tsx +0 -158
  173. package/registry/nocobase-ai/tests/business-report-regression.mjs +0 -70
  174. package/registry/nocobase-ai/tests/form-filler-regression.mjs +0 -129
  175. package/registry/nocobase-ai/tests/frontend-tool-regression.mjs +0 -128
  176. package/registry/nocobase-ai/tests/page-context-regression.mjs +0 -48
  177. package/registry/nocobase-ai/tests/stream-regression.mjs +0 -207
  178. package/registry/nocobase-auth-cas/README.md +0 -6
  179. package/registry/nocobase-auth-cas/cas-sign-in-button.tsx +0 -41
  180. package/registry/nocobase-auth-cas/demo.tsx +0 -20
  181. package/registry/nocobase-auth-cas/extension.tsx +0 -46
  182. package/registry/nocobase-auth-cas/index.ts +0 -1
  183. package/registry/nocobase-auth-cas/use-cas-sign-in.ts +0 -29
  184. package/registry/nocobase-auth-dingtalk/README.md +0 -7
  185. package/registry/nocobase-auth-dingtalk/auto-login-provider.tsx +0 -154
  186. package/registry/nocobase-auth-dingtalk/demo.tsx +0 -23
  187. package/registry/nocobase-auth-dingtalk/dingtalk-sign-in-button.tsx +0 -45
  188. package/registry/nocobase-auth-dingtalk/extension.tsx +0 -55
  189. package/registry/nocobase-auth-dingtalk/index.ts +0 -4
  190. package/registry/nocobase-auth-dingtalk/use-dingtalk-sign-in.ts +0 -64
  191. package/registry/nocobase-auth-ldap/README.md +0 -6
  192. package/registry/nocobase-auth-ldap/demo.tsx +0 -21
  193. package/registry/nocobase-auth-ldap/extension.tsx +0 -46
  194. package/registry/nocobase-auth-ldap/index.ts +0 -1
  195. package/registry/nocobase-auth-ldap/ldap-sign-in-form.tsx +0 -69
  196. package/registry/nocobase-auth-ldap/use-ldap-sign-in.ts +0 -5
  197. package/registry/nocobase-auth-oidc/README.md +0 -11
  198. package/registry/nocobase-auth-oidc/auto-redirect-provider.tsx +0 -13
  199. package/registry/nocobase-auth-oidc/demo.tsx +0 -20
  200. package/registry/nocobase-auth-oidc/extension.tsx +0 -51
  201. package/registry/nocobase-auth-oidc/index.ts +0 -1
  202. package/registry/nocobase-auth-oidc/oidc-sign-in-button.tsx +0 -44
  203. package/registry/nocobase-auth-oidc/use-oidc-sign-in.ts +0 -58
  204. package/registry/nocobase-auth-saml/README.md +0 -6
  205. package/registry/nocobase-auth-saml/auto-redirect-provider.tsx +0 -13
  206. package/registry/nocobase-auth-saml/demo.tsx +0 -20
  207. package/registry/nocobase-auth-saml/extension.tsx +0 -51
  208. package/registry/nocobase-auth-saml/index.ts +0 -1
  209. package/registry/nocobase-auth-saml/saml-sign-in-button.tsx +0 -43
  210. package/registry/nocobase-auth-saml/use-saml-sign-in.ts +0 -51
  211. package/registry/nocobase-auth-sms/README.md +0 -7
  212. package/registry/nocobase-auth-sms/demo.tsx +0 -25
  213. package/registry/nocobase-auth-sms/extension.tsx +0 -46
  214. package/registry/nocobase-auth-sms/index.ts +0 -1
  215. package/registry/nocobase-auth-sms/sms-sign-in-form.tsx +0 -107
  216. package/registry/nocobase-auth-sms/use-sms-sign-in.ts +0 -88
  217. package/registry/nocobase-auth-wecom/README.md +0 -6
  218. package/registry/nocobase-auth-wecom/auto-login-provider.tsx +0 -21
  219. package/registry/nocobase-auth-wecom/demo.tsx +0 -23
  220. package/registry/nocobase-auth-wecom/extension.tsx +0 -49
  221. package/registry/nocobase-auth-wecom/index.ts +0 -1
  222. package/registry/nocobase-auth-wecom/use-wecom-sign-in.ts +0 -62
  223. package/registry/nocobase-auth-wecom/wecom-sign-in-button.tsx +0 -70
  224. package/registry/nocobase-i18n/README.md +0 -44
  225. package/registry/nocobase-i18n/components/index.ts +0 -1
  226. package/registry/nocobase-i18n/components/language-switcher.tsx +0 -138
  227. package/registry/nocobase-i18n/demo/index.tsx +0 -209
  228. package/registry/nocobase-i18n/demo/prompt-generator.tsx +0 -132
  229. package/registry/nocobase-i18n/extension.tsx +0 -45
  230. package/registry/nocobase-i18n/index.ts +0 -7
  231. package/registry/nocobase-i18n/locales/en-US.ts +0 -39
  232. package/registry/nocobase-i18n/locales/index.ts +0 -8
  233. package/registry/nocobase-i18n/locales/zh-CN.ts +0 -35
  234. package/registry/nocobase-i18n/provider.tsx +0 -44
  235. package/registry/nocobase-i18n/server-resources.ts +0 -166
  236. package/registry/nocobase-i18n/tests/i18n-regression.mjs +0 -51
  237. package/registry.config.json +0 -302
  238. package/scripts/registry.mjs +0 -164
  239. package/src/components/access-control/resource-access-guard.tsx +0 -21
  240. package/src/components/access-control/use-acl-runtime.ts +0 -28
  241. package/src/lib/nocobase/acl/action.ts +0 -147
  242. package/src/pages/users/layout.tsx +0 -15
  243. package/src/pages/users/show.tsx +0 -278
  244. /package/{registry → src/extensions}/nocobase-acl/components/index.ts +0 -0
  245. /package/{registry → src/extensions}/nocobase-acl/components/role-options.ts +0 -0
  246. /package/{registry → src/extensions}/nocobase-acl/demo/components.tsx +0 -0
  247. /package/{registry → src/extensions}/nocobase-acl/demo/lazy-route.tsx +0 -0
  248. /package/{registry → src/extensions}/nocobase-acl/demo/role-switcher-prompt-generator.tsx +0 -0
  249. /package/{registry → src/extensions}/nocobase-acl/demo/scenario-section.tsx +0 -0
  250. /package/{registry → src/extensions}/nocobase-acl/index.ts +0 -0
  251. /package/{registry → src/extensions}/nocobase-ai/adapters/react-hook-form.ts +0 -0
  252. /package/{registry → src/extensions}/nocobase-ai/assets/nocobase-ai-chat.svg +0 -0
  253. /package/{registry → src/extensions}/nocobase-ai/components/ai-root-provider.tsx +0 -0
  254. /package/{registry → src/extensions}/nocobase-ai/components/chat/ai-employee-avatar.tsx +0 -0
  255. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-attachment.tsx +0 -0
  256. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-compact.tsx +0 -0
  257. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-empty-state.tsx +0 -0
  258. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-header.tsx +0 -0
  259. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-history-dialog.tsx +0 -0
  260. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-message.tsx +0 -0
  261. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-window.tsx +0 -0
  262. /package/{registry → src/extensions}/nocobase-ai/components/chat/conversation-list.tsx +0 -0
  263. /package/{registry → src/extensions}/nocobase-ai/components/chat/markdown-message.tsx +0 -0
  264. /package/{registry → src/extensions}/nocobase-ai/components/chat/model-select-options.tsx +0 -0
  265. /package/{registry → src/extensions}/nocobase-ai/components/chat/reasoning-panel.tsx +0 -0
  266. /package/{registry → src/extensions}/nocobase-ai/components/chat/sub-agent-conversation.tsx +0 -0
  267. /package/{registry → src/extensions}/nocobase-ai/components/chat/user-prompt-editor.tsx +0 -0
  268. /package/{registry → src/extensions}/nocobase-ai/components/chat/work-context-chip.tsx +0 -0
  269. /package/{registry → src/extensions}/nocobase-ai/components/page-elements/ai-form.tsx +0 -0
  270. /package/{registry → src/extensions}/nocobase-ai/components/page-elements/page-element-provider.tsx +0 -0
  271. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-inline.tsx +0 -0
  272. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-page.tsx +0 -0
  273. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-side-panel-layout.tsx +0 -0
  274. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-surface-actions.tsx +0 -0
  275. /package/{registry → src/extensions}/nocobase-ai/components/tools/builtin-tool-renderers.tsx +0 -0
  276. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-dialog.tsx +0 -0
  277. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-renderer.tsx +0 -0
  278. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-utils.tsx +0 -0
  279. /package/{registry → src/extensions}/nocobase-ai/components/tools/chart-renderer.tsx +0 -0
  280. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-preview.tsx +0 -0
  281. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-advanced.ts +0 -0
  282. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-common.ts +0 -0
  283. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-components.ts +0 -0
  284. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-hierarchy.ts +0 -0
  285. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime.ts +0 -0
  286. /package/{registry → src/extensions}/nocobase-ai/components/tools/sub-agent-renderer.tsx +0 -0
  287. /package/{registry → src/extensions}/nocobase-ai/components/tools/suggestions-renderer.tsx +0 -0
  288. /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-provider.tsx +0 -0
  289. /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-utils.ts +0 -0
  290. /package/{registry → src/extensions}/nocobase-ai/components/tools/workflow-renderer.tsx +0 -0
  291. /package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-employee-shortcut.tsx +0 -0
  292. /package/{registry → src/extensions}/nocobase-ai/demo/interaction-showcase.tsx +0 -0
  293. /package/{registry → src/extensions}/nocobase-ai/demo/page-context-prompt-generator.tsx +0 -0
  294. /package/{registry → src/extensions}/nocobase-ai/demo/page-context.tsx +0 -0
  295. /package/{registry → src/extensions}/nocobase-ai/demo/page-element-showcase.tsx +0 -0
  296. /package/{registry → src/extensions}/nocobase-ai/demo/prompt-card.tsx +0 -0
  297. /package/{registry → src/extensions}/nocobase-ai/demo/shortcut.tsx +0 -0
  298. /package/{registry → src/extensions}/nocobase-ai/index.ts +0 -0
  299. /package/{registry → src/extensions}/nocobase-ai/providers/avatars.ts +0 -0
  300. /package/{registry → src/extensions}/nocobase-ai/providers/chat-controller.ts +0 -0
  301. /package/{registry → src/extensions}/nocobase-ai/providers/chat-message-utils.ts +0 -0
  302. /package/{registry → src/extensions}/nocobase-ai/providers/chat-reducer.ts +0 -0
  303. /package/{registry → src/extensions}/nocobase-ai/providers/chat-task-utils.ts +0 -0
  304. /package/{registry → src/extensions}/nocobase-ai/providers/chat-transport.ts +0 -0
  305. /package/{registry → src/extensions}/nocobase-ai/providers/form-registry.tsx +0 -0
  306. /package/{registry → src/extensions}/nocobase-ai/providers/frontend-tool-registry.tsx +0 -0
  307. /package/{registry → src/extensions}/nocobase-ai/providers/index.ts +0 -0
  308. /package/{registry → src/extensions}/nocobase-ai/providers/model.ts +0 -0
  309. /package/{registry → src/extensions}/nocobase-ai/providers/page-context.tsx +0 -0
  310. /package/{registry → src/extensions}/nocobase-ai/providers/stream-coalescer.ts +0 -0
  311. /package/{registry → src/extensions}/nocobase-ai/providers/stream-event-utils.ts +0 -0
  312. /package/{registry → src/extensions}/nocobase-ai/providers/stream-parser.ts +0 -0
  313. /package/{registry → src/extensions}/nocobase-ai/providers/sub-agent-stream.ts +0 -0
  314. /package/{registry → src/extensions}/nocobase-ai/providers/types.ts +0 -0
  315. /package/{registry → src/extensions}/nocobase-ai/providers/ui-message-stream.ts +0 -0
  316. /package/{registry → src/extensions}/nocobase-ai/providers/use-automatic-tool-approval.ts +0 -0
  317. /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-message-actions.ts +0 -0
  318. /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-runtime.ts +0 -0
  319. /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-catalog.ts +0 -0
  320. /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-history.ts +0 -0
  321. /package/{registry → src/extensions}/nocobase-ai/services/index.ts +0 -0
  322. /package/{registry → src/extensions}/nocobase-ai/services/nocobase-ai-service.ts +0 -0
  323. /package/{registry → src/extensions}/nocobase-ai/services/types.ts +0 -0
  324. /package/{registry → src/extensions}/nocobase-route-surfaces/demo/lazy-route.tsx +0 -0
  325. /package/{registry → src/extensions}/nocobase-route-surfaces/demo/prompt-generator.tsx +0 -0
  326. /package/{registry → src/extensions}/nocobase-route-surfaces/index.ts +0 -0
  327. /package/{registry → src/extensions}/nocobase-route-surfaces/route-dialog.tsx +0 -0
  328. /package/{registry → src/extensions}/nocobase-route-surfaces/route-drawer.tsx +0 -0
  329. /package/{registry → src/extensions}/nocobase-route-surfaces/route-page.tsx +0 -0
  330. /package/{registry → src/extensions}/nocobase-route-surfaces/route-surface-context.ts +0 -0
  331. /package/{registry → src/extensions}/nocobase-route-surfaces/use-refine-unsaved-changes.tsx +0 -0
  332. /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-close.ts +0 -0
  333. /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-state.ts +0 -0
  334. /package/src/{pages/users → extensions/nocobase-users-example}/form-fields.tsx +0 -0
  335. /package/src/{pages/users → extensions/nocobase-users-example}/index.ts +0 -0
  336. /package/src/{pages/users → extensions/nocobase-users-example}/role-badges.tsx +0 -0
  337. /package/src/{pages/users → extensions/nocobase-users-example}/role-utils.ts +0 -0
  338. /package/src/{pages/users → extensions/nocobase-users-example}/types.ts +0 -0
@@ -1,15 +1,42 @@
1
1
  import type { AccessControlProvider } from "@refinedev/core";
2
2
 
3
3
  import {
4
- canAccessWithSnapshot,
5
- getAclSnapshot,
4
+ aclStore,
5
+ evaluateAccess,
6
+ getAclState,
6
7
  loadAcl,
8
+ type AclAccessRequest,
9
+ type RoleConstraint,
7
10
  } from "@/lib/nocobase/acl";
8
11
 
12
+ const toAclAccessRequest = ({
13
+ resource,
14
+ action,
15
+ params,
16
+ }: Parameters<AccessControlProvider["can"]>[0]): AclAccessRequest => ({
17
+ resource,
18
+ action,
19
+ id: params?.id,
20
+ field: typeof params?.field === "string" ? params.field : undefined,
21
+ dataSourceKey:
22
+ typeof params?.dataSourceKey === "string"
23
+ ? params.dataSourceKey
24
+ : undefined,
25
+ roles: params?.roles as RoleConstraint | undefined,
26
+ meta: params?.meta as Record<string, unknown> | undefined,
27
+ resourceItem: params?.resource,
28
+ });
29
+
9
30
  export const accessControlProvider: AccessControlProvider = {
10
- can: async ({ resource, action, params }) => {
11
- const snapshot = await loadAcl();
12
- const can = canAccessWithSnapshot(snapshot, { resource, action, params });
31
+ can: async (request) => {
32
+ const state = await loadAcl();
33
+ const can =
34
+ state.status === "ready" &&
35
+ evaluateAccess(
36
+ state.permissions,
37
+ toAclAccessRequest(request),
38
+ aclStore.recordPermissions.getPermission
39
+ );
13
40
 
14
41
  return {
15
42
  can,
@@ -29,6 +56,14 @@ export const accessControlProvider: AccessControlProvider = {
29
56
  },
30
57
  };
31
58
 
32
- export const canAccessCurrentAcl = (
33
- params: Parameters<typeof canAccessWithSnapshot>[1]
34
- ) => canAccessWithSnapshot(getAclSnapshot(), params);
59
+ export const canAccessCurrentAcl = (request: AclAccessRequest) => {
60
+ const state = getAclState();
61
+ return (
62
+ state.status === "ready" &&
63
+ evaluateAccess(
64
+ state.permissions,
65
+ request,
66
+ aclStore.recordPermissions.getPermission
67
+ )
68
+ );
69
+ };
@@ -12,6 +12,7 @@ export function captureAuthenticationCallback() {
12
12
 
13
13
  nocobaseClient.setToken(token);
14
14
  nocobaseClient.setAuthenticator(authenticator);
15
+ nocobaseClient.setRole(null);
15
16
  clearAcl();
16
17
 
17
18
  url.searchParams.delete("token");
@@ -30,7 +30,7 @@ type NocoBaseSignOutResponse = {
30
30
  };
31
31
 
32
32
  type CurrentUserCache = {
33
- token: string;
33
+ sessionKey: string;
34
34
  user: NocoBaseUser;
35
35
  expiresAt: number;
36
36
  };
@@ -51,10 +51,14 @@ const clearCurrentUserCache = () => {
51
51
 
52
52
  const getCurrentUser = async (): Promise<NocoBaseUser> => {
53
53
  const token = nocobaseClient.getToken();
54
- if (!token) throw new Error("No NocoBase token");
54
+ const sessionKey = token ?? "cookie";
55
55
 
56
56
  const cached = currentUserCache;
57
- if (cached && cached.token === token && cached.expiresAt > Date.now()) {
57
+ if (
58
+ cached &&
59
+ cached.sessionKey === sessionKey &&
60
+ cached.expiresAt > Date.now()
61
+ ) {
58
62
  return cached.user;
59
63
  }
60
64
 
@@ -63,10 +67,12 @@ const getCurrentUser = async (): Promise<NocoBaseUser> => {
63
67
  currentUserRequest = (async () => {
64
68
  const user = await nocobaseClient.action<NocoBaseUser>("auth", "check", {
65
69
  token,
66
- includeAuthenticator: true,
70
+ // A default authenticator header would override the server's
71
+ // authenticator cookie during a Cookie-only SSO session.
72
+ authenticator: token ? undefined : null,
67
73
  });
68
74
  currentUserCache = {
69
- token: nocobaseClient.getToken() ?? token,
75
+ sessionKey: nocobaseClient.getToken() ?? "cookie",
70
76
  user,
71
77
  expiresAt: Date.now() + CURRENT_USER_CACHE_MS,
72
78
  };
@@ -216,22 +222,18 @@ export const authProvider: AuthProvider = {
216
222
  const token = nocobaseClient.getToken();
217
223
  let redirect: string | undefined;
218
224
  try {
219
- if (token) {
220
- const result = await nocobaseClient.action<NocoBaseSignOutResponse>(
221
- "auth",
222
- "signOut",
223
- {
224
- method: "POST",
225
- token,
226
- includeAuthenticator: true,
227
- }
228
- );
229
- redirect = result?.redirect;
230
- }
225
+ const result = await nocobaseClient.action<NocoBaseSignOutResponse>(
226
+ "auth",
227
+ "signOut",
228
+ {
229
+ method: "POST",
230
+ token,
231
+ authenticator: token ? undefined : null,
232
+ }
233
+ );
234
+ redirect = result?.redirect;
231
235
  } finally {
232
- nocobaseClient.setToken(null);
233
- nocobaseClient.setAuthenticator(null);
234
- nocobaseClient.setRole(null);
236
+ nocobaseClient.clearAuthentication();
235
237
  clearCurrentUserCache();
236
238
  clearAcl();
237
239
  }
@@ -249,9 +251,7 @@ export const authProvider: AuthProvider = {
249
251
  await getCurrentUser();
250
252
  return { authenticated: true };
251
253
  } catch {
252
- nocobaseClient.setToken(null);
253
- nocobaseClient.setAuthenticator(null);
254
- nocobaseClient.setRole(null);
254
+ nocobaseClient.clearAuthentication();
255
255
  clearCurrentUserCache();
256
256
  clearAcl();
257
257
  return { authenticated: false, redirectTo: "/login" };
@@ -291,9 +291,7 @@ export const authProvider: AuthProvider = {
291
291
  (error as { status?: number; statusCode?: number }).statusCode;
292
292
 
293
293
  if (status === 401) {
294
- nocobaseClient.setToken(null);
295
- nocobaseClient.setAuthenticator(null);
296
- nocobaseClient.setRole(null);
294
+ nocobaseClient.clearAuthentication();
297
295
  clearCurrentUserCache();
298
296
  clearAcl();
299
297
  return { logout: true, redirectTo: "/login" };
@@ -36,9 +36,5 @@ const toProxyRelativeUrl = (url: string, target?: string) => {
36
36
 
37
37
  export const API_URL = toProxyRelativeUrl(rawApiUrl, proxyTarget);
38
38
  export const API_ORIGIN = getDefaultProxyTarget(rawApiUrl);
39
- export const NOCOBASE_TOKEN_KEY = "nocobase-auth-token";
40
- export const NOCOBASE_AUTHENTICATOR_KEY = "nocobase-authenticator";
41
- export const NOCOBASE_ROLE_KEY = "nocobase-auth-role";
42
- export const NOCOBASE_LOCALE_KEY = "nocobase-locale";
43
39
  export const NOCOBASE_AUTHENTICATOR =
44
40
  import.meta.env.NOCOBASE_AUTHENTICATOR ?? "basic";
@@ -24,7 +24,6 @@ import type {
24
24
 
25
25
  import { nocobaseClient } from "@/lib/nocobase/client";
26
26
  import {
27
- notifyRecordPermissionsChanged,
28
27
  resolveAclDataSourceKey,
29
28
  type ResourceAcl,
30
29
  updateRecordPermissions,
@@ -122,9 +121,7 @@ const request = async <T>(
122
121
  },
123
122
  body: options.body,
124
123
  token: options.meta?.token,
125
- headers: dataSourceKey
126
- ? { "X-Data-Source": dataSourceKey }
127
- : undefined,
124
+ headers: dataSourceKey ? { "X-Data-Source": dataSourceKey } : undefined,
128
125
  unwrap: options.unwrapData === false ? "none" : "data",
129
126
  });
130
127
  };
@@ -200,9 +197,7 @@ export const dataProvider: DataProvider = {
200
197
  ? { rows: response.data, count: response.meta?.count }
201
198
  : response.data ?? response;
202
199
  const records = list.rows ?? [];
203
- if (cacheAllowedActions({ resource, records, response, meta })) {
204
- notifyRecordPermissionsChanged();
205
- }
200
+ cacheAllowedActions({ resource, records, response, meta });
206
201
 
207
202
  return {
208
203
  data: records,
@@ -226,16 +221,12 @@ export const dataProvider: DataProvider = {
226
221
  }
227
222
  );
228
223
  const data = getResponseData(response);
229
- if (
230
- cacheAllowedActions({
231
- resource,
232
- records: [data],
233
- response: response as NocoBaseListResponse<TData>,
234
- meta,
235
- })
236
- ) {
237
- notifyRecordPermissionsChanged();
238
- }
224
+ cacheAllowedActions({
225
+ resource,
226
+ records: [data],
227
+ response: response as NocoBaseListResponse<TData>,
228
+ meta,
229
+ });
239
230
  return {
240
231
  data,
241
232
  };
@@ -256,17 +247,14 @@ export const dataProvider: DataProvider = {
256
247
  )
257
248
  );
258
249
  const data = responses.map(getResponseData);
259
- let permissionsChanged = false;
260
250
  responses.forEach((response, index) => {
261
- permissionsChanged =
262
- cacheAllowedActions({
263
- resource,
264
- records: [data[index]],
265
- response: response as NocoBaseListResponse<TData>,
266
- meta,
267
- }) || permissionsChanged;
251
+ cacheAllowedActions({
252
+ resource,
253
+ records: [data[index]],
254
+ response: response as NocoBaseListResponse<TData>,
255
+ meta,
256
+ });
268
257
  });
269
- if (permissionsChanged) notifyRecordPermissionsChanged();
270
258
  return { data };
271
259
  },
272
260
 
@@ -17,3 +17,43 @@ export const getPortalBase = () =>
17
17
 
18
18
  export const getRuntimeApiUrl = () =>
19
19
  getWindowValue("NOCOBASE_API_URL") ?? import.meta.env.NOCOBASE_API_URL;
20
+
21
+ const getAppNameFromPortalBase = (base: string) =>
22
+ base.match(/\/x\/apps\/([^/]+)(?:\/|$)/)?.[1];
23
+
24
+ const getAppNameFromApiUrl = (apiUrl?: string) =>
25
+ apiUrl?.match(/\/api\/__app\/([^/?#]+)(?:[/?#]|$)/)?.[1];
26
+
27
+ export const resolveNocoBaseAppName = (portalBase: string, apiUrl?: string) =>
28
+ getAppNameFromPortalBase(portalBase) ??
29
+ getAppNameFromApiUrl(apiUrl) ??
30
+ "main";
31
+
32
+ export const getNocoBaseAppName = () =>
33
+ resolveNocoBaseAppName(getPortalBase(), getRuntimeApiUrl());
34
+
35
+ export const resolvePortalUrl = (path = "/") => {
36
+ if (typeof window === "undefined") return path;
37
+ if (/^[a-z][a-z\d+.-]*:/i.test(path)) return path;
38
+
39
+ const portalBase = getPortalBase();
40
+ const relativePath = path.replace(/^\/+/, "");
41
+ const portalUrl = new URL(
42
+ relativePath,
43
+ `${window.location.origin}${portalBase}`
44
+ );
45
+ const apiUrl = new URL(
46
+ getRuntimeApiUrl() || "/api",
47
+ window.location.origin
48
+ );
49
+
50
+ // Same-origin deployments should use a root-relative callback. Besides
51
+ // avoiding unnecessary origin coupling, this remains compatible with older
52
+ // SSO plugins that only accept NocoBase-local redirect paths. A standalone
53
+ // Portal dev server keeps the absolute URL so the callback can return to
54
+ // Vite instead of the deployed Portal route.
55
+ if (apiUrl.origin === portalUrl.origin) {
56
+ return `${portalUrl.pathname}${portalUrl.search}${portalUrl.hash}`;
57
+ }
58
+ return portalUrl.toString();
59
+ };
package/src/vite-env.d.ts CHANGED
@@ -3,4 +3,13 @@
3
3
  interface Window {
4
4
  NOCOBASE_PORTAL_BASE?: string;
5
5
  NOCOBASE_API_URL?: string;
6
+ __nocobase_api_client_storage_prefix__?: string;
7
+ __nocobase_api_client_storage_type__?: string;
8
+ __nocobase_api_client_share_token__?: boolean | string;
9
+ }
10
+
11
+ interface ImportMetaEnv {
12
+ readonly API_CLIENT_STORAGE_PREFIX?: string;
13
+ readonly API_CLIENT_STORAGE_TYPE?: string;
14
+ readonly API_CLIENT_SHARE_TOKEN?: string;
6
15
  }
@@ -0,0 +1,101 @@
1
+ import assert from "node:assert/strict";
2
+ import { createServer } from "vite";
3
+
4
+ const server = await createServer({
5
+ appType: "custom",
6
+ logLevel: "silent",
7
+ server: { middlewareMode: true },
8
+ });
9
+
10
+ const createStorage = () => {
11
+ const values = new Map();
12
+ return {
13
+ getItem: (key) => values.get(key) ?? null,
14
+ setItem: (key, value) => values.set(key, value),
15
+ removeItem: (key) => values.delete(key),
16
+ };
17
+ };
18
+
19
+ try {
20
+ const { AuthSession } = await server.ssrLoadModule(
21
+ "/src/lib/nocobase/auth-session.ts"
22
+ );
23
+ const { resolveNocoBaseAppName, resolvePortalUrl } = await server.ssrLoadModule(
24
+ "/src/providers/runtime-config.ts"
25
+ );
26
+
27
+ assert.equal(
28
+ resolveNocoBaseAppName(
29
+ "/nocobase/x/apps/crm/customer/",
30
+ "/nocobase/api/__app/crm"
31
+ ),
32
+ "crm"
33
+ );
34
+ assert.equal(
35
+ resolveNocoBaseAppName("/x/customer/", "/api/__app/analytics"),
36
+ "analytics"
37
+ );
38
+ assert.equal(resolveNocoBaseAppName("/x/customer/", "/api"), "main");
39
+
40
+ const originalWindow = globalThis.window;
41
+ Object.defineProperty(globalThis, "window", {
42
+ configurable: true,
43
+ value: {
44
+ location: { origin: "http://localhost:14000" },
45
+ NOCOBASE_API_URL: "/api",
46
+ NOCOBASE_PORTAL_BASE: "/x/demo/",
47
+ },
48
+ });
49
+ assert.equal(
50
+ resolvePortalUrl("/users?tab=active#list"),
51
+ "/x/demo/users?tab=active#list"
52
+ );
53
+
54
+ window.NOCOBASE_API_URL = "/api/__app/crm";
55
+ window.NOCOBASE_PORTAL_BASE = "/x/apps/crm/customer/";
56
+ assert.equal(
57
+ resolvePortalUrl("/users?tab=active#list"),
58
+ "/x/apps/crm/customer/users?tab=active#list"
59
+ );
60
+
61
+ window.NOCOBASE_API_URL = "http://127.0.0.1:13000/api";
62
+ window.NOCOBASE_PORTAL_BASE = "/x/demo/";
63
+ assert.equal(
64
+ resolvePortalUrl("/users?tab=active#list"),
65
+ "http://localhost:14000/x/demo/users?tab=active#list"
66
+ );
67
+
68
+ if (originalWindow === undefined) {
69
+ delete globalThis.window;
70
+ } else {
71
+ Object.defineProperty(globalThis, "window", {
72
+ configurable: true,
73
+ value: originalWindow,
74
+ });
75
+ }
76
+
77
+ const main = new AuthSession({ appName: "main", storage: createStorage() });
78
+ assert.equal(main.getStorageKey("token"), "NOCOBASE_TOKEN");
79
+ assert.equal(main.getStorageKey("auth"), "NOCOBASE_AUTH");
80
+ assert.equal(main.getStorageKey("role"), "NOCOBASE_ROLE");
81
+
82
+ const subApp = new AuthSession({
83
+ appName: "crm",
84
+ storage: createStorage(),
85
+ });
86
+ assert.equal(subApp.getStorageKey("token"), "NOCOBASE_CRM_TOKEN");
87
+ assert.equal(subApp.getStorageKey("auth"), "NOCOBASE_CRM_AUTH");
88
+ assert.equal(subApp.getStorageKey("role"), "NOCOBASE_CRM_ROLE");
89
+
90
+ const sharedToken = new AuthSession({
91
+ appName: "crm",
92
+ shareToken: true,
93
+ storage: createStorage(),
94
+ });
95
+ assert.equal(sharedToken.getStorageKey("token"), "NOCOBASE_TOKEN");
96
+ assert.equal(sharedToken.getStorageKey("auth"), "NOCOBASE_CRM_AUTH");
97
+
98
+ console.log("NocoBase authentication session regression tests passed");
99
+ } finally {
100
+ await server.close();
101
+ }
package/tsconfig.json CHANGED
@@ -18,8 +18,9 @@
18
18
  "noUncheckedSideEffectImports": true,
19
19
  "baseUrl": ".",
20
20
  "paths": {
21
+ "@/extensions/*": ["./registry/*", "./src/extensions/*"],
21
22
  "@/*": ["./src/*"]
22
23
  }
23
24
  },
24
- "include": ["src"]
25
+ "include": ["src", "registry"]
25
26
  }
package/vite.config.ts CHANGED
@@ -37,6 +37,9 @@ const defaultRuntimeConfig = `<!-- nocobase-runtime-config:start -->
37
37
  <script>
38
38
  window.NOCOBASE_PORTAL_BASE = "/";
39
39
  window.NOCOBASE_API_URL = "/api";
40
+ window.__nocobase_api_client_storage_prefix__ = window.__nocobase_api_client_storage_prefix__ ?? "NOCOBASE_";
41
+ window.__nocobase_api_client_storage_type__ = window.__nocobase_api_client_storage_type__ ?? "localStorage";
42
+ window.__nocobase_api_client_share_token__ = window.__nocobase_api_client_share_token__ ?? false;
40
43
  </script>
41
44
  <!-- nocobase-runtime-config:end -->
42
45
  `;
@@ -96,13 +99,18 @@ export default defineConfig(({ mode }) => {
96
99
  : undefined;
97
100
 
98
101
  const portalBase = normalizeBase(env.NOCOBASE_PORTAL_BASE);
102
+ const registrySourceRoot = path.resolve(__dirname, "./registry");
103
+ const extensionsRoot = fs.existsSync(registrySourceRoot)
104
+ ? registrySourceRoot
105
+ : path.resolve(__dirname, "./src/extensions");
99
106
 
100
107
  return {
101
108
  base: portalBase,
102
- envPrefix: ["VITE_", "NOCOBASE_"],
109
+ envPrefix: ["VITE_", "NOCOBASE_", "API_CLIENT_"],
103
110
  plugins: [react(), tailwindcss(), copyRawIndexHtmlPlugin(portalBase)],
104
111
  resolve: {
105
112
  alias: {
113
+ "@/extensions": extensionsRoot,
106
114
  "@": path.resolve(__dirname, "./src"),
107
115
  },
108
116
  },
@@ -1 +0,0 @@
1
- import{_ as j,m as S,k as $,bB as te,aD as se,D as O,o as he,aR as de,a1 as ve,c0 as ge,d4 as me,b$ as ye,b_ as xe,y as v,H as P,ai as Ve,c8 as Ae,ao as we,aC as Me,c7 as re,cc as be,c1 as Ie,a4 as G,cF as ie,d5 as Se,b as Te,aS as Le,aM as _e,as as D,a9 as H,d6 as Ce,f as ne,aN as Ne,d7 as X,d8 as Y,ba as ze,b9 as J}from"./echarts-runtime-CEgJbv68.js";var C=me.value;function R(r,e){return $({show:e},r)}var Pe=(function(r){j(e,r);function e(){var a=r!==null&&r.apply(this,arguments)||this;return a.type=e.type,a}return e.prototype.optionUpdated=function(){var a=this.get("boundaryGap"),t=this.get("splitNumber"),i=this.get("scale"),n=this.get("axisLine"),o=this.get("axisTick"),s=this.get("axisLabel"),u=this.get("axisName"),f=this.get(["axisName","show"]),l=this.get(["axisName","formatter"]),h=this.get("axisNameGap"),m=this.get("triggerEvent"),A=S(this.get("indicator")||[],function(c){c.max!=null&&c.max>0&&!c.min?c.min=0:c.min!=null&&c.min<0&&!c.max&&(c.max=0);var g=u;c.color!=null&&(g=$({color:c.color},u));var d=te(se(c),{boundaryGap:a,splitNumber:t,scale:i,axisLine:n,axisTick:o,axisLabel:s,name:c.text,showName:f,nameLocation:"end",nameGap:h,nameTextStyle:g,triggerEvent:m},!1);if(O(l)){var x=d.name;d.name=l.replace("{value}",x??"")}else he(l)&&(d.name=l(d.name,d));var y=new de(d,null,this.ecModel);return ve(y,ge.prototype),y.mainType="radar",y.componentIndex=this.componentIndex,y},this);this._indicatorModels=A},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:te({lineStyle:{color:"#bbb"}},C.axisLine),axisLabel:R(C.axisLabel,!1),axisTick:R(C.axisTick,!1),splitLine:R(C.splitLine,!0),splitArea:R(C.splitArea,!0),indicator:[]},e})(ye),De=["axisLine","axisTickLabel","axisName"],He=(function(r){j(e,r);function e(){var a=r!==null&&r.apply(this,arguments)||this;return a.type=e.type,a}return e.prototype.render=function(a,t,i){var n=this.group;n.removeAll(),this._buildAxes(a),this._buildSplitLineAndArea(a)},e.prototype._buildAxes=function(a){var t=a.coordinateSystem,i=t.getIndicatorAxes(),n=S(i,function(o){var s=o.model.get("showName")?o.name:"",u=new xe(o.model,{axisName:s,position:[t.cx,t.cy],rotation:o.angle,labelDirection:-1,tickDirection:-1,nameDirection:1});return u});v(n,function(o){v(De,o.add,o),this.group.add(o.getGroup())},this)},e.prototype._buildSplitLineAndArea=function(a){var t=a.coordinateSystem,i=t.getIndicatorAxes();if(!i.length)return;var n=a.get("shape"),o=a.getModel("splitLine"),s=a.getModel("splitArea"),u=o.getModel("lineStyle"),f=s.getModel("areaStyle"),l=o.get("show"),h=s.get("show"),m=u.get("color"),A=f.get("color"),c=P(m)?m:[m],g=P(A)?A:[A],d=[],x=[];function y(V,b,L){var _=L%b.length;return V[_]=V[_]||[],_}if(n==="circle")for(var T=i[0].getTicksCoords(),ee=t.cx,ae=t.cy,p=0;p<T.length;p++){if(l){var w=y(d,c,p);d[w].push(new Ve({shape:{cx:ee,cy:ae,r:T[p].coord}}))}if(h&&p<T.length-1){var w=y(x,g,p);x[w].push(new Ae({shape:{cx:ee,cy:ae,r0:T[p].coord,r:T[p+1].coord}}))}}else for(var E,ce=S(i,function(V,b){var L=V.getTicksCoords();return E=E==null?L.length-1:Math.min(L.length-1,E),S(L,function(_){return t.coordToPoint(_.coord,b)})}),Z=[],p=0;p<=E;p++){for(var M=[],q=0;q<i.length;q++)M.push(ce[q][p]);if(M[0]&&M.push(M[0].slice()),l){var w=y(d,c,p);d[w].push(new we({shape:{points:M}}))}if(h&&Z){var w=y(x,g,p-1);x[w].push(new Me({shape:{points:M.concat(Z)}}))}Z=M.slice().reverse()}var fe=u.getLineStyle(),pe=f.getAreaStyle();v(x,function(V,b){this.group.add(re(V,{style:$({stroke:"none",fill:g[b%g.length]},pe),silent:!0}))},this),v(d,function(V,b){this.group.add(re(V,{style:$({fill:"none",stroke:c[b%c.length]},fe),silent:!0}))},this)},e.type="radar",e})(be),ke=(function(r){j(e,r);function e(a,t,i){var n=r.call(this,a,t,i)||this;return n.type="value",n.angle=0,n.name="",n}return e})(Ie),Ee=(function(){function r(e,a,t){this.dimensions=[],this._model=e,this._indicatorAxes=S(e.getIndicatorModels(),function(i,n){var o="indicator_"+n,s=new ke(o,new ie);return s.name=i.get("name"),s.model=i,i.axis=s,this.dimensions.push(o),s},this),this.resize(e,t)}return r.prototype.getIndicatorAxes=function(){return this._indicatorAxes},r.prototype.dataToPoint=function(e,a){var t=this._indicatorAxes[a];return this.coordToPoint(t.dataToCoord(e),a)},r.prototype.coordToPoint=function(e,a){var t=this._indicatorAxes[a],i=t.angle,n=this.cx+e*Math.cos(i),o=this.cy-e*Math.sin(i);return[n,o]},r.prototype.pointToData=function(e){var a=e[0]-this.cx,t=e[1]-this.cy,i=Math.sqrt(a*a+t*t);a/=i,t/=i;for(var n=Math.atan2(-t,a),o=1/0,s,u=-1,f=0;f<this._indicatorAxes.length;f++){var l=this._indicatorAxes[f],h=Math.abs(n-l.angle);h<o&&(s=l,u=f,o=h)}return[u,+(s&&s.coordToData(i))]},r.prototype.resize=function(e,a){var t=e.get("center"),i=a.getWidth(),n=a.getHeight(),o=Math.min(i,n)/2;this.cx=G(t[0],i),this.cy=G(t[1],n),this.startAngle=e.get("startAngle")*Math.PI/180;var s=e.get("radius");(O(s)||Te(s))&&(s=[0,s]),this.r0=G(s[0],o),this.r=G(s[1],o),v(this._indicatorAxes,function(u,f){u.setExtent(this.r0,this.r);var l=this.startAngle+f*Math.PI*2/this._indicatorAxes.length;l=Math.atan2(Math.sin(l),Math.cos(l)),u.angle=l},this)},r.prototype.update=function(e,a){var t=this._indicatorAxes,i=this._model;v(t,function(s){s.scale.setExtent(1/0,-1/0)}),e.eachSeriesByType("radar",function(s,u){if(!(s.get("coordinateSystem")!=="radar"||e.getComponent("radar",s.get("radarIndex"))!==i)){var f=s.getData();v(t,function(l){l.scale.unionExtentFromData(f,f.mapDimension(l.dim))})}},this);var n=i.get("splitNumber"),o=new ie;o.setExtent(0,n),o.setInterval(1),v(t,function(s,u){Se(s.scale,s.model,o)})},r.prototype.convertToPixel=function(e,a,t){return console.warn("Not implemented."),null},r.prototype.convertFromPixel=function(e,a,t){return console.warn("Not implemented."),null},r.prototype.containPoint=function(e){return console.warn("Not implemented."),!1},r.create=function(e,a){var t=[];return e.eachComponent("radar",function(i){var n=new r(i,e,a);t.push(n),i.coordinateSystem=n}),e.eachSeriesByType("radar",function(i){i.get("coordinateSystem")==="radar"&&(i.coordinateSystem=t[i.get("radarIndex")||0])}),t},r.dimensions=[],r})();function Ue(r){r.registerCoordinateSystem("radar",Ee),r.registerComponentModel(Pe),r.registerComponentView(He),r.registerVisual({seriesType:"radar",reset:function(e){var a=e.getData();a.each(function(t){a.setItemVisual(t,"legendIcon","roundRect")}),a.setVisual("legendIcon","roundRect")}})}var k=v,Ge=H,U=-1,le=(function(){function r(e){var a=e.mappingMethod,t=e.type,i=this.option=se(e);this.type=t,this.mappingMethod=a,this._normalizeData=Be[a];var n=r.visualHandlers[t];this.applyVisual=n.applyVisual,this.getColorMapper=n.getColorMapper,this._normalizedToVisual=n._normalizedToVisual[a],a==="piecewise"?(K(i),Re(i)):a==="category"?i.categories?Fe(i):K(i,!0):(_e(a!=="linear"||i.dataExtent),K(i))}return r.prototype.mapValueToVisual=function(e){var a=this._normalizeData(e);return this._normalizedToVisual(a,e)},r.prototype.getNormalizer=function(){return ne(this._normalizeData,this)},r.listVisualTypes=function(){return Ne(r.visualHandlers)},r.isValidType=function(e){return r.visualHandlers.hasOwnProperty(e)},r.eachVisual=function(e,a,t){H(e)?v(e,a,t):a.call(t,e)},r.mapVisual=function(e,a,t){var i,n=P(e)?[]:H(e)?{}:(i=!0,null);return r.eachVisual(e,function(o,s){var u=a.call(t,o,s);i?n=u:n[s]=u}),n},r.retrieveVisuals=function(e){var a={},t;return e&&k(r.visualHandlers,function(i,n){e.hasOwnProperty(n)&&(a[n]=e[n],t=!0)}),t?a:null},r.prepareVisualTypes=function(e){if(P(e))e=e.slice();else if(Ge(e)){var a=[];k(e,function(t,i){a.push(i)}),e=a}else return[];return e.sort(function(t,i){return i==="color"&&t!=="color"&&t.indexOf("color")===0?1:-1}),e},r.dependsOn=function(e,a){return a==="color"?!!(e&&e.indexOf(a)===0):e===a},r.findPieceIndex=function(e,a,t){for(var i,n=1/0,o=0,s=a.length;o<s;o++){var u=a[o].value;if(u!=null){if(u===e||O(u)&&u===e+"")return o;t&&m(u,o)}}for(var o=0,s=a.length;o<s;o++){var f=a[o],l=f.interval,h=f.close;if(l){if(l[0]===-1/0){if(B(h[1],e,l[1]))return o}else if(l[1]===1/0){if(B(h[0],l[0],e))return o}else if(B(h[0],l[0],e)&&B(h[1],e,l[1]))return o;t&&m(l[0],o),t&&m(l[1],o)}}if(t)return e===1/0?a.length-1:e===-1/0?0:i;function m(A,c){var g=Math.abs(A-e);g<n&&(n=g,i=c)}},r.visualHandlers={color:{applyVisual:N("color"),getColorMapper:function(){var e=this.option;return ne(e.mappingMethod==="category"?function(a,t){return!t&&(a=this._normalizeData(a)),z.call(this,a)}:function(a,t,i){var n=!!i;return!t&&(a=this._normalizeData(a)),i=Y(a,e.parsedVisual,i),n?i:X(i,"rgba")},this)},_normalizedToVisual:{linear:function(e){return X(Y(e,this.option.parsedVisual),"rgba")},category:z,piecewise:function(e,a){var t=W.call(this,a);return t==null&&(t=X(Y(e,this.option.parsedVisual),"rgba")),t},fixed:I}},colorHue:F(function(e,a){return J(e,a)}),colorSaturation:F(function(e,a){return J(e,null,a)}),colorLightness:F(function(e,a){return J(e,null,null,a)}),colorAlpha:F(function(e,a){return ze(e,a)}),decal:{applyVisual:N("decal"),_normalizedToVisual:{linear:null,category:z,piecewise:null,fixed:null}},opacity:{applyVisual:N("opacity"),_normalizedToVisual:Q([0,1])},liftZ:{applyVisual:N("liftZ"),_normalizedToVisual:{linear:I,category:I,piecewise:I,fixed:I}},symbol:{applyVisual:function(e,a,t){var i=this.mapValueToVisual(e);t("symbol",i)},_normalizedToVisual:{linear:oe,category:z,piecewise:function(e,a){var t=W.call(this,a);return t==null&&(t=oe.call(this,e)),t},fixed:I}},symbolSize:{applyVisual:N("symbolSize"),_normalizedToVisual:Q([0,1])}},r})();function Re(r){var e=r.pieceList;r.hasSpecialVisual=!1,v(e,function(a,t){a.originIndex=t,a.visual!=null&&(r.hasSpecialVisual=!0)})}function Fe(r){var e=r.categories,a=r.categoryMap={},t=r.visual;if(k(e,function(o,s){a[o]=s}),!P(t)){var i=[];H(t)?k(t,function(o,s){var u=a[s];i[u??U]=o}):i[U]=t,t=ue(r,i)}for(var n=e.length-1;n>=0;n--)t[n]==null&&(delete a[e[n]],e.pop())}function K(r,e){var a=r.visual,t=[];H(a)?k(a,function(n){t.push(n)}):a!=null&&t.push(a);var i={color:1,symbol:1};!e&&t.length===1&&!i.hasOwnProperty(r.type)&&(t[1]=t[0]),ue(r,t)}function F(r){return{applyVisual:function(e,a,t){var i=this.mapValueToVisual(e);t("color",r(a("color"),i))},_normalizedToVisual:Q([0,1])}}function oe(r){var e=this.option.visual;return e[Math.round(D(r,[0,1],[0,e.length-1],!0))]||{}}function N(r){return function(e,a,t){t(r,this.mapValueToVisual(e))}}function z(r){var e=this.option.visual;return e[this.option.loop&&r!==U?r%e.length:r]}function I(){return this.option.visual[0]}function Q(r){return{linear:function(e){return D(e,r,this.option.visual,!0)},category:z,piecewise:function(e,a){var t=W.call(this,a);return t==null&&(t=D(e,r,this.option.visual,!0)),t},fixed:I}}function W(r){var e=this.option,a=e.pieceList;if(e.hasSpecialVisual){var t=le.findPieceIndex(r,a),i=a[t];if(i&&i.visual)return i.visual[this.type]}}function ue(r,e){return r.visual=e,r.type==="color"&&(r.parsedVisual=S(e,function(a){var t=Ce(a);return t||[0,0,0,1]})),e}var Be={linear:function(r){return D(r,this.option.dataExtent,[0,1],!0)},piecewise:function(r){var e=this.option.pieceList,a=le.findPieceIndex(r,e,!0);if(a!=null)return D(a,[0,e.length-1],[0,1],!0)},category:function(r){var e=this.option.categories?this.option.categoryMap[r]:r;return e??U},fixed:Le};function B(r,e,a){return r?e<=a:e<a}export{le as V,Ue as i};
@@ -1 +0,0 @@
1
- import{aZ as A,r as I,b7 as S,b8 as w,j as e,b9 as z,ba as E,bb as x,c as H,bc as B,B as F,bd as M,be as P}from"./index-C6xNKxpg.js";function k({aiEmployee:n,tasks:i=[],context:r,target:f,auto:h,size:l=48,label:a,showNotice:c=!1,className:b,onTrigger:o}){const d=A(),[g,u]=I.useState(!1),j=S(),v=w(),N=f??j,t=typeof n=="string"?d.employees.find(s=>s.username===n):d.employees.find(s=>s.username===n.username)??n;if(!t)return null;const m=s=>{o==null||o(s),N.triggerTask({aiEmployee:t,task:s,tasks:s?void 0:i,context:r!=null&&r.length?r:v,auto:h,open:!0})},p=i.filter(s=>s.title);return e.jsxs(z,{children:[e.jsxs(E,{render:e.jsx("button",{type:"button",className:H("group/ai-shortcut relative inline-flex items-center gap-2 rounded-full outline-none transition-transform hover:scale-[1.04] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",a&&"border bg-background pr-3 shadow-sm",b),onClick:()=>m(),onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1)}),children:[e.jsx(x,{employee:t,flip:g||c,className:"transition-[filter] group-hover/ai-shortcut:brightness-105",style:{width:l,height:l}}),a?e.jsx("span",{className:"text-sm font-medium",children:a}):null,c?e.jsx("span",{className:"absolute top-0 right-0 size-2.5 rounded-full border-2 border-background bg-foreground"}):null]}),e.jsxs(B,{side:"top",align:"start",className:"w-72 p-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(x,{employee:t,className:"size-10"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate text-sm font-medium",children:t.nickname}),t.position?e.jsx("div",{className:"truncate text-xs text-muted-foreground",children:t.position}):null]})]}),t.bio??t.description?e.jsx("p",{className:"mt-3 border-t pt-3 text-xs leading-5 text-muted-foreground",children:t.bio??t.description}):null,p.length?e.jsx("div",{className:"mt-3 flex flex-wrap gap-1.5 border-t pt-3",children:p.map((s,C)=>e.jsxs(F,{variant:"secondary",size:"sm",className:"h-auto min-h-7 whitespace-normal py-1 text-left",onClick:y=>{y.stopPropagation(),m(s)},children:[s.autoSend?e.jsx(M,{className:"size-3.5"}):e.jsx(P,{className:"size-3.5"}),e.jsx("span",{children:s.title}),e.jsx("span",{className:"text-[10px] text-muted-foreground",children:s.autoSend?"Auto send":"Fill composer"})]},`${s.title}-${C}`))}):null]})]})}export{k as A};