@objectstack/service-settings 7.3.0 → 7.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _objectstack_spec_contracts from '@objectstack/spec/contracts';
2
- import { ICryptoProvider, IHttpRequest, IHttpServer } from '@objectstack/spec/contracts';
2
+ import { ICryptoProvider, CryptoContext, CryptoHandle, IHttpRequest, IHttpServer } from '@objectstack/spec/contracts';
3
3
  import { SettingsActionResult, SpecifierScope, SettingsChangeHandler, SettingsUnsubscribe, SettingsManifest, ResolvedSettingValue, SettingsNamespacePayload, TranslationData, TranslationBundle } from '@objectstack/spec/system';
4
4
  export { ResolvedSettingValue, SettingsActionResult, SettingsManifest, SettingsNamespacePayload, SpecifierScope } from '@objectstack/spec/system';
5
5
  import { Plugin, PluginContext } from '@objectstack/core';
@@ -332,6 +332,20 @@ declare class SettingsService {
332
332
  private materialiseRow;
333
333
  }
334
334
 
335
+ declare class InMemoryCryptoProvider implements ICryptoProvider {
336
+ private readonly key;
337
+ private readonly useNoble;
338
+ constructor(opts?: {
339
+ key?: Buffer;
340
+ });
341
+ encrypt(plain: string, ctx: CryptoContext): Promise<CryptoHandle>;
342
+ decrypt(handle: CryptoHandle, ctx: CryptoContext): Promise<string>;
343
+ rotateKey(handle: CryptoHandle, ctx: CryptoContext): Promise<CryptoHandle>;
344
+ digest(plain: string): string;
345
+ private encryptNode;
346
+ private aadOf;
347
+ }
348
+
335
349
  /** Configuration options for the SettingsServicePlugin. */
