@iblai/iblai-js 2.6.0 → 2.7.0
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.
- package/dist/data-layer/playwright/claw-sandbox-helpers.d.ts +31 -0
- package/dist/data-layer/playwright/index.d.ts +2 -2
- package/dist/playwright/index.cjs +75 -1
- package/dist/playwright/index.cjs.map +1 -1
- package/dist/playwright/index.d.ts +33 -2
- package/dist/playwright/index.esm.js +71 -2
- package/dist/playwright/index.esm.js.map +1 -1
- package/dist/playwright/playwright/claw-sandbox-helpers.d.ts +31 -0
- package/dist/playwright/playwright/index.d.ts +2 -2
- package/dist/security/playwright/claw-sandbox-helpers.d.ts +31 -0
- package/dist/security/playwright/index.d.ts +2 -2
- package/dist/web-containers/playwright/claw-sandbox-helpers.d.ts +31 -0
- package/dist/web-containers/playwright/index.d.ts +2 -2
- package/dist/web-containers/source/index.esm.js +212 -56
- package/dist/web-containers/source/next/index.esm.js +114 -16
- package/dist/web-utils/playwright/claw-sandbox-helpers.d.ts +31 -0
- package/dist/web-utils/playwright/index.d.ts +2 -2
- package/package.json +4 -4
|
@@ -98741,7 +98741,22 @@ var clawSandboxSandboxConfig$3 = {
|
|
|
98741
98741
|
saving: "Saving...",
|
|
98742
98742
|
save: "Save",
|
|
98743
98743
|
instanceUpdated: "Instance updated",
|
|
98744
|
-
failedToUpdateInstance: "Failed to update instance"
|
|
98744
|
+
failedToUpdateInstance: "Failed to update instance",
|
|
98745
|
+
sandboxKindDescription: "Choose how this agent runs code. Only one sandbox type can be enabled at a time.",
|
|
98746
|
+
kindComputationalRuntime: "Computing Runtime",
|
|
98747
|
+
kindComputationalRuntimeShort: "Give this agent a lightweight JavaScript calculator for quick computations — the low-cost option.",
|
|
98748
|
+
kindComputationalRuntimeDetail: "Runs small JavaScript snippets in-process with strict memory and time limits. Great for math, dates and data wrangling at minimal cost. No shell, no Python, no network, no files that outlive the turn — choose the Virtual Machine Shell if you need those.",
|
|
98749
|
+
kindVirtualMachine: "Virtual Machine Shell",
|
|
98750
|
+
kindVirtualMachineShort: "Give this agent a full Linux virtual machine: it can write files and run real shell commands in an isolated sandbox.",
|
|
98751
|
+
kindVirtualMachineDetail: "Gives the agent a full Linux Virtual Machine. A private VM is created only when the agent runs a command and is destroyed when the chat ends; files it saves in /workspace carry over between turns. No network access unless you grant an egress profile. Use for data analysis, code that must actually run, or file generation (PDF, XLSX…). This adds additional costs per usage. Use Computing Runtime if you only need simple computations.",
|
|
98752
|
+
kindClaw: "Claw",
|
|
98753
|
+
kindClawShort: "Power this agent with a dedicated Claw worker — a persistent agent host with its own skills and plugins, billed by usage.",
|
|
98754
|
+
kindClawDetail: "Chat is handled by an OpenClaw-protocol worker instead of the built-in agent. Workers keep long-lived state, install skills and plugins, and report measured token usage that is billed against your credits in near-real-time. Requires a provisioned Claw instance for your tenant; built-in agent features (RAG tools, the VM and JS runtimes) don't apply while Claw is active.",
|
|
98755
|
+
kindInfoAriaLabel: "More info about {kind}",
|
|
98756
|
+
kindToggleAriaLabel: "{kind} {state}",
|
|
98757
|
+
sandboxKindUpdated: "Sandbox type updated",
|
|
98758
|
+
failedToUpdateSandboxKind: "Failed to update sandbox type",
|
|
98759
|
+
sandboxKindTitle: "Sandbox Type"
|
|
98745
98760
|
};
|
|
98746
98761
|
var common$4 = {
|
|
98747
98762
|
close: "Close",
|
|
@@ -100655,12 +100670,14 @@ var profileOrganization$3 = {
|
|
|
100655
100670
|
defaultName: "Default",
|
|
100656
100671
|
support: "Support",
|
|
100657
100672
|
supportEmailPlaceholder: "Enter organization support address",
|
|
100658
|
-
supportPhone: "
|
|
100673
|
+
supportPhone: "Call / Text",
|
|
100659
100674
|
supportPhonePlaceholder: "Enter organization support phone number",
|
|
100660
100675
|
notSet: "Not set",
|
|
100661
100676
|
helpCenter: "Help Center",
|
|
100662
100677
|
toggleHelpCenterVisibility: "Toggle Help Center visibility",
|
|
100663
100678
|
helpCenterUrlPlaceholder: "Enter help center URL",
|
|
100679
|
+
documentation: "Documentation",
|
|
100680
|
+
documentationPlaceholder: "Enter organization documentation URL",
|
|
100664
100681
|
lightLogo: "Light Logo",
|
|
100665
100682
|
removeImage: "Remove image",
|
|
100666
100683
|
upload: "+ Upload",
|
|
@@ -100673,6 +100690,7 @@ var profileOrganization$3 = {
|
|
|
100673
100690
|
supportUpdated: "Support updated successfully",
|
|
100674
100691
|
updateFailed: "Failed to update",
|
|
100675
100692
|
supportPhoneUpdated: "Support phone updated successfully",
|
|
100693
|
+
documentationUpdated: "Documentation updated successfully",
|
|
100676
100694
|
helpCenterUpdated: "Help Center updated successfully",
|
|
100677
100695
|
helpCenterEnabled: "Help Center enabled",
|
|
100678
100696
|
helpCenterDisabled: "Help Center disabled"
|
|
@@ -105861,7 +105879,22 @@ var clawSandboxSandboxConfig$2 = {
|
|
|
105861
105879
|
saving: "Enregistrement en cours...",
|
|
105862
105880
|
save: "Enregistrer",
|
|
105863
105881
|
instanceUpdated: "Instance mise à jour",
|
|
105864
|
-
failedToUpdateInstance: "Échec de la mise à jour de l'instance"
|
|
105882
|
+
failedToUpdateInstance: "Échec de la mise à jour de l'instance",
|
|
105883
|
+
sandboxKindDescription: "Choisissez comment cet agent exécute du code. Un seul type de sandbox peut être activé à la fois.",
|
|
105884
|
+
kindComputationalRuntime: "Environnement de calcul",
|
|
105885
|
+
kindComputationalRuntimeShort: "Donnez à cet agent une calculatrice JavaScript légère pour des calculs rapides — l'option la plus économique.",
|
|
105886
|
+
kindComputationalRuntimeDetail: "Exécute de petits extraits JavaScript dans le processus avec des limites strictes de mémoire et de temps. Idéal pour les mathématiques, les dates et la manipulation de données à coût minimal. Pas de shell, pas de Python, pas de réseau, pas de fichiers qui survivent au tour — choisissez la machine virtuelle si vous en avez besoin.",
|
|
105887
|
+
kindVirtualMachine: "Shell de machine virtuelle",
|
|
105888
|
+
kindVirtualMachineShort: "Donnez à cet agent une machine virtuelle Linux complète : il peut écrire des fichiers et exécuter de vraies commandes shell dans un sandbox isolé.",
|
|
105889
|
+
kindVirtualMachineDetail: "Donne à l'agent une machine virtuelle Linux complète. Une VM privée est créée uniquement lorsque l'agent exécute une commande et détruite à la fin du chat ; les fichiers enregistrés dans /workspace sont conservés entre les tours. Aucun accès réseau sauf si vous accordez un profil de sortie. À utiliser pour l'analyse de données, du code qui doit réellement s'exécuter ou la génération de fichiers (PDF, XLSX…). Cela ajoute des coûts supplémentaires à l'usage. Utilisez l'environnement de calcul si vous n'avez besoin que de calculs simples.",
|
|
105890
|
+
kindClaw: "Claw",
|
|
105891
|
+
kindClawShort: "Propulsez cet agent avec un worker Claw dédié — un hôte d'agent persistant avec ses propres skills et plugins, facturé à l'usage.",
|
|
105892
|
+
kindClawDetail: "Le chat est géré par un worker au protocole OpenClaw au lieu de l'agent intégré. Les workers conservent un état de longue durée, installent des skills et des plugins, et rapportent une consommation de tokens mesurée, facturée sur vos crédits quasiment en temps réel. Nécessite une instance Claw provisionnée pour votre tenant ; les fonctionnalités de l'agent intégré (outils RAG, la VM et les environnements JS) ne s'appliquent pas lorsque Claw est actif.",
|
|
105893
|
+
kindInfoAriaLabel: "Plus d'informations sur {kind}",
|
|
105894
|
+
kindToggleAriaLabel: "{kind} {state}",
|
|
105895
|
+
sandboxKindUpdated: "Type de sandbox mis à jour",
|
|
105896
|
+
failedToUpdateSandboxKind: "Échec de la mise à jour du type de sandbox",
|
|
105897
|
+
sandboxKindTitle: "Type de sandbox"
|
|
105865
105898
|
};
|
|
105866
105899
|
var common$3 = {
|
|
105867
105900
|
close: "Fermer",
|
|
@@ -107775,12 +107808,14 @@ var profileOrganization$2 = {
|
|
|
107775
107808
|
defaultName: "Par défaut",
|
|
107776
107809
|
support: "Assistance",
|
|
107777
107810
|
supportEmailPlaceholder: "Entrez l'adresse d'assistance de l'organisation",
|
|
107778
|
-
supportPhone: "
|
|
107811
|
+
supportPhone: "Appel / SMS",
|
|
107779
107812
|
supportPhonePlaceholder: "Entrez le numéro de téléphone d'assistance de l'organisation",
|
|
107780
107813
|
notSet: "Non défini",
|
|
107781
107814
|
helpCenter: "Centre d'aide",
|
|
107782
107815
|
toggleHelpCenterVisibility: "Activer/désactiver la visibilité du centre d'aide",
|
|
107783
107816
|
helpCenterUrlPlaceholder: "Entrez l'URL du centre d'aide",
|
|
107817
|
+
documentation: "Documentation",
|
|
107818
|
+
documentationPlaceholder: "Entrez l'URL de la documentation de l'organisation",
|
|
107784
107819
|
lightLogo: "Logo clair",
|
|
107785
107820
|
removeImage: "Supprimer l'image",
|
|
107786
107821
|
upload: "+ Télécharger",
|
|
@@ -107793,6 +107828,7 @@ var profileOrganization$2 = {
|
|
|
107793
107828
|
supportUpdated: "Assistance mise à jour avec succès",
|
|
107794
107829
|
updateFailed: "Échec de la mise à jour",
|
|
107795
107830
|
supportPhoneUpdated: "Téléphone d'assistance mis à jour avec succès",
|
|
107831
|
+
documentationUpdated: "Documentation mise à jour avec succès",
|
|
107796
107832
|
helpCenterUpdated: "Centre d'aide mis à jour avec succès",
|
|
107797
107833
|
helpCenterEnabled: "Centre d'aide activé",
|
|
107798
107834
|
helpCenterDisabled: "Centre d'aide désactivé"
|
|
@@ -112815,7 +112851,22 @@ var clawSandboxSandboxConfig$1 = {
|
|
|
112815
112851
|
saving: "Guardando...",
|
|
112816
112852
|
save: "Guardar",
|
|
112817
112853
|
instanceUpdated: "Instancia actualizada",
|
|
112818
|
-
failedToUpdateInstance: "Error al actualizar la instancia"
|
|
112854
|
+
failedToUpdateInstance: "Error al actualizar la instancia",
|
|
112855
|
+
sandboxKindDescription: "Elige cómo ejecuta código este agente. Solo se puede habilitar un tipo de sandbox a la vez.",
|
|
112856
|
+
kindComputationalRuntime: "Entorno de cómputo",
|
|
112857
|
+
kindComputationalRuntimeShort: "Dale a este agente una calculadora JavaScript ligera para cálculos rápidos: la opción de menor costo.",
|
|
112858
|
+
kindComputationalRuntimeDetail: "Ejecuta pequeños fragmentos de JavaScript en el proceso con límites estrictos de memoria y tiempo. Ideal para matemáticas, fechas y transformación de datos a un costo mínimo. Sin shell, sin Python, sin red y sin archivos que persistan entre turnos; elige la máquina virtual si los necesitas.",
|
|
112859
|
+
kindVirtualMachine: "Shell de máquina virtual",
|
|
112860
|
+
kindVirtualMachineShort: "Dale a este agente una máquina virtual Linux completa: puede escribir archivos y ejecutar comandos de shell reales en un sandbox aislado.",
|
|
112861
|
+
kindVirtualMachineDetail: "Le da al agente una máquina virtual Linux completa. Se crea una VM privada solo cuando el agente ejecuta un comando y se destruye al terminar el chat; los archivos guardados en /workspace se conservan entre turnos. Sin acceso a la red a menos que concedas un perfil de egreso. Úsala para análisis de datos, código que debe ejecutarse realmente o generación de archivos (PDF, XLSX…). Esto añade costos adicionales por uso. Usa el entorno de cómputo si solo necesitas cálculos simples.",
|
|
112862
|
+
kindClaw: "Claw",
|
|
112863
|
+
kindClawShort: "Impulsa este agente con un worker Claw dedicado: un host de agente persistente con sus propias skills y plugins, facturado por uso.",
|
|
112864
|
+
kindClawDetail: "El chat lo gestiona un worker con protocolo OpenClaw en lugar del agente integrado. Los workers mantienen estado de larga duración, instalan skills y plugins, y reportan el uso de tokens medido, que se factura contra tus créditos casi en tiempo real. Requiere una instancia de Claw aprovisionada para tu tenant; las funciones del agente integrado (herramientas RAG, la VM y los entornos JS) no aplican mientras Claw está activo.",
|
|
112865
|
+
kindInfoAriaLabel: "Más información sobre {kind}",
|
|
112866
|
+
kindToggleAriaLabel: "{kind} {state}",
|
|
112867
|
+
sandboxKindUpdated: "Tipo de sandbox actualizado",
|
|
112868
|
+
failedToUpdateSandboxKind: "No se pudo actualizar el tipo de sandbox",
|
|
112869
|
+
sandboxKindTitle: "Tipo de sandbox"
|
|
112819
112870
|
};
|
|
112820
112871
|
var common$2 = {
|
|
112821
112872
|
close: "Cerrar",
|
|
@@ -114729,12 +114780,14 @@ var profileOrganization$1 = {
|
|
|
114729
114780
|
defaultName: "Predeterminado",
|
|
114730
114781
|
support: "Soporte",
|
|
114731
114782
|
supportEmailPlaceholder: "Ingrese la dirección de soporte de la organización",
|
|
114732
|
-
supportPhone: "
|
|
114783
|
+
supportPhone: "Llamar / Mensaje",
|
|
114733
114784
|
supportPhonePlaceholder: "Ingrese el número de teléfono de soporte de la organización",
|
|
114734
114785
|
notSet: "No establecido",
|
|
114735
114786
|
helpCenter: "Centro de ayuda",
|
|
114736
114787
|
toggleHelpCenterVisibility: "Alternar visibilidad del centro de ayuda",
|
|
114737
114788
|
helpCenterUrlPlaceholder: "Ingrese la URL del centro de ayuda",
|
|
114789
|
+
documentation: "Documentación",
|
|
114790
|
+
documentationPlaceholder: "Ingrese la URL de la documentación de la organización",
|
|
114738
114791
|
lightLogo: "Logo claro",
|
|
114739
114792
|
removeImage: "Eliminar imagen",
|
|
114740
114793
|
upload: "+ Subir",
|
|
@@ -114747,6 +114800,7 @@ var profileOrganization$1 = {
|
|
|
114747
114800
|
supportUpdated: "Soporte actualizado correctamente",
|
|
114748
114801
|
updateFailed: "Error al actualizar",
|
|
114749
114802
|
supportPhoneUpdated: "Teléfono de soporte actualizado correctamente",
|
|
114803
|
+
documentationUpdated: "Documentación actualizada correctamente",
|
|
114750
114804
|
helpCenterUpdated: "Centro de ayuda actualizado correctamente",
|
|
114751
114805
|
helpCenterEnabled: "Centro de ayuda habilitado",
|
|
114752
114806
|
helpCenterDisabled: "Centro de ayuda deshabilitado"
|
|
@@ -119769,7 +119823,22 @@ var clawSandboxSandboxConfig = {
|
|
|
119769
119823
|
saving: "保存中...",
|
|
119770
119824
|
save: "保存",
|
|
119771
119825
|
instanceUpdated: "实例已更新",
|
|
119772
|
-
failedToUpdateInstance: "更新实例失败"
|
|
119826
|
+
failedToUpdateInstance: "更新实例失败",
|
|
119827
|
+
sandboxKindDescription: "选择该智能体运行代码的方式。一次只能启用一种沙箱类型。",
|
|
119828
|
+
kindComputationalRuntime: "计算运行时",
|
|
119829
|
+
kindComputationalRuntimeShort: "为该智能体提供轻量级 JavaScript 计算器,用于快速计算——低成本选项。",
|
|
119830
|
+
kindComputationalRuntimeDetail: "在进程内运行小段 JavaScript 代码,并有严格的内存和时间限制。适合以极低成本进行数学、日期和数据处理。没有 shell、没有 Python、没有网络,文件也不会跨轮次保留——如需这些功能请选择虚拟机。",
|
|
119831
|
+
kindVirtualMachine: "虚拟机 Shell",
|
|
119832
|
+
kindVirtualMachineShort: "为该智能体提供完整的 Linux 虚拟机:它可以在隔离沙箱中写入文件并执行真实的 shell 命令。",
|
|
119833
|
+
kindVirtualMachineDetail: "为智能体提供完整的 Linux 虚拟机。仅当智能体执行命令时才会创建专属虚拟机,并在聊天结束时销毁;保存在 /workspace 中的文件会在轮次之间保留。除非授予出站网络配置,否则无网络访问。适用于数据分析、必须真正运行的代码或文件生成(PDF、XLSX 等)。这会按使用量产生额外费用。若只需简单计算,请使用计算运行时。",
|
|
119834
|
+
kindClaw: "Claw",
|
|
119835
|
+
kindClawShort: "使用专用 Claw worker 驱动该智能体——一个拥有自己的技能和插件的持久化智能体主机,按用量计费。",
|
|
119836
|
+
kindClawDetail: "聊天由 OpenClaw 协议的 worker 处理,而不是内置智能体。Worker 保留长期状态、安装技能和插件,并上报实测的 token 用量,几乎实时地从您的额度中扣费。需要为您的租户预配 Claw 实例;Claw 激活期间,内置智能体功能(RAG 工具、虚拟机和 JS 运行时)不适用。",
|
|
119837
|
+
kindInfoAriaLabel: "关于{kind}的更多信息",
|
|
119838
|
+
kindToggleAriaLabel: "{kind}{state}",
|
|
119839
|
+
sandboxKindUpdated: "沙箱类型已更新",
|
|
119840
|
+
failedToUpdateSandboxKind: "更新沙箱类型失败",
|
|
119841
|
+
sandboxKindTitle: "沙箱类型"
|
|
119773
119842
|
};
|
|
119774
119843
|
var common$1 = {
|
|
119775
119844
|
close: "关闭",
|
|
@@ -121683,12 +121752,14 @@ var profileOrganization = {
|
|
|
121683
121752
|
defaultName: "默认",
|
|
121684
121753
|
support: "支持",
|
|
121685
121754
|
supportEmailPlaceholder: "输入组织支持地址",
|
|
121686
|
-
supportPhone: "
|
|
121755
|
+
supportPhone: "电话 / 短信",
|
|
121687
121756
|
supportPhonePlaceholder: "输入组织支持电话号码",
|
|
121688
121757
|
notSet: "未设置",
|
|
121689
121758
|
helpCenter: "帮助中心",
|
|
121690
121759
|
toggleHelpCenterVisibility: "切换帮助中心可见性",
|
|
121691
121760
|
helpCenterUrlPlaceholder: "输入帮助中心 URL",
|
|
121761
|
+
documentation: "文档",
|
|
121762
|
+
documentationPlaceholder: "输入组织文档网址",
|
|
121692
121763
|
lightLogo: "浅色徽标",
|
|
121693
121764
|
removeImage: "删除图片",
|
|
121694
121765
|
upload: "+ 上传",
|
|
@@ -121701,6 +121772,7 @@ var profileOrganization = {
|
|
|
121701
121772
|
supportUpdated: "支持信息更新成功",
|
|
121702
121773
|
updateFailed: "更新失败",
|
|
121703
121774
|
supportPhoneUpdated: "支持电话更新成功",
|
|
121775
|
+
documentationUpdated: "文档更新成功",
|
|
121704
121776
|
helpCenterUpdated: "帮助中心更新成功",
|
|
121705
121777
|
helpCenterEnabled: "帮助中心已启用",
|
|
121706
121778
|
helpCenterDisabled: "帮助中心已禁用"
|
|
@@ -228957,22 +229029,25 @@ function AdvancedTab({ platformKey, username, currentSPA, authURL, currentPlatfo
|
|
|
228957
229029
|
'enable_profile_screen_on_start_page',
|
|
228958
229030
|
'enable_get_started_screen_on_start_page',
|
|
228959
229031
|
];
|
|
229032
|
+
// Settings that are edited in the Organization tab, so they are not duplicated here
|
|
229033
|
+
const organizationTabSlugs = ['show_help', 'support_url', 'help_center_url', 'documentation_url'];
|
|
228960
229034
|
// String settings rendered as a free-text input; every other string setting is
|
|
228961
229035
|
// either handled by a dedicated component or exposed through its own options list
|
|
228962
229036
|
const stringSettingSlugs = [
|
|
228963
229037
|
'overall_default_mentor',
|
|
228964
|
-
'help_center_url',
|
|
228965
229038
|
'monetization_base_path',
|
|
228966
229039
|
'skills_welcome_tagline',
|
|
228967
229040
|
];
|
|
228968
229041
|
const getConfigurableMetadatas = () => {
|
|
228969
229042
|
// Include boolean, select and whitelisted string settings, but exclude start
|
|
228970
|
-
// screen settings which are handled by the StartScreenContent component
|
|
229043
|
+
// screen settings which are handled by the StartScreenContent component and
|
|
229044
|
+
// settings owned by the Organization tab
|
|
228971
229045
|
const configurableMetadatas = getAllMetadatas().filter((metadata) => (typeof metadata.defaultValue === 'boolean' ||
|
|
228972
229046
|
hasSelectableOptions(metadata) ||
|
|
228973
229047
|
(typeof metadata.defaultValue === 'string' &&
|
|
228974
229048
|
stringSettingSlugs.includes(metadata.slug))) &&
|
|
228975
|
-
!startScreenSlugs.includes(metadata.slug)
|
|
229049
|
+
!startScreenSlugs.includes(metadata.slug) &&
|
|
229050
|
+
!organizationTabSlugs.includes(metadata.slug));
|
|
228976
229051
|
// Show all configurable settings when no SPA is specified
|
|
228977
229052
|
if (!currentSPA)
|
|
228978
229053
|
return configurableMetadatas;
|
|
@@ -263453,6 +263528,9 @@ function OrganizationTab({ platformKey, setOrganizationLogoFromOutside, tenant,
|
|
|
263453
263528
|
const [isEditingSupportPhone, setIsEditingSupportPhone] = useState(false);
|
|
263454
263529
|
const [tempSupportPhone, setTempSupportPhone] = useState('');
|
|
263455
263530
|
const [showSupportPhone, setShowSupportPhone] = useState(true);
|
|
263531
|
+
const [documentationUrl, setDocumentationUrl] = useState('');
|
|
263532
|
+
const [isEditingDocumentationUrl, setIsEditingDocumentationUrl] = useState(false);
|
|
263533
|
+
const [tempDocumentationUrl, setTempDocumentationUrl] = useState('');
|
|
263456
263534
|
const [helpCenterUrl, setHelpCenterUrl] = useState('');
|
|
263457
263535
|
const [isEditingHelpCenterUrl, setIsEditingHelpCenterUrl] = useState(false);
|
|
263458
263536
|
const [tempHelpCenterUrl, setTempHelpCenterUrl] = useState('');
|
|
@@ -263461,7 +263539,8 @@ function OrganizationTab({ platformKey, setOrganizationLogoFromOutside, tenant,
|
|
|
263461
263539
|
const [organizationDarkLogo, setOrganizationDarkLogo] = useState(`${LOGO_ENDPOINTS.dark_logo(platformKey)}?v=${Date.now()}`);
|
|
263462
263540
|
const lightLogoInputRef = useRef(null);
|
|
263463
263541
|
const darkLogoInputRef = useRef(null);
|
|
263464
|
-
const DEFAULT_HELP_CENTER_URL = 'https://
|
|
263542
|
+
const DEFAULT_HELP_CENTER_URL = 'https://ibl.ai/support';
|
|
263543
|
+
const DEFAULT_DOCUMENTATION_URL = 'https://ibl.ai/docs';
|
|
263465
263544
|
useEffect(() => {
|
|
263466
263545
|
if (tenant) {
|
|
263467
263546
|
setOrganizationName((isAlphaNumeric32((tenant === null || tenant === void 0 ? void 0 : tenant.platform_name) || '') ? '' : tenant === null || tenant === void 0 ? void 0 : tenant.platform_name) || '');
|
|
@@ -263479,7 +263558,10 @@ function OrganizationTab({ platformKey, setOrganizationLogoFromOutside, tenant,
|
|
|
263479
263558
|
setSupportPhone((metadata === null || metadata === void 0 ? void 0 : metadata.support_phone) || defaultSupportPhone);
|
|
263480
263559
|
setTempSupportPhone((metadata === null || metadata === void 0 ? void 0 : metadata.support_phone) || defaultSupportPhone);
|
|
263481
263560
|
setShowSupportPhone(enableSupportPhone !== null && enableSupportPhone !== void 0 ? enableSupportPhone : (metadata === null || metadata === void 0 ? void 0 : metadata.enable_support_phone) !== false);
|
|
263482
|
-
const
|
|
263561
|
+
const strippedDocumentationUrl = stripProtocol((metadata === null || metadata === void 0 ? void 0 : metadata.documentation_url) || DEFAULT_DOCUMENTATION_URL);
|
|
263562
|
+
setDocumentationUrl(strippedDocumentationUrl);
|
|
263563
|
+
setTempDocumentationUrl(strippedDocumentationUrl);
|
|
263564
|
+
const strippedHelpCenterUrl = stripProtocol((metadata === null || metadata === void 0 ? void 0 : metadata.support_url) || (metadata === null || metadata === void 0 ? void 0 : metadata.help_center_url) || DEFAULT_HELP_CENTER_URL);
|
|
263483
263565
|
setHelpCenterUrl(strippedHelpCenterUrl);
|
|
263484
263566
|
setTempHelpCenterUrl(strippedHelpCenterUrl);
|
|
263485
263567
|
setShowHelp((metadata === null || metadata === void 0 ? void 0 : metadata.show_help) !== false);
|
|
@@ -263594,13 +263676,29 @@ function OrganizationTab({ platformKey, setOrganizationLogoFromOutside, tenant,
|
|
|
263594
263676
|
setTempSupportPhone(supportPhone);
|
|
263595
263677
|
setIsEditingSupportPhone(false);
|
|
263596
263678
|
};
|
|
263679
|
+
const handleEditDocumentationUrl = () => {
|
|
263680
|
+
setTempDocumentationUrl(documentationUrl);
|
|
263681
|
+
setIsEditingDocumentationUrl(true);
|
|
263682
|
+
};
|
|
263683
|
+
const handleSaveDocumentationUrl = async () => {
|
|
263684
|
+
const strippedDocumentationUrl = stripProtocol(tempDocumentationUrl);
|
|
263685
|
+
updateOrganizationMetadata('documentation_url', tempDocumentationUrl, () => {
|
|
263686
|
+
toast.success(t('profileOrganization.documentationUpdated'));
|
|
263687
|
+
setDocumentationUrl(strippedDocumentationUrl);
|
|
263688
|
+
setIsEditingDocumentationUrl(false);
|
|
263689
|
+
});
|
|
263690
|
+
};
|
|
263691
|
+
const handleCancelDocumentationUrl = () => {
|
|
263692
|
+
setTempDocumentationUrl(documentationUrl);
|
|
263693
|
+
setIsEditingDocumentationUrl(false);
|
|
263694
|
+
};
|
|
263597
263695
|
const handleEditHelpCenterUrl = () => {
|
|
263598
263696
|
setTempHelpCenterUrl(helpCenterUrl);
|
|
263599
263697
|
setIsEditingHelpCenterUrl(true);
|
|
263600
263698
|
};
|
|
263601
263699
|
const handleSaveHelpCenterUrl = async () => {
|
|
263602
263700
|
const strippedHelpCenterUrl = stripProtocol(tempHelpCenterUrl);
|
|
263603
|
-
updateOrganizationMetadata('
|
|
263701
|
+
updateOrganizationMetadata('support_url', tempHelpCenterUrl, () => {
|
|
263604
263702
|
toast.success(t('profileOrganization.helpCenterUpdated'));
|
|
263605
263703
|
setHelpCenterUrl(strippedHelpCenterUrl);
|
|
263606
263704
|
setIsEditingHelpCenterUrl(false);
|
|
@@ -263622,7 +263720,7 @@ function OrganizationTab({ platformKey, setOrganizationLogoFromOutside, tenant,
|
|
|
263622
263720
|
? t('profileOrganization.saving')
|
|
263623
263721
|
: t('profileOrganization.save')] }), jsxs(Button$1, { onClick: handleCancelOrg, variant: "outline", size: "sm", className: "h-9 bg-transparent", children: [jsx(X$2, { className: "w-4 h-4 mr-1" }), t('profileOrganization.cancel')] })] })) : (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx("span", { className: "text-sm text-gray-600 font-semibold", children: organizationName || t('profileOrganization.defaultName') }), jsx(Button$1, { onClick: handleEditOrg, variant: "ghost", size: "sm", className: "h-8 w-8 p-0 text-muted-foreground hover:text-foreground", children: jsx(SquarePen, { className: "w-3 h-3" }) })] }))] }), jsxs("div", { className: "mb-6", children: [jsx(Label$1, { htmlFor: "orgName", className: "text-gray-500 dark:text-gray-400 text-base", children: t('profileOrganization.support') }), isEditingSupportEmail ? (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx(Input, { id: "supportEmail", value: tempSupportEmail, onChange: (e) => setTempSupportEmail(e.target.value), className: "max-w-md text-sm text-gray-600 font-semibold", placeholder: t('profileOrganization.supportEmailPlaceholder'), autoFocus: true }), jsxs(Button$1, { onClick: handleSaveSupportEmail, size: "sm", disabled: !tempSupportEmail.trim() || isUpdatingTenantMetadata, className: "h-9 bg-gradient-to-r from-[#2563EB] to-[#93C5FD] hover:opacity-90 text-white", children: [jsx(Check, { className: "w-4 h-4 mr-1" }), t('profileOrganization.save')] }), jsxs(Button$1, { onClick: handleCancelSupportEmail, variant: "outline", size: "sm", className: "h-9 bg-transparent", children: [jsx(X$2, { className: "w-4 h-4 mr-1" }), t('profileOrganization.cancel')] })] })) : (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx("span", { className: "text-sm text-gray-600 font-semibold", children: supportEmail }), jsx(Button$1, { onClick: handleEditSupportEmail, variant: "ghost", size: "sm", className: "h-8 w-8 p-0 text-muted-foreground hover:text-foreground", children: jsx(SquarePen, { className: "w-3 h-3" }) })] }))] }), showSupportPhone && (jsxs("div", { className: "mb-6", children: [jsx(Label$1, { htmlFor: "supportPhone", className: "text-gray-500 dark:text-gray-400 text-base", children: t('profileOrganization.supportPhone') }), isEditingSupportPhone ? (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx(Input, { id: "supportPhone", value: tempSupportPhone, onChange: (e) => setTempSupportPhone(e.target.value), className: "max-w-md text-sm text-gray-600 font-semibold", placeholder: t('profileOrganization.supportPhonePlaceholder'), autoFocus: true }), jsxs(Button$1, { onClick: handleSaveSupportPhone, size: "sm", disabled: !tempSupportPhone.trim() || isUpdatingTenantMetadata, className: "h-9 bg-gradient-to-r from-[#2563EB] to-[#93C5FD] hover:opacity-90 text-white", children: [jsx(Check, { className: "w-4 h-4 mr-1" }), t('profileOrganization.save')] }), jsxs(Button$1, { onClick: handleCancelSupportPhone, variant: "outline", size: "sm", className: "h-9 bg-transparent", children: [jsx(X$2, { className: "w-4 h-4 mr-1" }), t('profileOrganization.cancel')] })] })) : (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx("span", { className: "text-sm text-gray-600 font-semibold", children: supportPhone || t('profileOrganization.notSet') }), jsx(Button$1, { onClick: handleEditSupportPhone, variant: "ghost", size: "sm", className: "h-8 w-8 p-0 text-muted-foreground hover:text-foreground", children: jsx(SquarePen, { className: "w-3 h-3" }) })] }))] })), jsxs("div", { className: "mb-6", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx(Label$1, { htmlFor: "helpCenterUrl", className: "text-gray-500 dark:text-gray-400 text-base", children: t('profileOrganization.helpCenter') }), jsx(Switch, { checked: showHelp, onCheckedChange: handleToggleShowHelp, disabled: isUpdatingTenantMetadata, "aria-label": t('profileOrganization.toggleHelpCenterVisibility'), className: "cursor-pointer data-[state=checked]:bg-blue-500 disabled:cursor-not-allowed disabled:opacity-50" })] }), isEditingHelpCenterUrl ? (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx(Input, { id: "helpCenterUrl", value: tempHelpCenterUrl, onChange: (e) => setTempHelpCenterUrl(e.target.value), className: "max-w-md text-sm font-semibold", placeholder: t('profileOrganization.helpCenterUrlPlaceholder'), autoFocus: true }), jsxs(Button$1, { onClick: handleSaveHelpCenterUrl, size: "sm",
|
|
263624
263722
|
//disabled={!tempCustomFaqUrl.trim()}
|
|
263625
|
-
className: "h-9 bg-gradient-to-r from-[#2563EB] to-[#93C5FD] hover:opacity-90 text-white", children: [jsx(Check, { className: "w-4 h-4 mr-1" }), t('profileOrganization.save')] }), jsxs(Button$1, { onClick: handleCancelHelpCenterUrl, variant: "outline", size: "sm", className: "h-9 bg-transparent", children: [jsx(X$2, { className: "w-4 h-4 mr-1" }), t('profileOrganization.cancel')] })] })) : (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx("span", { className: "text-sm text-gray-600 font-semibold", children: helpCenterUrl }), jsx(Button$1, { onClick: handleEditHelpCenterUrl, variant: "ghost", size: "sm", className: "h-8 w-8 p-0 text-muted-foreground hover:text-foreground", children: jsx(SquarePen, { className: "w-3 h-3" }) })] }))] }), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6", children: [jsxs("div", { className: "space-y-2", children: [jsx(Label$1, { htmlFor: "orgName", className: "text-gray-500 dark:text-gray-400 text-base", children: t('profileOrganization.lightLogo') }), jsxs("div", { className: "flex h-[200px] w-full sm:w-[200px] flex-col items-center justify-center rounded-lg border-2 border-dashed border-gray-200 mt-3 hover:bg-gray-50 cursor-pointer", onClick: (event) => {
|
|
263723
|
+
className: "h-9 bg-gradient-to-r from-[#2563EB] to-[#93C5FD] hover:opacity-90 text-white", children: [jsx(Check, { className: "w-4 h-4 mr-1" }), t('profileOrganization.save')] }), jsxs(Button$1, { onClick: handleCancelHelpCenterUrl, variant: "outline", size: "sm", className: "h-9 bg-transparent", children: [jsx(X$2, { className: "w-4 h-4 mr-1" }), t('profileOrganization.cancel')] })] })) : (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx("span", { className: "text-sm text-gray-600 font-semibold", children: helpCenterUrl }), jsx(Button$1, { onClick: handleEditHelpCenterUrl, variant: "ghost", size: "sm", className: "h-8 w-8 p-0 text-muted-foreground hover:text-foreground", children: jsx(SquarePen, { className: "w-3 h-3" }) })] }))] }), jsxs("div", { className: "mb-6", children: [jsx(Label$1, { htmlFor: "documentationUrl", className: "text-gray-500 dark:text-gray-400 text-base", children: t('profileOrganization.documentation') }), isEditingDocumentationUrl ? (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx(Input, { id: "documentationUrl", value: tempDocumentationUrl, onChange: (e) => setTempDocumentationUrl(e.target.value), className: "max-w-md text-sm font-semibold", placeholder: t('profileOrganization.documentationPlaceholder'), autoFocus: true }), jsxs(Button$1, { onClick: handleSaveDocumentationUrl, size: "sm", disabled: isUpdatingTenantMetadata, className: "h-9 bg-gradient-to-r from-[#2563EB] to-[#93C5FD] hover:opacity-90 text-white", children: [jsx(Check, { className: "w-4 h-4 mr-1" }), t('profileOrganization.save')] }), jsxs(Button$1, { onClick: handleCancelDocumentationUrl, variant: "outline", size: "sm", className: "h-9 bg-transparent", children: [jsx(X$2, { className: "w-4 h-4 mr-1" }), t('profileOrganization.cancel')] })] })) : (jsxs("div", { className: "flex items-center gap-2 mt-1", children: [jsx("span", { className: "text-sm text-gray-600 font-semibold", children: documentationUrl }), jsx(Button$1, { onClick: handleEditDocumentationUrl, variant: "ghost", size: "sm", className: "h-8 w-8 p-0 text-muted-foreground hover:text-foreground", children: jsx(SquarePen, { className: "w-3 h-3" }) })] }))] }), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6", children: [jsxs("div", { className: "space-y-2", children: [jsx(Label$1, { htmlFor: "orgName", className: "text-gray-500 dark:text-gray-400 text-base", children: t('profileOrganization.lightLogo') }), jsxs("div", { className: "flex h-[200px] w-full sm:w-[200px] flex-col items-center justify-center rounded-lg border-2 border-dashed border-gray-200 mt-3 hover:bg-gray-50 cursor-pointer", onClick: (event) => {
|
|
263626
263724
|
event.stopPropagation();
|
|
263627
263725
|
if (lightLogoInputRef.current) {
|
|
263628
263726
|
lightLogoInputRef.current.click();
|
|
@@ -265123,7 +265221,7 @@ isModalOpen, onModalOpenChange, defaultActiveTab, onAccountDeleted, enableMemory
|
|
|
265123
265221
|
return `https://${url}`;
|
|
265124
265222
|
};
|
|
265125
265223
|
const getHelpUrl = () => {
|
|
265126
|
-
return addProtocolToUrl((metadata === null || metadata === void 0 ? void 0 : metadata.help_center_url) || helpCenterUrl);
|
|
265224
|
+
return addProtocolToUrl((metadata === null || metadata === void 0 ? void 0 : metadata.support_url) || (metadata === null || metadata === void 0 ? void 0 : metadata.help_center_url) || helpCenterUrl);
|
|
265127
265225
|
};
|
|
265128
265226
|
const getShowHelp = () => {
|
|
265129
265227
|
return (metadata === null || metadata === void 0 ? void 0 : metadata.show_help) !== false;
|
|
@@ -183,4 +183,35 @@ export declare function setupSandboxInstance(page: Page, instance: {
|
|
|
183
183
|
* then delete it from the table.
|
|
184
184
|
*/
|
|
185
185
|
export declare function teardownSandboxInstance(page: Page, instanceName: string): Promise<void>;
|
|
186
|
+
/** The three sandbox kinds selectable on the Sandbox tab. Mutually exclusive —
|
|
187
|
+
* enabling one turns off whichever kind was enabled before. */
|
|
188
|
+
export type SandboxKind = 'computational-runtime' | 'virtual-machine' | 'claw';
|
|
189
|
+
/**
|
|
190
|
+
* Verify the sandbox kind selector shows all three kind switches
|
|
191
|
+
* (Computing Runtime, Virtual Machine Shell, Claw).
|
|
192
|
+
*/
|
|
193
|
+
export declare function verifySandboxKindsVisible(page: Page): Promise<void>;
|
|
194
|
+
/** Read whether a sandbox kind switch is currently on. Waits for the switch to
|
|
195
|
+
* render first so a not-yet-mounted selector never reads as "off". */
|
|
196
|
+
export declare function isSandboxKindEnabled(page: Page, kind: SandboxKind): Promise<boolean>;
|
|
197
|
+
/**
|
|
198
|
+
* Toggle a sandbox kind switch. The kinds are mutually exclusive: enabling one
|
|
199
|
+
* turns off whichever kind was enabled before in the same request; disabling
|
|
200
|
+
* the active kind leaves none enabled. Deterministic completion signals: the
|
|
201
|
+
* switch's own aria-checked state flipping to the target value, then the save
|
|
202
|
+
* toast.
|
|
203
|
+
*/
|
|
204
|
+
export declare function toggleSandboxKind(page: Page, kind: SandboxKind): Promise<void>;
|
|
205
|
+
/**
|
|
206
|
+
* Verify the Claw instance section renders below the kind selector — either
|
|
207
|
+
* state qualifies: the not-connected instance table (its search box) or the
|
|
208
|
+
* connected-instance card. Only shown while the Claw kind is enabled.
|
|
209
|
+
*/
|
|
210
|
+
export declare function verifyClawSectionVisible(page: Page): Promise<void>;
|
|
211
|
+
/**
|
|
212
|
+
* Verify the Claw instance section is absent — the state while Claw is not the
|
|
213
|
+
* selected kind. Anchors on the kind selector first so "section missing" can
|
|
214
|
+
* never be confused with "tab not rendered yet".
|
|
215
|
+
*/
|
|
216
|
+
export declare function verifyClawSectionHidden(page: Page): Promise<void>;
|
|
186
217
|
export {};
|
|
@@ -18,8 +18,8 @@ export type { ReportDownloadOptions } from './report-download';
|
|
|
18
18
|
export { isMemoryTabVisible, switchToMemoryTab, verifyMemoryTabSettings, verifyMemoryTabMemoriesList, openAddMemoryDialog, toggleMemorySwitch, addMemory, deleteFirstMemory, deleteMemoryByContent, archiveFirstMemory, archiveMemoryByContent, getMemoryCount, verifyMemoryExists, verifyMemoryNotExists, } from './memory-test-helpers';
|
|
19
19
|
export { MEMORY_ADMIN_LABELS, memoryAdminGlobalSection, memoryAdminAgentSection, memoryAdminUserRow, memoryAdminAgentRow, memoryRowByContent, isTenantMemoryTabVisible, switchToTenantMemoryTab, switchToMemoryAdminSubTab, searchMemoryAdminUsers, openUserMemoriesPopup, closeUserMemoriesPopup, addUserGlobalMemory, editUserGlobalMemory, deleteUserGlobalMemory, toggleUserMemoryAdminSetting, filterAgentMemories, clearAgentMemoriesFilter, openAgentMemoriesPopup, closeAgentMemoriesPopup, addAgentMemoryFromPopup, } from './memory-admin-helpers';
|
|
20
20
|
export type { MemoryAdminSubTab, MemoryAdminSetting } from './memory-admin-helpers';
|
|
21
|
-
export { isSandboxTabVisible, switchToSandboxTab, verifyInstanceTableVisible, getInstanceRowCount, verifyInstanceTableEmpty, searchInstances, clearInstanceSearch, openInstanceActionsMenu, openNewInstanceDialog, createInstance, cancelNewInstanceDialog, openEditInstanceDialog, editInstance, deleteInstance, cancelDeleteInstance, connectToInstance, disconnectInstance, cancelDisconnectInstance, runInstanceChecks, runConnectedInstanceChecks, getInstanceHealthLabel, getInstanceStatusLabel, verifyConnectDisabledForUnhealthy, verifyConnectedInstanceCard, toggleAutoPush, pushConfiguration, openLLMProviderPicker, selectLLMModel, getCurrentModel, verifyAgentConfigPromptsVisible, openAgentPromptEditModal, editAgentPrompt, setupSandboxInstance, teardownSandboxInstance, } from './claw-sandbox-helpers';
|
|
22
|
-
export type { AgentPromptField } from './claw-sandbox-helpers';
|
|
21
|
+
export { isSandboxTabVisible, switchToSandboxTab, verifyInstanceTableVisible, getInstanceRowCount, verifyInstanceTableEmpty, searchInstances, clearInstanceSearch, openInstanceActionsMenu, openNewInstanceDialog, createInstance, cancelNewInstanceDialog, openEditInstanceDialog, editInstance, deleteInstance, cancelDeleteInstance, connectToInstance, disconnectInstance, cancelDisconnectInstance, runInstanceChecks, runConnectedInstanceChecks, getInstanceHealthLabel, getInstanceStatusLabel, verifyConnectDisabledForUnhealthy, verifyConnectedInstanceCard, toggleAutoPush, pushConfiguration, openLLMProviderPicker, selectLLMModel, getCurrentModel, verifyAgentConfigPromptsVisible, openAgentPromptEditModal, editAgentPrompt, setupSandboxInstance, teardownSandboxInstance, verifySandboxKindsVisible, isSandboxKindEnabled, toggleSandboxKind, verifyClawSectionVisible, verifyClawSectionHidden, } from './claw-sandbox-helpers';
|
|
22
|
+
export type { AgentPromptField, SandboxKind } from './claw-sandbox-helpers';
|
|
23
23
|
export { switchToSkillsTab, verifySkillsTabVisible, switchToAgentSkillsSubTab, switchToAvailableSkillsSubTab, goToSkillsListPage, verifySkillsEmptyState, verifyAgentSkillsEmptyState, getSkillRowCount, verifySkillVisible, addSkillToAgent, verifySkillAdded, removeSkillFromAgent, isSkillEnabled, enableSkill, disableSkill, toggleSkill, setCatalogSkillEnabled, openNewSkillDialog, createSkill, openSkillActionsMenu, openEditSkillDialog, editSkill, deleteSkill, cancelDeleteSkill, switchToSkillResourcesSubTab, addTextResource, uploadAssetResource, editTextResource, deleteResource, openSlashSkillPicker, selectSlashSkill, } from './agent-skills-helpers';
|
|
24
24
|
export type { SkillFormValues, TextResourceValues } from './agent-skills-helpers';
|
|
25
25
|
export { navigateToAuditLog, verifyAuditLogTableVisible, getAuditLogRowCount, verifyAuditLogEntryStructure, verifyAuditLogEmptyState, verifyAuditLogPermissionError, verifyAuditLogGenericError, verifyAuditLogLoading, waitForAuditLogDataLoaded, filterByAction, filterByActor, getAvailableActors, filterByDateRange, clearDateRangeFilter, getPaginationInfo, goToNextPage, goToPreviousPage, goToFirstPage, goToLastPage, goToPage, verifyCurrentPage, isOnLastPage, isOnFirstPage, navigateToAuditLogAndWaitForData, filterByActionAndVerify, filterByActorAndVerify, } from './audit-log-helpers';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iblai/iblai-js",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.0",
|
|
4
4
|
"description": "Unified JavaScript SDK for IBL.ai — re-exports data-layer, web-containers, and web-utils under a single package",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -77,9 +77,9 @@
|
|
|
77
77
|
"dotenv": "16.6.1",
|
|
78
78
|
"winston": "3.19.0",
|
|
79
79
|
"@iblai/data-layer": "1.13.0",
|
|
80
|
-
"@iblai/mcp": "1.
|
|
81
|
-
"@iblai/web-containers": "1.
|
|
82
|
-
"@iblai/web-utils": "2.2.
|
|
80
|
+
"@iblai/mcp": "1.12.0",
|
|
81
|
+
"@iblai/web-containers": "1.19.0",
|
|
82
|
+
"@iblai/web-utils": "2.2.1"
|
|
83
83
|
},
|
|
84
84
|
"peerDependencies": {
|
|
85
85
|
"@iblai/iblai-api": "4.166.0-ai",
|