@obov/mext 0.5.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/approval.d.ts +33 -0
  2. package/dist/approval.js +36 -0
  3. package/dist/approval.js.map +1 -0
  4. package/dist/audit.d.ts +123 -0
  5. package/dist/audit.js +221 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/build-cli.d.ts +1 -0
  8. package/dist/build-cli.js.map +1 -1
  9. package/dist/build.d.ts +2 -0
  10. package/dist/build.js +46 -5
  11. package/dist/build.js.map +1 -1
  12. package/dist/caller.d.ts +53 -0
  13. package/dist/caller.js +51 -0
  14. package/dist/caller.js.map +1 -0
  15. package/dist/cli/args.js +1 -2
  16. package/dist/cli/args.js.map +1 -1
  17. package/dist/cli/build.js +26 -4
  18. package/dist/cli/build.js.map +1 -1
  19. package/dist/cli/dev-audit.d.ts +25 -0
  20. package/dist/cli/dev-audit.js +84 -0
  21. package/dist/cli/dev-audit.js.map +1 -0
  22. package/dist/cli/dev-lock.d.ts +3 -1
  23. package/dist/cli/dev-lock.js +12 -5
  24. package/dist/cli/dev-lock.js.map +1 -1
  25. package/dist/cli/dev-server.d.ts +9 -0
  26. package/dist/cli/dev-server.js +27 -3
  27. package/dist/cli/dev-server.js.map +1 -1
  28. package/dist/cli/dev-tap.d.ts +20 -0
  29. package/dist/cli/dev-tap.js +70 -0
  30. package/dist/cli/dev-tap.js.map +1 -0
  31. package/dist/cli/dev.d.ts +6 -0
  32. package/dist/cli/dev.js +20 -8
  33. package/dist/cli/dev.js.map +1 -1
  34. package/dist/cli/help.js +2 -0
  35. package/dist/cli/help.js.map +1 -1
  36. package/dist/cli/inspect.d.ts +7 -0
  37. package/dist/cli/inspect.js +699 -0
  38. package/dist/cli/inspect.js.map +1 -0
  39. package/dist/cli/main.js +10 -0
  40. package/dist/cli/main.js.map +1 -1
  41. package/dist/cli/media.d.ts +19 -0
  42. package/dist/cli/media.js +77 -0
  43. package/dist/cli/media.js.map +1 -0
  44. package/dist/cli/output.d.ts +1 -1
  45. package/dist/cli/output.js +3 -2
  46. package/dist/cli/output.js.map +1 -1
  47. package/dist/cli/run.js +33 -4
  48. package/dist/cli/run.js.map +1 -1
  49. package/dist/cli/serve.d.ts +10 -0
  50. package/dist/cli/serve.js +114 -0
  51. package/dist/cli/serve.js.map +1 -0
  52. package/dist/cli/types.d.ts +9 -0
  53. package/dist/cli/types.js +77 -0
  54. package/dist/cli/types.js.map +1 -0
  55. package/dist/client/index.d.ts +11 -0
  56. package/dist/client/index.js +7 -0
  57. package/dist/client/index.js.map +1 -0
  58. package/dist/client/manifest.js +6 -2
  59. package/dist/client/manifest.js.map +1 -1
  60. package/dist/client/runner.js +40 -3
  61. package/dist/client/runner.js.map +1 -1
  62. package/dist/client/typed.d.ts +56 -0
  63. package/dist/client/typed.js +526 -0
  64. package/dist/client/typed.js.map +1 -0
  65. package/dist/client/types.d.ts +225 -0
  66. package/dist/client/types.js +2 -0
  67. package/dist/client/types.js.map +1 -0
  68. package/dist/command.d.ts +61 -5
  69. package/dist/command.js +42 -1
  70. package/dist/command.js.map +1 -1
  71. package/dist/config.d.ts +59 -10
  72. package/dist/config.js +67 -7
  73. package/dist/config.js.map +1 -1
  74. package/dist/content.d.ts +65 -0
  75. package/dist/content.js +99 -0
  76. package/dist/content.js.map +1 -0
  77. package/dist/errors.d.ts +21 -3
  78. package/dist/errors.js +13 -0
  79. package/dist/errors.js.map +1 -1
  80. package/dist/expose.d.ts +9 -0
  81. package/dist/expose.js +52 -0
  82. package/dist/expose.js.map +1 -0
  83. package/dist/index.d.ts +18 -7
  84. package/dist/index.js +8 -2
  85. package/dist/index.js.map +1 -1
  86. package/dist/inspect/agent.d.ts +104 -0
  87. package/dist/inspect/agent.js +125 -0
  88. package/dist/inspect/agent.js.map +1 -0
  89. package/dist/inspect/audit.d.ts +46 -0
  90. package/dist/inspect/audit.js +133 -0
  91. package/dist/inspect/audit.js.map +1 -0
  92. package/dist/inspect/compare.d.ts +12 -0
  93. package/dist/inspect/compare.js +31 -0
  94. package/dist/inspect/compare.js.map +1 -0
  95. package/dist/inspect/index.d.ts +17 -0
  96. package/dist/inspect/index.js +12 -0
  97. package/dist/inspect/index.js.map +1 -0
  98. package/dist/inspect/inspector.d.ts +168 -0
  99. package/dist/inspect/inspector.js +392 -0
  100. package/dist/inspect/inspector.js.map +1 -0
  101. package/dist/inspect/profiles.d.ts +95 -0
  102. package/dist/inspect/profiles.js +235 -0
  103. package/dist/inspect/profiles.js.map +1 -0
  104. package/dist/inspect/scenario.d.ts +126 -0
  105. package/dist/inspect/scenario.js +555 -0
  106. package/dist/inspect/scenario.js.map +1 -0
  107. package/dist/inspect/ui-server.d.ts +31 -0
  108. package/dist/inspect/ui-server.js +378 -0
  109. package/dist/inspect/ui-server.js.map +1 -0
  110. package/dist/inspect/ui.html +917 -0
  111. package/dist/instrumentation.d.ts +13 -2
  112. package/dist/instrumentation.js +11 -1
  113. package/dist/instrumentation.js.map +1 -1
  114. package/dist/invoke.d.ts +36 -5
  115. package/dist/invoke.js +162 -21
  116. package/dist/invoke.js.map +1 -1
  117. package/dist/manifest.d.ts +19 -3
  118. package/dist/manifest.js +5 -1
  119. package/dist/manifest.js.map +1 -1
  120. package/dist/mcp/constants.d.ts +7 -0
  121. package/dist/mcp/constants.js +7 -0
  122. package/dist/mcp/constants.js.map +1 -1
  123. package/dist/mcp/dispatch.d.ts +10 -4
  124. package/dist/mcp/dispatch.js +24 -7
  125. package/dist/mcp/dispatch.js.map +1 -1
  126. package/dist/mcp/help.d.ts +2 -0
  127. package/dist/mcp/help.js +6 -1
  128. package/dist/mcp/help.js.map +1 -1
  129. package/dist/mcp/host.d.ts +14 -0
  130. package/dist/mcp/host.js +48 -0
  131. package/dist/mcp/host.js.map +1 -0
  132. package/dist/mcp/http.d.ts +38 -7
  133. package/dist/mcp/http.js +199 -23
  134. package/dist/mcp/http.js.map +1 -1
  135. package/dist/mcp/index.d.ts +2 -1
  136. package/dist/mcp/index.js +2 -1
  137. package/dist/mcp/index.js.map +1 -1
  138. package/dist/mcp/server.d.ts +12 -1
  139. package/dist/mcp/server.js +63 -17
  140. package/dist/mcp/server.js.map +1 -1
  141. package/dist/mcp/stdio.d.ts +4 -0
  142. package/dist/mcp/stdio.js +3 -0
  143. package/dist/mcp/stdio.js.map +1 -1
  144. package/dist/mcp/tasks.d.ts +3 -1
  145. package/dist/mcp/tasks.js +7 -4
  146. package/dist/mcp/tasks.js.map +1 -1
  147. package/dist/principal.d.ts +22 -0
  148. package/dist/principal.js +29 -0
  149. package/dist/principal.js.map +1 -1
  150. package/dist/registry.d.ts +5 -0
  151. package/dist/registry.js +21 -0
  152. package/dist/registry.js.map +1 -1
  153. package/dist/remote/client.d.ts +26 -1
  154. package/dist/remote/client.js +180 -55
  155. package/dist/remote/client.js.map +1 -1
  156. package/dist/remote/index.d.ts +1 -1
  157. package/dist/remote/index.js.map +1 -1
  158. package/dist/remote/oauth.d.ts +1 -1
  159. package/dist/remote/oauth.js +1 -1
  160. package/dist/remote/oauth.js.map +1 -1
  161. package/dist/route.d.ts +40 -2
  162. package/dist/route.js +128 -8
  163. package/dist/route.js.map +1 -1
  164. package/dist/start.js +9 -4
  165. package/dist/start.js.map +1 -1
  166. package/dist/suggest.js +1 -1
  167. package/dist/suggest.js.map +1 -1
  168. package/dist/typegen.d.ts +27 -0
  169. package/dist/typegen.js +62 -0
  170. package/dist/typegen.js.map +1 -0
  171. package/dist/version-constant.d.ts +5 -0
  172. package/dist/version-constant.js +6 -0
  173. package/dist/version-constant.js.map +1 -0
  174. package/dist/version.d.ts +1 -2
  175. package/dist/version.js +1 -2
  176. package/dist/version.js.map +1 -1
  177. package/package.json +12 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/cli/inspect.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\"\nimport { basename, relative, resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport { entryFromHelp } from \"../client/runner.ts\"\nimport { CallError } from \"../client/typed.ts\"\nimport type { CommandInfo, CommandList, CommandSummary } from \"../client/types.ts\"\nimport { isMextError } from \"../errors.ts\"\nimport { parentNamespace } from \"../ids.ts\"\nimport {\n createInspector,\n InspectUsageError,\n outcomeOf,\n resolveTarget,\n type Answers,\n type CallRecord,\n type ErrorBody,\n type Inspector,\n type InspectTarget,\n} from \"../inspect/inspector.ts\"\nimport { isAgentClient, type AgentClient, type AgentPluginContext } from \"../inspect/agent.ts\"\nimport { resolveAudit } from \"../inspect/audit.ts\"\nimport { startUiServer, UI_DEFAULT_PORT } from \"../inspect/ui-server.ts\"\nimport { findProfile, INSPECT_DIR, loadProfiles, PROFILES_FILE, ProfileFileError, type ProfileSet } from \"../inspect/profiles.ts\"\nimport {\n appendStep,\n listErrorBody,\n loadScenario,\n runScenario,\n ScenarioFileError,\n scenarioFiles,\n stepFromRecord,\n type Scenario,\n type ScenarioResult,\n type StepResult,\n} from \"../inspect/scenario.ts\"\nimport type { CommandHelp } from \"../mcp/help.ts\"\nimport { parseArgs } from \"./args.ts\"\nimport { table } from \"./help.ts\"\nimport { readAll, type CliIo } from \"./io.ts\"\nimport { EXIT, formatError, formatJson, formatProgress, formatResult } from \"./output.ts\"\n\nexport const INSPECT_PROG = \"mext inspect\"\n\n/**\n * mext inspect <commands|show|call|run|profiles|ui> (specs/inspector.md §3 · §5).\n * 대상 = --url > MEXT_URL > 이 프로젝트의 mext dev. 호출자 = --as <프로필>[,<프로필>…] (inspect/profiles.json)\n */\n\ninterface Flags {\n url?: string\n profiles?: string\n as?: string[]\n json: boolean\n help: boolean\n confirmed: boolean\n decline: boolean\n raw: boolean\n bail: boolean\n answers?: Answers\n save?: string\n port?: string\n agent?: string\n name?: string\n}\n\nconst VALUE_FLAGS = [\"url\", \"profiles\", \"as\", \"answers\", \"save\", \"port\", \"agent\", \"name\"] as const\nconst BOOLEAN_FLAGS = [\"json\", \"confirmed\", \"decline\", \"raw\", \"bail\"] as const\n/** 하위 명령별로 받는 플래그 (공통 제외) */\nconst SUBCOMMAND_FLAGS: Record<string, readonly string[]> = {\n commands: [],\n show: [],\n call: [\"confirmed\", \"decline\", \"raw\", \"answers\", \"save\"],\n run: [\"bail\", \"agent\"],\n profiles: [],\n ui: [\"port\", \"agent\"],\n \"mcp-config\": [\"name\"],\n}\nconst COMMON_FLAGS = [\"url\", \"profiles\", \"as\", \"json\"]\n\nclass UsageError extends Error {}\n\nexport async function inspectCommand(argv: readonly string[], io: CliIo): Promise<number> {\n const json = argv.includes(\"--json\")\n try {\n return await run(argv, io)\n } catch (error) {\n if (error instanceof UsageError) {\n io.stderr.write(`error: ${error.message}\\nRun \"${INSPECT_PROG} --help\" for usage.\\n`)\n return EXIT.usage\n }\n if (error instanceof InspectUsageError || error instanceof ProfileFileError || error instanceof ScenarioFileError) {\n io.stderr.write(`error: ${error.message}\\n`)\n return EXIT.usage\n }\n if (isMextError(error, \"INVALID_ARGUMENT\")) {\n const lines = formatError(error, INSPECT_PROG).trimEnd().split(\"\\n\")\n if (lines.at(-1)?.startsWith(\"Run \")) lines[lines.length - 1] = `Run \"${INSPECT_PROG} show ${error.details.command}\" for the input schema.`\n io.stderr.write(`${lines.join(\"\\n\")}\\n`)\n return EXIT.usage\n }\n const body = listErrorBody(error)\n io.stderr.write(json ? formatJson(body) : `error: ${body.code}: ${body.message}\\n`)\n return EXIT.error\n }\n}\n\nasync function run(argv: readonly string[], io: CliIo): Promise<number> {\n const flags: Flags = { json: false, help: false, confirmed: false, decline: false, raw: false, bail: false }\n const given = new Set<string>()\n const positionals: string[] = []\n /** call 의 <id> 뒤 = 명령어 입력 (mext run 과 같은 플래그). inspect 플래그는 <id> 앞에 둔다 */\n let inputArgv: string[] = []\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--help\" || tok === \"-h\") {\n flags.help = true\n continue\n }\n if (!tok.startsWith(\"--\")) {\n positionals.push(tok)\n if (positionals[0] === \"call\" && positionals.length === 2) {\n inputArgv = argv.slice(i + 1)\n break\n }\n continue\n }\n const eq = tok.indexOf(\"=\")\n const name = tok.slice(2, eq < 0 ? undefined : eq)\n given.add(name)\n if ((BOOLEAN_FLAGS as readonly string[]).includes(name) && eq < 0) {\n flags[name as (typeof BOOLEAN_FLAGS)[number]] = true\n continue\n }\n if (!(VALUE_FLAGS as readonly string[]).includes(name)) throw new UsageError(`unknown flag --${name}`)\n const value = eq < 0 ? argv[++i] : tok.slice(eq + 1)\n if (value === undefined || value === \"\") throw new UsageError(`--${name} requires a value`)\n if (name === \"as\") {\n flags.as = value\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s !== \"\")\n } else if (name === \"answers\") flags.answers = parseAnswers(value)\n else flags[name as \"url\" | \"profiles\" | \"save\" | \"port\" | \"agent\" | \"name\"] = value\n }\n const [sub, ...args] = positionals\n if (sub === undefined || sub === \"help\") {\n (flags.help || sub === \"help\" ? io.stdout : io.stderr).write(inspectHelp())\n return flags.help || sub === \"help\" ? EXIT.ok : EXIT.usage\n }\n if (flags.help) {\n io.stdout.write(inspectHelp())\n return EXIT.ok\n }\n const allowed = SUBCOMMAND_FLAGS[sub]\n if (!allowed) throw new UsageError(`unknown subcommand \"${sub}\" (commands · show · call · run · profiles · ui · mcp-config)`)\n for (const name of given) {\n if (!COMMON_FLAGS.includes(name) && !allowed.includes(name)) throw new UsageError(`--${name} is not a flag of \"${INSPECT_PROG} ${sub}\"`)\n }\n\n const profiles = loadProfiles(io.cwd, { ...(flags.profiles !== undefined ? { file: flags.profiles } : {}), env: io.env })\n if (sub === \"profiles\") {\n if (args.length > 0) throw new UsageError(`unexpected argument \"${args[0]}\"`)\n return printProfiles(profiles, io, flags.json)\n }\n const target = resolveTarget({ ...(flags.url !== undefined ? { url: flags.url } : {}), env: io.env, cwd: io.cwd })\n if (sub === \"ui\") {\n if (args.length > 0) throw new UsageError(`unexpected argument \"${args[0]}\"`)\n if (flags.as || flags.json) throw new UsageError(`--${flags.as ? \"as\" : \"json\"} is not a flag of \"${INSPECT_PROG} ui\" (pick profiles in the page)`)\n return ui(target, profiles, flags, io)\n }\n // run = 감사 이벤트를 비교한다 (expect.audit · agent 단계): 대상이 이 프로젝트의 mext dev 면 감사 출처를 잇는다\n if (sub === \"mcp-config\") {\n if (args.length > 0) throw new UsageError(`unexpected argument \"${args[0]}\"`)\n return mcpConfig(target, profiles, flags, io)\n }\n const audit = sub === \"run\" ? resolveAudit(target, io.cwd) : undefined\n const inspector = createInspector({ url: target.url, profiles, env: io.env, ...(audit?.available ? { audit: audit.source } : {}) })\n // 이름 확인 (없는 프로필 = 사용법 오류)\n const names = (flags.as ?? [profiles.default]).map((name) => inspector.profile(name).name)\n if (names.length === 0) throw new UsageError(\"--as requires at least one profile name\")\n\n switch (sub) {\n case \"commands\": {\n if (args.length > 1) throw new UsageError(`unexpected argument \"${args[1]}\"`)\n return commands(inspector, target, names, args[0], io, flags.json)\n }\n case \"show\": {\n if (args.length !== 1) throw new UsageError(`usage: ${INSPECT_PROG} show <id>`)\n return show(inspector, names, args[0]!, io, flags.json)\n }\n case \"call\": {\n if (args.length !== 1) throw new UsageError(`usage: ${INSPECT_PROG} call [flags] <id> [input flags]`)\n return call(inspector, names, args[0]!, inputArgv, flags, io)\n }\n default: {\n if (flags.as && flags.as.length > 1) throw new UsageError(\"--as takes one profile for run (steps name their own profile with \\\"as\\\")\")\n try {\n return await runScenarios(inspector, profiles, args, flags, io)\n } finally {\n inspector.close()\n }\n }\n }\n}\n\nfunction parseAnswers(text: string): Answers {\n let value: unknown\n try {\n value = JSON.parse(text)\n } catch {\n throw new UsageError('--answers must be JSON, e.g. \\'{\"confirm\": true, \"form\": {\"reason\": \"ok\"}}\\'')\n }\n if (!isRecord(value)) throw new UsageError(\"--answers must be a JSON object\")\n const out: Answers = {}\n for (const [key, v] of Object.entries(value)) {\n if (key === \"confirm\" || key === \"url\") {\n if (typeof v !== \"boolean\") throw new UsageError(`--answers ${key} must be true or false`)\n out[key] = v\n } else if (key === \"form\") {\n if (v !== false && !isRecord(v)) throw new UsageError(\"--answers form must be an object or false\")\n out.form = v\n } else throw new UsageError(`--answers: unknown key \"${key}\" (confirm · form · url)`)\n }\n return out\n}\n\n/* profiles */\n\nfunction printProfiles(profiles: ProfileSet, io: CliIo, json: boolean): number {\n const inspector = createInspector({ url: \"http://unused.invalid/mcp\", profiles, env: io.env })\n const views = inspector.profiles()\n if (json) {\n io.stdout.write(formatJson({ file: profiles.file ?? null, default: profiles.default, profiles: views }))\n return EXIT.ok\n }\n const source = profiles.file ? shown(io.cwd, profiles.file) : `built-in (no ${INSPECT_DIR}/${PROFILES_FILE})`\n const rows = views.map((p) => [\n `${p.default ? \"*\" : \" \"} ${p.name}`,\n p.token ? `${p.token.env} (${p.token.set ? \"set\" : \"not set\"})` : \"-\",\n p.headers.map((h) => (h.env ? `${h.name}=$${h.env}${h.set ? \"\" : \" (not set)\"}` : `${h.name}=${h.value}`)).join(\", \") || \"-\",\n p.description ?? \"\",\n ])\n io.stdout.write(`Profiles: ${source}\\n${table([[\" NAME\", \"TOKEN\", \"HEADERS\", \"DESCRIPTION\"], ...rows]).join(\"\\n\")}\\n`)\n return EXIT.ok\n}\n\n/* mcp-config */\n\n/**\n * 에이전트 (Happy 봇) 가 이 서버를 MCP 서버로 쓰게 하는 설정 스니펫 (mcp.toml 형식, §3). 출력만 한다 (파일을 쓰지 않는다).\n * 토큰 = 환경변수 이름 (bearer_token_env_var). 값은 읽지도 출력하지도 않는다\n */\nfunction mcpConfig(target: InspectTarget, profiles: ProfileSet, flags: Flags, io: CliIo): number {\n if (!flags.as || flags.as.length !== 1) {\n throw new UsageError(`\"${INSPECT_PROG} mcp-config\" needs --as <profile>: the profile whose token the agent will use (profiles: ${profiles.profiles.map((p) => p.name).join(\", \")})`)\n }\n const profile = findProfile(profiles, flags.as[0])\n if (!profile) throw new UsageError(`Unknown profile \"${flags.as[0]}\". Profiles: ${profiles.profiles.map((p) => p.name).join(\", \")}`)\n const name = flags.name ?? (basename(resolve(io.cwd)).replace(/[^A-Za-z0-9_-]+/g, \"_\") || \"mext\")\n const fixed = Object.entries(profile.headers).filter((entry): entry is [string, string] => typeof entry[1] === \"string\")\n const fromEnv = Object.entries(profile.headers).flatMap(([header, value]) => (typeof value === \"string\" ? [] : [{ name: header, env: value.env }]))\n const key = /^[A-Za-z0-9_-]+$/.test(name) ? name : JSON.stringify(name)\n const entry = [\n `[mcp_servers.${key}]`,\n `url = ${JSON.stringify(target.url)}`,\n ...(profile.token ? [`bearer_token_env_var = ${JSON.stringify(profile.token.env)}`] : []),\n ...(fixed.length > 0 ? [`http_headers = { ${fixed.map(([header, value]) => `${JSON.stringify(header)} = ${JSON.stringify(value)}`).join(\", \")} }`] : []),\n ]\n if (flags.json) {\n io.stdout.write(\n formatJson({\n name,\n profile: profile.name,\n url: target.url,\n bearerTokenEnvVar: profile.token?.env ?? null,\n httpHeaders: Object.fromEntries(fixed),\n skippedHeaders: fromEnv,\n toml: `${entry.join(\"\\n\")}\\n`,\n }),\n )\n return EXIT.ok\n }\n const lines = [\n `# MCP server entry for a Happy Agent bot, calling as profile \"${profile.name}\" (${INSPECT_PROG} mcp-config).`,\n \"# 1. Add it to the mcp.toml in the bot's folder (for example ~/Happy/Bots/<bot>/mcp.toml). This command does not write that file.\",\n profile.token\n ? `# 2. The Happy daemon reads the token from its own environment: ${profile.token.env} must be set where the daemon runs (not only in this shell).`\n : \"# 2. This profile has no token: the bot calls the server anonymously.\",\n \"# 3. Ask the bot to reload its MCP servers.\",\n ...entry,\n ...fromEnv.map((h) => `# Not included: header ${h.name} comes from $${h.env} in this profile, and mcp.toml headers are fixed values only.`),\n ...(target.source === \"dev\" ? [`# This URL is this project's mext dev server. Keep the port fixed (mext dev --port ${new URL(target.url).port}) so the entry stays valid.`] : []),\n ]\n io.stdout.write(`${lines.join(\"\\n\")}\\n`)\n return EXIT.ok\n}\n\n/* commands */\n\ntype Listing = { profile: string; ok: true; list: CommandList } | { profile: string; ok: false; error: ErrorBody }\n\nasync function listFor(inspector: Inspector, names: readonly string[], namespace: string | undefined): Promise<Listing[]> {\n const out: Listing[] = []\n for (const profile of names) {\n try {\n const list = await inspector.commands(profile)\n out.push({ profile, ok: true, list: namespace === undefined ? list : within(list, namespace) })\n } catch (error) {\n out.push({ profile, ok: false, error: listErrorBody(error) })\n }\n }\n return out\n}\n\nfunction within(list: CommandList, namespace: string): CommandList {\n const inside = (id: string): boolean => id === namespace || id.startsWith(`${namespace}.`)\n return { ...list, namespaces: list.namespaces.filter((n) => inside(n.id)), commands: list.commands.filter((c) => inside(c.id)) }\n}\n\nasync function commands(\n inspector: Inspector,\n target: InspectTarget,\n names: readonly string[],\n namespace: string | undefined,\n io: CliIo,\n json: boolean,\n): Promise<number> {\n const listings = await listFor(inspector, names, namespace)\n const failed = listings.some((l) => !l.ok)\n if (names.length === 1) {\n const only = listings[0]!\n if (!only.ok) {\n io.stderr.write(json ? formatJson(only.error) : `error: ${only.error.code}: ${only.error.message}\\n`)\n return EXIT.error\n }\n if (json) {\n io.stdout.write(formatJson(only.list))\n return EXIT.ok\n }\n io.stdout.write(`${targetLine(target)} · as ${only.profile}\\n\\n${commandLines(only.list)}`)\n return EXIT.ok\n }\n if (json) {\n io.stdout.write(formatJson(listings))\n return failed ? EXIT.error : EXIT.ok\n }\n const ids = [...new Set(listings.flatMap((l) => (l.ok ? l.list.commands.map((c) => c.id) : [])))].sort()\n const rows = ids.map((id) => [id, ...listings.map((l) => (l.ok ? (l.list.commands.some((c) => c.id === id) ? \"visible\" : \"hidden\") : l.error.code))])\n io.stdout.write(`${targetLine(target)}\\n\\n${table([[\"\", ...names], ...rows]).join(\"\\n\")}\\n`)\n for (const l of listings) if (!l.ok) io.stderr.write(`${l.profile}: ${l.error.code}: ${l.error.message}\\n`)\n return failed ? EXIT.error : EXIT.ok\n}\n\nfunction targetLine(target: InspectTarget): string {\n return `${target.url}${target.source === \"dev\" ? \" (mext dev)\" : \"\"}`\n}\n\n/** 네임스페이스별 명령어 + 안전성 */\nfunction commandLines(list: CommandList): string {\n if (list.commands.length === 0) return \"(no commands visible to this profile)\\n\"\n const groups = new Map<string, CommandSummary[]>()\n for (const c of list.commands) {\n const ns = parentNamespace(c.id)\n groups.set(ns, [...(groups.get(ns) ?? []), c])\n }\n const rows: string[][] = []\n const heads = new Set<number>()\n for (const [ns, items] of [...groups].sort(([a], [b]) => a.localeCompare(b))) {\n heads.add(rows.length)\n rows.push([ns === \"\" ? \"(root)\" : ns, \"\", list.namespaces.find((n) => n.id === ns)?.description ?? \"\"])\n for (const c of items) rows.push([` ${c.id}`, safetyOf(c).join(\", \"), c.description])\n }\n const lines = table(rows)\n return `${lines.map((l, i) => (heads.has(i) && i > 0 ? `\\n${l}` : l)).join(\"\\n\")}\\n`\n}\n\n/** 안전성 표시 (mext run --help 의 Safety 줄과 같은 말) */\nexport function safetyOf(c: CommandSummary): string[] {\n const out = [c.readOnly ? \"read-only\" : \"writes\"]\n if (c.destructive) out.push(\"destructive\")\n if (c.requiresConfirmation) out.push(\"requires confirmation\")\n else if (c.needsApproval === \"conditional\") out.push(\"may require confirmation\")\n return out\n}\n\n/* show */\n\nasync function show(inspector: Inspector, names: readonly string[], id: string, io: CliIo, json: boolean): Promise<number> {\n let info: CommandInfo | undefined\n const visibleTo: Record<string, boolean> = {}\n let firstError: unknown\n for (const profile of names) {\n try {\n const found = await inspector.describe(id, profile)\n info ??= found\n visibleTo[profile] = true\n } catch (error) {\n if (!(error instanceof CallError && error.code === \"UNKNOWN_COMMAND\") && names.length === 1) throw error\n firstError ??= error\n visibleTo[profile] = false\n }\n }\n if (!info) throw firstError\n if (json) {\n io.stdout.write(formatJson(names.length === 1 ? info : { ...info, visibleTo }))\n return EXIT.ok\n }\n const safety = safetyOf(info)\n const rows: string[][] = [\n [\"Safety\", safety.join(\", \")],\n [\"Approval\", info.requiresConfirmation ? \"required\" : info.needsApproval === \"conditional\" ? \"conditional\" : \"none\"],\n [\"Scopes\", info.scopes.join(\", \") || \"(none)\"],\n ]\n if (info.aliases.length > 0) rows.push([\"Aliases\", info.aliases.join(\", \")])\n if (info.tool !== undefined) rows.push([\"Tool\", info.tool])\n if (info.task) rows.push([\"Task\", `ttl ${info.task.ttlMs}ms`])\n if (info.errors.length > 0) rows.push([\"Errors\", info.errors.join(\", \")])\n if (names.length > 1) rows.push([\"Visible to\", names.map((n) => `${n} ${visibleTo[n] ? \"yes\" : \"no\"}`).join(\" · \")])\n const out = [`${info.id} — ${info.description}`, \"\", ...table(rows), \"\", \"Input schema:\", indent(JSON.stringify(info.inputSchema, null, 2))]\n if (info.outputSchema) out.push(\"\", \"Output schema:\", indent(JSON.stringify(info.outputSchema, null, 2)))\n if (info.examples.length > 0) out.push(\"\", \"Examples:\", ...info.examples.map((e) => ` ${JSON.stringify(e)}`))\n io.stdout.write(`${out.join(\"\\n\")}\\n`)\n return EXIT.ok\n}\n\n/* call */\n\nasync function call(inspector: Inspector, names: readonly string[], id: string, inputArgv: readonly string[], flags: Flags, io: CliIo): Promise<number> {\n const parsed = await parseInput(inspector, names, id, inputArgv, io)\n if (parsed.help) return show(inspector, names, id, io, flags.json || parsed.json)\n const json = flags.json || parsed.json\n const confirmed = flags.confirmed || parsed.yes\n const records: CallRecord[] = []\n for (const profile of names) {\n records.push(\n await inspector.call(id, parsed.input, {\n profile,\n ...(confirmed ? { confirmed: true } : {}),\n ...(flags.answers ? { answers: flags.answers } : {}),\n ...(flags.decline ? { decline: true } : {}),\n ...(io.signal ? { signal: io.signal } : {}),\n onProgress: (update) => {\n const line = formatProgress({ ...update, progress: update.progress ?? 0 })\n io.stderr.write(names.length > 1 ? `${profile}: ${line}` : line)\n },\n }),\n )\n }\n if (flags.save !== undefined) {\n const file = resolve(io.cwd, flags.save)\n let count = 0\n for (const record of records) {\n count = appendStep(file, stepFromRecord(record, { ...(flags.answers ? { answers: flags.answers } : {}), ...(flags.decline ? { decline: true } : {}) }))\n }\n io.stderr.write(`Saved ${records.length === 1 ? \"step\" : `${records.length} steps`} to ${shown(io.cwd, file)} (${count} step${count === 1 ? \"\" : \"s\"})\\n`)\n }\n const failed = records.some((r) => !r.ok)\n if (json) {\n io.stdout.write(\n formatJson(\n records.map((r) => ({\n profile: r.profile,\n ...outcomeOf(r),\n durationMs: r.durationMs,\n ...(r.task ? { task: r.task } : {}),\n ...(flags.raw ? { exchanges: r.exchanges } : {}),\n })),\n ),\n )\n return failed ? EXIT.error : EXIT.ok\n }\n const blocks = records.map((r) => {\n const lines = [recordLine(r)]\n const body = r.ok ? formatResult(r.value).trimEnd() : JSON.stringify(r.error, null, 2)\n if (body !== \"\") lines.push(indent(body))\n if (flags.raw) {\n lines.push(\" Requests:\")\n for (const x of r.exchanges) {\n lines.push(` → ${x.request.method} ${x.request.url}${x.rpc ? ` ${x.rpc}` : \"\"} (${x.response ? x.response.status : (x.error ?? \"no response\")}, ${x.durationMs}ms)`)\n lines.push(indent(JSON.stringify({ request: x.request, response: x.response }, null, 2), 4))\n }\n }\n return lines.join(\"\\n\")\n })\n io.stdout.write(`${blocks.join(\"\\n\\n\")}\\n`)\n return failed ? EXIT.error : EXIT.ok\n}\n\n/** 한 줄 요약: ✓ posts.get as editor (12ms) · ✗ posts.publish as agent (8ms) APPROVAL_REQUIRED (human_required) */\nfunction recordLine(r: CallRecord): string {\n const head = `${r.ok ? \"✓\" : \"✗\"} ${r.command} as ${r.profile} (${r.durationMs}ms)`\n if (r.ok || !r.error) return head\n return `${head} ${r.error.code}${typeof r.error.reason === \"string\" ? ` (${r.error.reason})` : \"\"}`\n}\n\n/**\n * <id> 뒤 argv → 입력. 스키마 = 이 명령어가 보이는 첫 프로필의 것 (mext run 과 같은 플래그 해석).\n * 어느 프로필에도 보이지 않으면 (숨긴 명령어를 호출해 보는 경우) --input-json 만 받는다\n */\nasync function parseInput(\n inspector: Inspector,\n names: readonly string[],\n id: string,\n argv: readonly string[],\n io: CliIo,\n): Promise<{ input: Record<string, unknown>; json: boolean; yes: boolean; help: boolean }> {\n let info: CommandInfo | undefined\n for (const profile of names) {\n try {\n info = await inspector.describe(id, profile)\n break\n } catch {\n // 다음 프로필\n }\n }\n if (info) {\n const entry = entryFromHelp({ ...info, kind: \"command\" } as unknown as CommandHelp)\n const parsed = await parseArgs(entry, argv, { readStdin: () => readAll(io.stdin) })\n return { input: isRecord(parsed.input) ? parsed.input : {}, json: parsed.json, yes: parsed.yes, help: parsed.help }\n }\n const out = { input: {} as Record<string, unknown>, json: false, yes: false, help: false }\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--json\") out.json = true\n else if (tok === \"--yes\") out.yes = true\n else if (tok === \"--help\" || tok === \"-h\") out.help = true\n else if (tok === \"--input-json\" || tok.startsWith(\"--input-json=\")) {\n const text = tok === \"--input-json\" ? argv[++i] : tok.slice(\"--input-json=\".length)\n let value: unknown\n try {\n value = JSON.parse(text === \"-\" ? await readAll(io.stdin) : (text ?? \"\"))\n } catch {\n throw new UsageError(\"--input-json must be a JSON object\")\n }\n if (!isRecord(value)) throw new UsageError(\"--input-json must be a JSON object\")\n out.input = value\n } else {\n throw new UsageError(`\"${id}\" is not visible to ${names.join(\", \")}, so its flags are unknown. Pass the input with --input-json '<json>'`)\n }\n }\n return out\n}\n\n/* run */\n\nasync function runScenarios(inspector: Inspector, profiles: ProfileSet, paths: readonly string[], flags: Flags, io: CliIo): Promise<number> {\n const scenarios = scenarioFiles(io.cwd, paths).map((file) => loadScenario(file, profiles))\n const needsAgent = scenarios.some((scenario) => scenario.steps.some((step) => \"agent\" in step))\n if (needsAgent && flags.agent === undefined) {\n throw new UsageError('these scenarios have \"agent\" steps: pass --agent <module> (a module whose default export is an AgentClient, or a function that makes one)')\n }\n const agent = flags.agent !== undefined ? await loadAgent(flags.agent, io) : undefined\n try {\n return await runLoaded(inspector, scenarios, agent, flags, io)\n } finally {\n await agent?.close?.().catch(() => {})\n }\n}\n\n/** --agent <모듈>: default export = AgentClient, 또는 그것을 만드는 함수 ({ cwd, env }) */\nasync function loadAgent(path: string, io: CliIo): Promise<AgentClient> {\n const file = resolve(io.cwd, path)\n if (!existsSync(file)) throw new UsageError(`--agent: ${shown(io.cwd, file)} not found`)\n const module = (await import(pathToFileURL(file).href)) as { default?: unknown }\n const plugin = module.default\n let client: unknown = plugin\n if (typeof plugin === \"function\") {\n try {\n client = await (plugin as (context: AgentPluginContext) => unknown)({ cwd: io.cwd, env: io.env })\n } catch (error) {\n // 설정이 빠진 plugin (환경변수 등) = 사용법 오류\n throw new UsageError(`--agent: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (!isAgentClient(client)) {\n throw new UsageError(`--agent: the default export of ${shown(io.cwd, file)} must be an AgentClient ({ connect, send, onEvent }) or a function that returns one`)\n }\n return client\n}\n\nasync function runLoaded(inspector: Inspector, scenarios: readonly Scenario[], agent: AgentClient | undefined, flags: Flags, io: CliIo): Promise<number> {\n const results: ScenarioResult[] = []\n for (const scenario of scenarios) {\n // --as = 시나리오 · 단계가 프로필을 적지 않았을 때의 기본값\n const effective = scenario.as === undefined && flags.as ? { ...scenario, as: flags.as[0]! } : scenario\n if (!flags.json) io.stdout.write(`${scenario.name}${scenario.file ? ` (${shown(io.cwd, scenario.file)})` : \"\"}\\n`)\n const result = await runScenario(inspector, effective, {\n bail: flags.bail,\n ...(agent ? { agent } : {}),\n ...(io.signal ? { signal: io.signal } : {}),\n onStep: (step) => {\n if (!flags.json) io.stdout.write(stepLines(step))\n },\n })\n results.push(result)\n if (!flags.json && result.steps.length < scenario.steps.length) {\n io.stdout.write(` (stopped: ${scenario.steps.length - result.steps.length} step(s) not run)\\n`)\n }\n }\n const pass = results.every((r) => r.pass)\n if (flags.json) {\n io.stdout.write(formatJson({ pass, scenarios: results }))\n return pass ? EXIT.ok : EXIT.error\n }\n const steps = results.flatMap((r) => r.steps)\n const passed = results.filter((r) => r.pass).length\n io.stdout.write(\n `\\n${passed}/${results.length} scenario${results.length === 1 ? \"\" : \"s\"} passed, ${steps.filter((s) => s.pass).length}/${steps.length} steps passed\\n`,\n )\n return pass ? EXIT.ok : EXIT.error\n}\n\nfunction stepLines(step: StepResult): string {\n const lines = [` ${step.pass ? \"✓\" : \"✗\"} ${step.step}. ${step.name} (as ${step.as}, ${step.durationMs}ms)`]\n for (const f of step.failures) lines.push(` ${f.path}: expected ${JSON.stringify(f.expected)}, got ${JSON.stringify(f.actual)}`)\n const outcome = step.outcome\n if (outcome && \"events\" in outcome) {\n // agent 단계: 실패하면 서버가 본 것 (감사 이벤트) 과 에이전트가 한 말을 같이 보여 준다\n if (!step.pass) {\n lines.push(` server saw ${outcome.events.length} call${outcome.events.length === 1 ? \"\" : \"s\"} from the agent${outcome.events.length > 0 ? \":\" : \"\"}`)\n for (const event of outcome.events) lines.push(` ${event.outcome} ${event.command}${event.error ? ` (${event.error.code})` : \"\"}`)\n const said = outcome.messages.at(-1)\n if (said !== undefined) lines.push(` agent said: ${said.length > 200 ? `${said.slice(0, 197)}…` : said}`)\n }\n } else if (!step.pass && outcome && !outcome.ok) lines.push(` result: ${outcome.error.code}: ${outcome.error.message}`)\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/* ui */\n\n/** 웹 UI (§5): 127.0.0.1 에 페이지 · 중계 API 를 열고 SIGINT 까지 실행 */\nasync function ui(target: InspectTarget, profiles: ProfileSet, flags: Flags, io: CliIo): Promise<number> {\n const port = flags.port === undefined ? UI_DEFAULT_PORT : Number(flags.port)\n if (!Number.isInteger(port) || port < 0 || port > 65_535) throw new UsageError(\"--port must be a port number (0 = any free port)\")\n const audit = resolveAudit(target, io.cwd)\n const agent = flags.agent !== undefined ? await loadAgent(flags.agent, io) : undefined\n const inspector = createInspector({ url: target.url, profiles, env: io.env, ...(audit.available ? { audit: audit.source } : {}) })\n let server\n try {\n server = await startUiServer({ inspector, target, cwd: io.cwd, port, ...(audit.available ? {} : { auditReason: audit.reason }), ...(agent ? { agent } : {}) })\n } catch (error) {\n inspector.close()\n if ((error as NodeJS.ErrnoException).code === \"EADDRINUSE\") {\n io.stderr.write(`error: port ${port} is in use. Pass --port <n> (0 = any free port).\\n`)\n return EXIT.error\n }\n throw error\n }\n io.stderr.write(\n `${INSPECT_PROG}: ${server.url}\\n` +\n ` target ${targetLine(target)}\\n` +\n ` audit ${audit.available ? \"streaming from mext dev\" : \"not available for this target\"}\\n` +\n (agent ? ` agent ${agent.name ?? \"connected on the first agent step\"}\\n` : \"\") +\n \"Press Ctrl-C to stop.\\n\",\n )\n await new Promise<void>((done) => {\n if (io.signal?.aborted) return done()\n io.signal?.addEventListener(\"abort\", () => done(), { once: true })\n })\n await server.close()\n inspector.close()\n await agent?.close?.().catch(() => {})\n return EXIT.ok\n}\n\n/* help */\n\nexport function inspectHelp(): string {\n const lines = [\n \"Inspect a mext server command by command: who (a caller profile) calls what, and what comes back.\",\n \"\",\n \"Usage:\",\n ` ${INSPECT_PROG} commands [<namespace>] List commands with safety metadata`,\n ` ${INSPECT_PROG} show <id> One command: safety, approval, scopes, input schema, examples, errors`,\n ` ${INSPECT_PROG} call [flags] <id> [input] Call a command (input: --flag value, or --input-json '<json>')`,\n ` ${INSPECT_PROG} run [<scenario|folder>...] Run scenario files (default: ${INSPECT_DIR}/scenarios)`,\n ` ${INSPECT_PROG} profiles List caller profiles (values are never printed)`,\n ` ${INSPECT_PROG} ui [--port <n>] [--agent <m>] Web UI on http://127.0.0.1:${UI_DEFAULT_PORT} (calls go through this process)`,\n ` ${INSPECT_PROG} mcp-config --as <profile> Print the mcp.toml entry that lets an agent (a Happy bot) use this server`,\n \"\",\n \"Server: --url <url>, or MEXT_URL, or the mext dev server running in this project.\",\n `Profiles: ${INSPECT_DIR}/${PROFILES_FILE} names tokens and headers by environment variable, e.g.`,\n ' { \"profiles\": { \"editor\": { \"token\": { \"env\": \"EDITOR_TOKEN\" } }, \"anonymous\": {} } }',\n \"Without the file there is one profile, default (token from MEXT_TOKEN if set).\",\n \"\",\n \"Flags:\",\n ...table([\n [\"--url <url>\", \"MCP endpoint of the server to inspect\"],\n [\"--profiles <path>\", `Profiles file (default: ${INSPECT_DIR}/${PROFILES_FILE})`],\n [\"--as <a>[,<b>...]\", \"Caller profile. Several = run the same request as each and compare\"],\n [\"--json\", \"Print JSON\"],\n [\"-h, --help\", \"Show help\"],\n ]).map((l) => ` ${l}`),\n \"\",\n `Flags of call (before <id>; everything after <id> is the command's input):`,\n ...table([\n [\"--confirmed\", \"Declare that a human confirmed this call (same as --yes after <id>)\"],\n [\"--answers <json>\", 'Answers for input requests: {\"confirm\": true, \"form\": {…}, \"url\": true}'],\n [\"--decline\", \"Decline input and confirmation requests\"],\n [\"--save <file>\", \"Append this call and its observed result to a scenario file\"],\n [\"--raw\", \"Also print the raw requests and responses (secrets redacted)\"],\n ]).map((l) => ` ${l}`),\n \"\",\n \"Flags of run (--agent also works for ui):\",\n ...table([\n [\"--bail\", \"Stop a scenario at its first failing step\"],\n [\"--agent <module>\", 'Agent client for \"agent\" steps (default export: { connect, send, onEvent })'],\n ]).map((l) => ` ${l}`),\n \"\",\n \"Exit code: 0 = every call succeeded / every scenario passed, 1 = an error result or a failed scenario, 2 = usage or file format error.\",\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** cwd 안 = 상대 경로 · 밖 = 절대 경로 */\nfunction shown(cwd: string, file: string): string {\n const rel = relative(cwd, file)\n return rel === \"\" || rel.startsWith(\"..\") ? file : rel\n}\n\nfunction indent(text: string, by = 2): string {\n const pad = \" \".repeat(by)\n return text\n .split(\"\\n\")\n .map((l) => (l === \"\" ? l : `${pad}${l}`))\n .join(\"\\n\")\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"]}
