@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,158 +0,0 @@
1
- import { NocoBaseAIExtensionProvider } from "./global-ai-chat";
2
- import type { AppExtension } from "@/app/extension";
3
- import { LoadingState } from "@/components/app-shell/loading-state";
4
- import {
5
- Bot,
6
- MessageSquare,
7
- MousePointer2,
8
- PanelRight,
9
- Sparkles,
10
- Wrench,
11
- } from "lucide-react";
12
- import { lazy, Suspense, type ReactNode } from "react";
13
- import { Outlet, Route } from "react-router";
14
-
15
- const AIChatPage = lazy(() =>
16
- import("./demo").then((module) => ({ default: module.AIChatPage }))
17
- );
18
- const FloatingChatPage = lazy(() =>
19
- import("./demo/floating").then((module) => ({
20
- default: module.FloatingChatPage,
21
- }))
22
- );
23
- const ShortcutPage = lazy(() =>
24
- import("./demo/shortcut").then((module) => ({
25
- default: module.ShortcutPage,
26
- }))
27
- );
28
- const PageContextPage = lazy(() =>
29
- import("./demo/page-context").then((module) => ({
30
- default: module.PageContextPage,
31
- }))
32
- );
33
- const ToolCardsPage = lazy(() =>
34
- import("./demo/tool-cards").then((module) => ({
35
- default: module.ToolCardsPage,
36
- }))
37
- );
38
-
39
- function LazyDemoRoute({ children }: { children: ReactNode }) {
40
- return (
41
- <Suspense fallback={<LoadingState className="min-h-[320px]" />}>
42
- {children}
43
- </Suspense>
44
- );
45
- }
46
-
47
- const nocobaseAIExtension: AppExtension = {
48
- id: "nocobase-ai",
49
- Provider: NocoBaseAIExtensionProvider,
50
- resources: [
51
- {
52
- name: "ai-components",
53
- meta: {
54
- label: "AI Components",
55
- icon: <Bot />,
56
- acl: { type: "authenticated" },
57
- },
58
- },
59
- {
60
- name: "ai-chat-window",
61
- list: "/ai-chat",
62
- meta: {
63
- parent: "ai-components",
64
- label: "Chat window",
65
- icon: <MessageSquare />,
66
- description:
67
- "Build freely with AI while NocoBase keeps the application reliable.",
68
- acl: { type: "authenticated" },
69
- },
70
- },
71
- {
72
- name: "ai-floating-chat",
73
- list: "/ai-chat/floating",
74
- meta: {
75
- parent: "ai-components",
76
- label: "Floating chat",
77
- icon: <PanelRight />,
78
- acl: { type: "authenticated" },
79
- },
80
- },
81
- {
82
- name: "ai-employee-tasks",
83
- list: "/ai-chat/shortcut",
84
- meta: {
85
- parent: "ai-components",
86
- label: "Employee tasks",
87
- icon: <Sparkles />,
88
- acl: { type: "authenticated" },
89
- },
90
- },
91
- {
92
- name: "ai-page-context",
93
- list: "/ai-chat/context",
94
- meta: {
95
- parent: "ai-components",
96
- label: "Page context",
97
- icon: <MousePointer2 />,
98
- acl: { type: "authenticated" },
99
- },
100
- },
101
- {
102
- name: "ai-tool-cards",
103
- list: "/ai-chat/tools",
104
- meta: {
105
- parent: "ai-components",
106
- label: "Tool cards",
107
- icon: <Wrench />,
108
- acl: { type: "authenticated" },
109
- },
110
- },
111
- ],
112
- routes: (
113
- <Route key="nocobase-ai" path="/ai-chat" element={<Outlet />}>
114
- <Route
115
- index
116
- element={
117
- <LazyDemoRoute>
118
- <AIChatPage />
119
- </LazyDemoRoute>
120
- }
121
- />
122
- <Route
123
- path="floating"
124
- element={
125
- <LazyDemoRoute>
126
- <FloatingChatPage />
127
- </LazyDemoRoute>
128
- }
129
- />
130
- <Route
131
- path="shortcut"
132
- element={
133
- <LazyDemoRoute>
134
- <ShortcutPage />
135
- </LazyDemoRoute>
136
- }
137
- />
138
- <Route
139
- path="context"
140
- element={
141
- <LazyDemoRoute>
142
- <PageContextPage />
143
- </LazyDemoRoute>
144
- }
145
- />
146
- <Route
147
- path="tools"
148
- element={
149
- <LazyDemoRoute>
150
- <ToolCardsPage />
151
- </LazyDemoRoute>
152
- }
153
- />
154
- </Route>
155
- ),
156
- };
157
-
158
- export default nocobaseAIExtension;
@@ -1,70 +0,0 @@
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
- try {
11
- const {
12
- buildBusinessReportMarkdown,
13
- renderBusinessReportMarkdownToHtml,
14
- splitBusinessReportMarkdown,
15
- } = await server.ssrLoadModule(
16
- "/registry/nocobase-ai/components/tools/business-report-utils.tsx"
17
- );
18
-
19
- const markdown = buildBusinessReportMarkdown({
20
- title: "Quarterly report",
21
- summary: "A complete report summary.",
22
- markdown: `## KPI overview
23
-
24
- | Metric | Value |
25
- | --- | ---: |
26
- | Revenue | 1286 |
27
-
28
- {{chart:1}}
29
-
30
- ## Trend analysis
31
-
32
- The trend continued after the first chart.
33
-
34
- {{chart:2}}
35
-
36
- ## Recommendations
37
-
38
- Keep the final section in the exported HTML.`,
39
- charts: [
40
- { title: "Trend", options: { series: [{ type: "line", data: [1, 2] }] } },
41
- { title: "Mix", options: { series: [{ type: "pie", data: [1, 2] }] } },
42
- ],
43
- });
44
- const parts = splitBusinessReportMarkdown(markdown);
45
-
46
- assert.equal(parts.length, 5);
47
- assert.equal(parts[0].type, "markdown");
48
- assert.match(parts[0].content, /Quarterly report/);
49
- assert.match(parts[0].content, /KPI overview/);
50
- assert.equal(parts[1].type, "chart");
51
- assert.match(parts[2].content, /Trend analysis/);
52
- assert.equal(parts[3].type, "chart");
53
- assert.match(parts[4].content, /Recommendations/);
54
-
55
- const firstSectionHtml = await renderBusinessReportMarkdownToHtml(
56
- parts[0].content
57
- );
58
- assert.match(firstSectionHtml, /<h1>Quarterly report<\/h1>/);
59
- assert.match(firstSectionHtml, /<h2>KPI overview<\/h2>/);
60
- assert.match(firstSectionHtml, /<table>/);
61
- assert.match(firstSectionHtml, /Revenue/);
62
-
63
- console.log("AI business report regression tests passed");
64
- } finally {
65
- await server.close();
66
- }
67
-
68
- // React's browser prerender runtime keeps an internal MessagePort alive in
69
- // Node even after the assertion and Vite server have completed.
70
- process.exit(0);
@@ -1,129 +0,0 @@
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
- try {
11
- const { AIFormRegistry, createFormFillerInvoker } =
12
- await server.ssrLoadModule(
13
- "/registry/nocobase-ai/providers/form-registry.tsx"
14
- );
15
-
16
- const registry = new AIFormRegistry();
17
- const applied = [];
18
- const unregister = registry.register({
19
- id: "lead-form",
20
- title: "Lead form",
21
- fields: [
22
- { name: "company", type: "string" },
23
- {
24
- name: "priority",
25
- type: "string",
26
- enum: ["normal", "high"],
27
- },
28
- { name: "owner", type: "string", readonly: true },
29
- ],
30
- getValues: () => ({}),
31
- setValues: (values) => applied.push(values),
32
- });
33
- const invoke = createFormFillerInvoker(registry);
34
-
35
- const allowedContext = { allowedFormIds: ["lead-form"] };
36
- assert.deepEqual(
37
- await invoke(
38
- {
39
- form: "lead-form",
40
- data: { company: "Acme", priority: "high" },
41
- },
42
- allowedContext
43
- ),
44
- {
45
- status: "success",
46
- content:
47
- 'Filled "Lead form". Please review the values and submit the form manually.',
48
- appliedFields: ["company", "priority"],
49
- skippedFields: [],
50
- }
51
- );
52
- assert.deepEqual(applied, [{ company: "Acme", priority: "high" }]);
53
-
54
- assert.deepEqual(
55
- await invoke(
56
- {
57
- form: "lead-form",
58
- data: { company: 42, owner: "Ada", unknown: true },
59
- },
60
- allowedContext
61
- ),
62
- {
63
- status: "error",
64
- content: 'No valid editable fields were provided for "Lead form".',
65
- appliedFields: [],
66
- skippedFields: [
67
- {
68
- name: "company",
69
- reason: "invalid",
70
- message: "Expected a string.",
71
- },
72
- {
73
- name: "owner",
74
- reason: "readonly",
75
- message: "This field is read-only.",
76
- },
77
- {
78
- name: "unknown",
79
- reason: "undeclared",
80
- message: "This field is not declared by the target form.",
81
- },
82
- ],
83
- }
84
- );
85
-
86
- assert.throws(
87
- () =>
88
- registry.register({
89
- id: "lead-form",
90
- title: "Duplicate lead form",
91
- fields: [],
92
- getValues: () => ({}),
93
- setValues: () => undefined,
94
- }),
95
- /already registered/
96
- );
97
-
98
- unregister();
99
- assert.deepEqual(
100
- await invoke(
101
- { form: "lead-form", data: { company: "Acme" } },
102
- allowedContext
103
- ),
104
- {
105
- status: "error",
106
- content: 'The target form "lead-form" is not available on this page.',
107
- appliedFields: [],
108
- skippedFields: [],
109
- }
110
- );
111
-
112
- assert.deepEqual(
113
- await invoke(
114
- { form: "lead-form", data: { company: "Acme" } },
115
- { allowedFormIds: [] }
116
- ),
117
- {
118
- status: "error",
119
- content:
120
- 'The target form "lead-form" is not available in this conversation context.',
121
- appliedFields: [],
122
- skippedFields: [],
123
- }
124
- );
125
-
126
- console.log("AI Form filler regression tests passed");
127
- } finally {
128
- await server.close();
129
- }
@@ -1,128 +0,0 @@
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
- try {
11
- const { AIFrontendToolRegistry, createFrontendToolInvokers } =
12
- await server.ssrLoadModule(
13
- "/registry/nocobase-ai/providers/frontend-tool-registry.tsx"
14
- );
15
-
16
- const registry = new AIFrontendToolRegistry();
17
- const calls = [];
18
- const unregister = registry.register("quote-card", {
19
- name: "update_quote_discount",
20
- description: "Update the quote discount preview.",
21
- permission: "ASK",
22
- inputSchema: {
23
- type: "object",
24
- properties: { discountPercent: { type: "number" } },
25
- },
26
- execute: (args) => {
27
- calls.push(args);
28
- return { updated: true };
29
- },
30
- });
31
- const [manifest] = registry.list("quote-card");
32
- assert.deepEqual(manifest, {
33
- id: "quote-card:update_quote_discount",
34
- blockUid: "quote-card",
35
- name: "update_quote_discount",
36
- title: undefined,
37
- description: "Update the quote discount preview.",
38
- permission: "ASK",
39
- inputSchema: {
40
- type: "object",
41
- properties: { discountPercent: { type: "number" } },
42
- },
43
- });
44
-
45
- const invokers = createFrontendToolInvokers(registry);
46
- const allowedContext = { allowedFrontendToolIds: [manifest.id] };
47
- assert.deepEqual(
48
- await invokers.loadFrontendTool({ toolId: manifest.id }, allowedContext),
49
- manifest
50
- );
51
- assert.deepEqual(
52
- await invokers.executeFrontendTool(
53
- { toolId: manifest.id, args: { discountPercent: 12 } },
54
- allowedContext
55
- ),
56
- { updated: true }
57
- );
58
- assert.deepEqual(calls, [{ discountPercent: 12 }]);
59
-
60
- assert.throws(
61
- () =>
62
- registry.register("quote-card", {
63
- name: "update_quote_discount",
64
- description: "Duplicate Tool",
65
- execute: () => undefined,
66
- }),
67
- /already registered/
68
- );
69
- assert.throws(
70
- () =>
71
- registry.register("quote-card", {
72
- name: "invalid_schema",
73
- description: "Invalid schema",
74
- inputSchema: [],
75
- execute: () => undefined,
76
- }),
77
- /inputSchema must be an object/
78
- );
79
-
80
- const unregisterInvalidResult = registry.register("quote-card", {
81
- name: "invalid_result",
82
- description: "Return an invalid result.",
83
- execute: () => ({ value: 1n }),
84
- });
85
- assert.deepEqual(
86
- await invokers.executeFrontendTool(
87
- { toolId: "quote-card:invalid_result", args: {} },
88
- {
89
- allowedFrontendToolIds: ["quote-card:invalid_result"],
90
- }
91
- ),
92
- {
93
- status: "error",
94
- content:
95
- 'Frontend Tool "quote-card:invalid_result" returned a non-serializable result',
96
- }
97
- );
98
- unregisterInvalidResult();
99
-
100
- unregister();
101
- assert.deepEqual(
102
- await invokers.executeFrontendTool(
103
- { toolId: manifest.id, args: {} },
104
- allowedContext
105
- ),
106
- {
107
- status: "error",
108
- content:
109
- 'Frontend Tool "quote-card:update_quote_discount" is unavailable',
110
- }
111
- );
112
-
113
- assert.deepEqual(
114
- await invokers.executeFrontendTool(
115
- { toolId: manifest.id, args: {} },
116
- { allowedFrontendToolIds: [] }
117
- ),
118
- {
119
- status: "error",
120
- content:
121
- 'Frontend Tool "quote-card:update_quote_discount" is not available in this conversation context',
122
- }
123
- );
124
-
125
- console.log("AI frontend Tool regression tests passed");
126
- } finally {
127
- await server.close();
128
- }
@@ -1,48 +0,0 @@
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
- try {
11
- const {
12
- createAIPageContextReference,
13
- getAIWorkContextRequiredTools,
14
- mergeAIRequiredTools,
15
- } = await server.ssrLoadModule(
16
- "/registry/nocobase-ai/providers/page-context.tsx"
17
- );
18
-
19
- const formContext = createAIPageContextReference({
20
- id: "lead-form",
21
- title: "Lead form",
22
- kind: "form",
23
- });
24
- assert.deepEqual(formContext, {
25
- type: "page-element",
26
- id: "lead-form",
27
- title: "Lead form",
28
- kind: "form",
29
- });
30
- assert.deepEqual(getAIWorkContextRequiredTools([formContext]), [
31
- "formFiller",
32
- ]);
33
- assert.deepEqual(
34
- mergeAIRequiredTools(
35
- { skills: ["lead-review"], tools: ["inspect-record"] },
36
- ["formFiller", "inspect-record"]
37
- ),
38
- {
39
- skills: ["lead-review"],
40
- tools: ["inspect-record", "formFiller"],
41
- }
42
- );
43
- assert.equal(mergeAIRequiredTools(undefined, []), undefined);
44
-
45
- console.log("AI page context regression tests passed");
46
- } finally {
47
- await server.close();
48
- }