@agent-native/toolkit 0.20.8 → 0.21.0-nightly-20260925012751
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/agent-native.eject.json +30 -0
- package/dist/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/composer/TiptapComposer.js +101 -59
- package/dist/composer/TiptapComposer.js.map +1 -1
- package/dist/composer/TiptapComposer.spec.js +102 -10
- package/dist/composer/TiptapComposer.spec.js.map +1 -1
- package/dist/icons/ResourceIcon.d.ts +14 -0
- package/dist/icons/ResourceIcon.d.ts.map +1 -0
- package/dist/icons/ResourceIcon.js +43 -0
- package/dist/icons/ResourceIcon.js.map +1 -0
- package/dist/icons/ResourceIcon.spec.d.ts +2 -0
- package/dist/icons/ResourceIcon.spec.d.ts.map +1 -0
- package/dist/icons/ResourceIcon.spec.js +23 -0
- package/dist/icons/ResourceIcon.spec.js.map +1 -0
- package/dist/icons/ResourceIconPicker.d.ts +52 -0
- package/dist/icons/ResourceIconPicker.d.ts.map +1 -0
- package/dist/icons/ResourceIconPicker.js +344 -0
- package/dist/icons/ResourceIconPicker.js.map +1 -0
- package/dist/icons/catalog.d.ts +17 -0
- package/dist/icons/catalog.d.ts.map +1 -0
- package/dist/icons/catalog.js +114 -0
- package/dist/icons/catalog.js.map +1 -0
- package/dist/icons/catalog.spec.d.ts +2 -0
- package/dist/icons/catalog.spec.d.ts.map +1 -0
- package/dist/icons/catalog.spec.js +29 -0
- package/dist/icons/catalog.spec.js.map +1 -0
- package/dist/icons/emoji-catalog.d.ts +12 -0
- package/dist/icons/emoji-catalog.d.ts.map +1 -0
- package/dist/icons/emoji-catalog.js +59 -0
- package/dist/icons/emoji-catalog.js.map +1 -0
- package/dist/icons/emoji-catalog.spec.d.ts +2 -0
- package/dist/icons/emoji-catalog.spec.d.ts.map +1 -0
- package/dist/icons/emoji-catalog.spec.js +29 -0
- package/dist/icons/emoji-catalog.spec.js.map +1 -0
- package/dist/icons/icon-colors.d.ts +3 -0
- package/dist/icons/icon-colors.d.ts.map +1 -0
- package/dist/icons/icon-colors.js +12 -0
- package/dist/icons/icon-colors.js.map +1 -0
- package/dist/icons/icon-persistence.spec.d.ts +2 -0
- package/dist/icons/icon-persistence.spec.d.ts.map +1 -0
- package/dist/icons/icon-persistence.spec.js +38 -0
- package/dist/icons/icon-persistence.spec.js.map +1 -0
- package/dist/icons/index.d.ts +5 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +5 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/recents.d.ts +6 -0
- package/dist/icons/recents.d.ts.map +1 -0
- package/dist/icons/recents.js +23 -0
- package/dist/icons/recents.js.map +1 -0
- package/dist/icons/recents.spec.d.ts +2 -0
- package/dist/icons/recents.spec.d.ts.map +1 -0
- package/dist/icons/recents.spec.js +29 -0
- package/dist/icons/recents.spec.js.map +1 -0
- package/dist/icons/server.d.ts +7 -0
- package/dist/icons/server.d.ts.map +1 -0
- package/dist/icons/server.js +25 -0
- package/dist/icons/server.js.map +1 -0
- package/dist/icons/tabler-catalog-data.d.ts +31 -0
- package/dist/icons/tabler-catalog-data.d.ts.map +1 -0
- package/dist/icons/tabler-catalog-data.js +30121 -0
- package/dist/icons/tabler-catalog-data.js.map +1 -0
- package/dist/icons/tabler-chunk-loaders.d.ts +30 -0
- package/dist/icons/tabler-chunk-loaders.d.ts.map +1 -0
- package/dist/icons/tabler-chunk-loaders.js +30 -0
- package/dist/icons/tabler-chunk-loaders.js.map +1 -0
- package/dist/icons/tabler-chunks/a.d.ts +450 -0
- package/dist/icons/tabler-chunks/a.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/a.js +451 -0
- package/dist/icons/tabler-chunks/a.js.map +1 -0
- package/dist/icons/tabler-chunks/b.d.ts +849 -0
- package/dist/icons/tabler-chunks/b.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/b.js +850 -0
- package/dist/icons/tabler-chunks/b.js.map +1 -0
- package/dist/icons/tabler-chunks/c.d.ts +922 -0
- package/dist/icons/tabler-chunks/c.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/c.js +923 -0
- package/dist/icons/tabler-chunks/c.js.map +1 -0
- package/dist/icons/tabler-chunks/d.d.ts +380 -0
- package/dist/icons/tabler-chunks/d.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/d.js +381 -0
- package/dist/icons/tabler-chunks/d.js.map +1 -0
- package/dist/icons/tabler-chunks/e.d.ts +112 -0
- package/dist/icons/tabler-chunks/e.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/e.js +113 -0
- package/dist/icons/tabler-chunks/e.js.map +1 -0
- package/dist/icons/tabler-chunks/f.d.ts +341 -0
- package/dist/icons/tabler-chunks/f.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/f.js +342 -0
- package/dist/icons/tabler-chunks/f.js.map +1 -0
- package/dist/icons/tabler-chunks/g.d.ts +101 -0
- package/dist/icons/tabler-chunks/g.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/g.js +102 -0
- package/dist/icons/tabler-chunks/g.js.map +1 -0
- package/dist/icons/tabler-chunks/h.d.ts +276 -0
- package/dist/icons/tabler-chunks/h.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/h.js +277 -0
- package/dist/icons/tabler-chunks/h.js.map +1 -0
- package/dist/icons/tabler-chunks/i.d.ts +79 -0
- package/dist/icons/tabler-chunks/i.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/i.js +80 -0
- package/dist/icons/tabler-chunks/i.js.map +1 -0
- package/dist/icons/tabler-chunks/j.d.ts +17 -0
- package/dist/icons/tabler-chunks/j.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/j.js +18 -0
- package/dist/icons/tabler-chunks/j.js.map +1 -0
- package/dist/icons/tabler-chunks/k.d.ts +25 -0
- package/dist/icons/tabler-chunks/k.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/k.js +26 -0
- package/dist/icons/tabler-chunks/k.js.map +1 -0
- package/dist/icons/tabler-chunks/l.d.ts +298 -0
- package/dist/icons/tabler-chunks/l.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/l.js +299 -0
- package/dist/icons/tabler-chunks/l.js.map +1 -0
- package/dist/icons/tabler-chunks/m.d.ts +413 -0
- package/dist/icons/tabler-chunks/m.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/m.js +414 -0
- package/dist/icons/tabler-chunks/m.js.map +1 -0
- package/dist/icons/tabler-chunks/n.d.ts +174 -0
- package/dist/icons/tabler-chunks/n.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/n.js +175 -0
- package/dist/icons/tabler-chunks/n.js.map +1 -0
- package/dist/icons/tabler-chunks/o.d.ts +31 -0
- package/dist/icons/tabler-chunks/o.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/o.js +32 -0
- package/dist/icons/tabler-chunks/o.js.map +1 -0
- package/dist/icons/tabler-chunks/p.d.ts +374 -0
- package/dist/icons/tabler-chunks/p.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/p.js +375 -0
- package/dist/icons/tabler-chunks/p.js.map +1 -0
- package/dist/icons/tabler-chunks/q.d.ts +14 -0
- package/dist/icons/tabler-chunks/q.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/q.js +15 -0
- package/dist/icons/tabler-chunks/q.js.map +1 -0
- package/dist/icons/tabler-chunks/r.d.ts +183 -0
- package/dist/icons/tabler-chunks/r.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/r.js +184 -0
- package/dist/icons/tabler-chunks/r.js.map +1 -0
- package/dist/icons/tabler-chunks/s.d.ts +656 -0
- package/dist/icons/tabler-chunks/s.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/s.js +657 -0
- package/dist/icons/tabler-chunks/s.js.map +1 -0
- package/dist/icons/tabler-chunks/t.d.ts +242 -0
- package/dist/icons/tabler-chunks/t.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/t.js +243 -0
- package/dist/icons/tabler-chunks/t.js.map +1 -0
- package/dist/icons/tabler-chunks/u.d.ts +62 -0
- package/dist/icons/tabler-chunks/u.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/u.js +63 -0
- package/dist/icons/tabler-chunks/u.js.map +1 -0
- package/dist/icons/tabler-chunks/v.d.ts +60 -0
- package/dist/icons/tabler-chunks/v.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/v.js +61 -0
- package/dist/icons/tabler-chunks/v.js.map +1 -0
- package/dist/icons/tabler-chunks/w.d.ts +115 -0
- package/dist/icons/tabler-chunks/w.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/w.js +116 -0
- package/dist/icons/tabler-chunks/w.js.map +1 -0
- package/dist/icons/tabler-chunks/x.d.ts +18 -0
- package/dist/icons/tabler-chunks/x.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/x.js +19 -0
- package/dist/icons/tabler-chunks/x.js.map +1 -0
- package/dist/icons/tabler-chunks/y.d.ts +7 -0
- package/dist/icons/tabler-chunks/y.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/y.js +4 -0
- package/dist/icons/tabler-chunks/y.js.map +1 -0
- package/dist/icons/tabler-chunks/z.d.ts +51 -0
- package/dist/icons/tabler-chunks/z.d.ts.map +1 -0
- package/dist/icons/tabler-chunks/z.js +52 -0
- package/dist/icons/tabler-chunks/z.js.map +1 -0
- package/dist/icons/tabler-groups.d.ts +30 -0
- package/dist/icons/tabler-groups.d.ts.map +1 -0
- package/dist/icons/tabler-groups.js +65 -0
- package/dist/icons/tabler-groups.js.map +1 -0
- package/dist/icons/types.d.ts +25 -0
- package/dist/icons/types.d.ts.map +1 -0
- package/dist/icons/types.js +2 -0
- package/dist/icons/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +2 -0
- package/dist/theme/resource-icons.css +24 -0
- package/package.json +11 -2
- package/src/composer/TiptapComposer.spec.ts +142 -15
- package/src/composer/TiptapComposer.tsx +109 -58
- package/src/icons/ResourceIcon.spec.tsx +38 -0
- package/src/icons/ResourceIcon.tsx +91 -0
- package/src/icons/ResourceIconPicker.tsx +812 -0
- package/src/icons/catalog.spec.ts +50 -0
- package/src/icons/catalog.ts +153 -0
- package/src/icons/emoji-catalog.spec.ts +46 -0
- package/src/icons/emoji-catalog.ts +86 -0
- package/src/icons/icon-colors.ts +13 -0
- package/src/icons/icon-persistence.spec.ts +45 -0
- package/src/icons/index.ts +4 -0
- package/src/icons/recents.spec.ts +37 -0
- package/src/icons/recents.ts +37 -0
- package/src/icons/server.tsx +53 -0
- package/src/icons/tabler-catalog-data.ts +30122 -0
- package/src/icons/tabler-chunk-loaders.ts +29 -0
- package/src/icons/tabler-chunks/a.ts +897 -0
- package/src/icons/tabler-chunks/b.ts +1695 -0
- package/src/icons/tabler-chunks/c.ts +1841 -0
- package/src/icons/tabler-chunks/d.ts +757 -0
- package/src/icons/tabler-chunks/e.ts +221 -0
- package/src/icons/tabler-chunks/f.ts +679 -0
- package/src/icons/tabler-chunks/g.ts +199 -0
- package/src/icons/tabler-chunks/h.ts +549 -0
- package/src/icons/tabler-chunks/i.ts +155 -0
- package/src/icons/tabler-chunks/j.ts +31 -0
- package/src/icons/tabler-chunks/k.ts +47 -0
- package/src/icons/tabler-chunks/l.ts +593 -0
- package/src/icons/tabler-chunks/m.ts +823 -0
- package/src/icons/tabler-chunks/n.ts +345 -0
- package/src/icons/tabler-chunks/o.ts +59 -0
- package/src/icons/tabler-chunks/p.ts +745 -0
- package/src/icons/tabler-chunks/q.ts +25 -0
- package/src/icons/tabler-chunks/r.ts +363 -0
- package/src/icons/tabler-chunks/s.ts +1309 -0
- package/src/icons/tabler-chunks/t.ts +481 -0
- package/src/icons/tabler-chunks/u.ts +121 -0
- package/src/icons/tabler-chunks/v.ts +117 -0
- package/src/icons/tabler-chunks/w.ts +227 -0
- package/src/icons/tabler-chunks/x.ts +33 -0
- package/src/icons/tabler-chunks/y.ts +3 -0
- package/src/icons/tabler-chunks/z.ts +99 -0
- package/src/icons/tabler-groups.ts +70 -0
- package/src/icons/types.ts +35 -0
- package/src/index.ts +1 -0
- package/src/styles.css +2 -0
- package/src/theme/resource-icons.css +24 -0
|
@@ -1090,22 +1090,33 @@ const FRIENDLY_MODEL_NAMES: Record<string, string> = {
|
|
|
1090
1090
|
"claude-cli": "Claude Code",
|
|
1091
1091
|
"pi-cli": "Pi",
|
|
1092
1092
|
"opencode-cli": "OpenCode",
|
|
1093
|
-
"claude-fable-5": "Fable 5",
|
|
1093
|
+
"claude-fable-5": "Claude Fable 5",
|
|
1094
1094
|
"kimi-k2-5": "Kimi K2.5",
|
|
1095
|
-
"deepseek-
|
|
1095
|
+
"deepseek-v4-pro": "DeepSeek V4 Pro",
|
|
1096
1096
|
"z-ai/glm-5.2": "GLM 5.2",
|
|
1097
|
-
"openai/gpt-6-astra": "Astra",
|
|
1098
|
-
"openai/gpt-6-astra-pro": "Astra Pro",
|
|
1097
|
+
"openai/gpt-6-astra": "GPT-6 Astra",
|
|
1098
|
+
"openai/gpt-6-astra-pro": "GPT-6 Astra Pro",
|
|
1099
1099
|
"gpt-6-sol": "GPT-6 Sol",
|
|
1100
1100
|
"gpt-6-luna": "GPT-6 Luna",
|
|
1101
1101
|
"openai/gpt-6-sol": "GPT-6 Sol",
|
|
1102
1102
|
"openai/gpt-6-luna": "GPT-6 Luna",
|
|
1103
|
-
"anthropic/claude-opus-5.5": "Opus 5.5",
|
|
1104
|
-
"anthropic/claude-fable-5.1": "Fable 5.1",
|
|
1103
|
+
"anthropic/claude-opus-5.5": "Claude Opus 5.5",
|
|
1104
|
+
"anthropic/claude-fable-5.1": "Claude Fable 5.1",
|
|
1105
1105
|
"google/gemini-3.8-flash": "Gemini 3.8 Flash",
|
|
1106
1106
|
"qwen/qwen3.8-max-0902": "Qwen 3.8 Max",
|
|
1107
1107
|
"meta/muse-spark-1.3": "Muse Spark 1.3",
|
|
1108
1108
|
"inception/mercury-2.5": "Mercury 2.5",
|
|
1109
|
+
"claude-opus-5-5": "Claude Opus 5.5",
|
|
1110
|
+
"claude-opus-4-8": "Claude Opus 4.8",
|
|
1111
|
+
"claude-sonnet-5": "Claude Sonnet 5",
|
|
1112
|
+
"claude-haiku-4-5": "Claude Haiku 4.5",
|
|
1113
|
+
"gemini-3-5-flash-lite": "Gemini 3.5 Flash-Lite",
|
|
1114
|
+
"gemini-3-1-flash-lite": "Gemini 3.1 Flash-Lite",
|
|
1115
|
+
"grok-code-fast": "Grok Code Fast",
|
|
1116
|
+
"qwen3-coder": "Qwen3 Coder",
|
|
1117
|
+
"deepseek-v3-1": "DeepSeek v3.1",
|
|
1118
|
+
"z-ai-glm-4-5": "Z-AI GLM 4.5",
|
|
1119
|
+
"z-ai-glm-5-1": "Z-AI GLM 5.1",
|
|
1109
1120
|
};
|
|
1110
1121
|
|
|
1111
1122
|
const LOCAL_RUNTIME_ENGINES = new Set([
|
|
@@ -1206,44 +1217,40 @@ function friendlyModelName(model: string, t?: ComposerTranslate): string {
|
|
|
1206
1217
|
);
|
|
1207
1218
|
}
|
|
1208
1219
|
if (FRIENDLY_MODEL_NAMES[model]) return FRIENDLY_MODEL_NAMES[model];
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1220
|
+
const normalizedModel = model.replace(/^(?:anthropic|openai|google)\//, "");
|
|
1221
|
+
// Claude: claude-{tier}-{major}[-minor][-dateYYYYMMDD].
|
|
1222
|
+
const claude = normalizedModel.match(
|
|
1223
|
+
/^claude-(opus|sonnet|haiku|fable)-(\d+)(?:[-.](\d+))?(?:-\d{8,})?$/,
|
|
1212
1224
|
);
|
|
1213
1225
|
if (claude) {
|
|
1214
1226
|
const tier = claude[1][0].toUpperCase() + claude[1].slice(1);
|
|
1215
|
-
return
|
|
1227
|
+
return `Claude ${tier} ${claude[2]}${claude[3] ? `.${claude[3]}` : ""}`;
|
|
1216
1228
|
}
|
|
1217
|
-
// GPT: gpt-{major}-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
const
|
|
1221
|
-
const
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
.join(" ");
|
|
1227
|
-
}
|
|
1228
|
-
if (gpt) {
|
|
1229
|
-
return `GPT-${gpt[1]}.${gpt[2]}`;
|
|
1230
|
-
}
|
|
1231
|
-
return `GPT-${rest}`;
|
|
1229
|
+
// GPT: gpt-{major}[-minor][-variant] → GPT-Major[.Minor] Variant.
|
|
1230
|
+
const gpt = normalizedModel.match(/^gpt-(\d+)(?:[.-](\d+))?(?:[.-](.+))?$/);
|
|
1231
|
+
if (gpt) {
|
|
1232
|
+
const version = `${gpt[1]}${gpt[2] ? `.${gpt[2]}` : ""}`;
|
|
1233
|
+
const variant = gpt[3]
|
|
1234
|
+
?.split("-")
|
|
1235
|
+
.map((part) => part[0].toUpperCase() + part.slice(1))
|
|
1236
|
+
.join(" ");
|
|
1237
|
+
return `GPT-${version}${variant ? ` ${variant}` : ""}`;
|
|
1232
1238
|
}
|
|
1233
|
-
if (/^o\d/.test(
|
|
1234
|
-
// Gemini: gemini-{
|
|
1235
|
-
const geminiVersioned =
|
|
1236
|
-
/^gemini-(\d+
|
|
1239
|
+
if (/^o\d/.test(normalizedModel)) return normalizedModel;
|
|
1240
|
+
// Gemini: gemini-{version.parts}-{variant}[-preview] → Gemini Version Variant.
|
|
1241
|
+
const geminiVersioned = normalizedModel.match(
|
|
1242
|
+
/^gemini-(\d+(?:[-.]\d+)+)-(.+?)(?:-preview)?$/,
|
|
1237
1243
|
);
|
|
1238
1244
|
if (geminiVersioned) {
|
|
1239
|
-
const variant = geminiVersioned[
|
|
1245
|
+
const variant = geminiVersioned[2]
|
|
1240
1246
|
.split("-")
|
|
1241
1247
|
.map((s) => s[0].toUpperCase() + s.slice(1))
|
|
1242
1248
|
.join(" ");
|
|
1243
|
-
|
|
1249
|
+
const version = geminiVersioned[1].replace(/-/g, ".");
|
|
1250
|
+
return `Gemini ${version} ${variant}`.replace("Flash Lite", "Flash-Lite");
|
|
1244
1251
|
}
|
|
1245
1252
|
// Gemini: gemini-{version.parts}[-preview] → Gemini Version Parts
|
|
1246
|
-
const gemini =
|
|
1253
|
+
const gemini = normalizedModel.match(/^gemini-(.+?)(?:-preview)?$/);
|
|
1247
1254
|
if (gemini) {
|
|
1248
1255
|
const parts = gemini[1]
|
|
1249
1256
|
.split("-")
|
|
@@ -1258,7 +1265,20 @@ export function compactComposerModelName(
|
|
|
1258
1265
|
model: string,
|
|
1259
1266
|
t?: ComposerTranslate,
|
|
1260
1267
|
): string {
|
|
1261
|
-
|
|
1268
|
+
const fullName = friendlyModelName(model, t);
|
|
1269
|
+
if (model === "auto" || LOCAL_RUNTIME_ENGINES.has(model)) return fullName;
|
|
1270
|
+
const shortName = fullName
|
|
1271
|
+
.replace(/^GPT-\d+(?:\.\d+)?\s*/i, "")
|
|
1272
|
+
.replace(/^Gemini\s+\d+(?:\.\d+)?\s*/i, "")
|
|
1273
|
+
.replace(/^Claude\s+/i, "")
|
|
1274
|
+
.replace(/^Qwen\s*\d*(?:\.\d+)?\s*/i, "")
|
|
1275
|
+
.replace(/^DeepSeek\s+v?\d+(?:\.\d+)?\s*/i, "")
|
|
1276
|
+
.replace(/^Z-AI\s*/i, "")
|
|
1277
|
+
.replace(/^Grok\s*/i, "")
|
|
1278
|
+
.replace(/\s+[a-z]*\d+(?:\.\d+)*$/i, "")
|
|
1279
|
+
.trim();
|
|
1280
|
+
if (shortName) return shortName;
|
|
1281
|
+
return /^deepseek-/i.test(model) ? "DeepSeek" : fullName;
|
|
1262
1282
|
}
|
|
1263
1283
|
|
|
1264
1284
|
export function compactComposerReasoningEffortLabel(
|
|
@@ -1316,32 +1336,63 @@ function localizedReasoningEffortLabel(
|
|
|
1316
1336
|
}
|
|
1317
1337
|
}
|
|
1318
1338
|
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1339
|
+
function versionedModelFamily(
|
|
1340
|
+
model: string,
|
|
1341
|
+
): { family: string; version: number[] } | undefined {
|
|
1342
|
+
const id = model.replace(/^(?:anthropic|openai|google)\//i, "");
|
|
1343
|
+
const claude = id.match(
|
|
1344
|
+
/^claude-(opus|sonnet|haiku|fable)-(\d+)(?:[-.](\d+))?/,
|
|
1345
|
+
);
|
|
1346
|
+
if (claude) {
|
|
1347
|
+
return {
|
|
1348
|
+
family: `claude-${claude[1]}`,
|
|
1349
|
+
version: [Number(claude[2]), Number(claude[3] ?? 0)],
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
const gpt = id.match(/^gpt-(\d+)(?:[.-](\d+))?(?:[.-](.+))?$/);
|
|
1353
|
+
if (gpt?.[3]) {
|
|
1354
|
+
return {
|
|
1355
|
+
family: `gpt-${gpt[3]}`,
|
|
1356
|
+
version: [Number(gpt[1]), Number(gpt[2] ?? 0)],
|
|
1357
|
+
};
|
|
1358
|
+
}
|
|
1359
|
+
const gemini = id.match(/^gemini-(\d+)(?:[.-](\d+))?-(.+?)(?:-preview)?$/);
|
|
1360
|
+
if (gemini) {
|
|
1361
|
+
return {
|
|
1362
|
+
family: `gemini-${gemini[3]}`,
|
|
1363
|
+
version: [Number(gemini[1]), Number(gemini[2] ?? 0)],
|
|
1364
|
+
};
|
|
1365
|
+
}
|
|
1366
|
+
return undefined;
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
function compareModelVersions(
|
|
1370
|
+
left: readonly number[],
|
|
1371
|
+
right: readonly number[],
|
|
1372
|
+
) {
|
|
1373
|
+
for (let i = 0; i < Math.max(left.length, right.length); i += 1) {
|
|
1374
|
+
const difference = (left[i] ?? 0) - (right[i] ?? 0);
|
|
1375
|
+
if (difference !== 0) return difference;
|
|
1376
|
+
}
|
|
1377
|
+
return 0;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
/** Keep the newest version of each Claude, Gemini, and GPT tier. */
|
|
1323
1381
|
function latestModelsOnly(models: readonly string[]): string[] {
|
|
1324
|
-
const
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
// OpenAI effort: each is its own family
|
|
1335
|
-
// Gemini: family = gemini-{major} + variant
|
|
1336
|
-
const gemini = m.match(/^gemini-(\d+(?:\.\d+)?)-(.+?)(?:-preview)?$/);
|
|
1337
|
-
if (gemini) {
|
|
1338
|
-
const family = gemini[2]; // flash, pro, etc.
|
|
1339
|
-
if (seen.has(`gemini-${family}`)) return false;
|
|
1340
|
-
seen.add(`gemini-${family}`);
|
|
1341
|
-
return true;
|
|
1382
|
+
const latest = new Map<string, { id: string; version: number[] }>();
|
|
1383
|
+
for (const id of models) {
|
|
1384
|
+
const candidate = versionedModelFamily(id);
|
|
1385
|
+
if (!candidate) continue;
|
|
1386
|
+
const current = latest.get(candidate.family);
|
|
1387
|
+
if (
|
|
1388
|
+
!current ||
|
|
1389
|
+
compareModelVersions(candidate.version, current.version) > 0
|
|
1390
|
+
) {
|
|
1391
|
+
latest.set(candidate.family, { id, version: candidate.version });
|
|
1342
1392
|
}
|
|
1343
|
-
|
|
1344
|
-
});
|
|
1393
|
+
}
|
|
1394
|
+
const latestIds = new Set([...latest.values()].map(({ id }) => id));
|
|
1395
|
+
return models.filter((id) => !versionedModelFamily(id) || latestIds.has(id));
|
|
1345
1396
|
}
|
|
1346
1397
|
|
|
1347
1398
|
/**
|
|
@@ -1636,7 +1687,7 @@ function ModelSelector({
|
|
|
1636
1687
|
const selectedModelName = selectedModelNeedsConnection
|
|
1637
1688
|
? t("agentChat.composer.connectKeys", { defaultValue: "Connect keys" })
|
|
1638
1689
|
: friendlyModelName(model, t);
|
|
1639
|
-
const selectedModelLabel = selectedModelName
|
|
1690
|
+
const selectedModelLabel = selectedModelName;
|
|
1640
1691
|
const selectedModelButtonLabel = selectedModelNeedsConnection
|
|
1641
1692
|
? selectedModelLabel
|
|
1642
1693
|
: compactComposerModelName(model, t);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { ResourceIcon } from "./ResourceIcon.js";
|
|
5
|
+
|
|
6
|
+
describe("ResourceIcon", () => {
|
|
7
|
+
it("preserves a complete emoji grapheme and accessible label", () => {
|
|
8
|
+
const markup = renderToStaticMarkup(
|
|
9
|
+
<ResourceIcon
|
|
10
|
+
value={{ version: 1, kind: "emoji", emoji: "👩🏽💻" }}
|
|
11
|
+
label="Developer"
|
|
12
|
+
/>,
|
|
13
|
+
);
|
|
14
|
+
expect(markup).toContain("👩🏽💻");
|
|
15
|
+
expect(markup).toContain('aria-label="Developer"');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("renders images only through a caller-provided resolver", () => {
|
|
19
|
+
const value = {
|
|
20
|
+
version: 1,
|
|
21
|
+
kind: "image",
|
|
22
|
+
assetId: "asset_123",
|
|
23
|
+
authority: "workspace:example",
|
|
24
|
+
alt: "Team logo",
|
|
25
|
+
} as const;
|
|
26
|
+
expect(
|
|
27
|
+
renderToStaticMarkup(<ResourceIcon value={value} fallback="missing" />),
|
|
28
|
+
).toBe("missing");
|
|
29
|
+
expect(
|
|
30
|
+
renderToStaticMarkup(
|
|
31
|
+
<ResourceIcon
|
|
32
|
+
value={value}
|
|
33
|
+
resolveImageUrl={() => "/icons/asset_123"}
|
|
34
|
+
/>,
|
|
35
|
+
),
|
|
36
|
+
).toContain('src="/icons/asset_123"');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { cn } from "../utils.js";
|
|
4
|
+
import { loadTablerIcon, type TablerIconComponent } from "./catalog.js";
|
|
5
|
+
import { resourceIconColorClasses } from "./icon-colors.js";
|
|
6
|
+
import type { ResourceIconValue } from "./types.js";
|
|
7
|
+
|
|
8
|
+
export interface ResourceIconProps {
|
|
9
|
+
value: ResourceIconValue | null | undefined;
|
|
10
|
+
size?: number | string;
|
|
11
|
+
fallback?: React.ReactNode;
|
|
12
|
+
label?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
resolveImageUrl?: (
|
|
15
|
+
image: Extract<ResourceIconValue, { kind: "image" }>,
|
|
16
|
+
) => string | undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function ResourceIcon({
|
|
20
|
+
value,
|
|
21
|
+
size = 20,
|
|
22
|
+
fallback = null,
|
|
23
|
+
label,
|
|
24
|
+
className,
|
|
25
|
+
resolveImageUrl,
|
|
26
|
+
}: ResourceIconProps) {
|
|
27
|
+
const [LibraryIcon, setLibraryIcon] =
|
|
28
|
+
React.useState<TablerIconComponent | null>(null);
|
|
29
|
+
|
|
30
|
+
React.useEffect(() => {
|
|
31
|
+
let active = true;
|
|
32
|
+
setLibraryIcon(null);
|
|
33
|
+
if (value?.kind === "library") {
|
|
34
|
+
const catalogName =
|
|
35
|
+
value.variant === "filled" ? `${value.name}-filled` : value.name;
|
|
36
|
+
void loadTablerIcon(catalogName).then((component) => {
|
|
37
|
+
if (active) setLibraryIcon(() => component);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return () => {
|
|
41
|
+
active = false;
|
|
42
|
+
};
|
|
43
|
+
}, [
|
|
44
|
+
value?.kind === "library" ? value.name : undefined,
|
|
45
|
+
value?.kind === "library" ? value.variant : undefined,
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
const accessibility = label
|
|
49
|
+
? { role: "img", "aria-label": label }
|
|
50
|
+
: { "aria-hidden": true as const };
|
|
51
|
+
|
|
52
|
+
if (!value) return fallback;
|
|
53
|
+
if (value.kind === "emoji") {
|
|
54
|
+
return (
|
|
55
|
+
<span
|
|
56
|
+
{...accessibility}
|
|
57
|
+
className={cn(
|
|
58
|
+
"inline-flex shrink-0 items-center justify-center",
|
|
59
|
+
className,
|
|
60
|
+
)}
|
|
61
|
+
style={{ fontSize: size, lineHeight: 1 }}
|
|
62
|
+
>
|
|
63
|
+
{value.emoji}
|
|
64
|
+
</span>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
if (value.kind === "image") {
|
|
68
|
+
const src = resolveImageUrl?.(value);
|
|
69
|
+
if (!src) return fallback;
|
|
70
|
+
return (
|
|
71
|
+
<img
|
|
72
|
+
src={src}
|
|
73
|
+
alt={label ?? value.alt ?? ""}
|
|
74
|
+
className={cn("inline-block shrink-0 object-contain", className)}
|
|
75
|
+
style={{ width: size, height: size }}
|
|
76
|
+
/>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (!LibraryIcon) return fallback;
|
|
80
|
+
return (
|
|
81
|
+
<LibraryIcon
|
|
82
|
+
{...accessibility}
|
|
83
|
+
size={size}
|
|
84
|
+
stroke={2}
|
|
85
|
+
className={cn(
|
|
86
|
+
value.color && resourceIconColorClasses[value.color],
|
|
87
|
+
className,
|
|
88
|
+
)}
|
|
89
|
+
/>
|
|
90
|
+
);
|
|
91
|
+
}
|