package/dist/cli/main.js CHANGED
@@ -9,7 +9,9 @@ import { devCommand } from "./dev.js";
9
9
  import { runLogout } from "./logout.js";
10
10
  import { mcpCommand } from "./mcp.js";
11
11
  import { runCommand } from "./run.js";
12
+ import { serveCommand } from "./serve.js";
12
13
  import { startCommand } from "./start.js";
14
+ import { typesCommand } from "./types.js";
13
15
  /**
14
16
  * 하위 명령 표. 이후 단계가 항목을 추가한다 (mcp · mcp --stdio · mcp install · login · build · run --url).
15
17
  * 순서 = help 표시 순서.
@@ -17,11 +19,19 @@ import { startCommand } from "./start.js";
17
19
  export const SUBCOMMANDS = [
18
20
  { name: "run", summary: "Run a command locally, or remotely with --url (mext run help)", run: runCommand },
19
21
  { name: "dev", summary: "Development MCP server with file watching (mext dev, mext dev --stdio)", run: devCommand },
22
+ { name: "serve", summary: "Production MCP server from source, no build, no file watching (mext serve --help)", run: serveCommand },
20
23
  { name: "mcp", summary: "Print MCP client registration commands (mext mcp install)", run: mcpCommand },
21
24
  { name: "login", summary: "Log in to a remote server (mext login --url <url>)", run: runLogin },
22
25
  { name: "logout", summary: "Revoke and remove stored credentials (mext logout --url <url>)", run: runLogout },
23
26
  { name: "build", summary: "Build .mext/ for production: bundle, manifest, server.js (mext build --help)", run: (argv, io) => runBuild(argv, io) },
24
27
  { name: "start", summary: "Production MCP server from .mext/ (mext start, mext start --stdio)", run: startCommand },
28
+ { name: "types", summary: "Generate command types for the typed client (mext types --help)", run: typesCommand },
29
+ // inspect 는 실행할 때만 읽는다 (mext start · run 이 inspector 코드를 import 하지 않게)
30
+ {
31
+ name: "inspect",
32
+ summary: "Inspect a server: commands, calls as caller profiles, scenarios (mext inspect --help)",
33
+ run: async (argv, io) => (await import("./inspect.js")).inspectCommand(argv, io),
34
+ },
25
35
  ];
26
36
  /**
27
37
  * mext CLI 진입점. argv = 실행 파일 뒤 인자 (process.argv.slice(2)). 반환 = exit code.
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,SAAS,EAAc,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAWzC;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoB;IAC1C,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,+DAA+D,EAAE,GAAG,EAAE,UAAU,EAAE;IAC1G,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,wEAAwE,EAAE,GAAG,EAAE,UAAU,EAAE;IACnH,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,2DAA2D,EAAE,GAAG,EAAE,UAAU,EAAE;IACtG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oDAAoD,EAAE,GAAG,EAAE,QAAQ,EAAE;IAC/F,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gEAAgE,EAAE,GAAG,EAAE,SAAS,EAAE;IAC7G,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,8EAA8E,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;IACjJ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oEAAoE,EAAE,GAAG,EAAE,YAAY,EAAE;CACpH,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAuB,EAAE,EAAE,GAAmB,EAAE;IAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,WAAW,GAAG,WAAW,CAAA;IAC/B,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC7D,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IACD,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC5C,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,EAAE,IAAI,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAA;IACrD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5F,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAChF,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,KAAK,IAAI,6CAA6C,CAAC,CAAA;QAC7G,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,WAAqC;IACrD,MAAM,KAAK,GAAG;QACZ,uDAAuD;QACvD,EAAE;QACF,QAAQ;QACR,yBAAyB;QACzB,EAAE;QACF,WAAW;QACX,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,EAAE;QACF,QAAQ;QACR,GAAG,KAAK,CAAC;YACP,CAAC,YAAY,EAAE,WAAW,CAAC;YAC3B,CAAC,eAAe,EAAE,mBAAmB,CAAC;SACvC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;KACxB,CAAA;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAA;IACpH,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAA;AAC/B,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\"\nimport { closest } from \"../suggest.ts\"\nimport { table } from \"./help.ts\"\nimport { resolveIo, type CliIo } from \"./io.ts\"\nimport { EXIT } from \"./output.ts\"\nimport { runBuild } from \"./build.ts\"\nimport { runLogin } from \"./login.ts\"\nimport { devCommand } from \"./dev.ts\"\nimport { runLogout } from \"./logout.ts\"\nimport { mcpCommand } from \"./mcp.ts\"\nimport { runCommand } from \"./run.ts\"\nimport { startCommand } from \"./start.ts\"\n\n/** mext 의 하위 명령 (run · dev · mcp install · login · logout · build · start) */\nexport interface CliSubcommand {\n name: string\n /** mext help 한 줄 설명 */\n summary: string\n /** 하위 명령 이름 뒤의 argv. 반환 = exit code */\n run(argv: readonly string[], io: CliIo): Promise<number>\n}\n\n/**\n * 하위 명령 표. 이후 단계가 항목을 추가한다 (mcp · mcp --stdio · mcp install · login · build · run --url).\n * 순서 = help 표시 순서.\n */\nexport const SUBCOMMANDS: CliSubcommand[] = [\n { name: \"run\", summary: \"Run a command locally, or remotely with --url (mext run help)\", run: runCommand },\n { name: \"dev\", summary: \"Development MCP server with file watching (mext dev, mext dev --stdio)\", run: devCommand },\n { name: \"mcp\", summary: \"Print MCP client registration commands (mext mcp install)\", run: mcpCommand },\n { name: \"login\", summary: \"Log in to a remote server (mext login --url <url>)\", run: runLogin },\n { name: \"logout\", summary: \"Revoke and remove stored credentials (mext logout --url <url>)\", run: runLogout },\n { name: \"build\", summary: \"Build .mext/ for production: bundle, manifest, server.js (mext build --help)\", run: (argv, io) => runBuild(argv, io) },\n { name: \"start\", summary: \"Production MCP server from .mext/ (mext start, mext start --stdio)\", run: startCommand },\n]\n\n/**\n * mext CLI 진입점. argv = 실행 파일 뒤 인자 (process.argv.slice(2)). 반환 = exit code.\n * io 는 테스트용 주입 (stdin · stdout · stderr · isTTY · env · cwd · signal), 생략 = process.\n */\nexport async function runCli(argv: readonly string[], io: Partial<CliIo> = {}): Promise<number> {\n const resolved = resolveIo(io)\n const subcommands = SUBCOMMANDS\n const [first, ...rest] = argv\n if (first === undefined) {\n resolved.stderr.write(rootHelp(subcommands))\n return EXIT.usage\n }\n if (first === \"help\" || first === \"--help\" || first === \"-h\") {\n resolved.stdout.write(rootHelp(subcommands))\n return EXIT.ok\n }\n if (first === \"--version\" || first === \"-v\") {\n resolved.stdout.write(`${packageVersion()}\\n`)\n return EXIT.ok\n }\n const sub = subcommands.find((s) => s.name === first)\n if (!sub) {\n const suggested = closest(first, subcommands.map((s): [string, string] => [s.name, s.name]))\n const hint = suggested.length > 0 ? ` Did you mean \"mext ${suggested[0]}\"?` : \"\"\n resolved.stderr.write(`error: unknown command \"${first}\".${hint}\\nRun \"mext help\" for available commands.\\n`)\n return EXIT.usage\n }\n return sub.run(rest, resolved)\n}\n\nfunction rootHelp(subcommands: readonly CliSubcommand[]): string {\n const lines = [\n \"mext — file-based commands as a CLI and an MCP server\",\n \"\",\n \"Usage:\",\n \" mext <command> [args]\",\n \"\",\n \"Commands:\",\n ...table(subcommands.map((s) => [s.name, s.summary])).map((l) => ` ${l}`),\n \"\",\n \"Flags:\",\n ...table([\n [\"-h, --help\", \"Show help\"],\n [\"-v, --version\", \"Print the version\"],\n ]).map((l) => ` ${l}`),\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n\nfunction packageVersion(): string {\n const pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf8\")) as { version?: string }\n return pkg.version ?? \"0.0.0\"\n}\n"]}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\"\nimport { closest } from \"../suggest.ts\"\nimport { table } from \"./help.ts\"\nimport { resolveIo, type CliIo } from \"./io.ts\"\nimport { EXIT } from \"./output.ts\"\nimport { runBuild } from \"./build.ts\"\nimport { runLogin } from \"./login.ts\"\nimport { devCommand } from \"./dev.ts\"\nimport { runLogout } from \"./logout.ts\"\nimport { mcpCommand } from \"./mcp.ts\"\nimport { runCommand } from \"./run.ts\"\nimport { serveCommand } from \"./serve.ts\"\nimport { startCommand } from \"./start.ts\"\nimport { typesCommand } from \"./types.ts\"\n\n/** mext 의 하위 명령 (run · dev · mcp install · login · logout · build · start) */\nexport interface CliSubcommand {\n name: string\n /** mext help 한 줄 설명 */\n summary: string\n /** 하위 명령 이름 뒤의 argv. 반환 = exit code */\n run(argv: readonly string[], io: CliIo): Promise<number>\n}\n\n/**\n * 하위 명령 표. 이후 단계가 항목을 추가한다 (mcp · mcp --stdio · mcp install · login · build · run --url).\n * 순서 = help 표시 순서.\n */\nexport const SUBCOMMANDS: CliSubcommand[] = [\n { name: \"run\", summary: \"Run a command locally, or remotely with --url (mext run help)\", run: runCommand },\n { name: \"dev\", summary: \"Development MCP server with file watching (mext dev, mext dev --stdio)\", run: devCommand },\n { name: \"serve\", summary: \"Production MCP server from source, no build, no file watching (mext serve --help)\", run: serveCommand },\n { name: \"mcp\", summary: \"Print MCP client registration commands (mext mcp install)\", run: mcpCommand },\n { name: \"login\", summary: \"Log in to a remote server (mext login --url <url>)\", run: runLogin },\n { name: \"logout\", summary: \"Revoke and remove stored credentials (mext logout --url <url>)\", run: runLogout },\n { name: \"build\", summary: \"Build .mext/ for production: bundle, manifest, server.js (mext build --help)\", run: (argv, io) => runBuild(argv, io) },\n { name: \"start\", summary: \"Production MCP server from .mext/ (mext start, mext start --stdio)\", run: startCommand },\n { name: \"types\", summary: \"Generate command types for the typed client (mext types --help)\", run: typesCommand },\n // inspect 는 실행할 때만 읽는다 (mext start · run 이 inspector 코드를 import 하지 않게)\n {\n name: \"inspect\",\n summary: \"Inspect a server: commands, calls as caller profiles, scenarios (mext inspect --help)\",\n run: async (argv, io) => (await import(\"./inspect.ts\")).inspectCommand(argv, io),\n },\n]\n\n/**\n * mext CLI 진입점. argv = 실행 파일 뒤 인자 (process.argv.slice(2)). 반환 = exit code.\n * io 는 테스트용 주입 (stdin · stdout · stderr · isTTY · env · cwd · signal), 생략 = process.\n */\nexport async function runCli(argv: readonly string[], io: Partial<CliIo> = {}): Promise<number> {\n const resolved = resolveIo(io)\n const subcommands = SUBCOMMANDS\n const [first, ...rest] = argv\n if (first === undefined) {\n resolved.stderr.write(rootHelp(subcommands))\n return EXIT.usage\n }\n if (first === \"help\" || first === \"--help\" || first === \"-h\") {\n resolved.stdout.write(rootHelp(subcommands))\n return EXIT.ok\n }\n if (first === \"--version\" || first === \"-v\") {\n resolved.stdout.write(`${packageVersion()}\\n`)\n return EXIT.ok\n }\n const sub = subcommands.find((s) => s.name === first)\n if (!sub) {\n const suggested = closest(first, subcommands.map((s): [string, string] => [s.name, s.name]))\n const hint = suggested.length > 0 ? ` Did you mean \"mext ${suggested[0]}\"?` : \"\"\n resolved.stderr.write(`error: unknown command \"${first}\".${hint}\\nRun \"mext help\" for available commands.\\n`)\n return EXIT.usage\n }\n return sub.run(rest, resolved)\n}\n\nfunction rootHelp(subcommands: readonly CliSubcommand[]): string {\n const lines = [\n \"mext — file-based commands as a CLI and an MCP server\",\n \"\",\n \"Usage:\",\n \" mext <command> [args]\",\n \"\",\n \"Commands:\",\n ...table(subcommands.map((s) => [s.name, s.summary])).map((l) => ` ${l}`),\n \"\",\n \"Flags:\",\n ...table([\n [\"-h, --help\", \"Show help\"],\n [\"-v, --version\", \"Print the version\"],\n ]).map((l) => ` ${l}`),\n ]\n return `${lines.join(\"\\n\")}\\n`\n}\n\nfunction packageVersion(): string {\n const pkg = JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf8\")) as { version?: string }\n return pkg.version ?? \"0.0.0\"\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { CliWriter } from "./io.ts";
2
+ /**
3
+ * CLI 의 결과 콘텐츠 (spec §4): MCP content 블록 중 image · audio = 파일 저장 + stderr 1줄, resource_link = stderr 1줄.
4
+ * 로컬 (mext run · 로컬 bin) · 원격 (고객 CLI · mext run --url) 공용. 서버 코드 · Zod 를 import 하지 않는다 (고객 CLI 번들)
5
+ */
6
+ export interface SaveContentOptions {
7
+ /** 정식 명령어 ID (파일 이름 접두) */
8
+ command: string;
9
+ /** 실행 파일 이름. 폴더 환경변수 = <BIN>_MEDIA_DIR (mext run = MEXT_MEDIA_DIR) */
10
+ bin: string;
11
+ env: Record<string, string | undefined>;
12
+ /** 상대 경로 <BIN>_MEDIA_DIR 의 기준 */
13
+ cwd: string;
14
+ stderr: CliWriter;
15
+ }
16
+ /** content 블록 (값 text 제외) 처리. 저장 파일 경로 목록 (순서 = 블록 순서) */
17
+ export declare function saveContent(blocks: readonly unknown[], options: SaveContentOptions): string[];
18
+ /** mimeType → 확장자. 표에 없으면 subtype (영숫자만), 그것도 없으면 bin */
19
+ export declare function extensionOf(mimeType: string): string;
@@ -0,0 +1,77 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ /** content 블록 (값 text 제외) 처리. 저장 파일 경로 목록 (순서 = 블록 순서) */
5
+ export function saveContent(blocks, options) {
6
+ const saved = [];
7
+ let dir;
8
+ for (const block of blocks) {
9
+ if (!isRecord(block))
10
+ continue;
11
+ if (block.type === "resource_link" && typeof block.uri === "string") {
12
+ const name = typeof block.name === "string" && block.name !== "" ? ` (${block.name})` : "";
13
+ options.stderr.write(`resource ${block.uri}${name}\n`);
14
+ continue;
15
+ }
16
+ if ((block.type !== "image" && block.type !== "audio") || typeof block.data !== "string" || typeof block.mimeType !== "string")
17
+ continue;
18
+ dir ??= mediaDir(options);
19
+ const bytes = Buffer.from(block.data, "base64");
20
+ const file = join(dir, `${safeName(options.command)}-${saved.length + 1}.${extensionOf(block.mimeType)}`);
21
+ writeFileSync(file, bytes);
22
+ saved.push(file);
23
+ options.stderr.write(`saved ${block.mimeType} (${formatSize(bytes.byteLength)}) → ${file}\n`);
24
+ }
25
+ return saved;
26
+ }
27
+ /** <BIN>_MEDIA_DIR (없으면 만든다) 또는 실행마다 새 임시 폴더 */
28
+ function mediaDir(options) {
29
+ const configured = options.env[`${options.bin.toUpperCase().replace(/[^A-Z0-9]/g, "_")}_MEDIA_DIR`];
30
+ if (configured !== undefined && configured !== "") {
31
+ const dir = resolve(options.cwd, configured);
32
+ mkdirSync(dir, { recursive: true });
33
+ return dir;
34
+ }
35
+ return mkdtempSync(join(tmpdir(), `${safeName(options.bin)}-media-`));
36
+ }
37
+ const EXTENSIONS = {
38
+ "image/png": "png",
39
+ "image/jpeg": "jpg",
40
+ "image/gif": "gif",
41
+ "image/webp": "webp",
42
+ "image/svg+xml": "svg",
43
+ "image/avif": "avif",
44
+ "image/bmp": "bmp",
45
+ "audio/mpeg": "mp3",
46
+ "audio/wav": "wav",
47
+ "audio/x-wav": "wav",
48
+ "audio/wave": "wav",
49
+ "audio/ogg": "ogg",
50
+ "audio/webm": "webm",
51
+ "audio/flac": "flac",
52
+ "audio/aac": "aac",
53
+ "audio/mp4": "m4a",
54
+ };
55
+ /** mimeType → 확장자. 표에 없으면 subtype (영숫자만), 그것도 없으면 bin */
56
+ export function extensionOf(mimeType) {
57
+ const base = mimeType.split(";")[0].trim().toLowerCase();
58
+ const known = EXTENSIONS[base];
59
+ if (known !== undefined)
60
+ return known;
61
+ const subtype = (base.split("/")[1] ?? "").replace(/[^a-z0-9]/g, "");
62
+ return subtype === "" ? "bin" : subtype;
63
+ }
64
+ function safeName(name) {
65
+ return name.replace(/[^A-Za-z0-9._-]/g, "_");
66
+ }
67
+ function formatSize(bytes) {
68
+ if (bytes < 1024)
69
+ return `${bytes} B`;
70
+ if (bytes < 1024 * 1024)
71
+ return `${(bytes / 1024).toFixed(1)} KB`;
72
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
73
+ }
74
+ function isRecord(value) {
75
+ return typeof value === "object" && value !== null && !Array.isArray(value);
76
+ }
77
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/cli/media.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdirSync, mkdtempSync, writeFileSync } from \"node:fs\"\nimport { tmpdir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\nimport type { CliWriter } from \"./io.ts\"\n\n/**\n * CLI 의 결과 콘텐츠 (spec §4): MCP content 블록 중 image · audio = 파일 저장 + stderr 1줄, resource_link = stderr 1줄.\n * 로컬 (mext run · 로컬 bin) · 원격 (고객 CLI · mext run --url) 공용. 서버 코드 · Zod 를 import 하지 않는다 (고객 CLI 번들)\n */\n\nexport interface SaveContentOptions {\n /** 정식 명령어 ID (파일 이름 접두) */\n command: string\n /** 실행 파일 이름. 폴더 환경변수 = <BIN>_MEDIA_DIR (mext run = MEXT_MEDIA_DIR) */\n bin: string\n env: Record<string, string | undefined>\n /** 상대 경로 <BIN>_MEDIA_DIR 의 기준 */\n cwd: string\n stderr: CliWriter\n}\n\n/** content 블록 (값 text 제외) 처리. 저장 파일 경로 목록 (순서 = 블록 순서) */\nexport function saveContent(blocks: readonly unknown[], options: SaveContentOptions): string[] {\n const saved: string[] = []\n let dir: string | undefined\n for (const block of blocks) {\n if (!isRecord(block)) continue\n if (block.type === \"resource_link\" && typeof block.uri === \"string\") {\n const name = typeof block.name === \"string\" && block.name !== \"\" ? ` (${block.name})` : \"\"\n options.stderr.write(`resource ${block.uri}${name}\\n`)\n continue\n }\n if ((block.type !== \"image\" && block.type !== \"audio\") || typeof block.data !== \"string\" || typeof block.mimeType !== \"string\") continue\n dir ??= mediaDir(options)\n const bytes = Buffer.from(block.data, \"base64\")\n const file = join(dir, `${safeName(options.command)}-${saved.length + 1}.${extensionOf(block.mimeType)}`)\n writeFileSync(file, bytes)\n saved.push(file)\n options.stderr.write(`saved ${block.mimeType} (${formatSize(bytes.byteLength)}) → ${file}\\n`)\n }\n return saved\n}\n\n/** <BIN>_MEDIA_DIR (없으면 만든다) 또는 실행마다 새 임시 폴더 */\nfunction mediaDir(options: SaveContentOptions): string {\n const configured = options.env[`${options.bin.toUpperCase().replace(/[^A-Z0-9]/g, \"_\")}_MEDIA_DIR`]\n if (configured !== undefined && configured !== \"\") {\n const dir = resolve(options.cwd, configured)\n mkdirSync(dir, { recursive: true })\n return dir\n }\n return mkdtempSync(join(tmpdir(), `${safeName(options.bin)}-media-`))\n}\n\nconst EXTENSIONS: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n \"image/svg+xml\": \"svg\",\n \"image/avif\": \"avif\",\n \"image/bmp\": \"bmp\",\n \"audio/mpeg\": \"mp3\",\n \"audio/wav\": \"wav\",\n \"audio/x-wav\": \"wav\",\n \"audio/wave\": \"wav\",\n \"audio/ogg\": \"ogg\",\n \"audio/webm\": \"webm\",\n \"audio/flac\": \"flac\",\n \"audio/aac\": \"aac\",\n \"audio/mp4\": \"m4a\",\n}\n\n/** mimeType → 확장자. 표에 없으면 subtype (영숫자만), 그것도 없으면 bin */\nexport function extensionOf(mimeType: string): string {\n const base = mimeType.split(\";\")[0]!.trim().toLowerCase()\n const known = EXTENSIONS[base]\n if (known !== undefined) return known\n const subtype = (base.split(\"/\")[1] ?? \"\").replace(/[^a-z0-9]/g, \"\")\n return subtype === \"\" ? \"bin\" : subtype\n}\n\nfunction safeName(name: string): string {\n return name.replace(/[^A-Za-z0-9._-]/g, \"_\")\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"]}
@@ -13,7 +13,7 @@ export declare class CliInterrupted extends Error {
13
13
  }
