bitfab-cli 0.2.399 → 0.2.400
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/dist/index.js +19 -16
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -26022,14 +26022,17 @@ Run ${platform2.loginHint} to re-authenticate.`);
|
|
|
26022
26022
|
}
|
|
26023
26023
|
|
|
26024
26024
|
// ../bitfab-plugin-lib/dist/commands/switchOrg.js
|
|
26025
|
-
async function requestSwitch(serviceUrl, apiKey,
|
|
26025
|
+
async function requestSwitch(serviceUrl, apiKey, authOrganizationId) {
|
|
26026
26026
|
const res = await fetch(`${serviceUrl}/api/plugin/organizations/switch`, {
|
|
26027
26027
|
method: "POST",
|
|
26028
26028
|
headers: {
|
|
26029
26029
|
Authorization: `Bearer ${apiKey}`,
|
|
26030
26030
|
"Content-Type": "application/json"
|
|
26031
26031
|
},
|
|
26032
|
-
body: JSON.stringify({
|
|
26032
|
+
body: JSON.stringify({
|
|
26033
|
+
authOrganizationId,
|
|
26034
|
+
clerkOrganizationId: authOrganizationId
|
|
26035
|
+
})
|
|
26033
26036
|
});
|
|
26034
26037
|
if (!res.ok) {
|
|
26035
26038
|
throw new Error(`Failed to switch organization (HTTP ${res.status})`);
|
|
@@ -26038,9 +26041,9 @@ async function requestSwitch(serviceUrl, apiKey, clerkOrganizationId) {
|
|
|
26038
26041
|
}
|
|
26039
26042
|
var ARGS = [
|
|
26040
26043
|
{
|
|
26041
|
-
name: "
|
|
26044
|
+
name: "authOrganizationId",
|
|
26042
26045
|
required: false,
|
|
26043
|
-
description: "
|
|
26046
|
+
description: "Organization ID to make active. Discover IDs with the list_organizations MCP tool."
|
|
26044
26047
|
}
|
|
26045
26048
|
];
|
|
26046
26049
|
async function runSwitchOrg(platform2) {
|
|
@@ -26049,21 +26052,21 @@ async function runSwitchOrg(platform2) {
|
|
|
26049
26052
|
})[0] ?? null;
|
|
26050
26053
|
const { apiKey, serviceUrl } = requireAuth(platform2.loginHint);
|
|
26051
26054
|
if (!target) {
|
|
26052
|
-
console.error("Usage: switchOrg <
|
|
26055
|
+
console.error("Usage: switchOrg <authOrganizationId>");
|
|
26053
26056
|
console.error("Discover org ids with the list_organizations MCP tool, then pass one here.");
|
|
26054
26057
|
process.exit(1);
|
|
26055
26058
|
}
|
|
26056
26059
|
try {
|
|
26057
26060
|
const result = await requestSwitch(serviceUrl, apiKey, target);
|
|
26058
26061
|
if (result.status === "not-member") {
|
|
26059
|
-
emitJson({ event: "not-member",
|
|
26062
|
+
emitJson({ event: "not-member", authOrganizationId: target });
|
|
26060
26063
|
return;
|
|
26061
26064
|
}
|
|
26062
26065
|
saveCredentials(result.apiKey);
|
|
26063
26066
|
emitJson({
|
|
26064
26067
|
event: "switched",
|
|
26065
26068
|
status: result.status,
|
|
26066
|
-
|
|
26069
|
+
authOrganizationId: result.authOrganizationId ?? result.clerkOrganizationId ?? target,
|
|
26067
26070
|
organizationName: result.organizationName,
|
|
26068
26071
|
apiKey: result.apiKey
|
|
26069
26072
|
});
|
|
@@ -31220,8 +31223,8 @@ var setupFlow = Flow.parse({
|
|
|
31220
31223
|
description: "Open a sign-in window and wait for authentication. Relay the printed sign-in link as a fallback."
|
|
31221
31224
|
},
|
|
31222
31225
|
switchOrg: {
|
|
31223
|
-
description: "List the user's Bitfab orgs (no args), or switch the plugin's active org and replace the local API key (with a <
|
|
31224
|
-
args: "[<
|
|
31226
|
+
description: "List the user's Bitfab orgs (no args), or switch the plugin's active org and replace the local API key (with a <authOrganizationId> arg)",
|
|
31227
|
+
args: "[<authOrganizationId>]"
|
|
31225
31228
|
},
|
|
31226
31229
|
startTemplatePreview: {
|
|
31227
31230
|
description: "Print a template preview link and exit.",
|
|
@@ -32230,7 +32233,7 @@ Then, for anything not healthy, name the most likely cause and the fix:
|
|
|
32230
32233
|
- **Root not replayable**, two failure modes, with the fix matched to each: **(a) the root takes unserializable inputs** (live SDK/DB clients, HTTP req/res, streams, opaque contexts), with or without a replay registry module: move the trace boundary inward to a serializable-input function or refactor to introduce one; **(b) a bare trace-processor-only key** ({{traceProcessorNames}}) whose root is the processor's empty-input span: add a \`withTrace\`/\`trace\` root that wraps the run and takes its input in a supported subtree runtime, or route the run through the run wrapper ({{traceProcessorRootWrappers}}). Use a manual \`withSpan\`/\`@span\` root only when opt-out is technically unavailable. Either way, re-instrument via \`{{cmd}}setup modify\` (or \`{{cmd}}setup instrument\` for a fresh boundary). This is a code change, recommended here, not applied blanket.
|
|
32231
32234
|
- **Opt-out roots without subtree capture**: every trace is the root alone, so tracing looks healthy and the traces are useless for per-step diagnosis, replay mocking, and prompt iteration. For TypeScript, use the installed SDK and wire the matching adapter into the build behind the server entrypoint, preserving existing config wrappers such as Sentry. For Python, this is a runtime upgrade to 3.12+; report it rather than attempting it.
|
|
32232
32235
|
- **Instrumented but no traces**: the app hasn't run with tracing enabled, or \`BITFAB_API_KEY\` isn't set in the run environment. Run the app with the key loaded.
|
|
32233
|
-
- **Key set but traces aren't visible in the browser**: the API key
|
|
32236
|
+
- **Key set but traces aren't visible in the browser**: the API key belongs to a different organization than the one the browser is showing. A key is bound to one organization when it is created, and the browser shows the signed-in user's active organization. Have the user pick the key's organization in the in-app org switcher; if it isn't listed, the signed-in user isn't a member of it.
|
|
32234
32237
|
- **Nothing instrumented**: run \`{{cmd}}setup instrument\`.
|
|
32235
32238
|
- **Want to change what's captured**: run \`{{cmd}}setup modify\`.
|
|
32236
32239
|
|
|
@@ -32294,7 +32297,7 @@ For unusual monorepos or private registries, defer to \`{{cmd}}update\`. Report
|
|
|
32294
32297
|
stepStyle: "list",
|
|
32295
32298
|
intro: `Switch which Bitfab organization the plugin reads and writes. Triggered explicitly by \`{{cmd}}setup switch-org\` (or natural-language asks like "switch org" / "change org" / "switch to the <name> org" / "I'm in the wrong org"). The plugin's org is set by the API key in \`~/.config/bitfab/credentials.json\`; this lists the user's orgs, switches to the chosen one, and replaces that local key. Requires authentication. Does **not** open Bitfab.
|
|
32296
32299
|
|
|
32297
|
-
**The live browser does not follow on its own.** Switching persists the new active org server-side (so future sign-ins default to it) and replaces the plugin's key, but a browser tab that's already signed in keeps showing the old org until its session is re-minted. The org actually flips in the browser on the **next** Bitfab open (a fresh session whose org check
|
|
32300
|
+
**The live browser does not follow on its own.** Switching persists the new active org server-side (so future sign-ins default to it) and replaces the plugin's key, but a browser tab that's already signed in keeps showing the old org until its session is re-minted. The org actually flips in the browser on the **next** Bitfab open (a fresh session whose org check sets the active organization in the browser) or when the user picks the org from the in-app org switcher.
|
|
32298
32301
|
|
|
32299
32302
|
**The plugin key and the app's runtime key are separate.** Switching replaces only the plugin's credential in \`~/.config/bitfab/credentials.json\`. The \`BITFAB_API_KEY\` your application reads at runtime (from a \`.env\`-style file) is untouched, so traces your code sends keep landing in the **old** org until that key is updated too. The last step offers to do that.`,
|
|
32300
32303
|
steps: [
|
|
@@ -32327,7 +32330,7 @@ If **already authenticated**, continue to step {{step:switch-org/pick-org}}. If
|
|
|
32327
32330
|
kind: "branch",
|
|
32328
32331
|
toolCalls: ["listOrganizations", "ask"],
|
|
32329
32332
|
title: "List the orgs and choose a target",
|
|
32330
|
-
body: `Call {{tool:listOrganizations}} to list the organizations the signed-in user belongs to. Each entry has a name, the user's role, an \`id:\` (the \`
|
|
32333
|
+
body: `Call {{tool:listOrganizations}} to list the organizations the signed-in user belongs to. Each entry has a name, the user's role, an \`id:\` (the \`authOrganizationId\`), and the org the plugin uses now is marked \`[current]\`.
|
|
32331
32334
|
|
|
32332
32335
|
Choose the target org:
|
|
32333
32336
|
- **If the user already named an org** (in their request), match it case-insensitively by name against the list and use that org's \`id\`. If the name matches none, or matches more than one, fall through to asking.
|
|
@@ -32352,15 +32355,15 @@ Only ever use an \`id\` value returned by {{tool:listOrganizations}}; never inve
|
|
|
32352
32355
|
toolCalls: ["bash"],
|
|
32353
32356
|
commandCalls: ["switchOrg"],
|
|
32354
32357
|
title: "Switch and confirm",
|
|
32355
|
-
body: `Switch to the chosen org by passing its \`
|
|
32358
|
+
body: `Switch to the chosen org by passing its \`authOrganizationId\`:
|
|
32356
32359
|
|
|
32357
32360
|
\`\`\`bash
|
|
32358
|
-
{{command:switchOrg}} <
|
|
32361
|
+
{{command:switchOrg}} <authOrganizationId>
|
|
32359
32362
|
\`\`\`
|
|
32360
32363
|
|
|
32361
32364
|
The command prints one JSON line; act on it:
|
|
32362
|
-
- \`{"event":"switched","status":"switched"|"already-aligned","
|
|
32363
|
-
- \`{"event":"not-member","
|
|
32365
|
+
- \`{"event":"switched","status":"switched"|"already-aligned","authOrganizationId":"...","organizationName":"...","apiKey":"..."}\`: success. The plugin now reads and writes that org and its API key has been replaced locally. Tell the user in one line: the plugin is now connected to **<organizationName>**. Then tell them to select **<organizationName>** with the in-app org switcher to align their browser with the plugin. Opening a plugin page link does not change the browser's active organization. Hold on to the \`apiKey\` value from this JSON; the next step uses it to sync the app's local key, and you must never echo that value to the user.
|
|
32366
|
+
- \`{"event":"not-member","authOrganizationId":"..."}\`: the user isn't a member of that org. Report it; do not retry.
|
|
32364
32367
|
- \`{"event":"error","reason":"..."}\`: report the reason.
|
|
32365
32368
|
|
|
32366
32369
|
Do not print or ask for the API key, and do not surface the \`apiKey\` value to the user; the command replaces the plugin's copy for you and hands you that value solely for the next step.
|
package/package.json
CHANGED