@nocobase/client 2.1.0-alpha.1 → 2.1.0-alpha.2

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 (146) hide show
  1. package/.dumirc.ts +8 -0
  2. package/es/ai/ai-manager.d.ts +15 -0
  3. package/es/ai/index.d.ts +11 -0
  4. package/es/ai/tools-manager/hooks/context.d.ts +17 -0
  5. package/es/ai/tools-manager/hooks/index.d.ts +11 -0
  6. package/es/ai/tools-manager/hooks/provider.d.ts +16 -0
  7. package/es/ai/tools-manager/index.d.ts +21 -0
  8. package/es/ai/tools-manager/types.d.ts +80 -0
  9. package/es/ai/utils.d.ts +10 -0
  10. package/es/api-client/APIClient.d.ts +1 -0
  11. package/es/application/Application.d.ts +2 -0
  12. package/es/application/Plugin.d.ts +1 -0
  13. package/es/application/RouteRepository.d.ts +23 -0
  14. package/es/application/globalOperators.d.ts +11 -0
  15. package/es/block-provider/TableUidContext.d.ts +10 -0
  16. package/es/data-source/collection/utils.d.ts +2 -4
  17. package/es/flow/actions/aclCheckRefresh.d.ts +9 -0
  18. package/es/flow/actions/blockHeight.d.ts +9 -0
  19. package/es/flow/actions/filterFormDefaultValues.d.ts +9 -0
  20. package/es/flow/actions/formAssignRules.d.ts +9 -0
  21. package/es/flow/actions/index.d.ts +6 -0
  22. package/es/flow/actions/linkageRulesRefresh.d.ts +9 -0
  23. package/es/flow/actions/numberFormat.d.ts +9 -0
  24. package/es/flow/components/BlockItemCard.d.ts +1 -0
  25. package/es/flow/components/ConditionBuilder.d.ts +2 -0
  26. package/es/flow/components/DefaultValue.d.ts +1 -0
  27. package/es/flow/components/FieldAssignEditor.d.ts +32 -0
  28. package/es/flow/components/FieldAssignExactDatePicker.d.ts +23 -0
  29. package/es/flow/components/FieldAssignRulesEditor.d.ts +70 -0
  30. package/es/flow/components/FieldAssignValueInput.d.ts +42 -1
  31. package/es/flow/components/RunJSValueEditor.d.ts +19 -0
  32. package/es/flow/components/TextAreaWithContextSelector.d.ts +1 -0
  33. package/es/flow/components/code-editor/core/EditorCore.d.ts +3 -1
  34. package/es/flow/components/code-editor/formatDocInfo.d.ts +17 -0
  35. package/es/flow/components/code-editor/hooks/useCodeRunner.d.ts +3 -1
  36. package/es/flow/components/code-editor/index.d.ts +1 -0
  37. package/es/flow/components/code-editor/linter.d.ts +10 -2
  38. package/es/flow/components/code-editor/runjsCompletionSource.d.ts +20 -0
  39. package/es/flow/components/code-editor/runjsDiagnostics.d.ts +43 -0
  40. package/es/flow/components/fieldAssignOptions.d.ts +23 -0
  41. package/es/flow/components/filter/LinkageFilterItem.d.ts +4 -1
  42. package/es/flow/components/useAssociationTitleFieldSync.d.ts +13 -0
  43. package/es/flow/index.d.ts +2 -0
  44. package/es/flow/internal/utils/modelUtils.d.ts +23 -0
  45. package/es/flow/internal/utils/saveStepParamsWithSubModels.d.ts +11 -0
  46. package/es/flow/internal/utils/titleFieldQuickSync.d.ts +35 -0
  47. package/es/flow/models/base/AssociationFieldGroupModel.d.ts +1 -1
  48. package/es/flow/models/base/BlockModel.d.ts +3 -1
  49. package/es/flow/models/base/CollectionBlockModel.d.ts +29 -56
  50. package/es/flow/models/base/GridModel.d.ts +6 -0
  51. package/es/flow/models/base/PageModel/PageModel.d.ts +16 -0
  52. package/es/flow/models/blocks/details/DetailsGridModel.d.ts +1 -0
  53. package/es/flow/models/blocks/details/utils.d.ts +16 -0
  54. package/es/flow/models/blocks/filter-form/FieldOperatorSelect.d.ts +10 -0
  55. package/es/flow/models/blocks/filter-form/FilterFormBlockModel.d.ts +6 -0
  56. package/es/flow/models/blocks/filter-form/FilterFormItemModel.d.ts +5 -37
  57. package/es/flow/models/blocks/filter-form/customFieldOperators.d.ts +34 -0
  58. package/es/flow/models/blocks/filter-form/fields/FilterFormCustomFieldModel.d.ts +16 -0
  59. package/es/flow/models/blocks/filter-form/fields/FilterFormCustomRecordSelectFieldModel.d.ts +20 -0
  60. package/es/flow/models/blocks/filter-form/fields/FilterFormRecordSelectFieldModel.d.ts +12 -0
  61. package/es/flow/models/blocks/filter-form/fields/index.d.ts +2 -0
  62. package/es/flow/models/blocks/filter-form/index.d.ts +4 -0
  63. package/es/flow/models/blocks/filter-form/legacyDefaultValueMigration.d.ts +13 -0
  64. package/es/flow/models/blocks/filter-form/valueNormalization.d.ts +17 -0
  65. package/es/flow/models/blocks/filter-manager/flow-actions/defaultOperator.d.ts +1 -3
  66. package/es/flow/models/blocks/form/CreateFormModel.d.ts +2 -1
  67. package/es/flow/models/blocks/form/EditFormModel.d.ts +2 -1
  68. package/es/flow/models/blocks/form/FormAssociationFieldGroupModel.d.ts +12 -0
  69. package/es/flow/models/blocks/form/FormAssociationItemModel.d.ts +39 -0
  70. package/es/flow/models/blocks/form/FormBlockModel.d.ts +34 -2
  71. package/es/flow/models/blocks/form/FormGridModel.d.ts +1 -0
  72. package/es/flow/models/blocks/form/QuickEditFormModel.d.ts +4 -1
  73. package/es/flow/models/blocks/form/assignRulesUpdateAssociationValues.d.ts +18 -0
  74. package/es/flow/models/blocks/form/dynamicNamePath.d.ts +19 -0
  75. package/es/flow/models/blocks/form/index.d.ts +2 -0
  76. package/es/flow/models/blocks/form/legacyDefaultValueMigration.d.ts +13 -0
  77. package/es/flow/models/blocks/form/submitHandler.d.ts +1 -1
  78. package/es/flow/models/blocks/form/submitValues.d.ts +19 -0
  79. package/es/flow/models/blocks/form/value-runtime/conditions.d.ts +9 -0
  80. package/es/flow/models/blocks/form/value-runtime/deps.d.ts +23 -0
  81. package/es/flow/models/blocks/form/value-runtime/form-patch.d.ts +19 -0
  82. package/es/flow/models/blocks/form/value-runtime/index.d.ts +11 -0
  83. package/es/flow/models/blocks/form/value-runtime/path.d.ts +25 -0
  84. package/es/flow/models/blocks/form/value-runtime/rules.d.ts +129 -0
  85. package/es/flow/models/blocks/form/value-runtime/runtime.d.ts +75 -0
  86. package/es/flow/models/blocks/form/value-runtime/types.d.ts +62 -0
  87. package/es/flow/models/blocks/form/value-runtime/utils.d.ts +12 -0
  88. package/es/flow/models/blocks/shared/legacyDefaultValueMigrationBase.d.ts +20 -0
  89. package/es/flow/models/blocks/table/TableSelectModel.d.ts +0 -1
  90. package/es/flow/models/blocks/table/dragSort/dragSortComponents.d.ts +14 -0
  91. package/es/flow/models/blocks/table/dragSort/dragSortHooks.d.ts +13 -0
  92. package/es/flow/models/blocks/table/dragSort/dragSortSettings.d.ts +39 -0
  93. package/es/flow/models/blocks/table/dragSort/dragSortUtils.d.ts +37 -0
  94. package/es/flow/models/blocks/table/dragSort/index.d.ts +12 -0
  95. package/es/flow/models/blocks/table/utils.d.ts +8 -8
  96. package/es/flow/models/fields/AssociationFieldModel/CascadeSelectFieldModel.d.ts +16 -0
  97. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/PopupSubTableActionGroupModel.d.ts +11 -0
  98. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/PopupSubTableActionsColumnModel.d.ts +19 -0
  99. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/PopupSubTableFieldModel.d.ts +30 -0
  100. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/actions/PopupSubTableEditActionModel.d.ts +28 -0
  101. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/actions/PopupSubTableFormSubmitActionModel.d.ts +16 -0
  102. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/actions/PopupSubTableRemoveActionModel.d.ts +14 -0
  103. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/blocks/PopupSubTableFormModel.d.ts +36 -0
  104. package/es/flow/models/fields/AssociationFieldModel/PopupSubTableFieldModel/index.d.ts +17 -0
  105. package/es/flow/models/fields/AssociationFieldModel/RecordPickerFieldModel.d.ts +8 -1
  106. package/es/flow/models/fields/AssociationFieldModel/RecordSelectFieldModel.d.ts +15 -0
  107. package/es/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.d.ts +4 -1
  108. package/es/flow/models/fields/AssociationFieldModel/index.d.ts +1 -0
  109. package/es/flow/models/fields/AssociationFieldModel/itemChain.d.ts +94 -0
  110. package/es/flow/models/fields/AssociationFieldModel/recordSelectShared.d.ts +15 -5
  111. package/es/flow/models/fields/RichTextFieldModel/registerFontSize.d.ts +9 -0
  112. package/es/flow/models/fields/RichTextFieldModel/registerImageResize.d.ts +9 -0
  113. package/es/flow/models/fields/RichTextFieldModel/registerSmartBreak.d.ts +12 -0
  114. package/es/flow/models/fields/index.d.ts +0 -1
  115. package/es/flow/utils/dispatchEventDeep.d.ts +20 -0
  116. package/es/flow/utils/index.d.ts +1 -0
  117. package/es/flow/utils/useJsonTemplateResolver.d.ts +9 -0
  118. package/es/index.d.ts +1 -0
  119. package/es/index.mjs +36092 -24112
  120. package/es/route-switch/antd/admin-layout/index.d.ts +1 -1
  121. package/es/schema-component/antd/form-item/hooks/useLazyLoadDisplayAssociationFieldsOfForm.d.ts +26 -0
  122. package/es/user/CurrentUserProvider.d.ts +1 -1
  123. package/es/variables/index.d.ts +1 -1
  124. package/lib/index.js +449 -290
  125. package/lib/locale/de-DE.json +2 -0
  126. package/lib/locale/en-US.json +51 -0
  127. package/lib/locale/es-ES.json +2 -0
  128. package/lib/locale/fr-FR.json +2 -0
  129. package/lib/locale/hu-HU.json +2 -0
  130. package/lib/locale/id-ID.json +2 -0
  131. package/lib/locale/it-IT.json +2 -0
  132. package/lib/locale/ja-JP.json +2 -0
  133. package/lib/locale/ko-KR.json +2 -0
  134. package/lib/locale/nl-NL.json +2 -0
  135. package/lib/locale/pt-BR.json +2 -0
  136. package/lib/locale/ru-RU.json +2 -0
  137. package/lib/locale/tr-TR.json +2 -0
  138. package/lib/locale/uk-UA.json +2 -0
  139. package/lib/locale/vi-VN.json +2 -0
  140. package/lib/locale/zh-CN.json +78 -7
  141. package/lib/locale/zh-TW.json +12 -0
  142. package/package.json +8 -7
  143. package/es/flow/models/fields/UploadFieldModel.d.ts +0 -22
  144. package/es/index-C3fHjsMw.mjs +0 -279
  145. package/lib/index-C3fHjsMw-CDWZlvuM.js +0 -2237
  146. package/lib/style.css +0 -1
