@jaypie/mcp 0.8.86 → 0.8.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/createMcpServer.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcpExpressHandler.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/suite.d.ts +11 -0
- package/dist/suite.js.map +1 -1
- package/dist/suites/datadog/datadog.js.map +1 -1
- package/dist/suites/datadog/index.js.map +1 -1
- package/dist/suites/docs/index.js +1 -1
- package/dist/suites/docs/index.js.map +1 -1
- package/package.json +3 -3
- package/release-notes/eslint/1.2.5.md +26 -0
- package/release-notes/fabricator/0.4.0.md +18 -0
- package/release-notes/jaypie/1.2.58.md +11 -0
- package/release-notes/kit/1.2.13.md +11 -0
- package/release-notes/llm/1.3.5.md +28 -0
- package/release-notes/mcp/0.8.87.md +21 -0
- package/release-notes/repokit/2.0.0.md +13 -0
- package/release-notes/testkit/1.2.48.md +21 -0
- package/release-notes/testkit/1.2.49.md +11 -0
- package/release-notes/textract/0.2.6.md +16 -0
- package/skills/llm.md +36 -0
- package/skills/monorepo.md +1 -1
- package/skills/repokit.md +9 -10
- package/skills/subpackage.md +5 -3
- /package/dist/{createMcpServer.d.ts → src/createMcpServer.d.ts} +0 -0
- /package/dist/{mcpExpressHandler.d.ts → src/mcpExpressHandler.d.ts} +0 -0
- /package/dist/{suites → src/suites}/datadog/datadog.d.ts +0 -0
- /package/dist/{suites → src/suites}/datadog/index.d.ts +0 -0
- /package/dist/{suites → src/suites}/docs/index.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMcpServer.js","sources":["
|
|
1
|
+
{"version":3,"file":"createMcpServer.js","sources":["../../src/createMcpServer.ts"],"sourcesContent":["/* eslint-disable no-console -- MCP stdio: stderr is the only valid log channel; stdout is reserved for JSON-RPC */\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { createMcpServerFromSuite } from \"@jaypie/fabric/mcp\";\n\nimport { suite } from \"./suite.js\";\n\nexport interface CreateMcpServerOptions {\n version?: string;\n verbose?: boolean;\n}\n\n/**\n * Creates and configures an MCP server instance with Jaypie tools\n *\n * Uses ServiceSuite to register all services as MCP tools automatically.\n * Services are defined in suite.ts using fabricService and registered\n * by category. The createMcpServerFromSuite bridge converts them to\n * MCP tools with proper Zod schema validation.\n *\n * @param options - Configuration options (or legacy version string)\n * @returns Configured MCP server instance\n */\nexport function createMcpServer(\n options: CreateMcpServerOptions | string = {},\n): McpServer {\n // Support legacy signature: createMcpServer(version: string)\n const config: CreateMcpServerOptions =\n typeof options === \"string\" ? { version: options } : options;\n\n const { version = \"0.0.0\", verbose = false } = config;\n\n if (verbose) {\n console.error(\"[jaypie-mcp] Creating MCP server instance from suite\");\n }\n\n const server = createMcpServerFromSuite(suite, {\n name: suite.name,\n version,\n });\n\n if (verbose) {\n console.error(\n `[jaypie-mcp] Registered ${suite.services.length} tools from suite`,\n );\n console.error(`[jaypie-mcp] Categories: ${suite.categories.join(\", \")}`);\n }\n\n return server;\n}\n"],"names":[],"mappings":";;;AAYA;;;;;;;;;;AAUG;AACG,SAAU,eAAe,CAC7B,OAAA,GAA2C,EAAE,EAAA;;AAG7C,IAAA,MAAM,MAAM,GACV,OAAO,OAAO,KAAK,QAAQ,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO;IAE9D,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,MAAM;IAErD,IAAI,OAAO,EAAE;AACX,QAAA,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC;IACvE;AAEA,IAAA,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,EAAE;QAC7C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO;AACR,KAAA,CAAC;IAEF,IAAI,OAAO,EAAE;QACX,OAAO,CAAC,KAAK,CACX,CAAA,wBAAA,EAA2B,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAA,iBAAA,CAAmB,CACpE;AACD,QAAA,OAAO,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA4B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;IAC1E;AAEA,IAAA,OAAO,MAAM;AACf;;;;"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/* eslint-disable no-console -- MCP stdio: stderr is the only valid log channel; stdout is reserved for JSON-RPC */\nimport { readFileSync, realpathSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createMcpServer } from \"./createMcpServer.js\";\n\n// Version will be injected during build\nconst version = \"0.0.0\";\n\n/**\n * Load environment variables from .env file in current working directory\n * Simple implementation that doesn't require external dependencies\n */\nfunction loadEnvFile() {\n try {\n const envPath = join(process.cwd(), \".env\");\n const content = readFileSync(envPath, \"utf-8\");\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n // Skip comments and empty lines\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Remove surrounding quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n // Only set if not already defined (environment takes precedence)\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n } catch {\n // .env file not found or not readable - that's fine\n }\n}\n\n// Load .env file before anything else\nloadEnvFile();\n\n// Parse command-line arguments\nconst args = process.argv.slice(2);\nconst verbose = args.includes(\"--verbose\") || args.includes(\"-v\");\n\n// Logger for verbose mode (uses stderr to not interfere with JSON-RPC on stdout)\nconst log = {\n info: (message: string, ...args: unknown[]) => {\n if (verbose) {\n console.error(`[jaypie-mcp] ${message}`, ...args);\n }\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[jaypie-mcp ERROR] ${message}`, ...args);\n },\n};\n\nlet server: McpServer | null = null;\nlet isShuttingDown = false;\n\nasync function gracefulShutdown(exitCode = 0) {\n if (isShuttingDown) {\n return;\n }\n isShuttingDown = true;\n\n log.info(\"Shutting down gracefully...\");\n\n try {\n if (server) {\n await server.close();\n log.info(\"Server closed successfully\");\n }\n } catch (error) {\n log.error(\"Error during shutdown:\", error);\n } finally {\n process.exit(exitCode);\n }\n}\n\nasync function main() {\n log.info(\"Starting Jaypie MCP server...\");\n log.info(`Version: ${version}`);\n log.info(`Node version: ${process.version}`);\n log.info(`Verbose mode: ${verbose ? \"enabled\" : \"disabled\"}`);\n\n server = createMcpServer({ version, verbose });\n\n log.info(\"MCP server created successfully\");\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n log.info(\"Connected to stdio transport\");\n log.info(\"Server is ready to accept requests\");\n\n // Handle process termination signals\n process.on(\"SIGINT\", () => {\n log.info(\"Received SIGINT signal\");\n gracefulShutdown(0);\n });\n process.on(\"SIGTERM\", () => {\n log.info(\"Received SIGTERM signal\");\n gracefulShutdown(0);\n });\n\n // Handle stdio stream errors (but let transport handle normal stdin end/close)\n process.stdin.on(\"error\", (error) => {\n if (error.message?.includes(\"EPIPE\") || error.message?.includes(\"EOF\")) {\n log.info(\"stdin closed\");\n gracefulShutdown(0);\n }\n });\n\n process.stdout.on(\"error\", (error) => {\n if (error.message?.includes(\"EPIPE\")) {\n log.info(\"stdout pipe broken\");\n gracefulShutdown(0);\n }\n });\n\n // Server is running on stdio\n}\n\n// Only run main() if this module is executed directly (not imported)\n// This handles npx and symlinks in node_modules/.bin correctly\nif (process.argv[1]) {\n const realPath = realpathSync(process.argv[1]);\n const realPathAsUrl = pathToFileURL(realPath).href;\n if (import.meta.url === realPathAsUrl) {\n main().catch((error) => {\n log.error(\"Fatal error:\", error);\n process.exit(1);\n });\n }\n}\n\nexport { createMcpServer } from \"./createMcpServer.js\";\nexport type { CreateMcpServerOptions } from \"./createMcpServer.js\";\nexport {\n mcpExpressHandler,\n type McpExpressHandlerOptions,\n} from \"./mcpExpressHandler.js\";\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpExpressHandler.js","sources":["
|
|
1
|
+
{"version":3,"file":"mcpExpressHandler.js","sources":["../../src/mcpExpressHandler.ts"],"sourcesContent":["import { Request, Response } from \"express\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { createMcpServer } from \"./createMcpServer.js\";\n\n// Version will be injected during build\nconst DEFAULT_VERSION = \"0.0.0\";\n\n/**\n * Options for configuring the MCP Express handler\n */\nexport interface McpExpressHandlerOptions {\n /**\n * Version string for the MCP server\n */\n version?: string;\n /**\n * Whether to enable session management (stateful mode)\n * Default: true\n */\n enableSessions?: boolean;\n /**\n * Custom session ID generator function\n */\n sessionIdGenerator?: () => string;\n /**\n * Enable JSON responses instead of SSE streaming\n * Default: false\n */\n enableJsonResponse?: boolean;\n}\n\n/**\n * Creates an Express handler for the Jaypie MCP server using HTTP transport\n *\n * @param options - Configuration options for the handler\n * @returns Promise that resolves to an Express middleware function\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { mcpExpressHandler } from '@jaypie/mcp';\n *\n * const app = express();\n * app.use(express.json());\n *\n * // Note: mcpExpressHandler is now async\n * app.use('/mcp', await mcpExpressHandler({\n * version: '1.0.0',\n * enableSessions: true\n * }));\n *\n * app.listen(3000, () => {\n * console.log('MCP server running on http://localhost:3000/mcp');\n * });\n * ```\n */\nexport async function mcpExpressHandler(\n options: McpExpressHandlerOptions = {},\n): Promise<(req: Request, res: Response) => Promise<void>> {\n const {\n version = DEFAULT_VERSION,\n enableSessions = true,\n sessionIdGenerator = () => randomUUID(),\n enableJsonResponse = false,\n } = options;\n\n const server = createMcpServer(version);\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: enableSessions ? sessionIdGenerator : undefined,\n enableJsonResponse,\n });\n\n await server.connect(transport);\n\n return async (req: Request, res: Response): Promise<void> => {\n try {\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n error: \"Internal server error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n }\n };\n}\n"],"names":[],"mappings":";;;;AAKA;AACA,MAAM,eAAe,GAAG,OAAO;AA0B/B;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACI,eAAe,iBAAiB,CACrC,UAAoC,EAAE,EAAA;IAEtC,MAAM,EACJ,OAAO,GAAG,eAAe,EACzB,cAAc,GAAG,IAAI,EACrB,kBAAkB,GAAG,MAAM,UAAU,EAAE,EACvC,kBAAkB,GAAG,KAAK,GAC3B,GAAG,OAAO;AAEX,IAAA,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC;AAEvC,IAAA,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;QAClD,kBAAkB,EAAE,cAAc,GAAG,kBAAkB,GAAG,SAAS;QACnE,kBAAkB;AACnB,KAAA,CAAC;AAEF,IAAA,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAE/B,IAAA,OAAO,OAAO,GAAY,EAAE,GAAa,KAAmB;AAC1D,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;QACnD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;AACpB,gBAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACnB,oBAAA,KAAK,EAAE,uBAAuB;AAC9B,oBAAA,OAAO,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe;AAClE,iBAAA,CAAC;YACJ;QACF;AACF,IAAA,CAAC;AACH;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServiceSuite for @jaypie/mcp
|
|
3
|
+
* Provides metadata and direct execution for Jaypie MCP services
|
|
4
|
+
*
|
|
5
|
+
* Unified router-style tools:
|
|
6
|
+
* - datadog: 6 Datadog observability commands
|
|
7
|
+
* - skill: Jaypie development documentation
|
|
8
|
+
* - version: Package version info
|
|
9
|
+
* - release_notes: Package release notes
|
|
10
|
+
*/
|
|
11
|
+
export declare const suite: import("@jaypie/fabric").ServiceSuite;
|
package/dist/suite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite.js","sources":["
|
|
1
|
+
{"version":3,"file":"suite.js","sources":["../../src/suite.ts"],"sourcesContent":["/**\n * ServiceSuite for @jaypie/mcp\n * Provides metadata and direct execution for Jaypie MCP services\n *\n * Unified router-style tools:\n * - datadog: 6 Datadog observability commands\n * - skill: Jaypie development documentation\n * - version: Package version info\n * - release_notes: Package release notes\n */\n\nimport { createServiceSuite } from \"@jaypie/fabric\";\n\nimport { datadogService } from \"./suites/datadog/index.js\";\nimport {\n releaseNotesService,\n skillService,\n versionService,\n} from \"./suites/docs/index.js\";\n\n// =============================================================================\n// SUITE CREATION\n// =============================================================================\n\nconst VERSION = \"0.5.0\";\n\nexport const suite = createServiceSuite({\n name: \"jaypie\",\n version: VERSION,\n});\n\n// Register docs services\nsuite.register(skillService, { category: \"docs\" });\nsuite.register(versionService, { category: \"docs\" });\nsuite.register(releaseNotesService, { category: \"docs\" });\n\n// Register Datadog services\nsuite.register(datadogService, { category: \"datadog\" });\n"],"names":[],"mappings":";;;;AAAA;;;;;;;;;AASG;AAWH;AACA;AACA;AAEA,MAAM,OAAO,GAAG,OAAO;AAEhB,MAAM,KAAK,GAAG,kBAAkB,CAAC;AACtC,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,OAAO,EAAE,OAAO;AACjB,CAAA;AAED;AACA,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAClD,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACpD,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAEzD;AACA,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadog.js","sources":["../../../src/suites/datadog/datadog.ts"],"sourcesContent":["/**\n * Datadog API integration module\n */\nimport * as https from \"node:https\";\n\nexport interface DatadogCredentials {\n apiKey: string;\n appKey: string;\n}\n\nexport interface DatadogSearchOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogAnalyticsOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n groupBy: string[];\n compute?: Array<{\n aggregation: \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\" | \"cardinality\";\n metric?: string;\n }>;\n}\n\n// Monitors types\nexport interface DatadogMonitorsOptions {\n tags?: string[];\n monitorTags?: string[];\n name?: string;\n status?: (\"Alert\" | \"Warn\" | \"No Data\" | \"OK\")[];\n}\n\nexport interface DatadogMonitor {\n id: number;\n name: string;\n type: string;\n status: string;\n message?: string;\n tags: string[];\n priority?: number;\n query?: string;\n overallState?: string;\n}\n\nexport interface DatadogMonitorsResult {\n success: boolean;\n monitors: DatadogMonitor[];\n error?: string;\n}\n\n// Synthetics types\nexport interface DatadogSyntheticsOptions {\n tags?: string[];\n type?: \"api\" | \"browser\";\n}\n\nexport interface DatadogSyntheticTest {\n publicId: string;\n name: string;\n type: string;\n status: string;\n tags: string[];\n locations: string[];\n message?: string;\n}\n\nexport interface DatadogSyntheticResult {\n publicId: string;\n resultId: string;\n status: number;\n checkTime: number;\n passed: boolean;\n location?: string;\n}\n\nexport interface DatadogSyntheticsResult {\n success: boolean;\n tests: DatadogSyntheticTest[];\n error?: string;\n}\n\nexport interface DatadogSyntheticResultsResult {\n success: boolean;\n publicId: string;\n results: DatadogSyntheticResult[];\n error?: string;\n}\n\n// Metrics types\nexport interface DatadogMetricsOptions {\n query: string;\n from: number;\n to: number;\n}\n\nexport interface DatadogMetricSeries {\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: string;\n}\n\nexport interface DatadogMetricsResult {\n success: boolean;\n query: string;\n timeRange: { from: number; to: number };\n series: DatadogMetricSeries[];\n error?: string;\n}\n\n// RUM types\nexport interface DatadogRumOptions {\n query?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogRumEvent {\n id: string;\n type: string;\n timestamp?: string;\n sessionId?: string;\n viewUrl?: string;\n viewName?: string;\n errorMessage?: string;\n errorType?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogRumResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n events: DatadogRumEvent[];\n error?: string;\n}\n\n// Validation types\nexport interface DatadogValidationResult {\n success: boolean;\n apiKey: { present: boolean; source: string | null };\n appKey: { present: boolean; source: string | null };\n}\n\nexport interface DatadogLogEntry {\n id: string;\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogSearchResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n logs: DatadogLogEntry[];\n error?: string;\n}\n\nexport interface DatadogAnalyticsBucket {\n by: Record<string, string>;\n computes: Record<string, number>;\n}\n\nexport interface DatadogAnalyticsResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n groupBy: string[];\n buckets: DatadogAnalyticsBucket[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\nconst nullLogger: Logger = {\n info: () => {},\n error: () => {},\n};\n\n/**\n * Get Datadog credentials from environment variables\n */\nexport function getDatadogCredentials(): DatadogCredentials | null {\n const apiKey = process.env.DATADOG_API_KEY || process.env.DD_API_KEY;\n const appKey =\n process.env.DATADOG_APP_KEY ||\n process.env.DATADOG_APPLICATION_KEY ||\n process.env.DD_APP_KEY ||\n process.env.DD_APPLICATION_KEY;\n\n if (!apiKey || !appKey) {\n return null;\n }\n\n return { apiKey, appKey };\n}\n\n/**\n * Validate Datadog setup without making API calls\n */\nexport function validateDatadogSetup(): DatadogValidationResult {\n const apiKeySource = process.env.DATADOG_API_KEY\n ? \"DATADOG_API_KEY\"\n : process.env.DD_API_KEY\n ? \"DD_API_KEY\"\n : null;\n\n const appKeySource = process.env.DATADOG_APP_KEY\n ? \"DATADOG_APP_KEY\"\n : process.env.DATADOG_APPLICATION_KEY\n ? \"DATADOG_APPLICATION_KEY\"\n : process.env.DD_APP_KEY\n ? \"DD_APP_KEY\"\n : process.env.DD_APPLICATION_KEY\n ? \"DD_APPLICATION_KEY\"\n : null;\n\n return {\n apiKey: { present: apiKeySource !== null, source: apiKeySource },\n appKey: { present: appKeySource !== null, source: appKeySource },\n success: apiKeySource !== null && appKeySource !== null,\n };\n}\n\n/**\n * Validate Datadog API credentials\n */\nexport async function validateDatadogCredentials(\n credentials: DatadogCredentials,\n): Promise<{ valid: boolean; error?: string }> {\n return new Promise((resolve) => {\n const options = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/validate\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(options, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n if (res.statusCode === 200) {\n resolve({ valid: true });\n } else {\n resolve({\n valid: false,\n error: `Datadog API returned status ${res.statusCode}: ${data}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n resolve({ valid: false, error: error.message });\n });\n\n req.end();\n });\n}\n\n/**\n * Build query string from environment variables and options\n */\nexport function buildDatadogQuery(options: DatadogSearchOptions): string {\n const ddEnv = process.env.DD_ENV;\n const ddQuery = process.env.DD_QUERY;\n\n const queryParts: string[] = [];\n\n // Add source (parameter only, no env var default)\n if (options.source) {\n queryParts.push(`source:${options.source}`);\n }\n\n // Add env (parameter > env var)\n const effectiveEnv = options.env || ddEnv;\n if (effectiveEnv) {\n queryParts.push(`env:${effectiveEnv}`);\n }\n\n // Add service (parameter only, no env var default)\n if (options.service) {\n queryParts.push(`service:${options.service}`);\n }\n\n // Add base query from DD_QUERY if available\n if (ddQuery) {\n queryParts.push(ddQuery);\n }\n\n // Add user-provided query terms\n if (options.query) {\n queryParts.push(options.query);\n }\n\n return queryParts.join(\" \");\n}\n\n/**\n * Search Datadog logs\n */\nexport async function searchDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogSearchOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSearchResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`Effective query: ${effectiveQuery}`);\n logger.info(\n `Search params: from=${effectiveFrom}, to=${effectiveTo}, limit=${effectiveLimit}, sort=${effectiveSort}`,\n );\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query syntax. Check your query: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n attributes?: {\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n };\n }>;\n };\n\n const logs = (response.data || []).map((log) => {\n const attrs = log.attributes || {};\n return {\n id: log.id,\n timestamp: attrs.timestamp,\n status: attrs.status,\n service: attrs.service,\n message: attrs.message,\n attributes: attrs.attributes,\n };\n });\n\n logger.info(`Retrieved ${logs.length} log entries`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * Aggregate Datadog logs using the Analytics API\n * Groups logs by specified fields and computes aggregations\n */\nexport async function aggregateDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogAnalyticsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogAnalyticsResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const groupBy = options.groupBy;\n const compute = options.compute || [{ aggregation: \"count\" as const }];\n\n logger.info(`Analytics query: ${effectiveQuery}`);\n logger.info(`Group by: ${groupBy.join(\", \")}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n // Build compute array - each item needs aggregation and type\n const computeItems = compute.map((c) => {\n const item: {\n aggregation: string;\n type: string;\n metric?: string;\n } = {\n aggregation: c.aggregation,\n type: \"total\",\n };\n if (c.metric) {\n item.metric = c.metric;\n }\n return item;\n });\n\n // Build group_by with proper sort configuration\n const groupByItems = groupBy.map((field) => {\n const item: {\n facet: string;\n limit: number;\n sort: {\n type: string;\n order: string;\n aggregation?: string;\n };\n } = {\n facet: field,\n limit: 100,\n sort: {\n type: \"measure\",\n order: \"desc\",\n aggregation: compute[0]?.aggregation || \"count\",\n },\n };\n return item;\n });\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n group_by: groupByItems,\n compute: computeItems,\n page: {\n limit: 100,\n },\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/analytics/aggregate\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Analytics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query or groupBy fields. Verify facet names exist: ${groupBy.join(\", \")}. Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: {\n buckets?: Array<{\n by?: Record<string, string>;\n computes?: Record<string, number>;\n }>;\n };\n };\n\n const buckets = (response.data?.buckets || []).map((bucket) => ({\n by: bucket.by || {},\n computes: bucket.computes || {},\n }));\n\n logger.info(`Retrieved ${buckets.length} aggregation buckets`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog analytics response:\",\n parseError,\n );\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * List Datadog monitors with optional filtering\n */\nexport async function listDatadogMonitors(\n credentials: DatadogCredentials,\n options: DatadogMonitorsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogMonitorsResult> {\n logger.info(\"Fetching Datadog monitors\");\n\n const queryParams = new URLSearchParams();\n\n if (options.tags && options.tags.length > 0) {\n queryParams.set(\"tags\", options.tags.join(\",\"));\n }\n if (options.monitorTags && options.monitorTags.length > 0) {\n queryParams.set(\"monitor_tags\", options.monitorTags.join(\",\"));\n }\n if (options.name) {\n queryParams.set(\"name\", options.name);\n }\n\n const queryString = queryParams.toString();\n const path = `/api/v1/monitor${queryString ? `?${queryString}` : \"\"}`;\n\n logger.info(`Request path: ${path}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Monitors API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have monitors_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n monitors: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as Array<{\n id: number;\n name: string;\n type: string;\n overall_state?: string;\n message?: string;\n tags?: string[];\n priority?: number;\n query?: string;\n }>;\n\n let monitors = response.map((monitor) => ({\n id: monitor.id,\n name: monitor.name,\n type: monitor.type,\n status: monitor.overall_state || \"Unknown\",\n message: monitor.message,\n tags: monitor.tags || [],\n priority: monitor.priority,\n query: monitor.query,\n overallState: monitor.overall_state,\n }));\n\n // Filter by status if specified\n if (options.status && options.status.length > 0) {\n monitors = monitors.filter((m) =>\n options.status!.includes(\n m.status as \"Alert\" | \"Warn\" | \"No Data\" | \"OK\",\n ),\n );\n }\n\n logger.info(`Retrieved ${monitors.length} monitors`);\n\n resolve({\n success: true,\n monitors,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog monitors response:\",\n parseError,\n );\n resolve({\n success: false,\n monitors: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n monitors: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * List Datadog Synthetic tests\n */\nexport async function listDatadogSynthetics(\n credentials: DatadogCredentials,\n options: DatadogSyntheticsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticsResult> {\n logger.info(\"Fetching Datadog Synthetic tests\");\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/synthetics/tests\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Synthetics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n tests: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n tests?: Array<{\n public_id: string;\n name: string;\n type: string;\n status: string;\n tags?: string[];\n locations?: string[];\n message?: string;\n }>;\n };\n\n let tests = (response.tests || []).map((test) => ({\n publicId: test.public_id,\n name: test.name,\n type: test.type,\n status: test.status,\n tags: test.tags || [],\n locations: test.locations || [],\n message: test.message,\n }));\n\n // Filter by type if specified\n if (options.type) {\n tests = tests.filter((t) => t.type === options.type);\n }\n\n // Filter by tags if specified\n if (options.tags && options.tags.length > 0) {\n tests = tests.filter((t) =>\n options.tags!.some((tag) => t.tags.includes(tag)),\n );\n }\n\n logger.info(`Retrieved ${tests.length} synthetic tests`);\n\n resolve({\n success: true,\n tests,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetics response:\",\n parseError,\n );\n resolve({\n success: false,\n tests: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n tests: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Get recent results for a specific Synthetic test\n */\nexport async function getDatadogSyntheticResults(\n credentials: DatadogCredentials,\n publicId: string,\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticResultsResult> {\n logger.info(`Fetching results for Synthetic test: ${publicId}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/synthetics/tests/${publicId}/results`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(\n `Datadog Synthetics Results API error: ${res.statusCode}`,\n );\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 404) {\n errorMessage = `Synthetic test '${publicId}' not found. Use datadog_synthetics (without testId) to list available tests.`;\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n publicId,\n results: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n results?: Array<{\n result_id: string;\n status: number;\n check_time: number;\n dc_id?: number;\n result?: {\n passed?: boolean;\n };\n }>;\n };\n\n const results = (response.results || []).map((result) => ({\n publicId,\n resultId: result.result_id,\n status: result.status,\n checkTime: result.check_time,\n passed: result.result?.passed ?? result.status === 0,\n location: result.dc_id?.toString(),\n }));\n\n logger.info(`Retrieved ${results.length} synthetic results`);\n\n resolve({\n success: true,\n publicId,\n results,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetic results:\",\n parseError,\n );\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Query Datadog metrics\n */\nexport async function queryDatadogMetrics(\n credentials: DatadogCredentials,\n options: DatadogMetricsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogMetricsResult> {\n logger.info(`Querying metrics: ${options.query}`);\n logger.info(`Time range: ${options.from} to ${options.to}`);\n\n const queryParams = new URLSearchParams({\n query: options.query,\n from: options.from.toString(),\n to: options.to.toString(),\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/query?${queryParams.toString()}`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Metrics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid metric query. Check format: 'aggregation:metric.name{tags}'. Query: \"${options.query}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have metrics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your time range.\";\n }\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n series?: Array<{\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: Array<{ name?: string }>;\n }>;\n };\n\n const series = (response.series || []).map((s) => ({\n metric: s.metric,\n scope: s.scope,\n pointlist: s.pointlist,\n unit: s.unit?.[0]?.name,\n }));\n\n logger.info(`Retrieved ${series.length} metric series`);\n\n resolve({\n success: true,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog metrics response:\", parseError);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Search Datadog RUM events\n */\nexport async function searchDatadogRum(\n credentials: DatadogCredentials,\n options: DatadogRumOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogRumResult> {\n const effectiveQuery = options.query || \"*\";\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`RUM query: ${effectiveQuery}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/rum/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog RUM API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n // Check for specific \"No valid indexes\" error which means no RUM app is configured\n if (data.includes(\"No valid indexes\")) {\n errorMessage =\n \"No RUM application found. Ensure you have a RUM application configured in Datadog and it has collected data. \" +\n \"You can create a RUM application at https://app.datadoghq.com/rum/list\";\n } else if (res.statusCode === 400) {\n errorMessage = `Invalid RUM query. Check syntax: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have rum_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n type: string;\n attributes?: {\n timestamp?: string;\n attributes?: {\n session?: { id?: string };\n view?: { url?: string; name?: string };\n error?: { message?: string; type?: string };\n [key: string]: unknown;\n };\n };\n }>;\n };\n\n const events = (response.data || []).map((event) => {\n const attrs = event.attributes?.attributes || {};\n return {\n id: event.id,\n type: event.type,\n timestamp: event.attributes?.timestamp,\n sessionId: attrs.session?.id,\n viewUrl: attrs.view?.url,\n viewName: attrs.view?.name,\n errorMessage: attrs.error?.message,\n errorType: attrs.error?.type,\n attributes: attrs,\n };\n });\n\n logger.info(`Retrieved ${events.length} RUM events`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog RUM response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"datadog.js","sources":["../../../../src/suites/datadog/datadog.ts"],"sourcesContent":["/**\n * Datadog API integration module\n */\nimport * as https from \"node:https\";\n\nexport interface DatadogCredentials {\n apiKey: string;\n appKey: string;\n}\n\nexport interface DatadogSearchOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogAnalyticsOptions {\n query?: string;\n source?: string;\n env?: string;\n service?: string;\n from?: string;\n to?: string;\n groupBy: string[];\n compute?: Array<{\n aggregation: \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\" | \"cardinality\";\n metric?: string;\n }>;\n}\n\n// Monitors types\nexport interface DatadogMonitorsOptions {\n tags?: string[];\n monitorTags?: string[];\n name?: string;\n status?: (\"Alert\" | \"Warn\" | \"No Data\" | \"OK\")[];\n}\n\nexport interface DatadogMonitor {\n id: number;\n name: string;\n type: string;\n status: string;\n message?: string;\n tags: string[];\n priority?: number;\n query?: string;\n overallState?: string;\n}\n\nexport interface DatadogMonitorsResult {\n success: boolean;\n monitors: DatadogMonitor[];\n error?: string;\n}\n\n// Synthetics types\nexport interface DatadogSyntheticsOptions {\n tags?: string[];\n type?: \"api\" | \"browser\";\n}\n\nexport interface DatadogSyntheticTest {\n publicId: string;\n name: string;\n type: string;\n status: string;\n tags: string[];\n locations: string[];\n message?: string;\n}\n\nexport interface DatadogSyntheticResult {\n publicId: string;\n resultId: string;\n status: number;\n checkTime: number;\n passed: boolean;\n location?: string;\n}\n\nexport interface DatadogSyntheticsResult {\n success: boolean;\n tests: DatadogSyntheticTest[];\n error?: string;\n}\n\nexport interface DatadogSyntheticResultsResult {\n success: boolean;\n publicId: string;\n results: DatadogSyntheticResult[];\n error?: string;\n}\n\n// Metrics types\nexport interface DatadogMetricsOptions {\n query: string;\n from: number;\n to: number;\n}\n\nexport interface DatadogMetricSeries {\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: string;\n}\n\nexport interface DatadogMetricsResult {\n success: boolean;\n query: string;\n timeRange: { from: number; to: number };\n series: DatadogMetricSeries[];\n error?: string;\n}\n\n// RUM types\nexport interface DatadogRumOptions {\n query?: string;\n from?: string;\n to?: string;\n limit?: number;\n sort?: \"timestamp\" | \"-timestamp\";\n}\n\nexport interface DatadogRumEvent {\n id: string;\n type: string;\n timestamp?: string;\n sessionId?: string;\n viewUrl?: string;\n viewName?: string;\n errorMessage?: string;\n errorType?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogRumResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n events: DatadogRumEvent[];\n error?: string;\n}\n\n// Validation types\nexport interface DatadogValidationResult {\n success: boolean;\n apiKey: { present: boolean; source: string | null };\n appKey: { present: boolean; source: string | null };\n}\n\nexport interface DatadogLogEntry {\n id: string;\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface DatadogSearchResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n logs: DatadogLogEntry[];\n error?: string;\n}\n\nexport interface DatadogAnalyticsBucket {\n by: Record<string, string>;\n computes: Record<string, number>;\n}\n\nexport interface DatadogAnalyticsResult {\n success: boolean;\n query: string;\n timeRange: { from: string; to: string };\n groupBy: string[];\n buckets: DatadogAnalyticsBucket[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\nconst nullLogger: Logger = {\n info: () => {},\n error: () => {},\n};\n\n/**\n * Get Datadog credentials from environment variables\n */\nexport function getDatadogCredentials(): DatadogCredentials | null {\n const apiKey = process.env.DATADOG_API_KEY || process.env.DD_API_KEY;\n const appKey =\n process.env.DATADOG_APP_KEY ||\n process.env.DATADOG_APPLICATION_KEY ||\n process.env.DD_APP_KEY ||\n process.env.DD_APPLICATION_KEY;\n\n if (!apiKey || !appKey) {\n return null;\n }\n\n return { apiKey, appKey };\n}\n\n/**\n * Validate Datadog setup without making API calls\n */\nexport function validateDatadogSetup(): DatadogValidationResult {\n const apiKeySource = process.env.DATADOG_API_KEY\n ? \"DATADOG_API_KEY\"\n : process.env.DD_API_KEY\n ? \"DD_API_KEY\"\n : null;\n\n const appKeySource = process.env.DATADOG_APP_KEY\n ? \"DATADOG_APP_KEY\"\n : process.env.DATADOG_APPLICATION_KEY\n ? \"DATADOG_APPLICATION_KEY\"\n : process.env.DD_APP_KEY\n ? \"DD_APP_KEY\"\n : process.env.DD_APPLICATION_KEY\n ? \"DD_APPLICATION_KEY\"\n : null;\n\n return {\n apiKey: { present: apiKeySource !== null, source: apiKeySource },\n appKey: { present: appKeySource !== null, source: appKeySource },\n success: apiKeySource !== null && appKeySource !== null,\n };\n}\n\n/**\n * Validate Datadog API credentials\n */\nexport async function validateDatadogCredentials(\n credentials: DatadogCredentials,\n): Promise<{ valid: boolean; error?: string }> {\n return new Promise((resolve) => {\n const options = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/validate\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(options, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n if (res.statusCode === 200) {\n resolve({ valid: true });\n } else {\n resolve({\n valid: false,\n error: `Datadog API returned status ${res.statusCode}: ${data}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n resolve({ valid: false, error: error.message });\n });\n\n req.end();\n });\n}\n\n/**\n * Build query string from environment variables and options\n */\nexport function buildDatadogQuery(options: DatadogSearchOptions): string {\n const ddEnv = process.env.DD_ENV;\n const ddQuery = process.env.DD_QUERY;\n\n const queryParts: string[] = [];\n\n // Add source (parameter only, no env var default)\n if (options.source) {\n queryParts.push(`source:${options.source}`);\n }\n\n // Add env (parameter > env var)\n const effectiveEnv = options.env || ddEnv;\n if (effectiveEnv) {\n queryParts.push(`env:${effectiveEnv}`);\n }\n\n // Add service (parameter only, no env var default)\n if (options.service) {\n queryParts.push(`service:${options.service}`);\n }\n\n // Add base query from DD_QUERY if available\n if (ddQuery) {\n queryParts.push(ddQuery);\n }\n\n // Add user-provided query terms\n if (options.query) {\n queryParts.push(options.query);\n }\n\n return queryParts.join(\" \");\n}\n\n/**\n * Search Datadog logs\n */\nexport async function searchDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogSearchOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSearchResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`Effective query: ${effectiveQuery}`);\n logger.info(\n `Search params: from=${effectiveFrom}, to=${effectiveTo}, limit=${effectiveLimit}, sort=${effectiveSort}`,\n );\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query syntax. Check your query: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n attributes?: {\n timestamp?: string;\n status?: string;\n service?: string;\n message?: string;\n attributes?: Record<string, unknown>;\n };\n }>;\n };\n\n const logs = (response.data || []).map((log) => {\n const attrs = log.attributes || {};\n return {\n id: log.id,\n timestamp: attrs.timestamp,\n status: attrs.status,\n service: attrs.service,\n message: attrs.message,\n attributes: attrs.attributes,\n };\n });\n\n logger.info(`Retrieved ${logs.length} log entries`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n logs: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * Aggregate Datadog logs using the Analytics API\n * Groups logs by specified fields and computes aggregations\n */\nexport async function aggregateDatadogLogs(\n credentials: DatadogCredentials,\n options: DatadogAnalyticsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogAnalyticsResult> {\n const effectiveQuery = buildDatadogQuery(options);\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const groupBy = options.groupBy;\n const compute = options.compute || [{ aggregation: \"count\" as const }];\n\n logger.info(`Analytics query: ${effectiveQuery}`);\n logger.info(`Group by: ${groupBy.join(\", \")}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n // Build compute array - each item needs aggregation and type\n const computeItems = compute.map((c) => {\n const item: {\n aggregation: string;\n type: string;\n metric?: string;\n } = {\n aggregation: c.aggregation,\n type: \"total\",\n };\n if (c.metric) {\n item.metric = c.metric;\n }\n return item;\n });\n\n // Build group_by with proper sort configuration\n const groupByItems = groupBy.map((field) => {\n const item: {\n facet: string;\n limit: number;\n sort: {\n type: string;\n order: string;\n aggregation?: string;\n };\n } = {\n facet: field,\n limit: 100,\n sort: {\n type: \"measure\",\n order: \"desc\",\n aggregation: compute[0]?.aggregation || \"count\",\n },\n };\n return item;\n });\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n group_by: groupByItems,\n compute: computeItems,\n page: {\n limit: 100,\n },\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/logs/analytics/aggregate\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Analytics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid query or groupBy fields. Verify facet names exist: ${groupBy.join(\", \")}. Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have logs_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: {\n buckets?: Array<{\n by?: Record<string, string>;\n computes?: Record<string, number>;\n }>;\n };\n };\n\n const buckets = (response.data?.buckets || []).map((bucket) => ({\n by: bucket.by || {},\n computes: bucket.computes || {},\n }));\n\n logger.info(`Retrieved ${buckets.length} aggregation buckets`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog analytics response:\",\n parseError,\n );\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n groupBy,\n buckets: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n\n/**\n * List Datadog monitors with optional filtering\n */\nexport async function listDatadogMonitors(\n credentials: DatadogCredentials,\n options: DatadogMonitorsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogMonitorsResult> {\n logger.info(\"Fetching Datadog monitors\");\n\n const queryParams = new URLSearchParams();\n\n if (options.tags && options.tags.length > 0) {\n queryParams.set(\"tags\", options.tags.join(\",\"));\n }\n if (options.monitorTags && options.monitorTags.length > 0) {\n queryParams.set(\"monitor_tags\", options.monitorTags.join(\",\"));\n }\n if (options.name) {\n queryParams.set(\"name\", options.name);\n }\n\n const queryString = queryParams.toString();\n const path = `/api/v1/monitor${queryString ? `?${queryString}` : \"\"}`;\n\n logger.info(`Request path: ${path}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Monitors API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have monitors_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n monitors: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as Array<{\n id: number;\n name: string;\n type: string;\n overall_state?: string;\n message?: string;\n tags?: string[];\n priority?: number;\n query?: string;\n }>;\n\n let monitors = response.map((monitor) => ({\n id: monitor.id,\n name: monitor.name,\n type: monitor.type,\n status: monitor.overall_state || \"Unknown\",\n message: monitor.message,\n tags: monitor.tags || [],\n priority: monitor.priority,\n query: monitor.query,\n overallState: monitor.overall_state,\n }));\n\n // Filter by status if specified\n if (options.status && options.status.length > 0) {\n monitors = monitors.filter((m) =>\n options.status!.includes(\n m.status as \"Alert\" | \"Warn\" | \"No Data\" | \"OK\",\n ),\n );\n }\n\n logger.info(`Retrieved ${monitors.length} monitors`);\n\n resolve({\n success: true,\n monitors,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog monitors response:\",\n parseError,\n );\n resolve({\n success: false,\n monitors: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n monitors: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * List Datadog Synthetic tests\n */\nexport async function listDatadogSynthetics(\n credentials: DatadogCredentials,\n options: DatadogSyntheticsOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticsResult> {\n logger.info(\"Fetching Datadog Synthetic tests\");\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v1/synthetics/tests\",\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Synthetics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n tests: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n tests?: Array<{\n public_id: string;\n name: string;\n type: string;\n status: string;\n tags?: string[];\n locations?: string[];\n message?: string;\n }>;\n };\n\n let tests = (response.tests || []).map((test) => ({\n publicId: test.public_id,\n name: test.name,\n type: test.type,\n status: test.status,\n tags: test.tags || [],\n locations: test.locations || [],\n message: test.message,\n }));\n\n // Filter by type if specified\n if (options.type) {\n tests = tests.filter((t) => t.type === options.type);\n }\n\n // Filter by tags if specified\n if (options.tags && options.tags.length > 0) {\n tests = tests.filter((t) =>\n options.tags!.some((tag) => t.tags.includes(tag)),\n );\n }\n\n logger.info(`Retrieved ${tests.length} synthetic tests`);\n\n resolve({\n success: true,\n tests,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetics response:\",\n parseError,\n );\n resolve({\n success: false,\n tests: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n tests: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Get recent results for a specific Synthetic test\n */\nexport async function getDatadogSyntheticResults(\n credentials: DatadogCredentials,\n publicId: string,\n logger: Logger = nullLogger,\n): Promise<DatadogSyntheticResultsResult> {\n logger.info(`Fetching results for Synthetic test: ${publicId}`);\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/synthetics/tests/${publicId}/results`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(\n `Datadog Synthetics Results API error: ${res.statusCode}`,\n );\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have synthetics_read permission.\";\n } else if (res.statusCode === 404) {\n errorMessage = `Synthetic test '${publicId}' not found. Use datadog_synthetics (without testId) to list available tests.`;\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again.\";\n }\n resolve({\n success: false,\n publicId,\n results: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n results?: Array<{\n result_id: string;\n status: number;\n check_time: number;\n dc_id?: number;\n result?: {\n passed?: boolean;\n };\n }>;\n };\n\n const results = (response.results || []).map((result) => ({\n publicId,\n resultId: result.result_id,\n status: result.status,\n checkTime: result.check_time,\n passed: result.result?.passed ?? result.status === 0,\n location: result.dc_id?.toString(),\n }));\n\n logger.info(`Retrieved ${results.length} synthetic results`);\n\n resolve({\n success: true,\n publicId,\n results,\n });\n } catch (parseError) {\n logger.error(\n \"Failed to parse Datadog synthetic results:\",\n parseError,\n );\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n publicId,\n results: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Query Datadog metrics\n */\nexport async function queryDatadogMetrics(\n credentials: DatadogCredentials,\n options: DatadogMetricsOptions,\n logger: Logger = nullLogger,\n): Promise<DatadogMetricsResult> {\n logger.info(`Querying metrics: ${options.query}`);\n logger.info(`Time range: ${options.from} to ${options.to}`);\n\n const queryParams = new URLSearchParams({\n query: options.query,\n from: options.from.toString(),\n to: options.to.toString(),\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: `/api/v1/query?${queryParams.toString()}`,\n method: \"GET\",\n headers: {\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog Metrics API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n if (res.statusCode === 400) {\n errorMessage = `Invalid metric query. Check format: 'aggregation:metric.name{tags}'. Query: \"${options.query}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have metrics_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your time range.\";\n }\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n series?: Array<{\n metric: string;\n scope: string;\n pointlist: Array<[number, number | null]>;\n unit?: Array<{ name?: string }>;\n }>;\n };\n\n const series = (response.series || []).map((s) => ({\n metric: s.metric,\n scope: s.scope,\n pointlist: s.pointlist,\n unit: s.unit?.[0]?.name,\n }));\n\n logger.info(`Retrieved ${series.length} metric series`);\n\n resolve({\n success: true,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog metrics response:\", parseError);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: options.query,\n timeRange: { from: options.from, to: options.to },\n series: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.end();\n });\n}\n\n/**\n * Search Datadog RUM events\n */\nexport async function searchDatadogRum(\n credentials: DatadogCredentials,\n options: DatadogRumOptions = {},\n logger: Logger = nullLogger,\n): Promise<DatadogRumResult> {\n const effectiveQuery = options.query || \"*\";\n const effectiveFrom = options.from || \"now-15m\";\n const effectiveTo = options.to || \"now\";\n const effectiveLimit = Math.min(options.limit || 50, 1000);\n const effectiveSort = options.sort || \"-timestamp\";\n\n logger.info(`RUM query: ${effectiveQuery}`);\n logger.info(`Time range: ${effectiveFrom} to ${effectiveTo}`);\n\n const requestBody = JSON.stringify({\n filter: {\n query: effectiveQuery,\n from: effectiveFrom,\n to: effectiveTo,\n },\n page: {\n limit: effectiveLimit,\n },\n sort: effectiveSort,\n });\n\n return new Promise((resolve) => {\n const requestOptions = {\n hostname: \"api.datadoghq.com\",\n port: 443,\n path: \"/api/v2/rum/events/search\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"DD-API-KEY\": credentials.apiKey,\n \"DD-APPLICATION-KEY\": credentials.appKey,\n \"Content-Length\": Buffer.byteLength(requestBody),\n },\n };\n\n const req = https.request(requestOptions, (res) => {\n let data = \"\";\n\n res.on(\"data\", (chunk: Buffer) => {\n data += chunk.toString();\n });\n\n res.on(\"end\", () => {\n logger.info(`Response status: ${res.statusCode}`);\n\n if (res.statusCode !== 200) {\n logger.error(`Datadog RUM API error: ${res.statusCode}`);\n let errorMessage = `Datadog API returned status ${res.statusCode}: ${data}`;\n // Check for specific \"No valid indexes\" error which means no RUM app is configured\n if (data.includes(\"No valid indexes\")) {\n errorMessage =\n \"No RUM application found. Ensure you have a RUM application configured in Datadog and it has collected data. \" +\n \"You can create a RUM application at https://app.datadoghq.com/rum/list\";\n } else if (res.statusCode === 400) {\n errorMessage = `Invalid RUM query. Check syntax: \"${effectiveQuery}\". Datadog error: ${data}`;\n } else if (res.statusCode === 403) {\n errorMessage =\n \"Access denied. Verify your API and Application keys have rum_read permission.\";\n } else if (res.statusCode === 429) {\n errorMessage =\n \"Rate limited by Datadog. Wait a moment and try again, or reduce your query scope.\";\n }\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: errorMessage,\n });\n return;\n }\n\n try {\n const response = JSON.parse(data) as {\n data?: Array<{\n id: string;\n type: string;\n attributes?: {\n timestamp?: string;\n attributes?: {\n session?: { id?: string };\n view?: { url?: string; name?: string };\n error?: { message?: string; type?: string };\n [key: string]: unknown;\n };\n };\n }>;\n };\n\n const events = (response.data || []).map((event) => {\n const attrs = event.attributes?.attributes || {};\n return {\n id: event.id,\n type: event.type,\n timestamp: event.attributes?.timestamp,\n sessionId: attrs.session?.id,\n viewUrl: attrs.view?.url,\n viewName: attrs.view?.name,\n errorMessage: attrs.error?.message,\n errorType: attrs.error?.type,\n attributes: attrs,\n };\n });\n\n logger.info(`Retrieved ${events.length} RUM events`);\n\n resolve({\n success: true,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events,\n });\n } catch (parseError) {\n logger.error(\"Failed to parse Datadog RUM response:\", parseError);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Failed to parse response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n });\n }\n });\n });\n\n req.on(\"error\", (error) => {\n logger.error(\"Request error:\", error);\n resolve({\n success: false,\n query: effectiveQuery,\n timeRange: { from: effectiveFrom, to: effectiveTo },\n events: [],\n error: `Connection error: ${error.message}`,\n });\n });\n\n req.write(requestBody);\n req.end();\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/suites/datadog/index.ts"],"sourcesContent":["/**\n * Datadog Suite - Unified Datadog observability access\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n aggregateDatadogLogs,\n getDatadogCredentials,\n getDatadogSyntheticResults,\n listDatadogMonitors,\n listDatadogSynthetics,\n queryDatadogMetrics,\n searchDatadogLogs,\n searchDatadogRum,\n validateDatadogSetup,\n} from \"./datadog.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Silent logger for direct execution\nconst log = {\n error: () => {},\n info: () => {},\n};\n\nasync function getHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"help.md\"), \"utf-8\");\n}\n\n// Flattened input type for the unified Datadog service\ninterface DatadogInput {\n aggregation?: string;\n command?: string;\n env?: string;\n from?: string;\n groupBy?: string;\n limit?: number;\n metric?: string;\n monitorTags?: string;\n name?: string;\n query?: string;\n service?: string;\n sort?: string;\n source?: string;\n status?: string;\n tags?: string;\n testId?: string;\n to?: string;\n type?: string;\n}\n\nexport const datadogService = fabricService({\n alias: \"datadog\",\n description:\n \"Access Datadog observability data. Commands: logs, log_analytics, monitors, synthetics, metrics, rum. Call with no args for help.\",\n input: {\n aggregation: {\n description:\n \"Aggregation type for log_analytics (count, avg, sum, min, max, cardinality)\",\n required: false,\n type: String,\n },\n command: {\n description:\n \"Command to execute: logs, log_analytics, monitors, synthetics, metrics, rum (omit for help)\",\n required: false,\n type: String,\n },\n env: {\n description: \"Environment filter (e.g., production, staging)\",\n required: false,\n type: String,\n },\n from: {\n description:\n \"Start time (e.g., now-1h, now-15m, now-1d, or ISO 8601 timestamp)\",\n required: false,\n type: String,\n },\n groupBy: {\n description:\n \"Fields to group by for log_analytics (comma-separated, e.g., service,status)\",\n required: false,\n type: String,\n },\n limit: {\n description: \"Maximum number of results to return\",\n required: false,\n type: Number,\n },\n metric: {\n description: \"Metric field for aggregation (e.g., @duration)\",\n required: false,\n type: String,\n },\n monitorTags: {\n description: \"Monitor tags filter (comma-separated)\",\n required: false,\n type: String,\n },\n name: {\n description: \"Name filter for monitors\",\n required: false,\n type: String,\n },\n query: {\n description:\n 'Datadog query string (e.g., status:error, @lambda.arn:\"arn:aws:...\")',\n required: false,\n type: String,\n },\n service: {\n description: \"Service name filter\",\n required: false,\n type: String,\n },\n sort: {\n description: \"Sort order (timestamp or -timestamp)\",\n required: false,\n type: String,\n },\n source: {\n description: \"Log source filter (default: lambda)\",\n required: false,\n type: String,\n },\n status: {\n description:\n \"Monitor status filter (comma-separated: Alert, Warn, No Data, OK)\",\n required: false,\n type: String,\n },\n tags: {\n description: \"Tags filter (comma-separated)\",\n required: false,\n type: String,\n },\n testId: {\n description: \"Synthetic test ID for getting results\",\n required: false,\n type: String,\n },\n to: {\n description: \"End time (e.g., now, or ISO 8601 timestamp)\",\n required: false,\n type: String,\n },\n type: {\n description: \"Synthetic test type filter (api or browser)\",\n required: false,\n type: String,\n },\n },\n service: async (params: DatadogInput) => {\n const { command } = params;\n\n if (!command || command === \"help\") {\n return getHelp();\n }\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n throw new Error(\n \"Datadog credentials not found. Set DATADOG_API_KEY and DATADOG_APP_KEY.\",\n );\n }\n\n // Helper to parse comma-separated strings into arrays\n const parseArray = (value?: string): string[] | undefined => {\n if (!value) return undefined;\n return value.split(\",\").map((s) => s.trim());\n };\n\n switch (command) {\n case \"validate\": {\n return validateDatadogSetup();\n }\n\n case \"logs\": {\n const result = await searchDatadogLogs(\n credentials,\n {\n env: params.env,\n from: params.from,\n limit: params.limit,\n query: params.query,\n service: params.service,\n sort: params.sort as \"timestamp\" | \"-timestamp\" | undefined,\n source: params.source,\n to: params.to,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"log_analytics\": {\n const groupByArray = parseArray(params.groupBy);\n if (!groupByArray || groupByArray.length === 0) {\n throw new Error(\n \"groupBy is required (comma-separated field names, e.g., service,status)\",\n );\n }\n const compute = params.aggregation\n ? [\n {\n aggregation: params.aggregation as\n | \"count\"\n | \"avg\"\n | \"sum\"\n | \"min\"\n | \"max\"\n | \"cardinality\",\n metric: params.metric,\n },\n ]\n : [{ aggregation: \"count\" as const }];\n const result = await aggregateDatadogLogs(\n credentials,\n {\n compute,\n env: params.env,\n from: params.from,\n groupBy: groupByArray,\n query: params.query,\n service: params.service,\n source: params.source,\n to: params.to,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"monitors\": {\n const statusArray = parseArray(params.status) as\n | (\"Alert\" | \"Warn\" | \"No Data\" | \"OK\")[]\n | undefined;\n const result = await listDatadogMonitors(\n credentials,\n {\n monitorTags: parseArray(params.monitorTags),\n name: params.name,\n status: statusArray,\n tags: parseArray(params.tags),\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"synthetics\": {\n if (params.testId) {\n const result = await getDatadogSyntheticResults(\n credentials,\n params.testId,\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n const result = await listDatadogSynthetics(\n credentials,\n {\n tags: parseArray(params.tags),\n type: params.type as \"api\" | \"browser\" | undefined,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"metrics\": {\n if (!params.query) throw new Error(\"query is required for metrics\");\n const now = Math.floor(Date.now() / 1000);\n const fromStr = params.from || \"1h\";\n let fromTs: number;\n if (fromStr.match(/^\\d+$/)) {\n fromTs = parseInt(fromStr, 10);\n } else if (fromStr.match(/^(\\d+)h$/)) {\n const hours = parseInt(fromStr.match(/^(\\d+)h$/)![1], 10);\n fromTs = now - hours * 3600;\n } else if (fromStr.match(/^(\\d+)m$/)) {\n const minutes = parseInt(fromStr.match(/^(\\d+)m$/)![1], 10);\n fromTs = now - minutes * 60;\n } else if (fromStr.match(/^(\\d+)d$/)) {\n const days = parseInt(fromStr.match(/^(\\d+)d$/)![1], 10);\n fromTs = now - days * 86400;\n } else {\n fromTs = now - 3600;\n }\n const toStr = params.to || \"now\";\n const toTs = toStr === \"now\" ? now : parseInt(toStr, 10);\n const result = await queryDatadogMetrics(\n credentials,\n { from: fromTs, query: params.query, to: toTs },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"rum\": {\n const result = await searchDatadogRum(\n credentials,\n {\n from: params.from,\n limit: params.limit,\n query: params.query,\n to: params.to,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n default:\n throw new Error(`Unknown command: ${command}. Use datadog() for help.`);\n }\n },\n});\n\n// Re-export types and functions for testing\nexport * from \"./datadog.js\";\n"],"names":["__dirname"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/suites/datadog/index.ts"],"sourcesContent":["/**\n * Datadog Suite - Unified Datadog observability access\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n aggregateDatadogLogs,\n getDatadogCredentials,\n getDatadogSyntheticResults,\n listDatadogMonitors,\n listDatadogSynthetics,\n queryDatadogMetrics,\n searchDatadogLogs,\n searchDatadogRum,\n validateDatadogSetup,\n} from \"./datadog.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Silent logger for direct execution\nconst log = {\n error: () => {},\n info: () => {},\n};\n\nasync function getHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"help.md\"), \"utf-8\");\n}\n\n// Flattened input type for the unified Datadog service\ninterface DatadogInput {\n aggregation?: string;\n command?: string;\n env?: string;\n from?: string;\n groupBy?: string;\n limit?: number;\n metric?: string;\n monitorTags?: string;\n name?: string;\n query?: string;\n service?: string;\n sort?: string;\n source?: string;\n status?: string;\n tags?: string;\n testId?: string;\n to?: string;\n type?: string;\n}\n\nexport const datadogService = fabricService({\n alias: \"datadog\",\n description:\n \"Access Datadog observability data. Commands: logs, log_analytics, monitors, synthetics, metrics, rum. Call with no args for help.\",\n input: {\n aggregation: {\n description:\n \"Aggregation type for log_analytics (count, avg, sum, min, max, cardinality)\",\n required: false,\n type: String,\n },\n command: {\n description:\n \"Command to execute: logs, log_analytics, monitors, synthetics, metrics, rum (omit for help)\",\n required: false,\n type: String,\n },\n env: {\n description: \"Environment filter (e.g., production, staging)\",\n required: false,\n type: String,\n },\n from: {\n description:\n \"Start time (e.g., now-1h, now-15m, now-1d, or ISO 8601 timestamp)\",\n required: false,\n type: String,\n },\n groupBy: {\n description:\n \"Fields to group by for log_analytics (comma-separated, e.g., service,status)\",\n required: false,\n type: String,\n },\n limit: {\n description: \"Maximum number of results to return\",\n required: false,\n type: Number,\n },\n metric: {\n description: \"Metric field for aggregation (e.g., @duration)\",\n required: false,\n type: String,\n },\n monitorTags: {\n description: \"Monitor tags filter (comma-separated)\",\n required: false,\n type: String,\n },\n name: {\n description: \"Name filter for monitors\",\n required: false,\n type: String,\n },\n query: {\n description:\n 'Datadog query string (e.g., status:error, @lambda.arn:\"arn:aws:...\")',\n required: false,\n type: String,\n },\n service: {\n description: \"Service name filter\",\n required: false,\n type: String,\n },\n sort: {\n description: \"Sort order (timestamp or -timestamp)\",\n required: false,\n type: String,\n },\n source: {\n description: \"Log source filter (default: lambda)\",\n required: false,\n type: String,\n },\n status: {\n description:\n \"Monitor status filter (comma-separated: Alert, Warn, No Data, OK)\",\n required: false,\n type: String,\n },\n tags: {\n description: \"Tags filter (comma-separated)\",\n required: false,\n type: String,\n },\n testId: {\n description: \"Synthetic test ID for getting results\",\n required: false,\n type: String,\n },\n to: {\n description: \"End time (e.g., now, or ISO 8601 timestamp)\",\n required: false,\n type: String,\n },\n type: {\n description: \"Synthetic test type filter (api or browser)\",\n required: false,\n type: String,\n },\n },\n service: async (params: DatadogInput) => {\n const { command } = params;\n\n if (!command || command === \"help\") {\n return getHelp();\n }\n\n const credentials = getDatadogCredentials();\n if (!credentials) {\n throw new Error(\n \"Datadog credentials not found. Set DATADOG_API_KEY and DATADOG_APP_KEY.\",\n );\n }\n\n // Helper to parse comma-separated strings into arrays\n const parseArray = (value?: string): string[] | undefined => {\n if (!value) return undefined;\n return value.split(\",\").map((s) => s.trim());\n };\n\n switch (command) {\n case \"validate\": {\n return validateDatadogSetup();\n }\n\n case \"logs\": {\n const result = await searchDatadogLogs(\n credentials,\n {\n env: params.env,\n from: params.from,\n limit: params.limit,\n query: params.query,\n service: params.service,\n sort: params.sort as \"timestamp\" | \"-timestamp\" | undefined,\n source: params.source,\n to: params.to,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"log_analytics\": {\n const groupByArray = parseArray(params.groupBy);\n if (!groupByArray || groupByArray.length === 0) {\n throw new Error(\n \"groupBy is required (comma-separated field names, e.g., service,status)\",\n );\n }\n const compute = params.aggregation\n ? [\n {\n aggregation: params.aggregation as\n | \"count\"\n | \"avg\"\n | \"sum\"\n | \"min\"\n | \"max\"\n | \"cardinality\",\n metric: params.metric,\n },\n ]\n : [{ aggregation: \"count\" as const }];\n const result = await aggregateDatadogLogs(\n credentials,\n {\n compute,\n env: params.env,\n from: params.from,\n groupBy: groupByArray,\n query: params.query,\n service: params.service,\n source: params.source,\n to: params.to,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"monitors\": {\n const statusArray = parseArray(params.status) as\n | (\"Alert\" | \"Warn\" | \"No Data\" | \"OK\")[]\n | undefined;\n const result = await listDatadogMonitors(\n credentials,\n {\n monitorTags: parseArray(params.monitorTags),\n name: params.name,\n status: statusArray,\n tags: parseArray(params.tags),\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"synthetics\": {\n if (params.testId) {\n const result = await getDatadogSyntheticResults(\n credentials,\n params.testId,\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n const result = await listDatadogSynthetics(\n credentials,\n {\n tags: parseArray(params.tags),\n type: params.type as \"api\" | \"browser\" | undefined,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"metrics\": {\n if (!params.query) throw new Error(\"query is required for metrics\");\n const now = Math.floor(Date.now() / 1000);\n const fromStr = params.from || \"1h\";\n let fromTs: number;\n if (fromStr.match(/^\\d+$/)) {\n fromTs = parseInt(fromStr, 10);\n } else if (fromStr.match(/^(\\d+)h$/)) {\n const hours = parseInt(fromStr.match(/^(\\d+)h$/)![1], 10);\n fromTs = now - hours * 3600;\n } else if (fromStr.match(/^(\\d+)m$/)) {\n const minutes = parseInt(fromStr.match(/^(\\d+)m$/)![1], 10);\n fromTs = now - minutes * 60;\n } else if (fromStr.match(/^(\\d+)d$/)) {\n const days = parseInt(fromStr.match(/^(\\d+)d$/)![1], 10);\n fromTs = now - days * 86400;\n } else {\n fromTs = now - 3600;\n }\n const toStr = params.to || \"now\";\n const toTs = toStr === \"now\" ? now : parseInt(toStr, 10);\n const result = await queryDatadogMetrics(\n credentials,\n { from: fromTs, query: params.query, to: toTs },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n case \"rum\": {\n const result = await searchDatadogRum(\n credentials,\n {\n from: params.from,\n limit: params.limit,\n query: params.query,\n to: params.to,\n },\n log,\n );\n if (!result.success) throw new Error(result.error);\n return result;\n }\n\n default:\n throw new Error(`Unknown command: ${command}. Use datadog() for help.`);\n }\n },\n});\n\n// Re-export types and functions for testing\nexport * from \"./datadog.js\";\n"],"names":["__dirname"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { gt } from 'semver';
|
|
|
9
9
|
/**
|
|
10
10
|
* Docs Suite - Documentation services (skill, version, release_notes)
|
|
11
11
|
*/
|
|
12
|
-
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.
|
|
12
|
+
const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.87#9846ff69"
|
|
13
13
|
;
|
|
14
14
|
const __filename$1 = fileURLToPath(import.meta.url);
|
|
15
15
|
const __dirname$1 = path.dirname(__filename$1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/suites/docs/index.ts"],"sourcesContent":["/**\n * Docs Suite - Documentation services (skill, version, release_notes)\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport { parseFrontmatter } from \"@jaypie/kit\";\nimport {\n createLayeredStore,\n createMarkdownStore,\n createSkillService,\n type LayeredStoreLayer,\n} from \"@jaypie/tildeskill\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { gt } from \"semver\";\n\n// Build-time constants\ndeclare const __BUILD_VERSION_STRING__: string;\nconst BUILD_VERSION_STRING =\n typeof __BUILD_VERSION_STRING__ !== \"undefined\"\n ? __BUILD_VERSION_STRING__\n : \"@jaypie/mcp@0.0.0\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n// From dist/suites/docs/, go up 3 levels to package root where skills/ and release-notes/ live\n// Environment variables allow overriding paths when bundled (e.g., esbuild Lambda)\nconst RELEASE_NOTES_PATH =\n process.env.MCP_RELEASE_NOTES_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"release-notes\");\n\n// Bundled Jaypie skills ship inside the @jaypie/mcp package. MCP_BUILTIN_SKILLS_PATH\n// lets bundlers (esbuild, Lambda) relocate them without disabling the built-in layer.\nconst BUILTIN_SKILLS_PATH =\n process.env.MCP_BUILTIN_SKILLS_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"skills\");\n\nconst LOCAL_SKILLS_NAMESPACE = \"local\";\nconst JAYPIE_SKILLS_NAMESPACE = \"jaypie\";\nconst LAYER_SEPARATOR = \":\";\n\n// Skill layers resolved in order: a client's MCP_SKILLS_PATH layers on top of\n// the built-in Jaypie skill pack so `skill(\"aws\")` prefers the client's copy\n// while still exposing bundled Jaypie docs under the `jaypie:` namespace.\nconst skillLayers: LayeredStoreLayer[] = [];\n\nif (process.env.MCP_SKILLS_PATH) {\n skillLayers.push({\n namespace: LOCAL_SKILLS_NAMESPACE,\n store: createMarkdownStore({ path: process.env.MCP_SKILLS_PATH }),\n });\n}\n\nskillLayers.push({\n namespace: JAYPIE_SKILLS_NAMESPACE,\n store: createMarkdownStore({ path: BUILTIN_SKILLS_PATH }),\n});\n\nconst skillStore = createLayeredStore({\n layers: skillLayers,\n separator: LAYER_SEPARATOR,\n});\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\ninterface ReleaseNoteFrontMatter {\n date?: string;\n summary?: string;\n version?: string;\n}\n\nasync function parseReleaseNoteFile(filePath: string): Promise<{\n date?: string;\n filename: string;\n summary?: string;\n version?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const filename = path.basename(filePath, \".md\");\n\n if (content.startsWith(\"---\")) {\n const frontMatter =\n parseFrontmatter<ReleaseNoteFrontMatter>(content).data;\n return {\n date: frontMatter.date,\n filename,\n summary: frontMatter.summary,\n version: frontMatter.version || filename,\n };\n }\n\n return { filename, version: filename };\n } catch {\n return { filename: path.basename(filePath, \".md\") };\n }\n}\n\nfunction formatReleaseNoteListItem(note: {\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}): string {\n const { date, packageName, summary, version } = note;\n const parts = [`* ${packageName}@${version}`];\n\n if (date) {\n parts.push(`(${date})`);\n }\n\n if (summary) {\n parts.push(`- ${summary}`);\n }\n\n return parts.join(\" \");\n}\n\nasync function getPackageReleaseNotes(packageName: string): Promise<\n Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>\n> {\n const packageDir = path.join(RELEASE_NOTES_PATH, packageName);\n try {\n const files = await fs.readdir(packageDir);\n const mdFiles = files.filter((file) => file.endsWith(\".md\"));\n\n const notes = await Promise.all(\n mdFiles.map(async (file) => {\n const parsed = await parseReleaseNoteFile(path.join(packageDir, file));\n return { ...parsed, packageName };\n }),\n );\n\n return notes.sort((a, b) => {\n if (!a.version || !b.version) return 0;\n try {\n return gt(a.version, b.version) ? -1 : 1;\n } catch {\n return b.version.localeCompare(a.version);\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction filterReleaseNotesSince(\n notes: Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>,\n sinceVersion: string,\n): Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}> {\n return notes.filter((note) => {\n if (!note.version) return false;\n try {\n return gt(note.version, sinceVersion);\n } catch {\n return false;\n }\n });\n}\n\n// =============================================================================\n// SKILL SERVICE\n// =============================================================================\n\nexport const skillService = createSkillService(skillStore);\n\n// =============================================================================\n// VERSION SERVICE\n// =============================================================================\n\nexport const versionService = fabricService({\n alias: \"version\",\n description: `Prints the current version and hash, \\`${BUILD_VERSION_STRING}\\``,\n input: {},\n service: async () => BUILD_VERSION_STRING,\n});\n\n// =============================================================================\n// RELEASE NOTES SERVICE\n// =============================================================================\n\nasync function getReleaseNotesHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"release-notes\", \"help.md\"), \"utf-8\");\n}\n\ninterface ReleaseNotesInput {\n package?: string;\n since_version?: string;\n version?: string;\n}\n\nexport const releaseNotesService = fabricService({\n alias: \"release_notes\",\n description:\n \"Browse Jaypie package release notes. Commands: list, read. Call with no args for help.\",\n input: {\n command: {\n description: \"Command to execute (omit for help)\",\n required: false,\n type: String,\n },\n input: {\n description: \"Command parameters\",\n required: false,\n type: Object,\n },\n },\n service: async ({\n command,\n input: params,\n }: {\n command?: string;\n input?: ReleaseNotesInput;\n }) => {\n if (!command || command === \"help\") {\n return getReleaseNotesHelp();\n }\n\n const p = params || {};\n\n switch (command) {\n case \"list\": {\n const entries = await fs.readdir(RELEASE_NOTES_PATH, {\n withFileTypes: true,\n });\n const packageDirs = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n const packagesToList = p.package\n ? packageDirs.filter((pkg) => pkg === p.package)\n : packageDirs;\n\n if (packagesToList.length === 0 && p.package) {\n return `No release notes found for package \"${p.package}\".`;\n }\n\n const allNotes = await Promise.all(\n packagesToList.map((pkg) => getPackageReleaseNotes(pkg)),\n );\n let flatNotes = allNotes.flat();\n\n if (p.since_version) {\n flatNotes = filterReleaseNotesSince(flatNotes, p.since_version);\n }\n\n if (flatNotes.length === 0) {\n const filterDesc = p.since_version\n ? ` newer than ${p.since_version}`\n : \"\";\n return `No release notes found${filterDesc}.`;\n }\n\n return flatNotes.map(formatReleaseNoteListItem).join(\"\\n\");\n }\n\n case \"read\": {\n if (!p.package) throw new Error(\"package is required\");\n if (!p.version) throw new Error(\"version is required\");\n const filePath = path.join(\n RELEASE_NOTES_PATH,\n p.package,\n `${p.version}.md`,\n );\n return fs.readFile(filePath, \"utf-8\");\n }\n\n default:\n throw new Error(\n `Unknown command: ${command}. Use release_notes() for help.`,\n );\n }\n },\n});\n"],"names":["__filename","__dirname"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/suites/docs/index.ts"],"sourcesContent":["/**\n * Docs Suite - Documentation services (skill, version, release_notes)\n */\nimport { fabricService } from \"@jaypie/fabric\";\nimport { parseFrontmatter } from \"@jaypie/kit\";\nimport {\n createLayeredStore,\n createMarkdownStore,\n createSkillService,\n type LayeredStoreLayer,\n} from \"@jaypie/tildeskill\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { gt } from \"semver\";\n\n// Build-time constants\ndeclare const __BUILD_VERSION_STRING__: string;\nconst BUILD_VERSION_STRING =\n typeof __BUILD_VERSION_STRING__ !== \"undefined\"\n ? __BUILD_VERSION_STRING__\n : \"@jaypie/mcp@0.0.0\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n// From dist/suites/docs/, go up 3 levels to package root where skills/ and release-notes/ live\n// Environment variables allow overriding paths when bundled (e.g., esbuild Lambda)\nconst RELEASE_NOTES_PATH =\n process.env.MCP_RELEASE_NOTES_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"release-notes\");\n\n// Bundled Jaypie skills ship inside the @jaypie/mcp package. MCP_BUILTIN_SKILLS_PATH\n// lets bundlers (esbuild, Lambda) relocate them without disabling the built-in layer.\nconst BUILTIN_SKILLS_PATH =\n process.env.MCP_BUILTIN_SKILLS_PATH ||\n path.join(__dirname, \"..\", \"..\", \"..\", \"skills\");\n\nconst LOCAL_SKILLS_NAMESPACE = \"local\";\nconst JAYPIE_SKILLS_NAMESPACE = \"jaypie\";\nconst LAYER_SEPARATOR = \":\";\n\n// Skill layers resolved in order: a client's MCP_SKILLS_PATH layers on top of\n// the built-in Jaypie skill pack so `skill(\"aws\")` prefers the client's copy\n// while still exposing bundled Jaypie docs under the `jaypie:` namespace.\nconst skillLayers: LayeredStoreLayer[] = [];\n\nif (process.env.MCP_SKILLS_PATH) {\n skillLayers.push({\n namespace: LOCAL_SKILLS_NAMESPACE,\n store: createMarkdownStore({ path: process.env.MCP_SKILLS_PATH }),\n });\n}\n\nskillLayers.push({\n namespace: JAYPIE_SKILLS_NAMESPACE,\n store: createMarkdownStore({ path: BUILTIN_SKILLS_PATH }),\n});\n\nconst skillStore = createLayeredStore({\n layers: skillLayers,\n separator: LAYER_SEPARATOR,\n});\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\ninterface ReleaseNoteFrontMatter {\n date?: string;\n summary?: string;\n version?: string;\n}\n\nasync function parseReleaseNoteFile(filePath: string): Promise<{\n date?: string;\n filename: string;\n summary?: string;\n version?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const filename = path.basename(filePath, \".md\");\n\n if (content.startsWith(\"---\")) {\n const frontMatter =\n parseFrontmatter<ReleaseNoteFrontMatter>(content).data;\n return {\n date: frontMatter.date,\n filename,\n summary: frontMatter.summary,\n version: frontMatter.version || filename,\n };\n }\n\n return { filename, version: filename };\n } catch {\n return { filename: path.basename(filePath, \".md\") };\n }\n}\n\nfunction formatReleaseNoteListItem(note: {\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}): string {\n const { date, packageName, summary, version } = note;\n const parts = [`* ${packageName}@${version}`];\n\n if (date) {\n parts.push(`(${date})`);\n }\n\n if (summary) {\n parts.push(`- ${summary}`);\n }\n\n return parts.join(\" \");\n}\n\nasync function getPackageReleaseNotes(packageName: string): Promise<\n Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>\n> {\n const packageDir = path.join(RELEASE_NOTES_PATH, packageName);\n try {\n const files = await fs.readdir(packageDir);\n const mdFiles = files.filter((file) => file.endsWith(\".md\"));\n\n const notes = await Promise.all(\n mdFiles.map(async (file) => {\n const parsed = await parseReleaseNoteFile(path.join(packageDir, file));\n return { ...parsed, packageName };\n }),\n );\n\n return notes.sort((a, b) => {\n if (!a.version || !b.version) return 0;\n try {\n return gt(a.version, b.version) ? -1 : 1;\n } catch {\n return b.version.localeCompare(a.version);\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction filterReleaseNotesSince(\n notes: Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n }>,\n sinceVersion: string,\n): Array<{\n date?: string;\n filename: string;\n packageName: string;\n summary?: string;\n version?: string;\n}> {\n return notes.filter((note) => {\n if (!note.version) return false;\n try {\n return gt(note.version, sinceVersion);\n } catch {\n return false;\n }\n });\n}\n\n// =============================================================================\n// SKILL SERVICE\n// =============================================================================\n\nexport const skillService = createSkillService(skillStore);\n\n// =============================================================================\n// VERSION SERVICE\n// =============================================================================\n\nexport const versionService = fabricService({\n alias: \"version\",\n description: `Prints the current version and hash, \\`${BUILD_VERSION_STRING}\\``,\n input: {},\n service: async () => BUILD_VERSION_STRING,\n});\n\n// =============================================================================\n// RELEASE NOTES SERVICE\n// =============================================================================\n\nasync function getReleaseNotesHelp(): Promise<string> {\n return fs.readFile(path.join(__dirname, \"release-notes\", \"help.md\"), \"utf-8\");\n}\n\ninterface ReleaseNotesInput {\n package?: string;\n since_version?: string;\n version?: string;\n}\n\nexport const releaseNotesService = fabricService({\n alias: \"release_notes\",\n description:\n \"Browse Jaypie package release notes. Commands: list, read. Call with no args for help.\",\n input: {\n command: {\n description: \"Command to execute (omit for help)\",\n required: false,\n type: String,\n },\n input: {\n description: \"Command parameters\",\n required: false,\n type: Object,\n },\n },\n service: async ({\n command,\n input: params,\n }: {\n command?: string;\n input?: ReleaseNotesInput;\n }) => {\n if (!command || command === \"help\") {\n return getReleaseNotesHelp();\n }\n\n const p = params || {};\n\n switch (command) {\n case \"list\": {\n const entries = await fs.readdir(RELEASE_NOTES_PATH, {\n withFileTypes: true,\n });\n const packageDirs = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n const packagesToList = p.package\n ? packageDirs.filter((pkg) => pkg === p.package)\n : packageDirs;\n\n if (packagesToList.length === 0 && p.package) {\n return `No release notes found for package \"${p.package}\".`;\n }\n\n const allNotes = await Promise.all(\n packagesToList.map((pkg) => getPackageReleaseNotes(pkg)),\n );\n let flatNotes = allNotes.flat();\n\n if (p.since_version) {\n flatNotes = filterReleaseNotesSince(flatNotes, p.since_version);\n }\n\n if (flatNotes.length === 0) {\n const filterDesc = p.since_version\n ? ` newer than ${p.since_version}`\n : \"\";\n return `No release notes found${filterDesc}.`;\n }\n\n return flatNotes.map(formatReleaseNoteListItem).join(\"\\n\");\n }\n\n case \"read\": {\n if (!p.package) throw new Error(\"package is required\");\n if (!p.version) throw new Error(\"version is required\");\n const filePath = path.join(\n RELEASE_NOTES_PATH,\n p.package,\n `${p.version}.md`,\n );\n return fs.readFile(filePath, \"utf-8\");\n }\n\n default:\n throw new Error(\n `Unknown command: ${command}. Use release_notes() for help.`,\n );\n }\n },\n});\n"],"names":["__filename","__dirname"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jaypie/mcp",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.87",
|
|
4
4
|
"description": "Jaypie MCP",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"@jaypie/fabric": "^0.3.3",
|
|
47
47
|
"@jaypie/kit": "^1.2.12",
|
|
48
48
|
"@jaypie/tildeskill": "^0.3.3",
|
|
49
|
-
"@modelcontextprotocol/sdk": "1.
|
|
50
|
-
"commander": "^
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
50
|
+
"commander": "^15.0.0",
|
|
51
51
|
"semver": "^7.8.5",
|
|
52
52
|
"zod": "^4.1.13"
|
|
53
53
|
},
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.5
|
|
3
|
+
date: 2026-06-29
|
|
4
|
+
summary: Drop eslint-plugin-import-x and eslint-import-resolver-typescript — delegate import correctness to the TypeScript compiler; honor _-prefix and rest siblings in no-unused-vars
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Remove `eslint-plugin-import-x` and `eslint-import-resolver-typescript` from `@jaypie/eslint`.
|
|
10
|
+
- Delete the `jaypie:importxRecommended` and `jaypie:typescriptRecommended` config blocks and the `import-x/resolver-next` wiring added in 1.2.4 (#333).
|
|
11
|
+
- Drop the `import-x/extensions` override from the Vue block.
|
|
12
|
+
- Configure both `no-unused-vars` and `@typescript-eslint/no-unused-vars` with `argsIgnorePattern`/`varsIgnorePattern`/`caughtErrorsIgnorePattern: "^_"` and `ignoreRestSiblings: true`. The `_`-prefix convention for intentional discards and destructuring-to-omit-a-key (`const { id: _id, ...rest }`) are now honored instead of warned.
|
|
13
|
+
|
|
14
|
+
## Motivation
|
|
15
|
+
|
|
16
|
+
Every rule the import-x preset enabled for us (`no-unresolved`, `named`, `default`, `namespace`) duplicates checks the TypeScript compiler already performs — and performs *more accurately*. The standalone `eslint-import-resolver-typescript` cannot follow package `exports` wildcard subpaths (e.g. `"./*"` mapping `…/server/mcp.js`), so it reported false `import-x/no-unresolved` errors that `tsc`, `tsx`, the build, and tests all resolved fine. This was a recurring source of dependency pins and per-file `eslint-disable` workarounds.
|
|
17
|
+
|
|
18
|
+
In a TypeScript codebase with a compile/typecheck step, `tsc` is the source of truth for module resolution and import validity. The resolver layer added cost and false negatives without adding correctness.
|
|
19
|
+
|
|
20
|
+
## Migration
|
|
21
|
+
|
|
22
|
+
- No consumer config changes required. Re-export `@jaypie/eslint` as before.
|
|
23
|
+
- Module-resolution errors now surface from `tsc` (typecheck) rather than ESLint. Ensure packages run `typecheck` in CI (the Jaypie monorepo already does).
|
|
24
|
+
- Any `// eslint-disable-next-line import-x/*` comments are now unused directives and can be removed.
|
|
25
|
+
|
|
26
|
+
Supersedes #333.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.4.0
|
|
3
|
+
date: 2026-06-28
|
|
4
|
+
summary: Update @faker-js/faker to v10 (seeded output changes) and uuid to ^14.0.1
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Update `@faker-js/faker` from `^9.3.0` to `^10.5.0`. Within a version the
|
|
10
|
+
seeding contract is unchanged (same seed reproduces, different seeds diverge),
|
|
11
|
+
but **seeded output values differ from faker 9** — both the default randomizer
|
|
12
|
+
(mersenne32 → mersenne53) and the locale data arrays changed. Fixtures or
|
|
13
|
+
snapshots derived from a seeded fabricator will regenerate; minor bump signals
|
|
14
|
+
this consumer-visible shift. faker v10 requires Node
|
|
15
|
+
`^20.19 || ^22.13 || ^23.5 || >=24`.
|
|
16
|
+
- Update the `uuid` dependency from `^13.0.0` to `^14.0.1`. The functions in use
|
|
17
|
+
(`v5`, `parse`) are unchanged across the major, so `uuidFrom`, `uuidToBytes`,
|
|
18
|
+
`uuidToNumber`, and seeding behavior are unaffected.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.58
|
|
3
|
+
date: 2026-07-01
|
|
4
|
+
summary: Bump optional @jaypie/llm peer to ^1.3.5
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Dependencies
|
|
8
|
+
|
|
9
|
+
- Bump the optional `@jaypie/llm` peer dependency floor to `^1.3.5` — brings
|
|
10
|
+
`format`'s bare JSON Schema support and the new
|
|
11
|
+
`naturalSchemaToJsonSchema`/`jsonSchemaToNaturalSchema` conversion utilities.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.13
|
|
3
|
+
date: 2026-06-28
|
|
4
|
+
summary: Update the uuid dependency to ^14.0.1
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Update the `uuid` dependency from `^11.0.5` to `^14.0.1`. The functions in use
|
|
10
|
+
(`v4`, `v5`, `parse`) are unchanged across the major, so `uuid()`,
|
|
11
|
+
`jaypieKey`, and `jaypieApiKeyId` behavior is unaffected.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.3.5
|
|
3
|
+
date: 2026-07-01
|
|
4
|
+
summary: format accepts bare JSON Schema; add naturalSchemaToJsonSchema/jsonSchemaToNaturalSchema conversion utilities
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- `operate()`/`stream()`'s `format` option now duck-types and accepts a bare
|
|
10
|
+
JSON Schema object node — `{ type: "object", properties: {...}, required: [...] }`
|
|
11
|
+
— in addition to Natural Schema, Zod, and the existing OpenAI-style
|
|
12
|
+
`{ type: "json_schema", ... }` envelope. `required` is honored as-is across
|
|
13
|
+
all five adapters (OpenAI, Anthropic, Google, OpenRouter, Bedrock).
|
|
14
|
+
- New exported utilities (`src/util/jsonSchema.ts`):
|
|
15
|
+
- `naturalSchemaToJsonSchema(schema)` — Natural Schema → JSON Schema.
|
|
16
|
+
Lossless; Natural Schema is a strict subset of JSON Schema.
|
|
17
|
+
- `jsonSchemaToNaturalSchema(schema)` — JSON Schema → Natural Schema.
|
|
18
|
+
Lossy by nature (JSON Schema constraints, descriptions, defaults, unions,
|
|
19
|
+
and optionality have no Natural Schema equivalent). Never throws; every
|
|
20
|
+
dropped keyword is logged at `log.debug` with the keyword name and JSON
|
|
21
|
+
path, so nothing is silently lost without a trace.
|
|
22
|
+
- `isJsonSchema` duck-type check is exported internally and used by every
|
|
23
|
+
adapter's `formatOutputSchema`.
|
|
24
|
+
|
|
25
|
+
## Migration
|
|
26
|
+
|
|
27
|
+
No changes required. Existing `format` usage (Natural Schema, Zod, or the
|
|
28
|
+
OpenAI envelope) is unaffected.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.8.87
|
|
3
|
+
date: 2026-06-28
|
|
4
|
+
summary: Update subpackage and repokit skills for testkit matchers and repokit v2
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Update the `subpackage` skill to drop the separate `jest-extended` test setup
|
|
10
|
+
and install step. `@jaypie/testkit` now ships the extended matchers
|
|
11
|
+
(`toBeArray`, `toBeFunction`, `toBeObject`, etc.), so subpackages only need
|
|
12
|
+
`expect.extend(jaypieMatchers)`.
|
|
13
|
+
- Update the `repokit` and `monorepo` skills for `@jaypie/repokit` v2, which no
|
|
14
|
+
longer bundles or re-exports `dotenv`.
|
|
15
|
+
- Unpin `@modelcontextprotocol/sdk` from exact `1.27.1` to `^1.29.0`. The pin
|
|
16
|
+
existed only to dodge an `eslint-import-resolver-typescript` false positive on
|
|
17
|
+
the sdk's wildcard `exports`; dropping `eslint-plugin-import-x` removes the
|
|
18
|
+
need for it.
|
|
19
|
+
- Bump `commander` from `^14.0.0` to `^15.0.0`. Commander 15 is ESM-only and
|
|
20
|
+
requires Node `>=22.12.0`; the `jaypie-mcp` CLI is ESM and the supported Node
|
|
21
|
+
floor is already 22, so no consumer impact.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 2.0.0
|
|
3
|
+
date: 2026-06-28
|
|
4
|
+
summary: Drop the dotenv re-export (BREAKING); repokit now bundles rimraf and CLI tooling only
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- **BREAKING**: Remove the `dotenv` re-export from `@jaypie/repokit`. The package
|
|
10
|
+
no longer exports `config`, `parse`, or other `dotenv` members, and `dotenv` is
|
|
11
|
+
no longer a dependency. Import `dotenv` directly where needed.
|
|
12
|
+
- `@jaypie/repokit` now re-exports only `rimraf` for programmatic use and continues
|
|
13
|
+
to provide `env-cmd`, `sort-package-json`, and `tsx` as CLI tooling.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.48
|
|
3
|
+
date: 2026-06-28
|
|
4
|
+
summary: Absorb jest-extended matchers into testkit; drop the jest-extended dependency
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Reimplement the 15 `jest-extended` matchers that Jaypie actually uses as
|
|
10
|
+
native testkit matchers (`src/matchers/extended.matcher.ts`): `toBeArray`,
|
|
11
|
+
`toBeArrayOfSize`, `toBeBoolean`, `toBeEmpty`, `toBeFalse`, `toBeFunction`,
|
|
12
|
+
`toBeNumber`, `toBeObject`, `toBeString`, `toBeTrue`, `toContainAllKeys`,
|
|
13
|
+
`toContainKeys`, `toEndWith`, `toInclude`, and `toStartWith`. Pass semantics
|
|
14
|
+
match `jest-extended` (including `toBeObject` excluding arrays/Map/Set/Date and
|
|
15
|
+
`toBeEmpty` covering empty objects and empty iterables).
|
|
16
|
+
- These matchers are included in the `matchers` export, so consumers that already
|
|
17
|
+
do `expect.extend(matchers)` from `@jaypie/testkit` get them automatically.
|
|
18
|
+
- Remove the `jest-extended` dependency from `@jaypie/testkit` (and from `kit`,
|
|
19
|
+
`fabric`, and the monorepo root). Package test setups no longer import or
|
|
20
|
+
`expect.extend` `jest-extended` separately.
|
|
21
|
+
- Update the `uuid` dependency from `^11.0.5` to `^14.0.1`.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.49
|
|
3
|
+
date: 2026-07-01
|
|
4
|
+
summary: Mock jsonSchemaToNaturalSchema/naturalSchemaToJsonSchema from @jaypie/llm
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- `@jaypie/testkit/mock`'s `llm` export now re-exports `jsonSchemaToNaturalSchema`
|
|
10
|
+
and `naturalSchemaToJsonSchema` from `@jaypie/llm` (pure pass-through, same
|
|
11
|
+
pattern as `extractReasoning` and the `isLlmOperateInput*` guards).
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.2.6
|
|
3
|
+
date: 2026-07-01
|
|
4
|
+
summary: Fix rollup build to emit a bundled dist/index.d.ts
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Fixes
|
|
8
|
+
|
|
9
|
+
- `rollup.config.js` was missing a `rollup-plugin-dts` bundling pass, so
|
|
10
|
+
declarations only ever emitted as unflattened `dist/src/**/*.d.ts` files —
|
|
11
|
+
never the single `dist/index.d.ts` that `package.json`'s `types`/`exports`
|
|
12
|
+
field has always pointed to. Consumers resolving `@jaypie/textract`'s types
|
|
13
|
+
(including `@jaypie/testkit`'s mock, which imports from it directly) saw
|
|
14
|
+
`TS7016: Could not find a declaration file` and fell back to `any`.
|
|
15
|
+
- Adds the same `dts()` bundling pass every other Jaypie package already uses,
|
|
16
|
+
producing a proper bundled `dist/index.d.ts`.
|
package/skills/llm.md
CHANGED
|
@@ -215,6 +215,42 @@ const result = await Llm.operate("Parse: Alice is 30 and likes hiking and readin
|
|
|
215
215
|
});
|
|
216
216
|
```
|
|
217
217
|
|
|
218
|
+
### Bare JSON Schema
|
|
219
|
+
|
|
220
|
+
`format` also duck-types a bare JSON Schema object node — `{ type: "object", properties: {...} }` — without needing the OpenAI-style `{ type: "json_schema", ... }` envelope. `required` is honored.
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
const result = await Llm.operate("Analyze this chargeback", {
|
|
224
|
+
model: "gpt-5.1",
|
|
225
|
+
format: {
|
|
226
|
+
type: "object",
|
|
227
|
+
properties: {
|
|
228
|
+
code: { type: "string", description: "The chargeback reason code" },
|
|
229
|
+
cardBrand: { type: "string", description: "Visa, Mastercard, etc." },
|
|
230
|
+
},
|
|
231
|
+
required: ["code"],
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Converting between Natural Schema and JSON Schema
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
import { jsonSchemaToNaturalSchema, naturalSchemaToJsonSchema } from "@jaypie/llm";
|
|
240
|
+
|
|
241
|
+
naturalSchemaToJsonSchema({ name: String, age: Number });
|
|
242
|
+
// { type: "object", properties: { name: { type: "string" }, age: { type: "number" } }, required: ["name", "age"] }
|
|
243
|
+
|
|
244
|
+
jsonSchemaToNaturalSchema({
|
|
245
|
+
type: "object",
|
|
246
|
+
properties: { name: { type: "string" } },
|
|
247
|
+
required: ["name"],
|
|
248
|
+
});
|
|
249
|
+
// { name: String }
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`naturalSchemaToJsonSchema` is lossless — Natural Schema is a strict subset of JSON Schema. `jsonSchemaToNaturalSchema` is lossy: JSON Schema constraints, descriptions, defaults, unions, and optionality have no Natural Schema equivalent and are dropped. It never throws; every dropped keyword is logged at `log.debug` with the keyword name and JSON path.
|
|
253
|
+
|
|
218
254
|
## Conversation History
|
|
219
255
|
|
|
220
256
|
Continue conversations across calls:
|
package/skills/monorepo.md
CHANGED
|
@@ -133,7 +133,7 @@ Install root dev dependencies:
|
|
|
133
133
|
npm install --save-dev @jaypie/eslint @jaypie/repokit @jaypie/testkit eslint vite vite-plugin-dts vitest
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
`@jaypie/repokit` bundles `
|
|
136
|
+
`@jaypie/repokit` bundles `env-cmd`, `rimraf`, `sort-package-json`, and `tsx` at consistent versions. See `skill("repokit")`.
|
|
137
137
|
|
|
138
138
|
## Workspace Conventions
|
|
139
139
|
|
package/skills/repokit.md
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Bundled development tooling for Jaypie repositories (
|
|
2
|
+
description: Bundled development tooling for Jaypie repositories (env-cmd, rimraf, sort-package-json, tsx)
|
|
3
3
|
related: monorepo, subpackages, variables
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Repokit
|
|
7
7
|
|
|
8
|
-
`@jaypie/repokit` is a convenience bundle that consolidates common development tooling used across Jaypie repositories into a single devDependency. Install once and get `
|
|
8
|
+
`@jaypie/repokit` is a convenience bundle that consolidates common development tooling used across Jaypie repositories into a single devDependency. Install once and get `env-cmd`, `rimraf`, `sort-package-json`, and `tsx` at consistent versions.
|
|
9
|
+
|
|
10
|
+
> **v2 breaking change:** `@jaypie/repokit` no longer re-exports `dotenv`. Import `dotenv` directly where you need `config`/`parse`.
|
|
9
11
|
|
|
10
12
|
## What Ships
|
|
11
13
|
|
|
12
14
|
| Tool | Purpose |
|
|
13
15
|
|------|---------|
|
|
14
|
-
| `dotenv` | Load environment variables from `.env` files (re-exported for programmatic use) |
|
|
15
16
|
| `env-cmd` | Run commands with env file loaded (CLI; use in npm scripts) |
|
|
16
17
|
| `rimraf` | Cross-platform `rm -rf` (re-exported and available as CLI) |
|
|
17
18
|
| `sort-package-json` | Enforce consistent `package.json` key ordering (CLI) |
|
|
@@ -21,7 +22,7 @@ related: monorepo, subpackages, variables
|
|
|
21
22
|
|
|
22
23
|
- **Monorepo root devDependency** — single install so every package has access to the same tooling versions
|
|
23
24
|
- **Subpackages** — add as a devDependency where build/clean/script tooling is needed
|
|
24
|
-
- **Avoid** listing each of the
|
|
25
|
+
- **Avoid** listing each of the four underlying packages individually — let `@jaypie/repokit` pin them
|
|
25
26
|
|
|
26
27
|
## Install
|
|
27
28
|
|
|
@@ -34,15 +35,13 @@ npm install --save-dev @jaypie/repokit -w .
|
|
|
34
35
|
## Programmatic Exports
|
|
35
36
|
|
|
36
37
|
```typescript
|
|
37
|
-
import {
|
|
38
|
+
import { rimraf } from "@jaypie/repokit";
|
|
38
39
|
|
|
39
|
-
config(); // dotenv — loads process.env from .env
|
|
40
40
|
await rimraf("./dist"); // cross-platform directory removal
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
Re-exports:
|
|
44
44
|
|
|
45
|
-
- Everything from `dotenv` (`config`, `parse`, `populate`, etc.)
|
|
46
45
|
- `rimraf` from `rimraf`
|
|
47
46
|
|
|
48
47
|
## CLI Usage in `package.json` Scripts
|
|
@@ -84,10 +83,10 @@ env-cmd -f .env.local -- tsx scripts/seed.ts # combine with env-cmd
|
|
|
84
83
|
|
|
85
84
|
Add a `format:package` script and run it before committing, or enforce it in a pre-commit hook.
|
|
86
85
|
|
|
87
|
-
## Why Not the
|
|
86
|
+
## Why Not the Four Packages Directly?
|
|
88
87
|
|
|
89
|
-
- **One devDependency vs
|
|
90
|
-
- **Pinned versions** — every Jaypie repo using repokit gets the same `
|
|
88
|
+
- **One devDependency vs four** — fewer entries in `package.json` and `package-lock.json`
|
|
89
|
+
- **Pinned versions** — every Jaypie repo using repokit gets the same `rimraf`/etc. version
|
|
91
90
|
- **Easier upgrades** — bump repokit once, all tooling updates together
|
|
92
91
|
|
|
93
92
|
## See Also
|
package/skills/subpackage.md
CHANGED
|
@@ -137,13 +137,15 @@ export default defineConfig({
|
|
|
137
137
|
|
|
138
138
|
```typescript
|
|
139
139
|
import { matchers as jaypieMatchers } from "@jaypie/testkit";
|
|
140
|
-
import * as extendedMatchers from "jest-extended";
|
|
141
140
|
import { expect } from "vitest";
|
|
142
141
|
|
|
143
|
-
expect.extend(extendedMatchers);
|
|
144
142
|
expect.extend(jaypieMatchers);
|
|
145
143
|
```
|
|
146
144
|
|
|
145
|
+
`@jaypie/testkit` matchers include the extended matchers (`toBeArray`,
|
|
146
|
+
`toBeFunction`, `toBeObject`, `toBeString`, `toStartWith`, etc.), so no separate
|
|
147
|
+
`jest-extended` setup is required.
|
|
148
|
+
|
|
147
149
|
### src/index.ts
|
|
148
150
|
|
|
149
151
|
```typescript
|
|
@@ -188,7 +190,7 @@ npm install <package-name> --workspace ./packages/<package-name> --save-dev
|
|
|
188
190
|
Common dev dependencies for subpackages:
|
|
189
191
|
|
|
190
192
|
```bash
|
|
191
|
-
npm install
|
|
193
|
+
npm install @jaypie/testkit --workspace ./packages/<package-name> --save-dev
|
|
192
194
|
```
|
|
193
195
|
|
|
194
196
|
## Workspace Configuration
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|