@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 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 read trie://context at conversation start.
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
- Read trie://context at conversation start for hot zones and recent signals.
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>
@@ -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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@triedotdev/mcp",
3
- "version": "1.0.175",
3
+ "version": "1.0.176",
4
4
  "description": "Trie cloud context bridge for Cursor and Claude Code.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",