@jaypie/mcp 0.5.0 → 0.6.1
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/suites/docs/index.js +1 -1
- package/dist/suites/docs/index.js.map +1 -1
- package/dist/suites/llm/help.md +1 -8
- package/dist/suites/llm/index.d.ts +1 -13
- package/dist/suites/llm/index.js +3 -7
- package/dist/suites/llm/index.js.map +1 -1
- package/dist/suites/llm/llm.d.ts +0 -11
- package/dist/suites/llm/llm.js +6 -41
- package/dist/suites/llm/llm.js.map +1 -1
- package/package.json +1 -1
- package/release-notes/aws/1.2.5.md +18 -0
- package/release-notes/constructs/1.2.19.md +35 -0
- package/release-notes/constructs/1.2.20.md +17 -0
- package/release-notes/express/1.2.5.md +33 -0
- package/release-notes/fabric/0.2.1.md +36 -0
- package/release-notes/jaypie/1.2.4.md +11 -0
- package/release-notes/jaypie/1.2.5.md +9 -0
- package/release-notes/lambda/1.2.4.md +39 -0
- package/release-notes/llm/1.2.7.md +12 -0
- package/release-notes/mcp/0.5.1.md +23 -0
- package/release-notes/mcp/0.6.0.md +19 -0
- package/release-notes/testkit/1.2.18.md +16 -0
- package/skills/agents.md +1 -1
- package/skills/cdk.md +5 -1
- package/skills/contents.md +11 -2
- package/skills/express.md +158 -0
- package/skills/fabric.md +5 -2
- package/skills/handlers.md +172 -0
- package/skills/infrastructure.md +2 -1
- package/skills/lambda.md +164 -0
- package/skills/llm.md +4 -1
- package/skills/patterns.md +3 -1
- package/skills/skills.md +2 -2
- package/skills/streaming.md +120 -0
- package/skills/websockets.md +203 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMcpServer.js","sources":["../src/createMcpServer.ts"],"sourcesContent":["import 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(
|
|
1
|
+
{"version":3,"file":"createMcpServer.js","sources":["../src/createMcpServer.ts"],"sourcesContent":["import 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":";;;AAWA;;;;;;;;;;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;;;;"}
|
|
@@ -8,7 +8,7 @@ import { gt } from 'semver';
|
|
|
8
8
|
/**
|
|
9
9
|
* Docs Suite - Documentation services (skill, version, release_notes)
|
|
10
10
|
*/
|
|
11
|
-
const BUILD_VERSION_STRING = "@jaypie/mcp@0.
|
|
11
|
+
const BUILD_VERSION_STRING = "@jaypie/mcp@0.6.1#212eddb5"
|
|
12
12
|
;
|
|
13
13
|
const __filename$1 = fileURLToPath(import.meta.url);
|
|
14
14
|
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 * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport matter from \"gray-matter\";\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\nconst RELEASE_NOTES_PATH = path.join(__dirname, \"..\", \"..\", \"..\", \"release-notes\");\nconst SKILLS_PATH = path.join(__dirname, \"..\", \"..\", \"..\", \"skills\");\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\ninterface ReleaseNoteFrontMatter {\n date?: string;\n summary?: string;\n version?: string;\n}\n\ninterface SkillFrontMatter {\n description?: string;\n}\n\nfunction isValidSkillAlias(alias: string): boolean {\n const normalized = alias.toLowerCase().trim();\n if (\n normalized.includes(\"/\") ||\n normalized.includes(\"\\\\\") ||\n normalized.includes(\"..\")\n ) {\n return false;\n }\n return /^[a-z0-9_-]+$/.test(normalized);\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 parsed = matter(content);\n const frontMatter = parsed.data as ReleaseNoteFrontMatter;\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 parseSkillFile(filePath: string): Promise<{\n alias: string;\n description?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const alias = path.basename(filePath, \".md\");\n\n if (content.startsWith(\"---\")) {\n const parsed = matter(content);\n const frontMatter = parsed.data as SkillFrontMatter;\n return {\n alias,\n description: frontMatter.description,\n };\n }\n\n return { alias };\n } catch {\n return { alias: path.basename(filePath, \".md\") };\n }\n}\n\nfunction formatSkillListItem(skill: {\n alias: string;\n description?: string;\n}): string {\n const { alias, description } = skill;\n if (description) {\n return `* ${alias} - ${description}`;\n }\n return `* ${alias}`;\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 = fabricService({\n alias: \"skill\",\n description:\n \"Access Jaypie development documentation. Pass a skill alias (e.g., 'aws', 'tests', 'errors') to get that documentation. Pass 'index' or no argument to list all available skills.\",\n input: {\n alias: {\n description:\n \"Skill alias (e.g., 'aws', 'tests'). Omit or use 'index' to list all skills.\",\n required: false,\n type: String,\n },\n },\n service: async ({ alias: inputAlias }: { alias?: string }) => {\n const alias = (inputAlias || \"index\").toLowerCase().trim();\n\n if (!isValidSkillAlias(alias)) {\n throw new Error(\n `Invalid skill alias \"${alias}\". Use alphanumeric characters, hyphens, and underscores only.`,\n );\n }\n\n if (alias === \"index\") {\n const indexPath = path.join(SKILLS_PATH, \"index.md\");\n let indexContent = \"\";\n\n try {\n indexContent = await fs.readFile(indexPath, \"utf-8\");\n if (indexContent.startsWith(\"---\")) {\n const parsed = matter(indexContent);\n indexContent = parsed.content.trim();\n }\n } catch {\n // Index file doesn't exist, will just show skill list\n }\n\n const files = await fs.readdir(SKILLS_PATH);\n const mdFiles = files.filter(\n (file) => file.endsWith(\".md\") && file !== \"index.md\",\n );\n\n const skills = await Promise.all(\n mdFiles.map((file) => parseSkillFile(path.join(SKILLS_PATH, file))),\n );\n\n skills.sort((a, b) => a.alias.localeCompare(b.alias));\n\n const skillList = skills.map(formatSkillListItem).join(\"\\n\");\n\n if (indexContent) {\n return `${indexContent}\\n\\n## Available Skills\\n\\n${skillList}`;\n }\n return `# Jaypie Skills\\n\\n## Available Skills\\n\\n${skillList}`;\n }\n\n const skillPath = path.join(SKILLS_PATH, `${alias}.md`);\n try {\n return await fs.readFile(skillPath, \"utf-8\");\n } catch {\n throw new Error(\n `Skill \"${alias}\" not found. Use skill(\"index\") to list available skills.`,\n );\n }\n },\n});\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(\n path.join(__dirname, \"release-notes\", \"help.md\"),\n \"utf-8\",\n );\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 * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport matter from \"gray-matter\";\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\nconst RELEASE_NOTES_PATH = path.join(\n __dirname,\n \"..\",\n \"..\",\n \"..\",\n \"release-notes\",\n);\nconst SKILLS_PATH = path.join(__dirname, \"..\", \"..\", \"..\", \"skills\");\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\ninterface ReleaseNoteFrontMatter {\n date?: string;\n summary?: string;\n version?: string;\n}\n\ninterface SkillFrontMatter {\n description?: string;\n}\n\nfunction isValidSkillAlias(alias: string): boolean {\n const normalized = alias.toLowerCase().trim();\n if (\n normalized.includes(\"/\") ||\n normalized.includes(\"\\\\\") ||\n normalized.includes(\"..\")\n ) {\n return false;\n }\n return /^[a-z0-9_-]+$/.test(normalized);\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 parsed = matter(content);\n const frontMatter = parsed.data as ReleaseNoteFrontMatter;\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 parseSkillFile(filePath: string): Promise<{\n alias: string;\n description?: string;\n}> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const alias = path.basename(filePath, \".md\");\n\n if (content.startsWith(\"---\")) {\n const parsed = matter(content);\n const frontMatter = parsed.data as SkillFrontMatter;\n return {\n alias,\n description: frontMatter.description,\n };\n }\n\n return { alias };\n } catch {\n return { alias: path.basename(filePath, \".md\") };\n }\n}\n\nfunction formatSkillListItem(skill: {\n alias: string;\n description?: string;\n}): string {\n const { alias, description } = skill;\n if (description) {\n return `* ${alias} - ${description}`;\n }\n return `* ${alias}`;\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 = fabricService({\n alias: \"skill\",\n description:\n \"Access Jaypie development documentation. Pass a skill alias (e.g., 'aws', 'tests', 'errors') to get that documentation. Pass 'index' or no argument to list all available skills.\",\n input: {\n alias: {\n description:\n \"Skill alias (e.g., 'aws', 'tests'). Omit or use 'index' to list all skills.\",\n required: false,\n type: String,\n },\n },\n service: async ({ alias: inputAlias }: { alias?: string }) => {\n const alias = (inputAlias || \"index\").toLowerCase().trim();\n\n if (!isValidSkillAlias(alias)) {\n throw new Error(\n `Invalid skill alias \"${alias}\". Use alphanumeric characters, hyphens, and underscores only.`,\n );\n }\n\n if (alias === \"index\") {\n const indexPath = path.join(SKILLS_PATH, \"index.md\");\n let indexContent = \"\";\n\n try {\n indexContent = await fs.readFile(indexPath, \"utf-8\");\n if (indexContent.startsWith(\"---\")) {\n const parsed = matter(indexContent);\n indexContent = parsed.content.trim();\n }\n } catch {\n // Index file doesn't exist, will just show skill list\n }\n\n const files = await fs.readdir(SKILLS_PATH);\n const mdFiles = files.filter(\n (file) => file.endsWith(\".md\") && file !== \"index.md\",\n );\n\n const skills = await Promise.all(\n mdFiles.map((file) => parseSkillFile(path.join(SKILLS_PATH, file))),\n );\n\n skills.sort((a, b) => a.alias.localeCompare(b.alias));\n\n const skillList = skills.map(formatSkillListItem).join(\"\\n\");\n\n if (indexContent) {\n return `${indexContent}\\n\\n## Available Skills\\n\\n${skillList}`;\n }\n return `# Jaypie Skills\\n\\n## Available Skills\\n\\n${skillList}`;\n }\n\n const skillPath = path.join(SKILLS_PATH, `${alias}.md`);\n try {\n return await fs.readFile(skillPath, \"utf-8\");\n } catch {\n throw new Error(\n `Skill \"${alias}\" not found. Use skill(\"index\") to list available skills.`,\n );\n }\n },\n});\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/dist/suites/llm/help.md
CHANGED
|
@@ -6,17 +6,11 @@ Debug and inspect LLM provider responses. Useful for understanding how providers
|
|
|
6
6
|
|
|
7
7
|
| Command | Description | Required Parameters |
|
|
8
8
|
|---------|-------------|---------------------|
|
|
9
|
-
| `list_providers` | List available providers and models | - |
|
|
10
9
|
| `debug_call` | Make a debug call and inspect response | `provider`, `message` |
|
|
11
10
|
|
|
12
11
|
## Providers
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|----------|---------------|------------------|
|
|
16
|
-
| `openai` | gpt-4o-mini | o3-mini, o1-preview, o1-mini |
|
|
17
|
-
| `anthropic` | claude-sonnet-4-20250514 | - |
|
|
18
|
-
| `gemini` | gemini-2.0-flash | - |
|
|
19
|
-
| `openrouter` | openai/gpt-4o-mini | openai/o3-mini, openai/o1-preview |
|
|
13
|
+
Supported providers: `openai`, `anthropic`, `gemini`, `openrouter`
|
|
20
14
|
|
|
21
15
|
## Environment Variables
|
|
22
16
|
|
|
@@ -30,7 +24,6 @@ Debug and inspect LLM provider responses. Useful for understanding how providers
|
|
|
30
24
|
## Examples
|
|
31
25
|
|
|
32
26
|
```
|
|
33
|
-
llm("list_providers")
|
|
34
27
|
llm("debug_call", { provider: "openai", message: "Hello, world!" })
|
|
35
28
|
llm("debug_call", { provider: "openai", model: "o3-mini", message: "What is 15 * 17? Think step by step." })
|
|
36
29
|
```
|
|
@@ -7,17 +7,5 @@ interface LlmInput {
|
|
|
7
7
|
export declare const llmService: import("@jaypie/fabric").Service<{
|
|
8
8
|
command?: string;
|
|
9
9
|
input?: LlmInput;
|
|
10
|
-
}, string | import("./llm.js").LlmDebugCallResult |
|
|
11
|
-
providers: Array<{
|
|
12
|
-
name: LlmProvider;
|
|
13
|
-
defaultModel: string;
|
|
14
|
-
reasoningModels: string[];
|
|
15
|
-
}>;
|
|
16
|
-
}, string | import("./llm.js").LlmDebugCallResult | {
|
|
17
|
-
providers: Array<{
|
|
18
|
-
name: LlmProvider;
|
|
19
|
-
defaultModel: string;
|
|
20
|
-
reasoningModels: string[];
|
|
21
|
-
}>;
|
|
22
|
-
}>;
|
|
10
|
+
}, string | import("./llm.js").LlmDebugCallResult, string | import("./llm.js").LlmDebugCallResult>;
|
|
23
11
|
export * from "./llm.js";
|
package/dist/suites/llm/index.js
CHANGED
|
@@ -2,8 +2,7 @@ import { fabricService } from '@jaypie/fabric';
|
|
|
2
2
|
import * as fs from 'node:fs/promises';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
-
import { debugLlmCall
|
|
6
|
-
export { REASONING_MODELS } from './llm.js';
|
|
5
|
+
import { debugLlmCall } from './llm.js';
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* LLM Suite - Unified LLM debugging and inspection
|
|
@@ -19,7 +18,7 @@ async function getHelp() {
|
|
|
19
18
|
}
|
|
20
19
|
const llmService = fabricService({
|
|
21
20
|
alias: "llm",
|
|
22
|
-
description: "Debug LLM provider responses. Commands:
|
|
21
|
+
description: "Debug LLM provider responses. Commands: debug_call. Call with no args for help.",
|
|
23
22
|
input: {
|
|
24
23
|
command: {
|
|
25
24
|
description: "Command to execute (omit for help)",
|
|
@@ -38,9 +37,6 @@ const llmService = fabricService({
|
|
|
38
37
|
}
|
|
39
38
|
const p = params || {};
|
|
40
39
|
switch (command) {
|
|
41
|
-
case "list_providers": {
|
|
42
|
-
return listLlmProviders();
|
|
43
|
-
}
|
|
44
40
|
case "debug_call": {
|
|
45
41
|
if (!p.provider)
|
|
46
42
|
throw new Error("provider is required");
|
|
@@ -61,5 +57,5 @@ const llmService = fabricService({
|
|
|
61
57
|
},
|
|
62
58
|
});
|
|
63
59
|
|
|
64
|
-
export { debugLlmCall,
|
|
60
|
+
export { debugLlmCall, llmService };
|
|
65
61
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/suites/llm/index.ts"],"sourcesContent":["/**\n * LLM Suite - Unified LLM debugging and inspection\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 { debugLlmCall,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/suites/llm/index.ts"],"sourcesContent":["/**\n * LLM Suite - Unified LLM debugging and inspection\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 { debugLlmCall, type LlmProvider } from \"./llm.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// Input type for the unified LLM service\ninterface LlmInput {\n message?: string;\n model?: string;\n provider?: LlmProvider;\n}\n\nexport const llmService = fabricService({\n alias: \"llm\",\n description:\n \"Debug LLM provider responses. Commands: debug_call. 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?: LlmInput;\n }) => {\n if (!command || command === \"help\") {\n return getHelp();\n }\n\n const p = params || {};\n\n switch (command) {\n case \"debug_call\": {\n if (!p.provider) throw new Error(\"provider is required\");\n if (!p.message) throw new Error(\"message is required\");\n const result = await debugLlmCall(\n {\n message: p.message,\n model: p.model,\n provider: p.provider,\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 llm() for help.`);\n }\n },\n});\n\n// Re-export types and functions for testing\nexport * from \"./llm.js\";\n"],"names":["__dirname"],"mappings":";;;;;;AAAA;;AAEG;AAQH,MAAMA,WAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE9D;AACA,MAAM,GAAG,GAAG;AACV,IAAA,KAAK,EAAE,MAAK,EAAE,CAAC;AACf,IAAA,IAAI,EAAE,MAAK,EAAE,CAAC;CACf;AAED,eAAe,OAAO,GAAA;AACpB,IAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAACA,WAAS,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC;AAC9D;AASO,MAAM,UAAU,GAAG,aAAa,CAAC;AACtC,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,WAAW,EACT,iFAAiF;AACnF,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE;AACP,YAAA,WAAW,EAAE,oCAAoC;AACjD,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,WAAW,EAAE,oBAAoB;AACjC,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,MAAM;AACb,SAAA;AACF,KAAA;IACD,OAAO,EAAE,OAAO,EACd,OAAO,EACP,KAAK,EAAE,MAAM,GAId,KAAI;AACH,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,EAAE;YAClC,OAAO,OAAO,EAAE;QAClB;AAEA,QAAA,MAAM,CAAC,GAAG,MAAM,IAAI,EAAE;QAEtB,QAAQ,OAAO;YACb,KAAK,YAAY,EAAE;gBACjB,IAAI,CAAC,CAAC,CAAC,QAAQ;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;gBACxD,IAAI,CAAC,CAAC,CAAC,OAAO;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AACtD,gBAAA,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B;oBACE,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,EACD,GAAG,CACJ;gBACD,IAAI,CAAC,MAAM,CAAC,OAAO;AAAE,oBAAA,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AAClD,gBAAA,OAAO,MAAM;YACf;AAEA,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAA,qBAAA,CAAuB,CAAC;;IAEzE,CAAC;AACF,CAAA;;;;"}
|
package/dist/suites/llm/llm.d.ts
CHANGED
|
@@ -23,19 +23,8 @@ interface Logger {
|
|
|
23
23
|
info: (message: string, ...args: unknown[]) => void;
|
|
24
24
|
error: (message: string, ...args: unknown[]) => void;
|
|
25
25
|
}
|
|
26
|
-
export declare const REASONING_MODELS: Record<string, string>;
|
|
27
26
|
/**
|
|
28
27
|
* Make a debug LLM call and return the raw response data for inspection
|
|
29
28
|
*/
|
|
30
29
|
export declare function debugLlmCall(params: LlmDebugCallParams, log: Logger): Promise<LlmDebugCallResult>;
|
|
31
|
-
/**
|
|
32
|
-
* List available providers and their default/reasoning models
|
|
33
|
-
*/
|
|
34
|
-
export declare function listLlmProviders(): {
|
|
35
|
-
providers: Array<{
|
|
36
|
-
name: LlmProvider;
|
|
37
|
-
defaultModel: string;
|
|
38
|
-
reasoningModels: string[];
|
|
39
|
-
}>;
|
|
40
|
-
};
|
|
41
30
|
export {};
|
package/dist/suites/llm/llm.js
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
import { Llm } from '@jaypie/llm';
|
|
1
|
+
import { LLM, Llm } from '@jaypie/llm';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* LLM debugging utilities for inspecting raw provider responses
|
|
5
5
|
*/
|
|
6
6
|
// Default models for each provider
|
|
7
7
|
const DEFAULT_MODELS = {
|
|
8
|
-
anthropic:
|
|
9
|
-
gemini:
|
|
10
|
-
openai:
|
|
11
|
-
openrouter:
|
|
12
|
-
};
|
|
13
|
-
// Reasoning-capable models for testing reasoning extraction
|
|
14
|
-
const REASONING_MODELS = {
|
|
15
|
-
"openai-o3-mini": "o3-mini",
|
|
16
|
-
"openai-o1-preview": "o1-preview",
|
|
17
|
-
"openai-o1-mini": "o1-mini",
|
|
8
|
+
anthropic: LLM.PROVIDER.ANTHROPIC.MODEL.SMALL,
|
|
9
|
+
gemini: LLM.PROVIDER.GEMINI.MODEL.SMALL,
|
|
10
|
+
openai: LLM.PROVIDER.OPENAI.MODEL.SMALL,
|
|
11
|
+
openrouter: LLM.PROVIDER.OPENROUTER.MODEL.SMALL,
|
|
18
12
|
};
|
|
19
13
|
/**
|
|
20
14
|
* Make a debug LLM call and return the raw response data for inspection
|
|
@@ -62,35 +56,6 @@ async function debugLlmCall(params, log) {
|
|
|
62
56
|
};
|
|
63
57
|
}
|
|
64
58
|
}
|
|
65
|
-
/**
|
|
66
|
-
* List available providers and their default/reasoning models
|
|
67
|
-
*/
|
|
68
|
-
function listLlmProviders() {
|
|
69
|
-
return {
|
|
70
|
-
providers: [
|
|
71
|
-
{
|
|
72
|
-
name: "openai",
|
|
73
|
-
defaultModel: DEFAULT_MODELS.openai,
|
|
74
|
-
reasoningModels: ["o3-mini", "o1-preview", "o1-mini"],
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
name: "anthropic",
|
|
78
|
-
defaultModel: DEFAULT_MODELS.anthropic,
|
|
79
|
-
reasoningModels: [], // Anthropic doesn't expose reasoning the same way
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
name: "gemini",
|
|
83
|
-
defaultModel: DEFAULT_MODELS.gemini,
|
|
84
|
-
reasoningModels: [], // Gemini has thoughtsTokenCount but unclear on content
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
name: "openrouter",
|
|
88
|
-
defaultModel: DEFAULT_MODELS.openrouter,
|
|
89
|
-
reasoningModels: ["openai/o3-mini", "openai/o1-preview"],
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
59
|
|
|
95
|
-
export {
|
|
60
|
+
export { debugLlmCall };
|
|
96
61
|
//# sourceMappingURL=llm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sources":["../../../src/suites/llm/llm.ts"],"sourcesContent":["/**\n * LLM debugging utilities for inspecting raw provider responses\n */\n\nimport { Llm } from \"@jaypie/llm\";\n\nexport type LlmProvider = \"anthropic\" | \"gemini\" | \"openai\" | \"openrouter\";\n\nexport interface LlmDebugCallParams {\n provider: LlmProvider;\n model?: string;\n message: string;\n}\n\nexport interface LlmDebugCallResult {\n success: boolean;\n provider: string;\n model: string;\n content?: string;\n reasoning?: string[];\n reasoningTokens?: number;\n history?: unknown[];\n rawResponses?: unknown[];\n usage?: unknown[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n// Default models for each provider\nconst DEFAULT_MODELS: Record<LlmProvider, string> = {\n anthropic:
|
|
1
|
+
{"version":3,"file":"llm.js","sources":["../../../src/suites/llm/llm.ts"],"sourcesContent":["/**\n * LLM debugging utilities for inspecting raw provider responses\n */\n\nimport { LLM, Llm } from \"@jaypie/llm\";\n\nexport type LlmProvider = \"anthropic\" | \"gemini\" | \"openai\" | \"openrouter\";\n\nexport interface LlmDebugCallParams {\n provider: LlmProvider;\n model?: string;\n message: string;\n}\n\nexport interface LlmDebugCallResult {\n success: boolean;\n provider: string;\n model: string;\n content?: string;\n reasoning?: string[];\n reasoningTokens?: number;\n history?: unknown[];\n rawResponses?: unknown[];\n usage?: unknown[];\n error?: string;\n}\n\ninterface Logger {\n info: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n// Default models for each provider\nconst DEFAULT_MODELS: Record<LlmProvider, string> = {\n anthropic: LLM.PROVIDER.ANTHROPIC.MODEL.SMALL,\n gemini: LLM.PROVIDER.GEMINI.MODEL.SMALL,\n openai: LLM.PROVIDER.OPENAI.MODEL.SMALL,\n openrouter: LLM.PROVIDER.OPENROUTER.MODEL.SMALL,\n};\n\n/**\n * Make a debug LLM call and return the raw response data for inspection\n */\nexport async function debugLlmCall(\n params: LlmDebugCallParams,\n log: Logger,\n): Promise<LlmDebugCallResult> {\n const { provider, message } = params;\n const model = params.model || DEFAULT_MODELS[provider];\n\n log.info(`Making debug LLM call to ${provider} with model ${model}`);\n\n try {\n const llm = new Llm(provider, { model });\n\n const result = await llm.operate(message, {\n user: \"[jaypie-mcp] Debug LLM Call\",\n });\n\n if (result.error) {\n return {\n success: false,\n provider,\n model,\n error: `${result.error.title}: ${result.error.detail || \"Unknown error\"}`,\n };\n }\n\n // Calculate total reasoning tokens\n const reasoningTokens = result.usage.reduce(\n (sum, u) => sum + (u.reasoning || 0),\n 0,\n );\n\n return {\n success: true,\n provider,\n model,\n content:\n typeof result.content === \"string\"\n ? result.content\n : JSON.stringify(result.content),\n reasoning: result.reasoning,\n reasoningTokens,\n history: result.history,\n rawResponses: result.responses,\n usage: result.usage,\n };\n } catch (error) {\n log.error(`Error calling ${provider}:`, error);\n return {\n success: false,\n provider,\n model,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n"],"names":[],"mappings":";;AAAA;;AAEG;AA8BH;AACA,MAAM,cAAc,GAAgC;IAClD,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK;IAC7C,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;IACvC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;IACvC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK;CAChD;AAED;;AAEG;AACI,eAAe,YAAY,CAChC,MAA0B,EAC1B,GAAW,EAAA;AAEX,IAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC;IAEtD,GAAG,CAAC,IAAI,CAAC,CAAA,yBAAA,EAA4B,QAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,CAAE,CAAC;AAEpE,IAAA,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE;AACxC,YAAA,IAAI,EAAE,6BAA6B;AACpC,SAAA,CAAC;AAEF,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;gBACd,QAAQ;gBACR,KAAK;AACL,gBAAA,KAAK,EAAE,CAAA,EAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA,EAAA,EAAK,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,eAAe,CAAA,CAAE;aAC1E;QACH;;QAGA,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,EACpC,CAAC,CACF;QAED,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,KAAK;AACL,YAAA,OAAO,EACL,OAAO,MAAM,CAAC,OAAO,KAAK;kBACtB,MAAM,CAAC;kBACP,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;YACpC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,eAAe;YACf,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,MAAM,CAAC,SAAS;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB;IACH;IAAE,OAAO,KAAK,EAAE;QACd,GAAG,CAAC,KAAK,CAAC,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;QAC9C,OAAO;AACL,YAAA,OAAO,EAAE,KAAK;YACd,QAAQ;YACR,KAAK;AACL,YAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;SAC9D;IACH;AACF;;;;"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.5
|
|
3
|
+
date: 2025-01-23
|
|
4
|
+
summary: Add WebSocket connection management utilities
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## New Features
|
|
8
|
+
|
|
9
|
+
### WebSocket Utilities
|
|
10
|
+
|
|
11
|
+
- **`sendToConnection(data, { connectionId, domainName, stage })`** - Send data to a WebSocket connection
|
|
12
|
+
- **`broadcastToConnections(data, { connectionIds, domainName, stage })`** - Broadcast data to multiple connections
|
|
13
|
+
|
|
14
|
+
Both functions use the ApiGatewayManagementApi client and handle stale connection errors gracefully.
|
|
15
|
+
|
|
16
|
+
## Dependencies
|
|
17
|
+
|
|
18
|
+
- Added `@aws-sdk/client-apigatewaymanagementapi`
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.19
|
|
3
|
+
date: 2025-01-23
|
|
4
|
+
summary: Add WebSocket API Gateway constructs
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## New Constructs
|
|
8
|
+
|
|
9
|
+
### JaypieWebSocket
|
|
10
|
+
|
|
11
|
+
WebSocket API using AWS API Gateway v2 with custom domain support:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
const ws = new JaypieWebSocket(this, "Chat", {
|
|
15
|
+
host: "ws.example.com",
|
|
16
|
+
connect: connectLambda,
|
|
17
|
+
disconnect: disconnectLambda,
|
|
18
|
+
default: messageLambda,
|
|
19
|
+
routes: { sendMessage: sendMessageLambda },
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### JaypieWebSocketLambda
|
|
24
|
+
|
|
25
|
+
Convenience Lambda construct for WebSocket handlers with appropriate defaults.
|
|
26
|
+
|
|
27
|
+
### JaypieWebSocketTable
|
|
28
|
+
|
|
29
|
+
Optional DynamoDB table for connection tracking with TTL support:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const table = new JaypieWebSocketTable(this, "Connections", {
|
|
33
|
+
ttl: Duration.hours(24),
|
|
34
|
+
});
|
|
35
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.20
|
|
3
|
+
date: 2025-01-25
|
|
4
|
+
summary: Fix grantManageConnections IAM permission
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Bug Fixes
|
|
8
|
+
|
|
9
|
+
### JaypieWebSocket.grantManageConnections
|
|
10
|
+
|
|
11
|
+
Fixed `grantManageConnections()` to grant the correct IAM permission for sending messages to WebSocket clients.
|
|
12
|
+
|
|
13
|
+
**Before**: The method generated an ARN without the `@connections` path, causing `AccessDeniedException` when Lambdas tried to use the API Gateway Management API.
|
|
14
|
+
|
|
15
|
+
**After**: The ARN now correctly includes `/POST/@connections/*` to match the required permission format.
|
|
16
|
+
|
|
17
|
+
Fixes #151
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.5
|
|
3
|
+
date: 2026-01-23
|
|
4
|
+
summary: Fix array query parameters with bracket notation in API Gateway v1 events
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# @jaypie/express 1.2.5
|
|
8
|
+
|
|
9
|
+
## Bug Fixes
|
|
10
|
+
|
|
11
|
+
### Array Query Parameters with Bracket Notation
|
|
12
|
+
|
|
13
|
+
Fixed a bug where array query parameters using bracket notation (e.g., `?filterByStatus[]=APPROVED&filterByStatus[]=RESOLVED`) were completely ignored when using AWS API Gateway REST API v1 events.
|
|
14
|
+
|
|
15
|
+
**Before:**
|
|
16
|
+
```javascript
|
|
17
|
+
// URL: ?filterByStatus[]=APPROVED&filterByStatus[]=RESOLVED
|
|
18
|
+
req.query = { "filterByStatus[]": "RESOLVED" } // Only last value, brackets preserved
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**After:**
|
|
22
|
+
```javascript
|
|
23
|
+
// URL: ?filterByStatus[]=APPROVED&filterByStatus[]=RESOLVED
|
|
24
|
+
req.query = { filterByStatus: ["APPROVED", "RESOLVED"] } // Array with normalized key
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Changes
|
|
28
|
+
|
|
29
|
+
- Now uses `multiValueQueryStringParameters` from API Gateway v1 events instead of `queryStringParameters` to capture all values
|
|
30
|
+
- Normalizes bracket notation by stripping `[]` suffix from keys
|
|
31
|
+
- Properly handles multi-value query parameters in Function URL v2 events via `rawQueryString` parsing
|
|
32
|
+
- Single values remain as strings unless bracket notation is used
|
|
33
|
+
- Values with bracket notation are always arrays (even with single values)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.2.1
|
|
3
|
+
date: 2025-01-23
|
|
4
|
+
summary: Add WebSocket adapter for fabric services
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## New Features
|
|
8
|
+
|
|
9
|
+
### fabricWebSocket
|
|
10
|
+
|
|
11
|
+
Wrap fabric services for WebSocket Lambda handlers:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { fabricService } from "@jaypie/fabric";
|
|
15
|
+
import { fabricWebSocket } from "@jaypie/fabric/websocket";
|
|
16
|
+
|
|
17
|
+
const chatService = fabricService({
|
|
18
|
+
alias: "chat",
|
|
19
|
+
input: {
|
|
20
|
+
action: { type: String, validate: ["join", "message"] },
|
|
21
|
+
room: { type: String },
|
|
22
|
+
},
|
|
23
|
+
service: async (input, context) => {
|
|
24
|
+
// context.connectionId available
|
|
25
|
+
// context.sendMessage() wired to WebSocket send
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const handler = fabricWebSocket(chatService, {
|
|
30
|
+
secrets: ["MONGODB_URI"],
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### New Export
|
|
35
|
+
|
|
36
|
+
- `@jaypie/fabric/websocket` - WebSocket adapter exports
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.4
|
|
3
|
+
date: 2026-01-23
|
|
4
|
+
summary: Update @jaypie/express dependency with array query parameter fix
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# jaypie 1.2.4
|
|
8
|
+
|
|
9
|
+
## Dependencies
|
|
10
|
+
|
|
11
|
+
- Updated `@jaypie/express` to 1.2.5 with fix for array query parameters with bracket notation in API Gateway v1 events
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.4
|
|
3
|
+
date: 2025-01-23
|
|
4
|
+
summary: Add WebSocket Lambda handler
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## New Features
|
|
8
|
+
|
|
9
|
+
### websocketHandler
|
|
10
|
+
|
|
11
|
+
Lambda handler for WebSocket API Gateway events with lifecycle management:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
export const handler = websocketHandler(async (event, context) => {
|
|
15
|
+
const { routeKey, connectionId, body } = context;
|
|
16
|
+
|
|
17
|
+
// Send to this connection
|
|
18
|
+
await context.send({ received: true });
|
|
19
|
+
|
|
20
|
+
// Broadcast to multiple connections
|
|
21
|
+
await context.broadcast(connectionIds, { message: "hello" });
|
|
22
|
+
|
|
23
|
+
return { statusCode: 200 };
|
|
24
|
+
}, {
|
|
25
|
+
name: "chat",
|
|
26
|
+
secrets: ["MONGODB_URI"],
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### WebSocket Context
|
|
31
|
+
|
|
32
|
+
- `routeKey` - Route key ($connect, $disconnect, $default, or custom)
|
|
33
|
+
- `connectionId` - WebSocket connection ID
|
|
34
|
+
- `domainName` - API Gateway domain
|
|
35
|
+
- `stage` - API Gateway stage
|
|
36
|
+
- `body` - Message body (null for connect/disconnect)
|
|
37
|
+
- `queryStringParameters` - Query params (available on $connect)
|
|
38
|
+
- `send(data)` - Send to current connection
|
|
39
|
+
- `broadcast(connectionIds, data)` - Send to multiple connections
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.7
|
|
3
|
+
date: 2025-01-25
|
|
4
|
+
summary: Refactor constants structure and update default OpenAI model to gpt-5.2
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
|
|
9
|
+
- Refactored `PROVIDER` constants to use internal `FIRST_CLASS_PROVIDER` for cleaner organization
|
|
10
|
+
- Alphabetized provider order in constants (ANTHROPIC, GEMINI, OPENAI, OPENROUTER)
|
|
11
|
+
- Updated default OpenAI model from `gpt-5.1` to `gpt-5.2`
|
|
12
|
+
- Updated OpenAI model variants: `gpt-5.2-mini` (SMALL), `gpt-5.2-nano` (TINY)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.5.1
|
|
3
|
+
date: 2025-01-23
|
|
4
|
+
summary: Add streaming and websockets skills
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## New Skills
|
|
8
|
+
|
|
9
|
+
- **`streaming`** - Response streaming guide for Lambda and Express with SSE and NLJSON formats
|
|
10
|
+
- **`websockets`** - WebSocket API support documentation (planned feature)
|
|
11
|
+
|
|
12
|
+
## Updated Skills
|
|
13
|
+
|
|
14
|
+
Added "See Also" sections with cross-references:
|
|
15
|
+
|
|
16
|
+
- `cdk` - Added streaming and websockets references
|
|
17
|
+
- `express` - Added streaming reference
|
|
18
|
+
- `fabric` - Added websockets reference
|
|
19
|
+
- `handlers` - Added streaming and websockets references
|
|
20
|
+
- `infrastructure` - Added websockets reference
|
|
21
|
+
- `lambda` - Added streaming and websockets references
|
|
22
|
+
- `llm` - Added streaming reference
|
|
23
|
+
- `patterns` - Added streaming and websockets references
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 0.6.0
|
|
3
|
+
date: 2025-01-25
|
|
4
|
+
summary: Remove list_providers command from LLM tool
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Breaking Changes
|
|
8
|
+
|
|
9
|
+
- Removed `list_providers` command from `llm` tool
|
|
10
|
+
- Removed `REASONING_MODELS` export from llm suite
|
|
11
|
+
|
|
12
|
+
## Rationale
|
|
13
|
+
|
|
14
|
+
The `list_providers` command provided metadata about available LLM providers and reasoning models. This information was largely static and better served by documentation. The `debug_call` command remains for actual LLM API testing.
|
|
15
|
+
|
|
16
|
+
## Migration
|
|
17
|
+
|
|
18
|
+
If you were using `llm("list_providers")`, refer to the help documentation instead:
|
|
19
|
+
- `llm()` or `llm("help")` returns available commands and provider information
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.2.18
|
|
3
|
+
date: 2025-01-23
|
|
4
|
+
summary: Add WebSocket mocks
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## New Mocks
|
|
8
|
+
|
|
9
|
+
### AWS WebSocket Mocks
|
|
10
|
+
|
|
11
|
+
- `sendToConnection` - Mock for WebSocket send function
|
|
12
|
+
- `broadcastToConnections` - Mock for WebSocket broadcast function
|
|
13
|
+
|
|
14
|
+
### Lambda WebSocket Mocks
|
|
15
|
+
|
|
16
|
+
- `websocketHandler` - Mock for WebSocket Lambda handler
|
package/skills/agents.md
CHANGED
|
@@ -21,7 +21,7 @@ Query `mcp__jaypie__skill(alias: String)` for development guidance:
|
|
|
21
21
|
|
|
22
22
|
Contents: index, releasenotes
|
|
23
23
|
Development: documentation, errors, logs, mocks, style, tests
|
|
24
|
-
Infrastructure: aws, cdk, cicd, datadog, dns, dynamodb, secrets, variables
|
|
24
|
+
Infrastructure: aws, cdk, cicd, datadog, dns, dynamodb, express, lambda, secrets, streaming, variables, websockets
|
|
25
25
|
Patterns: fabric, models, services, vocabulary
|
|
26
26
|
Meta: issues, jaypie, skills, tools
|
|
27
27
|
```
|