@triedotdev/mcp 1.0.168 → 1.0.170

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.
Files changed (149) hide show
  1. package/README.md +54 -500
  2. package/dist/chunk-2YXOBNKW.js +619 -0
  3. package/dist/chunk-2YXOBNKW.js.map +1 -0
  4. package/dist/chunk-QR64Y5TI.js +363 -0
  5. package/dist/chunk-QR64Y5TI.js.map +1 -0
  6. package/dist/cli/main.d.ts +0 -15
  7. package/dist/cli/main.js +356 -3100
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/index.js +2 -36
  10. package/dist/index.js.map +1 -1
  11. package/dist/server/mcp-server.js +2 -36
  12. package/package.json +8 -31
  13. package/dist/autonomy-config-FSERX3O3.js +0 -30
  14. package/dist/autonomy-config-FSERX3O3.js.map +0 -1
  15. package/dist/chat-store-JNGNTDSN.js +0 -15
  16. package/dist/chat-store-JNGNTDSN.js.map +0 -1
  17. package/dist/chunk-2HF65EHQ.js +0 -311
  18. package/dist/chunk-2HF65EHQ.js.map +0 -1
  19. package/dist/chunk-43X6JBEM.js +0 -36
  20. package/dist/chunk-43X6JBEM.js.map +0 -1
  21. package/dist/chunk-4MXH2ZPT.js +0 -1827
  22. package/dist/chunk-4MXH2ZPT.js.map +0 -1
  23. package/dist/chunk-575YT2SD.js +0 -737
  24. package/dist/chunk-575YT2SD.js.map +0 -1
  25. package/dist/chunk-5BRRRTN6.js +0 -354
  26. package/dist/chunk-5BRRRTN6.js.map +0 -1
  27. package/dist/chunk-6NLHFIYA.js +0 -344
  28. package/dist/chunk-6NLHFIYA.js.map +0 -1
  29. package/dist/chunk-7WITSO22.js +0 -824
  30. package/dist/chunk-7WITSO22.js.map +0 -1
  31. package/dist/chunk-DGUM43GV.js +0 -11
  32. package/dist/chunk-DGUM43GV.js.map +0 -1
  33. package/dist/chunk-EFWVF6TI.js +0 -267
  34. package/dist/chunk-EFWVF6TI.js.map +0 -1
  35. package/dist/chunk-F6WFNUAY.js +0 -216
  36. package/dist/chunk-F6WFNUAY.js.map +0 -1
  37. package/dist/chunk-FQ45QP5A.js +0 -361
  38. package/dist/chunk-FQ45QP5A.js.map +0 -1
  39. package/dist/chunk-G2TGF6TR.js +0 -573
  40. package/dist/chunk-G2TGF6TR.js.map +0 -1
  41. package/dist/chunk-GTKYBOXL.js +0 -700
  42. package/dist/chunk-GTKYBOXL.js.map +0 -1
  43. package/dist/chunk-HVCDY3AK.js +0 -850
  44. package/dist/chunk-HVCDY3AK.js.map +0 -1
  45. package/dist/chunk-JVMBCWKS.js +0 -348
  46. package/dist/chunk-JVMBCWKS.js.map +0 -1
  47. package/dist/chunk-KDHN2ZQE.js +0 -313
  48. package/dist/chunk-KDHN2ZQE.js.map +0 -1
  49. package/dist/chunk-LQIMKE3P.js +0 -12524
  50. package/dist/chunk-LQIMKE3P.js.map +0 -1
  51. package/dist/chunk-ME2OERF5.js +0 -345
  52. package/dist/chunk-ME2OERF5.js.map +0 -1
  53. package/dist/chunk-MRHKX5M5.js +0 -662
  54. package/dist/chunk-MRHKX5M5.js.map +0 -1
  55. package/dist/chunk-OBQ74FOU.js +0 -27
  56. package/dist/chunk-OBQ74FOU.js.map +0 -1
  57. package/dist/chunk-OMR4YCBS.js +0 -987
  58. package/dist/chunk-OMR4YCBS.js.map +0 -1
  59. package/dist/chunk-Q5EKA5YA.js +0 -254
  60. package/dist/chunk-Q5EKA5YA.js.map +0 -1
  61. package/dist/chunk-Q63FFI6D.js +0 -132
  62. package/dist/chunk-Q63FFI6D.js.map +0 -1
  63. package/dist/chunk-SY6KQG44.js +0 -983
  64. package/dist/chunk-SY6KQG44.js.map +0 -1
  65. package/dist/chunk-T63OHG4Q.js +0 -440
  66. package/dist/chunk-T63OHG4Q.js.map +0 -1
  67. package/dist/chunk-TN5WEKWI.js +0 -173
  68. package/dist/chunk-TN5WEKWI.js.map +0 -1
  69. package/dist/chunk-VUL52BQL.js +0 -402
  70. package/dist/chunk-VUL52BQL.js.map +0 -1
  71. package/dist/chunk-VVITXIHN.js +0 -189
  72. package/dist/chunk-VVITXIHN.js.map +0 -1
  73. package/dist/chunk-WCN7S3EI.js +0 -14
  74. package/dist/chunk-WCN7S3EI.js.map +0 -1
  75. package/dist/chunk-XE6KQRKZ.js +0 -816
  76. package/dist/chunk-XE6KQRKZ.js.map +0 -1
  77. package/dist/chunk-XPZZFPBZ.js +0 -491
  78. package/dist/chunk-XPZZFPBZ.js.map +0 -1
  79. package/dist/chunk-XTFWT2XM.js +0 -727
  80. package/dist/chunk-XTFWT2XM.js.map +0 -1
  81. package/dist/chunk-YDHUCDHM.js +0 -4011
  82. package/dist/chunk-YDHUCDHM.js.map +0 -1
  83. package/dist/chunk-YZ6Y2H3P.js +0 -1289
  84. package/dist/chunk-YZ6Y2H3P.js.map +0 -1
  85. package/dist/chunk-ZJF5FTBX.js +0 -1396
  86. package/dist/chunk-ZJF5FTBX.js.map +0 -1
  87. package/dist/chunk-ZV2K6M7T.js +0 -74
  88. package/dist/chunk-ZV2K6M7T.js.map +0 -1
  89. package/dist/cli/create-agent.d.ts +0 -1
  90. package/dist/cli/create-agent.js +0 -1050
  91. package/dist/cli/create-agent.js.map +0 -1
  92. package/dist/cli/yolo-daemon.d.ts +0 -1
  93. package/dist/cli/yolo-daemon.js +0 -423
  94. package/dist/cli/yolo-daemon.js.map +0 -1
  95. package/dist/client-NJPZE5JT.js +0 -28
  96. package/dist/client-NJPZE5JT.js.map +0 -1
  97. package/dist/codebase-index-VAPF32XX.js +0 -12
  98. package/dist/codebase-index-VAPF32XX.js.map +0 -1
  99. package/dist/fast-analyzer-XXYMOXRK.js +0 -216
  100. package/dist/fast-analyzer-XXYMOXRK.js.map +0 -1
  101. package/dist/git-EO5SRFMN.js +0 -28
  102. package/dist/git-EO5SRFMN.js.map +0 -1
  103. package/dist/github-ingester-ZOKK6GRS.js +0 -11
  104. package/dist/github-ingester-ZOKK6GRS.js.map +0 -1
  105. package/dist/goal-manager-YOB7VWK7.js +0 -25
  106. package/dist/goal-manager-YOB7VWK7.js.map +0 -1
  107. package/dist/goal-validator-ULKIBDPX.js +0 -24
  108. package/dist/goal-validator-ULKIBDPX.js.map +0 -1
  109. package/dist/graph-B3NA4S7I.js +0 -10
  110. package/dist/graph-B3NA4S7I.js.map +0 -1
  111. package/dist/hypothesis-7BFFT5JY.js +0 -23
  112. package/dist/hypothesis-7BFFT5JY.js.map +0 -1
  113. package/dist/incident-index-EFNUSGWL.js +0 -11
  114. package/dist/incident-index-EFNUSGWL.js.map +0 -1
  115. package/dist/insight-store-EC4PLSAW.js +0 -22
  116. package/dist/insight-store-EC4PLSAW.js.map +0 -1
  117. package/dist/issue-store-ZIRP23EP.js +0 -36
  118. package/dist/issue-store-ZIRP23EP.js.map +0 -1
  119. package/dist/ledger-TWZTGDFA.js +0 -58
  120. package/dist/ledger-TWZTGDFA.js.map +0 -1
  121. package/dist/linear-ingester-XXPAZZRW.js +0 -11
  122. package/dist/linear-ingester-XXPAZZRW.js.map +0 -1
  123. package/dist/output-manager-RVJ37XKA.js +0 -13
  124. package/dist/output-manager-RVJ37XKA.js.map +0 -1
  125. package/dist/parse-goal-violation-SACGFG3C.js +0 -8
  126. package/dist/parse-goal-violation-SACGFG3C.js.map +0 -1
  127. package/dist/pattern-discovery-F7LU5K6E.js +0 -8
  128. package/dist/pattern-discovery-F7LU5K6E.js.map +0 -1
  129. package/dist/progress-SRQ2V3BP.js +0 -18
  130. package/dist/progress-SRQ2V3BP.js.map +0 -1
  131. package/dist/project-state-AHPA77SM.js +0 -28
  132. package/dist/project-state-AHPA77SM.js.map +0 -1
  133. package/dist/sync-M2FSWPBC.js +0 -12
  134. package/dist/sync-M2FSWPBC.js.map +0 -1
  135. package/dist/terminal-spawn-5YXDMUCF.js +0 -157
  136. package/dist/terminal-spawn-5YXDMUCF.js.map +0 -1
  137. package/dist/tiered-storage-Z3YCR465.js +0 -12
  138. package/dist/tiered-storage-Z3YCR465.js.map +0 -1
  139. package/dist/trie-agent-3YDPEGHJ.js +0 -28
  140. package/dist/trie-agent-3YDPEGHJ.js.map +0 -1
  141. package/dist/ui/chat.html +0 -1014
  142. package/dist/ui/goals.html +0 -967
  143. package/dist/ui/hypotheses.html +0 -1011
  144. package/dist/ui/ledger.html +0 -954
  145. package/dist/ui/nudges.html +0 -995
  146. package/dist/vibe-code-signatures-F6URTBW3.js +0 -16
  147. package/dist/vibe-code-signatures-F6URTBW3.js.map +0 -1
  148. package/dist/vulnerability-signatures-T7SKHORW.js +0 -18
  149. package/dist/vulnerability-signatures-T7SKHORW.js.map +0 -1
