@objectstack/service-settings 8.0.0 → 9.0.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Settings service for ObjectStack. Implements ADR-0007: a generic
4
4
  namespace **manifest** mechanism + a single K/V table (`sys_setting`) +
5
- a resolver that layers `Env > Tenant > User > Default`.
5
+ a resolver that layers `OS_* env > Tenant > User > Default`.
6
6
 
7
7
  ## What it gives you
8
8
 
@@ -26,9 +26,12 @@ a resolver that layers `Env > Tenant > User > Default`.
26
26
 
27
27
  ## Env override
28
28
 
29
- `process.env[NAMESPACE_KEY]` (uppercased) takes precedence over any
30
- stored value. Such fields are returned with `source: 'env', locked:
31
- true` and writes (service or REST) fail with HTTP 409.
29
+ `process.env[OS_NAMESPACE_KEY]` (uppercased, with dots / hyphens converted
30
+ to underscores) takes precedence over any stored value. For example,
31
+ `mail.smtp_host` resolves from `OS_MAIL_SMTP_HOST`, and
32
+ `feature_flags.ai_enabled` resolves from `OS_FEATURE_FLAGS_AI_ENABLED`.
33
+ Such fields are returned with `source: 'env', locked: true` and writes
34
+ (service or REST) fail with HTTP 409.
32
35
 
33
36
  ## Encryption
34
37
 
