@triedotdev/mcp 1.0.173 → 1.0.175
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/README.md +4 -2
- package/dist/{chunk-QR64Y5TI.js → chunk-7VFBLI2G.js} +9 -2
- package/dist/chunk-7VFBLI2G.js.map +1 -0
- package/dist/{chunk-2YXOBNKW.js → chunk-MNYQJQRJ.js} +5 -5
- package/dist/chunk-MNYQJQRJ.js.map +1 -0
- package/dist/cli/main.js +19 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/server/mcp-server.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-2YXOBNKW.js.map +0 -1
- package/dist/chunk-QR64Y5TI.js.map +0 -1
package/README.md
CHANGED
|
@@ -33,6 +33,8 @@ trie login
|
|
|
33
33
|
|
|
34
34
|
This opens a browser to sign in at trie.dev and authorize the CLI. After login, the MCP server can access your team's cloud context.
|
|
35
35
|
|
|
36
|
+
If you do not have a Trie account yet, create one first at [trie.dev](https://trie.dev), then run `trie login`.
|
|
37
|
+
|
|
36
38
|
### MCP Setup (Cursor / Claude Code)
|
|
37
39
|
|
|
38
40
|
Add to your MCP settings:
|
|
@@ -41,8 +43,8 @@ Add to your MCP settings:
|
|
|
41
43
|
{
|
|
42
44
|
"mcpServers": {
|
|
43
45
|
"trie": {
|
|
44
|
-
"command": "
|
|
45
|
-
"args": [
|
|
46
|
+
"command": "mcp",
|
|
47
|
+
"args": [],
|
|
46
48
|
"env": {}
|
|
47
49
|
}
|
|
48
50
|
}
|
|
@@ -264,8 +264,15 @@ async function refreshAccessToken(apiBaseUrl, refreshToken) {
|
|
|
264
264
|
if (!res.ok) {
|
|
265
265
|
if (res.status === 401 || res.status === 403) {
|
|
266
266
|
await clearCredentials();
|
|
267
|
+
throw new Error("Session expired. Run `trie login`.");
|
|
267
268
|
}
|
|
268
|
-
|
|
269
|
+
let detail = `status ${res.status}`;
|
|
270
|
+
try {
|
|
271
|
+
const body = await res.json();
|
|
272
|
+
if (body?.error) detail = body.error;
|
|
273
|
+
} catch {
|
|
274
|
+
}
|
|
275
|
+
throw new Error(`Token refresh failed (${detail}). Try again or run \`trie login\`.`);
|
|
269
276
|
}
|
|
270
277
|
const data = await res.json();
|
|
271
278
|
setAccessToken(data.access_token, data.expires_in);
|
|
@@ -360,4 +367,4 @@ export {
|
|
|
360
367
|
fetchDocuments,
|
|
361
368
|
fetchLedger
|
|
362
369
|
};
|
|
363
|
-
//# sourceMappingURL=chunk-
|
|
370
|
+
//# sourceMappingURL=chunk-7VFBLI2G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cache/session-cache.ts","../src/config/store.ts","../src/auth/session.ts","../src/auth/keychain.ts","../src/config/api-base-url.ts","../src/cloud/client.ts","../src/cloud/graph.ts","../src/cloud/signals.ts","../src/cloud/documents.ts","../src/cloud/ledger.ts"],"sourcesContent":["type CacheEntry<T> = {\n fetchedAt: number;\n data: T;\n};\n\nexport class SessionCache {\n private readonly cache = new Map<string, CacheEntry<unknown>>();\n\n async get<T>(key: string, ttlMs: number, fetcher: () => Promise<T>): Promise<T> {\n const hit = this.cache.get(key) as CacheEntry<T> | undefined;\n if (hit && Date.now() - hit.fetchedAt < ttlMs) {\n return hit.data;\n }\n const data = await fetcher();\n this.cache.set(key, { fetchedAt: Date.now(), data });\n return data;\n }\n\n invalidate(key: string): void {\n this.cache.delete(key);\n }\n\n invalidateAll(): void {\n this.cache.clear();\n }\n\n stats(): { size: number; keys: string[] } {\n return { size: this.cache.size, keys: [...this.cache.keys()] };\n }\n}\n\nexport const sessionCache = new SessionCache();\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface LocalConfig {\n apiBaseUrl: string;\n activeTeamId?: string;\n activeTeamName?: string;\n userEmail?: string;\n}\n\nconst DEFAULT_CONFIG: LocalConfig = {\n apiBaseUrl: process.env.TRIE_API_BASE_URL || \"https://trie-api.vercel.app\",\n};\n\nexport function getConfigDir(): string {\n return join(homedir(), \".trie\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(getConfigDir(), { recursive: true });\n}\n\nexport async function loadLocalConfig(): Promise<LocalConfig> {\n const path = getConfigPath();\n if (!existsSync(path)) {\n return { ...DEFAULT_CONFIG };\n }\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<LocalConfig>;\n return { ...DEFAULT_CONFIG, ...parsed };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport async function saveLocalConfig(next: LocalConfig): Promise<void> {\n await ensureConfigDir();\n const path = getConfigPath();\n await writeFile(path, `${JSON.stringify(next, null, 2)}\\n`, \"utf-8\");\n}\n","import { createHash } from \"node:crypto\";\nimport { hostname, platform, userInfo } from \"node:os\";\nimport { clearCredentials, loadCredentials, saveCredentials } from \"./keychain.js\";\nimport type { CliAuthTokens } from \"../types/index.js\";\nimport { loadLocalConfig, saveLocalConfig } from \"../config/store.js\";\nimport { normalizeAndValidateApiBaseUrl } from \"../config/api-base-url.js\";\n\nlet accessTokenCache: { token: string; expiresAt: number } | null = null;\nlet refreshAttempts: number[] = [];\n\nexport function getMachineFingerprint(): string {\n return createHash(\"sha256\")\n .update(`${hostname()}:${userInfo().username}:${platform()}:${process.arch}`)\n .digest(\"hex\");\n}\n\nfunction allowRefreshAttempt(): boolean {\n const now = Date.now();\n refreshAttempts = refreshAttempts.filter((t) => now - t < 60_000);\n if (refreshAttempts.length >= 5) return false;\n refreshAttempts.push(now);\n return true;\n}\n\nexport function setAccessToken(token: string, expiresIn: number): void {\n accessTokenCache = {\n token,\n expiresAt: Date.now() + Math.max(10, expiresIn - 300) * 1000,\n };\n}\n\nexport async function persistAuthTokens(tokens: CliAuthTokens): Promise<void> {\n if (tokens.refresh_token) {\n const credentialsPayload: {\n refreshToken: string;\n teamId?: string;\n teamName?: string;\n userEmail?: string;\n } = {\n refreshToken: tokens.refresh_token,\n };\n if (tokens.team?.id) credentialsPayload.teamId = tokens.team.id;\n if (tokens.team?.name) credentialsPayload.teamName = tokens.team.name;\n if (tokens.user?.email) credentialsPayload.userEmail = tokens.user.email;\n\n await saveCredentials({\n ...credentialsPayload,\n });\n }\n setAccessToken(tokens.access_token, tokens.expires_in);\n const cfg = await loadLocalConfig();\n const nextConfig = {\n ...cfg,\n };\n if (tokens.team?.id) nextConfig.activeTeamId = tokens.team.id;\n if (tokens.team?.name) nextConfig.activeTeamName = tokens.team.name;\n if (tokens.user?.email) nextConfig.userEmail = tokens.user.email;\n await saveLocalConfig({\n ...nextConfig,\n });\n}\n\nexport async function getAccessToken(apiBaseUrl: string): Promise<string> {\n if (accessTokenCache && Date.now() < accessTokenCache.expiresAt) {\n return accessTokenCache.token;\n }\n const creds = await loadCredentials();\n if (!creds) throw new Error(\"Not authenticated. Run `trie login`.\");\n const refreshed = await refreshAccessToken(apiBaseUrl, creds.refreshToken);\n return refreshed.access_token;\n}\n\nexport async function refreshAccessToken(\n apiBaseUrl: string,\n refreshToken: string,\n): Promise<CliAuthTokens> {\n const safeApiBaseUrl = normalizeAndValidateApiBaseUrl(apiBaseUrl);\n if (!allowRefreshAttempt()) {\n throw new Error(\"Refresh rate limited. Try again in a minute.\");\n }\n const res = await fetch(`${safeApiBaseUrl}/api/auth/cli/refresh`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n refresh_token: refreshToken,\n machine_fingerprint: getMachineFingerprint(),\n }),\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n await clearCredentials();\n throw new Error(\"Session expired. Run `trie login`.\");\n }\n let detail = `status ${res.status}`;\n try {\n const body = (await res.json()) as { error?: string };\n if (body?.error) detail = body.error;\n } catch {}\n throw new Error(`Token refresh failed (${detail}). Try again or run \\`trie login\\`.`);\n }\n const data = (await res.json()) as CliAuthTokens;\n setAccessToken(data.access_token, data.expires_in);\n return data;\n}\n\nexport async function revokeSession(apiBaseUrl: string): Promise<void> {\n const safeApiBaseUrl = normalizeAndValidateApiBaseUrl(apiBaseUrl);\n const creds = await loadCredentials();\n if (creds) {\n await fetch(`${safeApiBaseUrl}/api/auth/cli/revoke`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refresh_token: creds.refreshToken }),\n }).catch(() => undefined);\n }\n accessTokenCache = null;\n await clearCredentials();\n}\n","import { chmod, lstat, mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"../config/store.js\";\n\nexport interface StoredCredentials {\n refreshToken: string;\n teamId?: string;\n teamName?: string;\n userEmail?: string;\n}\n\nconst SERVICE = \"dev.trie.cli\";\nconst ACCOUNT = \"default\";\nconst FALLBACK_FILE = \"credentials.json\";\nconst PERMS_PRIVATE = 0o600;\n\nfunction serialize(value: StoredCredentials): string {\n return JSON.stringify(value);\n}\n\nfunction parse(value: string): StoredCredentials | null {\n try {\n return JSON.parse(value) as StoredCredentials;\n } catch {\n return null;\n }\n}\n\nfunction getFallbackPath(): string {\n return join(getConfigDir(), FALLBACK_FILE);\n}\n\nasync function ensureSafeCredentialFile(path: string): Promise<void> {\n if (!existsSync(path)) return;\n const stats = await lstat(path);\n if (!stats.isFile() || stats.isSymbolicLink()) {\n throw new Error(\"Unsafe credentials file path detected.\");\n }\n}\n\nasync function loadKeytar() {\n try {\n const mod = await import(\"keytar\");\n return mod.default;\n } catch {\n return null;\n }\n}\n\nasync function saveFallback(value: StoredCredentials): Promise<void> {\n const configDir = getConfigDir();\n await mkdir(configDir, { recursive: true });\n const path = getFallbackPath();\n await ensureSafeCredentialFile(path);\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;\n await writeFile(tempPath, serialize(value), { encoding: \"utf-8\", mode: PERMS_PRIVATE, flag: \"w\" });\n await rename(tempPath, path);\n await chmod(path, PERMS_PRIVATE);\n}\n\nasync function loadFallback(): Promise<StoredCredentials | null> {\n const path = getFallbackPath();\n if (!existsSync(path)) return null;\n await ensureSafeCredentialFile(path);\n const stats = await lstat(path);\n if ((stats.mode & 0o077) !== 0) {\n await chmod(path, PERMS_PRIVATE);\n }\n const raw = await readFile(path, \"utf-8\");\n return parse(raw);\n}\n\nasync function clearFallback(): Promise<void> {\n const path = getFallbackPath();\n if (!existsSync(path)) return;\n await unlink(path).catch(() => undefined);\n}\n\nexport async function saveCredentials(value: StoredCredentials): Promise<void> {\n const keytar = await loadKeytar();\n if (keytar) {\n await keytar.setPassword(SERVICE, ACCOUNT, serialize(value));\n return;\n }\n await saveFallback(value);\n}\n\nexport async function loadCredentials(): Promise<StoredCredentials | null> {\n const keytar = await loadKeytar();\n if (keytar) {\n const raw = await keytar.getPassword(SERVICE, ACCOUNT);\n if (!raw) return null;\n return parse(raw);\n }\n return loadFallback();\n}\n\nexport async function clearCredentials(): Promise<void> {\n const keytar = await loadKeytar();\n if (keytar) {\n await keytar.deletePassword(SERVICE, ACCOUNT);\n return;\n }\n await clearFallback();\n}\n","const DEFAULT_ALLOWED_HOSTS = new Set([\n \"trie-api.vercel.app\",\n]);\n\nfunction readAllowedHosts(): Set<string> {\n const raw = process.env.TRIE_API_BASE_ALLOWLIST;\n if (!raw) return DEFAULT_ALLOWED_HOSTS;\n const hosts = raw\n .split(\",\")\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean);\n return hosts.length > 0 ? new Set(hosts) : DEFAULT_ALLOWED_HOSTS;\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\";\n}\n\nfunction allowInsecureLoopback(): boolean {\n return process.env.TRIE_ALLOW_INSECURE_LOCALHOST === \"1\";\n}\n\nexport function normalizeAndValidateApiBaseUrl(rawUrl: string): string {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n throw new Error(\"Invalid API base URL.\");\n }\n\n const protocol = parsed.protocol.toLowerCase();\n const hostname = parsed.hostname.toLowerCase();\n const hasPath = parsed.pathname !== \"/\" || parsed.search || parsed.hash;\n if (hasPath) {\n throw new Error(\"API base URL must not include path, query, or hash.\");\n }\n if (parsed.username || parsed.password) {\n throw new Error(\"API base URL must not include credentials.\");\n }\n\n if (protocol === \"https:\") {\n const allowedHosts = readAllowedHosts();\n if (!allowedHosts.has(hostname) && !isLoopbackHost(hostname)) {\n throw new Error(\"API base URL host is not in allowlist.\");\n }\n return parsed.origin;\n }\n\n if (protocol === \"http:\" && isLoopbackHost(hostname) && allowInsecureLoopback()) {\n return parsed.origin;\n }\n\n throw new Error(\"Refusing insecure API base URL.\");\n}\n","import { getAccessToken } from \"../auth/session.js\";\nimport { loadLocalConfig } from \"../config/store.js\";\nimport { normalizeAndValidateApiBaseUrl } from \"../config/api-base-url.js\";\n\nexport class CloudClient {\n private async base(): Promise<{ apiBaseUrl: string; teamId?: string }> {\n const cfg = await loadLocalConfig();\n const apiBaseUrl = normalizeAndValidateApiBaseUrl(cfg.apiBaseUrl);\n return cfg.activeTeamId ? { apiBaseUrl, teamId: cfg.activeTeamId } : { apiBaseUrl };\n }\n\n async request<T>(path: string, init?: RequestInit): Promise<T> {\n const { apiBaseUrl, teamId } = await this.base();\n const token = await getAccessToken(apiBaseUrl);\n const headers = new Headers(init?.headers || {});\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"Content-Type\", \"application/json\");\n if (teamId) headers.set(\"X-Trie-Team-Id\", teamId);\n\n let res = await fetch(`${apiBaseUrl}${path}`, { ...init, headers });\n if (res.status === 401) {\n const retryToken = await getAccessToken(apiBaseUrl);\n headers.set(\"Authorization\", `Bearer ${retryToken}`);\n res = await fetch(`${apiBaseUrl}${path}`, { ...init, headers });\n }\n if (!res.ok) {\n throw new Error(`Cloud API error ${res.status}: ${path}`);\n }\n return (await res.json()) as T;\n }\n}\n\nexport const cloudClient = new CloudClient();\n","import { cloudClient } from \"./client.js\";\nimport type { CloudGraphResponse } from \"./types.js\";\n\nexport interface GraphQuery {\n view?: string;\n types?: string[];\n since?: string;\n until?: string;\n}\n\nexport async function fetchGraph(query: GraphQuery = {}): Promise<CloudGraphResponse> {\n const params = new URLSearchParams();\n if (query.view) params.set(\"view\", query.view);\n if (query.types?.length) params.set(\"types\", query.types.join(\",\"));\n if (query.since) params.set(\"since\", query.since);\n if (query.until) params.set(\"until\", query.until);\n const qs = params.toString();\n return cloudClient.request<CloudGraphResponse>(`/api/cloud/ledger/graph${qs ? `?${qs}` : \"\"}`);\n}\n","import { cloudClient } from \"./client.js\";\nimport type { SignalItem } from \"./types.js\";\n\nexport async function fetchSignals(limit = 20): Promise<SignalItem[]> {\n const data = await cloudClient.request<{ items?: SignalItem[]; signals?: SignalItem[] }>(\n `/api/cloud/signals?limit=${limit}`,\n );\n return data.items || data.signals || [];\n}\n","import { cloudClient } from \"./client.js\";\nimport type { CloudDocument } from \"./types.js\";\n\nexport async function fetchDocuments(): Promise<CloudDocument[]> {\n const data = await cloudClient.request<{ items?: CloudDocument[]; documents?: CloudDocument[] }>(\n \"/api/cloud/documents\",\n );\n return data.items || data.documents || [];\n}\n","import type { CloudLedgerResponse } from \"./types.js\";\nimport { cloudClient } from \"./client.js\";\n\nexport async function fetchLedger(project?: string): Promise<CloudLedgerResponse> {\n const qs = project ? `?project=${encodeURIComponent(project)}` : \"\";\n return cloudClient.request<CloudLedgerResponse>(`/api/cloud/ledger${qs}`);\n}\n"],"mappings":"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","names":["mkdir","readFile","writeFile","existsSync","join","join","existsSync","mkdir","writeFile","readFile","hostname"]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
fetchLedger,
|
|
6
6
|
fetchSignals,
|
|
7
7
|
sessionCache
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7VFBLI2G.js";
|
|
9
9
|
|
|
10
10
|
// src/server/mcp-server.ts
|
|
11
11
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -584,9 +584,9 @@ var MCPServer = class {
|
|
|
584
584
|
${toolCount} tools ready | ${aiTool}
|
|
585
585
|
|
|
586
586
|
Quick Start:
|
|
587
|
-
\u2022 "
|
|
588
|
-
\u2022 "Use
|
|
589
|
-
\u2022 "Use
|
|
587
|
+
\u2022 "Use trie_context" - Load Trie cloud context
|
|
588
|
+
\u2022 "Use trie_check_file for <path>" - Assess edit risk before changes
|
|
589
|
+
\u2022 "Use trie_search for <query>" - Search cloud context
|
|
590
590
|
|
|
591
591
|
Ready.
|
|
592
592
|
`);
|
|
@@ -616,4 +616,4 @@ export {
|
|
|
616
616
|
MCPServer,
|
|
617
617
|
startServer
|
|
618
618
|
};
|
|
619
|
-
//# sourceMappingURL=chunk-
|
|
619
|
+
//# sourceMappingURL=chunk-MNYQJQRJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/mcp-server.ts","../src/utils/ai-tool-detector.ts","../src/config/defaults.ts","../src/tools/common.ts","../src/tools/context.ts","../src/tools/check-file.ts","../src/tools/graph.ts","../src/tools/signals.ts","../src/tools/documents.ts","../src/tools/ledger.ts","../src/cloud/chat.ts","../src/tools/search.ts","../src/server/tool-registry.ts","../src/server/resource-manager.ts","../src/server/request-handlers.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { detectAITool } from '../utils/ai-tool-detector.js';\nimport { ToolRegistry } from './tool-registry.js';\nimport { ResourceManager } from './resource-manager.js';\nimport { RequestHandlers } from './request-handlers.js';\n\nexport class MCPServer {\n private server: Server;\n private toolRegistry: ToolRegistry;\n private resourceManager: ResourceManager;\n private requestHandlers: RequestHandlers;\n\n constructor() {\n this.server = new Server(\n {\n name: 'trie',\n version: '1.0.0',\n description:\n 'Trie Cloud context bridge for Cursor and Claude Code. Read trie://context first and call trie_check_file before editing high-risk files.',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n );\n\n this.toolRegistry = new ToolRegistry();\n this.resourceManager = new ResourceManager();\n this.requestHandlers = new RequestHandlers(this.toolRegistry, this.resourceManager);\n\n this.setupRequestHandlers();\n }\n\n private setupRequestHandlers() {\n // List tools handler\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: this.toolRegistry.getAllTools()\n };\n });\n\n // Call tool handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n return await this.requestHandlers.handleToolCall(name, args);\n });\n\n // List resources handler\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return await this.requestHandlers.handleListResources();\n });\n\n // Read resource handler\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n return await this.requestHandlers.handleReadResource(uri);\n });\n }\n\n /**\n * Show startup banner\n */\n private showStartupBanner(toolCount: number, aiTool: string) {\n console.error(`\n ████████╗██████╗ ██╗███████╗\n ╚══██╔══╝██╔══██╗██║██╔════╝\n ██║ ██████╔╝██║█████╗\n ██║ ██╔══██╗██║██╔══╝\n ██║ ██║ ██║██║███████╗\n ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝\n Your central registry for Trie tools\n\n by Louis Kishfy\n\n Download the Trie workspace: https://www.trie.dev\n Follow me on X: https://x.com/louiskishfy\n\n ${toolCount} tools ready | ${aiTool}\n\n Quick Start:\n • \"Use trie_context\" - Load Trie cloud context\n • \"Use trie_check_file for <path>\" - Assess edit risk before changes\n • \"Use trie_search for <query>\" - Search cloud context\n\n Ready.\n`);\n }\n\n /**\n * Initialize and start the server\n */\n async start(): Promise<void> {\n try {\n // Detect the AI tool environment\n const aiTool = detectAITool();\n\n const toolCount = this.toolRegistry.getAllTools().length;\n\n this.showStartupBanner(toolCount, aiTool.name);\n\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n } catch (error) {\n console.error('Fatal error starting MCP server:', error);\n process.exit(1);\n }\n }\n}\n\n/**\n * Start the MCP server\n */\nexport async function startServer(): Promise<void> {\n const server = new MCPServer();\n await server.start();\n}","import { AITool } from '../types/index.js';\n\nexport function detectAITool(): AITool {\n // Check environment variables set by AI tools\n if (process.env.CLAUDE_CODE_VERSION || process.env.CLAUDE_CODE) {\n return {\n name: 'Claude Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: true,\n };\n }\n\n if (process.env.CURSOR_IDE || process.env.CURSOR_TRACE_ID) {\n return {\n name: 'Cursor',\n preferredOutputFormat: 'rich-text',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n if (process.env.OPENCODE_INSTANCE) {\n return {\n name: 'OpenCode',\n preferredOutputFormat: 'plain-text',\n supportsDiffs: false,\n supportsInlineActions: false,\n };\n }\n\n if (process.env.VSCODE_PID || process.env.VSCODE_IPC_HOOK) {\n return {\n name: 'VS Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Check parent process name or other hints\n const parentProcess = process.env.PARENT_PROCESS_NAME || process.env._ || '';\n if (parentProcess.toLowerCase().includes('claude')) {\n return {\n name: 'Claude Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: true,\n };\n }\n\n if (parentProcess.toLowerCase().includes('cursor')) {\n return {\n name: 'Cursor',\n preferredOutputFormat: 'rich-text',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Check if running via npx (likely from an MCP client)\n if (process.env.npm_execpath || process.argv[1]?.includes('npx')) {\n return {\n name: 'MCP Client',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Default\n return {\n name: 'MCP Client',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n}","export const DEFAULT_API_BASE_URL =\n process.env.TRIE_API_BASE_URL || \"https://trie-api.vercel.app\";\n\nexport const DEFAULT_CACHE_TTL_MS = {\n context: 60_000,\n graph: 5 * 60_000,\n ledger: 5 * 60_000,\n signals: 2 * 60_000,\n documents: 5 * 60_000,\n} as const;","export type ToolResult = { content: Array<{ type: \"text\"; text: string }>; data?: unknown };\n\nexport function asText(data: unknown): ToolResult {\n return {\n content: [\n {\n type: \"text\",\n text: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n },\n ],\n data,\n };\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { asText, type ToolResult } from \"./common.js\";\nimport type { HotZone } from \"../types/index.js\";\n\nexport class TrieContextTool {\n async execute(): Promise<ToolResult> {\n const data = await sessionCache.get(\"context\", DEFAULT_CACHE_TTL_MS.context, async () => {\n const [graph, signals, documents] = await Promise.all([\n fetchGraph({ view: \"weekly\", types: [\"signal\", \"insight\", \"decision\", \"shipped\"] }),\n fetchSignals(20),\n fetchDocuments(),\n ]);\n\n const hotZones: HotZone[] = graph.nodes\n .filter((n) => typeof n.path === \"string\")\n .slice(0, 5)\n .map((n) => ({\n path: n.path || \"\",\n risk: (n.severity as \"low\" | \"medium\" | \"high\") || \"medium\",\n reason: \"Related incidents and signals in cloud graph\",\n }));\n\n return {\n generatedAt: new Date().toISOString(),\n graphSummary: {\n nodes: graph.nodes.length,\n edges: graph.edges.length,\n },\n hot_zones: hotZones,\n recentSignals: signals.slice(0, 10),\n recentDocuments: documents.slice(0, 10),\n };\n });\n\n return asText(data);\n }\n}\n","import { fetchLedger } from \"../cloud/ledger.js\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport type { CheckFileResult, TrieWarning, WarningSeverity } from \"../types/index.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nfunction severityScore(sev: WarningSeverity): number {\n if (sev === \"high\") return 3;\n if (sev === \"medium\") return 2;\n return 1;\n}\n\nfunction getRiskLevel(warnings: TrieWarning[]): \"low\" | \"medium\" | \"high\" {\n const max = Math.max(0, ...warnings.map((w) => severityScore(w.severity)));\n if (max >= 3) return \"high\";\n if (max >= 2) return \"medium\";\n return \"low\";\n}\n\nexport class TrieCheckFileTool {\n async execute(input: { file?: string; project?: string } = {}): Promise<ToolResult> {\n const file = input.file?.trim();\n if (!file) throw new Error(\"`file` is required.\");\n\n const [ledger, graph, signals] = await Promise.all([\n fetchLedger(input.project),\n fetchGraph({ types: [\"insight\", \"decision\", \"signal\", \"shipped\"] }),\n fetchSignals(50),\n ]);\n\n const warnings: TrieWarning[] = [];\n const ledgerBlob = JSON.stringify(ledger).toLowerCase();\n if (ledgerBlob.includes(file.toLowerCase())) {\n warnings.push({\n type: \"incident_history\",\n severity: \"high\",\n message: \"This file appears in prior incidents/ledger events.\",\n });\n }\n\n const relatedNodes = graph.nodes.filter((n) => (n.path || \"\").includes(file));\n if (relatedNodes.length > 0) {\n warnings.push({\n type: \"architectural_decision\",\n severity: \"medium\",\n message: `${relatedNodes.length} graph node(s) relate to this file.`,\n details: relatedNodes.slice(0, 3).map((n) => n.label || n.id),\n });\n }\n\n const relatedSignals = signals.filter((s) =>\n JSON.stringify(s).toLowerCase().includes(file.toLowerCase()),\n );\n if (relatedSignals.length > 0) {\n warnings.push({\n type: \"active_alerts\",\n severity: \"high\",\n message: `${relatedSignals.length} signal(s) mention this file.`,\n });\n }\n\n if (warnings.length === 0) {\n warnings.push({\n type: \"no_known_risks\",\n severity: \"info\",\n message: \"No known cloud risks found for this file.\",\n });\n }\n\n const result: CheckFileResult = {\n file,\n risk_level: getRiskLevel(warnings),\n warnings,\n recommendation:\n warnings.some((w) => w.severity === \"high\")\n ? \"High-risk area detected. Proceed carefully and verify with tests.\"\n : \"No high-risk alerts; proceed with normal caution.\",\n };\n return asText(result);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nexport class TrieGraphTool {\n async execute(input: { view?: string; types?: string[]; since?: string; until?: string } = {}): Promise<ToolResult> {\n const key = `graph:${JSON.stringify(input)}`;\n const data = await sessionCache.get(key, DEFAULT_CACHE_TTL_MS.graph, () => fetchGraph(input));\n return asText(data);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { asText, type ToolResult } from \"./common.js\";\nimport { z } from \"zod\";\n\nconst SignalsInputSchema = z\n .object({\n limit: z.number().int().min(1).max(100).optional(),\n })\n .strict();\n\nexport class TrieSignalsTool {\n async execute(input: unknown = {}): Promise<ToolResult> {\n const parsedInput = SignalsInputSchema.parse(input);\n const limit = parsedInput.limit || 20;\n const key = `signals:${limit}`;\n const data = await sessionCache.get(key, DEFAULT_CACHE_TTL_MS.signals, () => fetchSignals(limit));\n return asText(data);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nexport class TrieDocumentsTool {\n async execute(): Promise<ToolResult> {\n const data = await sessionCache.get(\"documents\", DEFAULT_CACHE_TTL_MS.documents, fetchDocuments);\n return asText(data);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchLedger } from \"../cloud/ledger.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nexport class TrieLedgerTool {\n async execute(input: { project?: string } = {}): Promise<ToolResult> {\n const key = `ledger:${input.project || \"default\"}`;\n const data = await sessionCache.get(key, DEFAULT_CACHE_TTL_MS.ledger, () => fetchLedger(input.project));\n return asText(data);\n }\n}\n","import { cloudClient } from \"./client.js\";\n\nexport async function searchContext(query: string): Promise<Record<string, unknown>> {\n return cloudClient.request<Record<string, unknown>>(\"/api/cloud/chat\", {\n method: \"POST\",\n body: JSON.stringify({\n messages: [{ role: \"user\", content: query }],\n }),\n });\n}\n","import { searchContext } from \"../cloud/chat.js\";\nimport { asText, type ToolResult } from \"./common.js\";\nimport { z } from \"zod\";\n\nconst SearchInputSchema = z\n .object({\n query: z.string().trim().min(1).max(2000),\n })\n .strict();\n\nexport class TrieSearchTool {\n async execute(input: unknown = {}): Promise<ToolResult> {\n const parsedInput = SearchInputSchema.parse(input);\n const data = await searchContext(parsedInput.query);\n return asText(data);\n }\n}\n","import { TrieContextTool } from '../tools/context.js';\nimport { TrieCheckFileTool } from \"../tools/check-file.js\";\nimport { TrieGraphTool } from \"../tools/graph.js\";\nimport { TrieSignalsTool } from \"../tools/signals.js\";\nimport { TrieDocumentsTool } from \"../tools/documents.js\";\nimport { TrieLedgerTool } from \"../tools/ledger.js\";\nimport { TrieSearchTool } from \"../tools/search.js\";\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n _meta?: {\n ui?: {\n resourceUri: string;\n };\n };\n}\n\nexport interface TrieTool {\n execute(input?: unknown): Promise<{ content: Array<{ type: \"text\"; text: string }>; data?: unknown }>;\n}\n\nexport class ToolRegistry {\n private tools: Map<string, TrieTool> = new Map();\n private definitions: ToolDefinition[] = [];\n\n constructor() {\n this.initializeTools();\n this.defineToolSchemas();\n }\n\n private initializeTools() {\n this.tools.set(\"context\", new TrieContextTool());\n this.tools.set(\"check_file\", new TrieCheckFileTool());\n this.tools.set(\"graph\", new TrieGraphTool());\n this.tools.set(\"signals\", new TrieSignalsTool());\n this.tools.set(\"documents\", new TrieDocumentsTool());\n this.tools.set(\"ledger\", new TrieLedgerTool());\n this.tools.set(\"search\", new TrieSearchTool());\n }\n\n private defineToolSchemas() {\n this.definitions = [\n {\n name: \"trie_context\",\n description:\n \"Get consolidated Trie cloud context (hot zones, graph summary, recent signals/documents).\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n },\n {\n name: \"trie_check_file\",\n description:\n \"Proactively assess risk for a file: incidents, alerts, brittleness, and decisions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n file: {\n type: \"string\",\n },\n project: {\n type: \"string\",\n },\n },\n required: [\"file\"],\n },\n },\n {\n name: \"trie_graph\",\n description: \"Read ANT graph from Trie cloud.\",\n inputSchema: {\n type: \"object\",\n properties: {\n view: { type: \"string\" },\n types: { type: \"array\", items: { type: \"string\" } },\n since: { type: \"string\" },\n until: { type: \"string\" },\n },\n },\n },\n {\n name: \"trie_signals\",\n description: \"Read cloud signals feed.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\" },\n },\n },\n },\n {\n name: \"trie_documents\",\n description: \"Read cloud documents.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n },\n {\n name: \"trie_ledger\",\n description: \"Read cloud ledger entries.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\" },\n },\n },\n },\n {\n name: \"trie_search\",\n description: \"Search cloud context via natural language.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n required: [\"query\"],\n },\n },\n ];\n }\n\n getTool(name: string): TrieTool | undefined {\n return this.tools.get(name);\n }\n\n getAllTools(): ToolDefinition[] {\n return this.definitions;\n }\n\n getToolNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n}","import { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface ResourceContent {\n contents: Array<{\n uri: string;\n mimeType?: string;\n text: string;\n }>;\n}\n\nexport class ResourceManager {\n /**\n * Get all available resources dynamically\n */\n async getAvailableResources(): Promise<Resource[]> {\n const resources: Resource[] = [];\n\n resources.push(\n {\n uri: \"trie://context\",\n name: \"Trie Cloud Context\",\n description: \"Consolidated cloud context with hot zones and active signals.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"trie://graph\",\n name: \"Trie ANT Graph\",\n description: \"Raw ANT graph from cloud.\",\n mimeType: \"application/json\",\n },\n );\n\n return resources;\n }\n\n /**\n * Read content for a specific resource\n */\n async readResourceContent(uri: string): Promise<ResourceContent> {\n if (uri === \"trie://context\") {\n return await this.getContextResource(uri);\n }\n if (uri === \"trie://graph\") {\n return await this.getGraphResource(uri);\n }\n throw new Error(`Unknown resource: ${uri}`);\n }\n\n private async getContextResource(uri: string): Promise<ResourceContent> {\n const data = await sessionCache.get(\"context-resource\", DEFAULT_CACHE_TTL_MS.context, async () => {\n const [graph, signals, documents] = await Promise.all([\n fetchGraph({ view: \"weekly\", types: [\"signal\", \"insight\", \"decision\", \"shipped\"] }),\n fetchSignals(20),\n fetchDocuments(),\n ]);\n const hotZones = graph.nodes\n .filter((n) => typeof n.path === \"string\")\n .slice(0, 10)\n .map((n) => ({\n path: n.path,\n risk: n.severity || \"medium\",\n reason: \"Graph-linked incidents/signals\",\n }));\n return {\n generatedAt: new Date().toISOString(),\n graph: { nodes: graph.nodes.length, edges: graph.edges.length },\n hot_zones: hotZones,\n signals: signals.slice(0, 10),\n documents: documents.slice(0, 10),\n };\n });\n return {\n contents: [{\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(data, null, 2),\n }],\n };\n }\n\n private async getGraphResource(uri: string): Promise<ResourceContent> {\n const graph = await sessionCache.get(\"graph-resource\", DEFAULT_CACHE_TTL_MS.graph, () =>\n fetchGraph({ view: \"weekly\" }),\n );\n return {\n contents: [{\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(graph, null, 2),\n }],\n };\n }\n}","import { ToolRegistry } from './tool-registry.js';\nimport { ResourceManager } from './resource-manager.js';\nimport type { ToolResult } from '../tools/common.js';\nimport type { Resource } from './resource-manager.js';\n\nexport class RequestHandlers {\n constructor(\n private toolRegistry: ToolRegistry,\n private resourceManager: ResourceManager\n ) {}\n\n /**\n * Handle tool execution requests\n */\n async handleToolCall(name: string, args: unknown): Promise<ToolResult> {\n const normalizedName = this.normalizeName(name);\n\n try {\n const tool = this.toolRegistry.getTool(normalizedName);\n if (!tool) {\n throw new Error(`Unknown tool: ${name}`);\n }\n return await tool.execute(this.sanitizeArgs(args));\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`\n }]\n };\n }\n }\n\n /**\n * Handle resource listing requests\n */\n async handleListResources(): Promise<{ resources: Resource[] }> {\n const resources = await this.resourceManager.getAvailableResources();\n return { resources };\n }\n\n /**\n * Handle resource reading requests\n */\n async handleReadResource(uri: string): Promise<{ contents: Array<{ uri: string; mimeType?: string; text: string }> }> {\n return await this.resourceManager.readResourceContent(uri);\n }\n\n private normalizeName(name: string): string {\n const stripNamespace = (n: string): string => {\n const trimmed = n.trim().replace(/\\s*\\([^)]*\\)\\s*$/, '').trim();\n const withoutSlash = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;\n const parts = withoutSlash.split(':');\n const base = (parts[0] || withoutSlash).trim();\n const slashParts = base.split('/');\n return (slashParts[slashParts.length - 1] || base).trim();\n };\n\n const rawName = stripNamespace(name);\n return rawName.startsWith('trie_') ? rawName.slice('trie_'.length) : rawName;\n }\n\n private sanitizeArgs(args: unknown): Record<string, unknown> {\n if (args == null) return {};\n if (typeof args !== \"object\" || Array.isArray(args)) {\n throw new Error(\"Tool args must be a JSON object.\");\n }\n const serialized = JSON.stringify(args);\n if (serialized.length > 32 * 1024) {\n throw new Error(\"Tool args exceed 32KB limit.\");\n }\n return args as Record<string, unknown>;\n }\n}"],"mappings":"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","names":["z"]}
|
package/dist/cli/main.js
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
revokeSession,
|
|
13
13
|
saveLocalConfig,
|
|
14
14
|
sessionCache
|
|
15
|
-
} from "../chunk-
|
|
15
|
+
} from "../chunk-7VFBLI2G.js";
|
|
16
16
|
|
|
17
17
|
// src/cli/main.ts
|
|
18
18
|
import { mkdir, writeFile } from "fs/promises";
|
|
@@ -106,6 +106,13 @@ var RequestError = class extends Error {
|
|
|
106
106
|
this.statusCode = statusCode;
|
|
107
107
|
}
|
|
108
108
|
};
|
|
109
|
+
function formatExchangeFailureHint(status, message) {
|
|
110
|
+
const lower = (message || "").toLowerCase();
|
|
111
|
+
if (status === 401 || status === 403 || lower.includes("no account") || lower.includes("not found") || lower.includes("sign up")) {
|
|
112
|
+
return "If you do not have a Trie account yet, create one at https://trie.dev and then run `trie login` again.";
|
|
113
|
+
}
|
|
114
|
+
return "Retry `trie login`, or create an account at https://trie.dev if this is your first time.";
|
|
115
|
+
}
|
|
109
116
|
function writeCors(res, origin) {
|
|
110
117
|
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
111
118
|
res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
|
|
@@ -222,7 +229,13 @@ async function loginWithBrowser() {
|
|
|
222
229
|
})
|
|
223
230
|
});
|
|
224
231
|
if (!exchangeRes.ok) {
|
|
225
|
-
|
|
232
|
+
const payload = await exchangeRes.json().catch(() => ({}));
|
|
233
|
+
const apiMessage = payload.error || payload.message;
|
|
234
|
+
const baseMessage = apiMessage ? `Auth exchange failed (${exchangeRes.status}): ${apiMessage}` : `Auth exchange failed (${exchangeRes.status})`;
|
|
235
|
+
throw new RequestError(
|
|
236
|
+
`${baseMessage}. ${formatExchangeFailureHint(exchangeRes.status, apiMessage)}`,
|
|
237
|
+
exchangeRes.status
|
|
238
|
+
);
|
|
226
239
|
}
|
|
227
240
|
const tokens = await exchangeRes.json();
|
|
228
241
|
await persistAuthTokens(tokens);
|
|
@@ -305,6 +318,9 @@ Commands:
|
|
|
305
318
|
trie teams [list|switch <teamId>]
|
|
306
319
|
trie pull [context|graph|signals|documents|ledger|all]
|
|
307
320
|
trie status
|
|
321
|
+
|
|
322
|
+
Tip:
|
|
323
|
+
If you do not have a Trie account yet, create one at https://trie.dev first.
|
|
308
324
|
`);
|
|
309
325
|
}
|
|
310
326
|
async function cmdInit() {
|
|
@@ -321,6 +337,7 @@ ${CLAUDE_RULE}`;
|
|
|
321
337
|
console.log("Proactive warnings enabled in Cursor and Claude Code.");
|
|
322
338
|
}
|
|
323
339
|
async function cmdLogin() {
|
|
340
|
+
console.log("If you do not have a Trie account yet, create one at https://trie.dev first.");
|
|
324
341
|
const tokens = await loginWithBrowser();
|
|
325
342
|
console.log(
|
|
326
343
|
`Logged in${tokens.user?.email ? ` as ${tokens.user.email}` : ""}${tokens.team?.name ? ` (team: ${tokens.team.name})` : ""}`
|
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`);\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 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 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 throw new Error(`Auth exchange failed (${exchangeRes.status})`);\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 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"]}
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/mcp-server.ts","../src/utils/ai-tool-detector.ts","../src/config/defaults.ts","../src/tools/common.ts","../src/tools/context.ts","../src/tools/check-file.ts","../src/tools/graph.ts","../src/tools/signals.ts","../src/tools/documents.ts","../src/tools/ledger.ts","../src/cloud/chat.ts","../src/tools/search.ts","../src/server/tool-registry.ts","../src/server/resource-manager.ts","../src/server/request-handlers.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { detectAITool } from '../utils/ai-tool-detector.js';\nimport { ToolRegistry } from './tool-registry.js';\nimport { ResourceManager } from './resource-manager.js';\nimport { RequestHandlers } from './request-handlers.js';\n\nexport class MCPServer {\n private server: Server;\n private toolRegistry: ToolRegistry;\n private resourceManager: ResourceManager;\n private requestHandlers: RequestHandlers;\n\n constructor() {\n this.server = new Server(\n {\n name: 'trie',\n version: '1.0.0',\n description:\n 'Trie Cloud context bridge for Cursor and Claude Code. Read trie://context first and call trie_check_file before editing high-risk files.',\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n );\n\n this.toolRegistry = new ToolRegistry();\n this.resourceManager = new ResourceManager();\n this.requestHandlers = new RequestHandlers(this.toolRegistry, this.resourceManager);\n\n this.setupRequestHandlers();\n }\n\n private setupRequestHandlers() {\n // List tools handler\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: this.toolRegistry.getAllTools()\n };\n });\n\n // Call tool handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n return await this.requestHandlers.handleToolCall(name, args);\n });\n\n // List resources handler\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return await this.requestHandlers.handleListResources();\n });\n\n // Read resource handler\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n return await this.requestHandlers.handleReadResource(uri);\n });\n }\n\n /**\n * Show startup banner\n */\n private showStartupBanner(toolCount: number, aiTool: string) {\n console.error(`\n ████████╗██████╗ ██╗███████╗\n ╚══██╔══╝██╔══██╗██║██╔════╝\n ██║ ██████╔╝██║█████╗\n ██║ ██╔══██╗██║██╔══╝\n ██║ ██║ ██║██║███████╗\n ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝\n Your central registry for Trie tools\n\n by Louis Kishfy\n\n Download the Trie workspace: https://www.trie.dev\n Follow me on X: https://x.com/louiskishfy\n\n ${toolCount} tools ready | ${aiTool}\n\n Quick Start:\n • \"Scan this code\" - Run Trie analysis\n • \"Use trie\" - Open the Trie menu\n • \"Use trie_fix\" - Apply high-confidence fixes\n\n Ready.\n`);\n }\n\n /**\n * Initialize and start the server\n */\n async start(): Promise<void> {\n try {\n // Detect the AI tool environment\n const aiTool = detectAITool();\n\n const toolCount = this.toolRegistry.getAllTools().length;\n\n this.showStartupBanner(toolCount, aiTool.name);\n\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n } catch (error) {\n console.error('Fatal error starting MCP server:', error);\n process.exit(1);\n }\n }\n}\n\n/**\n * Start the MCP server\n */\nexport async function startServer(): Promise<void> {\n const server = new MCPServer();\n await server.start();\n}","import { AITool } from '../types/index.js';\n\nexport function detectAITool(): AITool {\n // Check environment variables set by AI tools\n if (process.env.CLAUDE_CODE_VERSION || process.env.CLAUDE_CODE) {\n return {\n name: 'Claude Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: true,\n };\n }\n\n if (process.env.CURSOR_IDE || process.env.CURSOR_TRACE_ID) {\n return {\n name: 'Cursor',\n preferredOutputFormat: 'rich-text',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n if (process.env.OPENCODE_INSTANCE) {\n return {\n name: 'OpenCode',\n preferredOutputFormat: 'plain-text',\n supportsDiffs: false,\n supportsInlineActions: false,\n };\n }\n\n if (process.env.VSCODE_PID || process.env.VSCODE_IPC_HOOK) {\n return {\n name: 'VS Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Check parent process name or other hints\n const parentProcess = process.env.PARENT_PROCESS_NAME || process.env._ || '';\n if (parentProcess.toLowerCase().includes('claude')) {\n return {\n name: 'Claude Code',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: true,\n };\n }\n\n if (parentProcess.toLowerCase().includes('cursor')) {\n return {\n name: 'Cursor',\n preferredOutputFormat: 'rich-text',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Check if running via npx (likely from an MCP client)\n if (process.env.npm_execpath || process.argv[1]?.includes('npx')) {\n return {\n name: 'MCP Client',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n }\n\n // Default\n return {\n name: 'MCP Client',\n preferredOutputFormat: 'markdown',\n supportsDiffs: true,\n supportsInlineActions: false,\n };\n}","export const DEFAULT_API_BASE_URL =\n process.env.TRIE_API_BASE_URL || \"https://trie-api.vercel.app\";\n\nexport const DEFAULT_CACHE_TTL_MS = {\n context: 60_000,\n graph: 5 * 60_000,\n ledger: 5 * 60_000,\n signals: 2 * 60_000,\n documents: 5 * 60_000,\n} as const;","export type ToolResult = { content: Array<{ type: \"text\"; text: string }>; data?: unknown };\n\nexport function asText(data: unknown): ToolResult {\n return {\n content: [\n {\n type: \"text\",\n text: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n },\n ],\n data,\n };\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { asText, type ToolResult } from \"./common.js\";\nimport type { HotZone } from \"../types/index.js\";\n\nexport class TrieContextTool {\n async execute(): Promise<ToolResult> {\n const data = await sessionCache.get(\"context\", DEFAULT_CACHE_TTL_MS.context, async () => {\n const [graph, signals, documents] = await Promise.all([\n fetchGraph({ view: \"weekly\", types: [\"signal\", \"insight\", \"decision\", \"shipped\"] }),\n fetchSignals(20),\n fetchDocuments(),\n ]);\n\n const hotZones: HotZone[] = graph.nodes\n .filter((n) => typeof n.path === \"string\")\n .slice(0, 5)\n .map((n) => ({\n path: n.path || \"\",\n risk: (n.severity as \"low\" | \"medium\" | \"high\") || \"medium\",\n reason: \"Related incidents and signals in cloud graph\",\n }));\n\n return {\n generatedAt: new Date().toISOString(),\n graphSummary: {\n nodes: graph.nodes.length,\n edges: graph.edges.length,\n },\n hot_zones: hotZones,\n recentSignals: signals.slice(0, 10),\n recentDocuments: documents.slice(0, 10),\n };\n });\n\n return asText(data);\n }\n}\n","import { fetchLedger } from \"../cloud/ledger.js\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport type { CheckFileResult, TrieWarning, WarningSeverity } from \"../types/index.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nfunction severityScore(sev: WarningSeverity): number {\n if (sev === \"high\") return 3;\n if (sev === \"medium\") return 2;\n return 1;\n}\n\nfunction getRiskLevel(warnings: TrieWarning[]): \"low\" | \"medium\" | \"high\" {\n const max = Math.max(0, ...warnings.map((w) => severityScore(w.severity)));\n if (max >= 3) return \"high\";\n if (max >= 2) return \"medium\";\n return \"low\";\n}\n\nexport class TrieCheckFileTool {\n async execute(input: { file?: string; project?: string } = {}): Promise<ToolResult> {\n const file = input.file?.trim();\n if (!file) throw new Error(\"`file` is required.\");\n\n const [ledger, graph, signals] = await Promise.all([\n fetchLedger(input.project),\n fetchGraph({ types: [\"insight\", \"decision\", \"signal\", \"shipped\"] }),\n fetchSignals(50),\n ]);\n\n const warnings: TrieWarning[] = [];\n const ledgerBlob = JSON.stringify(ledger).toLowerCase();\n if (ledgerBlob.includes(file.toLowerCase())) {\n warnings.push({\n type: \"incident_history\",\n severity: \"high\",\n message: \"This file appears in prior incidents/ledger events.\",\n });\n }\n\n const relatedNodes = graph.nodes.filter((n) => (n.path || \"\").includes(file));\n if (relatedNodes.length > 0) {\n warnings.push({\n type: \"architectural_decision\",\n severity: \"medium\",\n message: `${relatedNodes.length} graph node(s) relate to this file.`,\n details: relatedNodes.slice(0, 3).map((n) => n.label || n.id),\n });\n }\n\n const relatedSignals = signals.filter((s) =>\n JSON.stringify(s).toLowerCase().includes(file.toLowerCase()),\n );\n if (relatedSignals.length > 0) {\n warnings.push({\n type: \"active_alerts\",\n severity: \"high\",\n message: `${relatedSignals.length} signal(s) mention this file.`,\n });\n }\n\n if (warnings.length === 0) {\n warnings.push({\n type: \"no_known_risks\",\n severity: \"info\",\n message: \"No known cloud risks found for this file.\",\n });\n }\n\n const result: CheckFileResult = {\n file,\n risk_level: getRiskLevel(warnings),\n warnings,\n recommendation:\n warnings.some((w) => w.severity === \"high\")\n ? \"High-risk area detected. Proceed carefully and verify with tests.\"\n : \"No high-risk alerts; proceed with normal caution.\",\n };\n return asText(result);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchGraph } from \"../cloud/graph.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nexport class TrieGraphTool {\n async execute(input: { view?: string; types?: string[]; since?: string; until?: string } = {}): Promise<ToolResult> {\n const key = `graph:${JSON.stringify(input)}`;\n const data = await sessionCache.get(key, DEFAULT_CACHE_TTL_MS.graph, () => fetchGraph(input));\n return asText(data);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { asText, type ToolResult } from \"./common.js\";\nimport { z } from \"zod\";\n\nconst SignalsInputSchema = z\n .object({\n limit: z.number().int().min(1).max(100).optional(),\n })\n .strict();\n\nexport class TrieSignalsTool {\n async execute(input: unknown = {}): Promise<ToolResult> {\n const parsedInput = SignalsInputSchema.parse(input);\n const limit = parsedInput.limit || 20;\n const key = `signals:${limit}`;\n const data = await sessionCache.get(key, DEFAULT_CACHE_TTL_MS.signals, () => fetchSignals(limit));\n return asText(data);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nexport class TrieDocumentsTool {\n async execute(): Promise<ToolResult> {\n const data = await sessionCache.get(\"documents\", DEFAULT_CACHE_TTL_MS.documents, fetchDocuments);\n return asText(data);\n }\n}\n","import { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\nimport { fetchLedger } from \"../cloud/ledger.js\";\nimport { asText, type ToolResult } from \"./common.js\";\n\nexport class TrieLedgerTool {\n async execute(input: { project?: string } = {}): Promise<ToolResult> {\n const key = `ledger:${input.project || \"default\"}`;\n const data = await sessionCache.get(key, DEFAULT_CACHE_TTL_MS.ledger, () => fetchLedger(input.project));\n return asText(data);\n }\n}\n","import { cloudClient } from \"./client.js\";\n\nexport async function searchContext(query: string): Promise<Record<string, unknown>> {\n return cloudClient.request<Record<string, unknown>>(\"/api/cloud/chat\", {\n method: \"POST\",\n body: JSON.stringify({\n messages: [{ role: \"user\", content: query }],\n }),\n });\n}\n","import { searchContext } from \"../cloud/chat.js\";\nimport { asText, type ToolResult } from \"./common.js\";\nimport { z } from \"zod\";\n\nconst SearchInputSchema = z\n .object({\n query: z.string().trim().min(1).max(2000),\n })\n .strict();\n\nexport class TrieSearchTool {\n async execute(input: unknown = {}): Promise<ToolResult> {\n const parsedInput = SearchInputSchema.parse(input);\n const data = await searchContext(parsedInput.query);\n return asText(data);\n }\n}\n","import { TrieContextTool } from '../tools/context.js';\nimport { TrieCheckFileTool } from \"../tools/check-file.js\";\nimport { TrieGraphTool } from \"../tools/graph.js\";\nimport { TrieSignalsTool } from \"../tools/signals.js\";\nimport { TrieDocumentsTool } from \"../tools/documents.js\";\nimport { TrieLedgerTool } from \"../tools/ledger.js\";\nimport { TrieSearchTool } from \"../tools/search.js\";\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n _meta?: {\n ui?: {\n resourceUri: string;\n };\n };\n}\n\nexport interface TrieTool {\n execute(input?: unknown): Promise<{ content: Array<{ type: \"text\"; text: string }>; data?: unknown }>;\n}\n\nexport class ToolRegistry {\n private tools: Map<string, TrieTool> = new Map();\n private definitions: ToolDefinition[] = [];\n\n constructor() {\n this.initializeTools();\n this.defineToolSchemas();\n }\n\n private initializeTools() {\n this.tools.set(\"context\", new TrieContextTool());\n this.tools.set(\"check_file\", new TrieCheckFileTool());\n this.tools.set(\"graph\", new TrieGraphTool());\n this.tools.set(\"signals\", new TrieSignalsTool());\n this.tools.set(\"documents\", new TrieDocumentsTool());\n this.tools.set(\"ledger\", new TrieLedgerTool());\n this.tools.set(\"search\", new TrieSearchTool());\n }\n\n private defineToolSchemas() {\n this.definitions = [\n {\n name: \"trie_context\",\n description:\n \"Get consolidated Trie cloud context (hot zones, graph summary, recent signals/documents).\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n },\n {\n name: \"trie_check_file\",\n description:\n \"Proactively assess risk for a file: incidents, alerts, brittleness, and decisions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n file: {\n type: \"string\",\n },\n project: {\n type: \"string\",\n },\n },\n required: [\"file\"],\n },\n },\n {\n name: \"trie_graph\",\n description: \"Read ANT graph from Trie cloud.\",\n inputSchema: {\n type: \"object\",\n properties: {\n view: { type: \"string\" },\n types: { type: \"array\", items: { type: \"string\" } },\n since: { type: \"string\" },\n until: { type: \"string\" },\n },\n },\n },\n {\n name: \"trie_signals\",\n description: \"Read cloud signals feed.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\" },\n },\n },\n },\n {\n name: \"trie_documents\",\n description: \"Read cloud documents.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n },\n {\n name: \"trie_ledger\",\n description: \"Read cloud ledger entries.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\" },\n },\n },\n },\n {\n name: \"trie_search\",\n description: \"Search cloud context via natural language.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n required: [\"query\"],\n },\n },\n ];\n }\n\n getTool(name: string): TrieTool | undefined {\n return this.tools.get(name);\n }\n\n getAllTools(): ToolDefinition[] {\n return this.definitions;\n }\n\n getToolNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n}","import { fetchGraph } from \"../cloud/graph.js\";\nimport { fetchSignals } from \"../cloud/signals.js\";\nimport { fetchDocuments } from \"../cloud/documents.js\";\nimport { DEFAULT_CACHE_TTL_MS } from \"../config/defaults.js\";\nimport { sessionCache } from \"../cache/session-cache.js\";\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface ResourceContent {\n contents: Array<{\n uri: string;\n mimeType?: string;\n text: string;\n }>;\n}\n\nexport class ResourceManager {\n /**\n * Get all available resources dynamically\n */\n async getAvailableResources(): Promise<Resource[]> {\n const resources: Resource[] = [];\n\n resources.push(\n {\n uri: \"trie://context\",\n name: \"Trie Cloud Context\",\n description: \"Consolidated cloud context with hot zones and active signals.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"trie://graph\",\n name: \"Trie ANT Graph\",\n description: \"Raw ANT graph from cloud.\",\n mimeType: \"application/json\",\n },\n );\n\n return resources;\n }\n\n /**\n * Read content for a specific resource\n */\n async readResourceContent(uri: string): Promise<ResourceContent> {\n if (uri === \"trie://context\") {\n return await this.getContextResource(uri);\n }\n if (uri === \"trie://graph\") {\n return await this.getGraphResource(uri);\n }\n throw new Error(`Unknown resource: ${uri}`);\n }\n\n private async getContextResource(uri: string): Promise<ResourceContent> {\n const data = await sessionCache.get(\"context-resource\", DEFAULT_CACHE_TTL_MS.context, async () => {\n const [graph, signals, documents] = await Promise.all([\n fetchGraph({ view: \"weekly\", types: [\"signal\", \"insight\", \"decision\", \"shipped\"] }),\n fetchSignals(20),\n fetchDocuments(),\n ]);\n const hotZones = graph.nodes\n .filter((n) => typeof n.path === \"string\")\n .slice(0, 10)\n .map((n) => ({\n path: n.path,\n risk: n.severity || \"medium\",\n reason: \"Graph-linked incidents/signals\",\n }));\n return {\n generatedAt: new Date().toISOString(),\n graph: { nodes: graph.nodes.length, edges: graph.edges.length },\n hot_zones: hotZones,\n signals: signals.slice(0, 10),\n documents: documents.slice(0, 10),\n };\n });\n return {\n contents: [{\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(data, null, 2),\n }],\n };\n }\n\n private async getGraphResource(uri: string): Promise<ResourceContent> {\n const graph = await sessionCache.get(\"graph-resource\", DEFAULT_CACHE_TTL_MS.graph, () =>\n fetchGraph({ view: \"weekly\" }),\n );\n return {\n contents: [{\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(graph, null, 2),\n }],\n };\n }\n}","import { ToolRegistry } from './tool-registry.js';\nimport { ResourceManager } from './resource-manager.js';\nimport type { ToolResult } from '../tools/common.js';\nimport type { Resource } from './resource-manager.js';\n\nexport class RequestHandlers {\n constructor(\n private toolRegistry: ToolRegistry,\n private resourceManager: ResourceManager\n ) {}\n\n /**\n * Handle tool execution requests\n */\n async handleToolCall(name: string, args: unknown): Promise<ToolResult> {\n const normalizedName = this.normalizeName(name);\n\n try {\n const tool = this.toolRegistry.getTool(normalizedName);\n if (!tool) {\n throw new Error(`Unknown tool: ${name}`);\n }\n return await tool.execute(this.sanitizeArgs(args));\n } catch (error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`\n }]\n };\n }\n }\n\n /**\n * Handle resource listing requests\n */\n async handleListResources(): Promise<{ resources: Resource[] }> {\n const resources = await this.resourceManager.getAvailableResources();\n return { resources };\n }\n\n /**\n * Handle resource reading requests\n */\n async handleReadResource(uri: string): Promise<{ contents: Array<{ uri: string; mimeType?: string; text: string }> }> {\n return await this.resourceManager.readResourceContent(uri);\n }\n\n private normalizeName(name: string): string {\n const stripNamespace = (n: string): string => {\n const trimmed = n.trim().replace(/\\s*\\([^)]*\\)\\s*$/, '').trim();\n const withoutSlash = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed;\n const parts = withoutSlash.split(':');\n const base = (parts[0] || withoutSlash).trim();\n const slashParts = base.split('/');\n return (slashParts[slashParts.length - 1] || base).trim();\n };\n\n const rawName = stripNamespace(name);\n return rawName.startsWith('trie_') ? rawName.slice('trie_'.length) : rawName;\n }\n\n private sanitizeArgs(args: unknown): Record<string, unknown> {\n if (args == null) return {};\n if (typeof args !== \"object\" || Array.isArray(args)) {\n throw new Error(\"Tool args must be a JSON object.\");\n }\n const serialized = JSON.stringify(args);\n if (serialized.length > 32 * 1024) {\n throw new Error(\"Tool args exceed 32KB limit.\");\n }\n return args as Record<string, unknown>;\n }\n}"],"mappings":"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","names":["z"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cache/session-cache.ts","../src/config/store.ts","../src/auth/session.ts","../src/auth/keychain.ts","../src/config/api-base-url.ts","../src/cloud/client.ts","../src/cloud/graph.ts","../src/cloud/signals.ts","../src/cloud/documents.ts","../src/cloud/ledger.ts"],"sourcesContent":["type CacheEntry<T> = {\n fetchedAt: number;\n data: T;\n};\n\nexport class SessionCache {\n private readonly cache = new Map<string, CacheEntry<unknown>>();\n\n async get<T>(key: string, ttlMs: number, fetcher: () => Promise<T>): Promise<T> {\n const hit = this.cache.get(key) as CacheEntry<T> | undefined;\n if (hit && Date.now() - hit.fetchedAt < ttlMs) {\n return hit.data;\n }\n const data = await fetcher();\n this.cache.set(key, { fetchedAt: Date.now(), data });\n return data;\n }\n\n invalidate(key: string): void {\n this.cache.delete(key);\n }\n\n invalidateAll(): void {\n this.cache.clear();\n }\n\n stats(): { size: number; keys: string[] } {\n return { size: this.cache.size, keys: [...this.cache.keys()] };\n }\n}\n\nexport const sessionCache = new SessionCache();\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface LocalConfig {\n apiBaseUrl: string;\n activeTeamId?: string;\n activeTeamName?: string;\n userEmail?: string;\n}\n\nconst DEFAULT_CONFIG: LocalConfig = {\n apiBaseUrl: process.env.TRIE_API_BASE_URL || \"https://trie-api.vercel.app\",\n};\n\nexport function getConfigDir(): string {\n return join(homedir(), \".trie\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(getConfigDir(), { recursive: true });\n}\n\nexport async function loadLocalConfig(): Promise<LocalConfig> {\n const path = getConfigPath();\n if (!existsSync(path)) {\n return { ...DEFAULT_CONFIG };\n }\n try {\n const raw = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<LocalConfig>;\n return { ...DEFAULT_CONFIG, ...parsed };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport async function saveLocalConfig(next: LocalConfig): Promise<void> {\n await ensureConfigDir();\n const path = getConfigPath();\n await writeFile(path, `${JSON.stringify(next, null, 2)}\\n`, \"utf-8\");\n}\n","import { createHash } from \"node:crypto\";\nimport { hostname, platform, userInfo } from \"node:os\";\nimport { clearCredentials, loadCredentials, saveCredentials } from \"./keychain.js\";\nimport type { CliAuthTokens } from \"../types/index.js\";\nimport { loadLocalConfig, saveLocalConfig } from \"../config/store.js\";\nimport { normalizeAndValidateApiBaseUrl } from \"../config/api-base-url.js\";\n\nlet accessTokenCache: { token: string; expiresAt: number } | null = null;\nlet refreshAttempts: number[] = [];\n\nexport function getMachineFingerprint(): string {\n return createHash(\"sha256\")\n .update(`${hostname()}:${userInfo().username}:${platform()}:${process.arch}`)\n .digest(\"hex\");\n}\n\nfunction allowRefreshAttempt(): boolean {\n const now = Date.now();\n refreshAttempts = refreshAttempts.filter((t) => now - t < 60_000);\n if (refreshAttempts.length >= 5) return false;\n refreshAttempts.push(now);\n return true;\n}\n\nexport function setAccessToken(token: string, expiresIn: number): void {\n accessTokenCache = {\n token,\n expiresAt: Date.now() + Math.max(10, expiresIn - 300) * 1000,\n };\n}\n\nexport async function persistAuthTokens(tokens: CliAuthTokens): Promise<void> {\n if (tokens.refresh_token) {\n const credentialsPayload: {\n refreshToken: string;\n teamId?: string;\n teamName?: string;\n userEmail?: string;\n } = {\n refreshToken: tokens.refresh_token,\n };\n if (tokens.team?.id) credentialsPayload.teamId = tokens.team.id;\n if (tokens.team?.name) credentialsPayload.teamName = tokens.team.name;\n if (tokens.user?.email) credentialsPayload.userEmail = tokens.user.email;\n\n await saveCredentials({\n ...credentialsPayload,\n });\n }\n setAccessToken(tokens.access_token, tokens.expires_in);\n const cfg = await loadLocalConfig();\n const nextConfig = {\n ...cfg,\n };\n if (tokens.team?.id) nextConfig.activeTeamId = tokens.team.id;\n if (tokens.team?.name) nextConfig.activeTeamName = tokens.team.name;\n if (tokens.user?.email) nextConfig.userEmail = tokens.user.email;\n await saveLocalConfig({\n ...nextConfig,\n });\n}\n\nexport async function getAccessToken(apiBaseUrl: string): Promise<string> {\n if (accessTokenCache && Date.now() < accessTokenCache.expiresAt) {\n return accessTokenCache.token;\n }\n const creds = await loadCredentials();\n if (!creds) throw new Error(\"Not authenticated. Run `trie login`.\");\n const refreshed = await refreshAccessToken(apiBaseUrl, creds.refreshToken);\n return refreshed.access_token;\n}\n\nexport async function refreshAccessToken(\n apiBaseUrl: string,\n refreshToken: string,\n): Promise<CliAuthTokens> {\n const safeApiBaseUrl = normalizeAndValidateApiBaseUrl(apiBaseUrl);\n if (!allowRefreshAttempt()) {\n throw new Error(\"Refresh rate limited. Try again in a minute.\");\n }\n const res = await fetch(`${safeApiBaseUrl}/api/auth/cli/refresh`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n refresh_token: refreshToken,\n machine_fingerprint: getMachineFingerprint(),\n }),\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n await clearCredentials();\n }\n throw new Error(\"Session expired. Run `trie login`.\");\n }\n const data = (await res.json()) as CliAuthTokens;\n setAccessToken(data.access_token, data.expires_in);\n return data;\n}\n\nexport async function revokeSession(apiBaseUrl: string): Promise<void> {\n const safeApiBaseUrl = normalizeAndValidateApiBaseUrl(apiBaseUrl);\n const creds = await loadCredentials();\n if (creds) {\n await fetch(`${safeApiBaseUrl}/api/auth/cli/revoke`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ refresh_token: creds.refreshToken }),\n }).catch(() => undefined);\n }\n accessTokenCache = null;\n await clearCredentials();\n}\n","import { chmod, lstat, mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"../config/store.js\";\n\nexport interface StoredCredentials {\n refreshToken: string;\n teamId?: string;\n teamName?: string;\n userEmail?: string;\n}\n\nconst SERVICE = \"dev.trie.cli\";\nconst ACCOUNT = \"default\";\nconst FALLBACK_FILE = \"credentials.json\";\nconst PERMS_PRIVATE = 0o600;\n\nfunction serialize(value: StoredCredentials): string {\n return JSON.stringify(value);\n}\n\nfunction parse(value: string): StoredCredentials | null {\n try {\n return JSON.parse(value) as StoredCredentials;\n } catch {\n return null;\n }\n}\n\nfunction getFallbackPath(): string {\n return join(getConfigDir(), FALLBACK_FILE);\n}\n\nasync function ensureSafeCredentialFile(path: string): Promise<void> {\n if (!existsSync(path)) return;\n const stats = await lstat(path);\n if (!stats.isFile() || stats.isSymbolicLink()) {\n throw new Error(\"Unsafe credentials file path detected.\");\n }\n}\n\nasync function loadKeytar() {\n try {\n const mod = await import(\"keytar\");\n return mod.default;\n } catch {\n return null;\n }\n}\n\nasync function saveFallback(value: StoredCredentials): Promise<void> {\n const configDir = getConfigDir();\n await mkdir(configDir, { recursive: true });\n const path = getFallbackPath();\n await ensureSafeCredentialFile(path);\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;\n await writeFile(tempPath, serialize(value), { encoding: \"utf-8\", mode: PERMS_PRIVATE, flag: \"w\" });\n await rename(tempPath, path);\n await chmod(path, PERMS_PRIVATE);\n}\n\nasync function loadFallback(): Promise<StoredCredentials | null> {\n const path = getFallbackPath();\n if (!existsSync(path)) return null;\n await ensureSafeCredentialFile(path);\n const stats = await lstat(path);\n if ((stats.mode & 0o077) !== 0) {\n await chmod(path, PERMS_PRIVATE);\n }\n const raw = await readFile(path, \"utf-8\");\n return parse(raw);\n}\n\nasync function clearFallback(): Promise<void> {\n const path = getFallbackPath();\n if (!existsSync(path)) return;\n await unlink(path).catch(() => undefined);\n}\n\nexport async function saveCredentials(value: StoredCredentials): Promise<void> {\n const keytar = await loadKeytar();\n if (keytar) {\n await keytar.setPassword(SERVICE, ACCOUNT, serialize(value));\n return;\n }\n await saveFallback(value);\n}\n\nexport async function loadCredentials(): Promise<StoredCredentials | null> {\n const keytar = await loadKeytar();\n if (keytar) {\n const raw = await keytar.getPassword(SERVICE, ACCOUNT);\n if (!raw) return null;\n return parse(raw);\n }\n return loadFallback();\n}\n\nexport async function clearCredentials(): Promise<void> {\n const keytar = await loadKeytar();\n if (keytar) {\n await keytar.deletePassword(SERVICE, ACCOUNT);\n return;\n }\n await clearFallback();\n}\n","const DEFAULT_ALLOWED_HOSTS = new Set([\n \"trie-api.vercel.app\",\n]);\n\nfunction readAllowedHosts(): Set<string> {\n const raw = process.env.TRIE_API_BASE_ALLOWLIST;\n if (!raw) return DEFAULT_ALLOWED_HOSTS;\n const hosts = raw\n .split(\",\")\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean);\n return hosts.length > 0 ? new Set(hosts) : DEFAULT_ALLOWED_HOSTS;\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\";\n}\n\nfunction allowInsecureLoopback(): boolean {\n return process.env.TRIE_ALLOW_INSECURE_LOCALHOST === \"1\";\n}\n\nexport function normalizeAndValidateApiBaseUrl(rawUrl: string): string {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n throw new Error(\"Invalid API base URL.\");\n }\n\n const protocol = parsed.protocol.toLowerCase();\n const hostname = parsed.hostname.toLowerCase();\n const hasPath = parsed.pathname !== \"/\" || parsed.search || parsed.hash;\n if (hasPath) {\n throw new Error(\"API base URL must not include path, query, or hash.\");\n }\n if (parsed.username || parsed.password) {\n throw new Error(\"API base URL must not include credentials.\");\n }\n\n if (protocol === \"https:\") {\n const allowedHosts = readAllowedHosts();\n if (!allowedHosts.has(hostname) && !isLoopbackHost(hostname)) {\n throw new Error(\"API base URL host is not in allowlist.\");\n }\n return parsed.origin;\n }\n\n if (protocol === \"http:\" && isLoopbackHost(hostname) && allowInsecureLoopback()) {\n return parsed.origin;\n }\n\n throw new Error(\"Refusing insecure API base URL.\");\n}\n","import { getAccessToken } from \"../auth/session.js\";\nimport { loadLocalConfig } from \"../config/store.js\";\nimport { normalizeAndValidateApiBaseUrl } from \"../config/api-base-url.js\";\n\nexport class CloudClient {\n private async base(): Promise<{ apiBaseUrl: string; teamId?: string }> {\n const cfg = await loadLocalConfig();\n const apiBaseUrl = normalizeAndValidateApiBaseUrl(cfg.apiBaseUrl);\n return cfg.activeTeamId ? { apiBaseUrl, teamId: cfg.activeTeamId } : { apiBaseUrl };\n }\n\n async request<T>(path: string, init?: RequestInit): Promise<T> {\n const { apiBaseUrl, teamId } = await this.base();\n const token = await getAccessToken(apiBaseUrl);\n const headers = new Headers(init?.headers || {});\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"Content-Type\", \"application/json\");\n if (teamId) headers.set(\"X-Trie-Team-Id\", teamId);\n\n let res = await fetch(`${apiBaseUrl}${path}`, { ...init, headers });\n if (res.status === 401) {\n const retryToken = await getAccessToken(apiBaseUrl);\n headers.set(\"Authorization\", `Bearer ${retryToken}`);\n res = await fetch(`${apiBaseUrl}${path}`, { ...init, headers });\n }\n if (!res.ok) {\n throw new Error(`Cloud API error ${res.status}: ${path}`);\n }\n return (await res.json()) as T;\n }\n}\n\nexport const cloudClient = new CloudClient();\n","import { cloudClient } from \"./client.js\";\nimport type { CloudGraphResponse } from \"./types.js\";\n\nexport interface GraphQuery {\n view?: string;\n types?: string[];\n since?: string;\n until?: string;\n}\n\nexport async function fetchGraph(query: GraphQuery = {}): Promise<CloudGraphResponse> {\n const params = new URLSearchParams();\n if (query.view) params.set(\"view\", query.view);\n if (query.types?.length) params.set(\"types\", query.types.join(\",\"));\n if (query.since) params.set(\"since\", query.since);\n if (query.until) params.set(\"until\", query.until);\n const qs = params.toString();\n return cloudClient.request<CloudGraphResponse>(`/api/cloud/ledger/graph${qs ? `?${qs}` : \"\"}`);\n}\n","import { cloudClient } from \"./client.js\";\nimport type { SignalItem } from \"./types.js\";\n\nexport async function fetchSignals(limit = 20): Promise<SignalItem[]> {\n const data = await cloudClient.request<{ items?: SignalItem[]; signals?: SignalItem[] }>(\n `/api/cloud/signals?limit=${limit}`,\n );\n return data.items || data.signals || [];\n}\n","import { cloudClient } from \"./client.js\";\nimport type { CloudDocument } from \"./types.js\";\n\nexport async function fetchDocuments(): Promise<CloudDocument[]> {\n const data = await cloudClient.request<{ items?: CloudDocument[]; documents?: CloudDocument[] }>(\n \"/api/cloud/documents\",\n );\n return data.items || data.documents || [];\n}\n","import type { CloudLedgerResponse } from \"./types.js\";\nimport { cloudClient } from \"./client.js\";\n\nexport async function fetchLedger(project?: string): Promise<CloudLedgerResponse> {\n const qs = project ? `?project=${encodeURIComponent(project)}` : \"\";\n return cloudClient.request<CloudLedgerResponse>(`/api/cloud/ledger${qs}`);\n}\n"],"mappings":"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","names":["mkdir","readFile","writeFile","existsSync","join","join","existsSync","mkdir","writeFile","readFile","hostname"]}
|