@@ -0,0 +1,94 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ export type ItemChain = {
10
+ index?: number;
11
+ length?: number;
12
+ __is_new__?: boolean;
13
+ __is_stored__?: boolean;
14
+ value: any;
15
+ parentItem?: ItemChain;
16
+ };
17
+ export type ItemChainResolver = (subPath: string) => boolean;
18
+ export type ParentItemAccessors = {
19
+ parentPropertiesAccessor: (ctx?: any) => any;
20
+ parentItemMetaAccessor: () => any;
21
+ parentItemResolverAccessor: () => ItemChainResolver | undefined;
22
+ };
23
+ export declare function createItemChainGetter(options: {
24
+ valueAccessor: () => any;
25
+ parentItemAccessor?: () => ItemChain | undefined;
26
+ indexAccessor?: () => number | undefined;
27
+ lengthAccessor?: () => number | undefined;
28
+ isNewAccessor?: () => boolean | undefined;
29
+ isStoredAccessor?: () => boolean | undefined;
30
+ }): () => ItemChain;
31
+ export declare function createRootItemChain(formValues: any): ItemChain;
32
+ export declare function resolveRecordPersistenceState(record: any, filterTargetKey: string | string[] | null | undefined): {
33
+ record: any;
34
+ hasPrimaryKey: boolean;
35
+ isNew: boolean;
36
+ isStored: boolean;
37
+ };
38
+ export declare function buildCurrentItemTitle(t: (key: string) => string, collectionField?: any, fallbackName?: string): string;
39
+ export declare function createParentItemAccessorsFromContext(options: {
40
+ parentContextAccessor: () => any;
41
+ fallbackParentPropertiesAccessor?: (ctx?: any) => any;
42
+ }): ParentItemAccessors;
43
+ export declare function createParentItemAccessorsFromInputArgs(inputArgsAccessor: () => any): ParentItemAccessors;
44
+ export declare function createItemChainMetaFactory(options: {
45
+ t: (key: string) => string;
46
+ title: string;
47
+ showIndex?: boolean;
48
+ showParentIndex?: boolean;
49
+ collectionAccessor: () => any;
50
+ propertiesAccessor: (ctx: any) => any;
51
+ parentCollectionAccessor?: () => any;
52
+ parentPropertiesAccessor?: (ctx: any) => any;
53
+ parentItemMetaAccessor?: () => any;
54
+ }): any;
55
+ export declare function createItemChainResolver(options: {
56
+ collectionAccessor: () => any;
57
+ propertiesAccessor?: () => unknown;
58
+ parentCollectionAccessor?: () => any;
59
+ parentPropertiesAccessor?: () => unknown;
60
+ parentItemResolverAccessor?: () => ((subPath: string) => boolean) | undefined;
61
+ }): (subPath: string) => boolean;
62
+ export type ItemChainMetaAndResolverOptions = {
63
+ metaFactoryOptions: Parameters<typeof createItemChainMetaFactory>[0];
64
+ resolverOptions: Parameters<typeof createItemChainResolver>[0];
65
+ };
66
+ export declare function createItemChainMetaAndResolver(options: ItemChainMetaAndResolverOptions): {
67
+ meta: any;
68
+ resolveOnServer: (subPath: string) => boolean;
69
+ };
70
+ export type AssociationItemChainContextPropertyOptions = {
71
+ t: (key: string) => string;
72
+ title: string;
73
+ showIndex?: boolean;
74
+ showParentIndex?: boolean;
75
+ collectionAccessor: () => any;
76
+ propertiesAccessor: (ctx: any) => any;
77
+ resolverPropertiesAccessor?: () => unknown;
78
+ parentCollectionAccessor?: () => any;
79
+ parentAccessors?: Partial<ParentItemAccessors>;
80
+ useParentItemMeta?: boolean;
81
+ useParentItemResolver?: boolean;
82
+ };
83
+ export declare function createAssociationItemChainContextPropertyOptions(options: AssociationItemChainContextPropertyOptions): {
84
+ serverOnlyWhenContextParams: true;
85
+ meta: any;
86
+ resolveOnServer: (subPath: string) => boolean;
87
+ cache: false;
88
+ };
89
+ export declare function createItemChainContextPropertyOptions(options: ItemChainMetaAndResolverOptions): {
90
+ serverOnlyWhenContextParams: true;
91
+ meta: any;
92
+ resolveOnServer: (subPath: string) => boolean;
93
+ cache: false;
94
+ };
@@ -6,6 +6,7 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
+ import { type FlowRuntimeContext } from '@nocobase/flow-engine';
9
10
  import type { SelectProps } from 'antd';
