@objectstack/service-ai 7.1.0 → 7.2.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.ts CHANGED
@@ -861,10 +861,22 @@ declare const createObjectTool: {
861
861
  requiresConfirmation: boolean;
862
862
  active: boolean;
863
863
  builtIn: boolean;
864
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
865
+ _lockReason?: string | undefined;
866
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
867
+ _provenance?: "package" | "env-forced" | "org" | undefined;
868
+ _packageId?: string | undefined;
869
+ _packageVersion?: string | undefined;
870
+ _lockDocsUrl?: string | undefined;
864
871
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
865
872
  outputSchema?: Record<string, unknown> | undefined;
866
873
  objectName?: string | undefined;
867
874
  permissions?: string[] | undefined;
875
+ protection?: {
876
+ lock: "none" | "full" | "no-overlay" | "no-delete";
877
+ reason: string;
878
+ docsUrl?: string | undefined;
879
+ } | undefined;
868
880
  };
869
881
 
870
882
  /**
@@ -882,10 +894,22 @@ declare const addFieldTool: {
882
894
  requiresConfirmation: boolean;
883
895
  active: boolean;
884
896
  builtIn: boolean;
897
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
898
+ _lockReason?: string | undefined;
899
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
900
+ _provenance?: "package" | "env-forced" | "org" | undefined;
901
+ _packageId?: string | undefined;
902
+ _packageVersion?: string | undefined;
903
+ _lockDocsUrl?: string | undefined;
885
904
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
886
905
  outputSchema?: Record<string, unknown> | undefined;
887
906
  objectName?: string | undefined;
888
907
  permissions?: string[] | undefined;
908
+ protection?: {
909
+ lock: "none" | "full" | "no-overlay" | "no-delete";
910
+ reason: string;
911
+ docsUrl?: string | undefined;
912
+ } | undefined;
889
913
  };
890
914
 
891
915
  /**
@@ -902,10 +926,22 @@ declare const modifyFieldTool: {
902
926
  requiresConfirmation: boolean;
903
927
  active: boolean;
904
928
  builtIn: boolean;
929
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
930
+ _lockReason?: string | undefined;
931
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
932
+ _provenance?: "package" | "env-forced" | "org" | undefined;
933
+ _packageId?: string | undefined;
934
+ _packageVersion?: string | undefined;
935
+ _lockDocsUrl?: string | undefined;
905
936
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
906
937
  outputSchema?: Record<string, unknown> | undefined;
907
938
  objectName?: string | undefined;
908
939
  permissions?: string[] | undefined;
940
+ protection?: {
941
+ lock: "none" | "full" | "no-overlay" | "no-delete";
942
+ reason: string;
943
+ docsUrl?: string | undefined;
944
+ } | undefined;
909
945
  };
910
946
 
911
947
  /**
@@ -922,10 +958,22 @@ declare const deleteFieldTool: {
922
958
  requiresConfirmation: boolean;
923
959
  active: boolean;
924
960
  builtIn: boolean;
961
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
962
+ _lockReason?: string | undefined;
963
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
964
+ _provenance?: "package" | "env-forced" | "org" | undefined;
965
+ _packageId?: string | undefined;
966
+ _packageVersion?: string | undefined;
967
+ _lockDocsUrl?: string | undefined;
925
968
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
926
969
  outputSchema?: Record<string, unknown> | undefined;
927
970
  objectName?: string | undefined;
928
971
  permissions?: string[] | undefined;
972
+ protection?: {
973
+ lock: "none" | "full" | "no-overlay" | "no-delete";
974
+ reason: string;
975
+ docsUrl?: string | undefined;
976
+ } | undefined;
929
977
  };
930
978
 
931
979
  /**
@@ -943,10 +991,22 @@ declare const listObjectsTool: {
943
991
  requiresConfirmation: boolean;
944
992
  active: boolean;
945
993
  builtIn: boolean;
994
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
995
+ _lockReason?: string | undefined;
996
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
997
+ _provenance?: "package" | "env-forced" | "org" | undefined;
998
+ _packageId?: string | undefined;
999
+ _packageVersion?: string | undefined;
1000
+ _lockDocsUrl?: string | undefined;
946
1001
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
947
1002
  outputSchema?: Record<string, unknown> | undefined;
948
1003
  objectName?: string | undefined;
949
1004
  permissions?: string[] | undefined;
1005
+ protection?: {
1006
+ lock: "none" | "full" | "no-overlay" | "no-delete";
1007
+ reason: string;
1008
+ docsUrl?: string | undefined;
1009
+ } | undefined;
950
1010
  };
951
1011
 
952
1012
  /**
@@ -964,10 +1024,22 @@ declare const describeObjectTool: {
964
1024
  requiresConfirmation: boolean;
965
1025
  active: boolean;
966
1026
  builtIn: boolean;
1027
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
1028
+ _lockReason?: string | undefined;
1029
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
1030
+ _provenance?: "package" | "env-forced" | "org" | undefined;
1031
+ _packageId?: string | undefined;
1032
+ _packageVersion?: string | undefined;
1033
+ _lockDocsUrl?: string | undefined;
967
1034
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
968
1035
  outputSchema?: Record<string, unknown> | undefined;
969
1036
  objectName?: string | undefined;
970
1037
  permissions?: string[] | undefined;
1038
+ protection?: {
1039
+ lock: "none" | "full" | "no-overlay" | "no-delete";
1040
+ reason: string;
1041
+ docsUrl?: string | undefined;
1042
+ } | undefined;
971
1043
  };
972
1044
 
973
1045
  /** All built-in metadata management tool definitions (Tool metadata). */
