New:Socket for Asana Is Now Available.Learn more
Get Started

@sandbaseai/cli

Package Overview
Dependencies
Maintainers
2
Versions
13
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sandbaseai/cli - npm Package Compare versions

Comparing version
0.1.12
to
0.1.13
+2
-2
dist/catalog.d.ts

@@ -174,4 +174,4 @@ export declare const clientCatalog: readonly [{

readonly autoEligible: false;
readonly localAuthorization: false;
readonly installScriptEligible: false;
readonly localAuthorization: true;
readonly installScriptEligible: true;
}];

@@ -178,0 +178,0 @@ export type ClientCatalogEntry = (typeof clientCatalog)[number];

@@ -26,3 +26,3 @@ export const clientCatalog = [

{ id: "cowork", label: "Cowork", delivery: "desktop_import", autoEligible: false, localAuthorization: true, installScriptEligible: true },
{ id: "chatgpt", label: "ChatGPT", delivery: "remote_workspace", autoEligible: false, localAuthorization: false, installScriptEligible: false },
{ id: "chatgpt", label: "ChatGPT", delivery: "remote_workspace", autoEligible: false, localAuthorization: true, installScriptEligible: true },
];

@@ -29,0 +29,0 @@ export function stableCatalog() {

@@ -44,3 +44,3 @@ export const clientProfiles = {

opencode: { mcpMode: "auto", skillMode: "none", invocation: "mcp_chat", verification: "read_only_probe", guide: guide("OpenCode", "Restart OpenCode and inspect its MCP server list.", "opencode2 mcp list reads back SandBase."), uninstall: "managed_only", terminal: "action_required" },
chatgpt: { mcpMode: "manual", skillMode: "none", invocation: "none", verification: "user_action", guide: guide("ChatGPT", "Use an eligible Business, Enterprise, or Edu workspace: an administrator enables Developer Mode, creates and scans the remote SandBase app, then publishes it.", "Read back the published app and tools and complete one safe call; this CLI never authorizes or writes ChatGPT configuration."), uninstall: "managed_only", terminal: "action_required" },
chatgpt: { mcpMode: "manual", skillMode: "none", invocation: "desktop_ui", verification: "user_action", guide: guide("ChatGPT", "After SandBase authorization and local bridge preparation, use an eligible Business, Enterprise, or Edu workspace: enable Developer Mode, create the SandBase App, Scan Tools, and have an administrator publish it.", "In a fresh ChatGPT conversation, read back the published SandBase tools and complete one safe call; this CLI never writes ChatGPT configuration."), uninstall: "managed_only", terminal: "action_required" },
warp: { mcpMode: "auto", skillMode: "none", invocation: "desktop_ui", verification: "read_only_probe", guide: guide("Warp", "Approve the managed server with /agent-add-mcp, then inspect Warp's MCP server and tool readback.", "The owned user entry is present and Warp lists SandBase tools without a project override."), uninstall: "managed_only", terminal: "action_required" },

@@ -82,2 +82,3 @@ trae: { mcpMode: "none", skillMode: "prompt", invocation: "prompt", verification: "user_action", guide: guide("Trae", "Paste a SandBase MCP usage prompt into the client after configuring its supported integration.", "The client confirms the prompt or tool availability."), uninstall: "managed_only", terminal: "action_required" },

warp: { source: "https://docs.warp.dev/agent-platform/capabilities/mcp/", retrieved: "2026-07-30", conclusion: "Warp supports user-level ~/.warp/.mcp.json command servers and explicit /agent-add-mcp approval/readback.", kind: "first_party" },
chatgpt: { source: "https://platform.openai.com/docs/mcp", retrieved: "2026-07-31", conclusion: "ChatGPT remote Apps require product-side Developer Mode, app creation, tool scanning, publication, and verification; SandBase CLI only prepares its owned credential and bridge.", kind: "first_party" },
antigravity: { source: "B-082 feature design r1", retrieved: "2026-07-30", conclusion: "Prompt-assisted authorization prepares an isolated local bridge without guessing private client schema.", kind: "first_party" },

@@ -89,4 +90,4 @@ trae: { source: "B-082 feature design r1", retrieved: "2026-07-30", conclusion: "Prompt-assisted authorization prepares an isolated local bridge without guessing private client schema.", kind: "first_party" },

};
const implemented = client !== "chatgpt";
const blocker = client === "cursor-cli" ? "Cursor CLI MCP installation is blocked until an independent first-party schema is recorded; desktop Cursor configuration must not be reused." : "This client batch has no completed installer and validator in the current iteration.";
const implemented = true;
const blocker = "This client batch has no completed installer and validator in the current iteration.";
if (!implemented)

@@ -102,4 +103,4 @@ return {

return {
evidence: evidence[client], installer: { mcp: desktop ? "confirmation" : "adapter", skill: skillInstaller },
validator: { mcp: "read_back", skill: skillValidator }, implementation: "implemented", status: "confirmation_required",
evidence: evidence[client], installer: { mcp: desktop || client === "chatgpt" ? "confirmation" : "adapter", skill: skillInstaller },
validator: { mcp: client === "chatgpt" ? "confirmation" : "read_back", skill: skillValidator }, implementation: "implemented", status: "confirmation_required",
nextStep: capability.guide,

@@ -106,0 +107,0 @@ };

@@ -235,2 +235,25 @@ import { spawn } from "node:child_process";

}
async function connectChatGPT(deps) {
const api = deps.api || new AuthorizationApi((process.env.SANDBASE_API_URL || "https://sandbase.ai").replace(/\/$/, ""));
const store = deps.store || new FileCredentialStore();
const log = deps.log || console.log;
const previous = await store.get("chatgpt");
const { authorizationId, exchange } = await authorize(api, "chatgpt", { open: deps.open || openBrowser, sleep, log, ...(deps.signal ? { signal: deps.signal } : {}) });
let bridgeResult;
try {
await store.save(recordFor("chatgpt", exchange));
bridgeResult = await installBridge();
log("chatgpt: status=action_required, authorization=completed, credential=stored, bridge=ready, chatgpt_app=not_configured, verification=not_verified, next_step=Use an eligible ChatGPT Business, Enterprise, or Edu workspace. Enable Developer Mode, open Apps and choose Create, register the SandBase remote MCP endpoint using the approved authentication method, run Scan Tools, have a workspace administrator review and publish the App, then start a fresh conversation and complete one safe SandBase tool call. The CLI did not write or change any ChatGPT configuration.");
exchange.cleanup_token = "";
}
catch (error) {
if (bridgeResult)
await rollbackBridge(bridgeResult).catch(() => undefined);
await restoreCredential(store, "chatgpt", previous).catch(() => undefined);
if (!(await compensate(api, authorizationId, exchange.cleanup_token)))
console.error("WARNING: automatic credential cleanup failed. Revoke the new CLI credential in SandBase Dashboard immediately.");
exchange.cleanup_token = "";
throw error;
}
}
async function connectOne(client, deps) {

@@ -245,3 +268,3 @@ const api = deps.api || new AuthorizationApi((process.env.SANDBASE_API_URL || "https://sandbase.ai").replace(/\/$/, ""));

if (client === "chatgpt") {
log(`chatgpt: status=action_required, authorization=not_started, local_write=none, next_step=${capability.guide}`);
await connectChatGPT(deps);
return;

@@ -601,3 +624,5 @@ }

if (target === "chatgpt") {
console.log(`chatgpt: status=action_required, authorization=not_applicable, local_state=none, next_step=${nativeCapabilities.chatgpt.guide}`);
const [credential, bridge] = await Promise.all([store.get("chatgpt"), inspectBridge()]);
const ready = !!credential && validOwnedCredential("chatgpt", credential) && bridge === "ready";
console.log(`chatgpt: status=${ready ? "action_required" : "failed"}, authorization=${ready ? "completed" : "required"}, credential=${ready ? "present" : credential ? "invalid" : "missing"}, bridge=${bridge}, chatgpt_app=not_observable, verification=not_verified, next_step=${ready ? nativeCapabilities.chatgpt.guide : "Run sandbase connect --client chatgpt again to prepare the SandBase-owned credential and bridge. No ChatGPT configuration was changed."}`);
healthy = false;

@@ -709,3 +734,8 @@ continue;

if (target === "chatgpt") {
console.log("chatgpt: status=unsupported, local_state=none, next_step=No local authorization or configuration exists; remove or unpublish the remote app through the ChatGPT workspace administrator flow.");
const credential = await store.get("chatgpt");
if (credential && !validOwnedCredential("chatgpt", credential))
throw new Error("chatgpt credential ownership is unrecognized; no changes were made");
if (credential)
await store.remove("chatgpt");
console.log(`chatgpt: status=${credential ? "removed" : "missing"}, bridge=retained, third_party_config=preserved, next_step=Only the SandBase-owned local ChatGPT credential was removed. The shared bridge and every ChatGPT App/workspace setting were left untouched; ask a workspace administrator to unpublish or remove the App separately if required.`);
continue;

@@ -712,0 +742,0 @@ }

{
"name": "@sandbaseai/cli",
"version": "0.1.12",
"version": "0.1.13",
"description": "Secure SandBase MCP onboarding CLI",

@@ -5,0 +5,0 @@ "type": "module",