14
14
  /**
15
15
  * 오류 → exit code.
16
- * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED = 77 · SIGINT = 130 · 그 외 = 1
16
+ * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED · APPROVAL_REQUIRED = 77 · SIGINT = 130 · 그 외 = 1
17
17
  */
18
18
  export declare function exitCodeOf(error: unknown): number;
19
19
  /**
@@ -18,7 +18,7 @@ export class CliInterrupted extends Error {
18
18
  }
19
19
  /**
20
20
  * 오류 → exit code.
21
- * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED = 77 · SIGINT = 130 · 그 외 = 1
21
+ * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED · APPROVAL_REQUIRED = 77 · SIGINT = 130 · 그 외 = 1
22
22
  */
23
23
  export function exitCodeOf(error) {
24
24
  if (error instanceof CliInterrupted)
@@ -31,6 +31,7 @@ export function exitCodeOf(error) {
31
31
  return EXIT.usage;
32
32
  case "UNAUTHENTICATED":
33
33
  case "PERMISSION_DENIED":
34
+ case "APPROVAL_REQUIRED":
34
35
  return EXIT.auth;
35
36
  }
36
37
  }
@@ -182,7 +183,7 @@ export function emitError(io, error, formatter) {
182
183
  const { code, message, ...details } = error.body;
183
184
  const info = {
184
185
  code: typeof code === "string" ? code : "EXECUTION_ERROR",
185
- message: typeof message === "string" ? message : String(message ?? ""),
186
+ message: typeof message === "string" ? message : message == null ? "" : JSON.stringify(message),
186
187
  details,
187
188
  reasons: reasonsOf(details),
188
189
  body: error.body,
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProgressUpdate } from \"../command.ts\"\nimport { CommandError, isMextError, MextBuildError, MextError } from \"../errors.ts\"\nimport { toKebab } from \"./args.ts\"\nimport { cliPath, table } from \"./help.ts\"\n\n/** exit code (spec §5) */\nexport const EXIT = {\n ok: 0,\n error: 1,\n usage: 2,\n auth: 77,\n interrupted: 130,\n} as const\n\n/** 실행 중 SIGINT (ctx.signal abort) 를 나타내는 CLI 내부 오류 */\nexport class CliInterrupted extends Error {\n constructor() {\n super(\"Interrupted.\")\n this.name = \"CliInterrupted\"\n }\n}\n\n/**\n * 오류 → exit code.\n * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED = 77 · SIGINT = 130 · 그 외 = 1\n */\nexport function exitCodeOf(error: unknown): number {\n if (error instanceof CliInterrupted) return EXIT.interrupted\n if (error instanceof MextError) {\n switch (error.code) {\n case \"INVALID_ARGUMENT\":\n case \"UNKNOWN_COMMAND\":\n case \"INPUT_UNAVAILABLE\":\n return EXIT.usage\n case \"UNAUTHENTICATED\":\n case \"PERMISSION_DENIED\":\n return EXIT.auth\n }\n }\n return EXIT.error\n}\n\n/**\n * --json 오류 본문. MextError · CommandError = toJSON(), 빌드 오류 = BUILD_ERROR + issues,\n * SIGINT = INTERRUPTED, 핸들러 예외 = EXECUTION_ERROR\n */\nexport function errorJson(error: unknown): Record<string, unknown> {\n if (error instanceof MextError || error instanceof CommandError) return error.toJSON()\n if (error instanceof MextBuildError) return { code: \"BUILD_ERROR\", message: error.message, issues: error.issues }\n if (error instanceof CliInterrupted) return { code: \"INTERRUPTED\", message: error.message }\n return { code: \"EXECUTION_ERROR\", message: error instanceof Error ? error.message : String(error) }\n}\n\n/** 사람용 오류 텍스트 (끝 줄바꿈 포함) */\nexport function formatError(error: unknown, prog: string): string {\n const lines: string[] = []\n if (isMextError(error, \"INVALID_ARGUMENT\")) {\n const d = error.details\n lines.push(d.command === \"\" ? \"error: invalid arguments\" : `error: invalid arguments for ${cliPath(d.command)}`)\n const rows = d.issues.map((i) => {\n if (i.path === \"\") return [i.message]\n return [flagOf(i.path), d.missing_fields.includes(i.path) ? \"required\" : i.message]\n })\n lines.push(...table(rows.filter((r) => r.length === 2)).map((l) => ` ${l}`))\n lines.push(...rows.filter((r) => r.length === 1).map((r) => ` ${r[0]}`))\n if (d.command !== \"\") lines.push(`Run \"${prog} ${cliPath(d.command)} --help\" for usage.`)\n } else if (isMextError(error, \"UNKNOWN_COMMAND\")) {\n const d = error.details\n if (d.command === \"\") lines.push(\"error: no command given\")\n else if (error.message.startsWith(\"Unknown command\")) lines.push(`error: unknown command \"${cliPath(d.command)}\"`)\n else lines.push(`error: ${error.message}`)\n if (d.suggested.length > 0) lines.push(`Did you mean: ${d.suggested.map((s) => `${prog} ${cliPath(s)}`).join(\", \")}?`)\n lines.push(`Run \"${usageCommand(prog, d.usage)}\" for available commands.`)\n } else if (isMextError(error, \"PERMISSION_DENIED\")) {\n const d = error.details\n lines.push(`error: ${error.message}`)\n lines.push(` required scopes: ${d.required_scopes.join(\", \") || \"(none)\"}`)\n lines.push(` held scopes: ${d.held_scopes.join(\", \") || \"(none)\"}`)\n } else if (isMextError(error, \"UNAUTHENTICATED\")) {\n lines.push(`error: ${error.message}`)\n if (error.details.login !== undefined) lines.push(`Run \"${error.details.login}\" to log in.`)\n } else if (isMextError(error, \"INPUT_UNAVAILABLE\")) {\n lines.push(`error: ${error.message}`)\n } else if (error instanceof Error) {\n lines.push(`error: ${error.message}`)\n } else {\n lines.push(`error: ${String(error)}`)\n }\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** \"help\" → \"mext run help\" · \"help users\" → \"mext run users --help\" */\nfunction usageCommand(prog: string, usage: string): string {\n const target = usage.replace(/^help\\s*/, \"\")\n return target === \"\" ? `${prog} help` : `${prog} ${cliPath(target)} --help`\n}\n\n/** 입력 경로 → 플래그 표기 (\"filter.minAge\" → \"--filter.min-age\") */\nfunction flagOf(path: string): string {\n return `--${path\n .split(\".\")\n .map((s) => (/^\\d+$/.test(s) ? s : toKebab(s)))\n .join(\".\")}`\n}\n\n/**\n * 사람용 결과 텍스트 (끝 줄바꿈 포함, undefined = 빈 문자열).\n * 문자열 = 그대로 · 원시 값 = String · 객체 배열 = 표 · 원시 배열 = 줄마다 · 객체 = 키 값 정렬. 중첩 값은 JSON 한 줄\n */\nexport function formatResult(value: unknown): string {\n if (value === undefined) return \"\"\n if (value === null) return \"null\\n\"\n if (typeof value === \"string\") return value.endsWith(\"\\n\") ? value : `${value}\\n`\n if (Array.isArray(value)) {\n if (value.length === 0) return \"(empty)\\n\"\n if (value.every(isRecord)) {\n const columns: string[] = []\n for (const row of value) for (const k of Object.keys(row)) if (!columns.includes(k)) columns.push(k)\n return lines(table([columns, ...value.map((row) => columns.map((c) => cell(row[c])))]))\n }\n return lines(value.map(cell))\n }\n if (isRecord(value)) {\n const entries = Object.entries(value).filter(([, v]) => v !== undefined)\n if (entries.length === 0) return \"(empty)\\n\"\n return lines(table(entries.map(([k, v]) => [k, cell(v)])))\n }\n return `${cell(value)}\\n`\n}\n\n/** --json 결과 */\nexport function formatJson(value: unknown): string {\n return `${JSON.stringify(value === undefined ? null : value, null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date)\n}\n\nfunction cell(value: unknown): string {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") return String(value)\n if (value instanceof Date) return value.toISOString()\n return JSON.stringify(value) ?? \"\"\n}\n\nfunction lines(list: string[]): string {\n return `${list.join(\"\\n\")}\\n`\n}\n\n/** ctx.progress → stderr 한 줄 */\nexport function formatProgress(update: ProgressUpdate): string {\n const head = update.total !== undefined ? `[${update.progress}/${update.total}]` : `[${update.progress}]`\n return `${update.message ? `${head} ${update.message}` : head}\\n`\n}\n\n/* ---------------------------------------------------------------- 오류 출력 커스텀 (cli.errors, spec §5) */\n\n/** cli.errors formatter 입력: 오류 하나 + mext 기본 출력 */\nexport interface CliErrorInfo {\n /** MextErrorCode · EXECUTION_ERROR · INTERRUPTED · REMOTE_ERROR · LOGIN_FAILED · LOGOUT_FAILED · 핸들러 정의 오류 code 등 (= body.code) */\n code: string\n message: string\n /** 오류 상세 (MextError.details · 서버 오류 본문의 code · message 외 필드) */\n details: Record<string, unknown>\n /** INVALID_ARGUMENT issues 의 \"경로: 메시지\" (경로 없으면 메시지). 그 외 [] */\n reasons: string[]\n /** mext 기본 --json 오류 본문 */\n body: Record<string, unknown>\n /** mext 기본 사람용 텍스트 (끝 줄바꿈 포함) */\n text: string\n /** mext 기본 exit code (0 · 1 · 2 · 77 · 130) */\n exitCode: number\n /** --json 지정 여부 */\n json: boolean\n}\n\n/** formatter 출력. 지정한 필드만 기본값 대체 (stderr 기본 = json ? body JSON : text, stdout 기본 = 없음) */\nexport interface CliErrorOutput {\n exitCode?: number\n stderr?: string\n stdout?: string\n}\n\n/** cli.errors 모듈의 default export. undefined 반환 = mext 기본 */\nexport type CliErrorFormatter = (error: CliErrorInfo) => CliErrorOutput | undefined | void\n\nexport interface CliErrorWriter {\n stdout: { write(chunk: string): unknown }\n stderr: { write(chunk: string): unknown }\n}\n\n/**\n * 오류 출력 (기본 = json ? body : text) + formatter 적용 → exit code.\n * formatter 예외 · 잘못된 exitCode = 기본값 + stderr 경고 1줄\n */\nexport function emitError(\n io: CliErrorWriter,\n error: { body: Record<string, unknown>; text: string; exitCode: number; json: boolean },\n formatter: CliErrorFormatter | undefined,\n): number {\n const fallback = error.json ? formatJson(error.body) : error.text\n if (!formatter) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n const { code, message, ...details } = error.body\n const info: CliErrorInfo = {\n code: typeof code === \"string\" ? code : \"EXECUTION_ERROR\",\n message: typeof message === \"string\" ? message : String(message ?? \"\"),\n details,\n reasons: reasonsOf(details),\n body: error.body,\n text: error.text,\n exitCode: error.exitCode,\n json: error.json,\n }\n let out: CliErrorOutput | undefined | void\n try {\n out = formatter(info)\n } catch (e) {\n io.stderr.write(fallback)\n io.stderr.write(`warning: cli.errors formatter failed: ${e instanceof Error ? e.message : String(e)}\\n`)\n return error.exitCode\n }\n if (out === undefined || out === null) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n if (out.stdout !== undefined) io.stdout.write(out.stdout)\n io.stderr.write(out.stderr ?? fallback)\n if (out.exitCode === undefined) return error.exitCode\n if (!Number.isInteger(out.exitCode) || out.exitCode < 0 || out.exitCode > 255) {\n io.stderr.write(`warning: cli.errors formatter returned an invalid exitCode (${String(out.exitCode)})\\n`)\n return error.exitCode\n }\n return out.exitCode\n}\n\n/** INVALID_ARGUMENT details.issues → \"경로: 메시지\" */\nfunction reasonsOf(details: Record<string, unknown>): string[] {\n const issues = details.issues\n if (!Array.isArray(issues)) return []\n return issues.flatMap((i) => {\n if (!isRecord(i) || typeof i.message !== \"string\") return []\n return [typeof i.path === \"string\" && i.path !== \"\" ? `${i.path}: ${i.message}` : i.message]\n })\n}\n"]}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProgressUpdate } from \"../command.ts\"\nimport { CommandError, isMextError, MextBuildError, MextError } from \"../errors.ts\"\nimport { toKebab } from \"./args.ts\"\nimport { cliPath, table } from \"./help.ts\"\n\n/** exit code (spec §5) */\nexport const EXIT = {\n ok: 0,\n error: 1,\n usage: 2,\n auth: 77,\n interrupted: 130,\n} as const\n\n/** 실행 중 SIGINT (ctx.signal abort) 를 나타내는 CLI 내부 오류 */\nexport class CliInterrupted extends Error {\n constructor() {\n super(\"Interrupted.\")\n this.name = \"CliInterrupted\"\n }\n}\n\n/**\n * 오류 → exit code.\n * INVALID_ARGUMENT · UNKNOWN_COMMAND · INPUT_UNAVAILABLE = 2 · UNAUTHENTICATED · PERMISSION_DENIED · APPROVAL_REQUIRED = 77 · SIGINT = 130 · 그 외 = 1\n */\nexport function exitCodeOf(error: unknown): number {\n if (error instanceof CliInterrupted) return EXIT.interrupted\n if (error instanceof MextError) {\n switch (error.code) {\n case \"INVALID_ARGUMENT\":\n case \"UNKNOWN_COMMAND\":\n case \"INPUT_UNAVAILABLE\":\n return EXIT.usage\n case \"UNAUTHENTICATED\":\n case \"PERMISSION_DENIED\":\n case \"APPROVAL_REQUIRED\":\n return EXIT.auth\n }\n }\n return EXIT.error\n}\n\n/**\n * --json 오류 본문. MextError · CommandError = toJSON(), 빌드 오류 = BUILD_ERROR + issues,\n * SIGINT = INTERRUPTED, 핸들러 예외 = EXECUTION_ERROR\n */\nexport function errorJson(error: unknown): Record<string, unknown> {\n if (error instanceof MextError || error instanceof CommandError) return error.toJSON()\n if (error instanceof MextBuildError) return { code: \"BUILD_ERROR\", message: error.message, issues: error.issues }\n if (error instanceof CliInterrupted) return { code: \"INTERRUPTED\", message: error.message }\n return { code: \"EXECUTION_ERROR\", message: error instanceof Error ? error.message : String(error) }\n}\n\n/** 사람용 오류 텍스트 (끝 줄바꿈 포함) */\nexport function formatError(error: unknown, prog: string): string {\n const lines: string[] = []\n if (isMextError(error, \"INVALID_ARGUMENT\")) {\n const d = error.details\n lines.push(d.command === \"\" ? \"error: invalid arguments\" : `error: invalid arguments for ${cliPath(d.command)}`)\n const rows = d.issues.map((i) => {\n if (i.path === \"\") return [i.message]\n return [flagOf(i.path), d.missing_fields.includes(i.path) ? \"required\" : i.message]\n })\n lines.push(...table(rows.filter((r) => r.length === 2)).map((l) => ` ${l}`))\n lines.push(...rows.filter((r) => r.length === 1).map((r) => ` ${r[0]}`))\n if (d.command !== \"\") lines.push(`Run \"${prog} ${cliPath(d.command)} --help\" for usage.`)\n } else if (isMextError(error, \"UNKNOWN_COMMAND\")) {\n const d = error.details\n if (d.command === \"\") lines.push(\"error: no command given\")\n else if (error.message.startsWith(\"Unknown command\")) lines.push(`error: unknown command \"${cliPath(d.command)}\"`)\n else lines.push(`error: ${error.message}`)\n if (d.suggested.length > 0) lines.push(`Did you mean: ${d.suggested.map((s) => `${prog} ${cliPath(s)}`).join(\", \")}?`)\n lines.push(`Run \"${usageCommand(prog, d.usage)}\" for available commands.`)\n } else if (isMextError(error, \"PERMISSION_DENIED\")) {\n const d = error.details\n lines.push(`error: ${error.message}`)\n lines.push(` required scopes: ${d.required_scopes.join(\", \") || \"(none)\"}`)\n lines.push(` held scopes: ${d.held_scopes.join(\", \") || \"(none)\"}`)\n } else if (isMextError(error, \"UNAUTHENTICATED\")) {\n lines.push(`error: ${error.message}`)\n if (error.details.login !== undefined) lines.push(`Run \"${error.details.login}\" to log in.`)\n } else if (isMextError(error, \"INPUT_UNAVAILABLE\")) {\n lines.push(`error: ${error.message}`)\n } else if (error instanceof Error) {\n lines.push(`error: ${error.message}`)\n } else {\n lines.push(`error: ${String(error)}`)\n }\n return `${lines.join(\"\\n\")}\\n`\n}\n\n/** \"help\" → \"mext run help\" · \"help users\" → \"mext run users --help\" */\nfunction usageCommand(prog: string, usage: string): string {\n const target = usage.replace(/^help\\s*/, \"\")\n return target === \"\" ? `${prog} help` : `${prog} ${cliPath(target)} --help`\n}\n\n/** 입력 경로 → 플래그 표기 (\"filter.minAge\" → \"--filter.min-age\") */\nfunction flagOf(path: string): string {\n return `--${path\n .split(\".\")\n .map((s) => (/^\\d+$/.test(s) ? s : toKebab(s)))\n .join(\".\")}`\n}\n\n/**\n * 사람용 결과 텍스트 (끝 줄바꿈 포함, undefined = 빈 문자열).\n * 문자열 = 그대로 · 원시 값 = String · 객체 배열 = 표 · 원시 배열 = 줄마다 · 객체 = 키 값 정렬. 중첩 값은 JSON 한 줄\n */\nexport function formatResult(value: unknown): string {\n if (value === undefined) return \"\"\n if (value === null) return \"null\\n\"\n if (typeof value === \"string\") return value.endsWith(\"\\n\") ? value : `${value}\\n`\n if (Array.isArray(value)) {\n if (value.length === 0) return \"(empty)\\n\"\n if (value.every(isRecord)) {\n const columns: string[] = []\n for (const row of value) for (const k of Object.keys(row)) if (!columns.includes(k)) columns.push(k)\n return lines(table([columns, ...value.map((row) => columns.map((c) => cell(row[c])))]))\n }\n return lines(value.map(cell))\n }\n if (isRecord(value)) {\n const entries = Object.entries(value).filter(([, v]) => v !== undefined)\n if (entries.length === 0) return \"(empty)\\n\"\n return lines(table(entries.map(([k, v]) => [k, cell(v)])))\n }\n return `${cell(value)}\\n`\n}\n\n/** --json 결과 */\nexport function formatJson(value: unknown): string {\n return `${JSON.stringify(value === undefined ? null : value, null, 2)}\\n`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date)\n}\n\nfunction cell(value: unknown): string {\n if (value === undefined || value === null) return \"\"\n if (typeof value === \"string\") return value\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") return String(value)\n if (value instanceof Date) return value.toISOString()\n return JSON.stringify(value) ?? \"\"\n}\n\nfunction lines(list: string[]): string {\n return `${list.join(\"\\n\")}\\n`\n}\n\n/** ctx.progress → stderr 한 줄 */\nexport function formatProgress(update: ProgressUpdate): string {\n const head = update.total !== undefined ? `[${update.progress}/${update.total}]` : `[${update.progress}]`\n return `${update.message ? `${head} ${update.message}` : head}\\n`\n}\n\n/* ---------------------------------------------------------------- 오류 출력 커스텀 (cli.errors, spec §5) */\n\n/** cli.errors formatter 입력: 오류 하나 + mext 기본 출력 */\nexport interface CliErrorInfo {\n /** MextErrorCode · EXECUTION_ERROR · INTERRUPTED · REMOTE_ERROR · LOGIN_FAILED · LOGOUT_FAILED · 핸들러 정의 오류 code 등 (= body.code) */\n code: string\n message: string\n /** 오류 상세 (MextError.details · 서버 오류 본문의 code · message 외 필드) */\n details: Record<string, unknown>\n /** INVALID_ARGUMENT issues 의 \"경로: 메시지\" (경로 없으면 메시지). 그 외 [] */\n reasons: string[]\n /** mext 기본 --json 오류 본문 */\n body: Record<string, unknown>\n /** mext 기본 사람용 텍스트 (끝 줄바꿈 포함) */\n text: string\n /** mext 기본 exit code (0 · 1 · 2 · 77 · 130) */\n exitCode: number\n /** --json 지정 여부 */\n json: boolean\n}\n\n/** formatter 출력. 지정한 필드만 기본값 대체 (stderr 기본 = json ? body JSON : text, stdout 기본 = 없음) */\nexport interface CliErrorOutput {\n exitCode?: number\n stderr?: string\n stdout?: string\n}\n\n/** cli.errors 모듈의 default export. undefined 반환 = mext 기본 */\nexport type CliErrorFormatter = (error: CliErrorInfo) => CliErrorOutput | undefined | void\n\nexport interface CliErrorWriter {\n stdout: { write(chunk: string): unknown }\n stderr: { write(chunk: string): unknown }\n}\n\n/**\n * 오류 출력 (기본 = json ? body : text) + formatter 적용 → exit code.\n * formatter 예외 · 잘못된 exitCode = 기본값 + stderr 경고 1줄\n */\nexport function emitError(\n io: CliErrorWriter,\n error: { body: Record<string, unknown>; text: string; exitCode: number; json: boolean },\n formatter: CliErrorFormatter | undefined,\n): number {\n const fallback = error.json ? formatJson(error.body) : error.text\n if (!formatter) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n const { code, message, ...details } = error.body\n const info: CliErrorInfo = {\n code: typeof code === \"string\" ? code : \"EXECUTION_ERROR\",\n message: typeof message === \"string\" ? message : message == null ? \"\" : JSON.stringify(message),\n details,\n reasons: reasonsOf(details),\n body: error.body,\n text: error.text,\n exitCode: error.exitCode,\n json: error.json,\n }\n let out: CliErrorOutput | undefined | void\n try {\n out = formatter(info)\n } catch (e) {\n io.stderr.write(fallback)\n io.stderr.write(`warning: cli.errors formatter failed: ${e instanceof Error ? e.message : String(e)}\\n`)\n return error.exitCode\n }\n if (out === undefined || out === null) {\n io.stderr.write(fallback)\n return error.exitCode\n }\n if (out.stdout !== undefined) io.stdout.write(out.stdout)\n io.stderr.write(out.stderr ?? fallback)\n if (out.exitCode === undefined) return error.exitCode\n if (!Number.isInteger(out.exitCode) || out.exitCode < 0 || out.exitCode > 255) {\n io.stderr.write(`warning: cli.errors formatter returned an invalid exitCode (${String(out.exitCode)})\\n`)\n return error.exitCode\n }\n return out.exitCode\n}\n\n/** INVALID_ARGUMENT details.issues → \"경로: 메시지\" */\nfunction reasonsOf(details: Record<string, unknown>): string[] {\n const issues = details.issues\n if (!Array.isArray(issues)) return []\n return issues.flatMap((i) => {\n if (!isRecord(i) || typeof i.message !== \"string\") return []\n return [typeof i.path === \"string\" && i.path !== \"\" ? `${i.path}: ${i.message}` : i.message]\n })\n}\n"]}
package/dist/cli/run.js CHANGED
@@ -1,5 +1,8 @@
1
+ import { auditHidden, startAudit } from "../audit.js";
1
2
  import { createApp, loadCliErrorFormatter, loadConfig, resolveCommandsDir, resolveLocalPrincipal } from "../config.js";