10
11
  import React from 'react';
11
12
  export interface AssociationFieldNames {
@@ -14,13 +15,16 @@ export interface AssociationFieldNames {
14
15
  }
15
16
  export type AssociationOption = Record<string, any>;
16
17
  export type PopupScrollEvent = Parameters<NonNullable<SelectProps<any>['onPopupScroll']>>[0];
18
+ export declare function buildOpenerUids(ctx: FlowRuntimeContext, inputArgs?: Record<string, unknown>): string[];
17
19
  export interface LazySelectProps extends Omit<SelectProps<any>, 'mode' | 'options' | 'value' | 'onChange'> {
18
20
  fieldNames: AssociationFieldNames;
19
- value?: AssociationOption | AssociationOption[];
21
+ value?: AssociationOption | AssociationOption[] | string | string[] | number | number[];
20
22
  multiple?: boolean;
21
23
  allowMultiple?: boolean;
24
+ keepDropdownOpenOnSelect?: boolean;
22
25
  options?: AssociationOption[];
23
- onChange: (option: AssociationOption | AssociationOption[]) => void;
26
+ valueMode?: 'record' | 'value';
27
+ onChange: (option: AssociationOption | AssociationOption[] | string | string[] | number | number[]) => void;
24
28
  onDropdownVisibleChange?: (open: boolean) => void;
25
29
  onPopupScroll?: SelectProps<any>['onPopupScroll'];
26
30
  onSearch?: SelectProps<any>['onSearch'];
@@ -39,11 +43,17 @@ export interface LabelByFieldProps {
39
43
  fieldNames: AssociationFieldNames;
40
44
  }
41
45
  export declare function LabelByField(props: Readonly<LabelByFieldProps>): React.JSX.Element;
42
- export declare function toSelectValue(record: AssociationOption | AssociationOption[] | undefined, fieldNames: AssociationFieldNames, multiple?: boolean): {
46
+ export declare function toSelectValue(record: AssociationOption | AssociationOption[] | string | string[] | number | number[] | undefined, fieldNames: AssociationFieldNames, multiple?: boolean, valueMode?: 'record' | 'value', options?: AssociationOption[]): {
43
47
  label: React.JSX.Element;
44
48
  value: any;
45
49
  } | {
50
+ label: string | number | AssociationOption;
51
+ value: string | number | AssociationOption;
52
+ } | ({
46
53
  label: React.JSX.Element;
47
54
  value: any;
48
- }[];
49
- export declare function resolveOptions(options: AssociationOption[] | undefined, value: AssociationOption | AssociationOption[] | undefined, isMultiple: boolean): AssociationOption[];
55
+ } | {
56
+ label: string | number | AssociationOption;
57
+ value: string | number | AssociationOption;
58
+ })[];
59
+ export declare function resolveOptions(options: AssociationOption[] | undefined, value: AssociationOption | AssociationOption[] | string | string[] | number | number[] | undefined, isMultiple: boolean): AssociationOption[];
@@ -0,0 +1,9 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ export declare const registerFontSize: (Quill: any) => void;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ export declare const registerImageResize: (Quill: any) => void;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ export declare const registerSmartBreak: (Quill: any) => void;
10
+ export declare function lineBreakMatcher(node: any, delta: any): any;
11
+ export declare function handleLinebreak(range: any, context: any): boolean;
12
+ export declare function handleEnter(range: any, context: any): boolean;
@@ -23,7 +23,6 @@ export * from './RichTextFieldModel';
23
23
  export * from './SelectFieldModel';
24
24
  export * from './TextareaFieldModel';
25
25
  export * from './TimeFieldModel';
26
- export * from './UploadFieldModel';
27
26
  export * from './VariableFieldFormModel';
28
27
  export * from './JSFieldModel';
29
28
  export * from './JSEditableFieldModel';
@@ -0,0 +1,20 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import { FlowModel } from '@nocobase/flow-engine';
10
+ import type { DispatchEventOptions } from '@nocobase/flow-engine';
11
+ /**
12
+ * 递归向子模型(及其 forks)分发指定事件。
13
+ * - 默认包含自身(用于类似分页切换等“整棵树状态刷新”的场景,例如 `paginationChange`)
14
+ */
15
+ export declare function dispatchEventDeep(root: FlowModel, eventName: string, inputArgs?: Record<string, any>, options?: {
16
+ debounce?: boolean;
17
+ } & DispatchEventOptions, deepOptions?: {
18
+ includeSelf?: boolean;
19
+ includeForks?: boolean;
20
+ }): Promise<void>;
@@ -7,3 +7,4 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
  export * from './blockUtils';
10
+ export * from './dispatchEventDeep';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ export declare const useJsonTemplateResolver: (template: string, deps?: any[]) => import("ahooks/lib/useRequest/src/types").Result<any, []>;
package/es/index.d.ts CHANGED
@@ -79,3 +79,4 @@ export { CollectionFieldUISchemaProvider, IsInNocoBaseRecursionFieldContext, Noc
79
79
  export { FieldModelRenderer } from '@nocobase/flow-engine';
80
80
  export { transformFilter } from '@nocobase/utils/client';
81
81
  export * from './modules/menu';
82
+ export * from './ai';