@super-one/cli 0.50.1-alpha → 0.50.2-alpha

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/MANIFEST.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@super-one/cli",
3
- "version": "0.50.1-alpha",
3
+ "version": "0.50.2-alpha",
4
4
  "kind": "npm",
5
5
  "minNodeMajor": 20,
6
- "builtAt": "2026-08-06T07:00:52.203Z"
6
+ "builtAt": "2026-08-06T17:30:12.368Z"
7
7
  }
package/lib/cli.mjs CHANGED
@@ -9945,6 +9945,40 @@ var init_resolve_sdk_binary = __esm({
9945
9945
  }
9946
9946
  });
9947
9947
 
9948
+ // ../../packages/claude/src/root-permission-guard.ts
9949
+ function isRootWithoutSandboxOptIn(opts) {
9950
+ if (opts.uid !== 0) return false;
9951
+ const env = opts.env ?? {};
9952
+ if (env.IS_SANDBOX === "1") return false;
9953
+ if (env.CLAUDE_CODE_BUBBLEWRAP) return false;
9954
+ return true;
9955
+ }
9956
+ function applyRootPermissionGuard(input) {
9957
+ const mode = input.permissionMode?.trim() ? input.permissionMode.trim() : void 0;
9958
+ if (!isRootWithoutSandboxOptIn(input)) {
9959
+ return {
9960
+ permissionMode: mode,
9961
+ allowDangerouslySkipPermissions: true,
9962
+ applied: false,
9963
+ downgradedFrom: null
9964
+ };
9965
+ }
9966
+ const downgrade = mode === "bypassPermissions";
9967
+ return {
9968
+ permissionMode: downgrade ? ROOT_SAFE_PERMISSION_MODE : mode,
9969
+ allowDangerouslySkipPermissions: false,
9970
+ applied: true,
9971
+ downgradedFrom: downgrade ? mode : null
9972
+ };
9973
+ }
9974
+ var ROOT_SAFE_PERMISSION_MODE;
9975
+ var init_root_permission_guard = __esm({
9976
+ "../../packages/claude/src/root-permission-guard.ts"() {
9977
+ "use strict";
9978
+ ROOT_SAFE_PERMISSION_MODE = "acceptEdits";
9979
+ }
9980
+ });
9981
+
9948
9982
  // ../../packages/claude/src/run-sdk-turn.ts
9949
9983
  import { query as sdkQuery } from "@anthropic-ai/claude-agent-sdk";