@@ -1068,10 +1140,22 @@ declare const listPackagesTool: {
1068
1140
  requiresConfirmation: boolean;
1069
1141
  active: boolean;
1070
1142
  builtIn: boolean;
1143
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
1144
+ _lockReason?: string | undefined;
1145
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
1146
+ _provenance?: "package" | "env-forced" | "org" | undefined;
1147
+ _packageId?: string | undefined;
1148
+ _packageVersion?: string | undefined;
1149
+ _lockDocsUrl?: string | undefined;
1071
1150
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
1072
1151
  outputSchema?: Record<string, unknown> | undefined;
1073
1152
  objectName?: string | undefined;
1074
1153
  permissions?: string[] | undefined;
1154
+ protection?: {
1155
+ lock: "none" | "full" | "no-overlay" | "no-delete";
1156
+ reason: string;
1157
+ docsUrl?: string | undefined;
1158
+ } | undefined;
1075
1159
  };
1076
1160
 
1077
1161
  /**
@@ -1087,10 +1171,22 @@ declare const getPackageTool: {
1087
1171
  requiresConfirmation: boolean;
1088
1172
  active: boolean;
1089
1173
  builtIn: boolean;
1174
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
1175
+ _lockReason?: string | undefined;
1176
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
1177
+ _provenance?: "package" | "env-forced" | "org" | undefined;
1178
+ _packageId?: string | undefined;
1179
+ _packageVersion?: string | undefined;
1180
+ _lockDocsUrl?: string | undefined;
1090
1181
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
1091
1182
  outputSchema?: Record<string, unknown> | undefined;
1092
1183
  objectName?: string | undefined;
1093
1184
  permissions?: string[] | undefined;
1185
+ protection?: {
1186
+ lock: "none" | "full" | "no-overlay" | "no-delete";
1187
+ reason: string;
1188
+ docsUrl?: string | undefined;
1189
+ } | undefined;
1094
1190
  };
1095
1191
 
1096
1192
  /**
@@ -1107,10 +1203,22 @@ declare const createPackageTool: {
1107
1203
  requiresConfirmation: boolean;
1108
1204
  active: boolean;
1109
1205
  builtIn: boolean;
1206
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
1207
+ _lockReason?: string | undefined;
1208
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
1209
+ _provenance?: "package" | "env-forced" | "org" | undefined;
1210
+ _packageId?: string | undefined;
1211
+ _packageVersion?: string | undefined;
1212
+ _lockDocsUrl?: string | undefined;
1110
1213
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
1111
1214
  outputSchema?: Record<string, unknown> | undefined;
1112
1215
  objectName?: string | undefined;
1113
1216
  permissions?: string[] | undefined;
1217
+ protection?: {
1218
+ lock: "none" | "full" | "no-overlay" | "no-delete";
1219
+ reason: string;
1220
+ docsUrl?: string | undefined;
1221
+ } | undefined;
1114
1222
  };
1115
1223
 
1116
1224
  /**
@@ -1126,10 +1234,22 @@ declare const getActivePackageTool: {
1126
1234
  requiresConfirmation: boolean;
1127
1235
  active: boolean;
1128
1236
  builtIn: boolean;
1237
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
1238
+ _lockReason?: string | undefined;
1239
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
1240
+ _provenance?: "package" | "env-forced" | "org" | undefined;
1241
+ _packageId?: string | undefined;
1242
+ _packageVersion?: string | undefined;
1243
+ _lockDocsUrl?: string | undefined;
1129
1244
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
1130
1245
  outputSchema?: Record<string, unknown> | undefined;
1131
1246
  objectName?: string | undefined;
1132
1247
  permissions?: string[] | undefined;
1248
+ protection?: {
1249
+ lock: "none" | "full" | "no-overlay" | "no-delete";
1250
+ reason: string;
1251
+ docsUrl?: string | undefined;
1252
+ } | undefined;
1133
1253
  };
1134
1254
 
1135
1255
  /**
@@ -1146,10 +1266,22 @@ declare const setActivePackageTool: {
1146
1266
  requiresConfirmation: boolean;
1147
1267
  active: boolean;
1148
1268
  builtIn: boolean;
1269
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
1270
+ _lockReason?: string | undefined;
1271
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
1272
+ _provenance?: "package" | "env-forced" | "org" | undefined;
1273
+ _packageId?: string | undefined;
1274
+ _packageVersion?: string | undefined;
1275
+ _lockDocsUrl?: string | undefined;
1149
1276
  category?: "action" | "flow" | "vector_search" | "data" | "utility" | "analytics" | "integration" | undefined;
1150
1277
  outputSchema?: Record<string, unknown> | undefined;
1151
1278
  objectName?: string | undefined;
1152
1279
  permissions?: string[] | undefined;
1280
+ protection?: {
1281
+ lock: "none" | "full" | "no-overlay" | "no-delete";
1282
+ reason: string;
1283
+ docsUrl?: string | undefined;
1284
+ } | undefined;
1153
1285
  };
1154
1286
 
1155
1287
  /** All built-in package management tool definitions (Tool metadata). */