@@ -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 • \"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"]}
@@ -0,0 +1,363 @@
1
+ // src/cache/session-cache.ts
2
+ var SessionCache = class {
3
+ cache = /* @__PURE__ */ new Map();
4
+ async get(key, ttlMs, fetcher) {
5
+ const hit = this.cache.get(key);
6
+ if (hit && Date.now() - hit.fetchedAt < ttlMs) {
7
+ return hit.data;
8
+ }
9
+ const data = await fetcher();
10
+ this.cache.set(key, { fetchedAt: Date.now(), data });
11
+ return data;
12
+ }
13
+ invalidate(key) {
14
+ this.cache.delete(key);
15
+ }
16
+ invalidateAll() {
17
+ this.cache.clear();
18
+ }
19
+ stats() {
20
+ return { size: this.cache.size, keys: [...this.cache.keys()] };
21
+ }
22
+ };
23
+ var sessionCache = new SessionCache();
24
+
25
+ // src/config/store.ts
26
+ import { mkdir, readFile, writeFile } from "fs/promises";
27
+ import { existsSync } from "fs";
28
+ import { homedir } from "os";
29
+ import { join } from "path";
30
+ var DEFAULT_CONFIG = {
31
+ apiBaseUrl: process.env.TRIE_API_BASE_URL || "https://trie-api.vercel.app"
32
+ };
33
+ function getConfigDir() {
34
+ return join(homedir(), ".trie");
35
+ }
36
+ function getConfigPath() {
37
+ return join(getConfigDir(), "config.json");
38
+ }
39
+ async function ensureConfigDir() {
40
+ await mkdir(getConfigDir(), { recursive: true });
41
+ }
42
+ async function loadLocalConfig() {
43
+ const path = getConfigPath();
44
+ if (!existsSync(path)) {
45
+ return { ...DEFAULT_CONFIG };
46
+ }
47
+ try {
48
+ const raw = await readFile(path, "utf-8");
49
+ const parsed = JSON.parse(raw);
50
+ return { ...DEFAULT_CONFIG, ...parsed };
51
+ } catch {
52
+ return { ...DEFAULT_CONFIG };
53
+ }
54
+ }
55
+ async function saveLocalConfig(next) {
56
+ await ensureConfigDir();
57
+ const path = getConfigPath();
58
+ await writeFile(path, `${JSON.stringify(next, null, 2)}
59
+ `, "utf-8");
60
+ }
61
+
62
+ // src/auth/session.ts
63
+ import { createHash } from "crypto";
64
+ import { hostname, platform, userInfo } from "os";
65
+
66
+ // src/auth/keychain.ts
67
+ import { chmod, lstat, mkdir as mkdir2, readFile as readFile2, rename, unlink, writeFile as writeFile2 } from "fs/promises";
68
+ import { existsSync as existsSync2 } from "fs";
69
+ import { join as join2 } from "path";
70
+ var SERVICE = "dev.trie.cli";
71
+ var ACCOUNT = "default";
72
+ var FALLBACK_FILE = "credentials.json";
73
+ var PERMS_PRIVATE = 384;
74
+ function serialize(value) {
75
+ return JSON.stringify(value);
76
+ }
77
+ function parse(value) {
78
+ try {
79
+ return JSON.parse(value);
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+ function getFallbackPath() {
85
+ return join2(getConfigDir(), FALLBACK_FILE);
86
+ }
87
+ async function ensureSafeCredentialFile(path) {
88
+ if (!existsSync2(path)) return;
89
+ const stats = await lstat(path);
90
+ if (!stats.isFile() || stats.isSymbolicLink()) {
91
+ throw new Error("Unsafe credentials file path detected.");
92
+ }
93
+ }
94
+ async function loadKeytar() {
95
+ try {
96
+ const mod = await import("keytar");
97
+ return mod.default;
98
+ } catch {
99
+ return null;
100
+ }
101
+ }
102
+ async function saveFallback(value) {
103
+ const configDir = getConfigDir();
104
+ await mkdir2(configDir, { recursive: true });
105
+ const path = getFallbackPath();
106
+ await ensureSafeCredentialFile(path);
107
+ const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;
108
+ await writeFile2(tempPath, serialize(value), { encoding: "utf-8", mode: PERMS_PRIVATE, flag: "w" });
109
+ await rename(tempPath, path);
110
+ await chmod(path, PERMS_PRIVATE);
111
+ }
112
+ async function loadFallback() {
113
+ const path = getFallbackPath();
114
+ if (!existsSync2(path)) return null;
115
+ await ensureSafeCredentialFile(path);
116
+ const stats = await lstat(path);
117
+ if ((stats.mode & 63) !== 0) {
118
+ await chmod(path, PERMS_PRIVATE);
119
+ }
120
+ const raw = await readFile2(path, "utf-8");
121
+ return parse(raw);
122
+ }
123
+ async function clearFallback() {
124
+ const path = getFallbackPath();
125
+ if (!existsSync2(path)) return;
126
+ await unlink(path).catch(() => void 0);
127
+ }
128
+ async function saveCredentials(value) {
129
+ const keytar = await loadKeytar();
130
+ if (keytar) {
131
+ await keytar.setPassword(SERVICE, ACCOUNT, serialize(value));
132
+ return;
133
+ }
134
+ await saveFallback(value);
135
+ }
136
+ async function loadCredentials() {
137
+ const keytar = await loadKeytar();
138
+ if (keytar) {
139
+ const raw = await keytar.getPassword(SERVICE, ACCOUNT);
140
+ if (!raw) return null;
141
+ return parse(raw);
142
+ }
143
+ return loadFallback();
144
+ }
145
+ async function clearCredentials() {
146
+ const keytar = await loadKeytar();
147
+ if (keytar) {
148
+ await keytar.deletePassword(SERVICE, ACCOUNT);
149
+ return;
150
+ }
151
+ await clearFallback();
152
+ }
153
+
154
+ // src/config/api-base-url.ts
155
+ var DEFAULT_ALLOWED_HOSTS = /* @__PURE__ */ new Set([
156
+ "trie-api.vercel.app"
157
+ ]);
158
+ function readAllowedHosts() {
159
+ const raw = process.env.TRIE_API_BASE_ALLOWLIST;
160
+ if (!raw) return DEFAULT_ALLOWED_HOSTS;
161
+ const hosts = raw.split(",").map((part) => part.trim().toLowerCase()).filter(Boolean);
162
+ return hosts.length > 0 ? new Set(hosts) : DEFAULT_ALLOWED_HOSTS;
163
+ }
164
+ function isLoopbackHost(hostname2) {
165
+ return hostname2 === "localhost" || hostname2 === "127.0.0.1" || hostname2 === "::1";
166
+ }
167
+ function allowInsecureLoopback() {
168
+ return process.env.TRIE_ALLOW_INSECURE_LOCALHOST === "1";
169
+ }
170
+ function normalizeAndValidateApiBaseUrl(rawUrl) {
171
+ let parsed;
172
+ try {
173
+ parsed = new URL(rawUrl);
174
+ } catch {
175
+ throw new Error("Invalid API base URL.");
176
+ }
177
+ const protocol = parsed.protocol.toLowerCase();
178
+ const hostname2 = parsed.hostname.toLowerCase();
179
+ const hasPath = parsed.pathname !== "/" || parsed.search || parsed.hash;
180
+ if (hasPath) {
181
+ throw new Error("API base URL must not include path, query, or hash.");
182
+ }
183
+ if (parsed.username || parsed.password) {
184
+ throw new Error("API base URL must not include credentials.");
185
+ }
186
+ if (protocol === "https:") {
187
+ const allowedHosts = readAllowedHosts();
188
+ if (!allowedHosts.has(hostname2) && !isLoopbackHost(hostname2)) {
189
+ throw new Error("API base URL host is not in allowlist.");
190
+ }
191
+ return parsed.origin;
192
+ }
193
+ if (protocol === "http:" && isLoopbackHost(hostname2) && allowInsecureLoopback()) {
194
+ return parsed.origin;
195
+ }
196
+ throw new Error("Refusing insecure API base URL.");
197
+ }
198
+
199
+ // src/auth/session.ts
200
+ var accessTokenCache = null;
201
+ var refreshAttempts = [];
202
+ function getMachineFingerprint() {
203
+ return createHash("sha256").update(`${hostname()}:${userInfo().username}:${platform()}:${process.arch}`).digest("hex");
204
+ }
205
+ function allowRefreshAttempt() {
206
+ const now = Date.now();
207
+ refreshAttempts = refreshAttempts.filter((t) => now - t < 6e4);
208
+ if (refreshAttempts.length >= 5) return false;
209
+ refreshAttempts.push(now);
210
+ return true;
211
+ }
212
+ function setAccessToken(token, expiresIn) {
213
+ accessTokenCache = {
214
+ token,
215
+ expiresAt: Date.now() + Math.max(10, expiresIn - 300) * 1e3
216
+ };
217
+ }
218
+ async function persistAuthTokens(tokens) {
219
+ if (tokens.refresh_token) {
220
+ const credentialsPayload = {
221
+ refreshToken: tokens.refresh_token
222
+ };
223
+ if (tokens.team?.id) credentialsPayload.teamId = tokens.team.id;
224
+ if (tokens.team?.name) credentialsPayload.teamName = tokens.team.name;
225
+ if (tokens.user?.email) credentialsPayload.userEmail = tokens.user.email;
226
+ await saveCredentials({
227
+ ...credentialsPayload
228
+ });
229
+ }
230
+ setAccessToken(tokens.access_token, tokens.expires_in);
231
+ const cfg = await loadLocalConfig();
232
+ const nextConfig = {
233
+ ...cfg
234
+ };
235
+ if (tokens.team?.id) nextConfig.activeTeamId = tokens.team.id;
236
+ if (tokens.team?.name) nextConfig.activeTeamName = tokens.team.name;
237
+ if (tokens.user?.email) nextConfig.userEmail = tokens.user.email;
238
+ await saveLocalConfig({
239
+ ...nextConfig
240
+ });
241
+ }
242
+ async function getAccessToken(apiBaseUrl) {
243
+ if (accessTokenCache && Date.now() < accessTokenCache.expiresAt) {
244
+ return accessTokenCache.token;
245
+ }
246
+ const creds = await loadCredentials();
247
+ if (!creds) throw new Error("Not authenticated. Run `trie login`.");
248
+ const refreshed = await refreshAccessToken(apiBaseUrl, creds.refreshToken);
249
+ return refreshed.access_token;
250
+ }
251
+ async function refreshAccessToken(apiBaseUrl, refreshToken) {
252
+ const safeApiBaseUrl = normalizeAndValidateApiBaseUrl(apiBaseUrl);
253
+ if (!allowRefreshAttempt()) {
254
+ throw new Error("Refresh rate limited. Try again in a minute.");
255
+ }
256
+ const res = await fetch(`${safeApiBaseUrl}/api/auth/cli/refresh`, {
257
+ method: "POST",
258
+ headers: { "Content-Type": "application/json" },
259
+ body: JSON.stringify({
260
+ refresh_token: refreshToken,
261
+ machine_fingerprint: getMachineFingerprint()
262
+ })
263
+ });
264
+ if (!res.ok) {
265
+ if (res.status === 401 || res.status === 403) {
266
+ await clearCredentials();
267
+ }
268
+ throw new Error("Session expired. Run `trie login`.");
269
+ }
270
+ const data = await res.json();
271
+ setAccessToken(data.access_token, data.expires_in);
272
+ return data;
273
+ }
274
+ async function revokeSession(apiBaseUrl) {
275
+ const safeApiBaseUrl = normalizeAndValidateApiBaseUrl(apiBaseUrl);
276
+ const creds = await loadCredentials();
277
+ if (creds) {
278
+ await fetch(`${safeApiBaseUrl}/api/auth/cli/revoke`, {
279
+ method: "POST",
280
+ headers: { "Content-Type": "application/json" },
281
+ body: JSON.stringify({ refresh_token: creds.refreshToken })
282
+ }).catch(() => void 0);
283
+ }
284
+ accessTokenCache = null;
285
+ await clearCredentials();
286
+ }
287
+
288
+ // src/cloud/client.ts
289
+ var CloudClient = class {
290
+ async base() {
291
+ const cfg = await loadLocalConfig();
292
+ const apiBaseUrl = normalizeAndValidateApiBaseUrl(cfg.apiBaseUrl);
293
+ return cfg.activeTeamId ? { apiBaseUrl, teamId: cfg.activeTeamId } : { apiBaseUrl };
294
+ }
295
+ async request(path, init) {
296
+ const { apiBaseUrl, teamId } = await this.base();
297
+ const token = await getAccessToken(apiBaseUrl);
298
+ const headers = new Headers(init?.headers || {});
299
+ headers.set("Authorization", `Bearer ${token}`);
300
+ headers.set("Content-Type", "application/json");
301
+ if (teamId) headers.set("X-Trie-Team-Id", teamId);
302
+ let res = await fetch(`${apiBaseUrl}${path}`, { ...init, headers });
303
+ if (res.status === 401) {
304
+ const retryToken = await getAccessToken(apiBaseUrl);
305
+ headers.set("Authorization", `Bearer ${retryToken}`);
306
+ res = await fetch(`${apiBaseUrl}${path}`, { ...init, headers });
307
+ }
308
+ if (!res.ok) {
309
+ throw new Error(`Cloud API error ${res.status}: ${path}`);
310
+ }
311
+ return await res.json();
312
+ }
313
+ };
314
+ var cloudClient = new CloudClient();
315
+
316
+ // src/cloud/graph.ts
317
+ async function fetchGraph(query = {}) {
318
+ const params = new URLSearchParams();
319
+ if (query.view) params.set("view", query.view);
320
+ if (query.types?.length) params.set("types", query.types.join(","));
321
+ if (query.since) params.set("since", query.since);
322
+ if (query.until) params.set("until", query.until);
323
+ const qs = params.toString();
324
+ return cloudClient.request(`/api/cloud/ledger/graph${qs ? `?${qs}` : ""}`);
325
+ }
326
+
327
+ // src/cloud/signals.ts
328
+ async function fetchSignals(limit = 20) {
329
+ const data = await cloudClient.request(
330
+ `/api/cloud/signals?limit=${limit}`
331
+ );
332
+ return data.items || data.signals || [];
333
+ }
334
+
335
+ // src/cloud/documents.ts
336
+ async function fetchDocuments() {
337
+ const data = await cloudClient.request(
338
+ "/api/cloud/documents"
339
+ );
340
+ return data.items || data.documents || [];
341
+ }
342
+
343
+ // src/cloud/ledger.ts
344
+ async function fetchLedger(project) {
345
+ const qs = project ? `?project=${encodeURIComponent(project)}` : "";
346
+ return cloudClient.request(`/api/cloud/ledger${qs}`);
347
+ }
348
+
349
+ export {
350
+ sessionCache,
351
+ loadLocalConfig,
352
+ saveLocalConfig,
353
+ normalizeAndValidateApiBaseUrl,
354
+ getMachineFingerprint,
355
+ persistAuthTokens,
356
+ revokeSession,
357
+ cloudClient,
358
+ fetchGraph,
359
+ fetchSignals,
360
+ fetchDocuments,
361
+ fetchLedger
362
+ };
363
+ //# sourceMappingURL=chunk-QR64Y5TI.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 }\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"]}
@@ -1,16 +1 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Trie Agent CLI
4
- *
5
- * Main command-line interface for Trie Agent.
6
- * Provides help, setup, and routes to specific tools.
7
- *
8
- * Usage:
9
- * trie-agent [command] [options]
10
- */
11
- /**
12
- * Handle status command - quick health check
13
- */
14
- declare function handleStatusCommand(): Promise<void>;
15
-
16
- export { handleStatusCommand };