@obov/mext 0.6.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 (75) hide show
  1. package/dist/build.js +16 -2
  2. package/dist/build.js.map +1 -1
  3. package/dist/cli/args.js +1 -2
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/build.js +22 -2
  6. package/dist/cli/build.js.map +1 -1
  7. package/dist/cli/dev-server.js +3 -2
  8. package/dist/cli/dev-server.js.map +1 -1
  9. package/dist/cli/dev.d.ts +6 -0
  10. package/dist/cli/dev.js +4 -4
  11. package/dist/cli/dev.js.map +1 -1
  12. package/dist/cli/main.js +2 -0
  13. package/dist/cli/main.js.map +1 -1
  14. package/dist/cli/media.d.ts +19 -0
  15. package/dist/cli/media.js +77 -0
  16. package/dist/cli/media.js.map +1 -0
  17. package/dist/cli/run.js +5 -0
  18. package/dist/cli/run.js.map +1 -1
  19. package/dist/cli/serve.d.ts +10 -0
  20. package/dist/cli/serve.js +114 -0
  21. package/dist/cli/serve.js.map +1 -0
  22. package/dist/client/index.d.ts +2 -1
  23. package/dist/client/index.js.map +1 -1
  24. package/dist/client/runner.js +3 -0
  25. package/dist/client/runner.js.map +1 -1
  26. package/dist/client/typed.d.ts +3 -1
  27. package/dist/client/typed.js +39 -3
  28. package/dist/client/typed.js.map +1 -1
  29. package/dist/client/types.d.ts +31 -2
  30. package/dist/client/types.js.map +1 -1
  31. package/dist/config.d.ts +17 -0
  32. package/dist/config.js +36 -1
  33. package/dist/config.js.map +1 -1
  34. package/dist/content.d.ts +65 -0
  35. package/dist/content.js +99 -0
  36. package/dist/content.js.map +1 -0
  37. package/dist/index.d.ts +3 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/invoke.d.ts +4 -0
  41. package/dist/invoke.js +12 -5
  42. package/dist/invoke.js.map +1 -1
  43. package/dist/manifest.d.ts +6 -1
  44. package/dist/manifest.js.map +1 -1
  45. package/dist/mcp/constants.d.ts +2 -0
  46. package/dist/mcp/constants.js +2 -0
  47. package/dist/mcp/constants.js.map +1 -1
  48. package/dist/mcp/dispatch.d.ts +9 -3
  49. package/dist/mcp/dispatch.js +10 -4
  50. package/dist/mcp/dispatch.js.map +1 -1
  51. package/dist/mcp/host.d.ts +14 -0
  52. package/dist/mcp/host.js +48 -0
  53. package/dist/mcp/host.js.map +1 -0
  54. package/dist/mcp/http.d.ts +22 -5
  55. package/dist/mcp/http.js +125 -18
  56. package/dist/mcp/http.js.map +1 -1
  57. package/dist/mcp/index.d.ts +1 -0
  58. package/dist/mcp/index.js +1 -0
  59. package/dist/mcp/index.js.map +1 -1
  60. package/dist/mcp/tasks.js +1 -1
  61. package/dist/mcp/tasks.js.map +1 -1
  62. package/dist/remote/client.d.ts +24 -1
  63. package/dist/remote/client.js +177 -53
  64. package/dist/remote/client.js.map +1 -1
  65. package/dist/remote/index.d.ts +1 -1
  66. package/dist/remote/index.js.map +1 -1
  67. package/dist/route.d.ts +40 -2
  68. package/dist/route.js +128 -8
  69. package/dist/route.js.map +1 -1
  70. package/dist/start.js +3 -2
  71. package/dist/start.js.map +1 -1
  72. package/dist/version-constant.d.ts +1 -1
  73. package/dist/version-constant.js +1 -1
  74. package/dist/version-constant.js.map +1 -1
  75. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"typed.js","sourceRoot":"","sources":["../../src/client/typed.ts"],"names":[],"mappings":"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","sourcesContent":["import { MextError } from \"../errors.ts\"\nimport { APPROVAL_META_KEY, COMMAND_META_KEY, MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from \"../mcp/constants.ts\"\nimport type { ToolExposure } from \"../mcp/dispatch.ts\"\nimport type { Help } from \"../mcp/help.ts\"\nimport {\n createRemoteClient,\n isRecord,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n TASKS_EXTENSION_ID,\n type CallToolOptions,\n type CallToolResult,\n type InputRequired,\n type InputRequestObject,\n type InputResponses,\n type RemoteClient,\n type RemoteTool,\n} from \"../remote/client.ts\"\nimport { VERSION } from \"../version-constant.ts\"\nimport { manifestFromTools, manifestHelp } from \"./manifest.ts\"\nimport { awaitTask, isTaskResult, RemoteTaskError } from \"./task.ts\"\nimport type {\n AnyCommands,\n CallArgs,\n CallOptions,\n ClientOptions,\n CommandInfo,\n CommandList,\n CommandMap,\n CommandSummary,\n InputAnswer,\n InputRequestInfo,\n NamespaceSummary,\n RequestOptions,\n SafeResult,\n ServerInfo,\n TaskHandle,\n TaskStatus,\n} from \"./types.ts\"\n\n/**\n * 타입 client (specs/client.md). 고객 CLI (client/runner.ts) 와 같은 원격 호출 코드 위의 얇은 계층:\n * 전송 · MRTR 재시도 = remote/client.ts, task 폴링 = client/task.ts, command 노출의 목록 = client/manifest.ts.\n * 이 모듈 (와 import 대상) 은 브라우저 번들에 들어간다: Node 내장 모듈 · Zod · MCP 서버 SDK import 금지.\n * 자격 증명 (token · headers) 은 요청마다 호출자 함수에서 받고 저장하지 않는다\n */\n\nexport { APPROVAL_META_KEY }\n\n/** 결과 _meta 의 serverInfo 키 (MCP 2026-07-28) */\nconst SERVER_INFO_META_KEY = \"io.modelcontextprotocol/serverInfo\"\n\n/** 진행률을 받을 때 싣는 progressToken */\nconst PROGRESS_TOKEN = \"mext-client\"\n\n/** dispatcher 도구 (execute · query · mutate) 의 command 인자 = Mcp-Param-Command 헤더 (mext.md §6) */\nconst DISPATCHER_INPUT_SCHEMA = { type: \"object\", properties: { command: { type: \"string\", \"x-mcp-header\": \"Command\" } } }\n\n/**\n * 호출 실패. code = 서버 구조화 오류 code (UNKNOWN_COMMAND · INVALID_ARGUMENT · PERMISSION_DENIED · APPROVAL_REQUIRED ·\n * CommandError code …) 또는 client code (UNAUTHENTICATED · REMOTE_ERROR · INPUT_UNAVAILABLE). 모르는 code 도 그대로 전달\n */\nexport class CallError<Code extends string = string> extends Error {\n readonly code: Code\n /** 본문의 code · message 외 필드 */\n readonly details: Record<string, unknown>\n /** 서버 본문 그대로 { code, message, ...details } */\n readonly body: Record<string, unknown>\n /** 호출한 명령어 ID */\n readonly command: string\n /** HTTP status (401 · JSON-RPC 오류) */\n readonly status: number | undefined\n\n constructor(body: Record<string, unknown> & { code: Code; message: string }, command: string, options: { status?: number; cause?: unknown } = {}) {\n super(body.message, options.cause === undefined ? undefined : { cause: options.cause })\n this.name = \"CallError\"\n this.code = body.code\n const { code: _code, message: _message, ...details } = body\n this.details = details\n this.body = body\n this.command = command\n this.status = options.status\n }\n}\n\nexport function isCallError<Code extends string = string>(error: unknown, code?: Code): error is CallError<Code> {\n return error instanceof CallError && (code === undefined || error.code === code)\n}\n\nexport interface MextClient<C extends CommandMap<C> = AnyCommands> {\n /** MCP 엔드포인트 */\n readonly url: string\n /** 명령어 호출. 성공 = 핸들러 반환값. 실패 = CallError (취소 = signal.reason) */\n call<K extends keyof C & string>(id: K, ...args: CallArgs<C[K][\"input\"]>): Promise<C[K][\"output\"]>\n /** call 과 같고 CallError 를 던지지 않는다 (취소 · 호출 코드 콜백의 예외는 던진다) */\n safeCall<K extends keyof C & string>(id: K, ...args: CallArgs<C[K][\"input\"]>): Promise<SafeResult<C[K][\"output\"], CallError>>\n /** 이 호출자에게 보이는 네임스페이스 · 명령어 요약 */\n commands(options?: RequestOptions): Promise<CommandList>\n /** 명령어 하나 (ID · 별칭) 의 스키마 · 메타데이터. 없음 = CallError UNKNOWN_COMMAND */\n describe(id: string, options?: RequestOptions): Promise<CommandInfo>\n /** 서버 help 그대로 (target 없음 = 루트). command 노출 = tools/list 로 만든 같은 모양 */\n help(target?: string, options?: RequestOptions): Promise<Help>\n /** 노출 방식 · manifestHash · serverInfo */\n server(options?: RequestOptions): Promise<ServerInfo>\n /** 이미 만든 task 의 조회 · 대기 · 취소 */\n task(taskId: string): TaskHandle\n /** 목록 · 스키마 · 노출 방식 캐시 비움 */\n refresh(): void\n}\n\nexport function createClient<C extends CommandMap<C> = AnyCommands>(options: ClientOptions): MextClient<C> {\n const baseFetch: typeof fetch = options.fetch ?? ((input, init) => fetch(input, init))\n const headersOf = options.headers\n const tokenOf = options.token\n const remote = createRemoteClient({\n url: options.url,\n clientInfo: options.clientInfo ?? { name: \"mext-client\", version: VERSION },\n ...(tokenOf !== undefined ? { token: typeof tokenOf === \"function\" ? tokenOf : () => tokenOf } : {}),\n fetch: (async (input, init) => {\n const extra = typeof headersOf === \"function\" ? await headersOf() : headersOf\n if (!extra) return baseFetch(input, init)\n const headers = new Headers(init?.headers)\n for (const [name, value] of Object.entries(extra)) headers.set(name, value)\n return baseFetch(input, { ...init, headers })\n }) as typeof fetch,\n })\n\n /* 캐시 (메모리). manifestHash 가 바뀐 것을 보면 비운다 */\n let server: Promise<ServerInfo> | undefined\n let listing: Promise<RemoteTool[]> | undefined\n let helps = new Map<string, Promise<Help>>()\n let knownHash: string | undefined\n const refresh = (): void => {\n server = undefined\n listing = undefined\n helps = new Map()\n knownHash = undefined\n }\n const observe = (hash: string | undefined): void => {\n if (hash === undefined) return\n if (knownHash !== undefined && knownHash !== hash) refresh()\n knownHash = hash\n }\n /** 실패한 조회는 캐시에 남기지 않는다 */\n const cached = <T>(get: () => Promise<T> | undefined, set: (p: Promise<T> | undefined) => void, load: () => Promise<T>): Promise<T> => {\n const existing = get()\n if (existing) return existing\n const p = load()\n set(p)\n p.catch(() => {\n if (get() === p) set(undefined)\n })\n return p\n }\n\n const tools = (o: RequestOptions): Promise<RemoteTool[]> =>\n cached(\n () => listing,\n (p) => (listing = p),\n () => remote.listTools(sig(o)),\n )\n\n const loadServer = async (o: RequestOptions): Promise<ServerInfo> => {\n let discover: Record<string, unknown> | undefined\n try {\n discover = await remote.request(\"server/discover\", {}, sig(o))\n } catch (error) {\n // discover 없는 서버 = 도구 이름으로 추정\n if (!(error instanceof RemoteRpcError)) throw error\n }\n const meta = isRecord(discover?._meta) ? discover._meta : {}\n const declared = options.tools ?? meta[TOOLS_META_KEY]\n const exposure: ToolExposure = isExposure(declared) ? declared : exposureOfTools(await tools(o))\n const info: ServerInfo = { tools: exposure, tasks: false }\n if (typeof meta[MANIFEST_HASH_META_KEY] === \"string\") {\n info.manifestHash = meta[MANIFEST_HASH_META_KEY]\n observe(info.manifestHash)\n }\n // 2026-07-28 = 결과 _meta 의 serverInfo (2025 initialize 결과는 최상위)\n const reported = meta[SERVER_INFO_META_KEY] ?? discover?.serverInfo\n const serverInfo = isRecord(reported) ? reported : {}\n if (typeof serverInfo.name === \"string\") info.name = serverInfo.name\n if (typeof serverInfo.version === \"string\") info.version = serverInfo.version\n if (typeof discover?.instructions === \"string\") info.instructions = discover.instructions\n const capabilities = isRecord(discover?.capabilities) ? discover.capabilities : {}\n info.tasks = isRecord(capabilities.extensions) && isRecord(capabilities.extensions[TASKS_EXTENSION_ID])\n return info\n }\n const serverInfo = (o: RequestOptions): Promise<ServerInfo> =>\n cached(\n () => server,\n (p) => (server = p),\n () => loadServer(o),\n )\n const exposureOf = async (o: RequestOptions): Promise<ToolExposure> => options.tools ?? (await serverInfo(o)).tools\n\n /** help 1회 (캐시). command 노출 = tools/list 로 만든 manifest 의 help (help 도구 없음) */\n const help = (target: string, o: RequestOptions): Promise<Help> =>\n cached(\n () => helps.get(target),\n (p) => (p ? helps.set(target, p) : helps.delete(target)),\n async () => {\n const exposure = await exposureOf(o)\n if (exposure === \"command\") return withToolMeta(manifestHelp(manifestFromTools(await tools(o)), target), await tools(o))\n const args = target === \"\" ? { command: \"help\" } : { command: \"help\", args: { target } }\n const result = await remote.callTool(dispatcherTool(exposure === \"split\" ? \"query\" : \"execute\"), args, sig(o))\n observe(metaHash(result))\n if (result.isError === true) throw toolError(result, target)\n const value = result.structuredContent\n if (!isRecord(value) || (value.kind !== \"root\" && value.kind !== \"namespace\" && value.kind !== \"command\")) {\n throw new RemoteTransportError(`${options.url} returned an unexpected help result.`)\n }\n return value as unknown as Help\n },\n )\n\n const describe = async (id: string, o: RequestOptions): Promise<CommandInfo> => {\n const value = await help(id, o)\n const command = value.kind === \"command\" ? value : value.kind === \"namespace\" ? value.command : undefined\n if (!command) {\n throw new CallError(\n { code: \"UNKNOWN_COMMAND\", message: id === \"\" ? \"No command given.\" : `\"${id}\" is a namespace, not a command.`, command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n id,\n )\n }\n const { kind: _kind, ...info } = command\n return info as unknown as CommandInfo\n }\n\n const commands = async (o: RequestOptions): Promise<CommandList> => {\n const root = await help(\"\", o)\n if (root.kind !== \"root\") throw new RemoteTransportError(`${options.url} returned an unexpected help result.`)\n const namespaces: NamespaceSummary[] = []\n const list: CommandSummary[] = [...(root.commands as unknown as CommandSummary[])]\n // 네임스페이스마다 help 1회 (너비 우선). command 노출 = 캐시된 tools/list 에서 계산 (요청 없음)\n for (let queue = [...root.namespaces]; queue.length > 0; ) {\n const next: typeof queue = []\n for (const ns of queue) namespaces.push(ns)\n for (const value of await Promise.all(queue.map((ns) => help(ns.id, o)))) {\n if (value.kind !== \"namespace\") continue\n list.push(...(value.commands as unknown as CommandSummary[]))\n next.push(...value.namespaces)\n }\n queue = next\n }\n const byId = (a: { id: string }, b: { id: string }): number => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)\n const out: CommandList = { namespaces: namespaces.sort(byId), commands: list.sort(byId) }\n if (root.description !== undefined) out.description = root.description\n return out\n }\n\n /** 명령어를 호출할 도구 · 인자 (노출 방식별, specs/client.md §2.2) */\n const target = async (id: string, input: Record<string, unknown>, o: RequestOptions): Promise<{ tool: RemoteTool; args: Record<string, unknown> }> => {\n const exposure = await exposureOf(o)\n if (exposure === \"command\") return { tool: { name: id }, args: input }\n if (exposure === \"execute\") return { tool: dispatcherTool(\"execute\"), args: { command: id, args: input } }\n const info = await describe(id, o)\n return { tool: dispatcherTool(info.tool ?? (info.readOnly ? \"query\" : \"mutate\")), args: { command: id, args: input } }\n }\n\n const finish = (result: CallToolResult, command: string): unknown => {\n observe(metaHash(result))\n if (result.isError === true) throw toolError(result, command)\n return result.structuredContent === undefined ? (textValue(result) ?? null) : result.structuredContent\n }\n\n /** task 폴링 (client/task.ts awaitTask). tasks/get 을 감싸 상태 변화마다 onTask */\n const waitTask = (created: CallToolResult & { taskId: string }, command: string, o: CallOptions): Promise<CallToolResult> => {\n let last = \"\"\n const notify = (view: Record<string, unknown>): void => {\n const status: TaskStatus = { taskId: created.taskId, status: typeof view.status === \"string\" ? view.status : \"working\" }\n if (typeof view.statusMessage === \"string\") status.statusMessage = view.statusMessage\n const key = `${status.status}\\n${status.statusMessage ?? \"\"}`\n if (key === last) return\n last = key\n o.onTask?.(status)\n }\n notify(created)\n const watched: RemoteClient = {\n ...remote,\n getTask: async (taskId, opts) => {\n const view = await remote.getTask(taskId, opts)\n notify(view)\n return view\n },\n }\n return awaitTask(created, {\n client: watched,\n call: (fn) => fn({ signal: o.signal ?? NEVER }),\n signal: o.signal ?? NEVER,\n onInputRequired: inputHandler(command, o),\n onStatus: (message) => o.onProgress?.({ message }),\n })\n }\n\n const run = async (id: string, input: Record<string, unknown>, o: CallOptions): Promise<unknown> => {\n try {\n const { tool, args } = await target(id, input, o)\n const callOptions: CallToolOptions = { ...sig(o), onInputRequired: inputHandler(id, o) }\n if (o.confirmed === true) callOptions.meta = { [APPROVAL_META_KEY]: { confirmed: true } }\n if (o.onProgress) {\n const onProgress = o.onProgress\n callOptions.progressToken = PROGRESS_TOKEN\n callOptions.onNotification = (method, params) => {\n if (method !== \"notifications/progress\" || typeof params.progress !== \"number\") return\n onProgress({\n progress: params.progress,\n ...(typeof params.total === \"number\" ? { total: params.total } : {}),\n ...(typeof params.message === \"string\" ? { message: params.message } : {}),\n })\n }\n }\n let result: CallToolResult\n try {\n result = await remote.callTool(tool, args, callOptions)\n } catch (error) {\n // command 노출: 없는 도구 = JSON-RPC 오류. 별칭이면 정식 ID 로 다시, 없는 ID 면 UNKNOWN_COMMAND (dispatcher 와 같은 본문)\n const canonical = error instanceof RemoteRpcError && tool.name === id ? await canonicalId(id, o) : undefined\n if (canonical === undefined) throw error\n result = await remote.callTool({ name: canonical }, args, callOptions)\n }\n if (isTaskResult(result)) result = await waitTask(result, id, o)\n return finish(result, id)\n } catch (error) {\n throw normalize(error, id, o.signal)\n }\n }\n\n /** command 노출에서 실패한 도구 이름: 별칭 → 정식 ID, 정식 ID 그대로 = undefined (원래 오류), 없는 ID = MextError UNKNOWN_COMMAND */\n const canonicalId = async (id: string, o: RequestOptions): Promise<string | undefined> => {\n if ((await exposureOf(o)) !== \"command\") return undefined\n listing = undefined\n helps = new Map()\n const found = manifestHelp(manifestFromTools(await tools(o)), id)\n const command = found.kind === \"command\" ? found : undefined\n return command !== undefined && command.id !== id ? command.id : undefined\n }\n\n const taskHandle = (taskId: string): TaskHandle => ({\n taskId,\n async get(o = {}) {\n try {\n return taskStatus(taskId, await remote.getTask(taskId, sig(o)))\n } catch (error) {\n throw normalize(error, \"\", o.signal)\n }\n },\n async wait(o = {}) {\n try {\n const view = await remote.getTask(taskId, sig(o))\n return finish(await waitTask({ ...view, taskId }, \"\", o), \"\")\n } catch (error) {\n throw normalize(error, \"\", o.signal)\n }\n },\n async cancel(o = {}) {\n try {\n await remote.cancelTask(taskId, sig(o))\n } catch (error) {\n throw normalize(error, \"\", o.signal)\n }\n },\n })\n\n const guarded = async <T>(command: string, o: RequestOptions, fn: () => Promise<T>): Promise<T> => {\n try {\n return await fn()\n } catch (error) {\n throw normalize(error, command, o.signal)\n }\n }\n\n const call = (id: string, input?: unknown, o?: CallOptions): Promise<unknown> =>\n run(id, (input ?? {}) as Record<string, unknown>, o ?? {})\n\n return {\n url: options.url,\n call: call as MextClient<C>[\"call\"],\n safeCall: (async (id: string, input?: unknown, o?: CallOptions) => {\n try {\n return { ok: true, value: await call(id, input, o) }\n } catch (error) {\n if (error instanceof CallError) return { ok: false, error }\n throw error\n }\n }) as MextClient<C>[\"safeCall\"],\n commands: (o = {}) => guarded(\"\", o, () => commands(o)),\n describe: (id, o = {}) => guarded(id, o, () => describe(id, o)),\n help: (t = \"\", o = {}) => guarded(t, o, () => help(t.trim(), o)),\n server: (o = {}) => guarded(\"\", o, () => serverInfo(o)),\n task: taskHandle,\n refresh,\n }\n}\n\n/* 입력 요청 (MRTR · task input_required) */\n\n/**\n * InputRequiredResult → inputResponses. confirmed = confirm 요청에 묻지 않고 승인. 그 외 = onInput.\n * onInput 없음 · 모르는 요청 = CallError INPUT_UNAVAILABLE (호출은 실행되지 않았다)\n */\nfunction inputHandler(command: string, o: CallOptions): NonNullable<CallToolOptions[\"onInputRequired\"]> {\n return async (required: InputRequired): Promise<InputResponses> => {\n const out: InputResponses = {}\n for (const [key, raw] of Object.entries(required.inputRequests ?? {})) {\n const info = describeInput(key, raw, command)\n if (info === undefined) throw inputUnavailable(command, required, `unsupported input request ${raw.method}`)\n const confirmKey = info.kind === \"confirm\" ? confirmField(info.schema ?? {}) : undefined\n if (confirmKey !== undefined && o.confirmed === true) {\n out[key] = { action: \"accept\", content: { [confirmKey]: true } }\n continue\n }\n if (!o.onInput) throw inputUnavailable(command, required, `asked \"${info.message}\"`)\n const answer: InputAnswer = await o.onInput(info)\n if (answer === true) out[key] = confirmKey !== undefined ? { action: \"accept\", content: { [confirmKey]: true } } : { action: \"accept\" }\n else if (answer === false) out[key] = { action: \"decline\" }\n else out[key] = answer\n }\n return out\n }\n}\n\nfunction describeInput(key: string, raw: InputRequestObject, command: string): InputRequestInfo | undefined {\n if (raw.method !== \"elicitation/create\") return undefined\n const params = isRecord(raw.params) ? raw.params : {}\n const message = typeof params.message === \"string\" ? params.message : \"Input required\"\n if (params.mode === \"url\") {\n if (typeof params.url !== \"string\") return undefined\n return { key, kind: \"url\", message, url: params.url, command, raw }\n }\n const schema = isRecord(params.requestedSchema) ? params.requestedSchema : { type: \"object\", properties: {} }\n return { key, kind: confirmField(schema) !== undefined ? \"confirm\" : \"form\", message, schema, command, raw }\n}\n\n/** requestedSchema 의 속성이 boolean 하나면 그 키 (확인 요청. 고객 CLI 와 같은 판정) */\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\nfunction inputUnavailable(command: string, required: InputRequired, why: string): CallError {\n return new CallError(\n {\n code: \"INPUT_UNAVAILABLE\",\n message: `${command || \"The task\"} ${why}, but this call has no handler for it. Pass onInput (or confirmed: true for confirmations).`,\n command,\n requests: required.inputRequests ?? {},\n },\n command,\n )\n}\n\n/* 결과 · 오류 */\n\n/** isError 결과 → CallError. 본문 = structuredContent.error (없으면 text 로 EXECUTION_FAILED) */\nfunction toolError(result: CallToolResult, command: string): CallError {\n const sc = result.structuredContent\n const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined\n if (body && typeof body.code === \"string\") {\n return new CallError({ ...body, code: body.code, message: typeof body.message === \"string\" ? body.message : body.code }, command)\n }\n return new CallError({ code: \"EXECUTION_FAILED\", message: textValue(result) ?? \"Remote command failed.\" }, command)\n}\n\n/** 원격 호출 계층의 오류 → CallError. 취소 = signal.reason. 그 외 (호출 코드 콜백의 예외 등) = 그대로 */\nfunction normalize(error: unknown, command: string, signal: AbortSignal | undefined): unknown {\n if (signal?.aborted) return signal.reason\n if (error instanceof CallError) return error\n if (error instanceof MextError) return new CallError(error.toJSON(), command)\n if (error instanceof RemoteUnauthorizedError) {\n const data = isRecord(error.data) ? error.data : {}\n const reason = data.reason === \"invalid_token\" || error.challenge.error === \"invalid_token\" ? \"invalid_token\" : \"missing_token\"\n return new CallError({ ...data, code: \"UNAUTHENTICATED\", message: error.message, reason }, command, { status: 401, cause: error })\n }\n if (error instanceof RemoteInputRequiredError) {\n return new CallError({ code: \"INPUT_UNAVAILABLE\", message: error.message, command, requests: error.request.inputRequests ?? {} }, command, { cause: error })\n }\n if (error instanceof RemoteRpcError) {\n const rpc = { code: error.code, status: error.status, data: error.data }\n return new CallError({ code: \"REMOTE_ERROR\", message: error.message, rpc }, command, { status: error.status, cause: error })\n }\n if (error instanceof RemoteTaskError) {\n const task = { taskId: error.taskId, status: error.status, ...(error.error ? { error: error.error } : {}) }\n return new CallError({ code: \"REMOTE_ERROR\", message: error.message, task }, command, { cause: error })\n }\n if (error instanceof RemoteTransportError) return new CallError({ code: \"REMOTE_ERROR\", message: error.message }, command, { cause: error })\n return error\n}\n\nfunction textValue(result: CallToolResult): string | undefined {\n const texts = (result.content ?? []).flatMap((c) => (isRecord(c) && c.type === \"text\" && typeof c.text === \"string\" ? [c.text] : []))\n return texts.length > 0 ? texts.join(\"\\n\") : undefined\n}\n\nfunction metaHash(result: CallToolResult): string | undefined {\n const value = isRecord(result._meta) ? result._meta[MANIFEST_HASH_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n}\n\nfunction taskStatus(taskId: string, view: Record<string, unknown>): TaskStatus {\n const status: TaskStatus = { taskId, status: typeof view.status === \"string\" ? view.status : \"working\" }\n if (typeof view.statusMessage === \"string\") status.statusMessage = view.statusMessage\n return status\n}\n\n/* 노출 방식 */\n\nfunction isExposure(value: unknown): value is ToolExposure {\n return value === \"execute\" || value === \"split\" || value === \"command\"\n}\n\n/** server/discover 가 없는 서버: 도구 이름으로 추정 */\nfunction exposureOfTools(tools: readonly RemoteTool[]): ToolExposure {\n const names = new Set(tools.map((t) => t.name))\n if (names.has(\"execute\")) return \"execute\"\n if (names.has(\"query\") && names.has(\"mutate\")) return \"split\"\n return \"command\"\n}\n\nfunction dispatcherTool(name: string): RemoteTool {\n return { name, inputSchema: DISPATCHER_INPUT_SCHEMA }\n}\n\n/**\n * command 노출의 help 에 도구 _meta[\"dev.mext/command\"] 의 모르는 필드를 더한다 (manifestFromTools 는 아는 필드만 옮긴다).\n * 서버가 client 보다 새 버전일 때 메타데이터 (예: needsApproval) 가 사라지지 않게\n */\nfunction withToolMeta(value: Help, tools: readonly RemoteTool[]): Help {\n const extra = (id: string): Record<string, unknown> => {\n const meta = tools.find((t) => t.name === id)?._meta\n return isRecord(meta) && isRecord(meta[COMMAND_META_KEY]) ? meta[COMMAND_META_KEY] : {}\n }\n const merge = <T extends { id: string }>(item: T, keys?: readonly string[]): T => {\n const meta = extra(item.id)\n const picked = keys ? Object.fromEntries(Object.entries(meta).filter(([k]) => keys.includes(k))) : meta\n return { ...picked, ...item }\n }\n if (value.kind === \"command\") return merge(value)\n const commands = value.commands.map((c) => merge(c, SUMMARY_EXTRA_KEYS))\n if (value.kind === \"namespace\" && value.command) return { ...value, commands, command: merge(value.command) }\n return { ...value, commands }\n}\n\n/** 요약 (목록) 에 싣는 추가 메타데이터 */\nconst SUMMARY_EXTRA_KEYS: readonly string[] = [\"needsApproval\"]\n\nconst NEVER: AbortSignal = new AbortController().signal\n\nfunction sig(o: RequestOptions): { signal?: AbortSignal } {\n return o.signal ? { signal: o.signal } : {}\n}\n"]}
1
+ {"version":3,"file":"typed.js","sourceRoot":"","sources":["../../src/client/typed.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContentBlock } from \"../content.ts\"\nimport { MextError } from \"../errors.ts\"\nimport { APPROVAL_META_KEY, COMMAND_META_KEY, MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from \"../mcp/constants.ts\"\nimport type { ToolExposure } from \"../mcp/dispatch.ts\"\nimport type { Help } from \"../mcp/help.ts\"\nimport {\n createRemoteClient,\n isRecord,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n TASKS_EXTENSION_ID,\n type CallToolOptions,\n type CallToolResult,\n type InputRequired,\n type InputRequestObject,\n type InputResponses,\n type RemoteClient,\n type RemoteTool,\n} from \"../remote/client.ts\"\nimport { VERSION } from \"../version-constant.ts\"\nimport { manifestFromTools, manifestHelp } from \"./manifest.ts\"\nimport { awaitTask, isTaskResult, RemoteTaskError } from \"./task.ts\"\nimport type {\n AnyCommands,\n CallArgs,\n CallOptions,\n ClientOptions,\n CommandInfo,\n CommandList,\n CommandMap,\n CommandSummary,\n InputAnswer,\n InputRequestInfo,\n NamespaceSummary,\n RequestOptions,\n SafeResult,\n ServerInfo,\n SubscribeOptions,\n Subscription,\n SubscriptionEnd,\n TaskHandle,\n TaskStatus,\n} from \"./types.ts\"\n\n/**\n * 타입 client (specs/client.md). 고객 CLI (client/runner.ts) 와 같은 원격 호출 코드 위의 얇은 계층:\n * 전송 · MRTR 재시도 = remote/client.ts, task 폴링 = client/task.ts, command 노출의 목록 = client/manifest.ts.\n * 이 모듈 (와 import 대상) 은 브라우저 번들에 들어간다: Node 내장 모듈 · Zod · MCP 서버 SDK import 금지.\n * 자격 증명 (token · headers) 은 요청마다 호출자 함수에서 받고 저장하지 않는다\n */\n\nexport { APPROVAL_META_KEY }\n\n/** 결과 _meta 의 serverInfo 키 (MCP 2026-07-28) */\nconst SERVER_INFO_META_KEY = \"io.modelcontextprotocol/serverInfo\"\n\n/** 진행률을 받을 때 싣는 progressToken */\nconst PROGRESS_TOKEN = \"mext-client\"\n\n/** dispatcher 도구 (execute · query · mutate) 의 command 인자 = Mcp-Param-Command 헤더 (mext.md §6) */\nconst DISPATCHER_INPUT_SCHEMA = { type: \"object\", properties: { command: { type: \"string\", \"x-mcp-header\": \"Command\" } } }\n\n/**\n * 호출 실패. code = 서버 구조화 오류 code (UNKNOWN_COMMAND · INVALID_ARGUMENT · PERMISSION_DENIED · APPROVAL_REQUIRED ·\n * CommandError code …) 또는 client code (UNAUTHENTICATED · REMOTE_ERROR · INPUT_UNAVAILABLE). 모르는 code 도 그대로 전달\n */\nexport class CallError<Code extends string = string> extends Error {\n readonly code: Code\n /** 본문의 code · message 외 필드 */\n readonly details: Record<string, unknown>\n /** 서버 본문 그대로 { code, message, ...details } */\n readonly body: Record<string, unknown>\n /** 호출한 명령어 ID */\n readonly command: string\n /** HTTP status (401 · JSON-RPC 오류) */\n readonly status: number | undefined\n\n constructor(body: Record<string, unknown> & { code: Code; message: string }, command: string, options: { status?: number; cause?: unknown } = {}) {\n super(body.message, options.cause === undefined ? undefined : { cause: options.cause })\n this.name = \"CallError\"\n this.code = body.code\n const { code: _code, message: _message, ...details } = body\n this.details = details\n this.body = body\n this.command = command\n this.status = options.status\n }\n}\n\nexport function isCallError<Code extends string = string>(error: unknown, code?: Code): error is CallError<Code> {\n return error instanceof CallError && (code === undefined || error.code === code)\n}\n\nexport interface MextClient<C extends CommandMap<C> = AnyCommands> {\n /** MCP 엔드포인트 */\n readonly url: string\n /** 명령어 호출. 성공 = 핸들러 반환값. 실패 = CallError (취소 = signal.reason) */\n call<K extends keyof C & string>(id: K, ...args: CallArgs<C[K][\"input\"]>): Promise<C[K][\"output\"]>\n /** call 과 같고 CallError 를 던지지 않는다 (취소 · 호출 코드 콜백의 예외는 던진다) */\n safeCall<K extends keyof C & string>(id: K, ...args: CallArgs<C[K][\"input\"]>): Promise<SafeResult<C[K][\"output\"], CallError>>\n /** 이 호출자에게 보이는 네임스페이스 · 명령어 요약 */\n commands(options?: RequestOptions): Promise<CommandList>\n /** 명령어 하나 (ID · 별칭) 의 스키마 · 메타데이터. 없음 = CallError UNKNOWN_COMMAND */\n describe(id: string, options?: RequestOptions): Promise<CommandInfo>\n /** 서버 help 그대로 (target 없음 = 루트). command 노출 = tools/list 로 만든 같은 모양 */\n help(target?: string, options?: RequestOptions): Promise<Help>\n /** 노출 방식 · manifestHash · serverInfo */\n server(options?: RequestOptions): Promise<ServerInfo>\n /** 이미 만든 task 의 조회 · 대기 · 취소 */\n task(taskId: string): TaskHandle\n /** 자원 갱신 알림 구독 (subscriptions/listen). 서버 ack 후 resolve. ack 전 실패 = CallError (취소 = signal.reason) */\n subscribe(uris: readonly string[], options?: SubscribeOptions): Promise<Subscription>\n /** 목록 · 스키마 · 노출 방식 캐시 비움 */\n refresh(): void\n}\n\nexport function createClient<C extends CommandMap<C> = AnyCommands>(options: ClientOptions): MextClient<C> {\n const baseFetch: typeof fetch = options.fetch ?? ((input, init) => fetch(input, init))\n const headersOf = options.headers\n const tokenOf = options.token\n const remote = createRemoteClient({\n url: options.url,\n clientInfo: options.clientInfo ?? { name: \"mext-client\", version: VERSION },\n ...(tokenOf !== undefined ? { token: typeof tokenOf === \"function\" ? tokenOf : () => tokenOf } : {}),\n fetch: (async (input, init) => {\n const extra = typeof headersOf === \"function\" ? await headersOf() : headersOf\n if (!extra) return baseFetch(input, init)\n const headers = new Headers(init?.headers)\n for (const [name, value] of Object.entries(extra)) headers.set(name, value)\n return baseFetch(input, { ...init, headers })\n }) as typeof fetch,\n })\n\n /* 캐시 (메모리). manifestHash 가 바뀐 것을 보면 비운다 */\n let server: Promise<ServerInfo> | undefined\n let listing: Promise<RemoteTool[]> | undefined\n let helps = new Map<string, Promise<Help>>()\n let knownHash: string | undefined\n const refresh = (): void => {\n server = undefined\n listing = undefined\n helps = new Map()\n knownHash = undefined\n }\n const observe = (hash: string | undefined): void => {\n if (hash === undefined) return\n if (knownHash !== undefined && knownHash !== hash) refresh()\n knownHash = hash\n }\n /** 실패한 조회는 캐시에 남기지 않는다 */\n const cached = <T>(get: () => Promise<T> | undefined, set: (p: Promise<T> | undefined) => void, load: () => Promise<T>): Promise<T> => {\n const existing = get()\n if (existing) return existing\n const p = load()\n set(p)\n p.catch(() => {\n if (get() === p) set(undefined)\n })\n return p\n }\n\n const tools = (o: RequestOptions): Promise<RemoteTool[]> =>\n cached(\n () => listing,\n (p) => (listing = p),\n () => remote.listTools(sig(o)),\n )\n\n const loadServer = async (o: RequestOptions): Promise<ServerInfo> => {\n let discover: Record<string, unknown> | undefined\n try {\n discover = await remote.request(\"server/discover\", {}, sig(o))\n } catch (error) {\n // discover 없는 서버 = 도구 이름으로 추정\n if (!(error instanceof RemoteRpcError)) throw error\n }\n const meta = isRecord(discover?._meta) ? discover._meta : {}\n const declared = options.tools ?? meta[TOOLS_META_KEY]\n const exposure: ToolExposure = isExposure(declared) ? declared : exposureOfTools(await tools(o))\n const info: ServerInfo = { tools: exposure, tasks: false }\n if (typeof meta[MANIFEST_HASH_META_KEY] === \"string\") {\n info.manifestHash = meta[MANIFEST_HASH_META_KEY]\n observe(info.manifestHash)\n }\n // 2026-07-28 = 결과 _meta 의 serverInfo (2025 initialize 결과는 최상위)\n const reported = meta[SERVER_INFO_META_KEY] ?? discover?.serverInfo\n const serverInfo = isRecord(reported) ? reported : {}\n if (typeof serverInfo.name === \"string\") info.name = serverInfo.name\n if (typeof serverInfo.version === \"string\") info.version = serverInfo.version\n if (typeof discover?.instructions === \"string\") info.instructions = discover.instructions\n const capabilities = isRecord(discover?.capabilities) ? discover.capabilities : {}\n info.tasks = isRecord(capabilities.extensions) && isRecord(capabilities.extensions[TASKS_EXTENSION_ID])\n return info\n }\n const serverInfo = (o: RequestOptions): Promise<ServerInfo> =>\n cached(\n () => server,\n (p) => (server = p),\n () => loadServer(o),\n )\n const exposureOf = async (o: RequestOptions): Promise<ToolExposure> => options.tools ?? (await serverInfo(o)).tools\n\n /** help 1회 (캐시). command 노출 = tools/list 로 만든 manifest 의 help (help 도구 없음) */\n const help = (target: string, o: RequestOptions): Promise<Help> =>\n cached(\n () => helps.get(target),\n (p) => (p ? helps.set(target, p) : helps.delete(target)),\n async () => {\n const exposure = await exposureOf(o)\n if (exposure === \"command\") return withToolMeta(manifestHelp(manifestFromTools(await tools(o)), target), await tools(o))\n const args = target === \"\" ? { command: \"help\" } : { command: \"help\", args: { target } }\n const result = await remote.callTool(dispatcherTool(exposure === \"split\" ? \"query\" : \"execute\"), args, sig(o))\n observe(metaHash(result))\n if (result.isError === true) throw toolError(result, target)\n const value = result.structuredContent\n if (!isRecord(value) || (value.kind !== \"root\" && value.kind !== \"namespace\" && value.kind !== \"command\")) {\n throw new RemoteTransportError(`${options.url} returned an unexpected help result.`)\n }\n return value as unknown as Help\n },\n )\n\n const describe = async (id: string, o: RequestOptions): Promise<CommandInfo> => {\n const value = await help(id, o)\n const command = value.kind === \"command\" ? value : value.kind === \"namespace\" ? value.command : undefined\n if (!command) {\n throw new CallError(\n { code: \"UNKNOWN_COMMAND\", message: id === \"\" ? \"No command given.\" : `\"${id}\" is a namespace, not a command.`, command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n id,\n )\n }\n const { kind: _kind, ...info } = command\n return info as unknown as CommandInfo\n }\n\n const commands = async (o: RequestOptions): Promise<CommandList> => {\n const root = await help(\"\", o)\n if (root.kind !== \"root\") throw new RemoteTransportError(`${options.url} returned an unexpected help result.`)\n const namespaces: NamespaceSummary[] = []\n const list: CommandSummary[] = [...(root.commands as unknown as CommandSummary[])]\n // 네임스페이스마다 help 1회 (너비 우선). command 노출 = 캐시된 tools/list 에서 계산 (요청 없음)\n for (let queue = [...root.namespaces]; queue.length > 0; ) {\n const next: typeof queue = []\n for (const ns of queue) namespaces.push(ns)\n for (const value of await Promise.all(queue.map((ns) => help(ns.id, o)))) {\n if (value.kind !== \"namespace\") continue\n list.push(...(value.commands as unknown as CommandSummary[]))\n next.push(...value.namespaces)\n }\n queue = next\n }\n const byId = (a: { id: string }, b: { id: string }): number => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)\n const out: CommandList = { namespaces: namespaces.sort(byId), commands: list.sort(byId) }\n if (root.description !== undefined) out.description = root.description\n return out\n }\n\n /** 명령어를 호출할 도구 · 인자 (노출 방식별, specs/client.md §2.2) */\n const target = async (id: string, input: Record<string, unknown>, o: RequestOptions): Promise<{ tool: RemoteTool; args: Record<string, unknown> }> => {\n const exposure = await exposureOf(o)\n if (exposure === \"command\") return { tool: { name: id }, args: input }\n if (exposure === \"execute\") return { tool: dispatcherTool(\"execute\"), args: { command: id, args: input } }\n const info = await describe(id, o)\n return { tool: dispatcherTool(info.tool ?? (info.readOnly ? \"query\" : \"mutate\")), args: { command: id, args: input } }\n }\n\n const finish = (result: CallToolResult, command: string, o: CallOptions = {}): unknown => {\n observe(metaHash(result))\n if (result.isError === true) throw toolError(result, command)\n // 결과 콘텐츠 (mext.md §4): 값 text 외 블록 (image · audio · resource_link) = onContent\n const blocks = (result.content ?? []).filter((c): c is ContentBlock => isRecord(c) && c.type !== \"text\")\n if (blocks.length > 0) o.onContent?.(blocks)\n return result.structuredContent === undefined ? (textValue(result) ?? null) : result.structuredContent\n }\n\n /** task 폴링 (client/task.ts awaitTask). tasks/get 을 감싸 상태 변화마다 onTask */\n const waitTask = (created: CallToolResult & { taskId: string }, command: string, o: CallOptions): Promise<CallToolResult> => {\n let last = \"\"\n const notify = (view: Record<string, unknown>): void => {\n const status: TaskStatus = { taskId: created.taskId, status: typeof view.status === \"string\" ? view.status : \"working\" }\n if (typeof view.statusMessage === \"string\") status.statusMessage = view.statusMessage\n const key = `${status.status}\\n${status.statusMessage ?? \"\"}`\n if (key === last) return\n last = key\n o.onTask?.(status)\n }\n notify(created)\n const watched: RemoteClient = {\n ...remote,\n getTask: async (taskId, opts) => {\n const view = await remote.getTask(taskId, opts)\n notify(view)\n return view\n },\n }\n return awaitTask(created, {\n client: watched,\n call: (fn) => fn({ signal: o.signal ?? NEVER }),\n signal: o.signal ?? NEVER,\n onInputRequired: inputHandler(command, o),\n onStatus: (message) => o.onProgress?.({ message }),\n })\n }\n\n const run = async (id: string, input: Record<string, unknown>, o: CallOptions): Promise<unknown> => {\n try {\n const { tool, args } = await target(id, input, o)\n const callOptions: CallToolOptions = { ...sig(o), onInputRequired: inputHandler(id, o) }\n if (o.confirmed === true) callOptions.meta = { [APPROVAL_META_KEY]: { confirmed: true } }\n if (o.onProgress) {\n const onProgress = o.onProgress\n callOptions.progressToken = PROGRESS_TOKEN\n callOptions.onNotification = (method, params) => {\n if (method !== \"notifications/progress\" || typeof params.progress !== \"number\") return\n onProgress({\n progress: params.progress,\n ...(typeof params.total === \"number\" ? { total: params.total } : {}),\n ...(typeof params.message === \"string\" ? { message: params.message } : {}),\n })\n }\n }\n let result: CallToolResult\n try {\n result = await remote.callTool(tool, args, callOptions)\n } catch (error) {\n // command 노출: 없는 도구 = JSON-RPC 오류. 별칭이면 정식 ID 로 다시, 없는 ID 면 UNKNOWN_COMMAND (dispatcher 와 같은 본문)\n const canonical = error instanceof RemoteRpcError && tool.name === id ? await canonicalId(id, o) : undefined\n if (canonical === undefined) throw error\n result = await remote.callTool({ name: canonical }, args, callOptions)\n }\n if (isTaskResult(result)) result = await waitTask(result, id, o)\n return finish(result, id, o)\n } catch (error) {\n throw normalize(error, id, o.signal)\n }\n }\n\n /** command 노출에서 실패한 도구 이름: 별칭 → 정식 ID, 정식 ID 그대로 = undefined (원래 오류), 없는 ID = MextError UNKNOWN_COMMAND */\n const canonicalId = async (id: string, o: RequestOptions): Promise<string | undefined> => {\n if ((await exposureOf(o)) !== \"command\") return undefined\n listing = undefined\n helps = new Map()\n const found = manifestHelp(manifestFromTools(await tools(o)), id)\n const command = found.kind === \"command\" ? found : undefined\n return command !== undefined && command.id !== id ? command.id : undefined\n }\n\n const taskHandle = (taskId: string): TaskHandle => ({\n taskId,\n async get(o = {}) {\n try {\n return taskStatus(taskId, await remote.getTask(taskId, sig(o)))\n } catch (error) {\n throw normalize(error, \"\", o.signal)\n }\n },\n async wait(o = {}) {\n try {\n const view = await remote.getTask(taskId, sig(o))\n return finish(await waitTask({ ...view, taskId }, \"\", o), \"\", o)\n } catch (error) {\n throw normalize(error, \"\", o.signal)\n }\n },\n async cancel(o = {}) {\n try {\n await remote.cancelTask(taskId, sig(o))\n } catch (error) {\n throw normalize(error, \"\", o.signal)\n }\n },\n })\n\n /** subscriptions/listen (specs/client.md §2.4). 알림 중 notifications/resources/updated 만 onUpdate */\n const subscribe = async (uris: readonly string[], o: SubscribeOptions): Promise<Subscription> => {\n let open = true\n const onUpdate = o.onUpdate\n const stream = await guarded(\"\", o, () =>\n remote.listen(\n { resourceSubscriptions: [...uris] },\n {\n ...sig(o),\n onNotification: (method, params) => {\n if (open && method === \"notifications/resources/updated\" && typeof params.uri === \"string\") onUpdate?.({ uri: params.uri })\n },\n },\n ),\n )\n const acked = stream.acknowledged.resourceSubscriptions\n const closed = stream.done.then((end): SubscriptionEnd => {\n open = false\n if (end.reason !== \"error\") return end\n const error = normalize(end.error, \"\", undefined)\n return { reason: \"error\", error: error instanceof CallError ? error : new CallError({ code: \"REMOTE_ERROR\", message: errorText(error) }, \"\", { cause: error }) }\n })\n return {\n resources: Array.isArray(acked) ? acked.filter((u): u is string => typeof u === \"string\") : [],\n closed,\n close: () => {\n open = false\n stream.close()\n },\n }\n }\n\n const guarded = async <T>(command: string, o: RequestOptions, fn: () => Promise<T>): Promise<T> => {\n try {\n return await fn()\n } catch (error) {\n throw normalize(error, command, o.signal)\n }\n }\n\n const call = (id: string, input?: unknown, o?: CallOptions): Promise<unknown> =>\n run(id, (input ?? {}) as Record<string, unknown>, o ?? {})\n\n return {\n url: options.url,\n call: call as MextClient<C>[\"call\"],\n safeCall: (async (id: string, input?: unknown, o?: CallOptions) => {\n try {\n return { ok: true, value: await call(id, input, o) }\n } catch (error) {\n if (error instanceof CallError) return { ok: false, error }\n throw error\n }\n }) as MextClient<C>[\"safeCall\"],\n commands: (o = {}) => guarded(\"\", o, () => commands(o)),\n describe: (id, o = {}) => guarded(id, o, () => describe(id, o)),\n help: (t = \"\", o = {}) => guarded(t, o, () => help(t.trim(), o)),\n server: (o = {}) => guarded(\"\", o, () => serverInfo(o)),\n task: taskHandle,\n subscribe: (uris, o = {}) => subscribe(uris, o),\n refresh,\n }\n}\n\n/* 입력 요청 (MRTR · task input_required) */\n\n/**\n * InputRequiredResult → inputResponses. confirmed = confirm 요청에 묻지 않고 승인. 그 외 = onInput.\n * onInput 없음 · 모르는 요청 = CallError INPUT_UNAVAILABLE (호출은 실행되지 않았다)\n */\nfunction inputHandler(command: string, o: CallOptions): NonNullable<CallToolOptions[\"onInputRequired\"]> {\n return async (required: InputRequired): Promise<InputResponses> => {\n const out: InputResponses = {}\n for (const [key, raw] of Object.entries(required.inputRequests ?? {})) {\n const info = describeInput(key, raw, command)\n if (info === undefined) throw inputUnavailable(command, required, `unsupported input request ${raw.method}`)\n const confirmKey = info.kind === \"confirm\" ? confirmField(info.schema ?? {}) : undefined\n if (confirmKey !== undefined && o.confirmed === true) {\n out[key] = { action: \"accept\", content: { [confirmKey]: true } }\n continue\n }\n if (!o.onInput) throw inputUnavailable(command, required, `asked \"${info.message}\"`)\n const answer: InputAnswer = await o.onInput(info)\n if (answer === true) out[key] = confirmKey !== undefined ? { action: \"accept\", content: { [confirmKey]: true } } : { action: \"accept\" }\n else if (answer === false) out[key] = { action: \"decline\" }\n else out[key] = answer\n }\n return out\n }\n}\n\nfunction describeInput(key: string, raw: InputRequestObject, command: string): InputRequestInfo | undefined {\n if (raw.method !== \"elicitation/create\") return undefined\n const params = isRecord(raw.params) ? raw.params : {}\n const message = typeof params.message === \"string\" ? params.message : \"Input required\"\n if (params.mode === \"url\") {\n if (typeof params.url !== \"string\") return undefined\n return { key, kind: \"url\", message, url: params.url, command, raw }\n }\n const schema = isRecord(params.requestedSchema) ? params.requestedSchema : { type: \"object\", properties: {} }\n return { key, kind: confirmField(schema) !== undefined ? \"confirm\" : \"form\", message, schema, command, raw }\n}\n\n/** requestedSchema 의 속성이 boolean 하나면 그 키 (확인 요청. 고객 CLI 와 같은 판정) */\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\nfunction inputUnavailable(command: string, required: InputRequired, why: string): CallError {\n return new CallError(\n {\n code: \"INPUT_UNAVAILABLE\",\n message: `${command || \"The task\"} ${why}, but this call has no handler for it. Pass onInput (or confirmed: true for confirmations).`,\n command,\n requests: required.inputRequests ?? {},\n },\n command,\n )\n}\n\n/* 결과 · 오류 */\n\n/** isError 결과 → CallError. 본문 = structuredContent.error (없으면 text 로 EXECUTION_FAILED) */\nfunction toolError(result: CallToolResult, command: string): CallError {\n const sc = result.structuredContent\n const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined\n if (body && typeof body.code === \"string\") {\n return new CallError({ ...body, code: body.code, message: typeof body.message === \"string\" ? body.message : body.code }, command)\n }\n return new CallError({ code: \"EXECUTION_FAILED\", message: textValue(result) ?? \"Remote command failed.\" }, command)\n}\n\n/** 원격 호출 계층의 오류 → CallError. 취소 = signal.reason. 그 외 (호출 코드 콜백의 예외 등) = 그대로 */\nfunction normalize(error: unknown, command: string, signal: AbortSignal | undefined): unknown {\n if (signal?.aborted) return signal.reason\n if (error instanceof CallError) return error\n if (error instanceof MextError) return new CallError(error.toJSON(), command)\n if (error instanceof RemoteUnauthorizedError) {\n const data = isRecord(error.data) ? error.data : {}\n const reason = data.reason === \"invalid_token\" || error.challenge.error === \"invalid_token\" ? \"invalid_token\" : \"missing_token\"\n return new CallError({ ...data, code: \"UNAUTHENTICATED\", message: error.message, reason }, command, { status: 401, cause: error })\n }\n if (error instanceof RemoteInputRequiredError) {\n return new CallError({ code: \"INPUT_UNAVAILABLE\", message: error.message, command, requests: error.request.inputRequests ?? {} }, command, { cause: error })\n }\n if (error instanceof RemoteRpcError) {\n const rpc = { code: error.code, status: error.status, data: error.data }\n return new CallError({ code: \"REMOTE_ERROR\", message: error.message, rpc }, command, { status: error.status, cause: error })\n }\n if (error instanceof RemoteTaskError) {\n const task = { taskId: error.taskId, status: error.status, ...(error.error ? { error: error.error } : {}) }\n return new CallError({ code: \"REMOTE_ERROR\", message: error.message, task }, command, { cause: error })\n }\n if (error instanceof RemoteTransportError) return new CallError({ code: \"REMOTE_ERROR\", message: error.message }, command, { cause: error })\n return error\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction textValue(result: CallToolResult): string | undefined {\n const texts = (result.content ?? []).flatMap((c) => (isRecord(c) && c.type === \"text\" && typeof c.text === \"string\" ? [c.text] : []))\n return texts.length > 0 ? texts.join(\"\\n\") : undefined\n}\n\nfunction metaHash(result: CallToolResult): string | undefined {\n const value = isRecord(result._meta) ? result._meta[MANIFEST_HASH_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n}\n\nfunction taskStatus(taskId: string, view: Record<string, unknown>): TaskStatus {\n const status: TaskStatus = { taskId, status: typeof view.status === \"string\" ? view.status : \"working\" }\n if (typeof view.statusMessage === \"string\") status.statusMessage = view.statusMessage\n return status\n}\n\n/* 노출 방식 */\n\nfunction isExposure(value: unknown): value is ToolExposure {\n return value === \"execute\" || value === \"split\" || value === \"command\"\n}\n\n/** server/discover 가 없는 서버: 도구 이름으로 추정 */\nfunction exposureOfTools(tools: readonly RemoteTool[]): ToolExposure {\n const names = new Set(tools.map((t) => t.name))\n if (names.has(\"execute\")) return \"execute\"\n if (names.has(\"query\") && names.has(\"mutate\")) return \"split\"\n return \"command\"\n}\n\nfunction dispatcherTool(name: string): RemoteTool {\n return { name, inputSchema: DISPATCHER_INPUT_SCHEMA }\n}\n\n/**\n * command 노출의 help 에 도구 _meta[\"dev.mext/command\"] 의 모르는 필드를 더한다 (manifestFromTools 는 아는 필드만 옮긴다).\n * 서버가 client 보다 새 버전일 때 메타데이터 (예: needsApproval) 가 사라지지 않게\n */\nfunction withToolMeta(value: Help, tools: readonly RemoteTool[]): Help {\n const extra = (id: string): Record<string, unknown> => {\n const meta = tools.find((t) => t.name === id)?._meta\n return isRecord(meta) && isRecord(meta[COMMAND_META_KEY]) ? meta[COMMAND_META_KEY] : {}\n }\n const merge = <T extends { id: string }>(item: T, keys?: readonly string[]): T => {\n const meta = extra(item.id)\n const picked = keys ? Object.fromEntries(Object.entries(meta).filter(([k]) => keys.includes(k))) : meta\n return { ...picked, ...item }\n }\n if (value.kind === \"command\") return merge(value)\n const commands = value.commands.map((c) => merge(c, SUMMARY_EXTRA_KEYS))\n if (value.kind === \"namespace\" && value.command) return { ...value, commands, command: merge(value.command) }\n return { ...value, commands }\n}\n\n/** 요약 (목록) 에 싣는 추가 메타데이터 */\nconst SUMMARY_EXTRA_KEYS: readonly string[] = [\"needsApproval\"]\n\nconst NEVER: AbortSignal = new AbortController().signal\n\nfunction sig(o: RequestOptions): { signal?: AbortSignal } {\n return o.signal ? { signal: o.signal } : {}\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import type * as z from "zod";
2
2
  import type { Command, InputSchema } from "../command.ts";
3
+ import type { ContentBlock, ResultValue } from "../content.ts";
3
4
  import type { ToolExposure } from "../mcp/dispatch.ts";
4
5
  import type { InputRequestObject } from "../remote/client.ts";
6
+ import type { CallError } from "./typed.ts";
5
7
  /**
6
8
  * 타입 client (@obov/mext/client, specs/client.md) 의 타입. 런타임 코드 없음.
7
9
  * 이 파일의 import 는 전부 타입 import: 브라우저 번들에 Zod · 명령어 코드가 들어가지 않는다
@@ -23,11 +25,12 @@ export type CommandMap<C> = {
23
25
  };
24
26
  /**
25
27
  * defineCommand 결과의 타입 → { input, output } (specs/client.md §3).
26
- * input = z.input<input 스키마>. output = output 스키마가 있으면 z.output, 없으면 execute 반환 타입. 둘 다 JSON 으로 전송된 모양
28
+ * input = z.input<input 스키마>. output = output 스키마가 있으면 z.output, 없으면 execute 반환 타입. 둘 다 JSON 으로 전송된 모양.
29
+ * 결과 콘텐츠 (mext.md §4) = withContent 의 값 타입, 콘텐츠만 = null (콘텐츠는 CallOptions.onContent)
27
30
  */
28
31
  export type CommandTypes<T> = T extends Command<infer I extends InputSchema, infer R, infer O extends z.ZodType> ? {
29
32
  input: z.input<I>;
30
- output: Jsonify<z.ZodType extends O ? Awaited<R> : z.output<O>>;
33
+ output: Jsonify<z.ZodType extends O ? ResultValue<Awaited<R>> : z.output<O>>;
31
34
  } : never;
32
35
  export type InputOf<C extends CommandMap<C>, K extends keyof C> = C[K]["input"];
33
36
  export type OutputOf<C extends CommandMap<C>, K extends keyof C> = C[K]["output"];
@@ -122,6 +125,8 @@ export interface CallOptions extends RequestOptions {
122
125
  confirmed?: boolean;
123
126
  /** task 로 실행될 때 (mext.md §12.6): 생성 · 상태 변화마다 */
124
127
  onTask?: (task: TaskStatus) => void;
128
+ /** 결과 콘텐츠 (mext.md §4): 값 외 MCP 블록 (image · audio · resource_link). 있을 때 1회, call 이 값을 돌려주기 전 */
129
+ onContent?: (content: ContentBlock[]) => void;
125
130
  }
126
131
  export interface NamespaceSummary {
127
132
  id: string;
@@ -184,6 +189,30 @@ export interface TaskHandle {
184
189
  /** tasks/cancel */
185
190
  cancel(options?: RequestOptions): Promise<void>;
186
191
  }
192
+ /** notifications/resources/updated 1건 */
193
+ export interface ResourceUpdate {
194
+ uri: string;
195
+ }
196
+ export interface SubscribeOptions extends RequestOptions {
197
+ /** 갱신 알림마다. close · abort 뒤에는 부르지 않는다. 예외는 스트림에 영향 없음 */
198
+ onUpdate?: (update: ResourceUpdate) => void;
199
+ }
200
+ /** 스트림 종료. client = close() · signal abort, server = 서버 완료 · 스트림 종료 (재시작 · 배포), error = ack 뒤 연결 오류 */
201
+ export type SubscriptionEnd = {
202
+ reason: "client";
203
+ } | {
204
+ reason: "server";
205
+ } | {
206
+ reason: "error";
207
+ error: CallError;
208
+ };
209
+ export interface Subscription {
210
+ /** 서버가 받아들인 URI (ack). subscribe 자원이 아니거나 scopes 가 없는 URI 는 빠진다 */
211
+ readonly resources: string[];
212
+ /** 스트림이 끝나면 resolve (reject 하지 않는다). 자동 재연결 없음 */
213
+ readonly closed: Promise<SubscriptionEnd>;
214
+ close(): void;
215
+ }
187
216
  /** 입력이 전부 선택 필드면 입력 인자 생략 가능 */
188
217
  export type CallArgs<I> = {} extends I ? [input?: I, options?: CallOptions] : [input: I, options?: CallOptions];
189
218
  export type SafeResult<T, E> = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as z from \"zod\"\nimport type { Command, InputSchema } from \"../command.ts\"\nimport type { ToolExposure } from \"../mcp/dispatch.ts\"\nimport type { InputRequestObject } from \"../remote/client.ts\"\n\n/**\n * 타입 client (@obov/mext/client, specs/client.md) 의 타입. 런타임 코드 없음.\n * 이 파일의 import 는 전부 타입 import: 브라우저 번들에 Zod · 명령어 코드가 들어가지 않는다\n */\n\nexport type JsonSchema = Record<string, unknown>\n\n/* 명령어 ID → 입력 · 출력 타입 */\n\n/** 명령어 하나의 입력 · 출력 타입 */\nexport interface CommandShape {\n input: unknown\n output: unknown\n}\n\n/** 타입 인자 없는 createClient() 의 명령어 표: ID = string, 입력 = 객체, 반환 = unknown */\nexport type AnyCommands = Record<string, { input: Record<string, unknown>; output: unknown }>\n\n/** 명령어 표 제약. interface (생성 파일의 Commands) 도 통과한다 (index signature 를 요구하지 않는다) */\nexport type CommandMap<C> = { [K in keyof C]: CommandShape }\n\n/**\n * defineCommand 결과의 타입 → { input, output } (specs/client.md §3).\n * input = z.input<input 스키마>. output = output 스키마가 있으면 z.output, 없으면 execute 반환 타입. 둘 다 JSON 으로 전송된 모양\n */\nexport type CommandTypes<T> =\n T extends Command<infer I extends InputSchema, infer R, infer O extends z.ZodType>\n ? { input: z.input<I>; output: Jsonify<z.ZodType extends O ? Awaited<R> : z.output<O>> }\n : never\n\nexport type InputOf<C extends CommandMap<C>, K extends keyof C> = C[K][\"input\"]\nexport type OutputOf<C extends CommandMap<C>, K extends keyof C> = C[K][\"output\"]\n\ntype IsAny<T> = 0 extends 1 & T ? true : false\ntype JsonPrimitive = string | number | boolean | null\n/** JSON.stringify 가 속성을 빼는 값 (함수 · symbol) */\ntype Dropped = ((...args: never[]) => unknown) | symbol\n\n/**\n * JSON 으로 전송된 값의 타입: Date (toJSON) → string · undefined · void 반환 → null · undefined 속성 → 선택 ·\n * 함수 · symbol 속성 제거 · Map · Set → 빈 객체 · bigint → never (직렬화할 수 없다). any · unknown 은 그대로\n */\nexport type Jsonify<T> =\n IsAny<T> extends true\n ? T\n : unknown extends T\n ? unknown\n : T extends JsonPrimitive\n ? T\n : T extends undefined | void\n ? null\n : T extends bigint\n ? never\n : T extends { toJSON(): infer J }\n ? Jsonify<J>\n : T extends Dropped\n ? never\n : T extends ReadonlyMap<unknown, unknown> | ReadonlySet<unknown>\n ? Record<string, never>\n : T extends readonly unknown[]\n ? { -readonly [K in keyof T]: Jsonify<T[K]> }\n : T extends object\n ? JsonifyObject<T>\n : never\n\ntype JsonKey<T, K extends keyof T> = K extends string | number ? (Exclude<T[K], undefined> extends Dropped ? never : K) : never\n\ntype JsonifyObject<T> = Simplify<\n { [K in keyof T as undefined extends T[K] ? never : JsonKey<T, K>]: Jsonify<T[K]> } & {\n [K in keyof T as undefined extends T[K] ? JsonKey<T, K> : never]?: Jsonify<Exclude<T[K], undefined>>\n }\n>\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {}\n\n/* 옵션 */\n\nexport interface ClientOptions {\n /** MCP 엔드포인트 (http(s)://host/mcp). 브라우저 = 상대 경로 (\"/mcp\") 가능 */\n url: string\n /** Authorization: Bearer <값>. 요청마다 호출 (함수). client 는 저장 · 갱신하지 않는다 */\n token?: string | (() => string | undefined | Promise<string | undefined>)\n /** 추가 요청 헤더. 요청마다 호출 */\n headers?: Record<string, string> | (() => Record<string, string> | undefined | Promise<Record<string, string> | undefined>)\n /** 자가 신고 clientInfo (ctx.caller.client). 기본 { name: \"mext-client\", version: mext 버전 상수 } */\n clientInfo?: { name: string; version: string }\n /** 서버 도구 노출 방식. 지정하면 server/discover 왕복을 생략한다 */\n tools?: ToolExposure\n /** 기본 = 전역 fetch */\n fetch?: typeof fetch\n}\n\nexport interface RequestOptions {\n signal?: AbortSignal\n}\n\nexport interface ProgressUpdate {\n progress?: number\n total?: number\n message?: string\n}\n\n/** 서버의 입력 요청 하나 (ctx.ask · requiresConfirmation, MRTR · task input_required) */\nexport interface InputRequestInfo {\n /** 요청 키 (응답을 묶는 값) */\n key: string\n /** confirm = 예 · 아니오, form = schema 에 맞는 값, url = URL 열기 동의 */\n kind: \"confirm\" | \"form\" | \"url\"\n message: string\n /** confirm · form: 요청한 값의 JSON Schema */\n schema?: JsonSchema\n /** url: 사용자가 열 URL */\n url?: string\n /** 호출한 명령어 ID (client.task(...).wait = \"\") */\n command: string\n /** 서버가 보낸 요청 그대로 */\n raw: InputRequestObject\n}\n\n/**\n * 입력 요청의 답. true = 승인 (confirm) · URL 열기 동의 (url) · 빈 값으로 수락 (form). false = 거절.\n * 값을 보낼 때 = { action: \"accept\", content }\n */\nexport type InputAnswer = boolean | { action: \"accept\"; content?: Record<string, unknown> } | { action: \"decline\" | \"cancel\" }\n\nexport interface TaskStatus {\n taskId: string\n /** working · input_required · completed · failed · cancelled */\n status: string\n statusMessage?: string\n}\n\nexport interface CallOptions extends RequestOptions {\n /** ctx.progress (SSE) · task statusMessage. 있으면 progressToken 을 싣는다 */\n onProgress?: (update: ProgressUpdate) => void\n /** 입력 요청 처리. 없으면 입력 요청 = CallError INPUT_UNAVAILABLE */\n onInput?: (request: InputRequestInfo) => InputAnswer | Promise<InputAnswer>\n /**\n * 사람이 이 호출을 확인했다는 호출 코드의 선언 (specs/client.md §2.2 확인). 기본 false.\n * 요청 _meta[\"dev.mext/approval\"] = { confirmed: true } + confirm 입력 요청에 묻지 않고 승인\n */\n confirmed?: boolean\n /** task 로 실행될 때 (mext.md §12.6): 생성 · 상태 변화마다 */\n onTask?: (task: TaskStatus) => void\n}\n\n/* 목록 · 스키마 */\n\nexport interface NamespaceSummary {\n id: string\n /** _index.md 첫 줄 */\n description?: string\n}\n\nexport interface CommandSummary {\n id: string\n description: string\n readOnly: boolean\n destructive: boolean\n requiresConfirmation: boolean\n /** 승인 필요 (mext.md §4 승인). 서버가 주면 그대로 */\n needsApproval?: true | \"conditional\"\n /** split 노출에서 이 명령어를 호출할 도구 (query · mutate) */\n tool?: string\n /** 서버가 준 그 밖의 필드 (client 보다 새 서버) */\n [key: string]: unknown\n}\n\nexport interface CommandInfo extends CommandSummary {\n aliases: string[]\n scopes: string[]\n positional: string[]\n examples: unknown[]\n /** JSON Schema 2020-12 */\n inputSchema: JsonSchema\n outputSchema?: JsonSchema\n task?: { ttlMs: number }\n /** 이 명령어 호출이 돌려줄 수 있는 구조화 오류 code */\n errors: string[]\n}\n\nexport interface CommandList {\n /** commands/_index.md */\n description?: string\n /** 루트 제외, ID 순 */\n namespaces: NamespaceSummary[]\n /** ID 순 */\n commands: CommandSummary[]\n}\n\nexport interface ServerInfo {\n /** 도구 노출 방식 */\n tools: ToolExposure\n /** 이 호출자에게 보이는 명령어 기준 manifestHash (mext.md §5) */\n manifestHash?: string\n /** serverInfo.name · version */\n name?: string\n version?: string\n instructions?: string\n /** tasks 확장 선언 여부 (이 호출자 기준) */\n tasks: boolean\n}\n\n/* client */\n\nexport interface TaskHandle {\n readonly taskId: string\n /** tasks/get 1회 */\n get(options?: RequestOptions): Promise<TaskStatus>\n /** 종료까지 폴링. 반환 · 오류 = call 과 같다 (입력 요청 · 진행률 · 취소 포함) */\n wait(options?: CallOptions): Promise<unknown>\n /** tasks/cancel */\n cancel(options?: RequestOptions): Promise<void>\n}\n\n/** 입력이 전부 선택 필드면 입력 인자 생략 가능 */\nexport type CallArgs<I> = {} extends I ? [input?: I, options?: CallOptions] : [input: I, options?: CallOptions]\n\nexport type SafeResult<T, E> = { ok: true; value: T } | { ok: false; error: E }\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"","sourcesContent":["import type * as z from \"zod\"\nimport type { Command, InputSchema } from \"../command.ts\"\nimport type { ContentBlock, ResultValue } from \"../content.ts\"\nimport type { ToolExposure } from \"../mcp/dispatch.ts\"\nimport type { InputRequestObject } from \"../remote/client.ts\"\nimport type { CallError } from \"./typed.ts\"\n\n/**\n * 타입 client (@obov/mext/client, specs/client.md) 의 타입. 런타임 코드 없음.\n * 이 파일의 import 는 전부 타입 import: 브라우저 번들에 Zod · 명령어 코드가 들어가지 않는다\n */\n\nexport type JsonSchema = Record<string, unknown>\n\n/* 명령어 ID → 입력 · 출력 타입 */\n\n/** 명령어 하나의 입력 · 출력 타입 */\nexport interface CommandShape {\n input: unknown\n output: unknown\n}\n\n/** 타입 인자 없는 createClient() 의 명령어 표: ID = string, 입력 = 객체, 반환 = unknown */\nexport type AnyCommands = Record<string, { input: Record<string, unknown>; output: unknown }>\n\n/** 명령어 표 제약. interface (생성 파일의 Commands) 도 통과한다 (index signature 를 요구하지 않는다) */\nexport type CommandMap<C> = { [K in keyof C]: CommandShape }\n\n/**\n * defineCommand 결과의 타입 → { input, output } (specs/client.md §3).\n * input = z.input<input 스키마>. output = output 스키마가 있으면 z.output, 없으면 execute 반환 타입. 둘 다 JSON 으로 전송된 모양.\n * 결과 콘텐츠 (mext.md §4) = withContent 의 값 타입, 콘텐츠만 = null (콘텐츠는 CallOptions.onContent)\n */\nexport type CommandTypes<T> =\n T extends Command<infer I extends InputSchema, infer R, infer O extends z.ZodType>\n ? { input: z.input<I>; output: Jsonify<z.ZodType extends O ? ResultValue<Awaited<R>> : z.output<O>> }\n : never\n\nexport type InputOf<C extends CommandMap<C>, K extends keyof C> = C[K][\"input\"]\nexport type OutputOf<C extends CommandMap<C>, K extends keyof C> = C[K][\"output\"]\n\ntype IsAny<T> = 0 extends 1 & T ? true : false\ntype JsonPrimitive = string | number | boolean | null\n/** JSON.stringify 가 속성을 빼는 값 (함수 · symbol) */\ntype Dropped = ((...args: never[]) => unknown) | symbol\n\n/**\n * JSON 으로 전송된 값의 타입: Date (toJSON) → string · undefined · void 반환 → null · undefined 속성 → 선택 ·\n * 함수 · symbol 속성 제거 · Map · Set → 빈 객체 · bigint → never (직렬화할 수 없다). any · unknown 은 그대로\n */\nexport type Jsonify<T> =\n IsAny<T> extends true\n ? T\n : unknown extends T\n ? unknown\n : T extends JsonPrimitive\n ? T\n : T extends undefined | void\n ? null\n : T extends bigint\n ? never\n : T extends { toJSON(): infer J }\n ? Jsonify<J>\n : T extends Dropped\n ? never\n : T extends ReadonlyMap<unknown, unknown> | ReadonlySet<unknown>\n ? Record<string, never>\n : T extends readonly unknown[]\n ? { -readonly [K in keyof T]: Jsonify<T[K]> }\n : T extends object\n ? JsonifyObject<T>\n : never\n\ntype JsonKey<T, K extends keyof T> = K extends string | number ? (Exclude<T[K], undefined> extends Dropped ? never : K) : never\n\ntype JsonifyObject<T> = Simplify<\n { [K in keyof T as undefined extends T[K] ? never : JsonKey<T, K>]: Jsonify<T[K]> } & {\n [K in keyof T as undefined extends T[K] ? JsonKey<T, K> : never]?: Jsonify<Exclude<T[K], undefined>>\n }\n>\n\ntype Simplify<T> = { [K in keyof T]: T[K] } & {}\n\n/* 옵션 */\n\nexport interface ClientOptions {\n /** MCP 엔드포인트 (http(s)://host/mcp). 브라우저 = 상대 경로 (\"/mcp\") 가능 */\n url: string\n /** Authorization: Bearer <값>. 요청마다 호출 (함수). client 는 저장 · 갱신하지 않는다 */\n token?: string | (() => string | undefined | Promise<string | undefined>)\n /** 추가 요청 헤더. 요청마다 호출 */\n headers?: Record<string, string> | (() => Record<string, string> | undefined | Promise<Record<string, string> | undefined>)\n /** 자가 신고 clientInfo (ctx.caller.client). 기본 { name: \"mext-client\", version: mext 버전 상수 } */\n clientInfo?: { name: string; version: string }\n /** 서버 도구 노출 방식. 지정하면 server/discover 왕복을 생략한다 */\n tools?: ToolExposure\n /** 기본 = 전역 fetch */\n fetch?: typeof fetch\n}\n\nexport interface RequestOptions {\n signal?: AbortSignal\n}\n\nexport interface ProgressUpdate {\n progress?: number\n total?: number\n message?: string\n}\n\n/** 서버의 입력 요청 하나 (ctx.ask · requiresConfirmation, MRTR · task input_required) */\nexport interface InputRequestInfo {\n /** 요청 키 (응답을 묶는 값) */\n key: string\n /** confirm = 예 · 아니오, form = schema 에 맞는 값, url = URL 열기 동의 */\n kind: \"confirm\" | \"form\" | \"url\"\n message: string\n /** confirm · form: 요청한 값의 JSON Schema */\n schema?: JsonSchema\n /** url: 사용자가 열 URL */\n url?: string\n /** 호출한 명령어 ID (client.task(...).wait = \"\") */\n command: string\n /** 서버가 보낸 요청 그대로 */\n raw: InputRequestObject\n}\n\n/**\n * 입력 요청의 답. true = 승인 (confirm) · URL 열기 동의 (url) · 빈 값으로 수락 (form). false = 거절.\n * 값을 보낼 때 = { action: \"accept\", content }\n */\nexport type InputAnswer = boolean | { action: \"accept\"; content?: Record<string, unknown> } | { action: \"decline\" | \"cancel\" }\n\nexport interface TaskStatus {\n taskId: string\n /** working · input_required · completed · failed · cancelled */\n status: string\n statusMessage?: string\n}\n\nexport interface CallOptions extends RequestOptions {\n /** ctx.progress (SSE) · task statusMessage. 있으면 progressToken 을 싣는다 */\n onProgress?: (update: ProgressUpdate) => void\n /** 입력 요청 처리. 없으면 입력 요청 = CallError INPUT_UNAVAILABLE */\n onInput?: (request: InputRequestInfo) => InputAnswer | Promise<InputAnswer>\n /**\n * 사람이 이 호출을 확인했다는 호출 코드의 선언 (specs/client.md §2.2 확인). 기본 false.\n * 요청 _meta[\"dev.mext/approval\"] = { confirmed: true } + confirm 입력 요청에 묻지 않고 승인\n */\n confirmed?: boolean\n /** task 로 실행될 때 (mext.md §12.6): 생성 · 상태 변화마다 */\n onTask?: (task: TaskStatus) => void\n /** 결과 콘텐츠 (mext.md §4): 값 외 MCP 블록 (image · audio · resource_link). 있을 때 1회, call 이 값을 돌려주기 전 */\n onContent?: (content: ContentBlock[]) => void\n}\n\n/* 목록 · 스키마 */\n\nexport interface NamespaceSummary {\n id: string\n /** _index.md 첫 줄 */\n description?: string\n}\n\nexport interface CommandSummary {\n id: string\n description: string\n readOnly: boolean\n destructive: boolean\n requiresConfirmation: boolean\n /** 승인 필요 (mext.md §4 승인). 서버가 주면 그대로 */\n needsApproval?: true | \"conditional\"\n /** split 노출에서 이 명령어를 호출할 도구 (query · mutate) */\n tool?: string\n /** 서버가 준 그 밖의 필드 (client 보다 새 서버) */\n [key: string]: unknown\n}\n\nexport interface CommandInfo extends CommandSummary {\n aliases: string[]\n scopes: string[]\n positional: string[]\n examples: unknown[]\n /** JSON Schema 2020-12 */\n inputSchema: JsonSchema\n outputSchema?: JsonSchema\n task?: { ttlMs: number }\n /** 이 명령어 호출이 돌려줄 수 있는 구조화 오류 code */\n errors: string[]\n}\n\nexport interface CommandList {\n /** commands/_index.md */\n description?: string\n /** 루트 제외, ID 순 */\n namespaces: NamespaceSummary[]\n /** ID 순 */\n commands: CommandSummary[]\n}\n\nexport interface ServerInfo {\n /** 도구 노출 방식 */\n tools: ToolExposure\n /** 이 호출자에게 보이는 명령어 기준 manifestHash (mext.md §5) */\n manifestHash?: string\n /** serverInfo.name · version */\n name?: string\n version?: string\n instructions?: string\n /** tasks 확장 선언 여부 (이 호출자 기준) */\n tasks: boolean\n}\n\n/* client */\n\nexport interface TaskHandle {\n readonly taskId: string\n /** tasks/get 1회 */\n get(options?: RequestOptions): Promise<TaskStatus>\n /** 종료까지 폴링. 반환 · 오류 = call 과 같다 (입력 요청 · 진행률 · 취소 포함) */\n wait(options?: CallOptions): Promise<unknown>\n /** tasks/cancel */\n cancel(options?: RequestOptions): Promise<void>\n}\n\n/* 자원 갱신 구독 (specs/client.md §2.4) */\n\n/** notifications/resources/updated 1건 */\nexport interface ResourceUpdate {\n uri: string\n}\n\nexport interface SubscribeOptions extends RequestOptions {\n /** 갱신 알림마다. close · abort 뒤에는 부르지 않는다. 예외는 스트림에 영향 없음 */\n onUpdate?: (update: ResourceUpdate) => void\n}\n\n/** 스트림 종료. client = close() · signal abort, server = 서버 완료 · 스트림 종료 (재시작 · 배포), error = ack 뒤 연결 오류 */\nexport type SubscriptionEnd = { reason: \"client\" } | { reason: \"server\" } | { reason: \"error\"; error: CallError }\n\nexport interface Subscription {\n /** 서버가 받아들인 URI (ack). subscribe 자원이 아니거나 scopes 가 없는 URI 는 빠진다 */\n readonly resources: string[]\n /** 스트림이 끝나면 resolve (reject 하지 않는다). 자동 재연결 없음 */\n readonly closed: Promise<SubscriptionEnd>\n close(): void\n}\n\n/** 입력이 전부 선택 필드면 입력 인자 생략 가능 */\nexport type CallArgs<I> = {} extends I ? [input?: I, options?: CallOptions] : [input: I, options?: CallOptions]\n\nexport type SafeResult<T, E> = { ok: true; value: T } | { ok: false; error: E }\n"]}
package/dist/config.d.ts CHANGED
@@ -4,6 +4,7 @@ import type { CliErrorFormatter } from "./cli/output.ts";
4
4
  import type { MextApp } from "./command.ts";
5
5
  import type { McpAuthRequest, OAuthResourceOptions } from "./mcp/http.ts";
6
6
  import { type Principal } from "./principal.ts";
7
+ import { type RouteOptions } from "./route.ts";
7
8
  import { type MextState } from "./state.ts";
8
9
  /** mext.config.ts 의 default export */
9
10
  export interface MextConfig {
@@ -28,10 +29,15 @@ export interface MextConfig {
28
29
  auth?: (req: McpAuthRequest) => Principal | Promise<Principal>;
29
30
  /** MCP 노출 방식. 기본 "execute". command = 명령어별 도구 (§12.2) */
30
31
  tools?: "execute" | "split" | "command";
32
+ /**
33
+ * HTTP 서버. maxBodyBytes = POST /mcp 본문 상한 (기본 4 MiB). routes/ 는 상한 없음 (route 의 export maxBodyBytes = true 가 이 값을 쓴다)
34
+ */
31
35
  server?: {
32
36
  host?: string;
33
37
  port?: number;
34
38
  allowedOrigins?: string[];
39
+ allowedHosts?: string[];
40
+ maxBodyBytes?: number;
35
41
  };
36
42
  /** HTTP 전용. OAuth 보호 자원 메타데이터 (인가 서버 위치). mext login · MCP 클라이언트의 discovery */
37
43
  oauth?: OAuthResourceOptions;
@@ -56,6 +62,11 @@ export interface MextConfig {
56
62
  state?: MextState;
57
63
  /** HTTP 경로 폴더 (§12.4). 설정 파일 위치 (cwd) 기준. 기본 "routes". 폴더 없음 = route 없음 */
58
64
  routesDir?: string;
65
+ /**
66
+ * 모든 route 의 auth · origin · maxBodyBytes 기본값 (§12.4). route 모듈의 export 가 있으면 그 값 (false 포함).
67
+ * 없음 = route 마다 export 로 켠다 (기본 = 인증 · Origin 검사 · 본문 상한 없음)
68
+ */
69
+ routes?: RouteOptions;
59
70
  /**
60
71
  * 감사 (§11.1). sink = 변경 명령어 호출 1건마다 AuditEvent 1건 (모든 어댑터). 없으면 감사 없음.
61
72
  * mext 는 저장소에 의존하지 않는다: 저장 · 조회는 sink 가 한다
@@ -171,6 +182,12 @@ export declare function mcpDeclarations(config: MextConfig, env?: Record<string,
171
182
  audit?: AuditConfig;
172
183
  approval?: ApprovalConfig;
173
184
  };
185
+ /** HTTP 처리기의 server 옵션 (host · port 제외): allowedOrigins · allowedHosts · maxBodyBytes */
186
+ export declare function httpServerOptions(config: MextConfig): {
187
+ allowedOrigins?: string[];
188
+ allowedHosts?: string[];
189
+ maxBodyBytes?: number;
190
+ };
174
191
  /** stdio 옵션 = 선언 + onConnect */
175
192
  export declare function mcpStdioDeclarations(config: MextConfig, env?: Record<string, string | undefined>): ReturnType<typeof mcpDeclarations> & {
176
193
  onConnect?: McpConnectHandler;
package/dist/config.js CHANGED
@@ -12,10 +12,12 @@ import { join, resolve } from "node:path";
12
12
  import { pathToFileURL } from "node:url";
13
13
  import { auditConfigProblem } from "./audit.js";
14
14
  import { isSegment } from "./ids.js";
15
+ import { allowedHostProblem } from "./mcp/host.js";
15
16
  import { assertCallerFields, callerFieldsProblem, localPrincipal } from "./principal.js";
17
+ import { routeOptionsProblem } from "./route.js";
16
18
  import { stateProblem } from "./state.js";
17
19
  export const CONFIG_FILE = "mext.config.ts";
18
- const CONFIG_KEYS = ["commandsDir", "app", "auth", "tools", "server", "oauth", "localPrincipal", "cli", "mcp", "secret", "state", "resourcesDir", "routesDir", "promptsDir", "audit", "approval", "types"];
20
+ const CONFIG_KEYS = ["commandsDir", "app", "auth", "tools", "server", "oauth", "localPrincipal", "cli", "mcp", "secret", "state", "resourcesDir", "routesDir", "routes", "promptsDir", "audit", "approval", "types"];
19
21
  /** secret 최소 길이 (바이트, HMAC-SHA256 키) */
20
22
  export const SECRET_MIN_BYTES = 32;
21
23
  /** secret 환경변수 */
@@ -96,6 +98,15 @@ export function mcpDeclarations(config, env = process.env) {
96
98
  ...(config.approval !== undefined ? { approval: config.approval } : {}),
97
99
  };
98
100
  }
101
+ /** HTTP 처리기의 server 옵션 (host · port 제외): allowedOrigins · allowedHosts · maxBodyBytes */
102
+ export function httpServerOptions(config) {
103
+ const server = config.server;
104
+ return {
105
+ ...(server?.allowedOrigins ? { allowedOrigins: server.allowedOrigins } : {}),
106
+ ...(server?.allowedHosts ? { allowedHosts: server.allowedHosts } : {}),
107
+ ...(server?.maxBodyBytes !== undefined ? { maxBodyBytes: server.maxBodyBytes } : {}),
108
+ };
109
+ }
99
110
  /** stdio 옵션 = 선언 + onConnect */
100
111
  export function mcpStdioDeclarations(config, env = process.env) {
101
112
  return {
@@ -141,6 +152,16 @@ function validateConfig(value) {
141
152
  fail("resourcesDir must be a string");
142
153
  if (c.routesDir !== undefined && typeof c.routesDir !== "string")
143
154
  fail("routesDir must be a string");
155
+ if (c.routes !== undefined) {
156
+ if (typeof c.routes !== "object" || c.routes === null || Array.isArray(c.routes))
157
+ fail("routes must be an object ({ auth, origin, maxBodyBytes })");
158
+ const extra = Object.keys(c.routes).filter((k) => k !== "auth" && k !== "origin" && k !== "maxBodyBytes");
159
+ if (extra.length > 0)
160
+ fail(`routes: unknown key${extra.length === 1 ? "" : "s"}: ${extra.join(", ")} (auth · origin · maxBodyBytes)`);
161
+ const problem = routeOptionsProblem(c.routes);
162
+ if (problem !== undefined)
163
+ fail(problem.replace(/^export /, "routes."));
164
+ }
144
165
  if (c.promptsDir !== undefined && typeof c.promptsDir !== "string")
145
166
  fail("promptsDir must be a string");
146
167
  if (c.types !== undefined && typeof c.types !== "boolean" && (typeof c.types !== "string" || !c.types.endsWith(".ts"))) {
@@ -155,6 +176,17 @@ function validateConfig(value) {
155
176
  }
156
177
  if (c.server !== undefined && (typeof c.server !== "object" || c.server === null))
157
178
  fail("server must be an object");
179
+ const maxBodyBytes = c.server?.maxBodyBytes;
180
+ if (maxBodyBytes !== undefined && !isPositiveInteger(maxBodyBytes))
181
+ fail("server.maxBodyBytes must be a positive integer (bytes)");
182
+ const allowedHosts = c.server?.allowedHosts;
183
+ if (allowedHosts !== undefined) {
184
+ if (!Array.isArray(allowedHosts))
185
+ fail('server.allowedHosts must be an array ("api.example.com", "api.example.com:8443", "loopback", "*")');
186
+ const problem = allowedHosts.map(allowedHostProblem).find((p) => p !== undefined);
187
+ if (problem !== undefined)
188
+ fail(`server.allowedHosts: ${problem} (use a host name, host:port, "loopback" or "*")`);
189
+ }
158
190
  if (c.oauth !== undefined) {
159
191
  const o = c.oauth;
160
192
  if (typeof o !== "object" || o === null || !Array.isArray(o.authorizationServers) || o.authorizationServers.length === 0) {
@@ -222,6 +254,9 @@ function validateMcp(value, fail) {
222
254
  }
223
255
  }
224
256
  }
257
+ function isPositiveInteger(value) {
258
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
259
+ }
225
260
  function isPlainObject(value) {
226
261
  return typeof value === "object" && value !== null && !Array.isArray(value);
227
262
  }