package/dist/index.cjs CHANGED
@@ -82,7 +82,7 @@ var NoopCryptoAdapter = class {
82
82
  // src/settings-service.types.ts
83
83
  function envKeyOf(namespace, key) {
84
84
  const slug = `${namespace}_${key}`.replace(/[.-]/g, "_").toUpperCase();
85
- return slug;
85
+ return `OS_${slug}`;
86
86
  }
87
87
  var SettingsLockedError = class extends Error {
88
88
  constructor(namespace, key, reason = "locked-by-env") {
@@ -210,20 +210,20 @@ var SettingsService = class {
210
210
  // Manifest registry
211
211
  // ---------------------------------------------------------------------
212
212
  /** Register (or replace) a manifest. Idempotent. */
213
- registerManifest(manifest5) {
213
+ registerManifest(manifest6) {
214
214
  const scopes = /* @__PURE__ */ new Map();
215
215
  const encryptedKeys = /* @__PURE__ */ new Set();
216
216
  const defaults = /* @__PURE__ */ new Map();
217
- const defaultScope = manifest5.scope ?? "tenant";
218
- for (const spec of manifest5.specifiers) {
217
+ const defaultScope = manifest6.scope ?? "tenant";
218
+ for (const spec of manifest6.specifiers) {
219
219
  if (!spec.key || LAYOUT_ONLY_TYPES.has(spec.type)) continue;
220
220
  scopes.set(spec.key, spec.scope ?? defaultScope);
221
221
  if (spec.encrypted || spec.type === "password") encryptedKeys.add(spec.key);
222
222
  if (typeof spec.default !== "undefined") defaults.set(spec.key, spec.default);
223
223
  }
224
- const prev = this.registry.get(manifest5.namespace);
224
+ const prev = this.registry.get(manifest6.namespace);
225
225
  const actions = prev?.actions ?? /* @__PURE__ */ new Map();
226
- this.registry.set(manifest5.namespace, { manifest: manifest5, scopes, encryptedKeys, defaults, actions });
226
+ this.registry.set(manifest6.namespace, { manifest: manifest6, scopes, encryptedKeys, defaults, actions });
227
227
  }
228
228
  /** Look up a manifest, or throw `UnknownNamespaceError`. */
229
229
  getManifest(namespace) {
@@ -950,11 +950,90 @@ var settingsPluginManifestHeader = {
950
950
  type: "plugin",
951
951
  scope: "system",
952
952
  name: "Settings Service",
953
- description: "Generic settings registry + K/V resolver with Env > Tenant > User > Default precedence. ADR-0007."
953
+ description: "Generic settings registry + K/V resolver with OS_* env > Tenant > User > Default precedence. ADR-0007."
954
954
  };
955
955
 
956
- // src/manifests/mail.manifest.ts
956
+ // src/manifests/auth.manifest.ts
957
957
  var manifest = {
958
+ namespace: "auth",
959
+ version: 1,
960
+ label: "Authentication",
961
+ icon: "LockKeyhole",
962
+ description: "Sign-in, registration, and built-in auth feature controls.",
963
+ scope: "global",
964
+ readPermission: "manage_platform_settings",
965
+ writePermission: "manage_platform_settings",
966
+ category: "Security",
967
+ order: 15,
968
+ specifiers: [
969
+ {
970
+ type: "group",
971
+ id: "email_password",
972
+ label: "Email and password",
973
+ required: false,
974
+ description: "Control local email/password sign-in and self-service registration."
975
+ },
976
+ {
977
+ type: "toggle",
978
+ key: "email_password_enabled",
979
+ label: "Enable email/password login",
980
+ required: false,
981
+ default: true
982
+ },
983
+ {
984
+ type: "toggle",
985
+ key: "signup_enabled",
986
+ label: "Allow self-service registration",
987
+ required: false,
988
+ default: true,
989
+ visible: "${data.email_password_enabled !== false}"
990
+ },
991
+ {
992
+ type: "toggle",
993
+ key: "require_email_verification",
994
+ label: "Require email verification",
995
+ required: false,
996
+ default: false,
997
+ visible: "${data.email_password_enabled !== false}"
998
+ },
999
+ {
1000
+ type: "group",
1001
+ id: "social",
1002
+ label: "Social sign-in",
1003
+ required: false,
1004
+ description: "Configure the built-in Google sign-in provider. Deployment env vars still win."
1005
+ },
1006
+ {
1007
+ type: "toggle",
1008
+ key: "google_enabled",
1009
+ label: "Enable Google login",
1010
+ required: false,
1011
+ default: true,
1012
+ description: "Requires a Google OAuth client ID and secret from Google Cloud Console."
1013
+ },
1014
+ {
1015
+ type: "text",
1016
+ key: "google_client_id",
1017
+ label: "Google client ID",
1018
+ required: true,
1019
+ description: "OAuth client ID from Google Cloud Console. GOOGLE_CLIENT_ID can also be set on the server.",
1020
+ visible: "${data.google_enabled !== false}"
1021
+ },
1022
+ {
1023
+ type: "password",
1024
+ key: "google_client_secret",
1025
+ label: "Google client secret",
1026
+ required: true,
1027
+ encrypted: true,
1028
+ description: "Stored encrypted at rest. GOOGLE_CLIENT_SECRET can also be set on the server.",
1029
+ visible: "${data.google_enabled !== false}"
1030
+ }
1031
+ ]
1032
+ };
1033
+ var authSettingsManifest = manifest;
1034
+
1035
+ // src/manifests/mail.manifest.ts
1036
+ var manifest2 = {
958
1037
  namespace: "mail",
959
1038
  version: 1,
960
1039
  label: "Mail Delivery",
@@ -1055,7 +1134,7 @@ var manifest = {
1055
1134
  }
1056
1135
  ]
1057
1136
  };
1058
- var mailSettingsManifest = manifest;
1137
+ var mailSettingsManifest = manifest2;
1059
1138
  var mailTestActionHandler = async ({ values }) => {
1060
1139
  const provider = String(values.provider ?? "smtp");
1061
1140
  const fromEmail = values.from_email;
@@ -1148,7 +1227,7 @@ var featureFlagsSettingsManifest = {
1148
1227
  id: "beta_notice",
1149
1228
  label: "Heads up",
1150
1229
  required: false,
1151
- bannerText: "Beta features may change without notice. Pin via env vars (e.g. `FEATURE_FLAGS_AI_ENABLED=true`) to lock for the whole deployment.",
1230
+ bannerText: "Beta features may change without notice. Pin via env vars (e.g. `OS_FEATURE_FLAGS_AI_ENABLED=true`) to lock for the whole deployment.",
1152
1231
  bannerSeverity: "warning"
1153
1232
  },
1154
1233
  { type: "group", id: "productivity", label: "Productivity", required: false },
@@ -1168,7 +1247,7 @@ var featureFlagsSettingsManifest = {
1168
1247
  };
1169
1248
 
1170
1249
  // src/manifests/storage.manifest.ts
1171
- var manifest2 = {
1250
+ var manifest3 = {
1172
1251
  namespace: "storage",
1173
1252
  version: 1,
1174
1253
  label: "File Storage",
@@ -1308,7 +1387,7 @@ var manifest2 = {
1308
1387
  }
1309
1388
  ]
1310
1389
  };
1311
- var storageSettingsManifest = manifest2;
1390
+ var storageSettingsManifest = manifest3;
1312
1391
  var storageTestActionHandler = async ({ values }) => {
1313
1392
  const adapter = String(values.adapter ?? "local");
1314
1393
  if (adapter === "local") {
@@ -1341,7 +1420,7 @@ var storageTestActionHandler = async ({ values }) => {
1341
1420
  };
1342
1421
 
1343
1422
  // src/manifests/ai.manifest.ts
1344
- var manifest3 = {
1423
+ var manifest4 = {
1345
1424
  namespace: "ai",
1346
1425
  version: 1,
1347
1426
  label: "AI",
@@ -1842,7 +1921,7 @@ var manifest3 = {
1842
1921
  }
1843
1922
  ]
1844
1923
  };
1845
- var aiSettingsManifest = manifest3;
1924
+ var aiSettingsManifest = manifest4;
1846
1925
  var aiTestActionHandler = async ({ values, payload }) => {
1847
1926
  const overrides = extractOverrides(payload);
1848
1927
  const merged = { ...values, ...overrides };
@@ -1901,7 +1980,7 @@ function extractOverrides(payload) {
1901
1980
  }
1902
1981
 
1903
1982
  // src/manifests/knowledge.manifest.ts
1904
- var manifest4 = {
1983
+ var manifest5 = {
1905
1984
  namespace: "knowledge",
1906
1985
  version: 1,
1907
1986
  label: "Knowledge",
@@ -2055,11 +2134,12 @@ var manifest4 = {
2055
2134
  }
2056
2135
  ]
2057
2136
  };
2058
- var knowledgeSettingsManifest = manifest4;
2137
+ var knowledgeSettingsManifest = manifest5;
2059
2138
 
2060
2139
  // src/manifests/index.ts
2061
2140
  var builtinSettingsManifests = [
2062
2141
  brandingSettingsManifest,
2142
+ authSettingsManifest,
2063
2143
  mailSettingsManifest,
2064
2144
  storageSettingsManifest,
2065
2145
  aiSettingsManifest,
@@ -2129,6 +2209,37 @@ var en = {
2129
2209
  logo_url: { label: "Logo URL", help: "Example: https://\u2026/logo.svg" }
2130
2210
  }
2131
2211
  },
2212
+ auth: {
2213
+ title: "Authentication",
2214
+ description: "Sign-in, registration, and built-in auth feature controls.",
2215
+ groups: {
2216
+ email_password: {
2217
+ title: "Email and password",
2218
+ description: "Control local email/password sign-in and self-service registration."
2219
+ },
2220
+ social: {
2221
+ title: "Social sign-in",
2222
+ description: "Configure the built-in Google sign-in provider. Deployment env vars still win."
2223
+ }
2224
+ },
2225
+ keys: {
2226
+ email_password_enabled: { label: "Enable email/password login" },
2227
+ signup_enabled: { label: "Allow self-service registration" },
2228
+ require_email_verification: { label: "Require email verification" },
2229
+ google_enabled: {
2230
+ label: "Enable Google login",
2231
+ help: "Requires a Google OAuth client ID and secret from Google Cloud Console."
2232
+ },
2233
+ google_client_id: {
2234
+ label: "Google client ID",
2235
+ help: "OAuth client ID from Google Cloud Console. GOOGLE_CLIENT_ID can also be set on the server."
2236
+ },
2237
+ google_client_secret: {
2238
+ label: "Google client secret",
2239
+ help: "Stored encrypted at rest. GOOGLE_CLIENT_SECRET can also be set on the server."
2240
+ }
2241
+ }
2242
+ },
2132
2243
  feature_flags: {
2133
2244
  title: "Feature Flags",
2134
2245
  description: "Toggle experimental and beta features for this workspace.",
@@ -2445,6 +2556,37 @@ var zhCN = {
2445
2556
  logo_url: { label: "Logo \u94FE\u63A5", help: "\u793A\u4F8B:https://\u2026/logo.svg" }
2446
2557
  }
2447
2558
  },
2559
+ auth: {
2560
+ title: "\u8BA4\u8BC1",
2561
+ description: "\u767B\u5F55\u3001\u6CE8\u518C\u4EE5\u53CA\u5185\u7F6E\u8BA4\u8BC1\u529F\u80FD\u7684\u63A7\u5236\u9879\u3002",
2562
+ groups: {
2563
+ email_password: {
2564
+ title: "\u90AE\u7BB1\u4E0E\u5BC6\u7801",
2565
+ description: "\u63A7\u5236\u672C\u5730\u90AE\u7BB1/\u5BC6\u7801\u767B\u5F55\u4E0E\u81EA\u52A9\u6CE8\u518C\u3002"
2566
+ },
2567
+ social: {
2568
+ title: "\u793E\u4EA4\u767B\u5F55",
2569
+ description: "\u914D\u7F6E\u5185\u7F6E\u7684 Google \u767B\u5F55\u63D0\u4F9B\u5546\u3002\u90E8\u7F72\u73AF\u5883\u53D8\u91CF\u4ECD\u4F18\u5148\u751F\u6548\u3002"
2570
+ }
2571
+ },
2572
+ keys: {
2573
+ email_password_enabled: { label: "\u542F\u7528\u90AE\u7BB1/\u5BC6\u7801\u767B\u5F55" },
2574
+ signup_enabled: { label: "\u5141\u8BB8\u81EA\u52A9\u6CE8\u518C" },
2575
+ require_email_verification: { label: "\u8981\u6C42\u90AE\u7BB1\u9A8C\u8BC1" },
2576
+ google_enabled: {
2577
+ label: "\u542F\u7528 Google \u767B\u5F55",
2578
+ help: "\u9700\u8981\u5728 Google Cloud Console \u4E2D\u521B\u5EFA\u7684 Google OAuth \u5BA2\u6237\u7AEF ID \u4E0E\u5BC6\u94A5\u3002"
2579
+ },
2580
+ google_client_id: {
2581
+ label: "Google \u5BA2\u6237\u7AEF ID",
2582
+ help: "\u6765\u81EA Google Cloud Console \u7684 OAuth \u5BA2\u6237\u7AEF ID\u3002\u4E5F\u53EF\u5728\u670D\u52A1\u5668\u4E0A\u8BBE\u7F6E GOOGLE_CLIENT_ID\u3002"
2583
+ },
2584
+ google_client_secret: {
2585
+ label: "Google \u5BA2\u6237\u7AEF\u5BC6\u94A5",
2586
+ help: "\u52A0\u5BC6\u5B58\u50A8\u3002\u4E5F\u53EF\u5728\u670D\u52A1\u5668\u4E0A\u8BBE\u7F6E GOOGLE_CLIENT_SECRET\u3002"
2587
+ }
2588
+ }
2589
+ },
2448
2590
  feature_flags: {
2449
2591
  title: "\u529F\u80FD\u5F00\u5173",
2450
2592
  description: "\u4E3A\u5F53\u524D\u5DE5\u4F5C\u533A\u5F00\u542F\u5B9E\u9A8C\u6027\u4E0E\u6D4B\u8BD5\u529F\u80FD\u3002",
@@ -2668,6 +2810,37 @@ var jaJP = {
2668
2810
  logo_url: { label: "\u30ED\u30B4 URL", help: "\u4F8B: https://\u2026/logo.svg" }
2669
2811
  }
2670
2812
  },
2813
+ auth: {
2814
+ title: "\u8A8D\u8A3C",
2815
+ description: "\u30B5\u30A4\u30F3\u30A4\u30F3\u3001\u767B\u9332\u3001\u7D44\u307F\u8FBC\u307F\u8A8D\u8A3C\u6A5F\u80FD\u306E\u5236\u5FA1\u3002",
2816
+ groups: {
2817
+ email_password: {
2818
+ title: "\u30E1\u30FC\u30EB\u3068\u30D1\u30B9\u30EF\u30FC\u30C9",
2819
+ description: "\u30ED\u30FC\u30AB\u30EB\u306E\u30E1\u30FC\u30EB/\u30D1\u30B9\u30EF\u30FC\u30C9\u30B5\u30A4\u30F3\u30A4\u30F3\u3068\u30BB\u30EB\u30D5\u30B5\u30FC\u30D3\u30B9\u767B\u9332\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"
2820
+ },
2821
+ social: {
2822
+ title: "\u30BD\u30FC\u30B7\u30E3\u30EB\u30B5\u30A4\u30F3\u30A4\u30F3",
2823
+ description: "\u7D44\u307F\u8FBC\u307F\u306E Google \u30B5\u30A4\u30F3\u30A4\u30F3\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002\u30C7\u30D7\u30ED\u30A4\u306E\u74B0\u5883\u5909\u6570\u304C\u512A\u5148\u3055\u308C\u307E\u3059\u3002"
2824
+ }
2825
+ },
2826
+ keys: {
2827
+ email_password_enabled: { label: "\u30E1\u30FC\u30EB/\u30D1\u30B9\u30EF\u30FC\u30C9\u30ED\u30B0\u30A4\u30F3\u3092\u6709\u52B9\u5316" },
2828
+ signup_enabled: { label: "\u30BB\u30EB\u30D5\u30B5\u30FC\u30D3\u30B9\u767B\u9332\u3092\u8A31\u53EF" },
2829
+ require_email_verification: { label: "\u30E1\u30FC\u30EB\u78BA\u8A8D\u3092\u5FC5\u9808\u306B\u3059\u308B" },
2830
+ google_enabled: {
2831
+ label: "Google \u30ED\u30B0\u30A4\u30F3\u3092\u6709\u52B9\u5316",
2832
+ help: "Google Cloud Console \u306E Google OAuth \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8 ID \u3068\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u304C\u5FC5\u8981\u3067\u3059\u3002"
2833
+ },
2834
+ google_client_id: {
2835
+ label: "Google \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8 ID",
2836
+ help: "Google Cloud Console \u306E OAuth \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8 ID\u3002\u30B5\u30FC\u30D0\u30FC\u5074\u3067 GOOGLE_CLIENT_ID \u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u3082\u3067\u304D\u307E\u3059\u3002"
2837
+ },
2838
+ google_client_secret: {
2839
+ label: "Google \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8",
2840
+ help: "\u4FDD\u5B58\u6642\u306B\u6697\u53F7\u5316\u3055\u308C\u307E\u3059\u3002\u30B5\u30FC\u30D0\u30FC\u5074\u3067 GOOGLE_CLIENT_SECRET \u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u3082\u3067\u304D\u307E\u3059\u3002"
2841
+ }
2842
+ }
2843
+ },
2671
2844
  feature_flags: {
2672
2845
  title: "\u6A5F\u80FD\u30D5\u30E9\u30B0",
2673
2846
  description: "\u3053\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3067\u5B9F\u9A13\u7684\u30FB\u30D9\u30FC\u30BF\u6A5F\u80FD\u3092\u5207\u66FF\u3048\u307E\u3059\u3002",
@@ -2728,6 +2901,196 @@ var jaJP = {
2728
2901
  actions: {
2729
2902
  test: { label: "\u63A5\u7D9A\u30C6\u30B9\u30C8" }
2730
2903
  }
2904
+ },
2905
+ ai: {
2906
+ title: "AI \u3068 Embedder",
2907
+ description: "\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u306E AI \u304A\u3088\u3073\u30CA\u30EC\u30C3\u30B8\u30B5\u30FC\u30D3\u30B9\u304C\u4F7F\u7528\u3059\u308B LLM \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3001\u30E2\u30C7\u30EB\u3001\u8A8D\u8A3C\u60C5\u5831\u3001Embedder \u8A2D\u5B9A\u3002",
2908
+ groups: {
2909
+ provider: {
2910
+ title: "\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC",
2911
+ description: "LLM \u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u3092\u9078\u629E\u3057\u307E\u3059\u3002Memory \u30E2\u30FC\u30C9\u306F\u5165\u529B\u3092\u305D\u306E\u307E\u307E\u8FD4\u3057\u307E\u3059\u3002\u30C6\u30B9\u30C8\u7528\u3067\u3042\u308A\u3001\u672C\u756A\u3067\u306F\u4F7F\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002"
2912
+ },
2913
+ gateway: {
2914
+ title: "Vercel AI Gateway",
2915
+ description: "\u30DE\u30EB\u30C1\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u30EB\u30FC\u30BF\u30FC\u3002\u30E2\u30C7\u30EB\u6307\u5B9A\u306F `provider/model` \u5F62\u5F0F\u306B\u5F93\u3044\u307E\u3059\uFF08\u4F8B: `openai/gpt-4o`\uFF09\u3002"
2916
+ },
2917
+ openai: { title: "OpenAI" },
2918
+ anthropic: { title: "Anthropic" },
2919
+ google: { title: "Google" },
2920
+ defaults: {
2921
+ title: "\u751F\u6210\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u5024",
2922
+ description: "\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u307E\u305F\u306F\u30C1\u30E3\u30C3\u30C8\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u72EC\u81EA\u306E\u5024\u3092\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002"
2923
+ },
2924
+ observability: { title: "\u53EF\u89B3\u6E2C\u6027" },
2925
+ embedder: {
2926
+ title: "Embedder",
2927
+ description: "\u30CA\u30EC\u30C3\u30B8\u30BD\u30FC\u30B9\u3068 RAG \u304C\u4F7F\u7528\u3059\u308B\u30C6\u30AD\u30B9\u30C8 \u2192 \u30D9\u30AF\u30C8\u30EB\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3002\u4E0A\u8A18\u306E\u30C1\u30E3\u30C3\u30C8\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3068\u306F\u72EC\u7ACB\u3057\u3066\u3044\u307E\u3059\u3002"
2928
+ }
2929
+ },
2930
+ keys: {
2931
+ provider: {
2932
+ label: "\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC",
2933
+ options: {
2934
+ memory: "Memory\uFF08\u30A8\u30B3\u30FC \u2014 \u30C6\u30B9\u30C8\u5C02\u7528\uFF09",
2935
+ gateway: "Vercel AI Gateway",
2936
+ openai: "OpenAI",
2937
+ anthropic: "Anthropic",
2938
+ google: "Google Generative AI"
2939
+ }
2940
+ },
2941
+ gateway_model: {
2942
+ label: "Gateway \u30E2\u30C7\u30EB",
2943
+ help: "AI_GATEWAY_MODEL \u3068\u3057\u3066\u8EE2\u9001\u3055\u308C\u307E\u3059\u3002\u4F8B: openai/gpt-4o"
2944
+ },
2945
+ gateway_api_key: {
2946
+ label: "Gateway API \u30AD\u30FC",
2947
+ help: "\u4EFB\u610F \u2014 Gateway \u304C\u8A8D\u8A3C\u3092\u8981\u6C42\u3059\u308B\u5834\u5408\u306E\u307F\u5FC5\u8981\u3067\u3059\u3002"
2948
+ },
2949
+ openai_api_key: {
2950
+ label: "OpenAI API \u30AD\u30FC",
2951
+ help: "OPENAI_API_KEY \u3068\u3057\u3066\u8EE2\u9001\u3055\u308C\u307E\u3059\u3002\u4FDD\u5B58\u6642\u306B\u6697\u53F7\u5316\u3055\u308C\u307E\u3059\u3002"
2952
+ },
2953
+ openai_model: {
2954
+ label: "\u30E2\u30C7\u30EB",
2955
+ help: "\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30E2\u30C7\u30EB ID\u3002\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u5358\u4F4D\u306E\u4E0A\u66F8\u304D\u304C\u512A\u5148\u3055\u308C\u307E\u3059\u3002"
2956
+ },
2957
+ openai_base_url: {
2958
+ label: "Base URL",
2959
+ help: "Azure OpenAI \u3084\u81EA\u5DF1\u30DB\u30B9\u30C8\u578B\u30B2\u30FC\u30C8\u30A6\u30A7\u30A4\u7528\u306E\u4E0A\u66F8\u304D\u3002api.openai.com \u306E\u5834\u5408\u306F\u7A7A\u6B04\u306B\u3057\u307E\u3059\u3002"
2960
+ },
2961
+ anthropic_api_key: {
2962
+ label: "Anthropic API \u30AD\u30FC",
2963
+ help: "ANTHROPIC_API_KEY \u3068\u3057\u3066\u8EE2\u9001\u3055\u308C\u307E\u3059\u3002\u4FDD\u5B58\u6642\u306B\u6697\u53F7\u5316\u3055\u308C\u307E\u3059\u3002"
2964
+ },
2965
+ anthropic_model: { label: "\u30E2\u30C7\u30EB" },
2966
+ google_api_key: {
2967
+ label: "Google API \u30AD\u30FC",
2968
+ help: "GOOGLE_GENERATIVE_AI_API_KEY \u3068\u3057\u3066\u8EE2\u9001\u3055\u308C\u307E\u3059\u3002\u4FDD\u5B58\u6642\u306B\u6697\u53F7\u5316\u3055\u308C\u307E\u3059\u3002"
2969
+ },
2970
+ google_model: { label: "\u30E2\u30C7\u30EB" },
2971
+ temperature: {
2972
+ label: "Temperature",
2973
+ help: "0 = \u6C7A\u5B9A\u7684\u30012 = \u975E\u5E38\u306B\u5275\u9020\u7684\u3002"
2974
+ },
2975
+ max_tokens: {
2976
+ label: "\u6700\u5927\u51FA\u529B\u30C8\u30FC\u30AF\u30F3\u6570",
2977
+ help: "\u30EC\u30B9\u30DD\u30F3\u30B9\u3054\u3068\u306B\u751F\u6210\u3055\u308C\u308B\u30C8\u30FC\u30AF\u30F3\u306E\u4E0A\u9650\u3002"
2978
+ },
2979
+ request_timeout_ms: { label: "\u30EA\u30AF\u30A8\u30B9\u30C8\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 (ms)" },
2980
+ trace_enabled: {
2981
+ label: "\u30C8\u30EC\u30FC\u30B9\u3092\u8A18\u9332",
2982
+ help: "\u30C7\u30D0\u30C3\u30B0\u3068\u518D\u751F\u306E\u305F\u3081 prompt/response \u30C8\u30EC\u30FC\u30B9\u3092 sys_ai_trace \u306B\u4FDD\u5B58\u3057\u307E\u3059\u3002"
2983
+ },
2984
+ log_prompts: {
2985
+ label: "\u5B8C\u5168\u306A\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u8A18\u9332",
2986
+ help: "\u30E1\u30BF\u30C7\u30FC\u30BF\u3060\u3051\u3067\u306A\u304F\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3055\u308C\u305F\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u30C8\u30EC\u30FC\u30B9\u884C\u306B\u542B\u3081\u307E\u3059\u3002\u26A0 PII \u304C\u6F0F\u3048\u3044\u3059\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u898F\u5236\u74B0\u5883\u3067\u306F\u7121\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"
2987
+ },
2988
+ embedder_provider: {
2989
+ label: "\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC",
2990
+ options: {
2991
+ none: "\u7121\u52B9\uFF08\u57CB\u3081\u8FBC\u307F\u306A\u3057\uFF09",
2992
+ openai: "OpenAI",
2993
+ azure: "Azure OpenAI",
2994
+ dashscope: "\u963F\u91CC\u901A\u4E49 DashScope",
2995
+ zhipu: "\u667A\u8C31 BigModel",
2996
+ siliconflow: "\u7845\u57FA\u6D41\u52A8 SiliconFlow",
2997
+ doubao: "\u706B\u5C71\u5F15\u64CE Doubao",
2998
+ minimax: "MiniMax",
2999
+ ollama: "Ollama\uFF08\u30ED\u30FC\u30AB\u30EB\uFF09",
3000
+ custom: "\u30AB\u30B9\u30BF\u30E0\uFF08OpenAI \u4E92\u63DB\uFF09"
3001
+ }
3002
+ },
3003
+ embedder_api_key: {
3004
+ label: "Embedder API \u30AD\u30FC",
3005
+ help: "Authorization \u30D8\u30C3\u30C0\u30FC\u3068\u3057\u3066\u9001\u4FE1\u3055\u308C\u308B Bearer \u30C8\u30FC\u30AF\u30F3\u3002Ollama \u3067\u306F\u7A7A\u3067\u306A\u3044\u4EFB\u610F\u306E\u5024\u3067\u52D5\u4F5C\u3057\u307E\u3059\u3002"
3006
+ },
3007
+ embedder_model: {
3008
+ label: "\u30E2\u30C7\u30EB",
3009
+ help: "\u4F8B \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"
3010
+ },
3011
+ embedder_base_url: {
3012
+ label: "Base URL",
3013
+ help: "\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306E\u30EB\u30FC\u30C8\uFF08/embeddings \u3092\u542B\u307E\u306A\u3044\uFF09\u3002\u30D7\u30EA\u30BB\u30C3\u30C8\u304B\u3089\u81EA\u52D5\u5165\u529B\u3055\u308C\u307E\u3059\u3002\u30D7\u30ED\u30AD\u30B7\u3084\u81EA\u5DF1\u30DB\u30B9\u30C8\u578B\u30B2\u30FC\u30C8\u30A6\u30A7\u30A4\u7528\u306B\u4E0A\u66F8\u304D\u3067\u304D\u307E\u3059\u3002"
3014
+ },
3015
+ embedder_dimensions: {
3016
+ label: "\u6B21\u5143\u6570",
3017
+ help: "\u51FA\u529B\u6B21\u5143\u6570\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\uFF08Matryoshka \u30E2\u30C7\u30EB\u306E\u307F\uFF09\u3002\u7A7A\u6B04\u306E\u5834\u5408\u306F\u30E2\u30C7\u30EB\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002"
3018
+ },
3019
+ embedder_batch_size: {
3020
+ label: "\u30D0\u30C3\u30C1\u30B5\u30A4\u30BA",
3021
+ help: "embed() \u547C\u3073\u51FA\u3057\u3054\u3068\u306E\u30C1\u30E3\u30F3\u30AF\u6570\u3002\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u306E\u30EC\u30FC\u30C8/\u30B5\u30A4\u30BA\u5236\u9650\u306B\u9054\u3059\u308B\u5834\u5408\u306F\u6E1B\u3089\u3057\u307E\u3059\u3002"
3022
+ }
3023
+ },
3024
+ actions: {
3025
+ test: { label: "\u63A5\u7D9A\u30C6\u30B9\u30C8" },
3026
+ test_embedder: { label: "Embedder \u3092\u30C6\u30B9\u30C8" }
3027
+ }
3028
+ },
3029
+ knowledge: {
3030
+ title: "\u30CA\u30EC\u30C3\u30B8",
3031
+ description: "RAG / \u30CA\u30EC\u30C3\u30B8\u30BD\u30FC\u30B9\u7528\u306E\u30D9\u30AF\u30C8\u30EB\u30B9\u30C8\u30A2\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u3002\u26A0 \u30A2\u30C0\u30D7\u30BF\u30FC\u3092\u5207\u66FF\u3048\u3066\u3082\u65E2\u5B58\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306F\u79FB\u884C\u3055\u308C\u307E\u305B\u3093\u3002",
3032
+ groups: {
3033
+ adapter: {
3034
+ title: "\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9",
3035
+ description: "\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u30C1\u30E3\u30F3\u30AF\u3068\u305D\u306E\u30D9\u30AF\u30C8\u30EB\u306E\u4FDD\u5B58\u5148\u3092\u9078\u629E\u3057\u307E\u3059\u3002"
3036
+ },
3037
+ turso: {
3038
+ title: "Turso / libSQL",
3039
+ description: "\u30DE\u30CD\u30FC\u30B8\u30C9 Turso\u3001\u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u3001\u30A4\u30F3\u30E1\u30E2\u30EA\u306E\u3044\u305A\u308C\u3067\u3082\u52D5\u4F5C\u3057\u307E\u3059\u3002"
3040
+ },
3041
+ ragflow: {
3042
+ title: "RAGFlow",
3043
+ description: "\u5916\u90E8 RAGFlow \u30C7\u30D7\u30ED\u30A4\u3002\u30BB\u30EB\u30D5\u30DB\u30B9\u30C8\u306E\u624B\u9806\u306F https://ragflow.io \u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002"
3044
+ },
3045
+ indexing: {
3046
+ title: "\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u5024",
3047
+ description: "KnowledgeSource.adapterConfig \u306E\u30BD\u30FC\u30B9\u5358\u4F4D\u306E\u5024\u304C\u512A\u5148\u3055\u308C\u307E\u3059\u3002"
3048
+ },
3049
+ permissions: { title: "\u6A29\u9650" }
3050
+ },
3051
+ keys: {
3052
+ adapter: {
3053
+ label: "\u30A2\u30C0\u30D7\u30BF\u30FC",
3054
+ options: {
3055
+ memory: "\u30A4\u30F3\u30E1\u30E2\u30EA\uFF08\u958B\u767A/\u30C6\u30B9\u30C8\u5C02\u7528\uFF09",
3056
+ turso: "Turso / libSQL\uFF08\u30AF\u30E9\u30A6\u30C9\u307E\u305F\u306F\u30ED\u30FC\u30AB\u30EB\uFF09",
3057
+ ragflow: "RAGFlow\uFF08\u5916\u90E8\uFF09"
3058
+ }
3059
+ },
3060
+ turso_url: {
3061
+ label: "\u63A5\u7D9A URL",
3062
+ help: "\u4F8B: libsql://your-tenant.turso.io \xB7 file:./.objectstack/knowledge.db \xB7 :memory:"
3063
+ },
3064
+ turso_auth_token: {
3065
+ label: "\u8A8D\u8A3C\u30C8\u30FC\u30AF\u30F3",
3066
+ help: "\u30DE\u30CD\u30FC\u30B8\u30C9 Turso URL \u306E\u5834\u5408\u306E\u307F\u5FC5\u8981\u3067\u3059\u3002"
3067
+ },
3068
+ ragflow_base_url: { label: "Base URL", help: "\u4F8B: http://localhost:9380" },
3069
+ ragflow_api_key: { label: "API \u30AD\u30FC" },
3070
+ ragflow_default_dataset: {
3071
+ label: "\u30C7\u30D5\u30A9\u30EB\u30C8\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8 ID",
3072
+ help: "KnowledgeSource \u304C\u72EC\u81EA\u306E RAGFlow \u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u3092\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002"
3073
+ },
3074
+ chunk_target: {
3075
+ label: "\u76EE\u6A19\u30C1\u30E3\u30F3\u30AF\u30B5\u30A4\u30BA\uFF08\u6587\u5B57\u6570\uFF09",
3076
+ help: "\u30C8\u30FC\u30AF\u30F3\u5358\u4F4D\u306E\u5206\u5272\u304C\u884C\u308F\u308C\u308B\u524D\u306E\u30C1\u30E3\u30F3\u30AF\u30B5\u30A4\u30BA\u306E\u30BD\u30D5\u30C8\u4E0A\u9650\u3002"
3077
+ },
3078
+ chunk_overlap: {
3079
+ label: "\u30C1\u30E3\u30F3\u30AF\u306E\u91CD\u306A\u308A\uFF08\u6587\u5B57\u6570\uFF09",
3080
+ help: "\u5883\u754C\u3092\u8D8A\u3048\u3066\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u7DAD\u6301\u3059\u308B\u305F\u3081\u3001\u524D\u306E\u30C1\u30E3\u30F3\u30AF\u304B\u3089\u4FDD\u6301\u3059\u308B\u6587\u5B57\u6570\u3002"
3081
+ },
3082
+ over_fetch: {
3083
+ label: "\u30AA\u30FC\u30D0\u30FC\u30D5\u30A7\u30C3\u30C1\u500D\u7387",
3084
+ help: "JS \u5074\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3067\u3082\u884C\u304C\u6B8B\u308B\u3088\u3046\u3001\u5185\u90E8\u3067 topK \xD7 overFetch \u4EF6\u306E\u5019\u88DC\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002"
3085
+ },
3086
+ enforce_rls: {
3087
+ label: "\u691C\u7D22\u6642\u306B RLS \u3092\u5F37\u5236",
3088
+ help: "\u5404\u30D2\u30C3\u30C8\u3092\u547C\u3073\u51FA\u3057\u5143\u306E\u30EC\u30B3\u30FC\u30C9\u30EC\u30D9\u30EB\u6A29\u9650\u306B\u5BFE\u3057\u3066\u518D\u78BA\u8A8D\u3057\u307E\u3059\u3002\u26A0 \u7121\u52B9\u5316\u3059\u308B\u3068\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u56FA\u6709\u306E\u30BB\u30FC\u30D5\u30AC\u30FC\u30C9\u304C\u30B9\u30AD\u30C3\u30D7\u3055\u308C\u307E\u3059\u3002"
3089
+ }
3090
+ },
3091
+ actions: {
3092
+ test: { label: "\u63A5\u7D9A\u30C6\u30B9\u30C8" }
3093
+ }
2731
3094
  }
2732
3095
  }
2733
3096
  };
@@ -2794,6 +3157,37 @@ var esES = {
2794
3157
  logo_url: { label: "URL del logotipo", help: "Ejemplo: https://\u2026/logo.svg" }
2795
3158
  }
2796
3159
  },
3160
+ auth: {
3161
+ title: "Autenticaci\xF3n",
3162
+ description: "Inicio de sesi\xF3n, registro y controles de las funciones de autenticaci\xF3n integradas.",
3163
+ groups: {
3164
+ email_password: {
3165
+ title: "Correo y contrase\xF1a",
3166
+ description: "Controla el inicio de sesi\xF3n local con correo/contrase\xF1a y el registro de autoservicio."
3167
+ },
3168
+ social: {
3169
+ title: "Inicio de sesi\xF3n social",
3170
+ description: "Configura el proveedor de inicio de sesi\xF3n de Google integrado. Las variables de entorno del despliegue siguen teniendo prioridad."
3171
+ }
3172
+ },
3173
+ keys: {
3174
+ email_password_enabled: { label: "Habilitar inicio de sesi\xF3n con correo/contrase\xF1a" },
3175
+ signup_enabled: { label: "Permitir registro de autoservicio" },
3176
+ require_email_verification: { label: "Requerir verificaci\xF3n de correo" },
3177
+ google_enabled: {
3178
+ label: "Habilitar inicio de sesi\xF3n con Google",
3179
+ help: "Requiere un ID de cliente y un secreto de OAuth de Google desde Google Cloud Console."
3180
+ },
3181
+ google_client_id: {
3182
+ label: "ID de cliente de Google",
3183
+ help: "ID de cliente de OAuth desde Google Cloud Console. Tambi\xE9n se puede definir GOOGLE_CLIENT_ID en el servidor."
3184
+ },
3185
+ google_client_secret: {
3186
+ label: "Secreto de cliente de Google",
3187
+ help: "Se almacena cifrado en reposo. Tambi\xE9n se puede definir GOOGLE_CLIENT_SECRET en el servidor."
3188
+ }
3189
+ }
3190
+ },
2797
3191
  feature_flags: {
2798
3192
  title: "Indicadores de funci\xF3n",
2799
3193
  description: "Activa funciones experimentales y en beta para este espacio de trabajo.",