@triedotdev/mcp 1.0.175 → 1.0.176
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/cli/main.js +2 -2
- package/dist/cli/main.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/main.js
CHANGED
|
@@ -300,13 +300,13 @@ alwaysApply: true
|
|
|
300
300
|
|
|
301
301
|
Before editing any file, call the trie_check_file MCP tool with the file path.
|
|
302
302
|
If warnings are returned, summarize them before proceeding.
|
|
303
|
-
Also
|
|
303
|
+
Also call the trie_context MCP tool at conversation start (resource trie://context may not be fetchable; the tool returns equivalent data).
|
|
304
304
|
`;
|
|
305
305
|
var CLAUDE_RULE = `## Trie Cloud Context
|
|
306
306
|
|
|
307
307
|
Before editing any file, call the trie_check_file MCP tool with the file path.
|
|
308
308
|
If warnings are returned, summarize them before proceeding.
|
|
309
|
-
|
|
309
|
+
Call the trie_context MCP tool at conversation start (resource trie://context may not be fetchable; the tool returns equivalent data).
|
|
310
310
|
`;
|
|
311
311
|
function help() {
|
|
312
312
|
console.log(`Usage: trie <command>
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/main.ts","../../src/cloud/teams.ts","../../src/auth/browser-login.ts","../../src/auth/pkce.ts","../../src/auth/sanitize.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { fetchLedger } from \"../cloud/ledger.js\";\nimport { listTeams, switchTeam } from \"../cloud/teams.js\";\nimport { loadLocalConfig } from \"../config/store.js\";\nimport { loginWithBrowser } from \"../auth/browser-login.js\";\nimport { revokeSession } from \"../auth/session.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { scrubProcessArgv } from \"../auth/sanitize.js\";\n\nconst CURSOR_RULE = `---\ndescription: Trie Cloud Context - proactive risk warnings\nglobs: **/*\nalwaysApply: true\n---\n\nBefore editing any file, call the trie_check_file MCP tool with the file path.\nIf warnings are returned, summarize them before proceeding.\nAlso read trie://context at conversation start.\n`;\n\nconst CLAUDE_RULE = `## Trie Cloud Context\n\nBefore editing any file, call the trie_check_file MCP tool with the file path.\nIf warnings are returned, summarize them before proceeding.\nRead trie://context at conversation start for hot zones and recent signals.\n`;\n\nfunction help(): void {\n // eslint-disable-next-line no-console\n console.log(`Usage: trie <command>\n\nCommands:\n trie init\n trie login\n trie logout\n trie teams [list|switch <teamId>]\n trie pull [context|graph|signals|documents|ledger|all]\n trie status\n\nTip:\n If you do not have a Trie account yet, create one at https://trie.dev first.\n`);\n}\n\nasync function cmdInit(): Promise<void> {\n const rulesDir = join(process.cwd(), \".cursor\", \"rules\");\n await mkdir(rulesDir, { recursive: true });\n await writeFile(join(rulesDir, \"trie.mdc\"), CURSOR_RULE, \"utf-8\");\n\n const claudePath = join(process.cwd(), \"CLAUDE.md\");\n if (existsSync(claudePath)) {\n const append = `\\n\\n${CLAUDE_RULE}`;\n await writeFile(claudePath, append, { encoding: \"utf-8\", flag: \"a\" });\n }\n // eslint-disable-next-line no-console\n console.log(\"Proactive warnings enabled in Cursor and Claude Code.\");\n}\n\nasync function cmdLogin(): Promise<void> {\n // eslint-disable-next-line no-console\n console.log(\"If you do not have a Trie account yet, create one at https://trie.dev first.\");\n const tokens = await loginWithBrowser();\n // eslint-disable-next-line no-console\n console.log(\n `Logged in${tokens.user?.email ? ` as ${tokens.user.email}` : \"\"}${\n tokens.team?.name ? ` (team: ${tokens.team.name})` : \"\"\n }`,\n );\n}\n\nasync function cmdLogout(): Promise<void> {\n const cfg = await loadLocalConfig();\n await revokeSession(cfg.apiBaseUrl);\n // eslint-disable-next-line no-console\n console.log(\"Logged out.\");\n}\n\nasync function cmdTeams(args: string[]): Promise<void> {\n if (args[0] === \"switch\" && args[1]) {\n await switchTeam(args[1]);\n // eslint-disable-next-line no-console\n console.log(`Switched to team ${args[1]}`);\n return;\n }\n const teams = await listTeams();\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(teams, null, 2));\n}\n\nasync function cmdPull(args: string[]): Promise<void> {\n const what = args[0] || \"all\";\n const out: Record<string, unknown> = {};\n if (what === \"context\" || what === \"all\") {\n out.context = await Promise.all([fetchGraph(), fetchSignals(20), fetchDocuments()]);\n }\n if (what === \"graph\" || what === \"all\") out.graph = await fetchGraph();\n if (what === \"signals\" || what === \"all\") out.signals = await fetchSignals(20);\n if (what === \"documents\" || what === \"all\") out.documents = await fetchDocuments();\n if (what === \"ledger\" || what === \"all\") out.ledger = await fetchLedger();\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(out, null, 2));\n}\n\nasync function cmdStatus(): Promise<void> {\n const cfg = await loadLocalConfig();\n // eslint-disable-next-line no-console\n console.log(\n JSON.stringify(\n {\n apiBaseUrl: cfg.apiBaseUrl,\n activeTeamId: cfg.activeTeamId,\n activeTeamName: cfg.activeTeamName,\n userEmail: cfg.userEmail,\n cache: sessionCache.stats(),\n },\n null,\n 2,\n ),\n );\n}\n\nasync function main(): Promise<void> {\n scrubProcessArgv();\n const [, , cmd, ...args] = process.argv;\n if (!cmd || cmd === \"help\" || cmd === \"--help\" || cmd === \"-h\") {\n help();\n return;\n }\n if (cmd === \"init\") return cmdInit();\n if (cmd === \"login\") return cmdLogin();\n if (cmd === \"logout\") return cmdLogout();\n if (cmd === \"teams\") return cmdTeams(args);\n if (cmd === \"pull\") return cmdPull(args);\n if (cmd === \"status\") return cmdStatus();\n throw new Error(`Unknown command: ${cmd}`);\n}\n\nmain().catch((err) => {\n // eslint-disable-next-line no-console\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import { cloudClient } from \"./client.js\";\nimport { loadLocalConfig, saveLocalConfig } from \"../config/store.js\";\n\nexport interface Team {\n id: string;\n name: string;\n}\n\nexport async function listTeams(): Promise<Team[]> {\n const data = await cloudClient.request<{ teams?: Team[]; items?: Team[] }>(\"/api/teams\");\n return data.teams || data.items || [];\n}\n\nexport async function switchTeam(teamId: string): Promise<void> {\n const data = await cloudClient.request<{ team?: Team }>(\"/api/teams/switch\", {\n method: \"POST\",\n body: JSON.stringify({ teamId }),\n });\n const confirmedTeamId = data.team?.id;\n if (confirmedTeamId && confirmedTeamId !== teamId) {\n throw new Error(\"Server returned mismatched team selection.\");\n }\n const cfg = await loadLocalConfig();\n const nextConfig = {\n ...cfg,\n activeTeamId: confirmedTeamId || teamId,\n };\n if (data.team?.name) {\n nextConfig.activeTeamName = data.team.name;\n }\n await saveLocalConfig(nextConfig);\n}\n","import { createServer, IncomingMessage, ServerResponse } from \"node:http\";\nimport { AddressInfo } from \"node:net\";\nimport { spawn } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport { loadLocalConfig } from \"../config/store.js\";\nimport { generateCodeChallenge, generateCodeVerifier, generateStateParts, generateVerificationCode, verifyState } from \"./pkce.js\";\nimport { getMachineFingerprint, persistAuthTokens } from \"./session.js\";\nimport type { CliAuthTokens } from \"../types/index.js\";\nimport { normalizeAndValidateApiBaseUrl } from \"../config/api-base-url.js\";\n\nfunction openUrl(url: string): void {\n const command = process.platform === \"win32\" ? \"start\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n spawn(command, [url], { stdio: \"ignore\", detached: true }).unref();\n}\n\nconst CALLBACK_MAX_BODY_BYTES = 64 * 1024;\nconst ALLOWED_ORIGINS = new Set([\"https://trie.dev\", \"https://www.trie.dev\"]);\n\nclass RequestError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n }\n}\n\nfunction formatExchangeFailureHint(status: number, message?: string): string {\n const lower = (message || \"\").toLowerCase();\n if (\n status === 401 ||\n status === 403 ||\n lower.includes(\"no account\") ||\n lower.includes(\"not found\") ||\n lower.includes(\"sign up\")\n ) {\n return \"If you do not have a Trie account yet, create one at https://trie.dev and then run `trie login` again.\";\n }\n return \"Retry `trie login`, or create an account at https://trie.dev if this is your first time.\";\n}\n\nfunction writeCors(res: ServerResponse, origin: string): void {\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n res.setHeader(\"Access-Control-Allow-Methods\", \"POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n}\n\nfunction parseContentLength(req: IncomingMessage): number | null {\n const header = req.headers[\"content-length\"];\n if (!header) return null;\n const first = Array.isArray(header) ? header[0] : header;\n const parsed = Number(first);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new RequestError(\"Invalid content length\", 400);\n }\n return parsed;\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown>> {\n const contentLength = parseContentLength(req);\n if (contentLength !== null && contentLength > CALLBACK_MAX_BODY_BYTES) {\n throw new RequestError(\"Payload too large\", 413);\n }\n\n const chunks: Buffer[] = [];\n let seenBytes = 0;\n for await (const chunk of req) {\n const buffer = Buffer.from(chunk);\n chunks.push(buffer);\n seenBytes += buffer.length;\n if (seenBytes > CALLBACK_MAX_BODY_BYTES) {\n throw new RequestError(\"Payload too large\", 413);\n }\n }\n\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n try {\n return text ? (JSON.parse(text) as Record<string, unknown>) : {};\n } catch {\n throw new RequestError(\"Invalid JSON body\", 400);\n }\n}\n\nexport async function loginWithBrowser(): Promise<CliAuthTokens> {\n const cfg = await loadLocalConfig();\n const apiBaseUrl = normalizeAndValidateApiBaseUrl(cfg.apiBaseUrl);\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const { state, secret } = generateStateParts();\n const code = generateVerificationCode();\n const callbackToken = crypto.randomBytes(16).toString(\"hex\");\n const callbackPath = `/callback/${callbackToken}`;\n\n let used = false;\n let timeout: NodeJS.Timeout | undefined;\n let closeServer: (() => Promise<void>) | undefined;\n\n const tokenPromise = new Promise<CliAuthTokens>((resolve, reject) => {\n const server = createServer(async (req, res) => {\n const reqOrigin = req.headers.origin || \"\";\n const originAllowed = ALLOWED_ORIGINS.has(reqOrigin);\n if (originAllowed) {\n writeCors(res, reqOrigin);\n }\n if (req.method === \"OPTIONS\") {\n if (!originAllowed) {\n res.statusCode = 403;\n res.end(\"Invalid origin\");\n return;\n }\n res.statusCode = 204;\n res.end();\n return;\n }\n if (used) {\n res.statusCode = 403;\n res.end(\"Callback already used\");\n return;\n }\n if (req.method !== \"POST\" || req.url !== callbackPath) {\n res.statusCode = 405;\n res.end(\"Method not allowed\");\n return;\n }\n if (!originAllowed) {\n res.statusCode = 403;\n res.end(\"Invalid origin\");\n return;\n }\n if (!(req.headers[\"content-type\"] || \"\").includes(\"application/json\")) {\n res.statusCode = 400;\n res.end(\"Invalid content type\");\n return;\n }\n try {\n const body = await readJsonBody(req);\n const returnedState = String(body.state || \"\");\n const firebaseToken = String(body.firebase_token || \"\");\n const verificationCode = String(body.code || \"\");\n if (!verifyState(returnedState, secret)) {\n res.statusCode = 403;\n res.end(\"Invalid state\");\n return;\n }\n if (verificationCode && verificationCode !== code) {\n res.statusCode = 403;\n res.end(\"Invalid verification code\");\n return;\n }\n used = true;\n const exchangeRes = await fetch(`${apiBaseUrl}/api/auth/cli/exchange`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${firebaseToken}`,\n },\n body: JSON.stringify({\n firebase_token: firebaseToken,\n code_verifier: verifier,\n code_challenge: challenge,\n machine_fingerprint: getMachineFingerprint(),\n }),\n });\n if (!exchangeRes.ok) {\n const payload = (await exchangeRes.json().catch(() => ({}))) as { error?: string; message?: string };\n const apiMessage = payload.error || payload.message;\n const baseMessage = apiMessage\n ? `Auth exchange failed (${exchangeRes.status}): ${apiMessage}`\n : `Auth exchange failed (${exchangeRes.status})`;\n throw new RequestError(\n `${baseMessage}. ${formatExchangeFailureHint(exchangeRes.status, apiMessage)}`,\n exchangeRes.status\n );\n }\n const tokens = (await exchangeRes.json()) as CliAuthTokens;\n await persistAuthTokens(tokens);\n res.statusCode = 200;\n res.end(\"Authorized. You can return to your terminal.\");\n resolve(tokens);\n } catch (err) {\n if (err instanceof RequestError) {\n res.statusCode = err.statusCode;\n res.end(err.message);\n } else {\n res.statusCode = 500;\n res.end(\"Authorization failed\");\n }\n reject(err);\n } finally {\n await closeServer?.();\n }\n }).listen(0, \"127.0.0.1\");\n server.requestTimeout = 15_000;\n server.headersTimeout = 10_000;\n server.keepAliveTimeout = 5_000;\n\n closeServer = async () => {\n if (timeout) clearTimeout(timeout);\n await new Promise<void>((done) => server.close(() => done()));\n };\n\n server.on(\"listening\", async () => {\n const port = (server.address() as AddressInfo).port;\n const loginUrl = new URL(\"/cli-auth\", \"https://trie.dev\");\n loginUrl.searchParams.set(\"challenge\", challenge);\n loginUrl.searchParams.set(\"state\", state);\n loginUrl.searchParams.set(\"port\", String(port));\n loginUrl.searchParams.set(\"code\", code);\n loginUrl.searchParams.set(\"callback_path\", callbackPath);\n\n // eslint-disable-next-line no-console\n console.log(`Verification code: ${code}`);\n // eslint-disable-next-line no-console\n console.log(`Opening browser: ${loginUrl.origin}${loginUrl.pathname}`);\n openUrl(loginUrl.toString());\n });\n\n timeout = setTimeout(async () => {\n await closeServer?.();\n reject(new Error(\"Login timed out after 5 minutes.\"));\n }, 5 * 60_000);\n });\n\n return tokenPromise;\n}\n","import crypto from \"node:crypto\";\n\nfunction base64Url(input: Buffer): string {\n return input\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nexport function generateCodeVerifier(): string {\n return base64Url(crypto.randomBytes(64));\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return base64Url(crypto.createHash(\"sha256\").update(verifier).digest());\n}\n\nexport function generateVerificationCode(): string {\n const chars = \"ABCDEFGHJKLMNPQRSTUVWXYZ23456789\";\n const bytes = crypto.randomBytes(8);\n let out = \"\";\n for (const b of bytes) {\n out += chars[b % chars.length];\n }\n return `${out.slice(0, 4)}-${out.slice(4)}`;\n}\n\nexport function generateStateParts(): { nonce: string; secret: string; state: string } {\n const nonce = base64Url(crypto.randomBytes(32));\n const timestamp = Date.now().toString();\n const payload = `${nonce}.${timestamp}`;\n const secret = base64Url(crypto.randomBytes(32));\n const sig = base64Url(crypto.createHmac(\"sha256\", secret).update(payload).digest());\n return { nonce: payload, secret, state: `${payload}.${sig}` };\n}\n\nexport function verifyState(\n state: string,\n secret: string,\n maxAgeMs = 5 * 60_000,\n): boolean {\n const parts = state.split(\".\");\n if (parts.length < 3) return false;\n const ts = Number(parts[1]);\n if (!Number.isFinite(ts) || Date.now() - ts > maxAgeMs) return false;\n const payload = `${parts[0]}.${parts[1]}`;\n const providedSig = parts.slice(2).join(\".\");\n const expectedSig = base64Url(\n crypto.createHmac(\"sha256\", secret).update(payload).digest(),\n );\n const a = Buffer.from(providedSig);\n const b = Buffer.from(expectedSig);\n if (a.length !== b.length) return false;\n return crypto.timingSafeEqual(a, b);\n}\n","const REDACT_KEYS = [\n \"token\",\n \"access_token\",\n \"refresh_token\",\n \"authorization\",\n \"cookie\",\n];\n\nexport function sanitizeForLog<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => sanitizeForLog(v)) as T;\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (REDACT_KEYS.includes(k.toLowerCase())) {\n out[k] = \"[REDACTED]\";\n } else {\n out[k] = sanitizeForLog(v);\n }\n }\n return out as T;\n }\n return value;\n}\n\nexport function scrubProcessArgv(): void {\n process.argv = process.argv.map((arg) => {\n if (arg.startsWith(\"--token=\")) return \"--token=[REDACTED]\";\n if (arg.startsWith(\"--access_token=\")) return \"--access_token=[REDACTED]\";\n return arg;\n });\n}\n"],"mappings":"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","names":["crypto","crypto"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/main.ts","../../src/cloud/teams.ts","../../src/auth/browser-login.ts","../../src/auth/pkce.ts","../../src/auth/sanitize.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { fetchLedger } from \"../cloud/ledger.js\";\nimport { listTeams, switchTeam } from \"../cloud/teams.js\";\nimport { loadLocalConfig } from \"../config/store.js\";\nimport { loginWithBrowser } from \"../auth/browser-login.js\";\nimport { revokeSession } from \"../auth/session.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { scrubProcessArgv } from \"../auth/sanitize.js\";\n\nconst CURSOR_RULE = `---\ndescription: Trie Cloud Context - proactive risk warnings\nglobs: **/*\nalwaysApply: true\n---\n\nBefore editing any file, call the trie_check_file MCP tool with the file path.\nIf warnings are returned, summarize them before proceeding.\nAlso call the trie_context MCP tool at conversation start (resource trie://context may not be fetchable; the tool returns equivalent data).\n`;\n\nconst CLAUDE_RULE = `## Trie Cloud Context\n\nBefore editing any file, call the trie_check_file MCP tool with the file path.\nIf warnings are returned, summarize them before proceeding.\nCall the trie_context MCP tool at conversation start (resource trie://context may not be fetchable; the tool returns equivalent data).\n`;\n\nfunction help(): void {\n // eslint-disable-next-line no-console\n console.log(`Usage: trie <command>\n\nCommands:\n trie init\n trie login\n trie logout\n trie teams [list|switch <teamId>]\n trie pull [context|graph|signals|documents|ledger|all]\n trie status\n\nTip:\n If you do not have a Trie account yet, create one at https://trie.dev first.\n`);\n}\n\nasync function cmdInit(): Promise<void> {\n const rulesDir = join(process.cwd(), \".cursor\", \"rules\");\n await mkdir(rulesDir, { recursive: true });\n await writeFile(join(rulesDir, \"trie.mdc\"), CURSOR_RULE, \"utf-8\");\n\n const claudePath = join(process.cwd(), \"CLAUDE.md\");\n if (existsSync(claudePath)) {\n const append = `\\n\\n${CLAUDE_RULE}`;\n await writeFile(claudePath, append, { encoding: \"utf-8\", flag: \"a\" });\n }\n // eslint-disable-next-line no-console\n console.log(\"Proactive warnings enabled in Cursor and Claude Code.\");\n}\n\nasync function cmdLogin(): Promise<void> {\n // eslint-disable-next-line no-console\n console.log(\"If you do not have a Trie account yet, create one at https://trie.dev first.\");\n const tokens = await loginWithBrowser();\n // eslint-disable-next-line no-console\n console.log(\n `Logged in${tokens.user?.email ? ` as ${tokens.user.email}` : \"\"}${\n tokens.team?.name ? ` (team: ${tokens.team.name})` : \"\"\n }`,\n );\n}\n\nasync function cmdLogout(): Promise<void> {\n const cfg = await loadLocalConfig();\n await revokeSession(cfg.apiBaseUrl);\n // eslint-disable-next-line no-console\n console.log(\"Logged out.\");\n}\n\nasync function cmdTeams(args: string[]): Promise<void> {\n if (args[0] === \"switch\" && args[1]) {\n await switchTeam(args[1]);\n // eslint-disable-next-line no-console\n console.log(`Switched to team ${args[1]}`);\n return;\n }\n const teams = await listTeams();\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(teams, null, 2));\n}\n\nasync function cmdPull(args: string[]): Promise<void> {\n const what = args[0] || \"all\";\n const out: Record<string, unknown> = {};\n if (what === \"context\" || what === \"all\") {\n out.context = await Promise.all([fetchGraph(), fetchSignals(20), fetchDocuments()]);\n }\n if (what === \"graph\" || what === \"all\") out.graph = await fetchGraph();\n if (what === \"signals\" || what === \"all\") out.signals = await fetchSignals(20);\n if (what === \"documents\" || what === \"all\") out.documents = await fetchDocuments();\n if (what === \"ledger\" || what === \"all\") out.ledger = await fetchLedger();\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(out, null, 2));\n}\n\nasync function cmdStatus(): Promise<void> {\n const cfg = await loadLocalConfig();\n // eslint-disable-next-line no-console\n console.log(\n JSON.stringify(\n {\n apiBaseUrl: cfg.apiBaseUrl,\n activeTeamId: cfg.activeTeamId,\n activeTeamName: cfg.activeTeamName,\n userEmail: cfg.userEmail,\n cache: sessionCache.stats(),\n },\n null,\n 2,\n ),\n );\n}\n\nasync function main(): Promise<void> {\n scrubProcessArgv();\n const [, , cmd, ...args] = process.argv;\n if (!cmd || cmd === \"help\" || cmd === \"--help\" || cmd === \"-h\") {\n help();\n return;\n }\n if (cmd === \"init\") return cmdInit();\n if (cmd === \"login\") return cmdLogin();\n if (cmd === \"logout\") return cmdLogout();\n if (cmd === \"teams\") return cmdTeams(args);\n if (cmd === \"pull\") return cmdPull(args);\n if (cmd === \"status\") return cmdStatus();\n throw new Error(`Unknown command: ${cmd}`);\n}\n\nmain().catch((err) => {\n // eslint-disable-next-line no-console\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import { cloudClient } from \"./client.js\";\nimport { loadLocalConfig, saveLocalConfig } from \"../config/store.js\";\n\nexport interface Team {\n id: string;\n name: string;\n}\n\nexport async function listTeams(): Promise<Team[]> {\n const data = await cloudClient.request<{ teams?: Team[]; items?: Team[] }>(\"/api/teams\");\n return data.teams || data.items || [];\n}\n\nexport async function switchTeam(teamId: string): Promise<void> {\n const data = await cloudClient.request<{ team?: Team }>(\"/api/teams/switch\", {\n method: \"POST\",\n body: JSON.stringify({ teamId }),\n });\n const confirmedTeamId = data.team?.id;\n if (confirmedTeamId && confirmedTeamId !== teamId) {\n throw new Error(\"Server returned mismatched team selection.\");\n }\n const cfg = await loadLocalConfig();\n const nextConfig = {\n ...cfg,\n activeTeamId: confirmedTeamId || teamId,\n };\n if (data.team?.name) {\n nextConfig.activeTeamName = data.team.name;\n }\n await saveLocalConfig(nextConfig);\n}\n","import { createServer, IncomingMessage, ServerResponse } from \"node:http\";\nimport { AddressInfo } from \"node:net\";\nimport { spawn } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport { loadLocalConfig } from \"../config/store.js\";\nimport { generateCodeChallenge, generateCodeVerifier, generateStateParts, generateVerificationCode, verifyState } from \"./pkce.js\";\nimport { getMachineFingerprint, persistAuthTokens } from \"./session.js\";\nimport type { CliAuthTokens } from \"../types/index.js\";\nimport { normalizeAndValidateApiBaseUrl } from \"../config/api-base-url.js\";\n\nfunction openUrl(url: string): void {\n const command = process.platform === \"win32\" ? \"start\" : process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n spawn(command, [url], { stdio: \"ignore\", detached: true }).unref();\n}\n\nconst CALLBACK_MAX_BODY_BYTES = 64 * 1024;\nconst ALLOWED_ORIGINS = new Set([\"https://trie.dev\", \"https://www.trie.dev\"]);\n\nclass RequestError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n }\n}\n\nfunction formatExchangeFailureHint(status: number, message?: string): string {\n const lower = (message || \"\").toLowerCase();\n if (\n status === 401 ||\n status === 403 ||\n lower.includes(\"no account\") ||\n lower.includes(\"not found\") ||\n lower.includes(\"sign up\")\n ) {\n return \"If you do not have a Trie account yet, create one at https://trie.dev and then run `trie login` again.\";\n }\n return \"Retry `trie login`, or create an account at https://trie.dev if this is your first time.\";\n}\n\nfunction writeCors(res: ServerResponse, origin: string): void {\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n res.setHeader(\"Access-Control-Allow-Methods\", \"POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n}\n\nfunction parseContentLength(req: IncomingMessage): number | null {\n const header = req.headers[\"content-length\"];\n if (!header) return null;\n const first = Array.isArray(header) ? header[0] : header;\n const parsed = Number(first);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new RequestError(\"Invalid content length\", 400);\n }\n return parsed;\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown>> {\n const contentLength = parseContentLength(req);\n if (contentLength !== null && contentLength > CALLBACK_MAX_BODY_BYTES) {\n throw new RequestError(\"Payload too large\", 413);\n }\n\n const chunks: Buffer[] = [];\n let seenBytes = 0;\n for await (const chunk of req) {\n const buffer = Buffer.from(chunk);\n chunks.push(buffer);\n seenBytes += buffer.length;\n if (seenBytes > CALLBACK_MAX_BODY_BYTES) {\n throw new RequestError(\"Payload too large\", 413);\n }\n }\n\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n try {\n return text ? (JSON.parse(text) as Record<string, unknown>) : {};\n } catch {\n throw new RequestError(\"Invalid JSON body\", 400);\n }\n}\n\nexport async function loginWithBrowser(): Promise<CliAuthTokens> {\n const cfg = await loadLocalConfig();\n const apiBaseUrl = normalizeAndValidateApiBaseUrl(cfg.apiBaseUrl);\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const { state, secret } = generateStateParts();\n const code = generateVerificationCode();\n const callbackToken = crypto.randomBytes(16).toString(\"hex\");\n const callbackPath = `/callback/${callbackToken}`;\n\n let used = false;\n let timeout: NodeJS.Timeout | undefined;\n let closeServer: (() => Promise<void>) | undefined;\n\n const tokenPromise = new Promise<CliAuthTokens>((resolve, reject) => {\n const server = createServer(async (req, res) => {\n const reqOrigin = req.headers.origin || \"\";\n const originAllowed = ALLOWED_ORIGINS.has(reqOrigin);\n if (originAllowed) {\n writeCors(res, reqOrigin);\n }\n if (req.method === \"OPTIONS\") {\n if (!originAllowed) {\n res.statusCode = 403;\n res.end(\"Invalid origin\");\n return;\n }\n res.statusCode = 204;\n res.end();\n return;\n }\n if (used) {\n res.statusCode = 403;\n res.end(\"Callback already used\");\n return;\n }\n if (req.method !== \"POST\" || req.url !== callbackPath) {\n res.statusCode = 405;\n res.end(\"Method not allowed\");\n return;\n }\n if (!originAllowed) {\n res.statusCode = 403;\n res.end(\"Invalid origin\");\n return;\n }\n if (!(req.headers[\"content-type\"] || \"\").includes(\"application/json\")) {\n res.statusCode = 400;\n res.end(\"Invalid content type\");\n return;\n }\n try {\n const body = await readJsonBody(req);\n const returnedState = String(body.state || \"\");\n const firebaseToken = String(body.firebase_token || \"\");\n const verificationCode = String(body.code || \"\");\n if (!verifyState(returnedState, secret)) {\n res.statusCode = 403;\n res.end(\"Invalid state\");\n return;\n }\n if (verificationCode && verificationCode !== code) {\n res.statusCode = 403;\n res.end(\"Invalid verification code\");\n return;\n }\n used = true;\n const exchangeRes = await fetch(`${apiBaseUrl}/api/auth/cli/exchange`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${firebaseToken}`,\n },\n body: JSON.stringify({\n firebase_token: firebaseToken,\n code_verifier: verifier,\n code_challenge: challenge,\n machine_fingerprint: getMachineFingerprint(),\n }),\n });\n if (!exchangeRes.ok) {\n const payload = (await exchangeRes.json().catch(() => ({}))) as { error?: string; message?: string };\n const apiMessage = payload.error || payload.message;\n const baseMessage = apiMessage\n ? `Auth exchange failed (${exchangeRes.status}): ${apiMessage}`\n : `Auth exchange failed (${exchangeRes.status})`;\n throw new RequestError(\n `${baseMessage}. ${formatExchangeFailureHint(exchangeRes.status, apiMessage)}`,\n exchangeRes.status\n );\n }\n const tokens = (await exchangeRes.json()) as CliAuthTokens;\n await persistAuthTokens(tokens);\n res.statusCode = 200;\n res.end(\"Authorized. You can return to your terminal.\");\n resolve(tokens);\n } catch (err) {\n if (err instanceof RequestError) {\n res.statusCode = err.statusCode;\n res.end(err.message);\n } else {\n res.statusCode = 500;\n res.end(\"Authorization failed\");\n }\n reject(err);\n } finally {\n await closeServer?.();\n }\n }).listen(0, \"127.0.0.1\");\n server.requestTimeout = 15_000;\n server.headersTimeout = 10_000;\n server.keepAliveTimeout = 5_000;\n\n closeServer = async () => {\n if (timeout) clearTimeout(timeout);\n await new Promise<void>((done) => server.close(() => done()));\n };\n\n server.on(\"listening\", async () => {\n const port = (server.address() as AddressInfo).port;\n const loginUrl = new URL(\"/cli-auth\", \"https://trie.dev\");\n loginUrl.searchParams.set(\"challenge\", challenge);\n loginUrl.searchParams.set(\"state\", state);\n loginUrl.searchParams.set(\"port\", String(port));\n loginUrl.searchParams.set(\"code\", code);\n loginUrl.searchParams.set(\"callback_path\", callbackPath);\n\n // eslint-disable-next-line no-console\n console.log(`Verification code: ${code}`);\n // eslint-disable-next-line no-console\n console.log(`Opening browser: ${loginUrl.origin}${loginUrl.pathname}`);\n openUrl(loginUrl.toString());\n });\n\n timeout = setTimeout(async () => {\n await closeServer?.();\n reject(new Error(\"Login timed out after 5 minutes.\"));\n }, 5 * 60_000);\n });\n\n return tokenPromise;\n}\n","import crypto from \"node:crypto\";\n\nfunction base64Url(input: Buffer): string {\n return input\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nexport function generateCodeVerifier(): string {\n return base64Url(crypto.randomBytes(64));\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return base64Url(crypto.createHash(\"sha256\").update(verifier).digest());\n}\n\nexport function generateVerificationCode(): string {\n const chars = \"ABCDEFGHJKLMNPQRSTUVWXYZ23456789\";\n const bytes = crypto.randomBytes(8);\n let out = \"\";\n for (const b of bytes) {\n out += chars[b % chars.length];\n }\n return `${out.slice(0, 4)}-${out.slice(4)}`;\n}\n\nexport function generateStateParts(): { nonce: string; secret: string; state: string } {\n const nonce = base64Url(crypto.randomBytes(32));\n const timestamp = Date.now().toString();\n const payload = `${nonce}.${timestamp}`;\n const secret = base64Url(crypto.randomBytes(32));\n const sig = base64Url(crypto.createHmac(\"sha256\", secret).update(payload).digest());\n return { nonce: payload, secret, state: `${payload}.${sig}` };\n}\n\nexport function verifyState(\n state: string,\n secret: string,\n maxAgeMs = 5 * 60_000,\n): boolean {\n const parts = state.split(\".\");\n if (parts.length < 3) return false;\n const ts = Number(parts[1]);\n if (!Number.isFinite(ts) || Date.now() - ts > maxAgeMs) return false;\n const payload = `${parts[0]}.${parts[1]}`;\n const providedSig = parts.slice(2).join(\".\");\n const expectedSig = base64Url(\n crypto.createHmac(\"sha256\", secret).update(payload).digest(),\n );\n const a = Buffer.from(providedSig);\n const b = Buffer.from(expectedSig);\n if (a.length !== b.length) return false;\n return crypto.timingSafeEqual(a, b);\n}\n","const REDACT_KEYS = [\n \"token\",\n \"access_token\",\n \"refresh_token\",\n \"authorization\",\n \"cookie\",\n];\n\nexport function sanitizeForLog<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => sanitizeForLog(v)) as T;\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (REDACT_KEYS.includes(k.toLowerCase())) {\n out[k] = \"[REDACTED]\";\n } else {\n out[k] = sanitizeForLog(v);\n }\n }\n return out as T;\n }\n return value;\n}\n\nexport function scrubProcessArgv(): void {\n process.argv = process.argv.map((arg) => {\n if (arg.startsWith(\"--token=\")) return \"--token=[REDACTED]\";\n if (arg.startsWith(\"--access_token=\")) return \"--access_token=[REDACTED]\";\n return arg;\n });\n}\n"],"mappings":"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","names":["crypto","crypto"]}
|