poe-code 3.0.180 → 3.0.182

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/cli/commands/config.js +3 -4
  2. package/dist/cli/commands/config.js.map +1 -1
  3. package/dist/cli/commands/configure.js +12 -3
  4. package/dist/cli/commands/configure.js.map +1 -1
  5. package/dist/cli/commands/dashboard-loop-shared.d.ts +7 -0
  6. package/dist/cli/commands/dashboard-loop-shared.js +15 -0
  7. package/dist/cli/commands/dashboard-loop-shared.js.map +1 -1
  8. package/dist/cli/commands/experiment.js +41 -32
  9. package/dist/cli/commands/experiment.js.map +1 -1
  10. package/dist/cli/commands/mcp.js +7 -2
  11. package/dist/cli/commands/mcp.js.map +1 -1
  12. package/dist/cli/commands/pipeline.js +55 -44
  13. package/dist/cli/commands/pipeline.js.map +1 -1
  14. package/dist/cli/commands/plan.js +195 -38
  15. package/dist/cli/commands/plan.js.map +1 -1
  16. package/dist/cli/commands/ralph.js +24 -24
  17. package/dist/cli/commands/ralph.js.map +1 -1
  18. package/dist/cli/commands/shared.d.ts +3 -0
  19. package/dist/cli/commands/shared.js +27 -1
  20. package/dist/cli/commands/shared.js.map +1 -1
  21. package/dist/cli/commands/skill.js +21 -10
  22. package/dist/cli/commands/skill.js.map +1 -1
  23. package/dist/cli/commands/spawn-poe-agent.d.ts +2 -0
  24. package/dist/cli/commands/spawn-poe-agent.js +47 -0
  25. package/dist/cli/commands/spawn-poe-agent.js.map +1 -0
  26. package/dist/cli/commands/spawn.js +21 -1
  27. package/dist/cli/commands/spawn.js.map +1 -1
  28. package/dist/cli/commands/utils-symlink-agents.d.ts +6 -0
  29. package/dist/cli/commands/utils-symlink-agents.js +78 -0
  30. package/dist/cli/commands/utils-symlink-agents.js.map +1 -0
  31. package/dist/cli/commands/utils-symlink-ops.d.ts +29 -0
  32. package/dist/cli/commands/utils-symlink-ops.js +76 -0
  33. package/dist/cli/commands/utils-symlink-ops.js.map +1 -0
  34. package/dist/cli/commands/utils-symlink-skills.d.ts +15 -0
  35. package/dist/cli/commands/utils-symlink-skills.js +136 -0
  36. package/dist/cli/commands/utils-symlink-skills.js.map +1 -0
  37. package/dist/cli/commands/utils-symlink.d.ts +3 -0
  38. package/dist/cli/commands/utils-symlink.js +40 -0
  39. package/dist/cli/commands/utils-symlink.js.map +1 -0
  40. package/dist/cli/commands/utils.js +2 -0
  41. package/dist/cli/commands/utils.js.map +1 -1
  42. package/dist/cli/constants.d.ts +2 -2
  43. package/dist/cli/constants.js +1 -1
  44. package/dist/cli/constants.js.map +1 -1
  45. package/dist/cli/program.js +8 -1
  46. package/dist/cli/program.js.map +1 -1
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.js +23173 -18054
  49. package/dist/index.js.map +4 -4
  50. package/dist/plan/document-schema.d.ts +21 -0
  51. package/dist/plan/document-schema.js +16 -0
  52. package/dist/plan/document-schema.js.map +1 -0
  53. package/dist/providers/claude-code.js +31 -13
  54. package/dist/providers/claude-code.js.map +4 -4
  55. package/dist/providers/codex.js +31 -13
  56. package/dist/providers/codex.js.map +4 -4
  57. package/dist/providers/goose.js +32 -14
  58. package/dist/providers/goose.js.map +4 -4
  59. package/dist/providers/kimi.js +31 -13
  60. package/dist/providers/kimi.js.map +4 -4
  61. package/dist/providers/opencode.js +32 -14
  62. package/dist/providers/opencode.js.map +4 -4
  63. package/dist/providers/poe-agent.d.ts +5 -0
  64. package/dist/providers/poe-agent.js +19812 -4438
  65. package/dist/providers/poe-agent.js.map +4 -4
  66. package/dist/sdk/container.js +4 -0
  67. package/dist/sdk/container.js.map +1 -1
  68. package/dist/sdk/spawn.js +8 -2
  69. package/dist/sdk/spawn.js.map +1 -1
  70. package/dist/sdk/types.d.ts +5 -1
  71. package/dist/services/config.d.ts +29 -44
  72. package/dist/services/config.js +16 -25
  73. package/dist/services/config.js.map +1 -1
  74. package/dist/templates/pipeline/SKILL_plan.md +22 -8
  75. package/dist/templates/pipeline/steps.yaml.mustache +1 -1
  76. package/dist/templates/skill/poe-generate.md +47 -0
  77. package/dist/templates/skill/terminal-pilot.md +45 -0
  78. package/dist/utils/dry-run.d.ts +8 -0
  79. package/dist/utils/dry-run.js +16 -0
  80. package/dist/utils/dry-run.js.map +1 -1
  81. package/dist/utils/file-system.d.ts +4 -0
  82. package/dist/workflow-templates/fix-vulnerabilities.ejected.yml +8 -0
  83. package/dist/workflow-templates/github-issue-comment-created.ejected.yml +8 -0
  84. package/dist/workflow-templates/github-issue-opened.ejected.yml +8 -0
  85. package/dist/workflow-templates/github-pull-request-comment-created.ejected.yml +8 -0
  86. package/dist/workflow-templates/github-pull-request-opened.ejected.yml +8 -0
  87. package/dist/workflow-templates/github-pull-request-synchronized.ejected.yml +8 -0
  88. package/dist/workflow-templates/update-dependencies.ejected.yml +8 -0
  89. package/dist/workflow-templates/update-documentation.ejected.yml +8 -0
  90. package/package.json +16 -9
  91. package/packages/cmdkit/dist/cli.js +42 -22
  92. package/packages/cmdkit/dist/cli.js.map +3 -3
  93. package/packages/cmdkit/dist/index.js +52 -9
  94. package/packages/cmdkit/dist/index.js.map +2 -2
  95. package/packages/cmdkit/dist/mcp.d.ts +15 -0
  96. package/packages/cmdkit/dist/mcp.js +121 -20
  97. package/packages/cmdkit/dist/mcp.js.map +3 -3
  98. package/packages/cmdkit/dist/number-schema.d.ts +3 -0
  99. package/packages/cmdkit/dist/number-schema.js +8 -0
  100. package/packages/cmdkit/dist/schema-scope.d.ts +4 -0
  101. package/packages/cmdkit/dist/schema-scope.js +34 -0
  102. package/packages/cmdkit/dist/sdk.js +58 -3
  103. package/packages/cmdkit/dist/sdk.js.map +3 -3
  104. package/packages/cmdkit-schema/dist/index.compile-check.js +1 -0
  105. package/packages/cmdkit-schema/dist/index.d.ts +59 -16
  106. package/packages/cmdkit-schema/dist/index.js +53 -8
  107. package/packages/design-system/dist/dashboard/components/footer.js +2 -3
  108. package/packages/design-system/dist/dashboard/components/output-pane.d.ts +1 -10
  109. package/packages/design-system/dist/dashboard/components/output-pane.js +5 -74
  110. package/packages/design-system/dist/dashboard/dashboard.js +6 -26
  111. package/packages/design-system/dist/dashboard/keymap.js +4 -19
  112. package/packages/design-system/dist/dashboard/snapshot.js +1 -5
  113. package/packages/design-system/dist/dashboard/store.d.ts +1 -2
  114. package/packages/design-system/dist/dashboard/store.js +6 -62
  115. package/packages/design-system/dist/dashboard/terminal.d.ts +2 -0
  116. package/packages/design-system/dist/dashboard/terminal.js +18 -0
  117. package/packages/design-system/dist/dashboard/types.d.ts +1 -11
  118. package/packages/design-system/dist/terminal-markdown/ast.d.ts +10 -2
  119. package/packages/design-system/dist/terminal-markdown/parser/block.d.ts +2 -1
  120. package/packages/design-system/dist/terminal-markdown/parser/block.js +400 -110
  121. package/packages/design-system/dist/terminal-markdown/parser/frontmatter.d.ts +2 -0
  122. package/packages/design-system/dist/terminal-markdown/parser/frontmatter.js +28 -11
  123. package/packages/design-system/dist/terminal-markdown/parser/inline.d.ts +4 -0
  124. package/packages/design-system/dist/terminal-markdown/parser/inline.js +134 -55
  125. package/packages/design-system/dist/terminal-markdown/parser.js +36 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/mcp.ts", "../../tiny-stdio-mcp-server/src/server.ts", "../../tiny-stdio-mcp-server/src/types.ts", "../../tiny-stdio-mcp-server/src/jsonrpc.ts", "../../tiny-stdio-mcp-server/src/content/file-type.ts", "../../tiny-stdio-mcp-server/src/content/image.ts", "../../tiny-stdio-mcp-server/src/content/audio.ts", "../../tiny-stdio-mcp-server/src/content/file.ts", "../../tiny-stdio-mcp-server/src/content/convert.ts", "../../cmdkit-schema/src/index.ts", "../src/index.ts"],
