@sellable/mcp 0.1.312 → 0.1.313

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
@@ -97,8 +97,11 @@ startup/auth update check and tells the agent to run
97
97
  installed runtime is behind npm.
98
98
 
99
99
  For CI/scripted installs, set `SELLABLE_TOKEN` and `SELLABLE_WORKSPACE_ID`
100
- before running the installer. Direct `npx -y @sellable/install@latest --host all`
101
- is a fallback only when Node/npm/npx are already known-good.
100
+ before running the curl installer. The public path remains:
101
+
102
+ ```bash
103
+ curl -fsSL "https://app.sellable.dev/api/v2/cli/install" | sh
104
+ ```
102
105
 
103
106
  ### Publishing `@sellable/mcp`
104
107
 
@@ -14,6 +14,7 @@ export type CampaignModelQualityResult = {
14
14
  recommendedReasoningEffort: string;
15
15
  minimumSummary: string;
16
16
  confirmationRequired: boolean;
17
+ metadataStale: boolean;
17
18
  message: string;
18
19
  };
19
20
  export type CampaignModelQualityHostConfig = {
@@ -33,6 +34,7 @@ export type CampaignModelQualityConfig = {
33
34
  };
34
35
  warningCopy: {
35
36
  ok: string;
37
+ staleCodexMetadata: string;
36
38
  unknownSettings: string;
37
39
  belowMinimum: string;
38
40
  };
@@ -37,6 +37,7 @@ const DEFAULT_MODEL_QUALITY_CONFIG = {
37
37
  },
38
38
  warningCopy: {
39
39
  ok: "Campaign model settings meet the configured minimum: {minimumSummary}.",
40
+ staleCodexMetadata: "Codex host metadata appears stale: it can report GPT-5/default or GPT-5/high even when the UI is set to GPT 5.5 Extra High. Treating this as acceptable; continue without asking the user to switch.",
40
41
  unknownSettings: "Model settings were not provided by the host. Best campaigns need at least {minimumSummary}. Confirm the user is on one of those settings, or ask them to switch before continuing.",
41
42
  belowMinimum: "Best campaigns need at least {minimumSummary}. Current settings look below that: {currentSettings}. Please switch before continuing, or explicitly say to continue anyway.",
42
43
  },
@@ -146,6 +147,22 @@ function findAcceptedHostConfig(host, model, config) {
146
147
  : [[host, config.hosts[host]]];
147
148
  return candidates.find(([, hostConfig]) => modelMeetsMinimum(model, hostConfig));
148
149
  }
150
+ function looksLikeCodexStaleMetadata(host, model, reasoningEffort, config) {
151
+ if (host !== "codex")
152
+ return false;
153
+ if (!model || !reasoningEffort)
154
+ return false;
155
+ const normalizedModel = normalize(model).replace(/[_-]+/g, " ");
156
+ const normalizedReasoning = normalizeReasoning(reasoningEffort);
157
+ if (!normalizedModel.includes("gpt"))
158
+ return false;
159
+ const versions = extractModelVersions(normalizedModel);
160
+ const looksLikeBaseGpt5 = versions.some((version) => version === "5" || version === "5.0");
161
+ if (!looksLikeBaseGpt5)
162
+ return false;
163
+ return (["default", "auto", "standard"].includes(normalizedReasoning) ||
164
+ acceptsReasoning(reasoningEffort, config.hosts.codex));
165
+ }
149
166
  export function evaluateCampaignModelQuality(input = {}) {
150
167
  const config = getCampaignModelQualityConfig();
151
168
  const host = normalizeHost([input.host, input.model].filter(Boolean).join(" "));
@@ -166,6 +183,7 @@ export function evaluateCampaignModelQuality(input = {}) {
166
183
  recommendedReasoningEffort,
167
184
  minimumSummary,
168
185
  confirmationRequired: true,
186
+ metadataStale: false,
169
187
  message: formatCopy(config.warningCopy.unknownSettings, {
170
188
  minimumSummary,
171
189
  currentSettings: "unknown",
@@ -185,12 +203,30 @@ export function evaluateCampaignModelQuality(input = {}) {
185
203
  recommendedReasoningEffort,
186
204
  minimumSummary,
187
205
  confirmationRequired: false,
206
+ metadataStale: false,
188
207
  message: formatCopy(config.warningCopy.ok, {
189
208
  minimumSummary,
190
209
  currentSettings: "current settings",
191
210
  }),
192
211
  };
193
212
  }
213
+ if (looksLikeCodexStaleMetadata(host, model, reasoningEffort, config)) {
214
+ return {
215
+ status: "ok",
216
+ host,
217
+ model,
218
+ reasoningEffort,
219
+ recommendedModel,
220
+ recommendedReasoningEffort,
221
+ minimumSummary,
222
+ confirmationRequired: false,
223
+ metadataStale: true,
224
+ message: formatCopy(config.warningCopy.staleCodexMetadata, {
225
+ minimumSummary,
226
+ currentSettings: "stale Codex host metadata",
227
+ }),
228
+ };
229
+ }
194
230
  const currentSettings = [
195
231
  model ? `model "${model}"` : "unknown model",
196
232
  reasoningEffort ? `reasoning "${reasoningEffort}"` : "unknown reasoning",
@@ -204,6 +240,7 @@ export function evaluateCampaignModelQuality(input = {}) {
204
240
  recommendedReasoningEffort,
205
241
  minimumSummary,
206
242
  confirmationRequired: true,
243
+ metadataStale: false,
207
244
  message: formatCopy(config.warningCopy.belowMinimum, {
208
245
  minimumSummary,
209
246
  currentSettings,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.312",
3
+ "version": "0.1.313",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -179,11 +179,17 @@ person/company this campaign is for, then I’ll turn that into a campaign brief
179
179
  before we move into lead sourcing.
180
180
  ```
181
181
 
182
- Exception: if `bootstrap_create_campaign.modelQuality.status === "warn"`,
183
- the first visible campaign message must be the model-quality warning from
182
+ Exception: if `bootstrap_create_campaign.modelQuality.status === "warn"` and
183
+ `bootstrap_create_campaign.modelQuality.metadataStale !== true`, the first
184
+ visible campaign message must be the model-quality warning from
184
185
  `modelQuality.message`. Ask the user to switch to the configured minimum model
185
186
  or explicitly continue anyway before identity setup, research, lead filtering,
186
- message generation, or launch review.
187
+ message generation, or launch review. If `metadataStale === true`, continue
188
+ normally and do not ask the user to switch.
189
+
190
+ If `bootstrap_create_campaign.modelQuality.metadataStale === true`, continue
191
+ normally. Do not ask the user to switch models; this is an accepted Codex host
192
+ metadata mismatch.
187
193
 
188
194
  If a linked/local skill file is stale or missing, silently use the installed
189
195
  `sellable@sellable` plugin copy. Do not tell the user about the stale link,
@@ -935,8 +941,10 @@ updates.
935
941
  6. Call `mcp__sellable__bootstrap_create_campaign({ flowVersion: "v2", campaignId?, host?, model?, reasoningEffort? })`.
936
942
  Pass the current host, model, and reasoning when the host exposes them.
937
943
  7. If `safeToProceed !== true`, stop and show `blockingErrors` + `nextStep`.
938
- 8. If `modelQuality.status === "warn"`, show `modelQuality.message` before any
939
- setup/research and wait for the user to switch or explicitly continue.
944
+ 8. If `modelQuality.status === "warn"` and `modelQuality.metadataStale !== true`,
945
+ show `modelQuality.message` before any setup/research and wait for the user
946
+ to switch or explicitly continue. If `metadataStale === true`, continue
947
+ normally and do not tell the user to switch.
940
948
 
941
949
  ## Execute Workflow
942
950
 
@@ -22,6 +22,7 @@
22
22
  },
23
23
  "warningCopy": {
24
24
  "ok": "Campaign model settings meet the configured minimum: {minimumSummary}.",
25
+ "staleCodexMetadata": "Codex host metadata appears stale: it can report GPT-5/default or GPT-5/high even when the UI is set to GPT 5.5 Extra High. Treating this as acceptable; continue without asking the user to switch.",
25
26
  "unknownSettings": "Model settings were not provided by the host. Best campaigns need at least {minimumSummary}. Confirm the user is on one of those settings, or ask them to switch before continuing.",
26
27
  "belowMinimum": "Best campaigns need at least {minimumSummary}. Current settings look below that: {currentSettings}. Please switch before continuing, or explicitly say to continue anyway."
27
28
  }