@@ -1958,6 +2090,13 @@ declare const AiConversationObject: Omit<{
1958
2090
  caseSensitive?: boolean | undefined;
1959
2091
  autonumberFormat?: string | undefined;
1960
2092
  }>;
2093
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
2094
+ _lockReason?: string | undefined;
2095
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
2096
+ _provenance?: "package" | "env-forced" | "org" | undefined;
2097
+ _packageId?: string | undefined;
2098
+ _packageVersion?: string | undefined;
2099
+ _lockDocsUrl?: string | undefined;
1961
2100
  label?: string | undefined;
1962
2101
  pluralLabel?: string | undefined;
1963
2102
  description?: string | undefined;
@@ -2347,7 +2486,7 @@ declare const AiConversationObject: Omit<{
2347
2486
  apiMethods?: ("restore" | "export" | "import" | "delete" | "purge" | "upsert" | "search" | "create" | "list" | "get" | "update" | "history" | "bulk" | "aggregate")[] | undefined;
2348
2487
  } | undefined;
2349
2488
  recordTypes?: string[] | undefined;
2350
- sharingModel?: "private" | "read" | "full" | "read_write" | undefined;
2489
+ sharingModel?: "full" | "private" | "read" | "read_write" | undefined;
2351
2490
  publicSharing?: {
2352
2491
  enabled: boolean;
2353
2492
  allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
@@ -2450,6 +2589,11 @@ declare const AiConversationObject: Omit<{
2450
2589
  role?: string | undefined;
2451
2590
  } | undefined;
2452
2591
  }[] | undefined;
