@aiden-ade/sandbox-agent 0.1.39 → 0.1.41

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.
Files changed (2) hide show
  1. package/dist/index.cjs +196 -105
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -14590,9 +14590,9 @@ function getAlanAgentPrompt(agentId) {
14590
14590
  return getAgentSystemPrompt(agentId);
14591
14591
  }
14592
14592
 
14593
- // ../shared/dist/types/frontend.js
14593
+ // ../shared/dist/effort.js
14594
14594
  var EFFORT_LEVELS = ["minimal", "low", "medium", "high", "xhigh", "max", "ultra"];
14595
- var CLAUDE_48_EFFORT_LEVELS = [
14595
+ var CLAUDE_EFFORT_LEVELS = [
14596
14596
  "minimal",
14597
14597
  "low",
14598
14598
  "medium",
@@ -14600,20 +14600,144 @@ var CLAUDE_48_EFFORT_LEVELS = [
14600
14600
  "xhigh",
14601
14601
  "max"
14602
14602
  ];
14603
- var CLAUDE_5_EFFORT_LEVELS = [
14603
+ var CODEX_5X_EFFORT_LEVELS = ["low", "medium", "high", "xhigh"];
14604
+ var GPT_5_5_EFFORT_LEVELS = [
14604
14605
  "minimal",
14606
+ "low",
14607
+ "medium",
14608
+ "high",
14609
+ "xhigh"
14610
+ ];
14611
+ var GPT_5_4_EFFORT_LEVELS = ["low", "medium", "high"];
14612
+ var GPT_5_6_EFFORT_LEVELS = [
14605
14613
  "low",
14606
14614
  "medium",
14607
14615
  "high",
14608
14616
  "xhigh",
14609
14617
  "max"
14610
14618
  ];
14611
- var CODEX_5X_EFFORT_LEVELS = [
14619
+ var GPT_5_6_ULTRA_EFFORT_LEVELS = [
14612
14620
  "low",
14613
14621
  "medium",
14614
14622
  "high",
14615
- "xhigh"
14623
+ "xhigh",
14624
+ "max",
14625
+ "ultra"
14626
+ ];
14627
+ var ATOMIC_MODEL_IDS = /* @__PURE__ */ new Set([
14628
+ "gpt-5.1-codex-max",
14629
+ "opencode/gpt-5.1-codex-max"
14630
+ ]);
14631
+ var EFFORT_SUFFIXES = [
14632
+ { suffix: "-extra-high", level: "xhigh" },
14633
+ { suffix: "-xhigh", level: "xhigh" },
14634
+ { suffix: "-ultra", level: "ultra" },
14635
+ { suffix: "-max", level: "max" },
14636
+ { suffix: "-high", level: "high" },
14637
+ { suffix: "-medium", level: "medium" },
14638
+ { suffix: "-low", level: "low" },
14639
+ { suffix: "-none", level: "minimal" },
14640
+ { suffix: "-minimal", level: "minimal" }
14616
14641
  ];
14642
+ function isAtomicModelId(modelId) {
14643
+ return ATOMIC_MODEL_IDS.has(modelId.trim());
14644
+ }
14645
+ function isEffortLevel(value2) {
14646
+ return EFFORT_LEVELS.includes(value2);
14647
+ }
14648
+ var EFFORT_RANK = {
14649
+ minimal: 0,
14650
+ low: 1,
14651
+ medium: 2,
14652
+ high: 3,
14653
+ xhigh: 4,
14654
+ max: 5,
14655
+ ultra: 6
14656
+ };
14657
+ function clampEffortToSupported(requested, allowed) {
14658
+ if (!requested?.trim() || allowed.length === 0)
14659
+ return null;
14660
+ const normalized = requested.trim().toLowerCase();
14661
+ if (!isEffortLevel(normalized))
14662
+ return null;
14663
+ if (allowed.includes(normalized))
14664
+ return normalized;
14665
+ const targetRank = EFFORT_RANK[normalized];
14666
+ let best = null;
14667
+ for (const level of allowed) {
14668
+ if (EFFORT_RANK[level] <= targetRank) {
14669
+ if (!best || EFFORT_RANK[level] > EFFORT_RANK[best])
14670
+ best = level;
14671
+ }
14672
+ }
14673
+ return best ?? allowed[0] ?? null;
14674
+ }
14675
+ function inferEffortLevelsForModel(harness, modelId) {
14676
+ const id = collapseModelIdToBase(modelId);
14677
+ if (harness === "claude_cli" || id.startsWith("claude-") || id === "sonnet" || id === "opus") {
14678
+ if (id === "haiku" || id.startsWith("claude-haiku-"))
14679
+ return [];
14680
+ return CLAUDE_EFFORT_LEVELS;
14681
+ }
14682
+ if (id === "gpt-5.5")
14683
+ return GPT_5_5_EFFORT_LEVELS;
14684
+ if (id === "gpt-5.4" || id === "gpt-5.4-mini")
14685
+ return GPT_5_4_EFFORT_LEVELS;
14686
+ if (/^gpt-5\.6-/.test(id)) {
14687
+ const hasUltra = id.includes("-sol") || id.includes("-terra");
14688
+ return hasUltra ? GPT_5_6_ULTRA_EFFORT_LEVELS : GPT_5_6_EFFORT_LEVELS;
14689
+ }
14690
+ if (id.includes("codex") || /^gpt-5\.[0-3]/.test(id))
14691
+ return CODEX_5X_EFFORT_LEVELS;
14692
+ return [];
14693
+ }
14694
+ function resolveWireEffort(input) {
14695
+ const allowed = input.effortLevels && input.effortLevels.length > 0 ? input.effortLevels : inferEffortLevelsForModel(input.harness, input.modelId);
14696
+ const clamped = clampEffortToSupported(input.selectedEffortLevel, allowed);
14697
+ if (!clamped)
14698
+ return null;
14699
+ if (input.harness === "cursor_agent_cli" && clamped === "minimal")
14700
+ return "none";
14701
+ if (input.harness === "claude_cli" && clamped === "minimal")
14702
+ return "low";
14703
+ return clamped;
14704
+ }
14705
+ function parseModelEffortSuffix(modelId) {
14706
+ const trimmed = modelId.trim();
14707
+ if (!trimmed)
14708
+ return { baseId: "", effort: null, fast: false };
14709
+ if (isAtomicModelId(trimmed)) {
14710
+ return { baseId: trimmed, effort: null, fast: false };
14711
+ }
14712
+ let id = trimmed;
14713
+ let fast = false;
14714
+ if (id.endsWith("-fast")) {
14715
+ const withoutFast = id.slice(0, -"-fast".length);
14716
+ if (isAtomicModelId(withoutFast)) {
14717
+ return { baseId: withoutFast, effort: null, fast: true };
14718
+ }
14719
+ fast = true;
14720
+ id = withoutFast;
14721
+ }
14722
+ if (isAtomicModelId(id)) {
14723
+ return { baseId: id, effort: null, fast };
14724
+ }
14725
+ for (const { suffix, level } of EFFORT_SUFFIXES) {
14726
+ if (id.endsWith(suffix)) {
14727
+ return { baseId: id.slice(0, -suffix.length), effort: level, fast };
14728
+ }
14729
+ }
14730
+ return { baseId: id, effort: null, fast };
14731
+ }
14732
+ function collapseModelIdToBase(modelId) {
14733
+ const parsed = parseModelEffortSuffix(modelId);
14734
+ if (parsed.fast && !parsed.effort)
14735
+ return modelId.trim();
14736
+ return parsed.baseId;
14737
+ }
14738
+
14739
+ // ../shared/dist/types/frontend.js
14740
+ var CLAUDE_5_EFFORT_LEVELS = CLAUDE_EFFORT_LEVELS;
14617
14741
  var AVAILABLE_MODELS = [
14618
14742
  {
14619
14743
  id: "",
@@ -14628,7 +14752,7 @@ var AVAILABLE_MODELS = [
14628
14752
  {
14629
14753
  id: "claude-opus-4-8",
14630
14754
  name: "Opus 4.8",
14631
- capabilities: { contextWindows: ["200k", "1m"], effortLevels: CLAUDE_48_EFFORT_LEVELS }
14755
+ capabilities: { contextWindows: ["200k", "1m"], effortLevels: CLAUDE_5_EFFORT_LEVELS }
14632
14756
  },
14633
14757
  {
14634
14758
  id: "claude-haiku-4-5",
@@ -14867,51 +14991,8 @@ function findModelDef(providerKind, modelId) {
14867
14991
  }
14868
14992
 
14869
14993
  // ../shared/dist/cursor-agent-models.js
14870
- var CLAUDE_5_EFFORT_LEVELS2 = [
14871
- "minimal",
14872
- "low",
14873
- "medium",
14874
- "high",
14875
- "xhigh",
14876
- "max"
14877
- ];
14878
- var CODEX_5X_EFFORT_LEVELS2 = ["low", "medium", "high", "xhigh"];
14879
- var GPT_5_5_EFFORT_LEVELS = ["minimal", "low", "medium", "high", "xhigh"];
14880
- var GPT_5_4_EFFORT_LEVELS = ["low", "medium", "high"];
14881
- var GPT_5_6_EFFORT_LEVELS = [
14882
- "low",
14883
- "medium",
14884
- "high",
14885
- "xhigh",
14886
- "max",
14887
- "ultra"
14888
- ];
14889
- var CURSOR_EFFORT_SUFFIXES = [
14890
- { suffix: "-extra-high", level: "xhigh" },
14891
- { suffix: "-xhigh", level: "xhigh" },
14892
- { suffix: "-ultra", level: "ultra" },
14893
- { suffix: "-max", level: "max" },
14894
- { suffix: "-high", level: "high" },
14895
- { suffix: "-medium", level: "medium" },
14896
- { suffix: "-low", level: "low" },
14897
- { suffix: "-none", level: "minimal" }
14898
- ];
14899
- function parseCursorModelId(modelId) {
14900
- let id = modelId.trim();
14901
- let fast = false;
14902
- if (id.endsWith("-fast")) {
14903
- fast = true;
14904
- id = id.slice(0, -"-fast".length);
14905
- }
14906
- for (const { suffix, level } of CURSOR_EFFORT_SUFFIXES) {
14907
- if (id.endsWith(suffix)) {
14908
- return { baseId: id.slice(0, -suffix.length), effort: level, fast };
14909
- }
14910
- }
14911
- return { baseId: id, effort: null, fast };
14912
- }
14913
14994
  function getCursorModelCollapseKey(modelId) {
14914
- const parsed = parseCursorModelId(modelId);
14995
+ const parsed = parseModelEffortSuffix(modelId);
14915
14996
  if (parsed.fast && !parsed.effort)
14916
14997
  return modelId.trim();
14917
14998
  return parsed.baseId;
@@ -15017,11 +15098,11 @@ function inferSlugModelCapabilities(providerKind, modelId) {
15017
15098
  const hasUltra = id.includes("-sol") || id.includes("-terra");
15018
15099
  return {
15019
15100
  contextWindows: [],
15020
- effortLevels: hasUltra ? GPT_5_6_EFFORT_LEVELS : GPT_5_6_EFFORT_LEVELS.filter((level) => level !== "ultra")
15101
+ effortLevels: hasUltra ? GPT_5_6_ULTRA_EFFORT_LEVELS : GPT_5_6_EFFORT_LEVELS
15021
15102
  };
15022
15103
  }
15023
15104
  if (id.includes("codex") || /^gpt-5\.[0-3]/.test(id)) {
15024
- return { contextWindows: [], effortLevels: CODEX_5X_EFFORT_LEVELS2 };
15105
+ return { contextWindows: [], effortLevels: CODEX_5X_EFFORT_LEVELS };
15025
15106
  }
15026
15107
  return void 0;
15027
15108
  }
@@ -15030,10 +15111,10 @@ function inferSlugModelCapabilities(providerKind, modelId) {
15030
15111
  return { contextWindows: ["200k"], effortLevels: [] };
15031
15112
  }
15032
15113
  if (id === "claude-opus-4-8") {
15033
- return { contextWindows: ["200k", "1m"], effortLevels: CLAUDE_5_EFFORT_LEVELS2 };
15114
+ return { contextWindows: ["200k", "1m"], effortLevels: CLAUDE_EFFORT_LEVELS };
15034
15115
  }
15035
15116
  if (id === "sonnet" || id === "opus" || id === "fable" || /^claude-(sonnet|opus|fable)-/.test(id)) {
15036
- return { contextWindows: ["200k", "1m"], effortLevels: CLAUDE_5_EFFORT_LEVELS2 };
15117
+ return { contextWindows: ["200k", "1m"], effortLevels: CLAUDE_EFFORT_LEVELS };
15037
15118
  }
15038
15119
  return void 0;
15039
15120
  }
@@ -15840,20 +15921,27 @@ function classifyCliErrorDetailed(stderr, _exitCode, opts) {
15840
15921
  }
15841
15922
  const haystack = [stderr, ...opts?.extraSignals ?? []].join("\n").toLowerCase();
15842
15923
  const has = (...needles) => needles.some((n) => haystack.includes(n));
15924
+ if (has("codex cli connection expired", "reconnect openai codex"))
15925
+ return specForErrorKind("auth_expired");
15926
+ if (has("codex connection to openai timed out")) return specForErrorKind("provider_timeout");
15843
15927
  if (has("authentication required", "not authenticated"))
15844
15928
  return specForErrorKind("not_authenticated");
15845
15929
  if (has("out of usage", "increase your limit")) return specForErrorKind("usage_limit");
15846
15930
  if (has("no chat found", "chat not found", "session not found", "could not resume"))
15847
15931
  return specForErrorKind("resume_failed");
15848
15932
  if (has("rate_limit", "rate limit", "429")) return specForErrorKind("rate_limited");
15849
- if (isLikelyProviderAuthError(haystack)) return specForErrorKind("auth_invalid");
15933
+ if (has("authentication_failed", "authentication error", "authentication failed") || isLikelyProviderAuthError(haystack))
15934
+ return specForErrorKind("auth_invalid");
15850
15935
  if (has(
15851
15936
  "not logged in",
15852
15937
  "login required",
15853
15938
  "please sign in",
15854
15939
  "please log in",
15855
15940
  "sign in to",
15856
- "log in to"
15941
+ "log in to",
15942
+ // Claude prompts the user to re-auth with the /login slash command.
15943
+ "run /login",
15944
+ "please run /login"
15857
15945
  ))
15858
15946
  return specForErrorKind("not_logged_in");
15859
15947
  if (has(
@@ -17340,11 +17428,15 @@ function createClaudeCliBackend(command = "claude", defaultArgs = []) {
17340
17428
  if (context.config.teamId?.trim() && await cliSupportsFlag(command, "--approve-mcps", context.env)) {
17341
17429
  args.push("--approve-mcps");
17342
17430
  }
17343
- const baseModel = context.config.selectedModel?.trim();
17431
+ const baseModel = collapseModelIdToBase(context.config.selectedModel?.trim() || "");
17344
17432
  if (baseModel) {
17345
17433
  args.push("--model", buildClaudeModelArg(baseModel, context.config.selectedContextWindow));
17346
17434
  }
17347
- const claudeEffort = context.config.selectedEffortLevel?.trim();
17435
+ const claudeEffort = resolveWireEffort({
17436
+ harness: "claude_cli",
17437
+ modelId: baseModel,
17438
+ selectedEffortLevel: context.config.selectedEffortLevel
17439
+ });
17348
17440
  if (claudeEffort) {
17349
17441
  args.push("--effort", claudeEffort);
17350
17442
  }
@@ -17865,8 +17957,14 @@ var parseCodexStructuredLine = createStructuredLineParser(
17865
17957
  "codex_app_server",
17866
17958
  handleCodexStructuredEvent
17867
17959
  );
17868
- function buildCodexEffortArgs(selectedEffortLevel) {
17869
- const level = selectedEffortLevel?.trim();
17960
+ function buildCodexEffortArgs(selectedEffortLevel, options) {
17961
+ const modelId = collapseModelIdToBase(options?.modelId?.trim() || "");
17962
+ const level = resolveWireEffort({
17963
+ harness: "codex_app_server",
17964
+ modelId,
17965
+ selectedEffortLevel,
17966
+ effortLevels: options?.effortLevels
17967
+ });
17870
17968
  if (!level) return [];
17871
17969
  return ["-c", `model_reasoning_effort=${level}`];
17872
17970
  }
@@ -17916,8 +18014,11 @@ function createCodexRuntimeBackend(command = "codex", defaultArgs = []) {
17916
18014
  startupTimeoutMs: CODEX_STARTUP_TIMEOUT_MS,
17917
18015
  buildArgs: (ctx) => {
17918
18016
  const resumeId = resumableSessionId;
17919
- const modelArgs = ctx.config.selectedModel?.trim() ? ["--model", ctx.config.selectedModel.trim()] : [];
17920
- const effortArgs = buildCodexEffortArgs(ctx.config.selectedEffortLevel);
18017
+ const selectedModel = collapseModelIdToBase(ctx.config.selectedModel?.trim() || "");
18018
+ const modelArgs = selectedModel ? ["--model", selectedModel] : [];
18019
+ const effortArgs = buildCodexEffortArgs(ctx.config.selectedEffortLevel, {
18020
+ modelId: selectedModel
18021
+ });
17921
18022
  const permissionArgs = getCodexPermissionArgs(ctx.config);
17922
18023
  const imageArgs = imagePaths.flatMap((p) => ["--image", p]);
17923
18024
  const baseArgs = resumeId ? [
@@ -18221,58 +18322,48 @@ var parseCursorStructuredLine = createStructuredLineParser(
18221
18322
  "cursor_agent_cli",
18222
18323
  handleCursorStructuredEvent
18223
18324
  );
18224
- var CURSOR_EFFORT_SUFFIXES2 = [
18225
- { suffix: "-extra-high", level: "xhigh" },
18226
- { suffix: "-xhigh", level: "xhigh" },
18227
- { suffix: "-max", level: "max" },
18228
- { suffix: "-high", level: "high" },
18229
- { suffix: "-medium", level: "medium" },
18230
- { suffix: "-low", level: "low" },
18231
- { suffix: "-none", level: "minimal" }
18232
- ];
18233
- function parseCursorModelId2(modelId) {
18234
- let id = modelId.trim();
18235
- let fast = false;
18236
- if (id.endsWith("-fast")) {
18237
- fast = true;
18238
- id = id.slice(0, -"-fast".length);
18239
- }
18240
- for (const { suffix, level } of CURSOR_EFFORT_SUFFIXES2) {
18241
- if (id.endsWith(suffix)) {
18242
- return { baseId: id.slice(0, -suffix.length), effort: level, fast };
18243
- }
18244
- }
18245
- return { baseId: id, effort: null, fast };
18246
- }
18247
- function cursorEffortForBracket(level) {
18248
- if (level === "minimal") return "none";
18249
- return level;
18250
- }
18251
- function asEffortLevel(value2, allowed) {
18252
- if (!value2) return null;
18253
- return allowed.includes(value2) ? value2 : null;
18254
- }
18255
18325
  function asContextWindow(value2) {
18256
18326
  if (value2 === "1m" || value2 === "200k") return value2;
18257
18327
  return null;
18258
18328
  }
18329
+ function cursorEffortSuffix(level, baseId) {
18330
+ if (level === "minimal") return "-none";
18331
+ if (level === "xhigh") {
18332
+ if (/^gpt-5\.5(?:-|$)/.test(baseId)) return "-extra-high";
18333
+ return "-xhigh";
18334
+ }
18335
+ if (level === "ultra") return "-max";
18336
+ return `-${level}`;
18337
+ }
18259
18338
  function buildCursorAgentModelArg(modelId, options) {
18260
18339
  const trimmed = modelId.trim();
18261
18340
  if (!trimmed) return trimmed;
18262
- const parsed = parseCursorModelId2(trimmed);
18341
+ const parsed = parseModelEffortSuffix(trimmed);
18263
18342
  if (parsed.fast && !parsed.effort) return trimmed;
18343
+ const baseId = collapseModelIdToBase(trimmed);
18264
18344
  const effortLevels = options?.effortLevels ?? [];
18265
- const overrides = [];
18266
- const contextWindow = asContextWindow(options?.selectedContextWindow);
18267
- if (contextWindow === "1m") {
18268
- overrides.push("context=1m");
18345
+ const wireEffort = resolveWireEffort({
18346
+ harness: "cursor_agent_cli",
18347
+ modelId: baseId,
18348
+ selectedEffortLevel: options?.selectedEffortLevel,
18349
+ effortLevels
18350
+ });
18351
+ let id = baseId;
18352
+ if (wireEffort) {
18353
+ const alanLevel = wireEffort === "none" ? "minimal" : wireEffort;
18354
+ if (isEffortLevel(alanLevel)) {
18355
+ const allowed = effortLevels.length === 0 || effortLevels.includes(alanLevel) || alanLevel === "minimal" && effortLevels.includes("minimal");
18356
+ if (allowed) {
18357
+ id = `${baseId}${cursorEffortSuffix(alanLevel, baseId)}`;
18358
+ }
18359
+ }
18269
18360
  }
18270
- const effort = asEffortLevel(options?.selectedEffortLevel, effortLevels);
18271
- if (effort) {
18272
- overrides.push(`effort=${cursorEffortForBracket(effort)}`);
18361
+ const contextWindow = asContextWindow(options?.selectedContextWindow);
18362
+ if (contextWindow === "1m" && id === baseId) {
18363
+ return `${baseId}[context=1m]`;
18273
18364
  }
18274
- if (overrides.length === 0) return parsed.baseId;
18275
- return `${parsed.baseId}[${overrides.join(",")}]`;
18365
+ if (parsed.fast) return `${id}-fast`;
18366
+ return id;
18276
18367
  }
18277
18368
  function isCursorAgentCliModelId(model) {
18278
18369
  return model === "auto" || /^composer-/.test(model) || /^gpt-/.test(model) || /^claude-/.test(model) || /^gemini-/.test(model) || /^grok-/.test(model) || /^kimi-/.test(model);
@@ -18352,7 +18443,7 @@ function createCursorAgentCliBackend(command = "cursor-agent", defaultArgs = [])
18352
18443
  }
18353
18444
  const model = ctx.config.selectedModel?.trim();
18354
18445
  if (model && isDispatchableCursorModel(model)) {
18355
- const modelDef = findModelDef("cursor_agent_cli", model);
18446
+ const modelDef = findModelDef("cursor_agent_cli", model) ?? findModelDef("cursor_agent_cli", model.replace(/-fast$/, ""));
18356
18447
  args.push(
18357
18448
  "--model",
18358
18449
  buildCursorAgentModelArg(model, {
@@ -22436,7 +22527,7 @@ var RunStartGate = class {
22436
22527
  };
22437
22528
 
22438
22529
  // src/version.ts
22439
- var AGENT_VERSION = "0.1.39";
22530
+ var AGENT_VERSION = "0.1.41";
22440
22531
 
22441
22532
  // src/workspace-relocation.ts
22442
22533
  var import_node_child_process3 = require("child_process");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiden-ade/sandbox-agent",
3
- "version": "0.1.39",
3
+ "version": "0.1.41",
4
4
  "type": "module",
5
5
  "description": "Alan agent runtime — cloud sandbox and local daemon (alan-agent CLI)",
6
6
  "bin": {