@chrysb/alphaclaw 0.9.20 → 0.9.21

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.
@@ -13,13 +13,15 @@ import {
13
13
  buildSyntheticModelEntry,
14
14
  getModelCatalogProvider,
15
15
  getModelsTabAuthProvider,
16
+ getModelsTabRequiredAuthProviders,
17
+ getProviderAuthDisplayOrder,
16
18
  getProviderSortIndex,
17
19
  SearchableModelPicker,
18
20
  } from "./model-picker.js";
19
21
  import { ProviderAuthCard } from "./provider-auth-card.js";
20
22
  import {
21
23
  getFeaturedModels,
22
- kProviderOrder,
24
+ withAlwaysAvailableModels,
23
25
  } from "../../lib/model-config.js";
24
26
 
25
27
  const html = htm.bind(h);
@@ -27,19 +29,13 @@ const html = htm.bind(h);
27
29
  const deriveRequiredProviders = (configuredModels) => {
28
30
  const providers = new Set();
29
31
  for (const modelKey of Object.keys(configuredModels)) {
30
- const provider = getModelsTabAuthProvider(modelKey);
31
- if (provider) providers.add(provider);
32
+ for (const provider of getModelsTabRequiredAuthProviders(modelKey)) {
33
+ providers.add(provider);
34
+ }
32
35
  }
33
36
  return [...providers];
34
37
  };
35
38
 