2592
+ protection?: {
2593
+ lock: "none" | "full" | "no-overlay" | "no-delete";
2594
+ reason: string;
2595
+ docsUrl?: string | undefined;
2596
+ } | undefined;
2453
2597
  }, "fields"> & Pick<{
2454
2598
  readonly name: "ai_conversations";
2455
2599
  readonly label: "AI Conversation";
@@ -3913,6 +4057,13 @@ declare const AiMessageObject: Omit<{
3913
4057
  caseSensitive?: boolean | undefined;
3914
4058
  autonumberFormat?: string | undefined;
3915
4059
  }>;
4060
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
4061
+ _lockReason?: string | undefined;
4062
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
4063
+ _provenance?: "package" | "env-forced" | "org" | undefined;
4064
+ _packageId?: string | undefined;
4065
+ _packageVersion?: string | undefined;
4066
+ _lockDocsUrl?: string | undefined;
3916
4067
  label?: string | undefined;
3917
4068
  pluralLabel?: string | undefined;
3918
4069
  description?: string | undefined;
@@ -4302,7 +4453,7 @@ declare const AiMessageObject: Omit<{
4302
4453
  apiMethods?: ("restore" | "export" | "import" | "delete" | "purge" | "upsert" | "search" | "create" | "list" | "get" | "update" | "history" | "bulk" | "aggregate")[] | undefined;
4303
4454
  } | undefined;
4304
4455
  recordTypes?: string[] | undefined;
4305
- sharingModel?: "private" | "read" | "full" | "read_write" | undefined;
4456
+ sharingModel?: "full" | "private" | "read" | "read_write" | undefined;
4306
4457
  publicSharing?: {
4307
4458
  enabled: boolean;
4308
4459
  allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
@@ -4405,6 +4556,11 @@ declare const AiMessageObject: Omit<{
4405
4556
  role?: string | undefined;
4406
4557
  } | undefined;
4407
4558
  }[] | undefined;
4559
+ protection?: {
4560
+ lock: "none" | "full" | "no-overlay" | "no-delete";
4561
+ reason: string;
4562
+ docsUrl?: string | undefined;
4563
+ } | undefined;
4408
4564
  }, "fields"> & Pick<{
4409
4565
  readonly name: "ai_messages";
4410
4566
  readonly label: "AI Message";
@@ -6740,6 +6896,13 @@ declare const AiTraceObject: Omit<{
6740
6896
  caseSensitive?: boolean | undefined;
6741
6897
  autonumberFormat?: string | undefined;
6742
6898
  }>;
6899
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
6900
+ _lockReason?: string | undefined;
6901
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
6902
+ _provenance?: "package" | "env-forced" | "org" | undefined;
6903
+ _packageId?: string | undefined;
6904
+ _packageVersion?: string | undefined;
6905
+ _lockDocsUrl?: string | undefined;
6743
6906
  label?: string | undefined;
6744
6907
  pluralLabel?: string | undefined;
6745
6908
  description?: string | undefined;
@@ -7129,7 +7292,7 @@ declare const AiTraceObject: Omit<{
7129
7292
  apiMethods?: ("restore" | "export" | "import" | "delete" | "purge" | "upsert" | "search" | "create" | "list" | "get" | "update" | "history" | "bulk" | "aggregate")[] | undefined;
7130
7293
  } | undefined;
7131
7294
  recordTypes?: string[] | undefined;
7132
- sharingModel?: "private" | "read" | "full" | "read_write" | undefined;
7295
+ sharingModel?: "full" | "private" | "read" | "read_write" | undefined;
7133
7296
  publicSharing?: {
7134
7297
  enabled: boolean;
7135
7298
  allowedAudiences?: ("email" | "public" | "link_only" | "signed_in")[] | undefined;
@@ -7232,6 +7395,11 @@ declare const AiTraceObject: Omit<{
7232
7395
  role?: string | undefined;
7233
7396
  } | undefined;
7234
7397
  }[] | undefined;
7398
+ protection?: {
7399
+ lock: "none" | "full" | "no-overlay" | "no-delete";
7400
+ reason: string;
7401
+ docsUrl?: string | undefined;
7402
+ } | undefined;
7235
7403
  }, "fields"> & Pick<{
7236
7404
  readonly name: "ai_traces";
7237
7405
  readonly label: "AI Trace";
@@ -10429,6 +10597,13 @@ declare const AiTraceObject: Omit<{
10429
10597
  * automatically in Studio when AIService is loaded.
10430
10598
  */
10431
10599
  declare const AiTraceView: {
10600
+ _lock?: "none" | "full" | "no-overlay" | "no-delete" | undefined;
10601
+ _lockReason?: string | undefined;
10602
+ _lockSource?: "artifact" | "package" | "env-forced" | undefined;
10603
+ _provenance?: "package" | "env-forced" | "org" | undefined;
10604
+ _packageId?: string | undefined;
10605
+ _packageVersion?: string | undefined;
10606
+ _lockDocsUrl?: string | undefined;
10432
10607
  list?: {
10433
10608
  type: "map" | "kanban" | "calendar" | "gantt" | "gallery" | "timeline" | "chart" | "grid";
10434
10609
  columns: string[] | {
@@ -11129,6 +11304,11 @@ declare const AiTraceView: {
11129
11304
  role?: string | undefined;
11130
11305
  } | undefined;
11131
11306
  }> | undefined;
11307
+ protection?: {
11308
+ lock: "none" | "full" | "no-overlay" | "no-delete";
11309
+ reason: string;
11310
+ docsUrl?: string | undefined;
11311
+ } | undefined;
11132
11312
  };
11133
11313
 
11134
11314
  /**
package/dist/index.js CHANGED
@@ -189,6 +189,7 @@ var init_data_tools = __esm({
189
189
  DEFAULT_QUERY_LIMIT = 20;
190
190
  QUERY_RECORDS_TOOL = {
191
191
  name: "query_records",
192
+ label: "Query Records",
192
193
  description: "Query records from a data object with optional filters, field selection, sorting, and pagination. Returns an array of matching records.",
193
194
  parameters: {
194
195
  type: "object",
@@ -234,6 +235,7 @@ var init_data_tools = __esm({
234
235
  };
235
236
  GET_RECORD_TOOL = {
236
237
  name: "get_record",
238
+ label: "Get Record",
237
239
  description: "Get a single record by its ID from a data object.",
238
240
  parameters: {
239
241
  type: "object",
@@ -258,6 +260,7 @@ var init_data_tools = __esm({
258
260
  };
259
261
  AGGREGATE_DATA_TOOL = {
260
262
  name: "aggregate_data",
263
+ label: "Aggregate Data",
261
264
  description: "Perform aggregation/statistical operations on a data object. Supports count, sum, avg, min, max with optional groupBy and where filters.",
262
265
  parameters: {
263
266
  type: "object",
@@ -2305,6 +2308,7 @@ function cryptoRandomId() {
2305
2308
  }
2306
2309
 
2307
2310
  // src/plugin.ts
2311
+ import { readEnvWithDeprecation } from "@objectstack/types";
2308
2312
  import { EMBEDDER_SERVICE } from "@objectstack/spec/contracts";
2309
2313
 
2310
2314
  // src/stream/vercel-stream-encoder.ts
@@ -5194,6 +5198,7 @@ var QueryPlanSchema = z2.object({
5194
5198
  });
5195
5199
  var QUERY_DATA_TOOL = {
5196
5200
  name: "query_data",
5201
+ label: "Query Data (Natural Language)",
5197
5202
  description: "Answer a natural-language question about the user's data. Internally retrieves the relevant object schema, generates an ObjectQL query, executes it, and returns the matching records. Prefer this tool over `query_records` / `aggregate_data` when the user's intent is expressed in plain language.",
5198
5203
  parameters: {
5199
5204
  type: "object",
@@ -6710,7 +6715,7 @@ var _AIServicePlugin = class _AIServicePlugin {
6710
6715
  );
6711
6716
  const provider = mod[factory] ?? mod.default;
6712
6717
  if (typeof provider === "function") {
6713
- const modelId = process.env.AI_MODEL ?? defaultModel;
6718
+ const modelId = readEnvWithDeprecation("OS_AI_MODEL", "AI_MODEL") ?? defaultModel;
6714
6719
  const useChatApi = factory === "openai" && typeof provider.chat === "function";
6715
6720
  const model = useChatApi ? provider.chat(modelId) : provider(modelId);
6716
6721
  const adapter = new VercelLLMAdapter({ model });
@@ -6803,7 +6808,7 @@ var _AIServicePlugin = class _AIServicePlugin {
6803
6808
  name: "AI Service",
6804
6809
  version: "1.0.0",
6805
6810
  type: "plugin",
6806
- scope: "project",
6811
+ scope: "system",
6807
6812
  namespace: "ai",
6808
6813
  objects: [AiConversationObject, AiMessageObject, AiTraceObject, AiPendingActionObject, AiEvalCaseObject, AiEvalRunObject],
6809
6814
  views: [AiTraceView, AiMessageView, AiPendingActionView, AiEvalCaseView, AiEvalRunView]
@@ -6906,7 +6911,8 @@ var _AIServicePlugin = class _AIServicePlugin {
6906
6911
  }
6907
6912
  if (!toolExists) {
6908
6913
  try {
6909
- await withTimeout(metadataService.register("tool", toolDef.name, toolDef));
6914
+ const label = toolDef.label ?? toToolLabel(toolDef.name);
6915
+ await withTimeout(metadataService.register("tool", toolDef.name, { ...toolDef, label }));
6910
6916
  } catch (err) {
6911
6917
  ctx.logger.warn(
6912
6918
  "[AI] Failed to persist tool metadata (non-fatal)",
@@ -7324,6 +7330,9 @@ _AIServicePlugin.OPENAI_COMPATIBLE_PRESETS = {
7324
7330
  openrouter: { baseURL: "https://openrouter.ai/api/v1", defaultModel: "openai/gpt-4o-mini" }
7325
7331
  };
7326
7332
  var AIServicePlugin = _AIServicePlugin;
7333
+ function toToolLabel(name) {
7334
+ return name.split("_").filter(Boolean).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
7335
+ }
7327
7336
  function extractOverrides(payload) {
7328
7337
  if (!payload || typeof payload !== "object") return {};
7329
7338
  const p = payload;