frontmcp 0.12.2 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +6 -5
- package/src/commands/build/bundler.js +1 -1
- package/src/commands/build/bundler.js.map +1 -1
- package/src/commands/build/exec/cli-runtime/cli-bundler.d.ts +17 -0
- package/src/commands/build/exec/cli-runtime/cli-bundler.js +75 -0
- package/src/commands/build/exec/cli-runtime/cli-bundler.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/credential-store.d.ts +22 -0
- package/src/commands/build/exec/cli-runtime/credential-store.js +140 -0
- package/src/commands/build/exec/cli-runtime/credential-store.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/daemon-client.d.ts +16 -0
- package/src/commands/build/exec/cli-runtime/daemon-client.js +169 -0
- package/src/commands/build/exec/cli-runtime/daemon-client.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/generate-cli-entry.d.ts +37 -0
- package/src/commands/build/exec/cli-runtime/generate-cli-entry.js +1287 -0
- package/src/commands/build/exec/cli-runtime/generate-cli-entry.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/index.d.ts +9 -0
- package/src/commands/build/exec/cli-runtime/index.js +32 -0
- package/src/commands/build/exec/cli-runtime/index.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/oauth-helper.d.ts +9 -0
- package/src/commands/build/exec/cli-runtime/oauth-helper.js +224 -0
- package/src/commands/build/exec/cli-runtime/oauth-helper.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/output-formatter.d.ts +46 -0
- package/src/commands/build/exec/cli-runtime/output-formatter.js +168 -0
- package/src/commands/build/exec/cli-runtime/output-formatter.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/schema-extractor.d.ts +57 -0
- package/src/commands/build/exec/cli-runtime/schema-extractor.js +129 -0
- package/src/commands/build/exec/cli-runtime/schema-extractor.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/schema-to-commander.d.ts +38 -0
- package/src/commands/build/exec/cli-runtime/schema-to-commander.js +172 -0
- package/src/commands/build/exec/cli-runtime/schema-to-commander.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/session-manager.d.ts +16 -0
- package/src/commands/build/exec/cli-runtime/session-manager.js +122 -0
- package/src/commands/build/exec/cli-runtime/session-manager.js.map +1 -0
- package/src/commands/build/exec/config.d.ts +25 -0
- package/src/commands/build/exec/config.js +0 -1
- package/src/commands/build/exec/config.js.map +1 -1
- package/src/commands/build/exec/esbuild-bundler.d.ts +4 -1
- package/src/commands/build/exec/esbuild-bundler.js +28 -9
- package/src/commands/build/exec/esbuild-bundler.js.map +1 -1
- package/src/commands/build/exec/index.d.ts +7 -2
- package/src/commands/build/exec/index.js +159 -9
- package/src/commands/build/exec/index.js.map +1 -1
- package/src/commands/build/exec/manifest.d.ts +14 -0
- package/src/commands/build/exec/manifest.js.map +1 -1
- package/src/commands/build/exec/runner-script.d.ts +1 -1
- package/src/commands/build/exec/runner-script.js +48 -5
- package/src/commands/build/exec/runner-script.js.map +1 -1
- package/src/commands/build/exec/sea-builder.d.ts +18 -0
- package/src/commands/build/exec/sea-builder.js +81 -0
- package/src/commands/build/exec/sea-builder.js.map +1 -0
- package/src/commands/build/exec/setup.js +0 -2
- package/src/commands/build/exec/setup.js.map +1 -1
- package/src/commands/build/index.d.ts +1 -1
- package/src/commands/build/index.js +3 -3
- package/src/commands/build/index.js.map +1 -1
- package/src/commands/build/register.d.ts +2 -0
- package/src/commands/build/register.js +21 -0
- package/src/commands/build/register.js.map +1 -0
- package/src/commands/{dev.d.ts → dev/dev.d.ts} +1 -1
- package/src/commands/{dev.js → dev/dev.js} +3 -3
- package/src/commands/dev/dev.js.map +1 -0
- package/src/commands/{doctor.js → dev/doctor.js} +5 -4
- package/src/commands/dev/doctor.js.map +1 -0
- package/src/commands/{inspector.js → dev/inspector.js} +1 -1
- package/src/commands/dev/inspector.js.map +1 -0
- package/src/commands/dev/register.d.ts +2 -0
- package/src/commands/dev/register.js +49 -0
- package/src/commands/dev/register.js.map +1 -0
- package/src/commands/{test.d.ts → dev/test.d.ts} +1 -1
- package/src/commands/{test.js → dev/test.js} +5 -5
- package/src/commands/dev/test.js.map +1 -0
- package/src/commands/{configure.d.ts → package/configure.d.ts} +1 -1
- package/src/commands/{configure.js → package/configure.js} +3 -3
- package/src/commands/package/configure.js.map +1 -0
- package/src/commands/package/esm-update.d.ts +19 -0
- package/src/commands/package/esm-update.js +93 -0
- package/src/commands/package/esm-update.js.map +1 -0
- package/src/commands/{install/index.d.ts → package/install.d.ts} +1 -1
- package/src/commands/{install/index.js → package/install.js} +8 -5
- package/src/commands/package/install.js.map +1 -0
- package/src/commands/{install → package}/questionnaire.js +2 -2
- package/src/commands/{install → package}/questionnaire.js.map +1 -1
- package/src/commands/package/register.d.ts +2 -0
- package/src/commands/package/register.js +35 -0
- package/src/commands/package/register.js.map +1 -0
- package/src/commands/{install → package}/registry.js +8 -6
- package/src/commands/package/registry.js.map +1 -0
- package/src/commands/{install → package}/sources/git.js +8 -1
- package/src/commands/package/sources/git.js.map +1 -0
- package/src/commands/{install → package}/sources/local.js.map +1 -1
- package/src/commands/{install → package}/sources/npm.js.map +1 -1
- package/src/commands/{install → package}/types.d.ts +7 -1
- package/src/commands/{install → package}/types.js +4 -0
- package/src/commands/package/types.js.map +1 -0
- package/src/commands/{uninstall.d.ts → package/uninstall.d.ts} +1 -1
- package/src/commands/{uninstall.js → package/uninstall.js} +2 -2
- package/src/commands/package/uninstall.js.map +1 -0
- package/src/{pm/pm.format.d.ts → commands/pm/format.d.ts} +1 -1
- package/src/{pm/pm.format.js → commands/pm/format.js} +2 -2
- package/src/commands/pm/format.js.map +1 -0
- package/src/{pm/pm.health.js → commands/pm/health.js} +1 -1
- package/src/commands/pm/health.js.map +1 -0
- package/src/commands/pm/index.d.ts +9 -0
- package/src/{pm → commands/pm}/index.js +32 -32
- package/src/commands/pm/index.js.map +1 -0
- package/src/commands/{list.d.ts → pm/list.d.ts} +1 -1
- package/src/commands/{list.js → pm/list.js} +3 -3
- package/src/commands/pm/list.js.map +1 -0
- package/src/{pm/pm.logs.js → commands/pm/log-utils.js} +9 -9
- package/src/commands/pm/log-utils.js.map +1 -0
- package/src/commands/{logs.d.ts → pm/logs.d.ts} +1 -1
- package/src/commands/{logs.js → pm/logs.js} +6 -6
- package/src/commands/pm/logs.js.map +1 -0
- package/src/{pm/pm.manager.d.ts → commands/pm/manager.d.ts} +1 -1
- package/src/{pm/pm.manager.js → commands/pm/manager.js} +21 -21
- package/src/commands/pm/manager.js.map +1 -0
- package/src/{pm/pm.paths.d.ts → commands/pm/paths.d.ts} +1 -0
- package/src/{pm/pm.paths.js → commands/pm/paths.js} +2 -1
- package/src/commands/pm/paths.js.map +1 -0
- package/src/{pm/pm.pidfile.d.ts → commands/pm/pidfile.d.ts} +1 -1
- package/src/{pm/pm.pidfile.js → commands/pm/pidfile.js} +8 -8
- package/src/commands/pm/pidfile.js.map +1 -0
- package/src/commands/pm/register.d.ts +2 -0
- package/src/commands/pm/register.js +83 -0
- package/src/commands/pm/register.js.map +1 -0
- package/src/commands/{restart.d.ts → pm/restart.d.ts} +1 -1
- package/src/commands/{restart.js → pm/restart.js} +4 -4
- package/src/commands/pm/restart.js.map +1 -0
- package/src/{pm/pm.service.d.ts → commands/pm/service-gen.d.ts} +1 -1
- package/src/{pm/pm.service.js → commands/pm/service-gen.js} +5 -5
- package/src/commands/pm/service-gen.js.map +1 -0
- package/src/commands/{service.d.ts → pm/service.d.ts} +1 -1
- package/src/commands/{service.js → pm/service.js} +6 -6
- package/src/commands/pm/service.js.map +1 -0
- package/src/commands/{socket.d.ts → pm/socket.d.ts} +1 -1
- package/src/commands/{socket.js → pm/socket.js} +3 -3
- package/src/commands/pm/socket.js.map +1 -0
- package/src/{pm/pm.spawn.d.ts → commands/pm/spawn.d.ts} +1 -1
- package/src/{pm/pm.spawn.js → commands/pm/spawn.js} +15 -15
- package/src/commands/pm/spawn.js.map +1 -0
- package/src/commands/{start.d.ts → pm/start.d.ts} +1 -1
- package/src/commands/{start.js → pm/start.js} +6 -6
- package/src/commands/pm/start.js.map +1 -0
- package/src/commands/{status.d.ts → pm/status.d.ts} +1 -1
- package/src/commands/{status.js → pm/status.js} +5 -5
- package/src/commands/pm/status.js.map +1 -0
- package/src/commands/{stop.d.ts → pm/stop.d.ts} +1 -1
- package/src/commands/{stop.js → pm/stop.js} +3 -3
- package/src/commands/pm/stop.js.map +1 -0
- package/src/{pm/pm.types.js → commands/pm/types.js} +1 -1
- package/src/commands/pm/types.js.map +1 -0
- package/src/commands/{create.js → scaffold/create.js} +91 -20
- package/src/commands/scaffold/create.js.map +1 -0
- package/src/commands/scaffold/register.d.ts +2 -0
- package/src/commands/scaffold/register.js +28 -0
- package/src/commands/scaffold/register.js.map +1 -0
- package/src/{args.d.ts → core/args.d.ts} +7 -1
- package/src/{args.js → core/args.js} +8 -0
- package/src/core/args.js.map +1 -0
- package/src/core/bridge.d.ts +9 -0
- package/src/core/bridge.js +75 -0
- package/src/core/bridge.js.map +1 -0
- package/src/core/cli.d.ts +8 -0
- package/src/core/cli.js +23 -0
- package/src/core/cli.js.map +1 -0
- package/src/core/colors.js.map +1 -0
- package/src/core/help.d.ts +7 -0
- package/src/core/help.js +83 -0
- package/src/core/help.js.map +1 -0
- package/src/core/index.d.ts +7 -0
- package/src/core/index.js +22 -0
- package/src/core/index.js.map +1 -0
- package/src/core/program.d.ts +2 -0
- package/src/core/program.js +23 -0
- package/src/core/program.js.map +1 -0
- package/src/core/tsconfig.js.map +1 -0
- package/src/{version.js → core/version.js} +1 -1
- package/src/core/version.js.map +1 -0
- package/src/index.d.ts +1 -1
- package/src/index.js +2 -5
- package/src/index.js.map +1 -1
- package/src/{utils → shared}/env.js +2 -2
- package/src/shared/env.js.map +1 -0
- package/src/{utils → shared}/fs.js +2 -2
- package/src/shared/fs.js.map +1 -0
- package/src/shared/index.d.ts +3 -0
- package/src/shared/index.js +14 -0
- package/src/shared/index.js.map +1 -0
- package/src/shared/prompts.js.map +1 -0
- package/src/args.js.map +0 -1
- package/src/cli.d.ts +0 -5
- package/src/cli.js +0 -241
- package/src/cli.js.map +0 -1
- package/src/colors.js.map +0 -1
- package/src/commands/configure.js.map +0 -1
- package/src/commands/create.js.map +0 -1
- package/src/commands/dev.js.map +0 -1
- package/src/commands/doctor.js.map +0 -1
- package/src/commands/inspector.js.map +0 -1
- package/src/commands/install/index.js.map +0 -1
- package/src/commands/install/registry.js.map +0 -1
- package/src/commands/install/sources/git.js.map +0 -1
- package/src/commands/install/types.js.map +0 -1
- package/src/commands/list.js.map +0 -1
- package/src/commands/logs.js.map +0 -1
- package/src/commands/restart.js.map +0 -1
- package/src/commands/service.js.map +0 -1
- package/src/commands/socket.js.map +0 -1
- package/src/commands/start.js.map +0 -1
- package/src/commands/status.js.map +0 -1
- package/src/commands/stop.js.map +0 -1
- package/src/commands/template.d.ts +0 -13
- package/src/commands/template.js +0 -193
- package/src/commands/template.js.map +0 -1
- package/src/commands/test.js.map +0 -1
- package/src/commands/uninstall.js.map +0 -1
- package/src/pm/index.d.ts +0 -9
- package/src/pm/index.js.map +0 -1
- package/src/pm/pm.format.js.map +0 -1
- package/src/pm/pm.health.js.map +0 -1
- package/src/pm/pm.logs.js.map +0 -1
- package/src/pm/pm.manager.js.map +0 -1
- package/src/pm/pm.paths.js.map +0 -1
- package/src/pm/pm.pidfile.js.map +0 -1
- package/src/pm/pm.service.js.map +0 -1
- package/src/pm/pm.spawn.js.map +0 -1
- package/src/pm/pm.types.js.map +0 -1
- package/src/templates/3rd-party-integration/src/http-client.d.ts +0 -20
- package/src/templates/3rd-party-integration/src/http-client.js +0 -105
- package/src/templates/3rd-party-integration/src/http-client.js.map +0 -1
- package/src/templates/3rd-party-integration/src/mcp-http-types.d.ts +0 -63
- package/src/templates/3rd-party-integration/src/mcp-http-types.js +0 -52
- package/src/templates/3rd-party-integration/src/mcp-http-types.js.map +0 -1
- package/src/templates/3rd-party-integration/src/tools/example.list.d.ts +0 -45
- package/src/templates/3rd-party-integration/src/tools/example.list.js +0 -85
- package/src/templates/3rd-party-integration/src/tools/example.list.js.map +0 -1
- package/src/tsconfig.js.map +0 -1
- package/src/utils/env.js.map +0 -1
- package/src/utils/fs.js.map +0 -1
- package/src/utils/prompts.js.map +0 -1
- package/src/version.js.map +0 -1
- /package/src/commands/{doctor.d.ts → dev/doctor.d.ts} +0 -0
- /package/src/commands/{inspector.d.ts → dev/inspector.d.ts} +0 -0
- /package/src/commands/{install → package}/questionnaire.d.ts +0 -0
- /package/src/commands/{install → package}/registry.d.ts +0 -0
- /package/src/commands/{install → package}/sources/git.d.ts +0 -0
- /package/src/commands/{install → package}/sources/local.d.ts +0 -0
- /package/src/commands/{install → package}/sources/local.js +0 -0
- /package/src/commands/{install → package}/sources/npm.d.ts +0 -0
- /package/src/commands/{install → package}/sources/npm.js +0 -0
- /package/src/{pm/pm.health.d.ts → commands/pm/health.d.ts} +0 -0
- /package/src/{pm/pm.logs.d.ts → commands/pm/log-utils.d.ts} +0 -0
- /package/src/{pm/pm.types.d.ts → commands/pm/types.d.ts} +0 -0
- /package/src/commands/{create.d.ts → scaffold/create.d.ts} +0 -0
- /package/src/{colors.d.ts → core/colors.d.ts} +0 -0
- /package/src/{colors.js → core/colors.js} +0 -0
- /package/src/{tsconfig.d.ts → core/tsconfig.d.ts} +0 -0
- /package/src/{tsconfig.js → core/tsconfig.js} +0 -0
- /package/src/{version.d.ts → core/version.d.ts} +0 -0
- /package/src/{utils → shared}/env.d.ts +0 -0
- /package/src/{utils → shared}/fs.d.ts +0 -0
- /package/src/{utils → shared}/prompts.d.ts +0 -0
- /package/src/{utils → shared}/prompts.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-cli-entry.js","sourceRoot":"","sources":["../../../../../../src/commands/build/exec/cli-runtime/generate-cli-entry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generates the CLI entry point TypeScript/JavaScript source code.\n * This creates a commander.js-based CLI where each MCP tool is a subcommand.\n */\n\nimport { CliConfig, OAuthConfig } from '../config';\nimport { ExtractedSchema, ExtractedTool, ExtractedPrompt, ExtractedResourceTemplate, ExtractedCapabilities, ExtractedJob, SYSTEM_TOOL_NAMES } from './schema-extractor';\nimport { schemaToCommander, generateOptionCode, camelToKebab } from './schema-to-commander';\n\nexport const RESERVED_COMMANDS = new Set([\n 'resource', 'template', 'prompt', 'subscribe',\n 'login', 'logout', 'connect', 'serve', 'daemon',\n 'doctor', 'install', 'uninstall', 'sessions', 'help', 'version',\n 'skills', 'job', 'workflow',\n]);\n\nexport interface CliEntryOptions {\n appName: string;\n appVersion: string;\n description: string;\n serverBundleFilename: string;\n outputDefault: 'text' | 'json';\n authRequired: boolean;\n excludeTools: string[];\n nativeDeps: NonNullable<CliConfig['nativeDeps']>;\n schema: ExtractedSchema;\n oauthConfig?: OAuthConfig;\n /** When true, generate static requires that esbuild can resolve (for SEA builds). */\n selfContained?: boolean;\n}\n\n/**\n * Resolve tool command name, appending '-tool' suffix if it conflicts with a built-in command.\n * Returns { cmdName, wasRenamed } so the caller can log a warning at build time.\n */\nexport function resolveToolCommandName(toolName: string): { cmdName: string; wasRenamed: boolean } {\n const cmdName = camelToKebab(toolName).replace(/_/g, '-');\n if (RESERVED_COMMANDS.has(cmdName)) {\n return { cmdName: `${cmdName}-tool`, wasRenamed: true };\n }\n return { cmdName, wasRenamed: false };\n}\n\n/**\n * Generate the CLI entry source code (CJS module).\n */\nexport function generateCliEntry(options: CliEntryOptions): string {\n const {\n appName,\n appVersion,\n description,\n serverBundleFilename,\n outputDefault,\n schema,\n excludeTools,\n oauthConfig,\n authRequired,\n } = options;\n\n const capabilities = schema.capabilities;\n\n const filteredTools = schema.tools.filter(\n (t) => !excludeTools.includes(t.name) && !SYSTEM_TOOL_NAMES.has(t.name),\n );\n\n const selfContained = !!options.selfContained;\n\n const sections: string[] = [\n generateHeader(appName, appVersion, description, serverBundleFilename, outputDefault, authRequired, capabilities, oauthConfig, selfContained),\n generateToolCommands(filteredTools, appName),\n generateResourceCommands(schema),\n generateTemplateCommands(schema.resourceTemplates),\n generatePromptCommands(schema.prompts),\n capabilities.skills ? generateSkillsCommands() : '',\n capabilities.jobs ? generateJobCommands(schema.jobs) : '',\n capabilities.workflows ? generateWorkflowCommands() : '',\n generateSubscribeCommands(),\n ...(authRequired ? [\n generateLoginCommand(appName, oauthConfig),\n generateLogoutCommand(appName),\n generateSessionCommands(),\n ] : []),\n generateServeCommand(serverBundleFilename),\n generateDoctorCommand(appName, options.nativeDeps),\n generateInstallCommand(appName, options.nativeDeps, selfContained),\n generateDaemonCommands(appName, serverBundleFilename),\n generateFooter(),\n ];\n\n return sections.filter(Boolean).join('\\n\\n');\n}\n\nfunction generateHeader(\n appName: string,\n appVersion: string,\n description: string,\n serverBundleFilename: string,\n outputDefault: string,\n authRequired: boolean,\n capabilities: ExtractedCapabilities,\n oauthConfig?: OAuthConfig,\n selfContained?: boolean,\n): string {\n const hasOAuth = !!oauthConfig;\n\n // Build the group routing map dynamically\n const skillsRouting = capabilities.skills ? `\\n else if (name === 'skills') groups['Skills'].push(sub);` : '';\n const jobsRouting = capabilities.jobs ? `\\n else if (name === 'job') groups['Jobs'].push(sub);` : '';\n const workflowsRouting = capabilities.workflows ? `\\n else if (name === 'workflow') groups['Workflows'].push(sub);` : '';\n const authRouting = authRequired ? `\\n else if (['login', 'logout', 'sessions', 'connect'].indexOf(name) !== -1) groups['Auth'].push(sub);` : '';\n\n // Build the groups object dynamically\n const groupEntries: string[] = [\n ` 'Tools': []`,\n ` 'Resources & Prompts': []`,\n ];\n if (capabilities.skills) groupEntries.push(` 'Skills': []`);\n if (capabilities.jobs) groupEntries.push(` 'Jobs': []`);\n if (capabilities.workflows) groupEntries.push(` 'Workflows': []`);\n if (authRequired) groupEntries.push(` 'Auth': []`);\n groupEntries.push(` 'Subscriptions': []`);\n groupEntries.push(` 'System': []`);\n\n return `'use strict';\n\nvar { Command, Option } = require('commander');\nvar path = require('path');\nvar fs = require('fs');\nvar os = require('os');\nvar fmt = require('./output-formatter');\n${authRequired ? \"var sessions = require('./session-manager');\\nvar creds = require('./credential-store');\" : ''}\n${hasOAuth ? \"var oauthHelper = require('./oauth-helper');\" : ''}\n\nvar APP_NAME = ${JSON.stringify(appName)};\nvar SCRIPT_DIR = __dirname;\nvar FRONTMCP_HOME = process.env.FRONTMCP_HOME || path.join(os.homedir(), '.frontmcp');\n${selfContained\n ? `// Self-contained: server bundle and SDK are inlined by esbuild\nvar SERVER_BUNDLE = '../${serverBundleFilename}';`\n : `var SERVER_BUNDLE = path.join(SCRIPT_DIR, ${JSON.stringify(serverBundleFilename)});`}\n\nvar _client = null;\nasync function getClient() {\n if (_client) return _client;\n\n // Try daemon first — Unix socket HTTP (~5-15ms vs ~420ms in-process)\n var socketPath = path.join(FRONTMCP_HOME, 'sockets', APP_NAME + '.sock');\n if (fs.existsSync(socketPath)) {\n try {\n var daemonClient = require('./daemon-client');\n var dc = daemonClient.createDaemonClient(socketPath);\n await dc.ping();\n _client = dc;\n return _client;\n } catch (_) { /* daemon not available, fall through */ }\n }\n\n // Fallback: in-process connect (with CLI mode for faster init)\n var mod = require(${selfContained ? `'../${serverBundleFilename}'` : 'SERVER_BUNDLE'});\n var configOrClass = mod.default || mod;\n var sdk = require('@frontmcp/sdk');\n var connect = sdk.connect || sdk.direct.connect;${authRequired ? `\n var sessionName = sessions.getActiveSessionName();\n var store = creds.createCredentialStore();\n var credBlob = await store.get(sessionName);\n var connectOpts = credBlob ? { authToken: credBlob.token, mode: 'cli' } : { mode: 'cli' };\n _client = await connect(configOrClass, connectOpts);` : `\n _client = await connect(configOrClass, { mode: 'cli' });`}\n return _client;\n}\n\nvar program = new Command();\nprogram\n .name(${JSON.stringify(appName)})\n .version(${JSON.stringify(appVersion)})\n .description(${JSON.stringify(description || `${appName} CLI`)})\n .option('--output <mode>', 'Output format: text or json', ${JSON.stringify(outputDefault)});\n\nprogram.configureHelp({\n sortSubcommands: false,\n formatHelp: function(cmd, helper) {\n var groups = {\n${groupEntries.join(',\\n')}\n };\n var toolCmdNames = cmd._toolCommandNames || [];\n cmd.commands.forEach(function(sub) {\n var name = sub.name();\n if (toolCmdNames.indexOf(name) !== -1) groups['Tools'].push(sub);\n else if (['resource', 'template', 'prompt'].indexOf(name) !== -1) groups['Resources & Prompts'].push(sub);${skillsRouting}${jobsRouting}${workflowsRouting}${authRouting}\n else if (name === 'subscribe') groups['Subscriptions'].push(sub);\n else groups['System'].push(sub);\n });\n var termWidth = helper.padWidth(cmd, helper);\n var lines = [];\n lines.push('Usage: ' + helper.commandUsage(cmd));\n lines.push('');\n var desc = helper.commandDescription(cmd);\n if (desc) { lines.push(desc); lines.push(''); }\n var globalOpts = helper.formatHelp ? helper.visibleOptions(cmd) : [];\n if (globalOpts.length > 0) {\n lines.push('Options:');\n globalOpts.forEach(function(opt) {\n lines.push(' ' + helper.optionTerm(opt).padEnd(termWidth) + ' ' + helper.optionDescription(opt));\n });\n lines.push('');\n }\n Object.keys(groups).forEach(function(groupName) {\n var cmds = groups[groupName];\n if (cmds.length === 0) return;\n lines.push(groupName + ':');\n cmds.forEach(function(sub) {\n lines.push(' ' + helper.subcommandTerm(sub).padEnd(termWidth) + ' ' + helper.subcommandDescription(sub));\n });\n lines.push('');\n });\n return lines.join('\\\\n');\n }\n});\n\nprogram.action(function() { program.outputHelp(); });`;\n}\n\nfunction generateToolCommands(tools: ExtractedTool[], appName: string): string {\n if (tools.length === 0) return '// No tools extracted\\nprogram._toolCommandNames = [];';\n\n const cmdNames: string[] = [];\n const commands = tools.map((tool) => {\n const { cmdName } = resolveToolCommandName(tool.name);\n cmdNames.push(cmdName);\n const { options } = schemaToCommander(tool.inputSchema);\n const optionLines = options.map((o) => ` ${generateOptionCode(o)}`).join('\\n');\n\n return `program\n .command(${JSON.stringify(cmdName)})\n .description(${JSON.stringify(tool.description)})\n${optionLines}\n .action(async function(opts) {\n try {\n var client = await getClient();\n var args = {};\n var rawOpts = this.opts();\n ${generateArgMapping(tool)}\n var result = await client.callTool(${JSON.stringify(tool.name)}, args);\n var mode = program.opts().output || ${JSON.stringify('text')};\n console.log(fmt.formatToolResult(result, mode));\n } catch (err) {\n var meta = err && err._meta ? err._meta : (err && err.data && err.data._meta ? err.data._meta : null);\n if (meta && meta.authorization_required) {\n console.error('Authorization required' + (meta.app ? ' for ' + meta.app : ''));\n if (meta.auth_url) console.error('Authorize at: ' + meta.auth_url);\n console.error('Or run: ' + ${JSON.stringify(appName)} + ' login');\n } else {\n console.error('Error:', err.message || err);\n }\n process.exitCode = 1;\n }\n });`;\n });\n\n return `program._toolCommandNames = ${JSON.stringify(cmdNames)};\\n\\n${commands.join('\\n\\n')}`;\n}\n\nfunction generateArgMapping(tool: ExtractedTool): string {\n const props = (tool.inputSchema as Record<string, unknown>).properties as Record<string, Record<string, unknown>> | undefined;\n if (!props) return '';\n\n const mappings = Object.keys(props).map((propName) => {\n const propSchema = props[propName];\n const kebab = camelToKebab(propName);\n // Commander converts kebab-case flags to camelCase in opts()\n const camel = kebabToCamel(kebab);\n\n // Resolve type for object detection\n let propType = propSchema?.type as string | string[] | undefined;\n if (Array.isArray(propType)) {\n propType = propType.find((t: string) => t !== 'null') || propType[0];\n }\n\n if (propType === 'object') {\n return `if (rawOpts[${JSON.stringify(camel)}] !== undefined) {\n try { args[${JSON.stringify(propName)}] = JSON.parse(rawOpts[${JSON.stringify(camel)}]); }\n catch (_jsonErr) { console.error('Invalid JSON for --${kebab}'); process.exitCode = 1; return; }\n }`;\n }\n\n return `if (rawOpts[${JSON.stringify(camel)}] !== undefined) args[${JSON.stringify(propName)}] = rawOpts[${JSON.stringify(camel)}];`;\n });\n\n return mappings.join('\\n ');\n}\n\nfunction generateJobArgMapping(inputSchema: Record<string, unknown>): string {\n const props = (inputSchema as Record<string, unknown>).properties as Record<string, Record<string, unknown>> | undefined;\n if (!props) return '';\n\n const mappings = Object.keys(props).map((propName) => {\n const propSchema = props[propName];\n const kebab = camelToKebab(propName);\n const camel = kebabToCamel(kebab);\n\n let propType = propSchema?.type as string | string[] | undefined;\n if (Array.isArray(propType)) {\n propType = propType.find((t: string) => t !== 'null') || propType[0];\n }\n\n if (propType === 'object') {\n return `if (rawOpts[${JSON.stringify(camel)}] !== undefined) {\n try { input[${JSON.stringify(propName)}] = JSON.parse(rawOpts[${JSON.stringify(camel)}]); }\n catch (_jsonErr) { console.error('Invalid JSON for --${kebab}'); process.exitCode = 1; return; }\n }`;\n }\n\n return `if (rawOpts[${JSON.stringify(camel)}] !== undefined) input[${JSON.stringify(propName)}] = rawOpts[${JSON.stringify(camel)}];`;\n });\n\n return mappings.join('\\n ');\n}\n\nfunction generateResourceCommands(_schema: ExtractedSchema): string {\n return `var resourceCmd = program.command('resource').description('Resource operations');\n\nresourceCmd\n .command('list')\n .description('List available resources')\n .action(async function() {\n try {\n var client = await getClient();\n var result = await client.listResources();\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n var resources = result.resources || [];\n if (resources.length === 0) { console.log('No resources available.'); return; }\n resources.forEach(function(r) {\n console.log(' ' + r.uri + (r.description ? ' - ' + r.description : ''));\n });\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\nresourceCmd\n .command('read <uri>')\n .description('Read a resource by URI')\n .action(async function(uri) {\n try {\n var client = await getClient();\n var result = await client.readResource(uri);\n var mode = program.opts().output || 'text';\n console.log(fmt.formatResourceResult(result, mode));\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n}\n\nfunction generateTemplateCommands(templates: ExtractedResourceTemplate[]): string {\n if (!templates || templates.length === 0) return '// No resource templates extracted';\n\n const subcommands = templates.map((tmpl) => {\n const cmdName = camelToKebab(tmpl.name).replace(/_/g, '-');\n // Extract {param} placeholders from URI template\n const paramNames = extractTemplateParams(tmpl.uriTemplate);\n const optionLines = paramNames\n .map((p) => ` .requiredOption('--${camelToKebab(p)} <value>', 'Template parameter: ${p}')`)\n .join('\\n');\n\n const paramMapping = paramNames\n .map((p) => {\n const camel = kebabToCamel(camelToKebab(p));\n return `uri = uri.replace('{${p}}', encodeURIComponent(rawOpts[${JSON.stringify(camel)}]));`;\n })\n .join('\\n ');\n\n return `templateCmd\n .command(${JSON.stringify(cmdName)})\n .description(${JSON.stringify(tmpl.description || `Read resource from template: ${tmpl.uriTemplate}`)})\n${optionLines}\n .action(async function(opts) {\n try {\n var client = await getClient();\n var rawOpts = this.opts();\n var uri = ${JSON.stringify(tmpl.uriTemplate)};\n ${paramMapping}\n var result = await client.readResource(uri);\n var mode = program.opts().output || 'text';\n console.log(fmt.formatResourceResult(result, mode));\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n });\n\n return `var templateCmd = program.command('template').description('Resource template operations');\n\ntemplateCmd\n .command('list')\n .description('List available resource templates')\n .action(async function() {\n try {\n var client = await getClient();\n var result = await client.listResourceTemplates();\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n var templates = result.resourceTemplates || [];\n if (templates.length === 0) { console.log('No resource templates available.'); return; }\n templates.forEach(function(t) {\n console.log(' ' + t.uriTemplate + (t.description ? ' - ' + t.description : ''));\n });\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\n${subcommands.join('\\n\\n')}`;\n}\n\nfunction generatePromptCommands(prompts: ExtractedPrompt[]): string {\n const subcommands = prompts.map((prompt) => {\n const cmdName = camelToKebab(prompt.name).replace(/_/g, '-');\n const argOptions = (prompt.arguments || [])\n .map((a) => {\n const flag = `--${camelToKebab(a.name)} <value>`;\n const desc = a.description || '';\n return a.required\n ? ` .requiredOption('${flag}', '${escapeStr(desc)}')`\n : ` .option('${flag}', '${escapeStr(desc)}')`;\n })\n .join('\\n');\n\n return `promptCmd\n .command(${JSON.stringify(cmdName)})\n .description(${JSON.stringify(prompt.description || '')})\n${argOptions}\n .action(async function(opts) {\n try {\n var client = await getClient();\n var args = {};\n var rawOpts = this.opts();\n ${(prompt.arguments || []).map((a) => {\n const camel = kebabToCamel(camelToKebab(a.name));\n return `if (rawOpts[${JSON.stringify(camel)}] !== undefined) args[${JSON.stringify(a.name)}] = rawOpts[${JSON.stringify(camel)}];`;\n }).join('\\n ')}\n var result = await client.getPrompt(${JSON.stringify(prompt.name)}, args);\n var mode = program.opts().output || 'text';\n console.log(fmt.formatPromptResult(result, mode));\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n });\n\n return `var promptCmd = program.command('prompt').description('Prompt operations');\n\npromptCmd\n .command('list')\n .description('List available prompts')\n .action(async function() {\n try {\n var client = await getClient();\n var result = await client.listPrompts();\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n var prompts = result.prompts || [];\n if (prompts.length === 0) { console.log('No prompts available.'); return; }\n prompts.forEach(function(p) {\n console.log(' ' + p.name + (p.description ? ' - ' + p.description : ''));\n });\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\n${subcommands.join('\\n\\n')}`;\n}\n\nfunction generateSkillsCommands(): string {\n return `var skillsCmd = program.command('skills').description('Skill operations');\n\nskillsCmd\n .command('search [query]')\n .description('Search for skills')\n .action(async function(query) {\n try {\n var client = await getClient();\n var result = await client.searchSkills(query || '');\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n var skills = result.skills || result || [];\n if (Array.isArray(skills) && skills.length === 0) { console.log('No skills found.'); return; }\n if (Array.isArray(skills)) {\n skills.forEach(function(s) {\n console.log(' ' + (s.name || s.id || JSON.stringify(s)));\n });\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\nskillsCmd\n .command('load <ids...>')\n .description('Load skills by ID')\n .action(async function(ids) {\n try {\n var client = await getClient();\n var result = await client.loadSkills(ids);\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log('Loaded ' + ids.length + ' skill(s).');\n if (result && typeof result === 'object') {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\nskillsCmd\n .command('list')\n .description('List available skills')\n .action(async function() {\n try {\n var client = await getClient();\n var result = await client.listSkills();\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n var skills = result.skills || result || [];\n if (Array.isArray(skills) && skills.length === 0) { console.log('No skills available.'); return; }\n if (Array.isArray(skills)) {\n skills.forEach(function(s) {\n console.log(' ' + (s.name || s.id || JSON.stringify(s)));\n });\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n}\n\nfunction generateJobCommands(jobs: ExtractedJob[]): string {\n // Generate typed 'run' subcommands for each known job\n const runSubcommands = jobs.map((job) => {\n const jobCmdName = camelToKebab(job.name).replace(/_/g, '-');\n\n if (job.inputSchema) {\n const { options } = schemaToCommander(job.inputSchema);\n const optionLines = options.map((o) => ` ${generateOptionCode(o)}`).join('\\n');\n const argMapping = generateJobArgMapping(job.inputSchema);\n\n return `jobRunCmd\n .command(${JSON.stringify(jobCmdName)})\n .description(${JSON.stringify(job.description || `Run the ${job.name} job`)})\n${optionLines}\n .option('--background', 'Run in background mode')\n .action(async function(opts) {\n try {\n var client = await getClient();\n var input = {};\n var rawOpts = this.opts();\n ${argMapping}\n var result = await client.executeJob(${JSON.stringify(job.name)}, input, { background: !!rawOpts.background });\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (rawOpts.background && result && result.runId) {\n console.log('Job started. Run ID: ' + result.runId);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n }\n\n // No inputSchema — fall back to generic --input <json>\n return `jobRunCmd\n .command(${JSON.stringify(jobCmdName)})\n .description(${JSON.stringify(job.description || `Run the ${job.name} job`)})\n .option('--input <json>', 'Job input as JSON string')\n .option('--background', 'Run in background mode')\n .action(async function(opts) {\n try {\n var client = await getClient();\n var input = {};\n if (opts.input) {\n try { input = JSON.parse(opts.input); }\n catch (_) { console.error('Invalid JSON for --input'); process.exitCode = 1; return; }\n }\n var result = await client.executeJob(${JSON.stringify(job.name)}, input, { background: !!opts.background });\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (opts.background && result && result.runId) {\n console.log('Job started. Run ID: ' + result.runId);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n });\n\n // Generic fallback 'run' for jobs not known at build time\n const genericRun = `jobRunCmd\n .command('_run <name>')\n .description('Run a job by name (generic)')\n .option('--input <json>', 'Job input as JSON string')\n .option('--background', 'Run in background mode')\n .action(async function(name, opts) {\n try {\n var client = await getClient();\n var input = {};\n if (opts.input) {\n try { input = JSON.parse(opts.input); }\n catch (_) { console.error('Invalid JSON for --input'); process.exitCode = 1; return; }\n }\n var result = await client.executeJob(name, input, { background: !!opts.background });\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (opts.background && result && result.runId) {\n console.log('Job started. Run ID: ' + result.runId);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n\n return `var jobCmd = program.command('job').description('Job operations');\n\njobCmd\n .command('list')\n .description('List available jobs')\n .action(async function() {\n try {\n var client = await getClient();\n var result = await client.listJobs();\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n var jobs = result.jobs || result || [];\n if (Array.isArray(jobs) && jobs.length === 0) { console.log('No jobs available.'); return; }\n if (Array.isArray(jobs)) {\n jobs.forEach(function(j) {\n console.log(' ' + (j.name || j.id || JSON.stringify(j)));\n });\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\nvar jobRunCmd = jobCmd.command('run').description('Run a job');\n\n${runSubcommands.join('\\n\\n')}\n\n${jobs.length > 0 ? genericRun : `jobRunCmd\n .argument('<name>', 'Job name')\n .option('--input <json>', 'Job input as JSON string')\n .option('--background', 'Run in background mode')\n .action(async function(name, opts) {\n try {\n var client = await getClient();\n var input = {};\n if (opts.input) {\n try { input = JSON.parse(opts.input); }\n catch (_) { console.error('Invalid JSON for --input'); process.exitCode = 1; return; }\n }\n var result = await client.executeJob(name, input, { background: !!opts.background });\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (opts.background && result && result.runId) {\n console.log('Job started. Run ID: ' + result.runId);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`}\n\njobCmd\n .command('status <runId>')\n .description('Get the status of a job run')\n .action(async function(runId) {\n try {\n var client = await getClient();\n var result = await client.getJobStatus(runId);\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log('Status: ' + (result.status || JSON.stringify(result)));\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n}\n\nfunction generateWorkflowCommands(): string {\n return `var workflowCmd = program.command('workflow').description('Workflow operations');\n\nworkflowCmd\n .command('list')\n .description('List available workflows')\n .action(async function() {\n try {\n var client = await getClient();\n var result = await client.listWorkflows();\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n var workflows = result.workflows || result || [];\n if (Array.isArray(workflows) && workflows.length === 0) { console.log('No workflows available.'); return; }\n if (Array.isArray(workflows)) {\n workflows.forEach(function(w) {\n console.log(' ' + (w.name || w.id || JSON.stringify(w)));\n });\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\nworkflowCmd\n .command('run <name>')\n .description('Run a workflow by name')\n .option('--input <json>', 'Workflow input as JSON string')\n .option('--background', 'Run in background mode')\n .action(async function(name, opts) {\n try {\n var client = await getClient();\n var input = {};\n if (opts.input) {\n try { input = JSON.parse(opts.input); }\n catch (_) { console.error('Invalid JSON for --input'); process.exitCode = 1; return; }\n }\n var result = await client.executeWorkflow(name, input, { background: !!opts.background });\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (opts.background && result && result.runId) {\n console.log('Workflow started. Run ID: ' + result.runId);\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\nworkflowCmd\n .command('status <runId>')\n .description('Get the status of a workflow run')\n .action(async function(runId) {\n try {\n var client = await getClient();\n var result = await client.getWorkflowStatus(runId);\n var mode = program.opts().output || 'text';\n if (mode === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log('Status: ' + (result.status || JSON.stringify(result)));\n }\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n}\n\nfunction generateSubscribeCommands(): string {\n return `var subscribeCmd = program.command('subscribe').description('Subscribe to updates');\n\nsubscribeCmd\n .command('resource <uri>')\n .description('Stream resource updates (Ctrl+C to stop)')\n .action(async function(uri) {\n try {\n var client = await getClient();\n await client.subscribeResource(uri);\n var mode = program.opts().output || 'text';\n console.log('Subscribed to resource: ' + uri);\n console.log('Waiting for updates... (Ctrl+C to stop)\\\\n');\n client.onResourceUpdated(function(uri) {\n console.log(fmt.formatSubscriptionEvent({ type: 'resource_updated', uri: uri, timestamp: new Date().toISOString() }, mode));\n });\n process.on('SIGINT', async function() {\n console.log('\\\\nUnsubscribing...');\n try { await client.unsubscribeResource(uri); } catch (_) { /* ok */ }\n process.exit(0);\n });\n // Keep process alive\n await new Promise(function() {});\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });\n\nsubscribeCmd\n .command('notification <name>')\n .description('Stream notifications (Ctrl+C to stop)')\n .action(async function(name) {\n try {\n var client = await getClient();\n var mode = program.opts().output || 'text';\n console.log('Listening for notification: ' + name);\n console.log('Waiting for events... (Ctrl+C to stop)\\\\n');\n client.onNotification(function(notification) {\n if (notification.method === name || name === '*') {\n console.log(fmt.formatSubscriptionEvent({ type: 'notification', method: notification.method, params: notification.params, timestamp: new Date().toISOString() }, mode));\n }\n });\n process.on('SIGINT', function() {\n console.log('\\\\nStopping...');\n process.exit(0);\n });\n // Keep process alive\n await new Promise(function() {});\n } catch (err) {\n console.error('Error:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n}\n\nfunction generateLoginCommand(appName: string, oauthConfig?: OAuthConfig): string {\n const serverUrl = oauthConfig?.serverUrl || '';\n const clientId = oauthConfig?.clientId || appName;\n const defaultScope = oauthConfig?.defaultScope || '';\n const portStart = oauthConfig?.portRange?.[0] ?? 17830;\n const portEnd = oauthConfig?.portRange?.[1] ?? 17850;\n const timeout = oauthConfig?.timeout ?? 120000;\n\n return `program\n .command('login')\n .description('Authenticate via OAuth')\n .option('--server <url>', 'Server URL for OAuth'${serverUrl ? `, ${JSON.stringify(serverUrl)}` : ''})\n .option('--session <name>', 'Session name', 'default')\n .option('--scope <scopes>', 'OAuth scopes'${defaultScope ? `, ${JSON.stringify(defaultScope)}` : ''})\n .option('--no-browser', 'Print URL instead of opening browser')\n .action(async function(opts) {\n var serverUrl = opts.server || process.env.FRONTMCP_SERVER_URL || ${JSON.stringify(serverUrl)};\n if (!serverUrl) {\n console.error('Server URL required. Use --server <url> or set FRONTMCP_SERVER_URL.');\n process.exitCode = 1;\n return;\n }\n try {\n var oauthHelper = require('./oauth-helper');\n var result = await oauthHelper.startOAuthLogin({\n serverUrl: serverUrl,\n clientId: ${JSON.stringify(clientId)},\n scope: opts.scope || ${JSON.stringify(defaultScope)},\n portStart: ${portStart},\n portEnd: ${portEnd},\n timeout: ${timeout},\n noBrowser: !opts.browser\n });\n var sessionName = opts.session || 'default';\n var store = creds.createCredentialStore();\n await store.set(sessionName, result);\n sessions.getOrCreateSession(sessionName);\n console.log('Logged in successfully. Session: ' + sessionName);\n } catch (err) {\n console.error('Login failed:', err.message || err);\n process.exitCode = 1;\n }\n });`;\n}\n\nfunction generateLogoutCommand(_appName: string): string {\n return `program\n .command('logout')\n .description('Clear stored credentials')\n .option('--session <name>', 'Session to log out')\n .option('--all', 'Log out of all sessions')\n .action(async function(opts) {\n var store = creds.createCredentialStore();\n if (opts.all) {\n var allSessions = await store.list();\n for (var i = 0; i < allSessions.length; i++) {\n await store.delete(allSessions[i]);\n }\n console.log('Logged out of ' + allSessions.length + ' session(s).');\n } else {\n var sessionName = opts.session || sessions.getActiveSessionName();\n await store.delete(sessionName);\n console.log('Logged out of session: ' + sessionName);\n }\n });`;\n}\n\nfunction generateSessionCommands(): string {\n return `var sessionsCmd = program.command('sessions').description('Session management');\n\nsessionsCmd\n .command('list')\n .description('List all sessions')\n .action(function() {\n var list = sessions.listSessions();\n if (list.length === 0) { console.log('No sessions.'); return; }\n list.forEach(function(s) {\n var marker = s.isActive ? ' (active)' : '';\n console.log(' ' + s.name + marker + ' - last used: ' + s.lastUsedAt);\n });\n });\n\nsessionsCmd\n .command('switch <name>')\n .description('Switch to a named session')\n .action(function(name) {\n sessions.switchSession(name);\n console.log('Switched to session: ' + name);\n });\n\nsessionsCmd\n .command('delete <name>')\n .description('Delete a session')\n .action(async function(name) {\n var store = creds.createCredentialStore();\n await store.delete(name);\n sessions.deleteSession(name);\n console.log('Deleted session: ' + name);\n });\n\nprogram\n .command('connect')\n .description('Authenticate and store credentials')\n .option('--session <name>', 'Session name', 'default')\n .option('--token <token>', 'Auth token (or pass via stdin)')\n .action(async function(opts) {\n var sessionName = opts.session || 'default';\n var token = opts.token;\n if (!token) {\n console.log('Usage: ' + program.name() + ' connect --token <your-token>');\n console.log(' Or pipe token: echo \"tok_xxx\" | ' + program.name() + ' connect');\n process.exitCode = 1;\n return;\n }\n var store = creds.createCredentialStore();\n await store.set(sessionName, { token: token });\n sessions.getOrCreateSession(sessionName);\n console.log('Credentials stored for session: ' + sessionName);\n });`;\n}\n\nfunction generateServeCommand(serverBundleFilename: string): string {\n return `program\n .command('serve')\n .description('Start the HTTP/SSE server')\n .option('-p, --port <port>', 'Port number', function(v) { return parseInt(v, 10); })\n .action(async function(opts) {\n var mod = require(path.join(SCRIPT_DIR, ${JSON.stringify(serverBundleFilename)}));\n if (opts.port) process.env.PORT = String(opts.port);\n // The server bundle should self-start when required\n if (typeof mod.start === 'function') await mod.start();\n else if (typeof mod.default?.start === 'function') await mod.default.start();\n });`;\n}\n\nfunction generateDoctorCommand(\n appName: string,\n nativeDeps: NonNullable<CliConfig['nativeDeps']>,\n): string {\n const checks: string[] = [];\n\n if (nativeDeps.brew?.length) {\n for (const pkg of nativeDeps.brew) {\n checks.push(` { name: ${JSON.stringify(pkg)}, type: 'brew', check: 'brew list ${pkg}' }`);\n }\n }\n if (nativeDeps.apt?.length) {\n for (const pkg of nativeDeps.apt) {\n checks.push(` { name: ${JSON.stringify(pkg)}, type: 'apt', check: 'dpkg -l ${pkg}' }`);\n }\n }\n if (nativeDeps.npm?.length) {\n for (const pkg of nativeDeps.npm) {\n checks.push(` { name: ${JSON.stringify(pkg)}, type: 'npm', check: 'npm ls ${pkg}' }`);\n }\n }\n\n return `program\n .command('doctor')\n .description('Check system dependencies and configuration')\n .option('--fix', 'Attempt to install missing dependencies')\n .action(async function(opts) {\n var exec = require('child_process').execSync;\n var ok = true;\n\n // Check Node.js version\n var nodeMajor = parseInt(process.versions.node.split('.')[0], 10);\n if (nodeMajor >= 22) {\n console.log(' [ok] Node.js v' + process.versions.node);\n } else {\n console.log(' [!!] Node.js v' + process.versions.node + ' (>=22 required)');\n ok = false;\n }\n\n var deps = [\n${checks.join(',\\n')}\n ];\n\n for (var i = 0; i < deps.length; i++) {\n var dep = deps[i];\n try {\n exec(dep.check, { stdio: 'ignore' });\n console.log(' [ok] ' + dep.name + ' (' + dep.type + ')');\n } catch (_) {\n console.log(' [!!] ' + dep.name + ' (' + dep.type + ') - not found');\n ok = false;\n if (opts.fix) {\n try {\n var installCmd = dep.type === 'brew' ? 'brew install ' + dep.name\n : dep.type === 'apt' ? 'sudo apt-get install -y ' + dep.name\n : 'npm install ' + dep.name;\n console.log(' Installing: ' + installCmd);\n exec(installCmd, { stdio: 'inherit' });\n console.log(' [ok] Installed ' + dep.name);\n } catch (e) {\n console.log(' [!!] Failed to install ' + dep.name);\n }\n }\n }\n }\n\n // Check FRONTMCP_HOME directory\n var fs = require('fs');\n var appDir = require('path').join(FRONTMCP_HOME, 'apps', ${JSON.stringify(appName)});\n if (fs.existsSync(appDir)) {\n console.log(' [ok] App directory: ' + appDir);\n } else {\n console.log(' [!!] App directory not found: ' + appDir);\n ok = false;\n }\n\n if (ok) console.log('\\\\nAll checks passed.');\n else {\n console.log('\\\\nSome checks failed.' + (opts.fix ? '' : ' Run with --fix to attempt repairs.'));\n process.exitCode = 1;\n }\n });`;\n}\n\nfunction generateInstallCommand(\n appName: string,\n nativeDeps: NonNullable<CliConfig['nativeDeps']>,\n selfContained?: boolean,\n): string {\n const depEntries: string[] = [];\n if (nativeDeps.brew?.length) {\n for (const pkg of nativeDeps.brew) {\n depEntries.push(` { name: ${JSON.stringify(pkg)}, type: 'brew', install: 'brew install ${pkg}', check: 'brew list ${pkg}' }`);\n }\n }\n if (nativeDeps.npm?.length) {\n for (const pkg of nativeDeps.npm) {\n depEntries.push(` { name: ${JSON.stringify(pkg)}, type: 'npm', install: 'npm install ${pkg}', check: 'npm ls ${pkg}' }`);\n }\n }\n\n return `program\n .command('install')\n .description('Install to ~/.frontmcp/ and set up dependencies')\n .option('--prefix <path>', 'Installation prefix directory')\n .option('--bin-dir <path>', 'Directory for symlink (default: ~/.local/bin or /usr/local/bin)')\n .action(async function(opts) {\n var fs = require('fs');\n var pathMod = require('path');\n var os = require('os');\n var exec = require('child_process').execSync;\n var installBase = opts.prefix || FRONTMCP_HOME;\n var appDir = pathMod.join(installBase, 'apps', ${JSON.stringify(appName)});\n var dirs = ['', '/data', '/sessions', '/credentials'].map(function(s) { return appDir + s; });\n\n console.log('Installing ${appName}...');\n dirs.forEach(function(d) { fs.mkdirSync(d, { recursive: true }); });\n\n // Copy bundle files\n var files = fs.readdirSync(SCRIPT_DIR).filter(function(f) {\n return f.endsWith('.js') || f.endsWith('.json')${selfContained ? \" || f.endsWith('-bin')\" : ''};\n });\n files.forEach(function(f) {\n fs.copyFileSync(pathMod.join(SCRIPT_DIR, f), pathMod.join(appDir, f));\n });\n console.log(' Copied ' + files.length + ' files to ' + appDir);\n\n // Install native deps\n var deps = [\n${depEntries.join(',\\n')}\n ];\n for (var i = 0; i < deps.length; i++) {\n var dep = deps[i];\n try { exec(dep.check, { stdio: 'ignore' }); }\n catch (_) {\n console.log(' [' + (i + 1) + '/' + deps.length + '] Installing ' + dep.name + ' via ' + dep.type + '...');\n try { exec(dep.install, { stdio: 'inherit' }); }\n catch (e) { console.log(' Warning: Failed to install ' + dep.name); }\n }\n }\n\n // Set execute permission on the entry point\n var entryFile = pathMod.join(appDir, ${JSON.stringify(selfContained ? `${appName}-cli-bin` : `${appName}-cli.bundle.js`)});\n try { fs.chmodSync(entryFile, 0o755); } catch (_) { /* ok */ }\n\n // Create symlink\n var binDirs = opts.binDir ? [opts.binDir] : ['/usr/local/bin', pathMod.join(os.homedir(), '.local', 'bin')];\n var linked = false;\n for (var j = 0; j < binDirs.length && !linked; j++) {\n try {\n fs.mkdirSync(binDirs[j], { recursive: true });\n var linkPath = pathMod.join(binDirs[j], ${JSON.stringify(appName)});\n try { fs.unlinkSync(linkPath); } catch (_) { /* ok */ }\n fs.symlinkSync(entryFile, linkPath);\n console.log(' Symlinked: ' + linkPath);\n linked = true;\n } catch (_) { /* try next */ }\n }\n\n console.log('\\\\nInstalled. Run: ${appName} --help');\n });\n\nprogram\n .command('uninstall')\n .description('Remove from ~/.frontmcp/ and clean up')\n .option('--prefix <path>', 'Installation prefix directory')\n .option('--bin-dir <path>', 'Directory where symlink was created')\n .action(async function(opts) {\n var fs = require('fs');\n var pathMod = require('path');\n var os = require('os');\n var uninstallBase = opts.prefix || FRONTMCP_HOME;\n var appDir = pathMod.join(uninstallBase, 'apps', ${JSON.stringify(appName)});\n\n // Remove credentials (if auth is enabled)\n if (typeof creds !== 'undefined') {\n var store = creds.createCredentialStore();\n var credSessions = await store.list();\n for (var i = 0; i < credSessions.length; i++) {\n await store.delete(credSessions[i]);\n }\n }\n\n // Remove symlink\n var binDirs = opts.binDir ? [opts.binDir] : ['/usr/local/bin', pathMod.join(os.homedir(), '.local', 'bin')];\n binDirs.forEach(function(d) {\n try { fs.unlinkSync(pathMod.join(d, ${JSON.stringify(appName)})); } catch (_) { /* ok */ }\n });\n\n // Remove app directory\n fs.rmSync(appDir, { recursive: true, force: true });\n console.log('Uninstalled ${appName}.');\n });`;\n}\n\nfunction generateDaemonCommands(appName: string, serverBundleFilename: string): string {\n return `var daemonCmd = program.command('daemon').description('Daemon management');\n\ndaemonCmd\n .command('start')\n .description('Start as a background daemon (Unix socket)')\n .option('--idle-timeout <ms>', 'Auto-stop after idle period (ms, 0 to disable)', function(v) { return parseInt(v, 10); }, 300000)\n .action(async function(opts) {\n var { spawn } = require('child_process');\n var pathMod = require('path');\n var pidDir = pathMod.join(FRONTMCP_HOME, 'pids');\n var logDir = pathMod.join(FRONTMCP_HOME, 'logs');\n var socketDir = pathMod.join(FRONTMCP_HOME, 'sockets');\n fs.mkdirSync(pidDir, { recursive: true });\n fs.mkdirSync(logDir, { recursive: true });\n fs.mkdirSync(socketDir, { recursive: true });\n\n var socketPath = pathMod.join(socketDir, ${JSON.stringify(appName)} + '.sock');\n\n // Clean up stale socket file\n try { fs.unlinkSync(socketPath); } catch (_) { /* ok */ }\n\n // Check if already running\n var pidPath = pathMod.join(pidDir, ${JSON.stringify(appName)} + '.pid');\n try {\n var existing = JSON.parse(fs.readFileSync(pidPath, 'utf8'));\n process.kill(existing.pid, 0);\n console.log('Daemon already running (PID: ' + existing.pid + ').');\n return;\n } catch (_) { /* not running, proceed */ }\n\n var env = Object.assign({}, process.env, {\n FRONTMCP_DAEMON_SOCKET: socketPath,\n FRONTMCP_DAEMON_IDLE_TIMEOUT: String(opts.idleTimeout)\n });\n\n var logPath = pathMod.join(logDir, ${JSON.stringify(appName)} + '.log');\n var out = fs.openSync(logPath, 'a');\n var err = fs.openSync(logPath, 'a');\n\n // Start the daemon using runUnixSocket via a small wrapper script\n // Always use absolute path for the server bundle (SCRIPT_DIR resolves to __dirname at runtime)\n var serverBundlePath = pathMod.join(SCRIPT_DIR, ${JSON.stringify(serverBundleFilename)});\n var daemonScript = 'var mod = require(' + JSON.stringify(serverBundlePath) + ');' +\n 'var sdk = require(\"@frontmcp/sdk\");' +\n 'var FrontMcpInstance = sdk.FrontMcpInstance || sdk.default.FrontMcpInstance;' +\n 'var config = mod.default || mod;' +\n 'FrontMcpInstance.runUnixSocket(Object.assign({}, config, { socketPath: ' + JSON.stringify(socketPath) + ' }))' +\n '.then(function() { console.log(\"Daemon listening on \" + ' + JSON.stringify(socketPath) + '); })' +\n '.catch(function(e) { console.error(\"Daemon failed:\", e); process.exit(1); });';\n\n var child = spawn('node', ['-e', daemonScript], {\n detached: true,\n stdio: ['ignore', out, err],\n env: env\n });\n\n fs.writeFileSync(pidPath, JSON.stringify({\n pid: child.pid,\n socketPath: socketPath,\n startedAt: new Date().toISOString()\n }));\n child.unref();\n\n // Wait for socket file to appear (max 5s)\n var waited = 0;\n while (!fs.existsSync(socketPath) && waited < 5000) {\n await new Promise(function(r) { setTimeout(r, 100); });\n waited += 100;\n }\n\n if (fs.existsSync(socketPath)) {\n console.log('Daemon started (PID: ' + child.pid + '). Socket: ' + socketPath);\n console.log('Logs: ' + logPath);\n } else {\n console.log('Daemon started (PID: ' + child.pid + ') but socket not yet available.');\n console.log('Check logs: ' + logPath);\n }\n });\n\ndaemonCmd\n .command('stop')\n .description('Stop the daemon')\n .action(function() {\n var pathMod = require('path');\n var pidPath = pathMod.join(FRONTMCP_HOME, 'pids', ${JSON.stringify(appName)} + '.pid');\n try {\n var data = JSON.parse(fs.readFileSync(pidPath, 'utf8'));\n process.kill(data.pid, 'SIGTERM');\n fs.unlinkSync(pidPath);\n // Clean up socket file\n if (data.socketPath) {\n try { fs.unlinkSync(data.socketPath); } catch (_) { /* ok */ }\n }\n console.log('Daemon stopped (PID: ' + data.pid + ').');\n } catch (e) {\n console.log('No running daemon found.');\n }\n });\n\ndaemonCmd\n .command('status')\n .description('Check daemon status')\n .action(function() {\n var pathMod = require('path');\n var pidPath = pathMod.join(FRONTMCP_HOME, 'pids', ${JSON.stringify(appName)} + '.pid');\n try {\n var data = JSON.parse(fs.readFileSync(pidPath, 'utf8'));\n try {\n process.kill(data.pid, 0);\n var socketStatus = data.socketPath && fs.existsSync(data.socketPath) ? ', socket: active' : '';\n console.log('Running (PID: ' + data.pid + ', started: ' + data.startedAt + socketStatus + ')');\n } catch (_) {\n console.log('Not running (stale PID file).');\n fs.unlinkSync(pidPath);\n }\n } catch (_) { console.log('Not running.'); }\n });\n\ndaemonCmd\n .command('logs')\n .description('Tail daemon logs')\n .option('-n, --lines <n>', 'Number of lines', function(v) { return parseInt(v, 10); }, 50)\n .action(function(opts) {\n var pathMod = require('path');\n var logPath = pathMod.join(FRONTMCP_HOME, 'logs', ${JSON.stringify(appName)} + '.log');\n try {\n var content = fs.readFileSync(logPath, 'utf8');\n var lines = content.split('\\\\n');\n var start = Math.max(0, lines.length - opts.lines);\n console.log(lines.slice(start).join('\\\\n'));\n } catch (_) { console.log('No logs found.'); }\n });`;\n}\n\nfunction generateFooter(): string {\n return `program.parseAsync(process.argv).catch(function(err) {\n console.error('Fatal:', err.message || err);\n process.exit(1);\n});`;\n}\n\n/**\n * Extract {param} placeholders from a URI template string.\n */\nexport function extractTemplateParams(uriTemplate: string): string[] {\n const matches = uriTemplate.match(/\\{([^}]+)\\}/g);\n if (!matches) return [];\n return matches.map((m) => m.slice(1, -1));\n}\n\nfunction kebabToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction escapeStr(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { schemaToCommander, generateOptionCode, camelToKebab, type CommanderOption, type SchemaToCommanderResult, } from './schema-to-commander';
|
|
2
|
+
export { formatToolResult, formatResourceResult, formatPromptResult, formatSubscriptionEvent, generateOutputFormatterSource, type OutputMode, type CallToolResult, type SubscriptionEvent, } from './output-formatter';
|
|
3
|
+
export { generateCredentialStoreSource, type CredentialBlob, type CredentialStore, } from './credential-store';
|
|
4
|
+
export { generateSessionManagerSource, type SessionInfo, } from './session-manager';
|
|
5
|
+
export { extractSchemas, SYSTEM_TOOL_NAMES, type ExtractedSchema, type ExtractedTool, type ExtractedResource, type ExtractedResourceTemplate, type ExtractedPrompt, type ExtractedCapabilities, } from './schema-extractor';
|
|
6
|
+
export { generateCliEntry, resolveToolCommandName, extractTemplateParams, RESERVED_COMMANDS, type CliEntryOptions, } from './generate-cli-entry';
|
|
7
|
+
export { generateOAuthHelperSource, } from './oauth-helper';
|
|
8
|
+
export { generateDaemonClientSource, } from './daemon-client';
|
|
9
|
+
export { bundleCliWithEsbuild, type CliBundleResult, } from './cli-bundler';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bundleCliWithEsbuild = exports.generateDaemonClientSource = exports.generateOAuthHelperSource = exports.RESERVED_COMMANDS = exports.extractTemplateParams = exports.resolveToolCommandName = exports.generateCliEntry = exports.SYSTEM_TOOL_NAMES = exports.extractSchemas = exports.generateSessionManagerSource = exports.generateCredentialStoreSource = exports.generateOutputFormatterSource = exports.formatSubscriptionEvent = exports.formatPromptResult = exports.formatResourceResult = exports.formatToolResult = exports.camelToKebab = exports.generateOptionCode = exports.schemaToCommander = void 0;
|
|
4
|
+
var schema_to_commander_1 = require("./schema-to-commander");
|
|
5
|
+
Object.defineProperty(exports, "schemaToCommander", { enumerable: true, get: function () { return schema_to_commander_1.schemaToCommander; } });
|
|
6
|
+
Object.defineProperty(exports, "generateOptionCode", { enumerable: true, get: function () { return schema_to_commander_1.generateOptionCode; } });
|
|
7
|
+
Object.defineProperty(exports, "camelToKebab", { enumerable: true, get: function () { return schema_to_commander_1.camelToKebab; } });
|
|
8
|
+
var output_formatter_1 = require("./output-formatter");
|
|
9
|
+
Object.defineProperty(exports, "formatToolResult", { enumerable: true, get: function () { return output_formatter_1.formatToolResult; } });
|
|
10
|
+
Object.defineProperty(exports, "formatResourceResult", { enumerable: true, get: function () { return output_formatter_1.formatResourceResult; } });
|
|
11
|
+
Object.defineProperty(exports, "formatPromptResult", { enumerable: true, get: function () { return output_formatter_1.formatPromptResult; } });
|
|
12
|
+
Object.defineProperty(exports, "formatSubscriptionEvent", { enumerable: true, get: function () { return output_formatter_1.formatSubscriptionEvent; } });
|
|
13
|
+
Object.defineProperty(exports, "generateOutputFormatterSource", { enumerable: true, get: function () { return output_formatter_1.generateOutputFormatterSource; } });
|
|
14
|
+
var credential_store_1 = require("./credential-store");
|
|
15
|
+
Object.defineProperty(exports, "generateCredentialStoreSource", { enumerable: true, get: function () { return credential_store_1.generateCredentialStoreSource; } });
|
|
16
|
+
var session_manager_1 = require("./session-manager");
|
|
17
|
+
Object.defineProperty(exports, "generateSessionManagerSource", { enumerable: true, get: function () { return session_manager_1.generateSessionManagerSource; } });
|
|
18
|
+
var schema_extractor_1 = require("./schema-extractor");
|
|
19
|
+
Object.defineProperty(exports, "extractSchemas", { enumerable: true, get: function () { return schema_extractor_1.extractSchemas; } });
|
|
20
|
+
Object.defineProperty(exports, "SYSTEM_TOOL_NAMES", { enumerable: true, get: function () { return schema_extractor_1.SYSTEM_TOOL_NAMES; } });
|
|
21
|
+
var generate_cli_entry_1 = require("./generate-cli-entry");
|
|
22
|
+
Object.defineProperty(exports, "generateCliEntry", { enumerable: true, get: function () { return generate_cli_entry_1.generateCliEntry; } });
|
|
23
|
+
Object.defineProperty(exports, "resolveToolCommandName", { enumerable: true, get: function () { return generate_cli_entry_1.resolveToolCommandName; } });
|
|
24
|
+
Object.defineProperty(exports, "extractTemplateParams", { enumerable: true, get: function () { return generate_cli_entry_1.extractTemplateParams; } });
|
|
25
|
+
Object.defineProperty(exports, "RESERVED_COMMANDS", { enumerable: true, get: function () { return generate_cli_entry_1.RESERVED_COMMANDS; } });
|
|
26
|
+
var oauth_helper_1 = require("./oauth-helper");
|
|
27
|
+
Object.defineProperty(exports, "generateOAuthHelperSource", { enumerable: true, get: function () { return oauth_helper_1.generateOAuthHelperSource; } });
|
|
28
|
+
var daemon_client_1 = require("./daemon-client");
|
|
29
|
+
Object.defineProperty(exports, "generateDaemonClientSource", { enumerable: true, get: function () { return daemon_client_1.generateDaemonClientSource; } });
|
|
30
|
+
var cli_bundler_1 = require("./cli-bundler");
|
|
31
|
+
Object.defineProperty(exports, "bundleCliWithEsbuild", { enumerable: true, get: function () { return cli_bundler_1.bundleCliWithEsbuild; } });
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/commands/build/exec/cli-runtime/index.ts"],"names":[],"mappings":";;;AAAA,6DAM+B;AAL7B,wHAAA,iBAAiB,OAAA;AACjB,yHAAA,kBAAkB,OAAA;AAClB,mHAAA,YAAY,OAAA;AAKd,uDAS4B;AAR1B,oHAAA,gBAAgB,OAAA;AAChB,wHAAA,oBAAoB,OAAA;AACpB,sHAAA,kBAAkB,OAAA;AAClB,2HAAA,uBAAuB,OAAA;AACvB,iIAAA,6BAA6B,OAAA;AAM/B,uDAI4B;AAH1B,iIAAA,6BAA6B,OAAA;AAK/B,qDAG2B;AAFzB,+HAAA,4BAA4B,OAAA;AAI9B,uDAS4B;AAR1B,kHAAA,cAAc,OAAA;AACd,qHAAA,iBAAiB,OAAA;AASnB,2DAM8B;AAL5B,sHAAA,gBAAgB,OAAA;AAChB,4HAAA,sBAAsB,OAAA;AACtB,2HAAA,qBAAqB,OAAA;AACrB,uHAAA,iBAAiB,OAAA;AAInB,+CAEwB;AADtB,yHAAA,yBAAyB,OAAA;AAG3B,iDAEyB;AADvB,2HAAA,0BAA0B,OAAA;AAG5B,6CAGuB;AAFrB,mHAAA,oBAAoB,OAAA","sourcesContent":["export {\n schemaToCommander,\n generateOptionCode,\n camelToKebab,\n type CommanderOption,\n type SchemaToCommanderResult,\n} from './schema-to-commander';\n\nexport {\n formatToolResult,\n formatResourceResult,\n formatPromptResult,\n formatSubscriptionEvent,\n generateOutputFormatterSource,\n type OutputMode,\n type CallToolResult,\n type SubscriptionEvent,\n} from './output-formatter';\n\nexport {\n generateCredentialStoreSource,\n type CredentialBlob,\n type CredentialStore,\n} from './credential-store';\n\nexport {\n generateSessionManagerSource,\n type SessionInfo,\n} from './session-manager';\n\nexport {\n extractSchemas,\n SYSTEM_TOOL_NAMES,\n type ExtractedSchema,\n type ExtractedTool,\n type ExtractedResource,\n type ExtractedResourceTemplate,\n type ExtractedPrompt,\n type ExtractedCapabilities,\n} from './schema-extractor';\n\nexport {\n generateCliEntry,\n resolveToolCommandName,\n extractTemplateParams,\n RESERVED_COMMANDS,\n type CliEntryOptions,\n} from './generate-cli-entry';\n\nexport {\n generateOAuthHelperSource,\n} from './oauth-helper';\n\nexport {\n generateDaemonClientSource,\n} from './daemon-client';\n\nexport {\n bundleCliWithEsbuild,\n type CliBundleResult,\n} from './cli-bundler';\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth helper for CLI executables.
|
|
3
|
+
* Generates runtime module code for OAuth login/logout flows:
|
|
4
|
+
* PKCE S256, ephemeral callback server, browser launch, token exchange.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Generate the oauth-helper runtime module source for embedding in CLI bundle.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateOAuthHelperSource(appName: string): string;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OAuth helper for CLI executables.
|
|
4
|
+
* Generates runtime module code for OAuth login/logout flows:
|
|
5
|
+
* PKCE S256, ephemeral callback server, browser launch, token exchange.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateOAuthHelperSource = generateOAuthHelperSource;
|
|
9
|
+
/**
|
|
10
|
+
* Generate the oauth-helper runtime module source for embedding in CLI bundle.
|
|
11
|
+
*/
|
|
12
|
+
function generateOAuthHelperSource(appName) {
|
|
13
|
+
return `
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
var crypto = require('crypto');
|
|
17
|
+
var http = require('http');
|
|
18
|
+
var url = require('url');
|
|
19
|
+
var childProcess = require('child_process');
|
|
20
|
+
var net = require('net');
|
|
21
|
+
|
|
22
|
+
var APP_NAME = ${JSON.stringify(appName)};
|
|
23
|
+
|
|
24
|
+
function findAvailablePort(startPort, endPort) {
|
|
25
|
+
return new Promise(function(resolve, reject) {
|
|
26
|
+
var port = startPort;
|
|
27
|
+
function tryPort() {
|
|
28
|
+
if (port > endPort) {
|
|
29
|
+
reject(new Error('No available port in range ' + startPort + '-' + endPort));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
var server = net.createServer();
|
|
33
|
+
server.once('error', function() { port++; tryPort(); });
|
|
34
|
+
server.once('listening', function() { server.close(function() { resolve(port); }); });
|
|
35
|
+
server.listen(port, '127.0.0.1');
|
|
36
|
+
}
|
|
37
|
+
tryPort();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function generateCodeVerifier() {
|
|
42
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function generateCodeChallenge(verifier) {
|
|
46
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function startCallbackServer(port, timeoutMs) {
|
|
50
|
+
return new Promise(function(resolve, reject) {
|
|
51
|
+
var timer = setTimeout(function() {
|
|
52
|
+
server.close();
|
|
53
|
+
reject(new Error('OAuth callback timed out after ' + (timeoutMs / 1000) + 's'));
|
|
54
|
+
}, timeoutMs);
|
|
55
|
+
|
|
56
|
+
var server = http.createServer(function(req, res) {
|
|
57
|
+
var parsed = url.parse(req.url, true);
|
|
58
|
+
if (parsed.pathname !== '/callback') {
|
|
59
|
+
res.writeHead(404);
|
|
60
|
+
res.end('Not found');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
var code = parsed.query.code;
|
|
64
|
+
var state = parsed.query.state;
|
|
65
|
+
var error = parsed.query.error;
|
|
66
|
+
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
|
|
69
|
+
if (error) {
|
|
70
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
71
|
+
res.end('<html><body><h2>Authentication Failed</h2><p>' + error + '</p><p>You can close this window.</p></body></html>');
|
|
72
|
+
server.close();
|
|
73
|
+
reject(new Error('OAuth error: ' + error));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!code) {
|
|
78
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
79
|
+
res.end('<html><body><h2>Authentication Failed</h2><p>No authorization code received.</p><p>You can close this window.</p></body></html>');
|
|
80
|
+
server.close();
|
|
81
|
+
reject(new Error('No authorization code received'));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
86
|
+
res.end('<html><body><h2>Authentication Successful</h2><p>You can close this window and return to the terminal.</p></body></html>');
|
|
87
|
+
server.close();
|
|
88
|
+
resolve({ code: code, state: state });
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
server.listen(port, '127.0.0.1');
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function exchangeCodeForToken(serverUrl, code, codeVerifier, redirectUri, clientId) {
|
|
96
|
+
return new Promise(function(resolve, reject) {
|
|
97
|
+
var tokenUrl = serverUrl.replace(/\\/$/, '') + '/oauth/token';
|
|
98
|
+
var parsed = url.parse(tokenUrl);
|
|
99
|
+
var body = 'grant_type=authorization_code'
|
|
100
|
+
+ '&code=' + encodeURIComponent(code)
|
|
101
|
+
+ '&redirect_uri=' + encodeURIComponent(redirectUri)
|
|
102
|
+
+ '&client_id=' + encodeURIComponent(clientId)
|
|
103
|
+
+ '&code_verifier=' + encodeURIComponent(codeVerifier);
|
|
104
|
+
|
|
105
|
+
var options = {
|
|
106
|
+
hostname: parsed.hostname,
|
|
107
|
+
port: parsed.port,
|
|
108
|
+
path: parsed.path,
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: {
|
|
111
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
112
|
+
'Content-Length': Buffer.byteLength(body)
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
var proto = parsed.protocol === 'https:' ? require('https') : http;
|
|
117
|
+
var req = proto.request(options, function(res) {
|
|
118
|
+
var data = '';
|
|
119
|
+
res.on('data', function(chunk) { data += chunk; });
|
|
120
|
+
res.on('end', function() {
|
|
121
|
+
try {
|
|
122
|
+
var json = JSON.parse(data);
|
|
123
|
+
if (json.error) {
|
|
124
|
+
reject(new Error('Token exchange failed: ' + (json.error_description || json.error)));
|
|
125
|
+
} else {
|
|
126
|
+
resolve(json);
|
|
127
|
+
}
|
|
128
|
+
} catch (e) {
|
|
129
|
+
reject(new Error('Invalid token response'));
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
req.on('error', reject);
|
|
134
|
+
req.write(body);
|
|
135
|
+
req.end();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function openBrowser(targetUrl) {
|
|
140
|
+
var platform = process.platform;
|
|
141
|
+
var cmd, args;
|
|
142
|
+
if (platform === 'darwin') {
|
|
143
|
+
cmd = 'open';
|
|
144
|
+
args = [targetUrl];
|
|
145
|
+
} else if (platform === 'win32') {
|
|
146
|
+
cmd = 'cmd';
|
|
147
|
+
args = ['/c', 'start', '', targetUrl];
|
|
148
|
+
} else {
|
|
149
|
+
cmd = 'xdg-open';
|
|
150
|
+
args = [targetUrl];
|
|
151
|
+
}
|
|
152
|
+
var child = childProcess.spawn(cmd, args, { detached: true, stdio: 'ignore' });
|
|
153
|
+
child.unref();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function startOAuthLogin(options) {
|
|
157
|
+
var serverUrl = options.serverUrl;
|
|
158
|
+
var clientId = options.clientId || APP_NAME;
|
|
159
|
+
var scope = options.scope || '';
|
|
160
|
+
var portStart = options.portStart || 17830;
|
|
161
|
+
var portEnd = options.portEnd || 17850;
|
|
162
|
+
var timeout = options.timeout || 120000;
|
|
163
|
+
var noBrowser = options.noBrowser || false;
|
|
164
|
+
|
|
165
|
+
var port = await findAvailablePort(portStart, portEnd);
|
|
166
|
+
var redirectUri = 'http://127.0.0.1:' + port + '/callback';
|
|
167
|
+
|
|
168
|
+
var verifier = generateCodeVerifier();
|
|
169
|
+
var challenge = generateCodeChallenge(verifier);
|
|
170
|
+
var state = crypto.randomBytes(16).toString('hex');
|
|
171
|
+
|
|
172
|
+
var authorizeUrl = serverUrl.replace(/\\/$/, '') + '/oauth/authorize'
|
|
173
|
+
+ '?response_type=code'
|
|
174
|
+
+ '&client_id=' + encodeURIComponent(clientId)
|
|
175
|
+
+ '&redirect_uri=' + encodeURIComponent(redirectUri)
|
|
176
|
+
+ '&code_challenge=' + encodeURIComponent(challenge)
|
|
177
|
+
+ '&code_challenge_method=S256'
|
|
178
|
+
+ '&state=' + encodeURIComponent(state)
|
|
179
|
+
+ (scope ? '&scope=' + encodeURIComponent(scope) : '');
|
|
180
|
+
|
|
181
|
+
var callbackPromise = startCallbackServer(port, timeout);
|
|
182
|
+
|
|
183
|
+
if (noBrowser) {
|
|
184
|
+
console.log('Open this URL in your browser:\\n');
|
|
185
|
+
console.log(' ' + authorizeUrl + '\\n');
|
|
186
|
+
} else {
|
|
187
|
+
console.log('Opening browser for authentication...');
|
|
188
|
+
openBrowser(authorizeUrl);
|
|
189
|
+
console.log('If the browser did not open, visit:\\n ' + authorizeUrl + '\\n');
|
|
190
|
+
}
|
|
191
|
+
console.log('Waiting for callback on port ' + port + '...');
|
|
192
|
+
|
|
193
|
+
var callback = await callbackPromise;
|
|
194
|
+
|
|
195
|
+
if (callback.state !== state) {
|
|
196
|
+
throw new Error('OAuth state mismatch — possible CSRF attack');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
console.log('Authorization code received. Exchanging for token...');
|
|
200
|
+
var tokenResponse = await exchangeCodeForToken(serverUrl, callback.code, verifier, redirectUri, clientId);
|
|
201
|
+
|
|
202
|
+
return {
|
|
203
|
+
token: tokenResponse.access_token,
|
|
204
|
+
refreshToken: tokenResponse.refresh_token,
|
|
205
|
+
expiresAt: tokenResponse.expires_in
|
|
206
|
+
? new Date(Date.now() + tokenResponse.expires_in * 1000).toISOString()
|
|
207
|
+
: undefined,
|
|
208
|
+
user: tokenResponse.user || undefined,
|
|
209
|
+
metadata: { scope: scope, serverUrl: serverUrl }
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
module.exports = {
|
|
214
|
+
findAvailablePort: findAvailablePort,
|
|
215
|
+
generateCodeVerifier: generateCodeVerifier,
|
|
216
|
+
generateCodeChallenge: generateCodeChallenge,
|
|
217
|
+
startCallbackServer: startCallbackServer,
|
|
218
|
+
exchangeCodeForToken: exchangeCodeForToken,
|
|
219
|
+
openBrowser: openBrowser,
|
|
220
|
+
startOAuthLogin: startOAuthLogin
|
|
221
|
+
};
|
|
222
|
+
`.trim();
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=oauth-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-helper.js","sourceRoot":"","sources":["../../../../../../src/commands/build/exec/cli-runtime/oauth-helper.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAKH,8DAmNC;AAtND;;GAEG;AACH,SAAgB,yBAAyB,CAAC,OAAe;IACvD,OAAO;;;;;;;;;iBASQ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwMvC,CAAC,IAAI,EAAE,CAAC;AACT,CAAC","sourcesContent":["/**\n * OAuth helper for CLI executables.\n * Generates runtime module code for OAuth login/logout flows:\n * PKCE S256, ephemeral callback server, browser launch, token exchange.\n */\n\n/**\n * Generate the oauth-helper runtime module source for embedding in CLI bundle.\n */\nexport function generateOAuthHelperSource(appName: string): string {\n return `\n'use strict';\n\nvar crypto = require('crypto');\nvar http = require('http');\nvar url = require('url');\nvar childProcess = require('child_process');\nvar net = require('net');\n\nvar APP_NAME = ${JSON.stringify(appName)};\n\nfunction findAvailablePort(startPort, endPort) {\n return new Promise(function(resolve, reject) {\n var port = startPort;\n function tryPort() {\n if (port > endPort) {\n reject(new Error('No available port in range ' + startPort + '-' + endPort));\n return;\n }\n var server = net.createServer();\n server.once('error', function() { port++; tryPort(); });\n server.once('listening', function() { server.close(function() { resolve(port); }); });\n server.listen(port, '127.0.0.1');\n }\n tryPort();\n });\n}\n\nfunction generateCodeVerifier() {\n return crypto.randomBytes(32).toString('base64url');\n}\n\nfunction generateCodeChallenge(verifier) {\n return crypto.createHash('sha256').update(verifier).digest('base64url');\n}\n\nfunction startCallbackServer(port, timeoutMs) {\n return new Promise(function(resolve, reject) {\n var timer = setTimeout(function() {\n server.close();\n reject(new Error('OAuth callback timed out after ' + (timeoutMs / 1000) + 's'));\n }, timeoutMs);\n\n var server = http.createServer(function(req, res) {\n var parsed = url.parse(req.url, true);\n if (parsed.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n var code = parsed.query.code;\n var state = parsed.query.state;\n var error = parsed.query.error;\n\n clearTimeout(timer);\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication Failed</h2><p>' + error + '</p><p>You can close this window.</p></body></html>');\n server.close();\n reject(new Error('OAuth error: ' + error));\n return;\n }\n\n if (!code) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication Failed</h2><p>No authorization code received.</p><p>You can close this window.</p></body></html>');\n server.close();\n reject(new Error('No authorization code received'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end('<html><body><h2>Authentication Successful</h2><p>You can close this window and return to the terminal.</p></body></html>');\n server.close();\n resolve({ code: code, state: state });\n });\n\n server.listen(port, '127.0.0.1');\n });\n}\n\nfunction exchangeCodeForToken(serverUrl, code, codeVerifier, redirectUri, clientId) {\n return new Promise(function(resolve, reject) {\n var tokenUrl = serverUrl.replace(/\\\\/$/, '') + '/oauth/token';\n var parsed = url.parse(tokenUrl);\n var body = 'grant_type=authorization_code'\n + '&code=' + encodeURIComponent(code)\n + '&redirect_uri=' + encodeURIComponent(redirectUri)\n + '&client_id=' + encodeURIComponent(clientId)\n + '&code_verifier=' + encodeURIComponent(codeVerifier);\n\n var options = {\n hostname: parsed.hostname,\n port: parsed.port,\n path: parsed.path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Content-Length': Buffer.byteLength(body)\n }\n };\n\n var proto = parsed.protocol === 'https:' ? require('https') : http;\n var req = proto.request(options, function(res) {\n var data = '';\n res.on('data', function(chunk) { data += chunk; });\n res.on('end', function() {\n try {\n var json = JSON.parse(data);\n if (json.error) {\n reject(new Error('Token exchange failed: ' + (json.error_description || json.error)));\n } else {\n resolve(json);\n }\n } catch (e) {\n reject(new Error('Invalid token response'));\n }\n });\n });\n req.on('error', reject);\n req.write(body);\n req.end();\n });\n}\n\nfunction openBrowser(targetUrl) {\n var platform = process.platform;\n var cmd, args;\n if (platform === 'darwin') {\n cmd = 'open';\n args = [targetUrl];\n } else if (platform === 'win32') {\n cmd = 'cmd';\n args = ['/c', 'start', '', targetUrl];\n } else {\n cmd = 'xdg-open';\n args = [targetUrl];\n }\n var child = childProcess.spawn(cmd, args, { detached: true, stdio: 'ignore' });\n child.unref();\n}\n\nasync function startOAuthLogin(options) {\n var serverUrl = options.serverUrl;\n var clientId = options.clientId || APP_NAME;\n var scope = options.scope || '';\n var portStart = options.portStart || 17830;\n var portEnd = options.portEnd || 17850;\n var timeout = options.timeout || 120000;\n var noBrowser = options.noBrowser || false;\n\n var port = await findAvailablePort(portStart, portEnd);\n var redirectUri = 'http://127.0.0.1:' + port + '/callback';\n\n var verifier = generateCodeVerifier();\n var challenge = generateCodeChallenge(verifier);\n var state = crypto.randomBytes(16).toString('hex');\n\n var authorizeUrl = serverUrl.replace(/\\\\/$/, '') + '/oauth/authorize'\n + '?response_type=code'\n + '&client_id=' + encodeURIComponent(clientId)\n + '&redirect_uri=' + encodeURIComponent(redirectUri)\n + '&code_challenge=' + encodeURIComponent(challenge)\n + '&code_challenge_method=S256'\n + '&state=' + encodeURIComponent(state)\n + (scope ? '&scope=' + encodeURIComponent(scope) : '');\n\n var callbackPromise = startCallbackServer(port, timeout);\n\n if (noBrowser) {\n console.log('Open this URL in your browser:\\\\n');\n console.log(' ' + authorizeUrl + '\\\\n');\n } else {\n console.log('Opening browser for authentication...');\n openBrowser(authorizeUrl);\n console.log('If the browser did not open, visit:\\\\n ' + authorizeUrl + '\\\\n');\n }\n console.log('Waiting for callback on port ' + port + '...');\n\n var callback = await callbackPromise;\n\n if (callback.state !== state) {\n throw new Error('OAuth state mismatch — possible CSRF attack');\n }\n\n console.log('Authorization code received. Exchanging for token...');\n var tokenResponse = await exchangeCodeForToken(serverUrl, callback.code, verifier, redirectUri, clientId);\n\n return {\n token: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token,\n expiresAt: tokenResponse.expires_in\n ? new Date(Date.now() + tokenResponse.expires_in * 1000).toISOString()\n : undefined,\n user: tokenResponse.user || undefined,\n metadata: { scope: scope, serverUrl: serverUrl }\n };\n}\n\nmodule.exports = {\n findAvailablePort: findAvailablePort,\n generateCodeVerifier: generateCodeVerifier,\n generateCodeChallenge: generateCodeChallenge,\n startCallbackServer: startCallbackServer,\n exchangeCodeForToken: exchangeCodeForToken,\n openBrowser: openBrowser,\n startOAuthLogin: startOAuthLogin\n};\n`.trim();\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting for MCP tool/resource results in CLI context.
|
|
3
|
+
* This module is embedded in the generated CLI bundle.
|
|
4
|
+
*/
|
|
5
|
+
export type OutputMode = 'text' | 'json';
|
|
6
|
+
export interface ContentBlock {
|
|
7
|
+
type: string;
|
|
8
|
+
text?: string;
|
|
9
|
+
mimeType?: string;
|
|
10
|
+
data?: string;
|
|
11
|
+
uri?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface CallToolResult {
|
|
15
|
+
content?: ContentBlock[];
|
|
16
|
+
isError?: boolean;
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Format a tool call result for terminal output.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatToolResult(result: CallToolResult, mode: OutputMode): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format a resource read result for terminal output.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatResourceResult(result: Record<string, unknown>, mode: OutputMode): string;
|
|
27
|
+
/**
|
|
28
|
+
* Format a prompt result for terminal output.
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatPromptResult(result: Record<string, unknown>, mode: OutputMode): string;
|
|
31
|
+
export interface SubscriptionEvent {
|
|
32
|
+
type: string;
|
|
33
|
+
uri?: string;
|
|
34
|
+
method?: string;
|
|
35
|
+
params?: unknown;
|
|
36
|
+
timestamp?: string;
|
|
37
|
+
[key: string]: unknown;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Format a subscription event for terminal output.
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatSubscriptionEvent(event: SubscriptionEvent, mode: OutputMode): string;
|
|
43
|
+
/**
|
|
44
|
+
* Generate the output-formatter module source code for embedding in CLI bundle.
|
|
45
|
+
*/
|
|
46
|
+
export declare function generateOutputFormatterSource(): string;
|