336
350
  interface SettingsServicePluginOptions {
337
351
  /**
@@ -598,4 +612,4 @@ declare const jaJP: TranslationData;
598
612
 
599
613
  declare const settingsBuiltinTranslations: TranslationBundle;
600
614
 
601
- export { type CryptoAdapter, NoopCryptoAdapter, SETTINGS_PLUGIN_ID, SETTINGS_PLUGIN_VERSION, type SettingsActionHandler, type SettingsAuditSink, type SettingsContext, type SettingsEngine, SettingsLockedError, type SettingsRoutesOptions, type SettingsRow, SettingsService, type SettingsServiceOptions, SettingsServicePlugin, type SettingsServicePluginOptions, UnknownKeyError, UnknownNamespaceError, brandingSettingsManifest, builtinSettingsManifests, envKeyOf, featureFlagsSettingsManifest, mailSettingsManifest, mailTestActionHandler, registerSettingsRoutes, settingsBuiltinTranslations, settingsObjects, settingsPluginManifestHeader, en as settingsTranslationsEn, jaJP as settingsTranslationsJaJP, zhCN as settingsTranslationsZhCN, storageSettingsManifest, storageTestActionHandler };
615
+ export { type CryptoAdapter, InMemoryCryptoProvider, NoopCryptoAdapter, SETTINGS_PLUGIN_ID, SETTINGS_PLUGIN_VERSION, type SettingsActionHandler, type SettingsAuditSink, type SettingsContext, type SettingsEngine, SettingsLockedError, type SettingsRoutesOptions, type SettingsRow, SettingsService, type SettingsServiceOptions, SettingsServicePlugin, type SettingsServicePluginOptions, UnknownKeyError, UnknownNamespaceError, brandingSettingsManifest, builtinSettingsManifests, envKeyOf, featureFlagsSettingsManifest, mailSettingsManifest, mailTestActionHandler, registerSettingsRoutes, settingsBuiltinTranslations, settingsObjects, settingsPluginManifestHeader, en as settingsTranslationsEn, jaJP as settingsTranslationsJaJP, zhCN as settingsTranslationsZhCN, storageSettingsManifest, storageTestActionHandler };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _objectstack_spec_contracts from '@objectstack/spec/contracts';
2
- import { ICryptoProvider, IHttpRequest, IHttpServer } from '@objectstack/spec/contracts';
2
+ import { ICryptoProvider, CryptoContext, CryptoHandle, IHttpRequest, IHttpServer } from '@objectstack/spec/contracts';
3
3
  import { SettingsActionResult, SpecifierScope, SettingsChangeHandler, SettingsUnsubscribe, SettingsManifest, ResolvedSettingValue, SettingsNamespacePayload, TranslationData, TranslationBundle } from '@objectstack/spec/system';
4
4
  export { ResolvedSettingValue, SettingsActionResult, SettingsManifest, SettingsNamespacePayload, SpecifierScope } from '@objectstack/spec/system';
5
5
  import { Plugin, PluginContext } from '@objectstack/core';
@@ -332,6 +332,20 @@ declare class SettingsService {
332
332
  private materialiseRow;
333
333
  }
334
334
 
335
+ declare class InMemoryCryptoProvider implements ICryptoProvider {
336
+ private readonly key;
337
+ private readonly useNoble;
338
+ constructor(opts?: {
339
+ key?: Buffer;
340
+ });
341
+ encrypt(plain: string, ctx: CryptoContext): Promise<CryptoHandle>;
342
+ decrypt(handle: CryptoHandle, ctx: CryptoContext): Promise<string>;
343
+ rotateKey(handle: CryptoHandle, ctx: CryptoContext): Promise<CryptoHandle>;
344
+ digest(plain: string): string;
345
+ private encryptNode;
346
+ private aadOf;
347
+ }
348
+
335
349
  /** Configuration options for the SettingsServicePlugin. */
336
350
  interface SettingsServicePluginOptions {
337
351
  /**
@@ -598,4 +612,4 @@ declare const jaJP: TranslationData;
598
612
 
599
613
  declare const settingsBuiltinTranslations: TranslationBundle;
600
614
 
601
- export { type CryptoAdapter, NoopCryptoAdapter, SETTINGS_PLUGIN_ID, SETTINGS_PLUGIN_VERSION, type SettingsActionHandler, type SettingsAuditSink, type SettingsContext, type SettingsEngine, SettingsLockedError, type SettingsRoutesOptions, type SettingsRow, SettingsService, type SettingsServiceOptions, SettingsServicePlugin, type SettingsServicePluginOptions, UnknownKeyError, UnknownNamespaceError, brandingSettingsManifest, builtinSettingsManifests, envKeyOf, featureFlagsSettingsManifest, mailSettingsManifest, mailTestActionHandler, registerSettingsRoutes, settingsBuiltinTranslations, settingsObjects, settingsPluginManifestHeader, en as settingsTranslationsEn, jaJP as settingsTranslationsJaJP, zhCN as settingsTranslationsZhCN, storageSettingsManifest, storageTestActionHandler };
615
+ export { type CryptoAdapter, InMemoryCryptoProvider, NoopCryptoAdapter, SETTINGS_PLUGIN_ID, SETTINGS_PLUGIN_VERSION, type SettingsActionHandler, type SettingsAuditSink, type SettingsContext, type SettingsEngine, SettingsLockedError, type SettingsRoutesOptions, type SettingsRow, SettingsService, type SettingsServiceOptions, SettingsServicePlugin, type SettingsServicePluginOptions, UnknownKeyError, UnknownNamespaceError, brandingSettingsManifest, builtinSettingsManifests, envKeyOf, featureFlagsSettingsManifest, mailSettingsManifest, mailTestActionHandler, registerSettingsRoutes, settingsBuiltinTranslations, settingsObjects, settingsPluginManifestHeader, en as settingsTranslationsEn, jaJP as settingsTranslationsJaJP, zhCN as settingsTranslationsZhCN, storageSettingsManifest, storageTestActionHandler };
package/dist/index.js CHANGED
@@ -2622,11 +2622,328 @@ var jaJP = {
2622
2622
  }
2623
2623
  };
2624
2624
 
2625
+ // src/translations/es-ES.ts
2626
+ var esES = {
2627
+ settingsCommon: {
2628
+ sourceLabels: {
2629
+ env: "Entorno",
2630
+ global: "Global",
2631
+ tenant: "Inquilino",
2632
+ user: "Usuario",
2633
+ default: "Predeterminado"
2634
+ }
2635
+ },
2636
+ settings: {
2637
+ mail: {
2638
+ title: "Env\xEDo de correo",
2639
+ description: "Configuraci\xF3n de SMTP y del proveedor de correo transaccional.",
2640
+ groups: {
2641
+ provider: { title: "Proveedor", description: "Elige c\xF3mo env\xEDa correo saliente este espacio de trabajo." },
2642
+ smtp: { title: "SMTP" },
2643
+ api_key: { title: "Clave de API" },
2644
+ from_address: { title: "Direcci\xF3n de remitente" }
2645
+ },
2646
+ keys: {
2647
+ provider: {
2648
+ label: "Proveedor",
2649
+ options: {
2650
+ smtp: "SMTP",
2651
+ sendgrid: "SendGrid",
2652
+ ses: "Amazon SES",
2653
+ postmark: "Postmark"
2654
+ }
2655
+ },
2656
+ smtp_host: { label: "Host", help: "Ejemplo: smtp.example.com" },
2657
+ smtp_port: { label: "Puerto" },
2658
+ smtp_secure: { label: "Usar TLS" },
2659
+ smtp_user: { label: "Usuario" },
2660
+ smtp_password: { label: "Contrase\xF1a" },
2661
+ api_key: { label: "Clave de API" },
2662
+ from_email: { label: "Correo del remitente", help: "Ejemplo: no-reply@example.com" },
2663
+ from_name: { label: "Nombre del remitente" }
2664
+ },
2665
+ actions: {
2666
+ test: { label: "Enviar correo de prueba" }
2667
+ }
2668
+ },
2669
+ branding: {
2670
+ title: "Marca",
2671
+ description: "Nombre del espacio de trabajo, logotipo y color de acento.",
2672
+ groups: {
2673
+ identity: { title: "Identidad" },
2674
+ appearance: { title: "Apariencia" }
2675
+ },
2676
+ keys: {
2677
+ workspace_name: { label: "Nombre del espacio de trabajo" },
2678
+ support_email: { label: "Correo de soporte", help: "Ejemplo: support@example.com" },
2679
+ theme_mode: {
2680
+ label: "Tema predeterminado",
2681
+ options: { light: "Claro", dark: "Oscuro", system: "Seg\xFAn el sistema" }
2682
+ },
2683
+ accent_color: { label: "Color de acento" },
2684
+ logo_url: { label: "URL del logotipo", help: "Ejemplo: https://\u2026/logo.svg" }
2685
+ }
2686
+ },
2687
+ feature_flags: {
2688
+ title: "Indicadores de funci\xF3n",
2689
+ description: "Activa funciones experimentales y en beta para este espacio de trabajo.",
2690
+ groups: {
2691
+ productivity: { title: "Productividad" },
2692
+ collaboration: { title: "Colaboraci\xF3n" }
2693
+ },
2694
+ keys: {
2695
+ ai_enabled: {
2696
+ label: "Asistente de IA",
2697
+ help: "Habilita el panel del asistente de IA dentro de la aplicaci\xF3n."
2698
+ },
2699
+ kanban_swimlanes: { label: "Carriles de Kanban" },
2700
+ realtime_cursors: { label: "Cursores en tiempo real" },
2701
+ inline_comments: { label: "Comentarios en l\xEDnea" }
2702
+ }
2703
+ },
2704
+ storage: {
2705
+ title: "Almacenamiento de archivos",
2706
+ description: "Backend usado para adjuntos, exportaciones y subidas de usuarios. \u26A0 Cambiar de adaptador no migra los archivos existentes: los archivos subidos con el adaptador anterior dejan de ser accesibles a trav\xE9s del nuevo.",
2707
+ groups: {
2708
+ adapter: { title: "Backend", description: "Elige d\xF3nde se almacenan los archivos subidos." },
2709
+ local: { title: "Local" },
2710
+ s3: { title: "S3" },
2711
+ limits: { title: "L\xEDmites" }
2712
+ },
2713
+ keys: {
2714
+ adapter: {
2715
+ label: "Adaptador",
2716
+ options: { local: "Sistema de archivos local", s3: "S3 / compatible con S3" }
2717
+ },
2718
+ local_root: {
2719
+ label: "Directorio ra\xEDz",
2720
+ help: "Ruta del sistema de archivos donde se almacenan los archivos. Las rutas relativas se resuelven desde el directorio de trabajo del servidor."
2721
+ },
2722
+ s3_bucket: {
2723
+ label: "Bucket",
2724
+ help: "Bucket compartido del host. Los archivos de cada entorno se a\xEDslan mediante el prefijo projects/<environmentId>/."
2725
+ },
2726
+ s3_region: { label: "Regi\xF3n", help: "Ejemplo: us-east-1" },
2727
+ s3_endpoint: {
2728
+ label: "Endpoint",
2729
+ help: "Endpoint personalizado para proveedores compatibles con S3 (R2, MinIO, Wasabi). D\xE9jalo en blanco para AWS S3."
2730
+ },
2731
+ s3_access_key_id: { label: "Access Key ID" },
2732
+ s3_secret_access_key: { label: "Secret Access Key" },
2733
+ s3_force_path_style: {
2734
+ label: "Forzar URLs de tipo path",
2735
+ help: "Act\xEDvalo para MinIO y la mayor\xEDa de proveedores compatibles con S3; desact\xEDvalo para AWS S3."
2736
+ },
2737
+ presigned_ttl: { label: "TTL de URL prefirmada (segundos)" },
2738
+ session_ttl: {
2739
+ label: "TTL de sesi\xF3n de subida (segundos)",
2740
+ help: "Tiempo durante el cual una sesi\xF3n de subida por fragmentos sigue siendo reanudable."
2741
+ },
2742
+ max_upload_mb: { label: "Tama\xF1o m\xE1ximo de subida (MB)" }
2743
+ },
2744
+ actions: {
2745
+ test: { label: "Probar conexi\xF3n" }
2746
+ }
2747
+ },
2748
+ ai: {
2749
+ title: "IA y Embedder",
2750
+ description: "Proveedor de LLM, modelo, credenciales y configuraci\xF3n del embedder usados por los servicios de IA y de conocimiento de la plataforma.",
2751
+ groups: {
2752
+ provider: {
2753
+ title: "Proveedor",
2754
+ description: "Elige el backend de LLM. El modo Memory repite la entrada: \xFAtil para pruebas, nunca para producci\xF3n."
2755
+ },
2756
+ gateway: {
2757
+ title: "Vercel AI Gateway",
2758
+ description: "Enrutador multiproveedor. La especificaci\xF3n del modelo sigue `provider/model`, p. ej. `openai/gpt-4o`."
2759
+ },
2760
+ openai: { title: "OpenAI" },
2761
+ anthropic: { title: "Anthropic" },
2762
+ google: { title: "Google" },
2763
+ defaults: {
2764
+ title: "Valores predeterminados de generaci\xF3n",
2765
+ description: "Se aplican cuando un agente o una solicitud de chat no especifica su propio valor."
2766
+ },
2767
+ observability: { title: "Observabilidad" },
2768
+ embedder: {
2769
+ title: "Embedder",
2770
+ description: "Proveedor de texto \u2192 vector usado por las fuentes de conocimiento y RAG. Independiente del proveedor de chat anterior."
2771
+ }
2772
+ },
2773
+ keys: {
2774
+ provider: {
2775
+ label: "Proveedor",
2776
+ options: {
2777
+ memory: "Memory (eco \u2014 solo pruebas)",
2778
+ gateway: "Vercel AI Gateway",
2779
+ openai: "OpenAI",
2780
+ anthropic: "Anthropic",
2781
+ google: "Google Generative AI"
2782
+ }
2783
+ },
2784
+ gateway_model: {
2785
+ label: "Modelo de Gateway",
2786
+ help: "Se reenv\xEDa como AI_GATEWAY_MODEL. Ejemplo: openai/gpt-4o"
2787
+ },
2788
+ gateway_api_key: {
2789
+ label: "Clave de API de Gateway",
2790
+ help: "Opcional: solo se requiere si el gateway exige autenticaci\xF3n."
2791
+ },
2792
+ openai_api_key: {
2793
+ label: "Clave de API de OpenAI",
2794
+ help: "Se reenv\xEDa como OPENAI_API_KEY. Se almacena cifrada en reposo."
2795
+ },
2796
+ openai_model: {
2797
+ label: "Modelo",
2798
+ help: "ID de modelo predeterminado. Las anulaciones por agente tienen prioridad."
2799
+ },
2800
+ openai_base_url: {
2801
+ label: "Base URL",
2802
+ help: "Anulaci\xF3n para Azure OpenAI o gateways autoalojados. D\xE9jalo en blanco para api.openai.com."
2803
+ },
2804
+ anthropic_api_key: {
2805
+ label: "Clave de API de Anthropic",
2806
+ help: "Se reenv\xEDa como ANTHROPIC_API_KEY. Se almacena cifrada en reposo."
2807
+ },
2808
+ anthropic_model: { label: "Modelo" },
2809
+ google_api_key: {
2810
+ label: "Clave de API de Google",
2811
+ help: "Se reenv\xEDa como GOOGLE_GENERATIVE_AI_API_KEY. Se almacena cifrada en reposo."
2812
+ },
2813
+ google_model: { label: "Modelo" },
2814
+ temperature: {
2815
+ label: "Temperatura",
2816
+ help: "0 = determinista, 2 = muy creativo."
2817
+ },
2818
+ max_tokens: {
2819
+ label: "M\xE1ximo de tokens de salida",
2820
+ help: "L\xEDmite estricto de tokens generados por respuesta."
2821
+ },
2822
+ request_timeout_ms: { label: "Tiempo de espera de la solicitud (ms)" },
2823
+ trace_enabled: {
2824
+ label: "Registrar trazas",
2825
+ help: "Persiste las trazas de prompt/respuesta en sys_ai_trace para depuraci\xF3n y reproducci\xF3n."
2826
+ },
2827
+ log_prompts: {
2828
+ label: "Registrar prompts completos",
2829
+ help: "Incluye los prompts renderizados (no solo metadatos) en las filas de traza. \u26A0 Puede filtrar PII: desact\xEDvalo en entornos regulados."
2830
+ },
2831
+ embedder_provider: {
2832
+ label: "Proveedor",
2833
+ options: {
2834
+ none: "Deshabilitado (sin embeddings)",
2835
+ openai: "OpenAI",
2836
+ azure: "Azure OpenAI",
2837
+ dashscope: "\u963F\u91CC\u901A\u4E49 DashScope",
2838
+ zhipu: "\u667A\u8C31 BigModel",
2839
+ siliconflow: "\u7845\u57FA\u6D41\u52A8 SiliconFlow",
2840
+ doubao: "\u706B\u5C71\u5F15\u64CE Doubao",
2841
+ minimax: "MiniMax",
2842
+ ollama: "Ollama (local)",
2843
+ custom: "Personalizado (compatible con OpenAI)"
2844
+ }
2845
+ },
2846
+ embedder_api_key: {
2847
+ label: "Clave de API del embedder",
2848
+ help: "Token bearer enviado en la cabecera Authorization. Para Ollama sirve cualquier valor no vac\xEDo."
2849
+ },
2850
+ embedder_model: {
2851
+ label: "Modelo",
2852
+ help: "Ejemplos \u2014 OpenAI: text-embedding-3-small \xB7 \u963F\u91CC\u901A\u4E49: text-embedding-v3 \xB7 \u667A\u8C31: embedding-3 \xB7 \u7845\u57FA\u6D41\u52A8: BAAI/bge-m3 \xB7 Ollama: bge-m3"
2853
+ },
2854
+ embedder_base_url: {
2855
+ label: "Base URL",
2856
+ help: "Ra\xEDz del endpoint (sin /embeddings). Se autocompleta desde el preset; an\xFAlalo para proxys o gateways autoalojados."
2857
+ },
2858
+ embedder_dimensions: {
2859
+ label: "Dimensiones",
2860
+ help: "Anula la dimensionalidad de salida (solo modelos Matryoshka). D\xE9jalo en blanco para usar el valor predeterminado del modelo."
2861
+ },
2862
+ embedder_batch_size: {
2863
+ label: "Tama\xF1o de lote",
2864
+ help: "Fragmentos por llamada a embed(). Red\xFAcelo si alcanzas los l\xEDmites de tasa o tama\xF1o del proveedor."
2865
+ }
2866
+ },
2867
+ actions: {
2868
+ test: { label: "Probar conexi\xF3n" },
2869
+ test_embedder: { label: "Probar embedder" }
2870
+ }
2871
+ },
2872
+ knowledge: {
2873
+ title: "Conocimiento",
2874
+ description: "Backend de almac\xE9n de vectores para RAG / fuentes de conocimiento. \u26A0 Cambiar de adaptador NO migra los \xEDndices existentes.",
2875
+ groups: {
2876
+ adapter: {
2877
+ title: "Backend",
2878
+ description: "Elige d\xF3nde se almacenan los fragmentos de documento y sus vectores."
2879
+ },
2880
+ turso: {
2881
+ title: "Turso / libSQL",
2882
+ description: "Funciona con Turso gestionado, archivo local o en memoria."
2883
+ },
2884
+ ragflow: {
2885
+ title: "RAGFlow",
2886
+ description: "Despliegue externo de RAGFlow. Consulta https://ragflow.io para instrucciones de autoalojamiento."
2887
+ },
2888
+ indexing: {
2889
+ title: "Valores predeterminados de indexaci\xF3n",
2890
+ description: "Los valores por fuente en KnowledgeSource.adapterConfig tienen prioridad."
2891
+ },
2892
+ permissions: { title: "Permisos" }
2893
+ },
2894
+ keys: {
2895
+ adapter: {
2896
+ label: "Adaptador",
2897
+ options: {
2898
+ memory: "En memoria (solo desarrollo / pruebas)",
2899
+ turso: "Turso / libSQL (nube o local)",
2900
+ ragflow: "RAGFlow (externo)"
2901
+ }
2902
+ },
2903
+ turso_url: {
2904
+ label: "URL de conexi\xF3n",
2905
+ help: "Ejemplos: libsql://your-tenant.turso.io \xB7 file:./.objectstack/knowledge.db \xB7 :memory:"
2906
+ },
2907
+ turso_auth_token: {
2908
+ label: "Token de autenticaci\xF3n",
2909
+ help: "Solo se requiere para URLs de Turso gestionado."
2910
+ },
2911
+ ragflow_base_url: { label: "Base URL", help: "Ejemplo: http://localhost:9380" },
2912
+ ragflow_api_key: { label: "Clave de API" },
2913
+ ragflow_default_dataset: {
2914
+ label: "ID de dataset predeterminado",
2915
+ help: "Se usa cuando una KnowledgeSource no especifica su propio dataset de RAGFlow."
2916
+ },
2917
+ chunk_target: {
2918
+ label: "Tama\xF1o objetivo de fragmento (caracteres)",
2919
+ help: "L\xEDmite flexible del tama\xF1o de fragmento antes de que act\xFAe la divisi\xF3n consciente de tokens."
2920
+ },
2921
+ chunk_overlap: {
2922
+ label: "Solapamiento de fragmentos (caracteres)",
2923
+ help: "Caracteres conservados del fragmento anterior para que el contexto sobreviva al l\xEDmite."
2924
+ },
2925
+ over_fetch: {
2926
+ label: "Multiplicador de sobre-obtenci\xF3n",
2927
+ help: "Se obtienen topK \xD7 overFetch candidatos internos para que el filtrado de metadatos en JS siga teniendo filas."
2928
+ },
2929
+ enforce_rls: {
2930
+ label: "Aplicar RLS en la b\xFAsqueda",
2931
+ help: "Vuelve a comprobar cada resultado contra los permisos a nivel de registro del solicitante. \u26A0 Desactivarlo omite la salvaguarda exclusiva de la plataforma."
2932
+ }
2933
+ },
2934
+ actions: {
2935
+ test: { label: "Probar conexi\xF3n" }
2936
+ }
2937
+ }
2938
+ }
2939
+ };
2940
+
2625
2941
  // src/translations/index.ts
2626
2942
  var settingsBuiltinTranslations = {
2627
2943
  en,
2628
2944
  "zh-CN": zhCN,
2629
- "ja-JP": jaJP
2945
+ "ja-JP": jaJP,
2946
+ "es-ES": esES
2630
2947
  };
2631
2948
 
2632
2949
  // src/settings-service-plugin.ts
@@ -2841,6 +3158,7 @@ function wrapEngineAsSettingsEngine(engine) {
2841
3158
  };
2842
3159
  }
2843
3160
  export {
3161
+ InMemoryCryptoProvider,
2844
3162
  NoopCryptoAdapter,
2845
3163
  SETTINGS_PLUGIN_ID,
2846
3164
  SETTINGS_PLUGIN_VERSION,