9950
9984
  var init_run_sdk_turn = __esm({
@@ -9955,6 +9989,7 @@ var init_run_sdk_turn = __esm({
9955
9989
  init_map_sdk_message();
9956
9990
  init_agent_event_mapper2();
9957
9991
  init_resolve_sdk_binary();
9992
+ init_root_permission_guard();
9958
9993
  }
9959
9994
  });
9960
9995
 
@@ -10103,6 +10138,11 @@ function buildLiveOptions(opts, onPermission, onQuestion, onPlan, signal, timing
10103
10138
  autoAllowBashIfSandboxed: opts.sandboxMode === "auto",
10104
10139
  failIfUnavailable: false
10105
10140
  } : void 0;
10141
+ const permissions = applyRootPermissionGuard({
10142
+ permissionMode: opts.permissionMode,
10143
+ uid: opts.uid === void 0 ? process.getuid?.() : opts.uid,
10144
+ env: env ?? process.env
10145
+ });
10106
10146
  const base = {
10107
10147
  cwd: opts.cwd,
10108
10148
  ...binaryPath ? { pathToClaudeCodeExecutable: binaryPath } : {},
@@ -10115,8 +10155,8 @@ function buildLiveOptions(opts, onPermission, onQuestion, onPlan, signal, timing
10115
10155
  enableFileCheckpointing: true,
10116
10156
  agentProgressSummaries: true,
10117
10157
  extraArgs: { "replay-user-messages": null },
10118
- permissionMode: opts.permissionMode || "default",
10119
- allowDangerouslySkipPermissions: true,
10158
+ permissionMode: permissions.permissionMode || "default",
10159
+ allowDangerouslySkipPermissions: permissions.allowDangerouslySkipPermissions,
10120
10160
  canUseTool,
10121
10161
  abortController,
10122
10162
  settingSources: ["user", "project", "local"],
@@ -10156,6 +10196,7 @@ var init_claude_live_session = __esm({
10156
10196
  init_agent_event_mapper2();
10157
10197
  init_map_sdk_message();
10158
10198
  init_resolve_sdk_binary();
10199
+ init_root_permission_guard();
10159
10200
  init_superone_system_prompt();
10160
10201
  init_superone_host_owned_tools();
10161
10202
  ClaudeLiveSession = class _ClaudeLiveSession {
@@ -10393,6 +10434,90 @@ var init_claude_live_session = __esm({
10393
10434
  }
10394
10435
  });
10395
10436
 
10437
+ // ../../packages/claude/src/fetch-models.ts
10438
+ import { query as sdkQuery3 } from "@anthropic-ai/claude-agent-sdk";
10439
+ function extractModelName(descPrefix) {
10440
+ const match = descPrefix.match(MODEL_NAME_RE);
10441
+ if (!match) return null;
10442
+ return match[2] ? `${match[1]} ${match[2]}` : match[1];
10443
+ }
10444
+ function mapClaudeModelInfo(m2) {
10445
+ const raw = m2.description ?? "";
10446
+ const sepIdx = raw.indexOf("\xB7");
10447
+ const descPrefix = sepIdx !== -1 ? raw.slice(0, sepIdx).trim() : "";
10448
+ const name = extractModelName(descPrefix) ?? m2.displayName;
10449
+ const base = { id: m2.value, name, description: raw };
10450
+ if (m2.resolvedModel) base.resolvedModel = m2.resolvedModel;
10451
+ if (m2.supportsEffort) base.supportsEffort = true;
10452
+ if (m2.supportedEffortLevels?.length) {
10453
+ base.supportedEffortLevels = m2.supportedEffortLevels;
10454
+ }
10455
+ if (m2.supportsAdaptiveThinking) base.supportsAdaptiveThinking = true;
10456
+ if (m2.supportsFastMode) base.supportsFastMode = true;
10457
+ if (m2.supportsAutoMode) base.supportsAutoMode = true;
10458
+ return base;
10459
+ }
10460
+ async function fetchClaudeModels(opts) {
10461
+ const binaryPath = opts.binaryPath ?? resolveSdkClaudeBinary();
10462
+ const permissions = applyRootPermissionGuard({
10463
+ permissionMode: "default",
10464
+ uid: opts.uid === void 0 ? process.getuid?.() : opts.uid,
10465
+ env: opts.env ?? process.env
10466
+ });
10467
+ const options = {
10468
+ cwd: opts.cwd,
10469
+ ...binaryPath ? { pathToClaudeCodeExecutable: binaryPath } : {},
10470
+ maxTurns: 0,
10471
+ permissionMode: permissions.permissionMode,
10472
+ persistSession: false,
10473
+ ...opts.env ? { env: opts.env } : {}
10474
+ };
10475
+ let q;
10476
+ try {
10477
+ q = (opts.queryFn ?? sdkQuery3)({ prompt: "hi", options });
10478
+ const models = await withTimeout(
10479
+ (async () => {
10480
+ await q.initializationResult();
10481
+ return await q.supportedModels();
10482
+ })(),
10483
+ opts.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS
10484
+ );
10485
+ return models.map(mapClaudeModelInfo);
10486
+ } catch {
10487
+ return [];
10488
+ } finally {
10489
+ try {
10490
+ q?.close();
10491
+ } catch {
10492
+ }
10493
+ }
10494
+ }
10495
+ function withTimeout(promise2, ms) {
10496
+ return new Promise((resolve13, reject) => {
10497
+ const timer = setTimeout(() => reject(new Error(`claude model probe timed out after ${ms}ms`)), ms);
10498
+ promise2.then(
10499
+ (v2) => {
10500
+ clearTimeout(timer);
10501
+ resolve13(v2);
10502
+ },
10503
+ (e) => {
10504
+ clearTimeout(timer);
10505
+ reject(e);
10506
+ }
10507
+ );
10508
+ });
10509
+ }
10510
+ var MODEL_NAME_RE, DEFAULT_PROBE_TIMEOUT_MS;
10511
+ var init_fetch_models = __esm({
10512
+ "../../packages/claude/src/fetch-models.ts"() {
10513
+ "use strict";
10514
+ init_resolve_sdk_binary();
10515
+ init_root_permission_guard();
10516
+ MODEL_NAME_RE = /^(\w+ [\d.]+)(?:\s+with\s+(\w+)\s+context)?/;
10517
+ DEFAULT_PROBE_TIMEOUT_MS = 2e4;
10518
+ }
10519
+ });
10520
+
10396
10521
  // ../../packages/claude/src/fork-session.ts
10397
10522
  import { existsSync as existsSync7, mkdirSync as mkdirSync4, readdirSync, realpathSync, renameSync } from "node:fs";
10398
10523
  import { homedir as homedir2 } from "node:os";
@@ -10460,6 +10585,8 @@ var init_src2 = __esm({
10460
10585
  init_claude_live_session();
10461
10586
  init_agent_event_mapper2();
10462
10587
  init_resolve_sdk_binary();
10588
+ init_fetch_models();
10589
+ init_root_permission_guard();
10463
10590
  init_map_sdk_message();
10464
10591
  init_fork_session();
10465
10592
  }
@@ -14019,8 +14146,19 @@ async function collectHarnessResources(input) {
14019
14146
  opencode: emptyOpenCode(),
14020
14147
  acp: emptyAcp()
14021
14148
  };
14149
+ const resolveModels = async (harnessId) => {
14150
+ const listed = input.listModels(harnessId, input.apiProviderId);
14151
+ if (Array.isArray(listed) && listed.length > 0) return listed;
14152
+ if (!input.probeModels) return [];
14153
+ try {
14154
+ const probed = await input.probeModels(harnessId);
14155
+ return Array.isArray(probed) ? probed : [];
14156
+ } catch {
14157
+ return [];
14158
+ }
14159
+ };
14022
14160
  if (want("claude")) {
14023
- const models = input.listModels("claude", input.apiProviderId);
14161
+ const models = await resolveModels("claude");
14024
14162
  let account = {};
14025
14163
  if (input.probeAccount) {
14026
14164
  try {
@@ -14056,14 +14194,14 @@ async function collectHarnessResources(input) {
14056
14194
  };
14057
14195
  }
14058
14196
  if (want("codex")) {
14059
- const models = input.listModels("codex", input.apiProviderId);
14197
+ const models = await resolveModels("codex");
14060
14198
  bundle.codex = {
14061
14199
  models: Array.isArray(models) ? models : [],
14062
14200
  prompts: discoverCodexUserPrompts({ homeDir })
14063
14201
  };
14064
14202
  }
14065
14203
  if (want("opencode")) {
14066
- const models = input.listModels("opencode", input.apiProviderId);
14204
+ const models = await resolveModels("opencode");
14067
14205
  bundle.opencode = {
14068
14206
  models: Array.isArray(models) ? models : [],
14069
14207
  agents: [],
@@ -18178,7 +18316,7 @@ function resolveHarnessService(store, harness, apiProviderId) {
18178
18316
  binding && binding.credentialId === cred.id ? { endpointId: binding.endpointId, config: binding.config } : null
18179
18317
  );
18180
18318
  }
18181
- function listHarnessModels(store, harness, apiProviderId) {
18319
+ function listHarnessProviderModels(store, harness, apiProviderId) {
18182
18320
  const resolved = resolveHarnessService(store, harness, apiProviderId);
18183
18321
  if (resolved) {
18184
18322
  const mapped = /* @__PURE__ */ new Map();
@@ -18208,6 +18346,11 @@ function listHarnessModels(store, harness, apiProviderId) {
18208
18346
  const list = [...mapped.values()];
18209
18347
  if (list.length > 0) return list;
18210
18348
  }
18349
+ return [];
18350
+ }
18351
+ function listHarnessModels(store, harness, apiProviderId) {
18352
+ const fromProvider = listHarnessProviderModels(store, harness, apiProviderId);
18353
+ if (fromProvider.length > 0) return fromProvider;
18211
18354
  if (harness === "claude") return DEFAULT_CLAUDE_MODELS;
18212
18355
  if (harness === "codex") return DEFAULT_CODEX_MODELS;
18213
18356
  return [];
@@ -21088,6 +21231,18 @@ function createNodeClaudeTurnRunner(opts) {
21088
21231
  ...opts.env,
21089
21232
  ...providerEnv
21090
21233
  };
21234
+ const uid = opts.getuid ? opts.getuid() : process.getuid?.();
21235
+ const permissions = applyRootPermissionGuard({
21236
+ permissionMode: input.permissionMode,
21237
+ uid,
21238
+ env: authEnv
21239
+ });
21240
+ if (permissions.downgradedFrom) {
21241
+ input.onAgentEvent?.({
21242
+ type: "agent_setting_change",
21243
+ patch: { permissionMode: permissions.permissionMode }
21244
+ });
21245
+ }
21091
21246
  const priorSession = parseClaudeSessionResume(input.session.providerResume);
21092
21247
  const sessionKey = input.session.sessionId;
21093
21248
  const mergedProbe = ensureMcpMerge({
@@ -21125,7 +21280,8 @@ function createNodeClaudeTurnRunner(opts) {
21125
21280
  sessionId: priorSession,
21126
21281
  model: input.model && input.model.trim() ? input.model.trim() : void 0,
21127
21282
  effort: input.effort && input.effort.trim() ? input.effort.trim() : void 0,
21128
- permissionMode: input.permissionMode && input.permissionMode.trim() ? input.permissionMode.trim() : void 0,
21283
+ permissionMode: permissions.permissionMode,
21284
+ uid,
21129
21285
  sandboxMode: input.sandboxMode && input.sandboxMode.trim() ? input.sandboxMode.trim() : void 0,
21130
21286
  additionalDirectories: input.additionalDirectories?.filter(Boolean),
21131
21287
  enabledSkills: resolveEnabledSkills(cwd, input.enabledSkills, input.disabledSkills),
@@ -56999,8 +57155,8 @@ import { fileURLToPath } from "node:url";
56999
57155
  function resolveCliReleaseVersion() {
57000
57156
  const fromEnv = process.env.SUPERONE_CLI_VERSION?.trim();
57001
57157
  if (fromEnv) return fromEnv;
57002
- if ("0.50.1-alpha".trim()) {
57003
- return "0.50.1-alpha".trim();
57158
+ if ("0.50.2-alpha".trim()) {
57159
+ return "0.50.2-alpha".trim();
57004
57160
  }
57005
57161
  const fromDist = readDistManifestVersion();
57006
57162
  if (fromDist) return fromDist;
@@ -60983,6 +61139,25 @@ function handleDelete(payload, ctx) {
60983
61139
  init_environment();
60984
61140
  init_session();
60985
61141
  init_resolve_service();
61142
+ init_claude_turn_runner();
61143
+
61144
+ // src/session/claude-model-catalog.ts
61145
+ init_src2();
61146
+ var CATALOG_TTL_MS = 5 * 6e4;
61147
+ var cache = /* @__PURE__ */ new Map();
61148
+ async function getNodeClaudeModelCatalog(opts) {
61149
+ const now = opts.now ?? Date.now;
61150
+ const key = opts.binaryPath ?? "sdk-bundled";
61151
+ const hit = cache.get(key);
61152
+ if (hit && now() - hit.fetchedAt < CATALOG_TTL_MS) return hit.models;
61153
+ const fetchModels = opts.fetchModels ?? fetchClaudeModels;
61154
+ const models = await fetchModels({ cwd: opts.cwd, binaryPath: opts.binaryPath });
61155
+ if (models.length > 0) cache.set(key, { fetchedAt: now(), models });
61156
+ else cache.delete(key);
61157
+ return models;
61158
+ }
61159
+
61160
+ // src/rpc/harness-resources-handlers.ts
60986
61161
  function requireScopes5(client3, scopes) {
60987
61162
  if (!hasAllScopes(client3.scopes, scopes)) {
60988
61163
  return { error: { code: "forbidden", message: `missing scopes: ${scopes.join(", ")}` } };
@@ -60992,6 +61167,14 @@ function requireScopes5(client3, scopes) {
60992
61167
  function asRecord13(payload) {
60993
61168
  return payload && typeof payload === "object" ? payload : {};
60994
61169
  }
61170
+ function defaultProbeModels(ctx) {
61171
+ return async (harnessId, cwd) => {
61172
+ if (harnessId !== "claude") return [];
61173
+ const binaryPath = resolveClaudeBinaryPath({ harnesses: ctx.harnesses });
61174
+ if (!binaryPath) return [];
61175
+ return getNodeClaudeModelCatalog({ cwd, binaryPath });
61176
+ };
61177
+ }
60995
61178
  function mapThrown5(err) {
60996
61179
  const e = err;
60997
61180
  const code = e.code ?? "internal";
@@ -61020,12 +61203,19 @@ async function handleHarnessResources(payload, ctx) {
61020
61203
  const harnessId = typeof p2.harnessId === "string" && p2.harnessId.trim() ? p2.harnessId.trim() : null;
61021
61204
  const apiProviderId = typeof p2.apiProviderId === "string" && p2.apiProviderId.trim() ? p2.apiProviderId.trim() : p2.apiProviderId === null ? null : void 0;
61022
61205
  const listModels = (hid, apiId) => {
61023
- return listHarnessModels(ctx.providers, hid, apiId ?? null);
61206
+ return listHarnessProviderModels(ctx.providers, hid, apiId ?? null);
61207
+ };
61208
+ const probeModels = async (hid) => {
61209
+ const probe = ctx.probeModels ?? defaultProbeModels(ctx);
61210
+ const probed = await probe(hid, project.path);
61211
+ if (probed.length > 0) return probed;
61212
+ return listHarnessModels(ctx.providers, hid, apiProviderId ?? null);
61024
61213
  };
61025
61214
  const bundle = await collectHarnessResources({
61026
61215
  projectPath: project.path,
61027
61216
  homeDir: ctx.homeDir,
61028
61217
  listModels,
61218
+ probeModels,
61029
61219
  apiProviderId: apiProviderId ?? null,
61030
61220
  harnessId
61031
61221
  });
@@ -61201,7 +61391,8 @@ async function dispatchRpcInner(method, payload, ctx) {
61201
61391
  const harnessResources = await dispatchHarnessResourcesRpc(method, payload, {
61202
61392
  client: ctx.client,
61203
61393
  projects: ctx.projects,
61204
- providers: ctx.providers
61394
+ providers: ctx.providers,
61395
+ harnesses: ctx.harnesses
61205
61396
  });
61206
61397
  if (harnessResources) return harnessResources;
61207
61398
  const codex = await dispatchCodexRpc(method, payload, {
@@ -66992,14 +67183,14 @@ var Response2 = class _Response {
66992
67183
  }
66993
67184
  }
66994
67185
  get headers() {
66995
- const cache = this[cacheKey];
66996
- if (cache) {
66997
- if (!(cache[2] instanceof Headers)) {
66998
- cache[2] = new Headers(
66999
- cache[2] || { "content-type": "text/plain; charset=UTF-8" }
67186
+ const cache2 = this[cacheKey];
67187
+ if (cache2) {
67188
+ if (!(cache2[2] instanceof Headers)) {
67189
+ cache2[2] = new Headers(
67190
+ cache2[2] || { "content-type": "text/plain; charset=UTF-8" }
67000
67191
  );
67001
67192
  }
67002
- return cache[2];
67193
+ return cache2[2];
67003
67194
  }
67004
67195
  return this[getResponseCache]().headers;
67005
67196
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@super-one/cli",
3
- "version": "0.50.1-alpha",
3
+ "version": "0.50.2-alpha",
4
4
  "description": "SuperOne headless node CLI — remote execution environment (RPC, workspaces, sessions).",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",