@tabbio-technologies/cli 1.2.8 → 1.3.1
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/CHANGELOG.md +47 -0
- package/README.md +86 -19
- package/dist/chunks/{chunk-7LNC3FIV.js → chunk-GGJEDG3P.js} +95 -14
- package/dist/chunks/{chunk-7LNC3FIV.js.map → chunk-GGJEDG3P.js.map} +4 -4
- package/dist/chunks/{chunk-Y6GWIFHI.js → chunk-KBIQKZUK.js} +3 -53
- package/dist/chunks/chunk-KBIQKZUK.js.map +7 -0
- package/dist/chunks/{chunk-QVR5KIEQ.js → chunk-KHLGZ5IV.js} +1796 -244
- package/dist/chunks/chunk-KHLGZ5IV.js.map +7 -0
- package/dist/chunks/{chunk-NAWA6NCZ.js → chunk-NRFVKK3S.js} +37 -96
- package/dist/chunks/chunk-NRFVKK3S.js.map +7 -0
- package/dist/chunks/chunk-TP3CRQJD.js +106 -0
- package/dist/chunks/chunk-TP3CRQJD.js.map +7 -0
- package/dist/chunks/{entry-WENOOT6W.js → entry-ZAXWZSEE.js} +2023 -770
- package/dist/chunks/entry-ZAXWZSEE.js.map +7 -0
- package/dist/chunks/{mount-NGUARMCL.js → mount-36JUVX3R.js} +3 -2
- package/dist/chunks/{mount-NGUARMCL.js.map → mount-36JUVX3R.js.map} +1 -1
- package/dist/chunks/{program-O2BA5L6Z.js → program-J6GENE2V.js} +314 -375
- package/dist/chunks/program-J6GENE2V.js.map +7 -0
- package/dist/chunks/{status-I5UAQPBY.js → status-2C7BECKK.js} +3 -3
- package/dist/cli.js +1 -1
- package/package.json +4 -8
- package/dist/chunks/chunk-NAWA6NCZ.js.map +0 -7
- package/dist/chunks/chunk-QVR5KIEQ.js.map +0 -7
- package/dist/chunks/chunk-Y6GWIFHI.js.map +0 -7
- package/dist/chunks/entry-WENOOT6W.js.map +0 -7
- package/dist/chunks/program-O2BA5L6Z.js.map +0 -7
- /package/dist/chunks/{status-I5UAQPBY.js.map → status-2C7BECKK.js.map} +0 -0
|
@@ -1,73 +1,25 @@
|
|
|
1
1
|
import { createRequire as __tabbioCreateRequire } from 'node:module';
|
|
2
2
|
const require = __tabbioCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
|
-
ApiClient,
|
|
5
4
|
CliError,
|
|
6
5
|
ExitCode,
|
|
7
|
-
McpSession,
|
|
8
6
|
configPaths,
|
|
7
|
+
createCommandContext,
|
|
9
8
|
describeMcpBearer,
|
|
10
9
|
fingerprint,
|
|
11
|
-
getGlobalOptions,
|
|
12
10
|
getMcpAccessState,
|
|
13
11
|
heading,
|
|
14
|
-
isInteractive,
|
|
15
|
-
loadCredentials,
|
|
16
12
|
notSignedInError,
|
|
17
13
|
printJson,
|
|
18
14
|
printKeyValues,
|
|
19
15
|
readCachedCatalog,
|
|
20
16
|
relativeTime,
|
|
21
|
-
resolveProfileWithSources,
|
|
22
|
-
setGlobalOptions,
|
|
23
17
|
writeOut
|
|
24
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-GGJEDG3P.js";
|
|
25
19
|
import {
|
|
26
20
|
theme
|
|
27
21
|
} from "./chunk-VHHZFMIF.js";
|
|
28
22
|
|
|
29
|
-
// src/core/context.ts
|
|
30
|
-
function readGlobalOptions(cmd) {
|
|
31
|
-
const raw = cmd ? cmd.optsWithGlobals() : {};
|
|
32
|
-
const current = getGlobalOptions();
|
|
33
|
-
return setGlobalOptions({
|
|
34
|
-
profile: raw.profile ?? current.profile,
|
|
35
|
-
apiUrl: raw.apiUrl ?? current.apiUrl,
|
|
36
|
-
appUrl: raw.appUrl ?? current.appUrl,
|
|
37
|
-
json: Boolean(raw.json ?? current.json),
|
|
38
|
-
color: raw.color ?? current.color,
|
|
39
|
-
debug: Boolean(raw.debug ?? current.debug),
|
|
40
|
-
yes: Boolean(raw.yes ?? current.yes),
|
|
41
|
-
quiet: Boolean(raw.quiet ?? current.quiet)
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
function createCommandContext(cmd) {
|
|
45
|
-
const globals = readGlobalOptions(cmd);
|
|
46
|
-
const { profile, sources } = resolveProfileWithSources({
|
|
47
|
-
profile: globals.profile,
|
|
48
|
-
apiUrl: globals.apiUrl,
|
|
49
|
-
appUrl: globals.appUrl
|
|
50
|
-
});
|
|
51
|
-
const credentials = loadCredentials(profile.name);
|
|
52
|
-
const api = new ApiClient(profile, credentials);
|
|
53
|
-
let session = null;
|
|
54
|
-
return {
|
|
55
|
-
globals,
|
|
56
|
-
profile,
|
|
57
|
-
sources,
|
|
58
|
-
credentials,
|
|
59
|
-
api,
|
|
60
|
-
interactive: isInteractive() && !globals.json,
|
|
61
|
-
mcp() {
|
|
62
|
-
session ??= McpSession.connect(profile, api.credentials ?? credentials, { api });
|
|
63
|
-
return session;
|
|
64
|
-
},
|
|
65
|
-
async close() {
|
|
66
|
-
if (session) await (await session.catch(() => null))?.close();
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
23
|
// src/commands/whoami.ts
|
|
72
24
|
function pickMe(raw) {
|
|
73
25
|
if (!raw || typeof raw.id !== "string") return null;
|
|
@@ -217,11 +169,9 @@ function registerStatusCommand(program) {
|
|
|
217
169
|
}
|
|
218
170
|
|
|
219
171
|
export {
|
|
220
|
-
readGlobalOptions,
|
|
221
|
-
createCommandContext,
|
|
222
172
|
registerWhoamiCommand,
|
|
223
173
|
collectStatus,
|
|
224
174
|
mcpSummary,
|
|
225
175
|
registerStatusCommand
|
|
226
176
|
};
|
|
227
|
-
//# sourceMappingURL=chunk-
|
|
177
|
+
//# sourceMappingURL=chunk-KBIQKZUK.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/whoami.ts", "../../src/commands/status.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Command } from 'commander';\nimport { createCommandContext } from '../core/context';\nimport { fingerprint } from '../core/credentials';\nimport { notSignedInError } from '../core/errors';\nimport { printJson, writeOut } from '../core/io';\nimport { theme } from '../ui/theme';\n\n/** Fields of `GET /api/users/me` that are safe and useful to print. */\nexport type Me = {\n id: string;\n email: string;\n name: string | null;\n username: string | null;\n role?: string | null;\n status?: string | null;\n isOnboardingCompleted?: boolean;\n};\n\nexport function pickMe(raw: Record<string, unknown> | null | undefined): Me | null {\n if (!raw || typeof raw.id !== 'string') return null;\n const str = (value: unknown) => (typeof value === 'string' ? value : null);\n return {\n id: raw.id,\n email: str(raw.email) ?? '',\n name: str(raw.name),\n username: str(raw.username),\n role: str(raw.role),\n status: str(raw.status),\n ...(typeof raw.isOnboardingCompleted === 'boolean' ? { isOnboardingCompleted: raw.isOnboardingCompleted } : {}),\n };\n}\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show the signed-in account')\n .action(async (_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const creds = ctx.credentials;\n if (!creds?.accessToken && !creds?.mcpToken) throw notSignedInError(ctx.profile.name);\n\n if (!creds.accessToken) {\n // MCP-only: identity is not queryable without the app session.\n if (ctx.globals.json) {\n printJson({ profile: ctx.profile.name, mode: 'mcp-token', user: creds.user ?? null, mcpToken: fingerprint(creds.mcpToken ?? '') });\n return;\n }\n writeOut(creds.user?.email ?? `Personal MCP token ${fingerprint(creds.mcpToken ?? '')}`);\n writeOut(theme.dim(' MCP-only sign-in; run `tabbio login` for full account details.'));\n return;\n }\n\n const me = pickMe(await ctx.api.json<Record<string, unknown>>('/api/users/me'));\n if (!me) throw notSignedInError(ctx.profile.name);\n if (ctx.globals.json) {\n printJson({ profile: ctx.profile.name, mode: 'session', user: me });\n return;\n }\n writeOut(me.name ? `${me.name} <${me.email}>` : me.email);\n if (me.username) writeOut(theme.dim(` @${me.username} \u00B7 profile ${ctx.profile.name}`));\n });\n}\n", "import type { Command } from 'commander';\nimport type { SubscriptionStateResult } from '@tabbio/types';\nimport { type McpAccessState, getMcpAccessState } from '../core/auth';\nimport { configPaths } from '../core/config';\nimport { type CommandContext, createCommandContext } from '../core/context';\nimport { type Credentials, fingerprint } from '../core/credentials';\nimport { CliError, ExitCode } from '../core/errors';\nimport { type KvRow, heading, printJson, printKeyValues, relativeTime, writeOut } from '../core/io';\nimport { type McpCredentialKind, describeMcpBearer, readCachedCatalog } from '../core/mcp';\nimport { theme } from '../ui/theme';\nimport { type Me, pickMe } from './whoami';\n\nexport type StatusReport = {\n profile: { name: string; source: string; apiUrl: string; appUrl: string; mcpUrl: string; configDir: string };\n signedIn: boolean;\n mode: 'session' | 'mcp-token' | 'none';\n user: Me | { id: string; email: string; name?: string | null } | null;\n plan: string | null;\n session: { token: string; expiresAt: string | null; source: string; refreshable: boolean; valid: boolean | null } | null;\n /** Credential used for MCP tool calls (never the secret itself). */\n mcp: { kind: McpCredentialKind; source: 'env' | 'store'; token: string; label: string } | null;\n pendingApprovals: number | null;\n catalog: { tools: number; fetchedAt: string; fresh: boolean } | null;\n problems: string[];\n};\n\nfunction settledError(result: PromiseSettledResult<unknown>): CliError | null {\n if (result.status === 'fulfilled') return null;\n return result.reason instanceof CliError ? result.reason : null;\n}\n\nexport async function collectStatus(ctx: CommandContext): Promise<StatusReport> {\n const { profile, credentials: creds } = ctx;\n const report: StatusReport = {\n profile: { ...profile, source: ctx.sources.name, configDir: configPaths().dir },\n signedIn: Boolean(creds?.accessToken || creds?.mcpToken),\n mode: creds?.accessToken ? 'session' : creds?.mcpToken ? 'mcp-token' : 'none',\n user: creds?.user ?? null,\n plan: null,\n session: creds?.accessToken\n ? {\n token: fingerprint(creds.accessToken),\n expiresAt: creds.accessTokenExpiresAt ?? null,\n source: creds.origin?.accessToken ?? 'store',\n refreshable: Boolean(creds.refreshToken),\n valid: null,\n }\n : null,\n mcp: mcpSummary(creds),\n pendingApprovals: null,\n catalog: null,\n problems: [],\n };\n\n const cached = readCachedCatalog(profile, creds);\n if (cached) {\n report.catalog = { tools: cached.tools.length, fetchedAt: cached.fetchedAt.toISOString(), fresh: cached.fresh };\n }\n if (!creds?.accessToken) return report;\n\n const [me, access, subscription] = await Promise.allSettled([\n ctx.api.json<Record<string, unknown>>('/api/users/me'),\n getMcpAccessState(ctx.api),\n ctx.api.json<SubscriptionStateResult>('/api/subscription/state'),\n ]);\n\n const authFailure = [me, access, subscription]\n .map(settledError)\n .find((error) => error?.exitCode === ExitCode.Auth);\n if (report.session) report.session.valid = !authFailure;\n if (authFailure) {\n report.signedIn = Boolean(creds.mcpToken);\n report.problems.push(`Session: ${authFailure.message}. Run \\`tabbio login\\`.`);\n }\n\n if (me.status === 'fulfilled') report.user = pickMe(me.value) ?? report.user;\n if (subscription.status === 'fulfilled') report.plan = subscription.value?.snapshot?.tier ?? null;\n\n if (access.status === 'fulfilled') {\n const state: McpAccessState = access.value;\n report.pendingApprovals = state.pendingApprovals?.length ?? 0;\n } else if (!authFailure) {\n const error = settledError(access);\n report.problems.push(`Approvals: ${error?.message ?? 'unavailable'}`);\n }\n return report;\n}\n\nexport function mcpSummary(creds: Credentials | null): StatusReport['mcp'] {\n const bearer = describeMcpBearer(creds);\n if (!bearer) return null;\n const envName = bearer.kind === 'personal-token' ? 'TABBIO_TOKEN' : 'TABBIO_ACCESS_TOKEN';\n const base = bearer.kind === 'app-session' ? 'app session' : `personal token ${bearer.fingerprint}`;\n return {\n kind: bearer.kind,\n source: bearer.source,\n token: bearer.fingerprint,\n label: bearer.source === 'env' ? `${base} (from ${envName})` : base,\n };\n}\n\nfunction printStatus(report: StatusReport): void {\n const user = report.user;\n const who = user ? (user.name ? `${user.name} <${user.email}>` : user.email) : undefined;\n const session = report.session;\n const rows: KvRow[] = [\n ['Profile', `${report.profile.name} ${theme.dim(`(${report.profile.source})`)}`],\n ['API', report.profile.apiUrl],\n ['MCP', report.profile.mcpUrl],\n ['Account', who ?? (report.signedIn ? theme.dim('personal MCP token (no session)') : theme.warn('not signed in'))],\n ['Plan', report.plan],\n [\n 'Session',\n session\n ? [\n session.token,\n session.source === 'env' ? 'from TABBIO_ACCESS_TOKEN' : null,\n session.expiresAt ? `expires ${relativeTime(new Date(session.expiresAt))}` : null,\n session.refreshable ? 'auto-refresh' : null,\n session.valid === false ? theme.error('expired') : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 ')\n : undefined,\n ],\n ['Tools via', report.mcp?.label],\n [\n 'Approvals',\n report.pendingApprovals === null\n ? undefined\n : report.pendingApprovals > 0\n ? `${theme.accent(`${report.pendingApprovals} pending`)} ${theme.dim('\u2192 tabbio approvals')}`\n : 'none pending',\n ],\n [\n 'Catalog',\n report.catalog\n ? `${report.catalog.tools} tools \u00B7 cached ${relativeTime(new Date(report.catalog.fetchedAt))}${report.catalog.fresh ? '' : theme.dim(' (stale)')}`\n : undefined,\n ],\n ];\n writeOut(heading('Tabbio CLI status'));\n printKeyValues(rows);\n for (const problem of report.problems) writeOut(`${theme.warn(theme.symbols.warning)} ${problem}`);\n if (!report.signedIn) writeOut(theme.dim('Run `tabbio login` to sign in.'));\n}\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show profile, account, plan, tokens (fingerprints only), approvals and catalog age')\n .action(async (_opts: unknown, cmd: Command) => {\n const ctx = createCommandContext(cmd);\n const report = await collectStatus(ctx);\n if (ctx.globals.json) printJson(report);\n else printStatus(report);\n if (!report.signedIn) process.exitCode = ExitCode.Auth;\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|