36
- const kProviderDisplayOrder = [
37
- "anthropic",
38
- "openai",
39
- "openai-codex",
40
- ...kProviderOrder.filter((provider) => !["anthropic", "openai"].includes(provider)),
41
- ];
42
-
43
39
  export const Models = ({ onRestartRequired = () => {}, agentId, embedded = false }) => {
44
40
  const {
45
41
  catalog,
@@ -70,14 +66,22 @@ export const Models = ({ onRestartRequired = () => {}, agentId, embedded = false
70
66
  [configuredModels],
71
67
  );
72
68
 
73
- const featuredModels = useMemo(() => getFeaturedModels(catalog), [catalog]);
69
+ const selectableCatalog = useMemo(
70
+ () => withAlwaysAvailableModels(catalog),
71
+ [catalog],
72
+ );
73
+
74
+ const featuredModels = useMemo(
75
+ () => getFeaturedModels(selectableCatalog),
76
+ [selectableCatalog],
77
+ );
74
78
  const popularPickerModels = useMemo(
75
79
  () => featuredModels.filter((model) => !configuredKeys.has(model.key)),
76
80
  [featuredModels, configuredKeys],
77
81
  );
78
82
 
79
83
  const pickerModels = useMemo(() => {
80
- return [...catalog]
84
+ return [...selectableCatalog]
81
85
  .filter((model) => !configuredKeys.has(model.key))
82
86
  .sort((a, b) => {
83
87
  const providerCompare =
@@ -86,7 +90,7 @@ export const Models = ({ onRestartRequired = () => {}, agentId, embedded = false
86
90
  if (providerCompare !== 0) return providerCompare;
87
91
  return String(a.label || a.key).localeCompare(String(b.label || b.key));
88
92
  });
89
- }, [catalog, configuredKeys]);
93
+ }, [selectableCatalog, configuredKeys]);
90
94
 
91
95
  const requiredProviders = useMemo(
92
96
  () => deriveRequiredProviders(configuredModels),
@@ -94,14 +98,7 @@ export const Models = ({ onRestartRequired = () => {}, agentId, embedded = false
94
98
  );
95
99
 
96
100
  const sortedProviders = useMemo(() => {
97
- const ordered = [];
98
- for (const p of kProviderDisplayOrder) {
99
- if (requiredProviders.includes(p)) ordered.push(p);
100
- }
101
- for (const p of requiredProviders) {
102
- if (!ordered.includes(p)) ordered.push(p);
103
- }
104
- return ordered;
101
+ return getProviderAuthDisplayOrder(requiredProviders);
105
102
  }, [requiredProviders]);
106
103
 
107
104
  const providerHasAuth = useMemo(
@@ -19,10 +19,30 @@ const kProviderDisplayOrder = [
19
19
 
20
20
  export const getModelsTabAuthProvider = (modelKey) => {
21
21
  const provider = getModelProvider(modelKey);
22
- if (provider === "openai-codex") return "openai-codex";
22
+ if (provider === "openai" || provider === "openai-codex") {
23
+ return "openai-codex";
24
+ }
23
25
  return getAuthProviderFromModelProvider(provider);
24
26
  };
25
27
 
28
+ export const getModelsTabRequiredAuthProviders = (modelKey) => {
29
+ const provider = getModelProvider(modelKey);
30
+ if (provider === "openai" || provider === "openai-codex") {
31
+ return ["openai", "openai-codex"];
32
+ }
33
+ const authProvider = getAuthProviderFromModelProvider(provider);
34
+ return authProvider ? [authProvider] : [];
35
+ };
36
+
37
+ export const getProviderAuthDisplayOrder = (requiredProviders = []) => {
38
+ const required = new Set(["openai-codex", ...requiredProviders]);
39
+ const ordered = kProviderDisplayOrder.filter((provider) => required.has(provider));
40
+ for (const provider of required) {
41
+ if (!ordered.includes(provider)) ordered.push(provider);
42
+ }
43
+ return ordered;
44
+ };
45
+
26
46
  export const getModelCatalogProvider = (model) =>
27
47
  String(model?.provider || getModelProvider(model?.key)).trim();
28
48
 
@@ -88,6 +108,9 @@ export const buildProviderHasAuth = ({
88
108
  if (codexStatus?.connected) {
89
109
  result["openai-codex"] = true;
90
110
  }
111
+ if (result.openai) {
112
+ result["openai-codex"] = true;
113
+ }
91
114
  return result;
92
115
  };
93
116
 
@@ -27,11 +27,14 @@ export const kFeaturedModelDefs = [
27
27
  },
28
28
  {
29
29
  label: "Codex 5.3",
30
- preferredKeys: ["openai-codex/gpt-5.3-codex"],
30
+ preferredKeys: [
31
+ "openai/gpt-5.3-codex",
32
+ "openai-codex/gpt-5.3-codex",
33
+ ],
31
34
  },
32
35
  {
33
36
  label: "GPT-5.5",
34
- preferredKeys: ["openai-codex/gpt-5.5"],
37
+ preferredKeys: ["openai/gpt-5.5", "openai-codex/gpt-5.5"],
35
38
  },
36
39
  {
37
40
  label: "Gemini 3.1 Pro",
@@ -39,6 +42,23 @@ export const kFeaturedModelDefs = [
39
42
  },
40
43
  ];
41
44
 
45
+ export const kAlwaysAvailableModelDefs = [
46
+ {
47
+ key: "openai/gpt-5.5",
48
+ provider: "openai",
49
+ label: "GPT-5.5",
50
+ },
51
+ ];
52
+
53
+ export const withAlwaysAvailableModels = (models = []) => {
54
+ const merged = [...models];
55
+ const keys = new Set(merged.map((model) => model?.key));
56
+ for (const model of kAlwaysAvailableModelDefs) {
57
+ if (!keys.has(model.key)) merged.push(model);
58
+ }
59
+ return merged;
60
+ };
61
+
42
62
  export const getFeaturedModels = (allModels) => {
43
63
  const picked = [];
44
64
  const used = new Set();
@@ -173,13 +173,13 @@ const kMinimalFallbackOnboardingModels = [
173
173
  label: "Claude Haiku 4.6",
174
174
  },
175
175
  {
176
- key: "openai-codex/gpt-5.5",
177
- provider: "openai-codex",
176
+ key: "openai/gpt-5.5",
177
+ provider: "openai",
178
178
  label: "GPT-5.5",
179
179
  },
180
180
  {
181
- key: "openai-codex/gpt-5.3-codex",
182
- provider: "openai-codex",
181
+ key: "openai/gpt-5.3-codex",
182
+ provider: "openai",
183
183
  label: "Codex GPT-5.3",
184
184
  },
185
185
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrysb/alphaclaw",
3
- "version": "0.9.20",
3
+ "version": "0.9.21",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },