@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
@@ -1,5 +1,5 @@
1
1
  import { COMMAND } from "../command.js";
2
- import { MextError } from "../errors.js";
2
+ import { inputDeclined, MextError } from "../errors.js";
3
3
  import { isSegment } from "../ids.js";
4
4
  import { createRemoteClient, isRecord, RemoteInputRequiredError, RemoteRpcError, RemoteTransportError, RemoteUnauthorizedError, } from "../remote/client.js";
5
5
  import { credentialStore, envPrefix } from "../remote/credentials.js";
@@ -7,9 +7,10 @@ import { isExpired, OAuthFlowError, refreshCredentials } from "../remote/oauth.j
7
7
  import { cliSpecFromJsonSchema, coerceValue, defineCliSpec, parseArgs } from "../cli/args.js";
8
8
  import { cliPath, renderHelp } from "../cli/help.js";
9
9
  import { askUrl } from "../cli/ask-url.js";
10
+ import { saveContent } from "../cli/media.js";
10
11
  import { createLineReader, readAll } from "../cli/io.js";
11
12
  import { CliInterrupted, emitError, EXIT, errorJson, exitCodeOf, formatError, formatJson, formatProgress, formatResult, } from "../cli/output.js";
12
- import { MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from "../mcp/constants.js";
13
+ import { APPROVAL_META_KEY, MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from "../mcp/constants.js";
13
14
  import { VERSION } from "../version.js";
14
15
  import { openSchema, schemaCacheDir, schemaCacheFile } from "./cache.js";
15
16
  import { manifestFromTools, manifestHelp } from "./manifest.js";
@@ -122,8 +123,10 @@ export async function runRemote(options, argv, io) {
122
123
  const input = planned.input;
123
124
  const args = exposed ? input : { command: entry.id, args: input };
124
125
  const onInputRequired = inputHandler(io, lines, yes, json, entry.id, controller.signal);
125
- let result = await s.call((o) => s.client.callTool(tool, args, {
126
+ // 승인 (§4 승인 원격 CLI): --yes = 확인 표시 (client 방식 표면) + confirm 입력 요청 승인 (ask 방식, inputHandler)
127
+ const callOnce = (confirmed) => s.call((o) => s.client.callTool(tool, args, {
126
128
  ...o,
129
+ ...(confirmed ? { meta: { [APPROVAL_META_KEY]: { confirmed: true } } } : {}),
127
130
  progressToken: "mext-cli",
128
131
  onNotification: (method, params) => {
129
132
  if (method !== "notifications/progress" || typeof params.progress !== "number")
@@ -137,6 +140,16 @@ export async function runRemote(options, argv, io) {
137
140
  },
138
141
  onInputRequired,
139
142
  }));
143
+ let result = await callOnce(yes);
144
+ // 확인 표시 없이 client 방식 표면에 닿음 = TTY 면 로컬 ask 와 같은 프롬프트 → 승인 = 확인 표시를 실어 1회 다시 호출
145
+ if (!yes && io.isTTY && approvalReason(result) === "unconfirmed") {
146
+ const answer = await lines.question(`${confirmationPrompt(command, input)} [y/N] `, controller.signal);
147
+ if (controller.signal.aborted)
148
+ throw new CliInterrupted();
149
+ if (!/^y(es)?$/i.test((answer ?? "").trim()))
150
+ throw inputDeclined(entry.id, "confirm");
151
+ result = await callOnce(true);
152
+ }
140
153
  // tasks 확장 (§12.6): 종료까지 폴링 → completed result = 동기 결과와 같은 경로 (출력 · exit code)
141
154
  if (isTaskResult(result)) {
142
155
  result = await awaitTask(result, {
@@ -153,6 +166,8 @@ export async function runRemote(options, argv, io) {
153
166
  throw toolError(result, ctx);
154
167
  const value = result.structuredContent === undefined ? textValue(result) : result.structuredContent;
155
168
  io.stdout.write(json ? formatJson(value) : formatResult(value));
169
+ // 결과 콘텐츠 (spec §4): image · audio · resource_link 블록 = 로컬 실행과 같은 저장 · stderr 줄
170
+ saveContent(result.content ?? [], { command: entry.id, bin: options.bin, env: io.env, cwd: io.cwd, stderr: io.stderr });
156
171
  return EXIT.ok;
157
172
  }
158
173
  catch (error) {
@@ -172,6 +187,18 @@ export async function runRemote(options, argv, io) {
172
187
  async function exposureOf(options, schema) {
173
188
  return options.manifest ? options.manifest.tools : schema.exposure();
174
189
  }
190
+ /** isError 결과가 APPROVAL_REQUIRED 면 그 reason (§4 승인) */
191
+ function approvalReason(result) {
192
+ if (result.isError !== true)
193
+ return undefined;
194
+ const sc = result.structuredContent;
195
+ const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined;
196
+ return body?.code === "APPROVAL_REQUIRED" && typeof body.reason === "string" ? body.reason : undefined;
197
+ }
198
+ /** 승인 프롬프트 문구. 로컬 ask (invoke.ts confirmationMessage) 와 같은 형식, 입력 = CLI 가 보낸 값 (invoke.ts 는 Zod 를 import 해 번들에 넣지 않는다) */
199
+ function confirmationPrompt(command, input) {
200
+ return `Run ${command.id} with ${JSON.stringify(input)}?${command.destructive ? " This command is destructive." : ""}`;
201
+ }
175
202
  /** 서버 help 재조회 대상 로컬 오류 */
176
203
  function isLocalParseFailure(error) {
177
204
  return error instanceof MextError && (error.code === "UNKNOWN_COMMAND" || error.code === "INVALID_ARGUMENT");
@@ -387,11 +414,16 @@ function commandOf(meta) {
387
414
  examples: [...(meta.examples ?? [])],
388
415
  positional: [...(meta.positional ?? [])],
389
416
  aliases: [],
417
+ // 조건부 승인 (help 의 needsApproval: "conditional") = help 렌더러용 자리 표시 (호출하지 않는다)
418
+ ...(meta.needsApproval === "conditional" ? { needsApproval: remoteOnly } : {}),
390
419
  execute() {
391
420
  throw new Error("remote command");
392
421
  },
393
422
  };
394
423
  }
424
+ function remoteOnly() {
425
+ throw new Error("remote command");
426
+ }
395
427
  /** 원격 명령어 help → RegisteredCommand (CLI 필드 = inputSchema 분석) */
396
428
  export function entryFromHelp(help) {
397
429
  const entry = {
@@ -458,6 +490,7 @@ const MEXT_CODES = [
458
490
  "UNAUTHENTICATED",
459
491
  "PERMISSION_DENIED",
460
492
  "INPUT_UNAVAILABLE",
493
+ "APPROVAL_REQUIRED",
461
494
  ];
462
495
  /** 서버 핸들러 예외 등 mext 구조화 오류 외의 도구 오류. --json = 서버 오류 본문 그대로, exit 1 */
463
496
  export class RemoteExecutionError extends Error {
@@ -511,6 +544,10 @@ function report(error, io, prog, json, ctx) {
511
544
  if (reason === "anonymous")
512
545
  text += `Run "${ctx.login}" to log in.\n`;
513
546
  }
547
+ // 확인 표시 없이 거부 (TTY 없음): 로컬 ask 의 안내와 같은 문구
548
+ if (e instanceof MextError && e.code === "APPROVAL_REQUIRED" && e.details.reason === "unconfirmed") {
549
+ text += "Pass --yes to approve.\n";
550
+ }
514
551
  return emitError(io, { body: errorBody(e), text, exitCode: exitCodeOf(e), json }, ctx.formatter);
515
552
  }
516
553
  function errorBody(error) {
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/client/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { COMMAND, type Command } from \"../command.ts\"\nimport { MextError, type MextErrorCode, type MextErrorDetails } from \"../errors.ts\"\nimport { isSegment } from \"../ids.ts\"\nimport type { CommandHelp, Help } from \"../mcp/help.ts\"\nimport type { NamespaceInfo, RegisteredCommand, Registry } from \"../registry.ts\"\nimport {\n createRemoteClient,\n isRecord,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n type CallToolOptions,\n type CallToolResult,\n type InputRequired,\n type InputResponses,\n type RemoteClient,\n type RemoteTool,\n} from \"../remote/client.ts\"\nimport { credentialStore, envPrefix, type CredentialStore, type StoredCredentials } from \"../remote/credentials.ts\"\nimport { isExpired, OAuthFlowError, refreshCredentials } from \"../remote/oauth.ts\"\nimport { cliSpecFromJsonSchema, coerceValue, defineCliSpec, parseArgs } from \"../cli/args.ts\"\nimport { cliPath, renderHelp } from \"../cli/help.ts\"\nimport { askUrl } from \"../cli/ask-url.ts\"\nimport { createLineReader, readAll, type CliIo, type LineReader } from \"../cli/io.ts\"\nimport {\n CliInterrupted,\n emitError,\n EXIT,\n errorJson,\n exitCodeOf,\n formatError,\n formatJson,\n formatProgress,\n formatResult,\n type CliErrorFormatter,\n} from \"../cli/output.ts\"\nimport { MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from \"../mcp/constants.ts\"\nimport { VERSION } from \"../version.ts\"\nimport { openSchema, schemaCacheDir, schemaCacheFile, type FetchedHelp, type Schema, type ToolListing } from \"./cache.ts\"\nimport { manifestFromTools, manifestHelp, type ClientManifest } from \"./manifest.ts\"\nimport { awaitTask, formatTaskStatus, isTaskResult, RemoteTaskError } from \"./task.ts\"\n\n/**\n * 원격 실행 공용 runner: mext run --url (bin = mext) 과 고객 CLI (bin = cli.bin) 가 같은 코드 경로.\n * 서버 MCP 엔드포인트의 dispatcher 도구 (execute · split 의 query · mutate) 또는 명령어별 도구 (command 노출, §12.2) 호출.\n * 노출 방식 = 번들 형태의 내장 manifest tools, 범용 = server/discover _meta[\"dev.mext/tools\"]. 권한 검사는 서버만.\n * 경로 해석 · help · 플래그 파싱 = HelpSource (캐시 · 내장 manifest · 서버 help, client/cache.ts) 의 입력 스키마 (JSON Schema).\n * 로컬 파싱 실패 (UNKNOWN_COMMAND · INVALID_ARGUMENT) = 서버 help 로 1회 재시도. tools/call 결과의 manifestHash 로 drift 감지.\n * 토큰 = <BIN>_TOKEN, 없으면 저장된 토큰 (<bin> login). 출력 · exit code 는 로컬 모드와 같다.\n * tasks 확장 선언 (§12.6): task 응답 = 종료까지 폴링 (client/task.ts), 결과 처리는 동기와 같다.\n *\n * 이 모듈 (와 import 대상) 은 고객 CLI 번들에 들어간다: Zod · MCP 서버 SDK · 핸들러 · 스캔 · 빌드 코드 import 금지.\n */\n\nexport interface RemoteRunOptions {\n /** 실행 파일 이름. 토큰 환경변수 (<BIN>_TOKEN) · 자격 증명 위치 (credentialStore bin) · clientInfo.name */\n bin: string\n /** MCP 엔드포인트 */\n url: string\n /** help · 오류 안내의 명령 접두. \"mext run --url <url>\" · \"myapp\" */\n prog: string\n /** login 안내 명령. \"mext login --url <url>\" · \"myapp login\" */\n login: string\n /** clientInfo.version */\n version: string\n /**\n * 번들 형태: 내장 manifest 로 help · 경로 해석 · 플래그 파싱 (help 에 네트워크 없음, 명령어 실행만 tools/list · tools/call).\n * 없음 = 범용 형태: 서버 help 조회\n */\n manifest?: ClientManifest\n /** 내장 manifest 의 manifestHash (빌드 시). manifest 와 같이 지정 */\n manifestHash?: string\n /** 사람용 루트 help 뒤에 붙일 텍스트 (고객 CLI 의 login · logout · mcp install 목록) */\n rootHelpFooter?: string\n /** 오류 출력 · exit code 커스텀 (cli.errors). 없음 = mext 기본 */\n formatError?: CliErrorFormatter\n}\n\n/** help 출처. 서버 (tools/list → dispatcher help 호출) · 내장 manifest · 스키마 캐시 (client/cache.ts Schema) */\nexport interface HelpSource {\n /** 대상 (\"\" = 루트) → help. 없는 대상 = MextError UNKNOWN_COMMAND */\n help(target: string): Promise<Help>\n}\n\nexport async function runRemote(options: RemoteRunOptions, argv: readonly string[], io: CliIo): Promise<number> {\n const { url, prog } = options\n const tokenEnv = `${envPrefix(options.bin)}_TOKEN`\n const ctx: ReportContext = {\n login: options.login,\n tokenEnv,\n auth: undefined,\n footer: options.rootHelpFooter,\n formatter: options.formatError,\n }\n const lead = { json: false, yes: false, help: false }\n let i = 0\n for (; i < argv.length; i++) {\n const tok = argv[i]!\n if (!tok.startsWith(\"-\") || tok === \"-\") break\n if (tok === \"--json\") lead.json = true\n else if (tok === \"--yes\") lead.yes = true\n else if (tok === \"--help\" || tok === \"-h\") lead.help = true\n else return report(usageError(`unknown flag ${tok} before the command`), io, prog, argv.includes(\"--json\"), ctx)\n }\n const rest = argv.slice(i)\n const beforeDashDash = rest.indexOf(\"--\") < 0 ? rest : rest.slice(0, rest.indexOf(\"--\"))\n const json = lead.json || beforeDashDash.includes(\"--json\")\n\n const controller = new AbortController()\n const onAbort = (): void => controller.abort(io.signal?.reason)\n if (io.signal?.aborted) onAbort()\n io.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const lines = createLineReader(io)\n let session: Session | undefined\n let schema: Schema | undefined\n try {\n if (!/^https?:\\/\\//i.test(url)) throw usageError(`--url must be an http(s) URL (got \"${url}\")`)\n session = openSession(options, tokenEnv, io, controller.signal)\n const s = session\n schema = await openRunSchema(options, s, ctx, io)\n const source: HelpSource = schema\n const wantsHelp = lead.help || beforeDashDash.includes(\"--help\") || beforeDashDash.includes(\"-h\")\n let stdin: Promise<string> | undefined\n const readStdin = (): Promise<string> => (stdin ??= readAll(io.stdin))\n\n // 경로 해석 · 플래그 파싱 (로컬). 실패하면 서버 help 로 1회 재시도\n const plan = async (): Promise<Plan> => {\n // <prog> help [target...]\n if (rest[0] === \"help\") {\n const tokens = rest.slice(1).filter((t) => !t.startsWith(\"-\"))\n const resolved = await resolveRemotePath(source, tokens)\n if (resolved.consumed < tokens.length) throw await unknownAt(source, resolved, tokens.slice(resolved.consumed))\n return { kind: \"help\", help: resolved.help }\n }\n const resolved = await resolveRemotePath(source, rest)\n const { help, consumed } = resolved\n const command = help.kind === \"command\" ? help : help.kind === \"namespace\" ? help.command : undefined\n const next = rest[consumed]\n const acceptsPositional = command !== undefined && command.positional.length > 0\n if (help.kind !== \"command\" && next !== undefined && !next.startsWith(\"-\") && !acceptsPositional) {\n throw await unknownAt(source, resolved, rest.slice(consumed))\n }\n if (wantsHelp) return { kind: \"help\", help }\n if (!command) return { kind: \"namespace\", help }\n const entry = entryFromHelp(command)\n const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin })\n return { kind: \"run\", command, entry, input: parsed.input, yes: parsed.yes }\n }\n let planned: Plan\n try {\n planned = await plan()\n } catch (error) {\n if (!isLocalParseFailure(error) || !schema.refetch()) throw error\n try {\n planned = await plan()\n } catch (retryError) {\n // 재조회 실패 (오프라인 등) = 원래 로컬 오류\n if (retryError instanceof RemoteTransportError || retryError instanceof RemoteRpcError) throw error\n throw retryError\n }\n }\n\n if (planned.kind === \"help\") return printHelp(planned.help, io, prog, json, ctx)\n if (planned.kind === \"namespace\") {\n const { help } = planned\n const id = help.kind === \"namespace\" ? help.id : \"\"\n const error = new MextError(\n \"UNKNOWN_COMMAND\",\n id === \"\" ? \"No command given.\" : `\"${cliPath(id)}\" is a namespace. Specify a command.`,\n { command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n )\n if (json) return report(error, io, prog, true, ctx)\n const text = `${formatError(error, prog)}\\n${helpText(help, prog, ctx)}`\n return emitError(io, { body: errorBody(error), text, exitCode: EXIT.usage, json: false }, ctx.formatter)\n }\n\n const { command, entry } = planned\n const yes = lead.yes || planned.yes\n // command 노출 (§12.2) = 도구 이름 = 정식 ID, 인자 = input. 그 외 = dispatcher { command, args }\n const exposed = (await exposureOf(options, schema)) === \"command\"\n const tool = exposed ? { name: entry.id, inputSchema: command.inputSchema } : commandTool(dispatcherOf(url, await schema.tools()), command)\n const input = planned.input as Record<string, unknown>\n const args = exposed ? input : { command: entry.id, args: input }\n const onInputRequired = inputHandler(io, lines, yes, json, entry.id, controller.signal)\n let result = await s.call((o) =>\n s.client.callTool(tool, args, {\n ...o,\n progressToken: \"mext-cli\",\n onNotification: (method, params) => {\n if (method !== \"notifications/progress\" || typeof params.progress !== \"number\") return\n const update: { progress: number; total?: number; message?: string } = { progress: params.progress }\n if (typeof params.total === \"number\") update.total = params.total\n if (typeof params.message === \"string\") update.message = params.message\n io.stderr.write(formatProgress(update))\n },\n onInputRequired,\n }),\n )\n // tasks 확장 (§12.6): 종료까지 폴링 → completed result = 동기 결과와 같은 경로 (출력 · exit code)\n if (isTaskResult(result)) {\n result = await awaitTask(result, {\n client: s.client,\n call: (fn) => s.call(fn),\n signal: controller.signal,\n onInputRequired,\n onStatus: (message) => io.stderr.write(formatTaskStatus(message)),\n })\n }\n // drift: 이번 결과는 그대로, 다르면 캐시 stale (다음 실행에서 서버 help)\n schema.observe(metaHash(result))\n if (result.isError === true) throw toolError(result, ctx)\n const value = result.structuredContent === undefined ? textValue(result) : result.structuredContent\n io.stdout.write(json ? formatJson(value) : formatResult(value))\n return EXIT.ok\n } catch (error) {\n if (session) ctx.auth = session.auth\n if (controller.signal.aborted) return report(new CliInterrupted(), io, prog, json, ctx)\n return report(error, io, prog, json, ctx)\n } finally {\n io.signal?.removeEventListener(\"abort\", onAbort)\n lines.close()\n await schema?.save()\n }\n}\n\n/** 로컬 경로 해석 · 플래그 파싱 결과 */\ntype Plan =\n | { kind: \"help\"; help: Help }\n | { kind: \"namespace\"; help: Help }\n | { kind: \"run\"; command: CommandHelp; entry: RegisteredCommand; input: unknown; yes: boolean }\n\n/** 서버 도구 노출 방식: 번들 형태 = 내장 manifest tools, 범용 = server/discover _meta[\"dev.mext/tools\"] (스키마 캐시) */\nasync function exposureOf(options: RemoteRunOptions, schema: Schema): Promise<string | undefined> {\n return options.manifest ? options.manifest.tools : schema.exposure()\n}\n\n/** 서버 help 재조회 대상 로컬 오류 */\nfunction isLocalParseFailure(error: unknown): boolean {\n return error instanceof MextError && (error.code === \"UNKNOWN_COMMAND\" || error.code === \"INVALID_ARGUMENT\")\n}\n\n/** 결과 _meta[\"dev.mext/manifestHash\"] */\nfunction metaHash(result: CallToolResult): string | undefined {\n const meta = result._meta\n const value = isRecord(meta) ? meta[MANIFEST_HASH_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n}\n\n/** 이번 실행의 스키마 상태: 캐시 파일 (<BIN>_CACHE_DIR · XDG · HOME) · 내장 manifest · 서버 help */\nfunction openRunSchema(options: RemoteRunOptions, s: Session, ctx: ReportContext, io: CliIo): Promise<Schema> {\n const dir = schemaCacheDir(options.bin, io.env)\n return openSchema({\n file: dir === undefined ? undefined : schemaCacheFile(dir, options.url),\n url: options.url,\n client: { bin: options.bin, version: options.version, mext: VERSION },\n ...(options.manifest && options.manifestHash !== undefined\n ? { embedded: { manifest: options.manifest, hash: options.manifestHash } }\n : {}),\n fetchHelp: serverHelpFetcher(s, ctx, options.manifest?.tools),\n fetchTools: async () => {\n // 범용 형태 = 노출 방식을 server/discover 로 (번들 = 내장 manifest, 조회 안 함).\n // 순차: 401 → refresh 1회 규칙 (Session.call) 을 동시 요청이 나눠 쓰지 않게\n const r = await s.call((o) => s.client.listToolsResult(o))\n const exposure = options.manifest ? undefined : await discoverExposure(s)\n if ((options.manifest?.tools ?? exposure) !== \"command\") dispatcherOf(s.url, r.tools)\n return {\n tools: r.tools,\n ...(r.ttlMs !== undefined ? { ttlMs: r.ttlMs } : {}),\n ...(exposure !== undefined ? { exposure } : {}),\n }\n },\n warn: (message) => io.stderr.write(message),\n })\n}\n\n/* 세션: 클라이언트 · 토큰 · dispatcher 도구 */\n\n/** 토큰 출처. undefined = 아직 요청 전 (저장분 미조회) */\ntype AuthSource = \"env\" | \"stored\" | \"none\" | undefined\n\ninterface Tools {\n /** tools/list 결과 */\n list: RemoteTool[]\n /** help 호출 도구 (execute 또는 split 의 query) */\n helpTool: RemoteTool\n}\n\ninterface Session {\n url: string\n client: RemoteClient\n /** 요청한 토큰 출처 (첫 요청 때 결정) */\n readonly auth: AuthSource\n /** 401 이면 refresh_token 으로 1회 갱신 후 재시도 */\n call<T>(fn: (options: { signal: AbortSignal }) => Promise<T>): Promise<T>\n}\n\n/** 네트워크 · 키체인 접근은 첫 요청까지 미룬다 (번들 형태의 help 는 둘 다 없음) */\nfunction openSession(options: RemoteRunOptions, tokenEnv: string, io: CliIo, signal: AbortSignal): Session {\n const { url } = options\n const envToken = io.env[tokenEnv] !== undefined && io.env[tokenEnv] !== \"\" ? io.env[tokenEnv] : undefined\n const store: CredentialStore | undefined =\n envToken === undefined ? credentialStore({ env: io.env, bin: options.bin }) : undefined\n let stored: StoredCredentials | undefined\n let auth: AuthSource = envToken !== undefined ? \"env\" : undefined\n let refreshed = false\n const refresh = async (): Promise<boolean> => {\n if (!store || !stored?.refresh_token || refreshed) return false\n refreshed = true\n try {\n stored = await refreshCredentials(stored)\n await store.set(url, stored).catch(() => {})\n return true\n } catch {\n return false\n }\n }\n let loading: Promise<void> | undefined\n const load = (): Promise<void> =>\n (loading ??= (async () => {\n if (!store) return\n stored = await store.get(url).catch(() => undefined)\n if (stored && isExpired(stored)) await refresh()\n auth = stored ? \"stored\" : \"none\"\n })())\n const client = createRemoteClient({\n url,\n clientInfo: { name: options.bin, version: options.version },\n token: async () => {\n await load()\n return envToken ?? stored?.access_token\n },\n })\n const call = async <T>(fn: (o: { signal: AbortSignal }) => Promise<T>): Promise<T> => {\n try {\n return await fn({ signal })\n } catch (error) {\n if (error instanceof RemoteUnauthorizedError && (await refresh())) return fn({ signal })\n throw error\n }\n }\n return {\n url,\n client,\n get auth() {\n return auth\n },\n call,\n }\n}\n\n/** tools/list 결과 → dispatcher 도구 (execute 또는 query · mutate). 없으면 RemoteTransportError */\nfunction dispatcherOf(url: string, list: RemoteTool[]): Tools {\n const execute = list.find((t) => t.name === \"execute\")\n const query = list.find((t) => t.name === \"query\")\n const helpTool = execute ?? query\n if (!helpTool || (!execute && !list.some((t) => t.name === \"mutate\"))) {\n throw new RemoteTransportError(`${url} does not expose mext dispatcher tools (execute, or query and mutate).`)\n }\n return { list, helpTool }\n}\n\n/** 명령어를 호출할 도구: help 의 tool (split) → execute → readOnly 면 query, 아니면 mutate */\nfunction commandTool(tools: Tools, command: CommandHelp): RemoteTool {\n const byName = (name: string | undefined) => (name === undefined ? undefined : tools.list.find((t) => t.name === name))\n return byName(command.tool) ?? byName(\"execute\") ?? byName(command.readOnly ? \"query\" : \"mutate\") ?? tools.helpTool\n}\n\n/** server/discover _meta[\"dev.mext/tools\"]. 없음 · JSON-RPC 오류 (discover 없는 서버 등) = undefined (dispatcher) */\nasync function discoverExposure(s: Session): Promise<string | undefined> {\n try {\n const result = await s.call((o) => s.client.request(\"server/discover\", {}, o))\n const value = isRecord(result._meta) ? result._meta[TOOLS_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n } catch (error) {\n if (error instanceof RemoteRpcError) return undefined\n throw error\n }\n}\n\n/**\n * 서버 help. dispatcher = help 호출 (tools/call), command 노출 = tools/list 로 만든 manifest 의 help (help 도구 없음).\n * UNKNOWN_COMMAND = 캐시할 결과, 그 외 오류 = throw\n */\nfunction serverHelpFetcher(\n s: Session,\n ctx: ReportContext,\n embeddedExposure: string | undefined,\n): (target: string, listing: () => Promise<ToolListing>) => Promise<FetchedHelp> {\n return async (target, listing) => {\n const { tools, exposure } = await listing()\n if ((embeddedExposure ?? exposure) === \"command\") {\n try {\n return { value: { help: manifestHelp(manifestFromTools(tools), target) }, hash: undefined }\n } catch (error) {\n if (error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") return { value: { error: error.toJSON() }, hash: undefined }\n throw error\n }\n }\n const { helpTool } = dispatcherOf(s.url, tools)\n const args = target === \"\" ? { command: \"help\" } : { command: \"help\", args: { target } }\n const result = await s.call((o) => s.client.callTool(helpTool, args, o))\n const hash = metaHash(result)\n if (result.isError === true) {\n const error = toolError(result, ctx)\n if (error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") return { value: { error: error.toJSON() }, hash }\n throw error\n }\n const value = result.structuredContent\n if (!isRecord(value) || (value.kind !== \"root\" && value.kind !== \"namespace\" && value.kind !== \"command\")) {\n throw new RemoteTransportError(`${s.url} returned an unexpected help result.`)\n }\n return { value: { help: value as unknown as Help }, hash }\n }\n}\n\n/** 번들 형태: 내장 manifest (네트워크 없음) */\nexport function manifestHelpSource(manifest: ClientManifest): HelpSource {\n return { help: async (target) => manifestHelp(manifest, target) }\n}\n\n/* 경로 해석: 앞쪽 세그먼트 토큰의 가장 긴 접두 (로컬 resolvePath 와 같은 결과) */\n\ninterface ResolvedPath {\n help: Help\n consumed: number\n /** 가장 긴 후보의 UNKNOWN_COMMAND (있으면) */\n unknown: MextError | undefined\n}\n\nasync function resolveRemotePath(source: HelpSource, tokens: readonly string[]): Promise<ResolvedPath> {\n const segs: string[] = []\n for (const t of tokens) {\n if (!isSegment(t)) break\n segs.push(t)\n }\n let unknown: MextError | undefined\n for (let k = segs.length; k >= 0; k--) {\n try {\n return { help: await source.help(segs.slice(0, k).join(\".\")), consumed: k, unknown }\n } catch (error) {\n if (k > 0 && error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") {\n unknown ??= error\n continue\n }\n throw error\n }\n }\n throw new Error(\"unreachable\")\n}\n\n/** 해석되지 않은 경로 → UNKNOWN_COMMAND (suggested · usage) */\nasync function unknownAt(source: HelpSource, resolved: ResolvedPath, tail: readonly string[]): Promise<MextError> {\n if (resolved.unknown) return resolved.unknown\n const id = resolved.help.kind === \"root\" ? \"\" : resolved.help.id\n const first = tail.find((t) => !t.startsWith(\"-\"))\n const candidate = [id, first ?? \"\"].filter((x) => x !== \"\").join(\".\")\n try {\n await source.help(candidate)\n } catch (error) {\n if (error instanceof MextError) return error\n throw error\n }\n return new MextError(\"UNKNOWN_COMMAND\", `Unknown command \"${candidate}\".`, { command: candidate, suggested: [], usage: \"help\" })\n}\n\n/* help → 로컬 렌더러용 Registry (같은 help 텍스트) */\n\n/** 원격 명령어의 input 자리. CLI 필드는 defineCliSpec (JSON Schema 분석) 이 정하므로 Zod 스키마가 필요 없다 */\nconst REMOTE_INPUT = { _zod: { def: { shape: {} } } } as unknown as Command[\"input\"]\n\nfunction commandOf(meta: {\n description: string\n readOnly: boolean\n destructive: boolean\n requiresConfirmation: boolean\n scopes?: readonly string[]\n examples?: readonly unknown[]\n positional?: readonly string[]\n}): Command {\n return {\n [COMMAND]: true,\n description: meta.description,\n input: REMOTE_INPUT,\n output: undefined,\n readOnly: meta.readOnly,\n destructive: meta.destructive,\n requiresConfirmation: meta.requiresConfirmation,\n scopes: [...(meta.scopes ?? [])],\n examples: [...(meta.examples ?? [])] as Command[\"examples\"],\n positional: [...(meta.positional ?? [])],\n aliases: [],\n execute() {\n throw new Error(\"remote command\")\n },\n }\n}\n\n/** 원격 명령어 help → RegisteredCommand (CLI 필드 = inputSchema 분석) */\nexport function entryFromHelp(help: CommandHelp): RegisteredCommand {\n const entry: RegisteredCommand = {\n id: help.id,\n command: commandOf(help),\n aliases: [...help.aliases],\n file: undefined,\n inputSchema: help.inputSchema,\n outputSchema: help.outputSchema,\n }\n defineCliSpec(entry, cliSpecFromJsonSchema(help.inputSchema, help.positional))\n return entry\n}\n\nfunction registryFromHelp(help: Help): Registry {\n const commands = new Map<string, RegisteredCommand>()\n const aliases = new Map<string, string>()\n const namespaces = new Map<string, NamespaceInfo>()\n if (help.kind === \"command\") {\n const entry = entryFromHelp(help)\n commands.set(entry.id, entry)\n for (const a of entry.aliases) aliases.set(a, entry.id)\n namespaces.set(\"\", { id: \"\", description: undefined, commands: [], namespaces: [] })\n return { commands, aliases, namespaces }\n }\n const id = help.kind === \"root\" ? \"\" : help.id\n namespaces.set(id, {\n id,\n description: help.description,\n commands: help.commands.map((c) => c.id),\n namespaces: help.namespaces.map((n) => n.id),\n })\n for (const n of help.namespaces) namespaces.set(n.id, { id: n.id, description: n.description, commands: [], namespaces: [] })\n for (const c of help.commands) {\n commands.set(c.id, {\n id: c.id,\n command: commandOf(c),\n aliases: [],\n file: undefined,\n inputSchema: {},\n outputSchema: undefined,\n })\n }\n if (help.kind === \"namespace\" && help.command) commands.set(help.command.id, entryFromHelp(help.command))\n return { commands, aliases, namespaces }\n}\n\n/** 사람용 help 텍스트. 루트면 footer (고객 CLI 내장 명령) 를 붙인다 */\nfunction helpText(help: Help, prog: string, ctx: ReportContext): string {\n const target = help.kind === \"root\" ? \"\" : help.id\n const text = renderHelp(registryFromHelp(help), target, { prog })\n return help.kind === \"root\" && ctx.footer ? `${text}\\n${ctx.footer}` : text\n}\n\n/** --help --json = help 결과 그대로 (서버 help 의 structuredContent · 내장 manifest help) */\nfunction printHelp(help: Help, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n io.stdout.write(json ? formatJson(help) : helpText(help, prog, ctx))\n return EXIT.ok\n}\n\n/* 결과 · 오류 */\n\nconst MEXT_CODES: readonly MextErrorCode[] = [\n \"UNKNOWN_COMMAND\",\n \"INVALID_ARGUMENT\",\n \"UNAUTHENTICATED\",\n \"PERMISSION_DENIED\",\n \"INPUT_UNAVAILABLE\",\n]\n\n/** 서버 핸들러 예외 등 mext 구조화 오류 외의 도구 오류. --json = 서버 오류 본문 그대로, exit 1 */\nexport class RemoteExecutionError extends Error {\n readonly body: Record<string, unknown>\n constructor(body: Record<string, unknown>) {\n super(typeof body.message === \"string\" ? body.message : \"Remote command failed.\")\n this.name = \"RemoteExecutionError\"\n this.body = body\n }\n}\n\ninterface ReportContext {\n /** login 안내 명령 */\n login: string\n /** <BIN>_TOKEN */\n tokenEnv: string\n auth: AuthSource\n /** 루트 help footer */\n footer?: string | undefined\n formatter?: CliErrorFormatter | undefined\n}\n\n/** isError 결과 → MextError (code 가 mext 구조화 오류면) 또는 RemoteExecutionError */\nfunction toolError(result: CallToolResult, ctx: ReportContext): Error {\n const sc = result.structuredContent\n const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined\n if (!body) return new RemoteExecutionError({ code: \"EXECUTION_FAILED\", message: textValue(result) ?? \"Remote command failed.\" })\n const { code, message, ...details } = body\n if (typeof code === \"string\" && (MEXT_CODES as readonly string[]).includes(code)) {\n const text = typeof message === \"string\" ? message : code\n if (code === \"UNAUTHENTICATED\") {\n return new MextError(\"UNAUTHENTICATED\", text, { ...(details as MextErrorDetails[\"UNAUTHENTICATED\"]), login: ctx.login })\n }\n return new MextError(code as MextErrorCode, text, details as never)\n }\n return new RemoteExecutionError(body)\n}\n\nfunction textValue(result: CallToolResult): string | undefined {\n const texts = (result.content ?? []).flatMap((c) =>\n isRecord(c) && c.type === \"text\" && typeof c.text === \"string\" ? [c.text] : [],\n )\n return texts.length > 0 ? texts.join(\"\\n\") : undefined\n}\n\n/** 401 → UNAUTHENTICATED (login 안내 포함) */\nfunction unauthenticatedFrom(error: RemoteUnauthorizedError, ctx: ReportContext): MextError {\n const data = isRecord(error.data) ? error.data : {}\n const reason =\n data.reason === \"invalid_token\" || data.reason === \"missing_token\"\n ? data.reason\n : error.challenge.error === \"invalid_token\"\n ? \"invalid_token\"\n : \"missing_token\"\n let message = typeof data.message === \"string\" ? data.message : error.message\n if (ctx.auth === \"env\") message += ` ${ctx.tokenEnv} was rejected.`\n return new MextError(\"UNAUTHENTICATED\", message, { reason, login: ctx.login })\n}\n\nfunction report(error: unknown, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n let e = error\n if (e instanceof RemoteUnauthorizedError) e = unauthenticatedFrom(e, ctx)\n let text = formatError(e, prog)\n if (e instanceof MextError && e.code === \"PERMISSION_DENIED\" && ctx.auth === \"none\") {\n const reason = (e.details as MextErrorDetails[\"PERMISSION_DENIED\"]).reason\n if (reason === \"anonymous\") text += `Run \"${ctx.login}\" to log in.\\n`\n }\n return emitError(io, { body: errorBody(e), text, exitCode: exitCodeOf(e), json }, ctx.formatter)\n}\n\nfunction errorBody(error: unknown): Record<string, unknown> {\n if (error instanceof RemoteExecutionError) return error.body\n if (\n error instanceof RemoteTransportError ||\n error instanceof RemoteRpcError ||\n error instanceof RemoteInputRequiredError ||\n error instanceof RemoteTaskError ||\n error instanceof OAuthFlowError\n ) {\n const body: Record<string, unknown> = { code: \"REMOTE_ERROR\", message: error.message }\n if (error instanceof RemoteRpcError) body.rpc = { code: error.code, status: error.status, data: error.data }\n if (error instanceof RemoteTaskError) {\n body.task = { taskId: error.taskId, status: error.status, ...(error.error ? { error: error.error } : {}) }\n }\n return body\n }\n return errorJson(error)\n}\n\nfunction usageError(message: string): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\"INVALID_ARGUMENT\", message, {\n command: \"\",\n missing_fields: [],\n issues: [{ path: \"\", code: \"unknown_flag\", message }],\n expected_schema: {},\n examples: [],\n })\n}\n\n/* MRTR: InputRequiredResult → 프롬프트 → inputResponses */\n\n/**\n * elicitation/create 처리 (clientCapabilities = elicitation.form · url).\n * mode url = 로컬 ctx.ask url 과 같음 (askUrl: --yes 미적용, TTY 없음 · --json = INPUT_UNAVAILABLE). accept · decline.\n * requestedSchema 가 boolean 속성 하나 = 확인: --yes → 승인, TTY → [y/N], 그 외 INPUT_UNAVAILABLE.\n * 그 외 form = TTY 에서 필드별 입력 (스키마 모양으로 변환), TTY 없음 = INPUT_UNAVAILABLE.\n * 응답 = { action: \"accept\", content }. 이번 라운드 요청에 대한 응답만 보낸다\n */\nfunction inputHandler(\n io: CliIo,\n lines: LineReader,\n yes: boolean,\n json: boolean,\n command: string,\n signal: AbortSignal,\n): NonNullable<CallToolOptions[\"onInputRequired\"]> {\n const unavailable = (message: string, hint: string) =>\n new MextError(\"INPUT_UNAVAILABLE\", `${command} asked \"${message}\", but stdin is not a terminal.${hint}`, { command })\n const ask = async (prompt: string): Promise<string> => {\n const answer = await lines.question(prompt, signal)\n if (signal.aborted) throw new CliInterrupted()\n return answer ?? \"\"\n }\n return async (required: InputRequired): Promise<InputResponses> => {\n const out: InputResponses = {}\n for (const [key, request] of Object.entries(required.inputRequests ?? {})) {\n const params = isRecord(request.params) ? request.params : {}\n const message = typeof params.message === \"string\" ? params.message : \"Input required\"\n if (request.method !== \"elicitation/create\") {\n throw new RemoteTransportError(`${command}: unsupported input request ${request.method}.`)\n }\n if (params.mode === \"url\") {\n if (typeof params.url !== \"string\" || !/^https?:\\/\\//i.test(params.url)) {\n throw new RemoteTransportError(`${command}: url input request without an http(s) url.`)\n }\n const accepted = await askUrl(io, lines, { command, message, url: params.url }, { json, signal })\n out[key] = { action: accepted ? \"accept\" : \"decline\" }\n continue\n }\n const schema = isRecord(params.requestedSchema) ? params.requestedSchema : { type: \"object\", properties: {} }\n const confirmKey = confirmField(schema)\n if (confirmKey !== undefined) {\n if (yes) {\n out[key] = { action: \"accept\", content: { [confirmKey]: true } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Pass --yes to approve.\")\n const answer = await ask(`${message} [y/N] `)\n out[key] = { action: \"accept\", content: { [confirmKey]: /^y(es)?$/i.test(answer.trim()) } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Run it in an interactive terminal.\")\n io.stderr.write(`${message}\\n`)\n const spec = cliSpecFromJsonSchema(schema)\n const content: Record<string, unknown> = {}\n for (const f of spec.fields) {\n const answer = await ask(` ${f.key}${f.required ? \"\" : \" (optional)\"}: `)\n if (answer === \"\") continue\n if (f.kind.type === \"array\") {\n const kind = f.kind\n content[f.key] = answer.split(\",\").map((s) => {\n const r = coerceValue(kind, s.trim())\n return r.ok ? r.value : s\n })\n continue\n }\n const r = coerceValue(f.kind, answer)\n content[f.key] = r.ok ? r.value : answer\n }\n out[key] = { action: \"accept\", content }\n }\n return out\n }\n}\n\n/** requestedSchema 의 속성이 boolean 하나면 그 키 (확인 요청) */\nfunction confirmField(schema: Record<string, unknown>): string | undefined {\n const props = schema.properties\n if (!isRecord(props)) return undefined\n const keys = Object.keys(props)\n if (keys.length !== 1) return undefined\n const p = props[keys[0]!]\n return isRecord(p) && p.type === \"boolean\" ? keys[0] : undefined\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/client/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { COMMAND, type Command } from \"../command.ts\"\nimport { inputDeclined, MextError, type MextErrorCode, type MextErrorDetails } from \"../errors.ts\"\nimport { isSegment } from \"../ids.ts\"\nimport type { CommandHelp, Help } from \"../mcp/help.ts\"\nimport type { NamespaceInfo, RegisteredCommand, Registry } from \"../registry.ts\"\nimport {\n createRemoteClient,\n isRecord,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n type CallToolOptions,\n type CallToolResult,\n type InputRequired,\n type InputResponses,\n type RemoteClient,\n type RemoteTool,\n} from \"../remote/client.ts\"\nimport { credentialStore, envPrefix, type CredentialStore, type StoredCredentials } from \"../remote/credentials.ts\"\nimport { isExpired, OAuthFlowError, refreshCredentials } from \"../remote/oauth.ts\"\nimport { cliSpecFromJsonSchema, coerceValue, defineCliSpec, parseArgs } from \"../cli/args.ts\"\nimport { cliPath, renderHelp } from \"../cli/help.ts\"\nimport { askUrl } from \"../cli/ask-url.ts\"\nimport { saveContent } from \"../cli/media.ts\"\nimport { createLineReader, readAll, type CliIo, type LineReader } from \"../cli/io.ts\"\nimport {\n CliInterrupted,\n emitError,\n EXIT,\n errorJson,\n exitCodeOf,\n formatError,\n formatJson,\n formatProgress,\n formatResult,\n type CliErrorFormatter,\n} from \"../cli/output.ts\"\nimport { APPROVAL_META_KEY, MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from \"../mcp/constants.ts\"\nimport { VERSION } from \"../version.ts\"\nimport { openSchema, schemaCacheDir, schemaCacheFile, type FetchedHelp, type Schema, type ToolListing } from \"./cache.ts\"\nimport { manifestFromTools, manifestHelp, type ClientManifest } from \"./manifest.ts\"\nimport { awaitTask, formatTaskStatus, isTaskResult, RemoteTaskError } from \"./task.ts\"\n\n/**\n * 원격 실행 공용 runner: mext run --url (bin = mext) 과 고객 CLI (bin = cli.bin) 가 같은 코드 경로.\n * 서버 MCP 엔드포인트의 dispatcher 도구 (execute · split 의 query · mutate) 또는 명령어별 도구 (command 노출, §12.2) 호출.\n * 노출 방식 = 번들 형태의 내장 manifest tools, 범용 = server/discover _meta[\"dev.mext/tools\"]. 권한 검사는 서버만.\n * 경로 해석 · help · 플래그 파싱 = HelpSource (캐시 · 내장 manifest · 서버 help, client/cache.ts) 의 입력 스키마 (JSON Schema).\n * 로컬 파싱 실패 (UNKNOWN_COMMAND · INVALID_ARGUMENT) = 서버 help 로 1회 재시도. tools/call 결과의 manifestHash 로 drift 감지.\n * 토큰 = <BIN>_TOKEN, 없으면 저장된 토큰 (<bin> login). 출력 · exit code 는 로컬 모드와 같다.\n * tasks 확장 선언 (§12.6): task 응답 = 종료까지 폴링 (client/task.ts), 결과 처리는 동기와 같다.\n *\n * 이 모듈 (와 import 대상) 은 고객 CLI 번들에 들어간다: Zod · MCP 서버 SDK · 핸들러 · 스캔 · 빌드 코드 import 금지.\n */\n\nexport interface RemoteRunOptions {\n /** 실행 파일 이름. 토큰 환경변수 (<BIN>_TOKEN) · 자격 증명 위치 (credentialStore bin) · clientInfo.name */\n bin: string\n /** MCP 엔드포인트 */\n url: string\n /** help · 오류 안내의 명령 접두. \"mext run --url <url>\" · \"myapp\" */\n prog: string\n /** login 안내 명령. \"mext login --url <url>\" · \"myapp login\" */\n login: string\n /** clientInfo.version */\n version: string\n /**\n * 번들 형태: 내장 manifest 로 help · 경로 해석 · 플래그 파싱 (help 에 네트워크 없음, 명령어 실행만 tools/list · tools/call).\n * 없음 = 범용 형태: 서버 help 조회\n */\n manifest?: ClientManifest\n /** 내장 manifest 의 manifestHash (빌드 시). manifest 와 같이 지정 */\n manifestHash?: string\n /** 사람용 루트 help 뒤에 붙일 텍스트 (고객 CLI 의 login · logout · mcp install 목록) */\n rootHelpFooter?: string\n /** 오류 출력 · exit code 커스텀 (cli.errors). 없음 = mext 기본 */\n formatError?: CliErrorFormatter\n}\n\n/** help 출처. 서버 (tools/list → dispatcher help 호출) · 내장 manifest · 스키마 캐시 (client/cache.ts Schema) */\nexport interface HelpSource {\n /** 대상 (\"\" = 루트) → help. 없는 대상 = MextError UNKNOWN_COMMAND */\n help(target: string): Promise<Help>\n}\n\nexport async function runRemote(options: RemoteRunOptions, argv: readonly string[], io: CliIo): Promise<number> {\n const { url, prog } = options\n const tokenEnv = `${envPrefix(options.bin)}_TOKEN`\n const ctx: ReportContext = {\n login: options.login,\n tokenEnv,\n auth: undefined,\n footer: options.rootHelpFooter,\n formatter: options.formatError,\n }\n const lead = { json: false, yes: false, help: false }\n let i = 0\n for (; i < argv.length; i++) {\n const tok = argv[i]!\n if (!tok.startsWith(\"-\") || tok === \"-\") break\n if (tok === \"--json\") lead.json = true\n else if (tok === \"--yes\") lead.yes = true\n else if (tok === \"--help\" || tok === \"-h\") lead.help = true\n else return report(usageError(`unknown flag ${tok} before the command`), io, prog, argv.includes(\"--json\"), ctx)\n }\n const rest = argv.slice(i)\n const beforeDashDash = rest.indexOf(\"--\") < 0 ? rest : rest.slice(0, rest.indexOf(\"--\"))\n const json = lead.json || beforeDashDash.includes(\"--json\")\n\n const controller = new AbortController()\n const onAbort = (): void => controller.abort(io.signal?.reason)\n if (io.signal?.aborted) onAbort()\n io.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const lines = createLineReader(io)\n let session: Session | undefined\n let schema: Schema | undefined\n try {\n if (!/^https?:\\/\\//i.test(url)) throw usageError(`--url must be an http(s) URL (got \"${url}\")`)\n session = openSession(options, tokenEnv, io, controller.signal)\n const s = session\n schema = await openRunSchema(options, s, ctx, io)\n const source: HelpSource = schema\n const wantsHelp = lead.help || beforeDashDash.includes(\"--help\") || beforeDashDash.includes(\"-h\")\n let stdin: Promise<string> | undefined\n const readStdin = (): Promise<string> => (stdin ??= readAll(io.stdin))\n\n // 경로 해석 · 플래그 파싱 (로컬). 실패하면 서버 help 로 1회 재시도\n const plan = async (): Promise<Plan> => {\n // <prog> help [target...]\n if (rest[0] === \"help\") {\n const tokens = rest.slice(1).filter((t) => !t.startsWith(\"-\"))\n const resolved = await resolveRemotePath(source, tokens)\n if (resolved.consumed < tokens.length) throw await unknownAt(source, resolved, tokens.slice(resolved.consumed))\n return { kind: \"help\", help: resolved.help }\n }\n const resolved = await resolveRemotePath(source, rest)\n const { help, consumed } = resolved\n const command = help.kind === \"command\" ? help : help.kind === \"namespace\" ? help.command : undefined\n const next = rest[consumed]\n const acceptsPositional = command !== undefined && command.positional.length > 0\n if (help.kind !== \"command\" && next !== undefined && !next.startsWith(\"-\") && !acceptsPositional) {\n throw await unknownAt(source, resolved, rest.slice(consumed))\n }\n if (wantsHelp) return { kind: \"help\", help }\n if (!command) return { kind: \"namespace\", help }\n const entry = entryFromHelp(command)\n const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin })\n return { kind: \"run\", command, entry, input: parsed.input, yes: parsed.yes }\n }\n let planned: Plan\n try {\n planned = await plan()\n } catch (error) {\n if (!isLocalParseFailure(error) || !schema.refetch()) throw error\n try {\n planned = await plan()\n } catch (retryError) {\n // 재조회 실패 (오프라인 등) = 원래 로컬 오류\n if (retryError instanceof RemoteTransportError || retryError instanceof RemoteRpcError) throw error\n throw retryError\n }\n }\n\n if (planned.kind === \"help\") return printHelp(planned.help, io, prog, json, ctx)\n if (planned.kind === \"namespace\") {\n const { help } = planned\n const id = help.kind === \"namespace\" ? help.id : \"\"\n const error = new MextError(\n \"UNKNOWN_COMMAND\",\n id === \"\" ? \"No command given.\" : `\"${cliPath(id)}\" is a namespace. Specify a command.`,\n { command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n )\n if (json) return report(error, io, prog, true, ctx)\n const text = `${formatError(error, prog)}\\n${helpText(help, prog, ctx)}`\n return emitError(io, { body: errorBody(error), text, exitCode: EXIT.usage, json: false }, ctx.formatter)\n }\n\n const { command, entry } = planned\n const yes = lead.yes || planned.yes\n // command 노출 (§12.2) = 도구 이름 = 정식 ID, 인자 = input. 그 외 = dispatcher { command, args }\n const exposed = (await exposureOf(options, schema)) === \"command\"\n const tool = exposed ? { name: entry.id, inputSchema: command.inputSchema } : commandTool(dispatcherOf(url, await schema.tools()), command)\n const input = planned.input as Record<string, unknown>\n const args = exposed ? input : { command: entry.id, args: input }\n const onInputRequired = inputHandler(io, lines, yes, json, entry.id, controller.signal)\n // 승인 (§4 승인 원격 CLI): --yes = 확인 표시 (client 방식 표면) + confirm 입력 요청 승인 (ask 방식, inputHandler)\n const callOnce = (confirmed: boolean): Promise<CallToolResult> =>\n s.call((o) =>\n s.client.callTool(tool, args, {\n ...o,\n ...(confirmed ? { meta: { [APPROVAL_META_KEY]: { confirmed: true } } } : {}),\n progressToken: \"mext-cli\",\n onNotification: (method, params) => {\n if (method !== \"notifications/progress\" || typeof params.progress !== \"number\") return\n const update: { progress: number; total?: number; message?: string } = { progress: params.progress }\n if (typeof params.total === \"number\") update.total = params.total\n if (typeof params.message === \"string\") update.message = params.message\n io.stderr.write(formatProgress(update))\n },\n onInputRequired,\n }),\n )\n let result = await callOnce(yes)\n // 확인 표시 없이 client 방식 표면에 닿음 = TTY 면 로컬 ask 와 같은 프롬프트 → 승인 = 확인 표시를 실어 1회 다시 호출\n if (!yes && io.isTTY && approvalReason(result) === \"unconfirmed\") {\n const answer = await lines.question(`${confirmationPrompt(command, input)} [y/N] `, controller.signal)\n if (controller.signal.aborted) throw new CliInterrupted()\n if (!/^y(es)?$/i.test((answer ?? \"\").trim())) throw inputDeclined(entry.id, \"confirm\")\n result = await callOnce(true)\n }\n // tasks 확장 (§12.6): 종료까지 폴링 → completed result = 동기 결과와 같은 경로 (출력 · exit code)\n if (isTaskResult(result)) {\n result = await awaitTask(result, {\n client: s.client,\n call: (fn) => s.call(fn),\n signal: controller.signal,\n onInputRequired,\n onStatus: (message) => io.stderr.write(formatTaskStatus(message)),\n })\n }\n // drift: 이번 결과는 그대로, 다르면 캐시 stale (다음 실행에서 서버 help)\n schema.observe(metaHash(result))\n if (result.isError === true) throw toolError(result, ctx)\n const value = result.structuredContent === undefined ? textValue(result) : result.structuredContent\n io.stdout.write(json ? formatJson(value) : formatResult(value))\n // 결과 콘텐츠 (spec §4): image · audio · resource_link 블록 = 로컬 실행과 같은 저장 · stderr 줄\n saveContent(result.content ?? [], { command: entry.id, bin: options.bin, env: io.env, cwd: io.cwd, stderr: io.stderr })\n return EXIT.ok\n } catch (error) {\n if (session) ctx.auth = session.auth\n if (controller.signal.aborted) return report(new CliInterrupted(), io, prog, json, ctx)\n return report(error, io, prog, json, ctx)\n } finally {\n io.signal?.removeEventListener(\"abort\", onAbort)\n lines.close()\n await schema?.save()\n }\n}\n\n/** 로컬 경로 해석 · 플래그 파싱 결과 */\ntype Plan =\n | { kind: \"help\"; help: Help }\n | { kind: \"namespace\"; help: Help }\n | { kind: \"run\"; command: CommandHelp; entry: RegisteredCommand; input: unknown; yes: boolean }\n\n/** 서버 도구 노출 방식: 번들 형태 = 내장 manifest tools, 범용 = server/discover _meta[\"dev.mext/tools\"] (스키마 캐시) */\nasync function exposureOf(options: RemoteRunOptions, schema: Schema): Promise<string | undefined> {\n return options.manifest ? options.manifest.tools : schema.exposure()\n}\n\n/** isError 결과가 APPROVAL_REQUIRED 면 그 reason (§4 승인) */\nfunction approvalReason(result: CallToolResult): string | undefined {\n if (result.isError !== true) return undefined\n const sc = result.structuredContent\n const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined\n return body?.code === \"APPROVAL_REQUIRED\" && typeof body.reason === \"string\" ? body.reason : undefined\n}\n\n/** 승인 프롬프트 문구. 로컬 ask (invoke.ts confirmationMessage) 와 같은 형식, 입력 = CLI 가 보낸 값 (invoke.ts 는 Zod 를 import 해 번들에 넣지 않는다) */\nfunction confirmationPrompt(command: CommandHelp, input: Record<string, unknown>): string {\n return `Run ${command.id} with ${JSON.stringify(input)}?${command.destructive ? \" This command is destructive.\" : \"\"}`\n}\n\n/** 서버 help 재조회 대상 로컬 오류 */\nfunction isLocalParseFailure(error: unknown): boolean {\n return error instanceof MextError && (error.code === \"UNKNOWN_COMMAND\" || error.code === \"INVALID_ARGUMENT\")\n}\n\n/** 결과 _meta[\"dev.mext/manifestHash\"] */\nfunction metaHash(result: CallToolResult): string | undefined {\n const meta = result._meta\n const value = isRecord(meta) ? meta[MANIFEST_HASH_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n}\n\n/** 이번 실행의 스키마 상태: 캐시 파일 (<BIN>_CACHE_DIR · XDG · HOME) · 내장 manifest · 서버 help */\nfunction openRunSchema(options: RemoteRunOptions, s: Session, ctx: ReportContext, io: CliIo): Promise<Schema> {\n const dir = schemaCacheDir(options.bin, io.env)\n return openSchema({\n file: dir === undefined ? undefined : schemaCacheFile(dir, options.url),\n url: options.url,\n client: { bin: options.bin, version: options.version, mext: VERSION },\n ...(options.manifest && options.manifestHash !== undefined\n ? { embedded: { manifest: options.manifest, hash: options.manifestHash } }\n : {}),\n fetchHelp: serverHelpFetcher(s, ctx, options.manifest?.tools),\n fetchTools: async () => {\n // 범용 형태 = 노출 방식을 server/discover 로 (번들 = 내장 manifest, 조회 안 함).\n // 순차: 401 → refresh 1회 규칙 (Session.call) 을 동시 요청이 나눠 쓰지 않게\n const r = await s.call((o) => s.client.listToolsResult(o))\n const exposure = options.manifest ? undefined : await discoverExposure(s)\n if ((options.manifest?.tools ?? exposure) !== \"command\") dispatcherOf(s.url, r.tools)\n return {\n tools: r.tools,\n ...(r.ttlMs !== undefined ? { ttlMs: r.ttlMs } : {}),\n ...(exposure !== undefined ? { exposure } : {}),\n }\n },\n warn: (message) => io.stderr.write(message),\n })\n}\n\n/* 세션: 클라이언트 · 토큰 · dispatcher 도구 */\n\n/** 토큰 출처. undefined = 아직 요청 전 (저장분 미조회) */\ntype AuthSource = \"env\" | \"stored\" | \"none\" | undefined\n\ninterface Tools {\n /** tools/list 결과 */\n list: RemoteTool[]\n /** help 호출 도구 (execute 또는 split 의 query) */\n helpTool: RemoteTool\n}\n\ninterface Session {\n url: string\n client: RemoteClient\n /** 요청한 토큰 출처 (첫 요청 때 결정) */\n readonly auth: AuthSource\n /** 401 이면 refresh_token 으로 1회 갱신 후 재시도 */\n call<T>(fn: (options: { signal: AbortSignal }) => Promise<T>): Promise<T>\n}\n\n/** 네트워크 · 키체인 접근은 첫 요청까지 미룬다 (번들 형태의 help 는 둘 다 없음) */\nfunction openSession(options: RemoteRunOptions, tokenEnv: string, io: CliIo, signal: AbortSignal): Session {\n const { url } = options\n const envToken = io.env[tokenEnv] !== undefined && io.env[tokenEnv] !== \"\" ? io.env[tokenEnv] : undefined\n const store: CredentialStore | undefined =\n envToken === undefined ? credentialStore({ env: io.env, bin: options.bin }) : undefined\n let stored: StoredCredentials | undefined\n let auth: AuthSource = envToken !== undefined ? \"env\" : undefined\n let refreshed = false\n const refresh = async (): Promise<boolean> => {\n if (!store || !stored?.refresh_token || refreshed) return false\n refreshed = true\n try {\n stored = await refreshCredentials(stored)\n await store.set(url, stored).catch(() => {})\n return true\n } catch {\n return false\n }\n }\n let loading: Promise<void> | undefined\n const load = (): Promise<void> =>\n (loading ??= (async () => {\n if (!store) return\n stored = await store.get(url).catch(() => undefined)\n if (stored && isExpired(stored)) await refresh()\n auth = stored ? \"stored\" : \"none\"\n })())\n const client = createRemoteClient({\n url,\n clientInfo: { name: options.bin, version: options.version },\n token: async () => {\n await load()\n return envToken ?? stored?.access_token\n },\n })\n const call = async <T>(fn: (o: { signal: AbortSignal }) => Promise<T>): Promise<T> => {\n try {\n return await fn({ signal })\n } catch (error) {\n if (error instanceof RemoteUnauthorizedError && (await refresh())) return fn({ signal })\n throw error\n }\n }\n return {\n url,\n client,\n get auth() {\n return auth\n },\n call,\n }\n}\n\n/** tools/list 결과 → dispatcher 도구 (execute 또는 query · mutate). 없으면 RemoteTransportError */\nfunction dispatcherOf(url: string, list: RemoteTool[]): Tools {\n const execute = list.find((t) => t.name === \"execute\")\n const query = list.find((t) => t.name === \"query\")\n const helpTool = execute ?? query\n if (!helpTool || (!execute && !list.some((t) => t.name === \"mutate\"))) {\n throw new RemoteTransportError(`${url} does not expose mext dispatcher tools (execute, or query and mutate).`)\n }\n return { list, helpTool }\n}\n\n/** 명령어를 호출할 도구: help 의 tool (split) → execute → readOnly 면 query, 아니면 mutate */\nfunction commandTool(tools: Tools, command: CommandHelp): RemoteTool {\n const byName = (name: string | undefined) => (name === undefined ? undefined : tools.list.find((t) => t.name === name))\n return byName(command.tool) ?? byName(\"execute\") ?? byName(command.readOnly ? \"query\" : \"mutate\") ?? tools.helpTool\n}\n\n/** server/discover _meta[\"dev.mext/tools\"]. 없음 · JSON-RPC 오류 (discover 없는 서버 등) = undefined (dispatcher) */\nasync function discoverExposure(s: Session): Promise<string | undefined> {\n try {\n const result = await s.call((o) => s.client.request(\"server/discover\", {}, o))\n const value = isRecord(result._meta) ? result._meta[TOOLS_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n } catch (error) {\n if (error instanceof RemoteRpcError) return undefined\n throw error\n }\n}\n\n/**\n * 서버 help. dispatcher = help 호출 (tools/call), command 노출 = tools/list 로 만든 manifest 의 help (help 도구 없음).\n * UNKNOWN_COMMAND = 캐시할 결과, 그 외 오류 = throw\n */\nfunction serverHelpFetcher(\n s: Session,\n ctx: ReportContext,\n embeddedExposure: string | undefined,\n): (target: string, listing: () => Promise<ToolListing>) => Promise<FetchedHelp> {\n return async (target, listing) => {\n const { tools, exposure } = await listing()\n if ((embeddedExposure ?? exposure) === \"command\") {\n try {\n return { value: { help: manifestHelp(manifestFromTools(tools), target) }, hash: undefined }\n } catch (error) {\n if (error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") return { value: { error: error.toJSON() }, hash: undefined }\n throw error\n }\n }\n const { helpTool } = dispatcherOf(s.url, tools)\n const args = target === \"\" ? { command: \"help\" } : { command: \"help\", args: { target } }\n const result = await s.call((o) => s.client.callTool(helpTool, args, o))\n const hash = metaHash(result)\n if (result.isError === true) {\n const error = toolError(result, ctx)\n if (error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") return { value: { error: error.toJSON() }, hash }\n throw error\n }\n const value = result.structuredContent\n if (!isRecord(value) || (value.kind !== \"root\" && value.kind !== \"namespace\" && value.kind !== \"command\")) {\n throw new RemoteTransportError(`${s.url} returned an unexpected help result.`)\n }\n return { value: { help: value as unknown as Help }, hash }\n }\n}\n\n/** 번들 형태: 내장 manifest (네트워크 없음) */\nexport function manifestHelpSource(manifest: ClientManifest): HelpSource {\n return { help: async (target) => manifestHelp(manifest, target) }\n}\n\n/* 경로 해석: 앞쪽 세그먼트 토큰의 가장 긴 접두 (로컬 resolvePath 와 같은 결과) */\n\ninterface ResolvedPath {\n help: Help\n consumed: number\n /** 가장 긴 후보의 UNKNOWN_COMMAND (있으면) */\n unknown: MextError | undefined\n}\n\nasync function resolveRemotePath(source: HelpSource, tokens: readonly string[]): Promise<ResolvedPath> {\n const segs: string[] = []\n for (const t of tokens) {\n if (!isSegment(t)) break\n segs.push(t)\n }\n let unknown: MextError | undefined\n for (let k = segs.length; k >= 0; k--) {\n try {\n return { help: await source.help(segs.slice(0, k).join(\".\")), consumed: k, unknown }\n } catch (error) {\n if (k > 0 && error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") {\n unknown ??= error\n continue\n }\n throw error\n }\n }\n throw new Error(\"unreachable\")\n}\n\n/** 해석되지 않은 경로 → UNKNOWN_COMMAND (suggested · usage) */\nasync function unknownAt(source: HelpSource, resolved: ResolvedPath, tail: readonly string[]): Promise<MextError> {\n if (resolved.unknown) return resolved.unknown\n const id = resolved.help.kind === \"root\" ? \"\" : resolved.help.id\n const first = tail.find((t) => !t.startsWith(\"-\"))\n const candidate = [id, first ?? \"\"].filter((x) => x !== \"\").join(\".\")\n try {\n await source.help(candidate)\n } catch (error) {\n if (error instanceof MextError) return error\n throw error\n }\n return new MextError(\"UNKNOWN_COMMAND\", `Unknown command \"${candidate}\".`, { command: candidate, suggested: [], usage: \"help\" })\n}\n\n/* help → 로컬 렌더러용 Registry (같은 help 텍스트) */\n\n/** 원격 명령어의 input 자리. CLI 필드는 defineCliSpec (JSON Schema 분석) 이 정하므로 Zod 스키마가 필요 없다 */\nconst REMOTE_INPUT = { _zod: { def: { shape: {} } } } as unknown as Command[\"input\"]\n\nfunction commandOf(meta: {\n description: string\n readOnly: boolean\n destructive: boolean\n requiresConfirmation: boolean\n scopes?: readonly string[]\n examples?: readonly unknown[]\n positional?: readonly string[]\n needsApproval?: unknown\n}): Command {\n return {\n [COMMAND]: true,\n description: meta.description,\n input: REMOTE_INPUT,\n output: undefined,\n readOnly: meta.readOnly,\n destructive: meta.destructive,\n requiresConfirmation: meta.requiresConfirmation,\n scopes: [...(meta.scopes ?? [])],\n examples: [...(meta.examples ?? [])] as Command[\"examples\"],\n positional: [...(meta.positional ?? [])],\n aliases: [],\n // 조건부 승인 (help 의 needsApproval: \"conditional\") = help 렌더러용 자리 표시 (호출하지 않는다)\n ...(meta.needsApproval === \"conditional\" ? { needsApproval: remoteOnly } : {}),\n execute() {\n throw new Error(\"remote command\")\n },\n }\n}\n\nfunction remoteOnly(): never {\n throw new Error(\"remote command\")\n}\n\n/** 원격 명령어 help → RegisteredCommand (CLI 필드 = inputSchema 분석) */\nexport function entryFromHelp(help: CommandHelp): RegisteredCommand {\n const entry: RegisteredCommand = {\n id: help.id,\n command: commandOf(help),\n aliases: [...help.aliases],\n file: undefined,\n inputSchema: help.inputSchema,\n outputSchema: help.outputSchema,\n }\n defineCliSpec(entry, cliSpecFromJsonSchema(help.inputSchema, help.positional))\n return entry\n}\n\nfunction registryFromHelp(help: Help): Registry {\n const commands = new Map<string, RegisteredCommand>()\n const aliases = new Map<string, string>()\n const namespaces = new Map<string, NamespaceInfo>()\n if (help.kind === \"command\") {\n const entry = entryFromHelp(help)\n commands.set(entry.id, entry)\n for (const a of entry.aliases) aliases.set(a, entry.id)\n namespaces.set(\"\", { id: \"\", description: undefined, commands: [], namespaces: [] })\n return { commands, aliases, namespaces }\n }\n const id = help.kind === \"root\" ? \"\" : help.id\n namespaces.set(id, {\n id,\n description: help.description,\n commands: help.commands.map((c) => c.id),\n namespaces: help.namespaces.map((n) => n.id),\n })\n for (const n of help.namespaces) namespaces.set(n.id, { id: n.id, description: n.description, commands: [], namespaces: [] })\n for (const c of help.commands) {\n commands.set(c.id, {\n id: c.id,\n command: commandOf(c),\n aliases: [],\n file: undefined,\n inputSchema: {},\n outputSchema: undefined,\n })\n }\n if (help.kind === \"namespace\" && help.command) commands.set(help.command.id, entryFromHelp(help.command))\n return { commands, aliases, namespaces }\n}\n\n/** 사람용 help 텍스트. 루트면 footer (고객 CLI 내장 명령) 를 붙인다 */\nfunction helpText(help: Help, prog: string, ctx: ReportContext): string {\n const target = help.kind === \"root\" ? \"\" : help.id\n const text = renderHelp(registryFromHelp(help), target, { prog })\n return help.kind === \"root\" && ctx.footer ? `${text}\\n${ctx.footer}` : text\n}\n\n/** --help --json = help 결과 그대로 (서버 help 의 structuredContent · 내장 manifest help) */\nfunction printHelp(help: Help, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n io.stdout.write(json ? formatJson(help) : helpText(help, prog, ctx))\n return EXIT.ok\n}\n\n/* 결과 · 오류 */\n\nconst MEXT_CODES: readonly MextErrorCode[] = [\n \"UNKNOWN_COMMAND\",\n \"INVALID_ARGUMENT\",\n \"UNAUTHENTICATED\",\n \"PERMISSION_DENIED\",\n \"INPUT_UNAVAILABLE\",\n \"APPROVAL_REQUIRED\",\n]\n\n/** 서버 핸들러 예외 등 mext 구조화 오류 외의 도구 오류. --json = 서버 오류 본문 그대로, exit 1 */\nexport class RemoteExecutionError extends Error {\n readonly body: Record<string, unknown>\n constructor(body: Record<string, unknown>) {\n super(typeof body.message === \"string\" ? body.message : \"Remote command failed.\")\n this.name = \"RemoteExecutionError\"\n this.body = body\n }\n}\n\ninterface ReportContext {\n /** login 안내 명령 */\n login: string\n /** <BIN>_TOKEN */\n tokenEnv: string\n auth: AuthSource\n /** 루트 help footer */\n footer?: string | undefined\n formatter?: CliErrorFormatter | undefined\n}\n\n/** isError 결과 → MextError (code 가 mext 구조화 오류면) 또는 RemoteExecutionError */\nfunction toolError(result: CallToolResult, ctx: ReportContext): Error {\n const sc = result.structuredContent\n const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined\n if (!body) return new RemoteExecutionError({ code: \"EXECUTION_FAILED\", message: textValue(result) ?? \"Remote command failed.\" })\n const { code, message, ...details } = body\n if (typeof code === \"string\" && (MEXT_CODES as readonly string[]).includes(code)) {\n const text = typeof message === \"string\" ? message : code\n if (code === \"UNAUTHENTICATED\") {\n return new MextError(\"UNAUTHENTICATED\", text, { ...(details as MextErrorDetails[\"UNAUTHENTICATED\"]), login: ctx.login })\n }\n return new MextError(code as MextErrorCode, text, details as never)\n }\n return new RemoteExecutionError(body)\n}\n\nfunction textValue(result: CallToolResult): string | undefined {\n const texts = (result.content ?? []).flatMap((c) =>\n isRecord(c) && c.type === \"text\" && typeof c.text === \"string\" ? [c.text] : [],\n )\n return texts.length > 0 ? texts.join(\"\\n\") : undefined\n}\n\n/** 401 → UNAUTHENTICATED (login 안내 포함) */\nfunction unauthenticatedFrom(error: RemoteUnauthorizedError, ctx: ReportContext): MextError {\n const data = isRecord(error.data) ? error.data : {}\n const reason =\n data.reason === \"invalid_token\" || data.reason === \"missing_token\"\n ? data.reason\n : error.challenge.error === \"invalid_token\"\n ? \"invalid_token\"\n : \"missing_token\"\n let message = typeof data.message === \"string\" ? data.message : error.message\n if (ctx.auth === \"env\") message += ` ${ctx.tokenEnv} was rejected.`\n return new MextError(\"UNAUTHENTICATED\", message, { reason, login: ctx.login })\n}\n\nfunction report(error: unknown, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n let e = error\n if (e instanceof RemoteUnauthorizedError) e = unauthenticatedFrom(e, ctx)\n let text = formatError(e, prog)\n if (e instanceof MextError && e.code === \"PERMISSION_DENIED\" && ctx.auth === \"none\") {\n const reason = (e.details as MextErrorDetails[\"PERMISSION_DENIED\"]).reason\n if (reason === \"anonymous\") text += `Run \"${ctx.login}\" to log in.\\n`\n }\n // 확인 표시 없이 거부 (TTY 없음): 로컬 ask 의 안내와 같은 문구\n if (e instanceof MextError && e.code === \"APPROVAL_REQUIRED\" && (e.details as MextErrorDetails[\"APPROVAL_REQUIRED\"]).reason === \"unconfirmed\") {\n text += \"Pass --yes to approve.\\n\"\n }\n return emitError(io, { body: errorBody(e), text, exitCode: exitCodeOf(e), json }, ctx.formatter)\n}\n\nfunction errorBody(error: unknown): Record<string, unknown> {\n if (error instanceof RemoteExecutionError) return error.body\n if (\n error instanceof RemoteTransportError ||\n error instanceof RemoteRpcError ||\n error instanceof RemoteInputRequiredError ||\n error instanceof RemoteTaskError ||\n error instanceof OAuthFlowError\n ) {\n const body: Record<string, unknown> = { code: \"REMOTE_ERROR\", message: error.message }\n if (error instanceof RemoteRpcError) body.rpc = { code: error.code, status: error.status, data: error.data }\n if (error instanceof RemoteTaskError) {\n body.task = { taskId: error.taskId, status: error.status, ...(error.error ? { error: error.error } : {}) }\n }\n return body\n }\n return errorJson(error)\n}\n\nfunction usageError(message: string): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\"INVALID_ARGUMENT\", message, {\n command: \"\",\n missing_fields: [],\n issues: [{ path: \"\", code: \"unknown_flag\", message }],\n expected_schema: {},\n examples: [],\n })\n}\n\n/* MRTR: InputRequiredResult → 프롬프트 → inputResponses */\n\n/**\n * elicitation/create 처리 (clientCapabilities = elicitation.form · url).\n * mode url = 로컬 ctx.ask url 과 같음 (askUrl: --yes 미적용, TTY 없음 · --json = INPUT_UNAVAILABLE). accept · decline.\n * requestedSchema 가 boolean 속성 하나 = 확인: --yes → 승인, TTY → [y/N], 그 외 INPUT_UNAVAILABLE.\n * 그 외 form = TTY 에서 필드별 입력 (스키마 모양으로 변환), TTY 없음 = INPUT_UNAVAILABLE.\n * 응답 = { action: \"accept\", content }. 이번 라운드 요청에 대한 응답만 보낸다\n */\nfunction inputHandler(\n io: CliIo,\n lines: LineReader,\n yes: boolean,\n json: boolean,\n command: string,\n signal: AbortSignal,\n): NonNullable<CallToolOptions[\"onInputRequired\"]> {\n const unavailable = (message: string, hint: string) =>\n new MextError(\"INPUT_UNAVAILABLE\", `${command} asked \"${message}\", but stdin is not a terminal.${hint}`, { command })\n const ask = async (prompt: string): Promise<string> => {\n const answer = await lines.question(prompt, signal)\n if (signal.aborted) throw new CliInterrupted()\n return answer ?? \"\"\n }\n return async (required: InputRequired): Promise<InputResponses> => {\n const out: InputResponses = {}\n for (const [key, request] of Object.entries(required.inputRequests ?? {})) {\n const params = isRecord(request.params) ? request.params : {}\n const message = typeof params.message === \"string\" ? params.message : \"Input required\"\n if (request.method !== \"elicitation/create\") {\n throw new RemoteTransportError(`${command}: unsupported input request ${request.method}.`)\n }\n if (params.mode === \"url\") {\n if (typeof params.url !== \"string\" || !/^https?:\\/\\//i.test(params.url)) {\n throw new RemoteTransportError(`${command}: url input request without an http(s) url.`)\n }\n const accepted = await askUrl(io, lines, { command, message, url: params.url }, { json, signal })\n out[key] = { action: accepted ? \"accept\" : \"decline\" }\n continue\n }\n const schema = isRecord(params.requestedSchema) ? params.requestedSchema : { type: \"object\", properties: {} }\n const confirmKey = confirmField(schema)\n if (confirmKey !== undefined) {\n if (yes) {\n out[key] = { action: \"accept\", content: { [confirmKey]: true } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Pass --yes to approve.\")\n const answer = await ask(`${message} [y/N] `)\n out[key] = { action: \"accept\", content: { [confirmKey]: /^y(es)?$/i.test(answer.trim()) } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Run it in an interactive terminal.\")\n io.stderr.write(`${message}\\n`)\n const spec = cliSpecFromJsonSchema(schema)\n const content: Record<string, unknown> = {}\n for (const f of spec.fields) {\n const answer = await ask(` ${f.key}${f.required ? \"\" : \" (optional)\"}: `)\n if (answer === \"\") continue\n if (f.kind.type === \"array\") {\n const kind = f.kind\n content[f.key] = answer.split(\",\").map((s) => {\n const r = coerceValue(kind, s.trim())\n return r.ok ? r.value : s\n })\n continue\n }\n const r = coerceValue(f.kind, answer)\n content[f.key] = r.ok ? r.value : answer\n }\n out[key] = { action: \"accept\", content }\n }\n return out\n }\n}\n\n/** requestedSchema 의 속성이 boolean 하나면 그 키 (확인 요청) */\nfunction confirmField(schema: Record<string, unknown>): string | undefined {\n const props = schema.properties\n if (!isRecord(props)) return undefined\n const keys = Object.keys(props)\n if (keys.length !== 1) return undefined\n const p = props[keys[0]!]\n return isRecord(p) && p.type === \"boolean\" ? keys[0] : undefined\n}\n"]}
@@ -0,0 +1,56 @@
1
+ import { APPROVAL_META_KEY } from "../mcp/constants.ts";
2
+ import type { Help } from "../mcp/help.ts";
3
+ import type { AnyCommands, CallArgs, ClientOptions, CommandInfo, CommandList, CommandMap, RequestOptions, SafeResult, ServerInfo, SubscribeOptions, Subscription, TaskHandle } from "./types.ts";
4
+ /**
5
+ * 타입 client (specs/client.md). 고객 CLI (client/runner.ts) 와 같은 원격 호출 코드 위의 얇은 계층:
6
+ * 전송 · MRTR 재시도 = remote/client.ts, task 폴링 = client/task.ts, command 노출의 목록 = client/manifest.ts.
7
+ * 이 모듈 (와 import 대상) 은 브라우저 번들에 들어간다: Node 내장 모듈 · Zod · MCP 서버 SDK import 금지.
8
+ * 자격 증명 (token · headers) 은 요청마다 호출자 함수에서 받고 저장하지 않는다
9
+ */
10
+ export { APPROVAL_META_KEY };
11
+ /**
12
+ * 호출 실패. code = 서버 구조화 오류 code (UNKNOWN_COMMAND · INVALID_ARGUMENT · PERMISSION_DENIED · APPROVAL_REQUIRED ·
13
+ * CommandError code …) 또는 client code (UNAUTHENTICATED · REMOTE_ERROR · INPUT_UNAVAILABLE). 모르는 code 도 그대로 전달
14
+ */
15
+ export declare class CallError<Code extends string = string> extends Error {
16
+ readonly code: Code;
17
+ /** 본문의 code · message 외 필드 */
18
+ readonly details: Record<string, unknown>;
19
+ /** 서버 본문 그대로 { code, message, ...details } */
20
+ readonly body: Record<string, unknown>;
21
+ /** 호출한 명령어 ID */
22
+ readonly command: string;
23
+ /** HTTP status (401 · JSON-RPC 오류) */
24
+ readonly status: number | undefined;
25
+ constructor(body: Record<string, unknown> & {
26
+ code: Code;
27
+ message: string;
28
+ }, command: string, options?: {
29
+ status?: number;
30
+ cause?: unknown;
31
+ });
32
+ }
33
+ export declare function isCallError<Code extends string = string>(error: unknown, code?: Code): error is CallError<Code>;
34
+ export interface MextClient<C extends CommandMap<C> = AnyCommands> {
35
+ /** MCP 엔드포인트 */
36
+ readonly url: string;
37
+ /** 명령어 호출. 성공 = 핸들러 반환값. 실패 = CallError (취소 = signal.reason) */
38
+ call<K extends keyof C & string>(id: K, ...args: CallArgs<C[K]["input"]>): Promise<C[K]["output"]>;
39
+ /** call 과 같고 CallError 를 던지지 않는다 (취소 · 호출 코드 콜백의 예외는 던진다) */
40
+ safeCall<K extends keyof C & string>(id: K, ...args: CallArgs<C[K]["input"]>): Promise<SafeResult<C[K]["output"], CallError>>;
41
+ /** 이 호출자에게 보이는 네임스페이스 · 명령어 요약 */
42
+ commands(options?: RequestOptions): Promise<CommandList>;
43
+ /** 명령어 하나 (ID · 별칭) 의 스키마 · 메타데이터. 없음 = CallError UNKNOWN_COMMAND */
44
+ describe(id: string, options?: RequestOptions): Promise<CommandInfo>;
45
+ /** 서버 help 그대로 (target 없음 = 루트). command 노출 = tools/list 로 만든 같은 모양 */
46
+ help(target?: string, options?: RequestOptions): Promise<Help>;
47
+ /** 노출 방식 · manifestHash · serverInfo */
48
+ server(options?: RequestOptions): Promise<ServerInfo>;
49
+ /** 이미 만든 task 의 조회 · 대기 · 취소 */
50
+ task(taskId: string): TaskHandle;
51
+ /** 자원 갱신 알림 구독 (subscriptions/listen). 서버 ack 후 resolve. ack 전 실패 = CallError (취소 = signal.reason) */
52
+ subscribe(uris: readonly string[], options?: SubscribeOptions): Promise<Subscription>;
53
+ /** 목록 · 스키마 · 노출 방식 캐시 비움 */
54
+ refresh(): void;
55
+ }
56
+ export declare function createClient<C extends CommandMap<C> = AnyCommands>(options: ClientOptions): MextClient<C>;