3
+ import { surfaceOf } from "../caller.js";
2
4
  import { MextError } from "../errors.js";
5
+ import { exposedRegistry, hasExposure } from "../expose.js";
3
6
  import { isSegment } from "../ids.js";
4
7
  import { loadProjectInstrumentation } from "../instrumentation.js";
5
8
  import { authorize, findCommand, invoke } from "../invoke.js";
@@ -12,6 +15,7 @@ import { cliPath, renderHelp } from "./help.js";
12
15
  import { createLineReader, readAll } from "./io.js";
13
16
  import { CliInterrupted, emitError, EXIT, errorJson, exitCodeOf, formatError, formatJson, formatProgress, formatResult, } from "./output.js";
14
17
  import { remoteTarget, runRemoteCommand } from "./remote.js";
18
+ import { saveContent } from "./media.js";
15
19
  export const RUN_PROG = "mext run";
16
20
  /** mext run 의 소스: 도입 프로젝트 (cwd) 의 instrumentation.ts · mext.config.ts · cli.errors · commands/ */
17
21
  export function projectSource(cwd) {
@@ -66,7 +70,12 @@ export async function runLocalCommand(argv, io, source) {
66
70
  const lines = createLineReader(io);
67
71
  let formatter;
68
72
  try {
69
- const { instrumentation, config, registry } = await source.load((f) => (formatter = f));
73
+ const loaded = await source.load((f) => (formatter = f));
74
+ const { instrumentation, config } = loaded;
75
+ // expose (§4): 로컬 주체의 표면 (기본 cli) 에서 숨긴 명령어 = 없는 명령어 (help · 경로 해석 · suggested).
76
+ // expose 가 없으면 주체를 미리 만들지 않는다 (help 경로가 localPrincipal 을 부르지 않던 동작 유지)
77
+ let principal = hasExposure(loaded.registry) ? await resolveLocalPrincipal(config, "cli") : undefined;
78
+ const registry = principal ? exposedRegistry(loaded.registry, surfaceOf(principal, "local")) : loaded.registry;
70
79
  // mext run help [target...]
71
80
  if (rest[0] === "help") {
72
81
  const targetTokens = rest.slice(1).filter((t) => !t.startsWith("-"));
@@ -76,6 +85,14 @@ export async function runLocalCommand(argv, io, source) {
76
85
  await prepareCliSpec(resolveCommand(registry, id));
77
86
  return printHelp(registry, id, io, prog, json, config.tools, source.footer);
78
87
  }
88
+ const help = lead.help || beforeDashDash.includes("--help") || beforeDashDash.includes("-h");
89
+ // 숨긴 명령어의 호출 시도 기록 (audit.includeHidden, §11.1): 전체 Registry 에서는 명령어인 경로. help 는 호출이 아니다.
90
+ // 응답 = 아래의 UNKNOWN_COMMAND 그대로. 프로세스가 곧 끝나므로 전달을 기다린다
91
+ if (principal && registry !== loaded.registry && config.audit?.includeHidden === true && !help) {
92
+ const target = resolveCommand(loaded.registry, resolvePath(loaded.registry, rest).id);
93
+ if (target && !registry.commands.has(target.id))
94
+ await auditHidden(target, { audit: config.audit, principal, transport: "local" });
95
+ }
79
96
  const { id, consumed } = resolvePath(registry, rest);
80
97
  const entry = id === "" ? undefined : resolveCommand(registry, id);
81
98
  const next = rest[consumed];
@@ -87,7 +104,6 @@ export async function runLocalCommand(argv, io, source) {
87
104
  throw unknownAt(registry, id, rest.slice(consumed));
88
105
  }
89
106
  await prepareCliSpec(entry);
90
- const help = lead.help || beforeDashDash.includes("--help") || beforeDashDash.includes("-h");
91
107
  if (help)
92
108
  return printHelp(registry, id, io, prog, json, config.tools, source.footer);
93
109
  if (!entry) {
@@ -98,8 +114,15 @@ export async function runLocalCommand(argv, io, source) {
98
114
  const text = `${formatError(error, prog)}\n${helpText(registry, id, prog, source.footer)}`;
99
115
  return emitError(io, { body: errorJson(error), text, exitCode: EXIT.usage, json: false }, formatter);
100
116
  }
101
- const principal = await resolveLocalPrincipal(config);
102
- authorize(entry, principal); // 권한 → 입력 검증 순서 (invoke 와 같음)
117
+ principal ??= await resolveLocalPrincipal(config, "cli");
118
+ try {
119
+ authorize(entry, principal); // 권한 → 입력 검증 순서 (invoke 와 같음)
120
+ }
121
+ catch (error) {
122
+ // invoke 전 거부도 감사 1건 (§11.1)
123
+ await startAudit(entry, { principal, transport: "local", ...(config.audit ? { audit: config.audit } : {}) })?.finish({ error }, false);
124
+ throw error;
125
+ }
103
126
  const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin: () => readAll(io.stdin) });
104
127
  const yes = lead.yes || parsed.yes;
105
128
  const app = await createApp(config);
@@ -117,10 +140,16 @@ export async function runLocalCommand(argv, io, source) {
117
140
  app,
118
141
  instrumentation,
119
142
  transport: "local",
143
+ ...(config.audit ? { audit: config.audit } : {}),
144
+ ...(config.approval ? { approval: config.approval } : {}),
120
145
  });
121
146
  if (controller.signal.aborted)
122
147
  throw new CliInterrupted();
123
148
  io.stdout.write(json ? formatJson(result.value) : formatResult(result.value));
149
+ // 결과 콘텐츠 (spec §4) = 파일 저장 + stderr 줄. 폴더 = <BIN>_MEDIA_DIR (mext run = MEXT_MEDIA_DIR)
150
+ if (result.content) {
151
+ saveContent(result.content, { command: entry.id, bin: source.prog.split(" ")[0], env: io.env, cwd: io.cwd, stderr: io.stderr });
152
+ }
124
153
  return EXIT.ok;
125
154
  }
126
155
  catch (error) {