4
- "sourcesContent": ["import { access, readFile, writeFile } from \"node:fs/promises\";\nimport {\n createServer,\n JSON_RPC_ERROR_CODES,\n ToolError,\n type SDKTransport,\n type Server as TinyServer,\n type TypedSchema,\n} from \"tiny-stdio-mcp-server\";\nimport { toJsonSchema, type AnySchema, type JsonSchema, type ObjectSchema } from \"@poe-code/cmdkit-schema\";\nimport type { Command, Group, HandlerEnv, HandlerFs } from \"./index.js\";\nimport { UserError, assertCommandRequirements, resolveCommandSecrets } from \"./index.js\";\n\nconst RESERVED_SERVICE_NAMES = new Set([\"params\", \"secrets\", \"fetch\", \"fs\", \"env\", \"progress\"]);\n\ntype Casing = \"snake\" | \"camel\";\ntype CmdkitServer = Omit<TinyServer, \"connect\"> & {\n connect(transport: SDKTransport): Promise<void>;\n};\ntype ToolContent =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | {\n type: \"resource\";\n resource:\n | { uri: string; mimeType: string; text: string }\n | { uri: string; mimeType: string; blob: string };\n };\n\ninterface ToolDefinition<TServices extends object> {\n command: Command<TServices, any, any, any>;\n description: string;\n inputSchema: JsonSchema;\n name: string;\n}\n\nexport interface RunMCPOptions<TServices extends object = Record<string, unknown>> {\n name: string;\n version: string;\n tools?: string[];\n services?: TServices;\n casing?: Casing;\n}\n\nfunction normalizeRoots<TServices extends object>(\n roots: Group<TServices> | Group<TServices>[]\n): Group<TServices> {\n if (!Array.isArray(roots)) {\n return roots;\n }\n\n return {\n kind: \"group\",\n name: \"\",\n aliases: [],\n secrets: {},\n children: roots,\n };\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let current = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n const isSeparator = char === \"-\" || char === \"_\" || char === \" \" || char === \".\";\n\n if (isSeparator) {\n if (current.length > 0) {\n words.push(current.toLowerCase());\n current = \"\";\n }\n continue;\n }\n\n const isUppercase = char !== lower && char === upper;\n const previous = value[index - 1];\n const next = value[index + 1];\n const previousIsLowercase =\n previous !== undefined && previous === previous.toLowerCase() && previous !== previous.toUpperCase();\n const nextIsLowercase =\n next !== undefined && next === next.toLowerCase() && next !== next.toUpperCase();\n\n if (isUppercase && current.length > 0 && (previousIsLowercase || nextIsLowercase)) {\n words.push(current.toLowerCase());\n current = char;\n continue;\n }\n\n current += char;\n }\n\n if (current.length > 0) {\n words.push(current.toLowerCase());\n }\n\n return words;\n}\n\nfunction formatSegment(segment: string, casing: Casing): string {\n const words = splitWords(segment);\n\n if (casing === \"snake\") {\n return words.join(\"_\");\n }\n\n return words\n .map((word, index) =>\n index === 0 ? word : `${word[0]?.toUpperCase() ?? \"\"}${word.slice(1)}`\n )\n .join(\"\");\n}\n\nfunction unwrapOptional(schema: AnySchema): AnySchema {\n if (schema.kind === \"optional\") {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction isOptional(schema: AnySchema): boolean {\n return schema.kind === \"optional\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") => readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction validateServices(services: Record<string, unknown>): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(`Service name \"${name}\" is reserved. Choose a different name.`);\n }\n }\n}\n\nfunction applySchemaCasing(schema: JsonSchema, casing: Casing): JsonSchema {\n if (schema.type !== \"object\" || schema.properties === undefined) {\n if (schema.type === \"array\" && schema.items !== undefined) {\n return {\n ...schema,\n items: applySchemaCasing(schema.items, casing),\n };\n }\n\n return schema;\n }\n\n const properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n formatSegment(key, casing),\n applySchemaCasing(value, casing),\n ])\n );\n const required = schema.required?.map((key) => formatSegment(key, casing));\n\n return {\n ...schema,\n properties,\n ...(required === undefined ? {} : { required }),\n };\n}\n\nfunction collectParamSummaries(\n schema: ObjectSchema<any>,\n casing: Casing,\n path: string[] = [],\n inheritedOptional = false\n): string[] {\n const summaries: string[] = [];\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const childSchema = unwrapOptional(rawChildSchema);\n const nextPath = [...path, formatSegment(key, casing)];\n const optional = inheritedOptional || isOptional(rawChildSchema);\n\n if (childSchema.kind === \"object\") {\n summaries.push(...collectParamSummaries(childSchema, casing, nextPath, optional));\n continue;\n }\n\n summaries.push(`${nextPath.join(\".\")}${optional ? \"\" : \" (required)\"}`);\n }\n\n return summaries;\n}\n\nfunction buildToolDescription<TServices extends object>(\n command: Command<TServices, any, any, any>,\n casing: Casing\n): string {\n const summary = collectParamSummaries(command.params, casing);\n const parameterSummary =\n summary.length === 0 ? \"\" : `Parameters: ${summary.join(\", \")}.`;\n\n if (command.description === undefined) {\n return parameterSummary;\n }\n\n if (parameterSummary.length === 0) {\n return command.description;\n }\n\n return `${command.description} ${parameterSummary}`;\n}\n\nfunction matchesAllowlist(toolName: string, allowlist: string[] | undefined): boolean {\n if (allowlist === undefined) {\n return true;\n }\n\n const segments = toolName.split(\".\");\n const candidates = segments.map((_segment, index) => segments.slice(0, index + 1).join(\".\"));\n return candidates.some((candidate) => allowlist.includes(candidate));\n}\n\nfunction enumerateTools<TServices extends object>(\n root: Group<TServices>,\n casing: Casing,\n allowlist: string[] | undefined\n): ToolDefinition<TServices>[] {\n const tools: ToolDefinition<TServices>[] = [];\n\n function visit(node: Command<TServices, any, any, any> | Group<TServices>, path: string[]): void {\n if (node.kind === \"command\") {\n if (!node.scope.includes(\"mcp\")) {\n return;\n }\n\n const name = [...path, node.name].join(\".\");\n if (!matchesAllowlist(name, allowlist)) {\n return;\n }\n\n tools.push({\n command: node,\n name,\n description: buildToolDescription(node, casing),\n inputSchema: applySchemaCasing(toJsonSchema(node.params), casing),\n });\n return;\n }\n\n const nextPath = [...path, node.name];\n\n for (const child of node.children) {\n visit(child, nextPath);\n }\n }\n\n for (const child of root.children) {\n visit(child, []);\n }\n\n return tools;\n}\n\nfunction validateEnum(value: unknown, schema: Extract<AnySchema, { kind: \"enum\" }>, label: string): string | number | boolean {\n if (!schema.values.includes(value as never)) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected one of: ${schema.values.map((candidate) => String(candidate)).join(\", \")}.`\n );\n }\n\n return value as string | number | boolean;\n}\n\nfunction validateSchemaValue(\n schema: AnySchema,\n value: unknown,\n casing: Casing,\n label: string\n): unknown {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n if (typeof value !== \"string\") {\n throw new UserError(`Invalid value for \"${label}\". Expected a string.`);\n }\n return value;\n\n case \"number\":\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new UserError(`Invalid value for \"${label}\". Expected a number.`);\n }\n return value;\n\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n throw new UserError(`Invalid value for \"${label}\". Expected a boolean.`);\n }\n return value;\n\n case \"enum\":\n return validateEnum(value, unwrappedSchema, label);\n\n case \"array\":\n if (!Array.isArray(value)) {\n throw new UserError(`Invalid value for \"${label}\". Expected an array.`);\n }\n return value.map((item, index) =>\n validateSchemaValue(unwrappedSchema.item, item, casing, `${label}[${index}]`)\n );\n\n case \"object\":\n return validateObjectSchema(unwrappedSchema, value, casing, label);\n }\n}\n\nfunction validateObjectSchema(\n schema: ObjectSchema<any>,\n value: unknown,\n casing: Casing,\n label: string\n): Record<string, unknown> {\n if (!isPlainObject(value)) {\n throw new UserError(`Invalid value for \"${label}\". Expected an object.`);\n }\n\n const result: Record<string, unknown> = {};\n const expectedKeys = new Map<string, [string, AnySchema]>();\n\n for (const [key, childSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n expectedKeys.set(formatSegment(key, casing), [key, childSchema]);\n }\n\n for (const key of Object.keys(value)) {\n if (!expectedKeys.has(key)) {\n const fieldLabel = label.length === 0 ? key : `${label}.${key}`;\n throw new UserError(`Unexpected parameter \"${fieldLabel}\".`);\n }\n }\n\n for (const [inputKey, [outputKey, rawChildSchema]] of expectedKeys.entries()) {\n const childSchema = unwrapOptional(rawChildSchema);\n const hasValue = Object.prototype.hasOwnProperty.call(value, inputKey);\n const fieldLabel = label.length === 0 ? inputKey : `${label}.${inputKey}`;\n\n if (!hasValue) {\n if (childSchema.default !== undefined) {\n result[outputKey] = childSchema.default;\n continue;\n }\n\n if (isOptional(rawChildSchema)) {\n continue;\n }\n\n throw new UserError(`Missing required parameter \"${fieldLabel}\".`);\n }\n\n result[outputKey] = validateSchemaValue(rawChildSchema, value[inputKey], casing, fieldLabel);\n }\n\n return result;\n}\n\nfunction validateToolArguments(\n schema: ObjectSchema<any>,\n argumentsValue: Record<string, unknown> | undefined,\n casing: Casing\n): Record<string, unknown> {\n return validateObjectSchema(schema, argumentsValue ?? {}, casing, \"\");\n}\n\nfunction isContentBlock(value: unknown): value is ToolContent {\n if (!isPlainObject(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n return (\n value.type === \"text\" ||\n value.type === \"image\" ||\n value.type === \"audio\" ||\n value.type === \"resource\"\n );\n}\n\nfunction toToolContent(result: unknown): ToolContent[] {\n if (result === undefined) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.flatMap((item) => toToolContent(item));\n }\n\n if (\n typeof result === \"string\" ||\n typeof result === \"number\" ||\n typeof result === \"boolean\"\n ) {\n return [{ type: \"text\", text: String(result) }];\n }\n\n if (result === null) {\n return [{ type: \"text\", text: \"null\" }];\n }\n\n if (isContentBlock(result)) {\n return [result];\n }\n\n return [{ type: \"text\", text: JSON.stringify(result) }];\n}\n\nfunction toToolError(error: unknown): ToolError {\n if (error instanceof ToolError) {\n return error;\n }\n\n if (error instanceof UserError) {\n return new ToolError(JSON_RPC_ERROR_CODES.INVALID_PARAMS, error.message);\n }\n\n if (error instanceof Error) {\n return new ToolError(JSON_RPC_ERROR_CODES.INTERNAL_ERROR, error.message);\n }\n\n return new ToolError(JSON_RPC_ERROR_CODES.INTERNAL_ERROR, String(error));\n}\n\nexport function createMCPServer<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunMCPOptions<TServices>\n): CmdkitServer {\n const root = normalizeRoots(roots);\n const casing = options.casing ?? \"snake\";\n const services = (options.services ?? {}) as TServices;\n validateServices(services as Record<string, unknown>);\n\n const tools = enumerateTools(root, casing, options.tools);\n const server = createServer({ name: options.name, version: options.version });\n\n for (const tool of tools) {\n server.tool(\n tool.name,\n tool.description,\n tool.inputSchema as TypedSchema<Record<string, unknown>>,\n async (argumentsValue) => {\n try {\n const secrets = resolveCommandSecrets(tool.command);\n const baseContext = {\n ...services,\n secrets,\n fetch: globalThis.fetch,\n fs: createFs(),\n env: createEnv(),\n progress(): void {\n return undefined;\n },\n };\n\n await assertCommandRequirements(tool.command, { ...baseContext, params: undefined });\n\n const params = validateToolArguments(tool.command.params, argumentsValue, casing);\n const result = await tool.command.handler({\n ...baseContext,\n params,\n } as Parameters<typeof tool.command.handler>[0]);\n\n return toToolContent(result);\n } catch (error) {\n throw toToolError(error);\n }\n }\n );\n }\n\n return {\n ...server,\n connect(transport: SDKTransport): Promise<void> {\n return server.connectSDK(transport);\n },\n };\n}\n\nexport async function runMCP<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunMCPOptions<TServices>\n): Promise<void> {\n const server = createMCPServer(roots, options);\n await server.listen();\n}\n", "import * as readline from \"readline\";\nimport type {\n ServerOptions,\n ToolDefinition,\n ToolHandler,\n CallToolResult,\n HandleResult,\n InitializeResult,\n Tool,\n Transport,\n JSONSchema,\n SDKTransport,\n JSONRPCMessage,\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES, ToolError } from \"./types.js\";\nimport {\n parseMessage,\n formatSuccessResponse,\n formatErrorResponse,\n} from \"./jsonrpc.js\";\nimport type { TypedSchema } from \"./schema.js\";\nimport { toContentBlocks } from \"./content/convert.js\";\n\nconst PROTOCOL_VERSION = \"2025-11-25\";\n\nexport interface Server {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server;\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void;\n removeTool(name: string): boolean;\n notifyToolsChanged(): Promise<void>;\n handleMessage(\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult>;\n listen(): Promise<void>;\n connect(transport: Transport): Promise<void>;\n connectSDK(transport: SDKTransport): Promise<void>;\n}\n\nexport function createServer(options: ServerOptions): Server {\n const tools = new Map<string, ToolDefinition>();\n const notificationListeners = new Set<\n (notification: JSONRPCNotification) => void\n >();\n let initialized = false;\n\n const handleMessage = async (\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult> => {\n // Allow ping and initialize before initialization\n if (method === \"ping\") {\n return { result: {} };\n }\n\n if (method === \"initialize\") {\n initialized = true;\n const requestedProtocol =\n typeof params?.protocolVersion === \"string\"\n ? params.protocolVersion\n : null;\n const result: InitializeResult = {\n protocolVersion: requestedProtocol ?? PROTOCOL_VERSION,\n capabilities: {\n tools: {\n listChanged: true,\n },\n },\n serverInfo: {\n name: options.name,\n version: options.version,\n },\n };\n return { result };\n }\n\n if (method === \"notifications/initialized\") {\n return { result: undefined };\n }\n\n // All other methods require initialization\n if (!initialized) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Server not initialized\",\n },\n };\n }\n\n if (method === \"tools/list\") {\n const toolList: Tool[] = [];\n for (const tool of tools.values()) {\n toolList.push({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n });\n }\n return { result: { tools: toolList } };\n }\n\n if (method === \"tools/call\") {\n const toolName = params?.name as string | undefined;\n const toolArgs = (params?.arguments as Record<string, unknown>) || {};\n\n if (!toolName) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: \"Tool name required\",\n },\n };\n }\n\n const tool = tools.get(toolName);\n if (!tool) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: `Tool not found: ${toolName}`,\n },\n };\n }\n\n try {\n const handlerResult = await tool.handler(toolArgs);\n const result: CallToolResult = { content: toContentBlocks(handlerResult) };\n return { result };\n } catch (err) {\n if (err instanceof ToolError) {\n return {\n error: {\n code: err.code,\n message: err.message,\n },\n };\n }\n\n const errorMessage =\n err instanceof Error ? err.message : String(err);\n const result: CallToolResult = {\n content: [{ type: \"text\", text: `Error: ${errorMessage}` }],\n isError: true,\n };\n return { result };\n }\n }\n\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.METHOD_NOT_FOUND,\n message: \"Method not found\",\n },\n };\n };\n\n const processLine = async (\n line: string,\n write: (data: string) => void\n ): Promise<void> => {\n const parsed = parseMessage(line);\n\n if (!parsed.success) {\n write(formatErrorResponse(parsed.id, parsed.error) + \"\\n\");\n return;\n }\n\n const { request, isNotification } = parsed;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (isNotification) {\n return;\n }\n\n const requestWithId = request as JSONRPCRequest;\n\n if (error) {\n write(formatErrorResponse(requestWithId.id, error) + \"\\n\");\n } else if (result !== undefined) {\n write(formatSuccessResponse(requestWithId.id, result) + \"\\n\");\n }\n };\n\n const broadcastNotification = (method: string): void => {\n const notification: JSONRPCNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n for (const listener of notificationListeners) {\n listener(notification);\n }\n };\n\n const server: Server = {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server {\n tools.set(name, {\n name,\n description,\n inputSchema: inputSchema as JSONSchema,\n handler: handler as ToolHandler,\n });\n return server;\n },\n\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void {\n notificationListeners.add(listener);\n return () => {\n notificationListeners.delete(listener);\n };\n },\n\n removeTool(name: string): boolean {\n return tools.delete(name);\n },\n\n async notifyToolsChanged(): Promise<void> {\n if (initialized) {\n broadcastNotification(\"notifications/tools/list_changed\");\n }\n },\n\n handleMessage,\n\n async listen(): Promise<void> {\n return server.connect({\n readable: process.stdin,\n writable: process.stdout,\n });\n },\n\n async connect(transport: Transport): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n transport.writable.write(`${JSON.stringify(notification)}\\n`);\n });\n const rl = readline.createInterface({\n input: transport.readable,\n crlfDelay: Infinity,\n });\n\n rl.on(\"line\", (line) => {\n processLine(line, (data) => transport.writable.write(data));\n });\n\n rl.on(\"close\", () => {\n unsubscribe();\n resolve();\n });\n });\n },\n\n async connectSDK(transport: SDKTransport): Promise<void> {\n return new Promise<void>((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n void transport.send(notification);\n });\n\n transport.onmessage = async (message: JSONRPCMessage) => {\n // Ignore responses (we only handle requests/notifications)\n if (!(\"method\" in message)) {\n return;\n }\n\n // Handle notifications (no id) - don't respond\n if (!(\"id\" in message) || message.id === undefined) {\n await server.handleMessage(message.method, message.params);\n return;\n }\n\n const request = message as JSONRPCRequest;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (error) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n error,\n };\n await transport.send(response);\n } else if (result !== undefined) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n await transport.send(response);\n }\n };\n\n transport.onclose = () => {\n unsubscribe();\n resolve();\n };\n\n transport.start();\n });\n },\n };\n\n return server;\n}\n", "// JSON-RPC 2.0 types\nexport interface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JSONRPCError;\n}\n\nexport interface JSONRPCError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// JSON-RPC error codes\nexport const JSON_RPC_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603\n} as const;\n\nexport class ToolError extends Error {\n constructor(\n public readonly code: number,\n message: string\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\n// MCP protocol types\nexport interface ToolsCapability {\n listChanged?: boolean;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: {\n tools?: ToolsCapability;\n };\n serverInfo: {\n name: string;\n version: string;\n };\n}\n\nexport interface Tool {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n isError?: boolean;\n}\n\nexport interface HandleResult {\n result?: unknown;\n error?: { code: number; message: string };\n}\n\n// ContentItem is a union of all possible content block types\nexport type ContentItem =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | {\n type: \"resource\";\n resource:\n | { uri: string; mimeType: string; text: string }\n | { uri: string; mimeType: string; blob: string };\n };\n\nexport interface JSONSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required?: string[];\n}\n\nexport interface JSONSchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n description?: string;\n}\n\n// Server types\nexport interface ServerOptions {\n name: string;\n version: string;\n}\n\nimport type { ToolReturn } from \"./content/index.js\";\n\nexport type ToolHandler<T = Record<string, unknown>> = (\n args: T\n) => Promise<ToolReturn> | ToolReturn;\n\nexport interface ToolDefinition<T = Record<string, unknown>> {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n handler: ToolHandler<T>;\n}\n\n// Transport types\nexport interface Transport {\n readable: NodeJS.ReadableStream;\n writable: NodeJS.WritableStream;\n}\n\n// SDK-compatible transport interface\nexport interface SDKTransport {\n onmessage?: (message: JSONRPCMessage) => void;\n onclose?: () => void;\n onerror?: (error: Error) => void;\n start: () => Promise<void>;\n close: () => Promise<void>;\n send: (message: JSONRPCMessage) => Promise<void>;\n}\n\nexport type JSONRPCMessage = JSONRPCRequest | JSONRPCResponse | JSONRPCNotification;\n\nexport interface JSONRPCNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n}\n", "import type {\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCError,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES } from \"./types.js\";\n\nexport interface ParseResult {\n success: true;\n request: JSONRPCRequest | JSONRPCNotification;\n isNotification: boolean;\n}\n\nexport interface ParseError {\n success: false;\n error: JSONRPCError;\n id: string | number | null;\n}\n\nexport function parseMessage(line: string): ParseResult | ParseError {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.PARSE_ERROR,\n message: \"Parse error\",\n },\n id: null,\n };\n }\n\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n const obj = parsed as Record<string, unknown>;\n const hasId = \"id\" in obj;\n const id = typeof obj.id === \"string\" || typeof obj.id === \"number\" ? obj.id : null;\n\n if (obj.jsonrpc !== \"2.0\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (typeof obj.method !== \"string\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (!hasId) {\n return {\n success: true,\n isNotification: true,\n request: {\n jsonrpc: \"2.0\",\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n }\n\n if (id === null) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n return {\n success: true,\n isNotification: false,\n request: {\n jsonrpc: \"2.0\",\n id,\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n}\n\nexport function formatSuccessResponse(\n id: string | number | null,\n result: unknown\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n result,\n };\n return JSON.stringify(response);\n}\n\nexport function formatErrorResponse(\n id: string | number | null,\n error: JSONRPCError\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n error,\n };\n return JSON.stringify(response);\n}\n", "/**\n * Minimal magic bytes detection for common media types.\n * This can be replaced with `file-type` package (https://npm.im/file-type)\n * if more comprehensive detection is needed. The API is designed to be\n * compatible: fileTypeFromBuffer(data) returns { mime: string, ext: string } | undefined\n */\n\nexport interface FileTypeResult {\n mime: string;\n ext: string;\n}\n\nexport function fileTypeFromBuffer(data: Uint8Array): FileTypeResult | undefined {\n if (data.length < 12) {\n return undefined;\n }\n\n // PNG: 89 50 4E 47 0D 0A 1A 0A\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47 &&\n data[4] === 0x0d &&\n data[5] === 0x0a &&\n data[6] === 0x1a &&\n data[7] === 0x0a\n ) {\n return { mime: \"image/png\", ext: \"png\" };\n }\n\n // JPEG: FF D8 FF\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return { mime: \"image/jpeg\", ext: \"jpg\" };\n }\n\n // GIF: 47 49 46 38 (GIF8)\n if (\n data[0] === 0x47 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x38\n ) {\n return { mime: \"image/gif\", ext: \"gif\" };\n }\n\n // WEBP: 52 49 46 46 ... 57 45 42 50 (RIFF...WEBP)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x45 &&\n data[10] === 0x42 &&\n data[11] === 0x50\n ) {\n return { mime: \"image/webp\", ext: \"webp\" };\n }\n\n // MP3: FF FB or FF FA (MPEG audio) or 49 44 33 (ID3 tag)\n if (\n (data[0] === 0xff && (data[1] === 0xfb || data[1] === 0xfa)) ||\n (data[0] === 0x49 && data[1] === 0x44 && data[2] === 0x33)\n ) {\n return { mime: \"audio/mpeg\", ext: \"mp3\" };\n }\n\n // WAV: 52 49 46 46 ... 57 41 56 45 (RIFF...WAVE)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x41 &&\n data[10] === 0x56 &&\n data[11] === 0x45\n ) {\n return { mime: \"audio/wav\", ext: \"wav\" };\n }\n\n // OGG: 4F 67 67 53 (OggS)\n if (\n data[0] === 0x4f &&\n data[1] === 0x67 &&\n data[2] === 0x67 &&\n data[3] === 0x53\n ) {\n return { mime: \"audio/ogg\", ext: \"ogg\" };\n }\n\n // M4A: MP4 container with audio - check for M4A brand at offset 8\n // ftyp followed by M4A brand\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70 &&\n data[8] === 0x4d &&\n data[9] === 0x34 &&\n data[10] === 0x41\n ) {\n return { mime: \"audio/mp4\", ext: \"m4a\" };\n }\n\n // MP4: ... 66 74 79 70 (ftyp box, offset 4)\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70\n ) {\n return { mime: \"video/mp4\", ext: \"mp4\" };\n }\n\n // WEBM: 1A 45 DF A3 (EBML header)\n if (\n data[0] === 0x1a &&\n data[1] === 0x45 &&\n data[2] === 0xdf &&\n data[3] === 0xa3\n ) {\n return { mime: \"video/webm\", ext: \"webm\" };\n }\n\n return undefined;\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_IMAGE_MIMES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nexport class Image {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Image> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch image from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_IMAGE_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect image MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Image {\n let mimeType: string;\n\n if (format) {\n mimeType = format.includes(\"/\") ? format : `image/${format}`;\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect image MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Image {\n return new Image(base64, mimeType);\n }\n\n toContentBlock(): ImageContent {\n return {\n type: \"image\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_AUDIO_MIMES = new Set([\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/ogg\",\n \"audio/mp4\",\n]);\n\nconst AUDIO_FORMAT_MAP: Record<string, string> = {\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n m4a: \"audio/mp4\",\n mpeg: \"audio/mpeg\",\n};\n\nexport class Audio {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Audio> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch audio from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_AUDIO_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect audio MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Audio {\n let mimeType: string;\n\n if (format) {\n if (format.includes(\"/\")) {\n mimeType = format;\n } else {\n mimeType = AUDIO_FORMAT_MAP[format.toLowerCase()] || `audio/${format}`;\n }\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect audio MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Audio {\n return new Audio(base64, mimeType);\n }\n\n toContentBlock(): AudioContent {\n return {\n type: \"audio\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface TextResourceContents {\n uri: string;\n mimeType: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType: string;\n blob: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: TextResourceContents | BlobResourceContents;\n}\n\nfunction isTextMimeType(mimeType: string): boolean {\n return (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n mimeType === \"application/javascript\" ||\n mimeType === \"application/typescript\"\n );\n}\n\nexport class File {\n private constructor(\n private readonly data: Uint8Array | string,\n private readonly mimeType: string,\n private readonly isText: boolean,\n private readonly name?: string\n ) {}\n\n static async fromUrl(url: string): Promise<File> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect MIME type from ${url}`);\n }\n }\n\n const isText = isTextMimeType(mimeType);\n const name = url.split(\"/\").pop() || \"file\";\n\n return new File(data, mimeType, isText, name);\n }\n\n static fromBytes(data: Uint8Array, mimeType: string): File {\n const isText = isTextMimeType(mimeType);\n return new File(data, mimeType, isText);\n }\n\n static fromText(text: string, mimeType = \"text/plain\"): File {\n return new File(text, mimeType, true);\n }\n\n static fromBase64(base64: string, mimeType: string): File {\n const data = Buffer.from(base64, \"base64\");\n const isText = isTextMimeType(mimeType);\n return new File(new Uint8Array(data), mimeType, isText);\n }\n\n toContentBlock(): EmbeddedResource {\n const uri = this.name ? `file:///${this.name}` : \"file:///data\";\n\n if (this.isText) {\n let text: string;\n if (typeof this.data === \"string\") {\n text = this.data;\n } else {\n text = new TextDecoder(\"utf-8\").decode(this.data);\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n text,\n } as TextResourceContents,\n };\n } else {\n let blob: string;\n if (typeof this.data === \"string\") {\n blob = Buffer.from(this.data).toString(\"base64\");\n } else {\n blob = Buffer.from(this.data).toString(\"base64\");\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n blob,\n } as BlobResourceContents,\n };\n }\n }\n}\n", "import { Image, type ImageContent } from \"./image.js\";\nimport { Audio, type AudioContent } from \"./audio.js\";\nimport { File, type EmbeddedResource } from \"./file.js\";\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport type ContentBlock = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\ntype JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type ToolReturn =\n | undefined\n | JsonPrimitive\n | JsonObject\n | Image\n | Audio\n | File\n | ContentBlock\n | Array<undefined | JsonPrimitive | JsonObject | Image | Audio | File | ContentBlock>;\n\nfunction convertSingleValue(value: Exclude<ToolReturn, Array<unknown> | undefined>): ContentBlock {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return { type: \"text\", text: String(value) };\n }\n\n if (value === null) {\n return { type: \"text\", text: \"null\" };\n }\n\n if (value instanceof Image) {\n return value.toContentBlock();\n }\n\n if (value instanceof Audio) {\n return value.toContentBlock();\n }\n\n if (value instanceof File) {\n return value.toContentBlock();\n }\n\n if (isContentBlock(value)) {\n return value;\n }\n\n return { type: \"text\", text: JSON.stringify(value) };\n}\n\nexport function toContentBlocks(result: ToolReturn): ContentBlock[] {\n if (result === undefined) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.flatMap((item) => toContentBlocks(item));\n }\n\n return [convertSingleValue(result)];\n}\n\nfunction isContentBlock(value: object): value is ContentBlock {\n if (!(\"type\" in value) || typeof value.type !== \"string\") {\n return false;\n }\n\n return (\n value.type === \"text\" ||\n value.type === \"image\" ||\n value.type === \"audio\" ||\n value.type === \"resource\"\n );\n}\n", "type JsonSchemaType = \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\";\ntype EnumValue = string | number | boolean;\ntype NonEmptyReadonlyArray<T> = readonly [T, ...T[]];\ntype ObjectShape = Record<string, AnySchema>;\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> = TSchema extends OptionalSchema<infer TInner>\n ? Static<TInner>\n : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n description?: string;\n default?: TDefault;\n short?: string;\n};\n\ninterface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly description?: string;\n readonly default?: TStatic;\n readonly short?: string;\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n type?: JsonSchemaType;\n description?: string;\n default?: unknown;\n enum?: ReadonlyArray<EnumValue>;\n items?: JsonSchema;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n}\n\nexport type StringSchema = SchemaBase<\"string\", string>;\n\nexport type NumberSchema = SchemaBase<\"number\", number>;\n\nexport type BooleanSchema = SchemaBase<\"boolean\", boolean>;\n\nexport interface EnumSchema<TValues extends NonEmptyReadonlyArray<EnumValue>>\n extends SchemaBase<\"enum\", TValues[number]> {\n readonly values: TValues;\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?: () => Array<{ label: string; value: string }> | Promise<Array<{ label: string; value: string }>>;\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>> {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>> {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema>\n extends SchemaBase<\"optional\", Static<TInner> | undefined> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n return jsonSchema;\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nexport const S = {\n String(options: SchemaOptions<string> = {}): StringSchema {\n return {\n kind: \"string\",\n ...options,\n };\n },\n\n Number(options: SchemaOptions<number> = {}): NumberSchema {\n return {\n kind: \"number\",\n ...options,\n };\n },\n\n Boolean(options: SchemaOptions<boolean> = {}): BooleanSchema {\n return {\n kind: \"boolean\",\n ...options,\n };\n },\n\n Enum<const TValues extends NonEmptyReadonlyArray<EnumValue>>(\n values: TValues,\n options: SchemaOptions<TValues[number]> & {\n labels?: Partial<Record<string, string>>;\n loadOptions?: () => Array<{ label: string; value: string }> | Promise<Array<{ label: string; value: string }>>;\n } = {}\n ): EnumSchema<TValues> {\n assertValidEnumValues(values);\n\n return {\n kind: \"enum\",\n values,\n ...options,\n };\n },\n\n Array<TItem extends AnySchema>(\n item: TItem,\n options: SchemaOptions<Array<Static<TItem>>> = {}\n ): ArraySchema<TItem> {\n return {\n kind: \"array\",\n item,\n ...options,\n };\n },\n\n Object<const TShape extends ObjectShape>(shape: TShape): ObjectSchema<TShape> {\n return {\n kind: \"object\",\n shape,\n };\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner,\n };\n },\n} as const;\n\nexport function toJsonSchema(schema: AnySchema): JsonSchema {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n return withMetadata(unwrappedSchema, { type: \"string\" });\n\n case \"number\":\n return withMetadata(unwrappedSchema, { type: \"number\" });\n\n case \"boolean\":\n return withMetadata(unwrappedSchema, { type: \"boolean\" });\n\n case \"enum\": {\n const jsonSchema: JsonSchema = {\n enum: [...unwrappedSchema.values],\n };\n const enumType = getEnumJsonType(unwrappedSchema.values);\n\n if (enumType !== undefined) {\n jsonSchema.type = enumType;\n }\n\n return withMetadata(unwrappedSchema, jsonSchema);\n }\n\n case \"array\":\n return withMetadata(unwrappedSchema, {\n type: \"array\",\n items: toJsonSchema(unwrappedSchema.item),\n });\n\n case \"object\": {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, propertySchema] of Object.entries(unwrappedSchema.shape)) {\n properties[key] = toJsonSchema(propertySchema);\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n }\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { ObjectSchema, Static } from \"@poe-code/cmdkit-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"@poe-code/design-system\";\n\nconst commandConfigSymbol = Symbol(\"cmdkit.command.config\");\nconst groupConfigSymbol = Symbol(\"cmdkit.group.config\");\nconst commandSourcePathSymbol = Symbol(\"cmdkit.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\n\nexport type Scope = ScopeValue;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(path: string, contents: string): Promise<void>;\n exists(path: string): Promise<boolean>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n> {\n name: string;\n description?: string;\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n> {\n kind: \"command\";\n name: string;\n description?: string;\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n scope?: Scope[];\n secrets?: SecretDeclarations;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitCommandTypeInfo: CommandTypeInfo<TName, TParamsSchema, TResult, TOwnScope>;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitGroupTypeInfo: GroupTypeInfo<TServices, TName, TChildren, TOwnScope>;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport class UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\n }\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional,\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(requires: Requires<TContext> | undefined): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check,\n };\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/cmdkit/src/index.ts\") ||\n candidate.includes(\"/packages/cmdkit/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(parent: Requires<any> | undefined, child: Requires<any> | undefined): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check),\n };\n\n if (\n merged.auth === undefined &&\n merged.apiVersion === undefined &&\n merged.check === undefined\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n throw new UserError(`Error: Missing required secret ${secret.env}${details}`);\n }\n\n secrets[name] = value;\n }\n\n return secrets;\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child,\n });\n}\n\nfunction resolveCommandScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render,\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath(),\n } satisfies InternalCommandConfig,\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(config: GroupConfig<TServices>): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined,\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default,\n } satisfies InternalGroupConfig<TServices>,\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig })[\n commandConfigSymbol\n ];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(group: Group<TServices>): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render,\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath,\n } satisfies InternalCommandConfig,\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath,\n });\n\n return materialized;\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const scope = resolveGroupScope(internal.scope, inherited.scope);\n const secrets = mergeSecrets(inherited.secrets, internal.secrets);\n const requires = mergeRequires(inherited.requires, internal.requires);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, {\n scope,\n secrets,\n requires,\n })\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new UserError(`Default command \"${internal.default.name}\" must be listed in children.`);\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new UserError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope,\n secrets,\n requires,\n children: materializedChildren,\n default: defaultChild,\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default,\n } satisfies InternalGroupConfig<TServices>,\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n>(\n config: Omit<CommandConfig<TServices, TParamsSchema, TSecrets, TResult>, \"name\" | \"scope\"> & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope> {\n return materializeCommand(createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope>;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n }\n): Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope> {\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope>;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport { S, toJsonSchema } from \"@poe-code/cmdkit-schema\";\nexport type { AnySchema, ArraySchema, BooleanSchema, EnumSchema, JsonSchema, NumberSchema, ObjectSchema, OptionalSchema, Static, StringSchema } from \"@poe-code/cmdkit-schema\";\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/mcp.ts", "../../tiny-stdio-mcp-server/src/server.ts", "../../tiny-stdio-mcp-server/src/types.ts", "../../tiny-stdio-mcp-server/src/jsonrpc.ts", "../../tiny-stdio-mcp-server/src/content/file-type.ts", "../../tiny-stdio-mcp-server/src/content/image.ts", "../../tiny-stdio-mcp-server/src/content/audio.ts", "../../tiny-stdio-mcp-server/src/content/file.ts", "../../tiny-stdio-mcp-server/src/content/convert.ts", "../../cmdkit-schema/src/index.ts", "../src/index.ts", "../src/number-schema.ts", "../src/schema-scope.ts"],
4
+ "sourcesContent": ["import { access, readFile, writeFile } from \"node:fs/promises\";\nimport {\n createServer,\n JSON_RPC_ERROR_CODES,\n ToolError,\n type SDKTransport,\n type Server as TinyServer,\n type TypedSchema,\n} from \"tiny-stdio-mcp-server\";\nimport { toJsonSchema, type AnySchema, type JsonSchema, type ObjectSchema } from \"@poe-code/cmdkit-schema\";\nimport type { Command, Group, HandlerEnv, HandlerFs } from \"./index.js\";\nimport { UserError, assertCommandRequirements, resolveCommandSecrets } from \"./index.js\";\nimport { getExpectedNumberDescription, isValidNumberSchemaValue } from \"./number-schema.js\";\nimport { filterSchemaForScope } from \"./schema-scope.js\";\n\nconst RESERVED_SERVICE_NAMES = new Set([\"params\", \"secrets\", \"fetch\", \"fs\", \"env\", \"progress\"]);\n\ntype Casing = \"snake\" | \"camel\";\ntype CmdkitServer = Omit<TinyServer, \"connect\"> & {\n connect(transport: SDKTransport): Promise<void>;\n};\ntype ToolContent =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | {\n type: \"resource\";\n resource:\n | { uri: string; mimeType: string; text: string }\n | { uri: string; mimeType: string; blob: string };\n };\n\ninterface ToolDefinition<TServices extends object> {\n command: Command<TServices, any, any, any>;\n description: string;\n inputSchema: JsonSchema;\n name: string;\n}\n\nexport interface RunMCPOptions<TServices extends object = Record<string, unknown>> {\n name: string;\n version: string;\n /**\n * Optional allowlist of MCP tool names or group prefixes.\n *\n * Tool names always use `__`-joined snake_case path segments, for example\n * `root__bot__create`.\n *\n * Passing a group prefix like `root__bot` includes every descendant tool in\n * that subtree.\n */\n tools?: string[];\n services?: TServices;\n /**\n * Controls MCP input-schema key casing and accepted argument-key casing.\n *\n * This does not change tool names. Tool names always stay `__`-joined\n * snake_case path segments.\n */\n casing?: Casing;\n}\n\nfunction normalizeRoots<TServices extends object>(\n roots: Group<TServices> | Group<TServices>[]\n): Group<TServices> {\n if (!Array.isArray(roots)) {\n return roots;\n }\n\n return {\n kind: \"group\",\n name: \"\",\n aliases: [],\n secrets: {},\n children: roots,\n };\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let current = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n const isSeparator = char === \"-\" || char === \"_\" || char === \" \" || char === \".\";\n\n if (isSeparator) {\n if (current.length > 0) {\n words.push(current.toLowerCase());\n current = \"\";\n }\n continue;\n }\n\n const isUppercase = char !== lower && char === upper;\n const previous = value[index - 1];\n const next = value[index + 1];\n const previousIsLowercase =\n previous !== undefined && previous === previous.toLowerCase() && previous !== previous.toUpperCase();\n const nextIsLowercase =\n next !== undefined && next === next.toLowerCase() && next !== next.toUpperCase();\n\n if (isUppercase && current.length > 0 && (previousIsLowercase || nextIsLowercase)) {\n words.push(current.toLowerCase());\n current = char;\n continue;\n }\n\n current += char;\n }\n\n if (current.length > 0) {\n words.push(current.toLowerCase());\n }\n\n return words;\n}\n\nfunction formatSegment(segment: string, casing: Casing): string {\n const words = splitWords(segment);\n\n if (casing === \"snake\") {\n return words.join(\"_\");\n }\n\n return words\n .map((word, index) =>\n index === 0 ? word : `${word[0]?.toUpperCase() ?? \"\"}${word.slice(1)}`\n )\n .join(\"\");\n}\n\nfunction unwrapOptional(schema: AnySchema): AnySchema {\n if (schema.kind === \"optional\") {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction isOptional(schema: AnySchema): boolean {\n return schema.kind === \"optional\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") => readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction validateServices(services: Record<string, unknown>): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(`Service name \"${name}\" is reserved. Choose a different name.`);\n }\n }\n}\n\nfunction applySchemaCasing(schema: JsonSchema, casing: Casing): JsonSchema {\n if (schema.type !== \"object\" || schema.properties === undefined) {\n if (schema.type === \"array\" && schema.items !== undefined) {\n return {\n ...schema,\n items: applySchemaCasing(schema.items, casing),\n };\n }\n\n return schema;\n }\n\n const properties = Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n formatSegment(key, casing),\n applySchemaCasing(value, casing),\n ])\n );\n const required = schema.required?.map((key) => formatSegment(key, casing));\n\n return {\n ...schema,\n properties,\n ...(required === undefined ? {} : { required }),\n };\n}\n\nfunction collectParamSummaries(\n schema: ObjectSchema<any>,\n casing: Casing,\n path: string[] = [],\n inheritedOptional = false\n): string[] {\n const summaries: string[] = [];\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const childSchema = unwrapOptional(rawChildSchema);\n const nextPath = [...path, formatSegment(key, casing)];\n const optional = inheritedOptional || isOptional(rawChildSchema);\n\n if (childSchema.kind === \"object\") {\n summaries.push(...collectParamSummaries(childSchema, casing, nextPath, optional));\n continue;\n }\n\n summaries.push(`${nextPath.join(\".\")}${optional ? \"\" : \" (required)\"}`);\n }\n\n return summaries;\n}\n\nfunction buildToolDescription(\n description: string | undefined,\n params: ObjectSchema<any>,\n casing: Casing\n): string {\n const summary = collectParamSummaries(params, casing);\n const parameterSummary =\n summary.length === 0 ? \"\" : `Parameters: ${summary.join(\", \")}.`;\n\n if (description === undefined) {\n return parameterSummary;\n }\n\n if (parameterSummary.length === 0) {\n return description;\n }\n\n return `${description} ${parameterSummary}`;\n}\n\nfunction matchesAllowlist(toolName: string, allowlist: string[] | undefined): boolean {\n if (allowlist === undefined) {\n return true;\n }\n\n const segments = toolName.split(\"__\");\n const candidates = segments.map((_segment, index) => segments.slice(0, index + 1).join(\"__\"));\n return candidates.some((candidate) => allowlist.includes(candidate));\n}\n\nfunction formatToolName(path: string[]): string {\n return path.map((segment) => formatSegment(segment, \"snake\")).join(\"__\");\n}\n\nfunction enumerateTools<TServices extends object>(\n root: Group<TServices>,\n casing: Casing,\n allowlist: string[] | undefined\n): ToolDefinition<TServices>[] {\n const tools: ToolDefinition<TServices>[] = [];\n\n function visit(node: Command<TServices, any, any, any> | Group<TServices>, path: string[]): void {\n if (node.kind === \"command\") {\n if (!node.scope.includes(\"mcp\")) {\n return;\n }\n\n const name = formatToolName([...path, node.name]);\n const params = filterSchemaForScope(node.params, \"mcp\");\n if (!matchesAllowlist(name, allowlist)) {\n return;\n }\n\n if (params === undefined || params.kind !== \"object\") {\n throw new Error(`Bug: command \"${name}\" must define an object params schema for MCP.`);\n }\n\n tools.push({\n command: node,\n name,\n description: buildToolDescription(node.description, params, casing),\n inputSchema: applySchemaCasing(toJsonSchema(params), casing),\n });\n return;\n }\n\n const nextPath = [...path, node.name];\n\n for (const child of node.children) {\n visit(child, nextPath);\n }\n }\n\n const rootPath = root.name.length === 0 ? [] : [root.name];\n\n for (const child of root.children) {\n visit(child, rootPath);\n }\n\n return tools;\n}\n\nfunction validateEnum(value: unknown, schema: Extract<AnySchema, { kind: \"enum\" }>, label: string): string | number | boolean {\n if (!schema.values.includes(value as never)) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected one of: ${schema.values.map((candidate) => String(candidate)).join(\", \")}.`\n );\n }\n\n return value as string | number | boolean;\n}\n\nfunction validateSchemaValue(\n schema: AnySchema,\n value: unknown,\n casing: Casing,\n label: string\n): unknown {\n const unwrappedSchema = unwrapOptional(schema);\n\n if (value === null && unwrappedSchema.nullable === true) {\n return null;\n }\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n if (typeof value !== \"string\") {\n throw new UserError(`Invalid value for \"${label}\". Expected a string.`);\n }\n return value;\n\n case \"number\":\n if (!isValidNumberSchemaValue(value, unwrappedSchema)) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected ${getExpectedNumberDescription(unwrappedSchema)}.`\n );\n }\n return value;\n\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n throw new UserError(`Invalid value for \"${label}\". Expected a boolean.`);\n }\n return value;\n\n case \"enum\":\n return validateEnum(value, unwrappedSchema, label);\n\n case \"array\":\n if (!Array.isArray(value)) {\n throw new UserError(`Invalid value for \"${label}\". Expected an array.`);\n }\n return value.map((item, index) =>\n validateSchemaValue(unwrappedSchema.item, item, casing, `${label}[${index}]`)\n );\n\n case \"object\":\n return validateObjectSchema(unwrappedSchema, value, casing, label);\n }\n}\n\nfunction validateObjectSchema(\n schema: ObjectSchema<any>,\n value: unknown,\n casing: Casing,\n label: string\n): Record<string, unknown> {\n if (!isPlainObject(value)) {\n throw new UserError(`Invalid value for \"${label}\". Expected an object.`);\n }\n\n const result: Record<string, unknown> = {};\n const expectedKeys = new Map<string, [string, AnySchema]>();\n\n for (const [key, childSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n expectedKeys.set(formatSegment(key, casing), [key, childSchema]);\n }\n\n for (const key of Object.keys(value)) {\n if (!expectedKeys.has(key)) {\n const fieldLabel = label.length === 0 ? key : `${label}.${key}`;\n throw new UserError(`Unexpected parameter \"${fieldLabel}\".`);\n }\n }\n\n for (const [inputKey, [outputKey, rawChildSchema]] of expectedKeys.entries()) {\n const childSchema = unwrapOptional(rawChildSchema);\n const hasValue = Object.prototype.hasOwnProperty.call(value, inputKey);\n const fieldLabel = label.length === 0 ? inputKey : `${label}.${inputKey}`;\n\n if (!hasValue) {\n if (childSchema.default !== undefined) {\n result[outputKey] = childSchema.default;\n continue;\n }\n\n if (isOptional(rawChildSchema)) {\n continue;\n }\n\n throw new UserError(`Missing required parameter \"${fieldLabel}\".`);\n }\n\n result[outputKey] = validateSchemaValue(rawChildSchema, value[inputKey], casing, fieldLabel);\n }\n\n return result;\n}\n\nfunction validateToolArguments(\n schema: ObjectSchema<any>,\n argumentsValue: Record<string, unknown> | undefined,\n casing: Casing\n): Record<string, unknown> {\n return validateObjectSchema(schema, argumentsValue ?? {}, casing, \"\");\n}\n\nfunction isContentBlock(value: unknown): value is ToolContent {\n if (!isPlainObject(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n return (\n value.type === \"text\" ||\n value.type === \"image\" ||\n value.type === \"audio\" ||\n value.type === \"resource\"\n );\n}\n\nfunction toToolContent(result: unknown): ToolContent[] {\n if (result === undefined) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.flatMap((item) => toToolContent(item));\n }\n\n if (\n typeof result === \"string\" ||\n typeof result === \"number\" ||\n typeof result === \"boolean\"\n ) {\n return [{ type: \"text\", text: String(result) }];\n }\n\n if (result === null) {\n return [{ type: \"text\", text: \"null\" }];\n }\n\n if (isContentBlock(result)) {\n return [result];\n }\n\n return [{ type: \"text\", text: JSON.stringify(result) }];\n}\n\nfunction toToolError(error: unknown): ToolError {\n if (error instanceof ToolError) {\n return error;\n }\n\n if (error instanceof UserError) {\n return new ToolError(JSON_RPC_ERROR_CODES.INVALID_PARAMS, error.message);\n }\n\n if (error instanceof Error) {\n return new ToolError(JSON_RPC_ERROR_CODES.INTERNAL_ERROR, error.message);\n }\n\n return new ToolError(JSON_RPC_ERROR_CODES.INTERNAL_ERROR, String(error));\n}\n\nexport function createMCPServer<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunMCPOptions<TServices>\n): CmdkitServer {\n const root = normalizeRoots(roots);\n const casing = options.casing ?? \"snake\";\n const services = (options.services ?? {}) as TServices;\n validateServices(services as Record<string, unknown>);\n\n const tools = enumerateTools(root, casing, options.tools);\n const server = createServer({ name: options.name, version: options.version });\n\n for (const tool of tools) {\n server.tool(\n tool.name,\n tool.description,\n tool.inputSchema as TypedSchema<Record<string, unknown>>,\n async (argumentsValue) => {\n try {\n const secrets = resolveCommandSecrets(tool.command);\n const baseContext = {\n ...services,\n secrets,\n fetch: globalThis.fetch,\n fs: createFs(),\n env: createEnv(),\n progress(): void {\n return undefined;\n },\n };\n\n await assertCommandRequirements(tool.command, { ...baseContext, params: undefined });\n\n const params = validateToolArguments(tool.command.params, argumentsValue, casing);\n const result = await tool.command.handler({\n ...baseContext,\n params,\n } as Parameters<typeof tool.command.handler>[0]);\n\n return toToolContent(result);\n } catch (error) {\n throw toToolError(error);\n }\n }\n );\n }\n\n return {\n ...server,\n connect(transport: SDKTransport): Promise<void> {\n return server.connectSDK(transport);\n },\n };\n}\n\nexport async function runMCP<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunMCPOptions<TServices>\n): Promise<void> {\n const server = createMCPServer(roots, options);\n await server.listen();\n}\n", "import * as readline from \"readline\";\nimport type {\n ServerOptions,\n ToolDefinition,\n ToolHandler,\n CallToolResult,\n HandleResult,\n InitializeResult,\n Tool,\n Transport,\n JSONSchema,\n SDKTransport,\n JSONRPCMessage,\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES, ToolError } from \"./types.js\";\nimport {\n parseMessage,\n formatSuccessResponse,\n formatErrorResponse,\n} from \"./jsonrpc.js\";\nimport type { TypedSchema } from \"./schema.js\";\nimport { toContentBlocks } from \"./content/convert.js\";\n\nconst PROTOCOL_VERSION = \"2025-11-25\";\n\nexport interface Server {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server;\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void;\n removeTool(name: string): boolean;\n notifyToolsChanged(): Promise<void>;\n handleMessage(\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult>;\n listen(): Promise<void>;\n connect(transport: Transport): Promise<void>;\n connectSDK(transport: SDKTransport): Promise<void>;\n}\n\nexport function createServer(options: ServerOptions): Server {\n const tools = new Map<string, ToolDefinition>();\n const notificationListeners = new Set<\n (notification: JSONRPCNotification) => void\n >();\n let initialized = false;\n\n const handleMessage = async (\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult> => {\n // Allow ping and initialize before initialization\n if (method === \"ping\") {\n return { result: {} };\n }\n\n if (method === \"initialize\") {\n initialized = true;\n const requestedProtocol =\n typeof params?.protocolVersion === \"string\"\n ? params.protocolVersion\n : null;\n const result: InitializeResult = {\n protocolVersion: requestedProtocol ?? PROTOCOL_VERSION,\n capabilities: {\n tools: {\n listChanged: true,\n },\n },\n serverInfo: {\n name: options.name,\n version: options.version,\n },\n };\n return { result };\n }\n\n if (method === \"notifications/initialized\") {\n return { result: undefined };\n }\n\n // All other methods require initialization\n if (!initialized) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Server not initialized\",\n },\n };\n }\n\n if (method === \"tools/list\") {\n const toolList: Tool[] = [];\n for (const tool of tools.values()) {\n toolList.push({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n });\n }\n return { result: { tools: toolList } };\n }\n\n if (method === \"tools/call\") {\n const toolName = params?.name as string | undefined;\n const toolArgs = (params?.arguments as Record<string, unknown>) || {};\n\n if (!toolName) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: \"Tool name required\",\n },\n };\n }\n\n const tool = tools.get(toolName);\n if (!tool) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: `Tool not found: ${toolName}`,\n },\n };\n }\n\n try {\n const handlerResult = await tool.handler(toolArgs);\n const result: CallToolResult = { content: toContentBlocks(handlerResult) };\n return { result };\n } catch (err) {\n if (err instanceof ToolError) {\n return {\n error: {\n code: err.code,\n message: err.message,\n },\n };\n }\n\n const errorMessage =\n err instanceof Error ? err.message : String(err);\n const result: CallToolResult = {\n content: [{ type: \"text\", text: `Error: ${errorMessage}` }],\n isError: true,\n };\n return { result };\n }\n }\n\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.METHOD_NOT_FOUND,\n message: \"Method not found\",\n },\n };\n };\n\n const processLine = async (\n line: string,\n write: (data: string) => void\n ): Promise<void> => {\n const parsed = parseMessage(line);\n\n if (!parsed.success) {\n write(formatErrorResponse(parsed.id, parsed.error) + \"\\n\");\n return;\n }\n\n const { request, isNotification } = parsed;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (isNotification) {\n return;\n }\n\n const requestWithId = request as JSONRPCRequest;\n\n if (error) {\n write(formatErrorResponse(requestWithId.id, error) + \"\\n\");\n } else if (result !== undefined) {\n write(formatSuccessResponse(requestWithId.id, result) + \"\\n\");\n }\n };\n\n const broadcastNotification = (method: string): void => {\n const notification: JSONRPCNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n for (const listener of notificationListeners) {\n listener(notification);\n }\n };\n\n const server: Server = {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server {\n tools.set(name, {\n name,\n description,\n inputSchema: inputSchema as JSONSchema,\n handler: handler as ToolHandler,\n });\n return server;\n },\n\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void {\n notificationListeners.add(listener);\n return () => {\n notificationListeners.delete(listener);\n };\n },\n\n removeTool(name: string): boolean {\n return tools.delete(name);\n },\n\n async notifyToolsChanged(): Promise<void> {\n if (initialized) {\n broadcastNotification(\"notifications/tools/list_changed\");\n }\n },\n\n handleMessage,\n\n async listen(): Promise<void> {\n return server.connect({\n readable: process.stdin,\n writable: process.stdout,\n });\n },\n\n async connect(transport: Transport): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n transport.writable.write(`${JSON.stringify(notification)}\\n`);\n });\n const rl = readline.createInterface({\n input: transport.readable,\n crlfDelay: Infinity,\n });\n\n rl.on(\"line\", (line) => {\n processLine(line, (data) => transport.writable.write(data));\n });\n\n rl.on(\"close\", () => {\n unsubscribe();\n resolve();\n });\n });\n },\n\n async connectSDK(transport: SDKTransport): Promise<void> {\n return new Promise<void>((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n void transport.send(notification);\n });\n\n transport.onmessage = async (message: JSONRPCMessage) => {\n // Ignore responses (we only handle requests/notifications)\n if (!(\"method\" in message)) {\n return;\n }\n\n // Handle notifications (no id) - don't respond\n if (!(\"id\" in message) || message.id === undefined) {\n await server.handleMessage(message.method, message.params);\n return;\n }\n\n const request = message as JSONRPCRequest;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (error) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n error,\n };\n await transport.send(response);\n } else if (result !== undefined) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n await transport.send(response);\n }\n };\n\n transport.onclose = () => {\n unsubscribe();\n resolve();\n };\n\n transport.start();\n });\n },\n };\n\n return server;\n}\n", "// JSON-RPC 2.0 types\nexport interface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JSONRPCError;\n}\n\nexport interface JSONRPCError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// JSON-RPC error codes\nexport const JSON_RPC_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603\n} as const;\n\nexport class ToolError extends Error {\n constructor(\n public readonly code: number,\n message: string\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\n// MCP protocol types\nexport interface ToolsCapability {\n listChanged?: boolean;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: {\n tools?: ToolsCapability;\n };\n serverInfo: {\n name: string;\n version: string;\n };\n}\n\nexport interface Tool {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n isError?: boolean;\n}\n\nexport interface HandleResult {\n result?: unknown;\n error?: { code: number; message: string };\n}\n\n// ContentItem is a union of all possible content block types\nexport type ContentItem =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | {\n type: \"resource\";\n resource:\n | { uri: string; mimeType: string; text: string }\n | { uri: string; mimeType: string; blob: string };\n };\n\nexport interface JSONSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required?: string[];\n}\n\nexport interface JSONSchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n description?: string;\n}\n\n// Server types\nexport interface ServerOptions {\n name: string;\n version: string;\n}\n\nimport type { ToolReturn } from \"./content/index.js\";\n\nexport type ToolHandler<T = Record<string, unknown>> = (\n args: T\n) => Promise<ToolReturn> | ToolReturn;\n\nexport interface ToolDefinition<T = Record<string, unknown>> {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n handler: ToolHandler<T>;\n}\n\n// Transport types\nexport interface Transport {\n readable: NodeJS.ReadableStream;\n writable: NodeJS.WritableStream;\n}\n\n// SDK-compatible transport interface\nexport interface SDKTransport {\n onmessage?: (message: JSONRPCMessage) => void;\n onclose?: () => void;\n onerror?: (error: Error) => void;\n start: () => Promise<void>;\n close: () => Promise<void>;\n send: (message: JSONRPCMessage) => Promise<void>;\n}\n\nexport type JSONRPCMessage = JSONRPCRequest | JSONRPCResponse | JSONRPCNotification;\n\nexport interface JSONRPCNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n}\n", "import type {\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCError,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES } from \"./types.js\";\n\nexport interface ParseResult {\n success: true;\n request: JSONRPCRequest | JSONRPCNotification;\n isNotification: boolean;\n}\n\nexport interface ParseError {\n success: false;\n error: JSONRPCError;\n id: string | number | null;\n}\n\nexport function parseMessage(line: string): ParseResult | ParseError {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.PARSE_ERROR,\n message: \"Parse error\",\n },\n id: null,\n };\n }\n\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n const obj = parsed as Record<string, unknown>;\n const hasId = \"id\" in obj;\n const id = typeof obj.id === \"string\" || typeof obj.id === \"number\" ? obj.id : null;\n\n if (obj.jsonrpc !== \"2.0\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (typeof obj.method !== \"string\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (!hasId) {\n return {\n success: true,\n isNotification: true,\n request: {\n jsonrpc: \"2.0\",\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n }\n\n if (id === null) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n return {\n success: true,\n isNotification: false,\n request: {\n jsonrpc: \"2.0\",\n id,\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n}\n\nexport function formatSuccessResponse(\n id: string | number | null,\n result: unknown\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n result,\n };\n return JSON.stringify(response);\n}\n\nexport function formatErrorResponse(\n id: string | number | null,\n error: JSONRPCError\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n error,\n };\n return JSON.stringify(response);\n}\n", "/**\n * Minimal magic bytes detection for common media types.\n * This can be replaced with `file-type` package (https://npm.im/file-type)\n * if more comprehensive detection is needed. The API is designed to be\n * compatible: fileTypeFromBuffer(data) returns { mime: string, ext: string } | undefined\n */\n\nexport interface FileTypeResult {\n mime: string;\n ext: string;\n}\n\nexport function fileTypeFromBuffer(data: Uint8Array): FileTypeResult | undefined {\n if (data.length < 12) {\n return undefined;\n }\n\n // PNG: 89 50 4E 47 0D 0A 1A 0A\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47 &&\n data[4] === 0x0d &&\n data[5] === 0x0a &&\n data[6] === 0x1a &&\n data[7] === 0x0a\n ) {\n return { mime: \"image/png\", ext: \"png\" };\n }\n\n // JPEG: FF D8 FF\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return { mime: \"image/jpeg\", ext: \"jpg\" };\n }\n\n // GIF: 47 49 46 38 (GIF8)\n if (\n data[0] === 0x47 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x38\n ) {\n return { mime: \"image/gif\", ext: \"gif\" };\n }\n\n // WEBP: 52 49 46 46 ... 57 45 42 50 (RIFF...WEBP)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x45 &&\n data[10] === 0x42 &&\n data[11] === 0x50\n ) {\n return { mime: \"image/webp\", ext: \"webp\" };\n }\n\n // MP3: FF FB or FF FA (MPEG audio) or 49 44 33 (ID3 tag)\n if (\n (data[0] === 0xff && (data[1] === 0xfb || data[1] === 0xfa)) ||\n (data[0] === 0x49 && data[1] === 0x44 && data[2] === 0x33)\n ) {\n return { mime: \"audio/mpeg\", ext: \"mp3\" };\n }\n\n // WAV: 52 49 46 46 ... 57 41 56 45 (RIFF...WAVE)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x41 &&\n data[10] === 0x56 &&\n data[11] === 0x45\n ) {\n return { mime: \"audio/wav\", ext: \"wav\" };\n }\n\n // OGG: 4F 67 67 53 (OggS)\n if (\n data[0] === 0x4f &&\n data[1] === 0x67 &&\n data[2] === 0x67 &&\n data[3] === 0x53\n ) {\n return { mime: \"audio/ogg\", ext: \"ogg\" };\n }\n\n // M4A: MP4 container with audio - check for M4A brand at offset 8\n // ftyp followed by M4A brand\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70 &&\n data[8] === 0x4d &&\n data[9] === 0x34 &&\n data[10] === 0x41\n ) {\n return { mime: \"audio/mp4\", ext: \"m4a\" };\n }\n\n // MP4: ... 66 74 79 70 (ftyp box, offset 4)\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70\n ) {\n return { mime: \"video/mp4\", ext: \"mp4\" };\n }\n\n // WEBM: 1A 45 DF A3 (EBML header)\n if (\n data[0] === 0x1a &&\n data[1] === 0x45 &&\n data[2] === 0xdf &&\n data[3] === 0xa3\n ) {\n return { mime: \"video/webm\", ext: \"webm\" };\n }\n\n return undefined;\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_IMAGE_MIMES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nexport class Image {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Image> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch image from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_IMAGE_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect image MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Image {\n let mimeType: string;\n\n if (format) {\n mimeType = format.includes(\"/\") ? format : `image/${format}`;\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect image MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Image {\n return new Image(base64, mimeType);\n }\n\n toContentBlock(): ImageContent {\n return {\n type: \"image\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_AUDIO_MIMES = new Set([\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/ogg\",\n \"audio/mp4\",\n]);\n\nconst AUDIO_FORMAT_MAP: Record<string, string> = {\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n m4a: \"audio/mp4\",\n mpeg: \"audio/mpeg\",\n};\n\nexport class Audio {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Audio> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch audio from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_AUDIO_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect audio MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Audio {\n let mimeType: string;\n\n if (format) {\n if (format.includes(\"/\")) {\n mimeType = format;\n } else {\n mimeType = AUDIO_FORMAT_MAP[format.toLowerCase()] || `audio/${format}`;\n }\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect audio MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Audio {\n return new Audio(base64, mimeType);\n }\n\n toContentBlock(): AudioContent {\n return {\n type: \"audio\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface TextResourceContents {\n uri: string;\n mimeType: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType: string;\n blob: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: TextResourceContents | BlobResourceContents;\n}\n\nfunction isTextMimeType(mimeType: string): boolean {\n return (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n mimeType === \"application/javascript\" ||\n mimeType === \"application/typescript\"\n );\n}\n\nexport class File {\n private constructor(\n private readonly data: Uint8Array | string,\n private readonly mimeType: string,\n private readonly isText: boolean,\n private readonly name?: string\n ) {}\n\n static async fromUrl(url: string): Promise<File> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect MIME type from ${url}`);\n }\n }\n\n const isText = isTextMimeType(mimeType);\n const name = url.split(\"/\").pop() || \"file\";\n\n return new File(data, mimeType, isText, name);\n }\n\n static fromBytes(data: Uint8Array, mimeType: string): File {\n const isText = isTextMimeType(mimeType);\n return new File(data, mimeType, isText);\n }\n\n static fromText(text: string, mimeType = \"text/plain\"): File {\n return new File(text, mimeType, true);\n }\n\n static fromBase64(base64: string, mimeType: string): File {\n const data = Buffer.from(base64, \"base64\");\n const isText = isTextMimeType(mimeType);\n return new File(new Uint8Array(data), mimeType, isText);\n }\n\n toContentBlock(): EmbeddedResource {\n const uri = this.name ? `file:///${this.name}` : \"file:///data\";\n\n if (this.isText) {\n let text: string;\n if (typeof this.data === \"string\") {\n text = this.data;\n } else {\n text = new TextDecoder(\"utf-8\").decode(this.data);\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n text,\n } as TextResourceContents,\n };\n } else {\n let blob: string;\n if (typeof this.data === \"string\") {\n blob = Buffer.from(this.data).toString(\"base64\");\n } else {\n blob = Buffer.from(this.data).toString(\"base64\");\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n blob,\n } as BlobResourceContents,\n };\n }\n }\n}\n", "import { Image, type ImageContent } from \"./image.js\";\nimport { Audio, type AudioContent } from \"./audio.js\";\nimport { File, type EmbeddedResource } from \"./file.js\";\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport type ContentBlock = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\ntype JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type ToolReturn =\n | undefined\n | JsonPrimitive\n | JsonObject\n | Image\n | Audio\n | File\n | ContentBlock\n | Array<undefined | JsonPrimitive | JsonObject | Image | Audio | File | ContentBlock>;\n\nfunction convertSingleValue(value: Exclude<ToolReturn, Array<unknown> | undefined>): ContentBlock {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return { type: \"text\", text: String(value) };\n }\n\n if (value === null) {\n return { type: \"text\", text: \"null\" };\n }\n\n if (value instanceof Image) {\n return value.toContentBlock();\n }\n\n if (value instanceof Audio) {\n return value.toContentBlock();\n }\n\n if (value instanceof File) {\n return value.toContentBlock();\n }\n\n if (isContentBlock(value)) {\n return value;\n }\n\n return { type: \"text\", text: JSON.stringify(value) };\n}\n\nexport function toContentBlocks(result: ToolReturn): ContentBlock[] {\n if (result === undefined) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.flatMap((item) => toContentBlocks(item));\n }\n\n return [convertSingleValue(result)];\n}\n\nfunction isContentBlock(value: object): value is ContentBlock {\n if (!(\"type\" in value) || typeof value.type !== \"string\") {\n return false;\n }\n\n return (\n value.type === \"text\" ||\n value.type === \"image\" ||\n value.type === \"audio\" ||\n value.type === \"resource\"\n );\n}\n", "type JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\";\ntype EnumValue = string | number | boolean;\ntype JsonSchemaEnumValue = EnumValue | null;\ntype NumberJsonType = \"number\" | \"integer\";\ntype NonEmptyReadonlyArray<T> = readonly [T, ...T[]];\ntype ObjectShape = Record<string, AnySchema>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> = TSchema extends OptionalSchema<infer TInner>\n ? Static<TInner>\n : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n description?: string;\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n};\n\ninterface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly description?: string;\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean;\n type?: JsonSchemaType;\n description?: string;\n default?: unknown;\n enum?: ReadonlyArray<JsonSchemaEnumValue>;\n format?: string;\n items?: JsonSchema;\n maxItems?: number;\n maximum?: number;\n maxLength?: number;\n minItems?: number;\n minimum?: number;\n minLength?: number;\n nullable?: boolean;\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n}\n\nexport interface StringSchema extends SchemaBase<\"string\", string>, StringMetadata {}\n\nexport interface NumberSchema extends SchemaBase<\"number\", number>, NumberMetadata {\n readonly jsonType?: NumberJsonType;\n}\n\nexport type BooleanSchema = SchemaBase<\"boolean\", boolean>;\n\nexport interface EnumSchema<TValues extends NonEmptyReadonlyArray<EnumValue>>\n extends SchemaBase<\"enum\", TValues[number]> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema>\n extends SchemaBase<\"optional\", Static<TInner> | undefined> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties = schema.additionalProperties;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nexport const S = {\n String(options: SchemaOptions<string> & StringMetadata = {}): StringSchema {\n return {\n kind: \"string\",\n ...options,\n };\n },\n\n Number(\n options: SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } = {}\n ): NumberSchema {\n return {\n kind: \"number\",\n ...options,\n };\n },\n\n Boolean(options: SchemaOptions<boolean> = {}): BooleanSchema {\n return {\n kind: \"boolean\",\n ...options,\n };\n },\n\n Enum<const TValues extends NonEmptyReadonlyArray<EnumValue>>(\n values: TValues,\n options: SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = {}\n ): EnumSchema<TValues> {\n assertValidEnumValues(values);\n\n return {\n kind: \"enum\",\n values,\n ...options,\n };\n },\n\n Array<TItem extends AnySchema>(\n item: TItem,\n options: SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = {}\n ): ArraySchema<TItem> {\n return {\n kind: \"array\",\n item,\n ...options,\n };\n },\n\n Object<const TShape extends ObjectShape>(\n shape: TShape,\n options: SchemaOptions<InferObject<TShape>> & ObjectMetadata = {}\n ): ObjectSchema<TShape> {\n return {\n kind: \"object\",\n shape,\n ...options,\n };\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner,\n };\n },\n} as const;\n\nexport function toJsonSchema(schema: AnySchema): JsonSchema {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n return withStringMetadata(unwrappedSchema, { type: \"string\" });\n\n case \"number\":\n return withNumberMetadata(unwrappedSchema, { type: unwrappedSchema.jsonType ?? \"number\" });\n\n case \"boolean\":\n return withMetadata(unwrappedSchema, { type: \"boolean\" });\n\n case \"enum\": {\n const jsonSchema: JsonSchema = {\n enum:\n unwrappedSchema.nullable === true\n ? [...unwrappedSchema.values, null]\n : [...unwrappedSchema.values],\n };\n const enumType = unwrappedSchema.jsonType ?? getEnumJsonType(unwrappedSchema.values);\n\n if (enumType !== undefined) {\n jsonSchema.type = enumType;\n }\n\n return withMetadata(unwrappedSchema, jsonSchema);\n }\n\n case \"array\":\n return withArrayMetadata(unwrappedSchema, {\n type: \"array\",\n items: toJsonSchema(unwrappedSchema.item),\n });\n\n case \"object\": {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, propertySchema] of Object.entries(unwrappedSchema.shape)) {\n properties[key] = toJsonSchema(propertySchema);\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required,\n });\n }\n }\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { ObjectSchema, Static } from \"@poe-code/cmdkit-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"@poe-code/design-system\";\n\nconst commandConfigSymbol = Symbol(\"cmdkit.command.config\");\nconst groupConfigSymbol = Symbol(\"cmdkit.group.config\");\nconst commandSourcePathSymbol = Symbol(\"cmdkit.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\n\nexport type Scope = ScopeValue;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(path: string, contents: string): Promise<void>;\n exists(path: string): Promise<boolean>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n> {\n name: string;\n description?: string;\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n> {\n kind: \"command\";\n name: string;\n description?: string;\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n scope?: Scope[];\n secrets?: SecretDeclarations;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitCommandTypeInfo: CommandTypeInfo<TName, TParamsSchema, TResult, TOwnScope>;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitGroupTypeInfo: GroupTypeInfo<TServices, TName, TChildren, TOwnScope>;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport class UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\n }\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional,\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(requires: Requires<TContext> | undefined): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check,\n };\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/cmdkit/src/index.ts\") ||\n candidate.includes(\"/packages/cmdkit/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(parent: Requires<any> | undefined, child: Requires<any> | undefined): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check),\n };\n\n if (\n merged.auth === undefined &&\n merged.apiVersion === undefined &&\n merged.check === undefined\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n throw new UserError(`Error: Missing required secret ${secret.env}${details}`);\n }\n\n secrets[name] = value;\n }\n\n return secrets;\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child,\n });\n}\n\nfunction resolveCommandScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render,\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath(),\n } satisfies InternalCommandConfig,\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(config: GroupConfig<TServices>): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined,\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default,\n } satisfies InternalGroupConfig<TServices>,\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig })[\n commandConfigSymbol\n ];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(group: Group<TServices>): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render,\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath,\n } satisfies InternalCommandConfig,\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath,\n });\n\n return materialized;\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const scope = resolveGroupScope(internal.scope, inherited.scope);\n const secrets = mergeSecrets(inherited.secrets, internal.secrets);\n const requires = mergeRequires(inherited.requires, internal.requires);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, {\n scope,\n secrets,\n requires,\n })\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new UserError(`Default command \"${internal.default.name}\" must be listed in children.`);\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new UserError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope,\n secrets,\n requires,\n children: materializedChildren,\n default: defaultChild,\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default,\n } satisfies InternalGroupConfig<TServices>,\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n>(\n config: Omit<CommandConfig<TServices, TParamsSchema, TSecrets, TResult>, \"name\" | \"scope\"> & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope> {\n return materializeCommand(createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope>;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n }\n): Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope> {\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope>;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport { S, toJsonSchema } from \"@poe-code/cmdkit-schema\";\nexport type { AnySchema, ArraySchema, BooleanSchema, EnumSchema, JsonSchema, NumberSchema, ObjectSchema, OptionalSchema, Static, StringSchema } from \"@poe-code/cmdkit-schema\";\n", "import type { NumberSchema } from \"@poe-code/cmdkit-schema\";\n\nexport function isValidNumberSchemaValue(\n value: unknown,\n schema: NumberSchema\n): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (schema.jsonType !== \"integer\" || Number.isInteger(value))\n );\n}\n\nexport function getExpectedNumberDescription(schema: NumberSchema): string {\n return schema.jsonType === \"integer\" ? \"an integer\" : \"a number\";\n}\n", "import type { AnySchema } from \"@poe-code/cmdkit-schema\";\n\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\n\nexport function filterSchemaForScope(schema: AnySchema, scope: SchemaScope): AnySchema | undefined {\n if (schema.scope !== undefined && !schema.scope.includes(scope)) {\n return undefined;\n }\n\n switch (schema.kind) {\n case \"optional\": {\n const inner = filterSchemaForScope(schema.inner, scope);\n\n if (inner === undefined) {\n return undefined;\n }\n\n if (inner.requiredScopes?.includes(scope)) {\n return inner;\n }\n\n return { ...schema, inner };\n }\n\n case \"array\": {\n const item = filterSchemaForScope(schema.item, scope);\n return item === undefined ? undefined : { ...schema, item };\n }\n\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"enum\":\n return schema;\n\n case \"object\":\n return {\n ...schema,\n shape: Object.fromEntries(\n Object.entries(schema.shape).flatMap(([key, childSchema]) => {\n const filtered = filterSchemaForScope(childSchema, scope);\n return filtered === undefined ? [] : [[key, filtered]];\n })\n ),\n };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["unwrapOptional", "isContentBlock"]
7
7
  }
@@ -0,0 +1,3 @@
1
+ import type { NumberSchema } from "../../cmdkit-schema/dist/index.js";
2
+ export declare function isValidNumberSchemaValue(value: unknown, schema: NumberSchema): value is number;
3
+ export declare function getExpectedNumberDescription(schema: NumberSchema): string;
@@ -0,0 +1,8 @@
1
+ export function isValidNumberSchemaValue(value, schema) {
2
+ return (typeof value === "number" &&
3
+ Number.isFinite(value) &&
4
+ (schema.jsonType !== "integer" || Number.isInteger(value)));
5
+ }
6
+ export function getExpectedNumberDescription(schema) {
7
+ return schema.jsonType === "integer" ? "an integer" : "a number";
8
+ }
@@ -0,0 +1,4 @@
1
+ import type { AnySchema } from "../../cmdkit-schema/dist/index.js";
2
+ type SchemaScope = "cli" | "mcp" | "sdk";
3
+ export declare function filterSchemaForScope(schema: AnySchema, scope: SchemaScope): AnySchema | undefined;
4
+ export {};
@@ -0,0 +1,34 @@
1
+ export function filterSchemaForScope(schema, scope) {
2
+ if (schema.scope !== undefined && !schema.scope.includes(scope)) {
3
+ return undefined;
4
+ }
5
+ switch (schema.kind) {
6
+ case "optional": {
7
+ const inner = filterSchemaForScope(schema.inner, scope);
8
+ if (inner === undefined) {
9
+ return undefined;
10
+ }
11
+ if (inner.requiredScopes?.includes(scope)) {
12
+ return inner;
13
+ }
14
+ return { ...schema, inner };
15
+ }
16
+ case "array": {
17
+ const item = filterSchemaForScope(schema.item, scope);
18
+ return item === undefined ? undefined : { ...schema, item };
19
+ }
20
+ case "string":
21
+ case "number":
22
+ case "boolean":
23
+ case "enum":
24
+ return schema;
25
+ case "object":
26
+ return {
27
+ ...schema,
28
+ shape: Object.fromEntries(Object.entries(schema.shape).flatMap(([key, childSchema]) => {
29
+ const filtered = filterSchemaForScope(childSchema, scope);
30
+ return filtered === undefined ? [] : [[key, filtered]];
31
+ })),
32
+ };
33
+ }
34
+ }