@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 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\"\nimport {\n CLIENT_CAPABILITIES_META_KEY,\n McpServer,\n ProtocolError,\n ProtocolErrorCode,\n type AuthInfo,\n type CallToolResult,\n type InputRequiredResult,\n type McpRequestContext,\n type McpServerFactory,\n type ServerContext,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\"\nimport type { MextApp, ProgressUpdate } from \"../command.ts\"\nimport type { McpCapabilities } from \"../config.ts\"\nimport type { Instrumentation, Transport } from \"../instrumentation.ts\"\nimport { ANONYMOUS, type Principal } from \"../principal.ts\"\nimport type { JsonSchema, Registry } from \"../registry.ts\"\nimport { VERSION } from \"../index.ts\"\nimport { describeCommand, manifestHash } from \"../manifest.ts\"\nimport { resourceEntries } from \"../resource.ts\"\nimport { MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from \"./constants.ts\"\nimport { callDispatcher, dispatcherTools, type DispatcherTool, type ToolExposure } from \"./dispatch.ts\"\nimport { createRequestStateSigner, type InputRound, type RequestStateSigner } from \"./mrtr.ts\"\nimport { installCompletionHandler, installPromptHandlers } from \"./prompts.ts\"\nimport { installResourceHandlers, RESOURCE_READ_CACHE } from \"./resources.ts\"\nimport { installSubscriptions, resourceUpdatedFn } from \"./subscriptions.ts\"\nimport type { MextState } from \"../state.ts\"\nimport { createTaskRuntime, declaresTasks, hasTaskCommands, installTaskHandlers, type TaskRuntime, type TaskTiming } from \"./tasks.ts\"\n\ntype ServerCapabilities = NonNullable<NonNullable<ConstructorParameters<typeof McpServer>[1]>[\"capabilities\"]>\n\n/** tools/list · server/discover 캐시 힌트. 도구 정의는 principal 과 무관하게 고정 → public */\nexport const TOOLS_LIST_CACHE = { ttlMs: 300_000, cacheScope: \"public\" } as const\n\n/** resources/list · templates/list 캐시 힌트. ttlMs = tools/list, 결과가 scopes 로 주체별 필터 → private */\nexport const RESOURCE_LIST_CACHE = { ttlMs: TOOLS_LIST_CACHE.ttlMs, cacheScope: \"private\" } as const\n\n/**\n * progressToken 있는 요청의 주기 progress 간격 (ms). 마지막 알림 후 이 시간 동안 알림이 없으면 보낸다.\n * TS SDK 클라이언트 기본 타임아웃 60초 · 프록시 유휴 타임아웃 (보통 60초) 보다 충분히 짧게\n */\nexport const PROGRESS_INTERVAL_MS = 15_000\n\n\nexport interface McpCoreOptions {\n registry: Registry\n /** ctx.app 생성. 처음 필요할 때 한 번 호출 (실패하면 다음 요청에서 재시도) */\n app?: () => MextApp | Promise<MextApp>\n /** 기본 execute. command = 명령어별 도구 (§12.2) */\n tools?: ToolExposure\n /** serverInfo.name. 기본 \"mext\" */\n name?: string\n /** initialize · server/discover 결과 instructions */\n instructions?: string\n /** 서버 capabilities 에 병합 (experimental). tools capability 는 mext 가 고정 */\n capabilities?: McpCapabilities\n /** serverInfo.version. 기본 mext 버전 */\n version?: string\n /**\n * 요청 주체. 기본 = HTTP transport 가 authInfo 로 넘긴 principal, 없으면 ANONYMOUS.\n * stdio = localPrincipal()\n */\n principal?: Principal | ((ctx: McpRequestContext) => Principal)\n /**\n * MRTR requestState 서명 키 (HMAC-SHA256, 32바이트 이상). requestState 는 2번째 이후 ctx.ask 에서만 쓴다.\n * 기본 = 프로세스별 임의 키. 여러 인스턴스 · 재시작을 넘는 재시도에는 공유 키를 지정한다\n */\n requestStateKey?: string | Uint8Array\n /** 주기 progress 간격 (ms). 기본 PROGRESS_INTERVAL_MS, 0 = 끔 */\n progressInterval?: number\n /** loadInstrumentation 결과 (onCommandError · span) */\n instrumentation?: Instrumentation\n /** onCommandError · span 의 transport. HTTP · stdio 어댑터가 지정 */\n transport?: Transport\n /**\n * _meta[\"dev.mext/manifestHash\"] 값. 기본 = registry 명령어로 계산 (mext dev = 스캔 결과).\n * mext start = manifest.json 의 manifestHash (같은 함수로 계산한 값)\n */\n manifestHash?: string\n /** 주입 state (§12.1). 자원 구독 (resources.subscribe · ctx.resourceUpdated, §12.5). 없음 = stateless */\n state?: MextState\n /** 응답에 영향 없는 오류 보고 (state.bus 구독 실패) */\n onerror?: (error: Error) => void\n /** task 시간 간격 (테스트). 기본 TASK_TIMING */\n taskTiming?: Partial<TaskTiming>\n /**\n * task 실행 유지 수단. process (기본) = 이 프로세스가 응답 후 계속 실행 (node 서버 · stdio),\n * waitUntil = 요청이 waitUntil 을 넘긴 경우만 task (handler.js, §10). 없으면 확장 미선언 · 동기 실행\n */\n taskExecution?: \"process\" | \"waitUntil\"\n}\n\n/** createMcpServerFactory 결과. close = 실행 중 task 취소 · cancelled 기록 (상한 5초, §12.6) */\nexport type MextServerFactory = McpServerFactory & { close(): Promise<void> }\n\n/**\n * Registry → MCP 서버 factory (SDK McpServerFactory). 요청 (HTTP) · 연결 (stdio) 마다 새 McpServer.\n * HTTP 의 createMcpHandler 와 stdio 의 serveStdio 가 같은 factory 를 쓴다.\n */\nexport function createMcpServerFactory(options: McpCoreOptions): MextServerFactory {\n const tools = dispatcherTools(options.registry, options.tools ?? \"execute\")\n const getApp = memoizeApp(options.app)\n const serverInfo = { name: options.name ?? \"mext\", version: options.version ?? VERSION }\n const signer = createRequestStateSigner(options.requestStateKey === undefined ? {} : { key: options.requestStateKey })\n const meta = { [MANIFEST_HASH_META_KEY]: options.manifestHash ?? registryManifestHash(options.registry) }\n const discoverMeta = { ...meta, [TOOLS_META_KEY]: options.tools ?? \"execute\" }\n const experimental = options.capabilities?.experimental\n const resourceUpdated = resourceUpdatedFn(options.state)\n const capabilities = {\n ...(experimental && Object.keys(experimental).length > 0 ? { experimental: { ...experimental } } : {}),\n tools: { listChanged: false },\n } as ServerCapabilities\n const tasks =\n options.state?.store && hasTaskCommands(options.registry)\n ? createTaskRuntime({ state: options.state, meta, ...(options.taskTiming ? { timing: options.taskTiming } : {}) })\n : undefined\n const factory = (requestContext: McpRequestContext): McpServer => {\n const principal = resolvePrincipal(options.principal, requestContext)\n const waitUntil = waitUntilFromAuthInfo(requestContext.authInfo)\n // 생성 가능 = runtime + (process 실행 또는 요청의 waitUntil)\n const taskCreation = tasks && (options.taskExecution !== \"waitUntil\" || waitUntil) ? { runtime: tasks, waitUntil } : undefined\n const server = new McpServer(serverInfo, {\n capabilities,\n ...(options.instructions !== undefined && options.instructions !== \"\" ? { instructions: options.instructions } : {}),\n cacheHints: {\n \"tools/list\": TOOLS_LIST_CACHE,\n \"server/discover\": TOOLS_LIST_CACHE,\n \"resources/list\": RESOURCE_LIST_CACHE,\n \"resources/templates/list\": RESOURCE_LIST_CACHE,\n \"resources/read\": RESOURCE_READ_CACHE,\n \"prompts/list\": TOOLS_LIST_CACHE,\n },\n })\n withDiscoverMeta(server, discoverMeta)\n if (tasks) {\n rethrowStoreErrors(server)\n skipTaskOutputValidation(server)\n }\n const handlerOptions = {\n principal,\n app: getApp,\n ...(options.instrumentation ? { instrumentation: options.instrumentation, traceContext: traceCarrier } : {}),\n ...(options.transport ? { transport: options.transport } : {}),\n }\n if (options.registry.resources) installResourceHandlers(server, { ...handlerOptions, resources: options.registry.resources })\n if (options.registry.prompts) installPromptHandlers(server, { ...handlerOptions, prompts: options.registry.prompts })\n installCompletionHandler(server, {\n ...handlerOptions,\n ...(options.registry.prompts ? { prompts: options.registry.prompts } : {}),\n ...(options.registry.resources ? { resources: options.registry.resources } : {}),\n })\n installSubscriptions(server, {\n state: options.state,\n resources: options.registry.resources,\n era: requestContext.era,\n // HTTP = 진입점이 SDK bus 로 전달 (createMcpFetchHandler), stdio = 연결 인스턴스가 전달\n deliver: options.transport === \"stdio\",\n ...(options.onerror ? { onerror: options.onerror } : {}),\n })\n if (tasks) installTaskHandlers(server, tasks, principal, taskCreation !== undefined)\n for (const tool of tools) {\n server.registerTool(\n tool.name,\n {\n title: tool.annotations.title,\n description: tool.description,\n inputSchema: passthroughSchema(tool.inputSchema),\n // 반환값 검증은 invoke (output safeParse, 실패 = EXECUTION_ERROR). SDK 검증은 통과시킨다\n ...(tool.outputSchema ? { outputSchema: passthroughSchema(tool.outputSchema) } : {}),\n annotations: tool.annotations,\n ...(tool._meta ? { _meta: tool._meta } : {}),\n },\n async (args, ctx) => withMeta(await runTool(options, tools, tool, args, ctx, principal, getApp, signer, resourceUpdated, taskCreation), meta),\n )\n }\n return server\n }\n return Object.assign(factory, { close: async () => tasks?.close() })\n}\n\n/** registry 명령어 메타데이터 · 자원 uri · 프롬프트 이름 · 스키마의 manifestHash (빌드 manifest 와 같은 계산) */\nexport function registryManifestHash(registry: Registry): string {\n const resources = registry.resources ? resourceEntries(registry.resources).map((r) => r.uri) : []\n const prompts = [...(registry.prompts?.values() ?? [])].map((p) => ({ name: p.name, argsSchema: p.argsSchema }))\n return manifestHash([...registry.commands.values()].map(describeCommand), { resources, prompts })\n}\n\n/** runTool 이 store 예외를 알리는 오류 message (프로세스별 임의 값, 핸들러 오류와 겹치지 않는다) */\nconst STORE_ERROR_SENTINEL = `mext.state-store-error.${randomUUID()}`\n\n/**\n * McpServer 는 도구 핸들러 예외를 isError 결과로 바꾼다 (createToolError). store 예외만 JSON-RPC -32603 으로 내보내도록\n * 인스턴스의 createToolError 를 감싼다 (공개 API 에 도구 오류 → 프로토콜 오류 경로 없음)\n */\nfunction rethrowStoreErrors(server: McpServer): void {\n const target = server as unknown as { createToolError?: (message: string) => unknown }\n const original = target.createToolError\n if (typeof original !== \"function\") return\n target.createToolError = function (this: unknown, message: string) {\n if (message === STORE_ERROR_SENTINEL) throw new ProtocolError(ProtocolErrorCode.InternalError, \"State store error\")\n return original.call(server, message)\n }\n}\n\n/**\n * McpServer 는 outputSchema 가 있는 도구 (command 노출) 의 결과에 structuredContent 를 요구한다 (validateToolOutput).\n * CreateTaskResult (resultType \"task\") 는 structuredContent 가 없으므로 검증을 건너뛴다. 완료 result 는 tasks/get 으로\n * 전달되고 mext 가 output 을 이미 검증했다 (invoke). createToolError 와 같은 인스턴스 seam (공개 API 에 옵션 없음)\n */\nfunction skipTaskOutputValidation(server: McpServer): void {\n const target = server as unknown as { validateToolOutput?: (tool: unknown, result: unknown, name: string) => Promise<void> }\n const original = target.validateToolOutput\n if (typeof original !== \"function\") return\n target.validateToolOutput = function (this: unknown, tool: unknown, result: unknown, name: string) {\n if ((result as { resultType?: unknown } | undefined)?.resultType === \"task\") return Promise.resolve()\n return original.call(server, tool, result, name)\n }\n}\n\n/** 결과 _meta 에 mext 키 추가 (SDK 의 serverInfo 등 기존 _meta 유지) */\nfunction withMeta<T extends { _meta?: Record<string, unknown> }>(result: T, meta: Record<string, unknown>): T {\n return { ...result, _meta: { ...result._meta, ...meta } }\n}\n\n/**\n * server/discover 결과에 _meta 추가. SDK 의 discover handler 는 McpServer 생성 후 transport 진입점이\n * (재)설치하고 매번 server._ondiscover() 를 부르므로 인스턴스 메서드를 감싼다 (공개 API 에 discover _meta 옵션 없음)\n */\nfunction withDiscoverMeta(server: McpServer, meta: Record<string, unknown>): void {\n const inner = server.server as unknown as { _ondiscover?: () => Record<string, unknown> }\n const original = inner._ondiscover\n if (typeof original !== \"function\") return\n inner._ondiscover = function (this: unknown) {\n return withMeta(original.call(inner) as { _meta?: Record<string, unknown> }, meta)\n }\n}\n\nasync function runTool(\n options: McpCoreOptions,\n tools: readonly DispatcherTool[],\n tool: DispatcherTool,\n args: unknown,\n ctx: ServerContext,\n principal: Principal,\n getApp: () => Promise<MextApp>,\n signer: RequestStateSigner,\n resourceUpdated: (uri: string) => Promise<void>,\n taskCreation: { runtime: TaskRuntime; waitUntil: ((promise: Promise<unknown>) => void) | undefined } | undefined,\n): Promise<CallToolResult | InputRequiredResult> {\n const progress = progressReporter(ctx, options.progressInterval ?? PROGRESS_INTERVAL_MS)\n try {\n const app = await getApp()\n const round = inputRound(ctx)\n // tasks (§12.6): 확장을 선언한 요청만. 분리 실행 = 별도 signal (R2: 응답 종료 ≠ 취소)\n const task =\n taskCreation && declaresTasks(clientCapabilities(ctx))\n ? taskCreation.runtime.request({\n principal,\n modes: { form: round.elicitation, url: round.urlElicitation === true },\n ...(taskCreation.waitUntil ? { waitUntil: taskCreation.waitUntil } : {}),\n })\n : undefined\n const result = await callDispatcher(options.registry, tool, args, {\n principal,\n signal: ctx.mcpReq.signal,\n ...(progress ? { progress: progress.report } : {}),\n app,\n tools,\n input: { ...round, signer },\n resourceUpdated,\n ...(options.instrumentation ? { instrumentation: options.instrumentation, traceContext: traceCarrier(ctx) } : {}),\n ...(options.transport ? { transport: options.transport } : {}),\n ...(task ? { detach: task.detach } : {}),\n })\n // task 생성 중 store 예외 = 요청 실패 (-32603, §12.1). McpServer 의 도구 오류 변환을 rethrowStoreErrors 가 건너뛴다\n if (task?.failure !== undefined) throw new Error(STORE_ERROR_SENTINEL)\n return result as CallToolResult | InputRequiredResult\n } finally {\n progress?.stop()\n }\n}\n\n/** 요청 _meta 의 clientCapabilities (2025 레거시 = envelope 없음 → undefined) */\nfunction clientCapabilities(ctx: ServerContext): Record<string, unknown> | undefined {\n const envelope = ctx.mcpReq.envelope as Record<string, unknown> | undefined\n return envelope?.[CLIENT_CAPABILITIES_META_KEY] as Record<string, unknown> | undefined\n}\n\n/** 요청의 MRTR 입력: elicitation (form · url) 선언 · inputResponses · requestState (SDK 가 params 에서 분리) */\nfunction inputRound(ctx: ServerContext): InputRound {\n const capabilities = clientCapabilities(ctx) as { elicitation?: unknown } | undefined\n const state = ctx.mcpReq.requestState()\n return {\n elicitation: declaresFormElicitation(capabilities?.elicitation),\n urlElicitation: declaresUrlElicitation(capabilities?.elicitation),\n ...(ctx.mcpReq.inputResponses ? { inputResponses: ctx.mcpReq.inputResponses } : {}),\n ...(typeof state === \"string\" ? { requestState: state } : {}),\n }\n}\n\n/** D6: params._meta 의 W3C trace context (traceparent · tracestate · baggage). 등록된 propagator 가 해석 */\nfunction traceCarrier(ctx: ServerContext): Record<string, string> | undefined {\n const meta = ctx.mcpReq._meta as Record<string, unknown> | undefined\n let carrier: Record<string, string> | undefined\n for (const key of [\"traceparent\", \"tracestate\", \"baggage\"]) {\n const value = meta?.[key]\n if (typeof value === \"string\") (carrier ??= {})[key] = value\n }\n return carrier\n}\n\n/** elicitation.form 선언 또는 mode 없는 elicitation: {} (SDK 와 같은 해석). 2025 레거시 요청 = envelope 없음 → false */\nfunction declaresFormElicitation(value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false\n const modes = value as { form?: unknown; url?: unknown }\n return modes.form !== undefined || modes.url === undefined\n}\n\n/** elicitation.url 선언 (URL 모드는 명시 선언만) */\nfunction declaresUrlElicitation(value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false\n return (value as { url?: unknown }).url !== undefined\n}\n\n/**\n * ctx.progress → notifications/progress. 요청에 progressToken 이 있을 때만 (없으면 undefined = 무시).\n * HTTP 는 progressToken 이 있는 요청을 SSE 로 응답하므로 알림이 스트림으로 간다.\n * 주기 progress: 마지막 알림 후 intervalMs 동안 알림이 없으면 마지막 total · message 를 다시 보낸다 (keepalive).\n * progress 값은 항상 증가 (사양 MUST): 증가하지 않는 값 · keepalive 는 직전 값에 아주 작은 값을 더한다.\n */\nfunction progressReporter(\n ctx: ServerContext,\n intervalMs: number,\n): { report: (update: ProgressUpdate) => void; stop: () => void } | undefined {\n const token = ctx.mcpReq._meta?.progressToken\n if (token === undefined) return undefined\n let last: ProgressUpdate | undefined\n let timer: ReturnType<typeof setTimeout> | undefined\n let stopped = false\n const schedule = () => {\n if (timer !== undefined) clearTimeout(timer)\n if (intervalMs > 0 && !stopped) timer = setTimeout(() => report({ ...(last ?? { progress: 0 }) }), intervalMs)\n }\n const report = (update: ProgressUpdate) => {\n if (stopped || ctx.mcpReq.signal.aborted) return\n const progress = last === undefined || update.progress > last.progress ? update.progress : increase(last.progress)\n last = { progress, ...(update.total !== undefined ? { total: update.total } : {}), ...(update.message !== undefined ? { message: update.message } : {}) }\n const params: Record<string, unknown> = { progressToken: token, ...last }\n void ctx.mcpReq.notify({ method: \"notifications/progress\", params }).catch(() => {})\n schedule()\n }\n schedule()\n return {\n report,\n stop() {\n stopped = true\n if (timer !== undefined) clearTimeout(timer)\n },\n }\n}\n\n/** 직전 값보다 큰 가장 가까운 값 (표시에는 드러나지 않는 크기) */\nfunction increase(value: number): number {\n return value + Math.max(Math.abs(value), 1) * 1e-9\n}\n\n/* principal 은 SDK 의 pass-through authInfo 로 transport → factory 에 전달 */\n\nconst PRINCIPAL_KEY = \"mext.principal\"\nconst WAIT_UNTIL_KEY = \"mext.waitUntil\"\n\n/**\n * HTTP transport: 검증된 principal → SDK authInfo (토큰 원문은 담지 않는다).\n * waitUntil = handler.js 요청의 응답 후 실행 유지 수단 (tasks, §10) 을 같은 경로로 factory 에 전달\n */\nexport function principalAuthInfo(principal: Principal, waitUntil?: (promise: Promise<unknown>) => void): AuthInfo {\n const extra: Record<string, unknown> = { [PRINCIPAL_KEY]: principal }\n if (waitUntil) extra[WAIT_UNTIL_KEY] = waitUntil\n return { token: \"\", clientId: principal.id, scopes: [...principal.scopes], extra }\n}\n\nfunction waitUntilFromAuthInfo(authInfo: AuthInfo | undefined): ((promise: Promise<unknown>) => void) | undefined {\n const value = authInfo?.extra?.[WAIT_UNTIL_KEY]\n return typeof value === \"function\" ? (value as (promise: Promise<unknown>) => void) : undefined\n}\n\nexport function principalFromAuthInfo(authInfo: AuthInfo | undefined): Principal | undefined {\n const value = authInfo?.extra?.[PRINCIPAL_KEY]\n return isPrincipal(value) ? value : undefined\n}\n\nfunction resolvePrincipal(option: McpCoreOptions[\"principal\"], ctx: McpRequestContext): Principal {\n if (typeof option === \"function\") return option(ctx)\n if (option) return option\n return principalFromAuthInfo(ctx.authInfo) ?? ANONYMOUS\n}\n\nfunction isPrincipal(value: unknown): value is Principal {\n const p = value as Partial<Principal> | undefined\n return typeof p?.id === \"string\" && typeof p.kind === \"string\" && Array.isArray(p.scopes)\n}\n\nfunction memoizeApp(factory: McpCoreOptions[\"app\"]): () => Promise<MextApp> {\n if (!factory) return async () => ({}) as MextApp\n let pending: Promise<MextApp> | undefined\n return () => {\n pending ??= Promise.resolve()\n .then(factory)\n .catch((error: unknown) => {\n pending = undefined\n throw error\n })\n return pending\n }\n}\n\n/**\n * 고정 JSON Schema 를 그대로 광고하고 검증은 하지 않는 Standard Schema.\n * dispatcher 인자 검증은 callDispatcher 가 구조화 오류 (INVALID_ARGUMENT) 로 수행한다.\n */\nfunction passthroughSchema(schema: JsonSchema): StandardSchemaWithJSON<Record<string, unknown>> {\n return {\n \"~standard\": {\n version: 1,\n vendor: \"mext\",\n validate: (value: unknown) => ({ value: value as Record<string, unknown> }),\n jsonSchema: { input: () => schema, output: () => schema },\n },\n }\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\"\nimport {\n CLIENT_CAPABILITIES_META_KEY,\n CLIENT_INFO_META_KEY,\n McpServer,\n ProtocolError,\n ProtocolErrorCode,\n type AuthInfo,\n type CallToolResult,\n type InputRequiredResult,\n type McpRequestContext,\n type McpServerFactory,\n type ServerContext,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\"\nimport { isApprovalMark, type ApprovalConfig } from \"../approval.ts\"\nimport type { AuditConfig } from \"../audit.ts\"\nimport { reportedClient, surfaceOf, type ReportedClient } from \"../caller.ts\"\nimport { exposedRegistry, hasExposure } from \"../expose.ts\"\nimport type { MextApp, ProgressUpdate } from \"../command.ts\"\nimport type { McpCapabilities } from \"../config.ts\"\nimport type { Instrumentation, Transport } from \"../instrumentation.ts\"\nimport { ANONYMOUS, type Principal } from \"../principal.ts\"\nimport type { JsonSchema, Registry } from \"../registry.ts\"\nimport { VERSION } from \"../index.ts\"\nimport { describeCommand, manifestHash } from \"../manifest.ts\"\nimport { resourceEntries } from \"../resource.ts\"\nimport { APPROVAL_META_KEY, MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from \"./constants.ts\"\nimport { callDispatcher, dispatcherTools, type DispatcherTool, type ToolExposure } from \"./dispatch.ts\"\nimport { createRequestStateSigner, type InputRound, type RequestStateSigner } from \"./mrtr.ts\"\nimport { installCompletionHandler, installPromptHandlers } from \"./prompts.ts\"\nimport { installResourceHandlers, RESOURCE_READ_CACHE } from \"./resources.ts\"\nimport { installSubscriptions, resourceUpdatedFn } from \"./subscriptions.ts\"\nimport type { MextState } from \"../state.ts\"\nimport { createTaskRuntime, declaresTasks, hasTaskCommands, installTaskHandlers, type TaskRuntime, type TaskTiming } from \"./tasks.ts\"\n\ntype ServerCapabilities = NonNullable<NonNullable<ConstructorParameters<typeof McpServer>[1]>[\"capabilities\"]>\n\n/** tools/list · server/discover 캐시 힌트. 도구 정의는 principal 과 무관하게 고정 → public (expose 가 없을 때) */\nexport const TOOLS_LIST_CACHE = { ttlMs: 300_000, cacheScope: \"public\" } as const\n\n/** expose 를 쓰는 Registry 의 tools/list · server/discover 캐시 힌트. 목록 · manifestHash 가 호출자의 표면별 → private (§4) */\nexport const EXPOSED_TOOLS_LIST_CACHE = { ttlMs: TOOLS_LIST_CACHE.ttlMs, cacheScope: \"private\" } as const\n\n/** resources/list · templates/list 캐시 힌트. ttlMs = tools/list, 결과가 scopes 로 주체별 필터 → private */\nexport const RESOURCE_LIST_CACHE = { ttlMs: TOOLS_LIST_CACHE.ttlMs, cacheScope: \"private\" } as const\n\n/**\n * progressToken 있는 요청의 주기 progress 간격 (ms). 마지막 알림 후 이 시간 동안 알림이 없으면 보낸다.\n * TS SDK 클라이언트 기본 타임아웃 60초 · 프록시 유휴 타임아웃 (보통 60초) 보다 충분히 짧게\n */\nexport const PROGRESS_INTERVAL_MS = 15_000\n\n\nexport interface McpCoreOptions {\n registry: Registry\n /** ctx.app 생성. 처음 필요할 때 한 번 호출 (실패하면 다음 요청에서 재시도) */\n app?: () => MextApp | Promise<MextApp>\n /** 기본 execute. command = 명령어별 도구 (§12.2) */\n tools?: ToolExposure\n /** serverInfo.name. 기본 \"mext\" */\n name?: string\n /** initialize · server/discover 결과 instructions */\n instructions?: string\n /** 서버 capabilities 에 병합 (experimental). tools capability 는 mext 가 고정 */\n capabilities?: McpCapabilities\n /** serverInfo.version. 기본 mext 버전 */\n version?: string\n /**\n * 요청 주체. 기본 = HTTP transport 가 authInfo 로 넘긴 principal, 없으면 ANONYMOUS.\n * stdio = localPrincipal()\n */\n principal?: Principal | ((ctx: McpRequestContext) => Principal)\n /**\n * MRTR requestState 서명 키 (HMAC-SHA256, 32바이트 이상). requestState 는 2번째 이후 ctx.ask 에서만 쓴다.\n * 기본 = 프로세스별 임의 키. 여러 인스턴스 · 재시작을 넘는 재시도에는 공유 키를 지정한다\n */\n requestStateKey?: string | Uint8Array\n /** 주기 progress 간격 (ms). 기본 PROGRESS_INTERVAL_MS, 0 = 끔 */\n progressInterval?: number\n /** loadInstrumentation 결과 (onCommandError · span) */\n instrumentation?: Instrumentation\n /** onCommandError · span 의 transport. HTTP · stdio 어댑터가 지정 */\n transport?: Transport\n /** 감사 (config.audit, §11.1) */\n audit?: AuditConfig\n /** 승인의 표면별 확인 방식 (config.approval, §4 승인) */\n approval?: ApprovalConfig\n /**\n * _meta[\"dev.mext/manifestHash\"] 값. 기본 = registry 명령어로 계산 (mext dev = 스캔 결과).\n * mext start = manifest.json 의 manifestHash (같은 함수로 계산한 값)\n */\n manifestHash?: string\n /** 주입 state (§12.1). 자원 구독 (resources.subscribe · ctx.resourceUpdated, §12.5). 없음 = stateless */\n state?: MextState\n /** 응답에 영향 없는 오류 보고 (state.bus 구독 실패) */\n onerror?: (error: Error) => void\n /** task 시간 간격 (테스트). 기본 TASK_TIMING */\n taskTiming?: Partial<TaskTiming>\n /**\n * task 실행 유지 수단. process (기본) = 이 프로세스가 응답 후 계속 실행 (node 서버 · stdio),\n * waitUntil = 요청이 waitUntil 을 넘긴 경우만 task (handler.js, §10). 없으면 확장 미선언 · 동기 실행\n */\n taskExecution?: \"process\" | \"waitUntil\"\n}\n\n/** createMcpServerFactory 결과. close = 실행 중 task 취소 · cancelled 기록 (상한 5초, §12.6) */\nexport type MextServerFactory = McpServerFactory & { close(): Promise<void> }\n\n/**\n * Registry → MCP 서버 factory (SDK McpServerFactory). 요청 (HTTP) · 연결 (stdio) 마다 새 McpServer.\n * HTTP 의 createMcpHandler 와 stdio 의 serveStdio 가 같은 factory 를 쓴다.\n */\nexport function createMcpServerFactory(options: McpCoreOptions): MextServerFactory {\n const exposure = options.tools ?? \"execute\"\n const transport = options.transport ?? \"local\"\n /**\n * expose (§4): 요청 주체의 표면에서 보이는 Registry 와 그 도구 · manifestHash (보기별 1회 계산).\n * 숨긴 명령어가 없으면 보기 = options.registry (expose 없는 프로젝트 = 항상 같은 목록 · 같은 해시)\n */\n const perView = new WeakMap<Registry, { tools: DispatcherTool[]; meta: Record<string, unknown>; tasks: boolean }>()\n const viewOf = (principal: Principal) => {\n const registry = exposedRegistry(options.registry, surfaceOf(principal, transport))\n let cached = perView.get(registry)\n if (!cached) {\n const hash = registry === options.registry && options.manifestHash !== undefined ? options.manifestHash : registryManifestHash(registry)\n cached = { tools: dispatcherTools(registry, exposure), meta: { [MANIFEST_HASH_META_KEY]: hash }, tasks: hasTaskCommands(registry) }\n perView.set(registry, cached)\n }\n return { registry, ...cached }\n }\n // 목록이 호출자별이면 공유 캐시 금지\n const toolsListCache = hasExposure(options.registry) ? EXPOSED_TOOLS_LIST_CACHE : TOOLS_LIST_CACHE\n const getApp = memoizeApp(options.app)\n const serverInfo = { name: options.name ?? \"mext\", version: options.version ?? VERSION }\n const signer = createRequestStateSigner(options.requestStateKey === undefined ? {} : { key: options.requestStateKey })\n const experimental = options.capabilities?.experimental\n const resourceUpdated = resourceUpdatedFn(options.state)\n const capabilities = {\n ...(experimental && Object.keys(experimental).length > 0 ? { experimental: { ...experimental } } : {}),\n tools: { listChanged: false },\n } as ServerCapabilities\n const tasks =\n options.state?.store && hasTaskCommands(options.registry)\n ? createTaskRuntime({ state: options.state, ...(options.taskTiming ? { timing: options.taskTiming } : {}) })\n : undefined\n const factory = (requestContext: McpRequestContext): McpServer => {\n const principal = resolvePrincipal(options.principal, requestContext)\n const view = viewOf(principal)\n const { tools, meta } = view\n const discoverMeta = { ...meta, [TOOLS_META_KEY]: exposure }\n // 이 주체에게 보이는 task 명령어가 있을 때만 (숨긴 task 명령어는 선언 · 응답 형식에 드러나지 않는다)\n const viewTasks = view.tasks ? tasks : undefined\n const waitUntil = waitUntilFromAuthInfo(requestContext.authInfo)\n // 숨긴 명령어 호출 시도의 감사 전달 (§11.1): 응답은 기다리지 않는다. handler.js = waitUntil 로 실행 유지\n const background = (work: Promise<void>): void => waitUntil?.(work)\n // 생성 가능 = runtime + (process 실행 또는 요청의 waitUntil)\n const taskCreation = viewTasks && (options.taskExecution !== \"waitUntil\" || waitUntil) ? { runtime: viewTasks, waitUntil, meta } : undefined\n const server = new McpServer(serverInfo, {\n capabilities,\n ...(options.instructions !== undefined && options.instructions !== \"\" ? { instructions: options.instructions } : {}),\n cacheHints: {\n \"tools/list\": toolsListCache,\n \"server/discover\": toolsListCache,\n \"resources/list\": RESOURCE_LIST_CACHE,\n \"resources/templates/list\": RESOURCE_LIST_CACHE,\n \"resources/read\": RESOURCE_READ_CACHE,\n \"prompts/list\": TOOLS_LIST_CACHE,\n },\n })\n withDiscoverMeta(server, discoverMeta)\n if (tasks) {\n rethrowStoreErrors(server)\n skipTaskOutputValidation(server)\n }\n const handlerOptions = {\n principal,\n app: getApp,\n ...(options.instrumentation ? { instrumentation: options.instrumentation, traceContext: traceCarrier } : {}),\n ...(options.transport ? { transport: options.transport } : {}),\n }\n if (options.registry.resources) installResourceHandlers(server, { ...handlerOptions, resources: options.registry.resources })\n if (options.registry.prompts) installPromptHandlers(server, { ...handlerOptions, prompts: options.registry.prompts })\n installCompletionHandler(server, {\n ...handlerOptions,\n ...(options.registry.prompts ? { prompts: options.registry.prompts } : {}),\n ...(options.registry.resources ? { resources: options.registry.resources } : {}),\n })\n installSubscriptions(server, {\n state: options.state,\n resources: options.registry.resources,\n era: requestContext.era,\n // HTTP = 진입점이 SDK bus 로 전달 (createMcpFetchHandler), stdio = 연결 인스턴스가 전달\n deliver: options.transport === \"stdio\",\n ...(options.onerror ? { onerror: options.onerror } : {}),\n })\n if (viewTasks) installTaskHandlers(server, viewTasks, principal, taskCreation !== undefined)\n for (const tool of tools) {\n server.registerTool(\n tool.name,\n {\n title: tool.annotations.title,\n description: tool.description,\n inputSchema: passthroughSchema(tool.inputSchema),\n // 반환값 검증은 invoke (output safeParse, 실패 = EXECUTION_ERROR). SDK 검증은 통과시킨다\n ...(tool.outputSchema ? { outputSchema: passthroughSchema(tool.outputSchema) } : {}),\n annotations: tool.annotations,\n ...(tool._meta ? { _meta: tool._meta } : {}),\n },\n async (args, ctx) => {\n // 자가 신고 clientInfo: 2026-07-28 = 요청 _meta, 2025 stdio = initialize (HTTP 2025 = 요청별 인스턴스라 없음)\n const client = reportedClient(requestEnvelope(ctx)?.[CLIENT_INFO_META_KEY]) ?? reportedClient(server.server.getClientVersion())\n return withMeta(await runTool(options, tools, tool, args, ctx, principal, client, getApp, signer, resourceUpdated, taskCreation, background), meta)\n },\n )\n }\n return server\n }\n return Object.assign(factory, { close: async () => tasks?.close() })\n}\n\n/** registry 명령어 메타데이터 · 자원 uri · 프롬프트 이름 · 스키마의 manifestHash (빌드 manifest 와 같은 계산) */\nexport function registryManifestHash(registry: Registry): string {\n const resources = registry.resources ? resourceEntries(registry.resources).map((r) => r.uri) : []\n const prompts = [...(registry.prompts?.values() ?? [])].map((p) => ({ name: p.name, argsSchema: p.argsSchema }))\n return manifestHash([...registry.commands.values()].map(describeCommand), { resources, prompts })\n}\n\n/** runTool 이 store 예외를 알리는 오류 message (프로세스별 임의 값, 핸들러 오류와 겹치지 않는다) */\nconst STORE_ERROR_SENTINEL = `mext.state-store-error.${randomUUID()}`\n\n/**\n * McpServer 는 도구 핸들러 예외를 isError 결과로 바꾼다 (createToolError). store 예외만 JSON-RPC -32603 으로 내보내도록\n * 인스턴스의 createToolError 를 감싼다 (공개 API 에 도구 오류 → 프로토콜 오류 경로 없음)\n */\nfunction rethrowStoreErrors(server: McpServer): void {\n const target = server as unknown as { createToolError?: (message: string) => unknown }\n const original = target.createToolError\n if (typeof original !== \"function\") return\n target.createToolError = function (this: unknown, message: string) {\n if (message === STORE_ERROR_SENTINEL) throw new ProtocolError(ProtocolErrorCode.InternalError, \"State store error\")\n return original.call(server, message)\n }\n}\n\n/**\n * McpServer 는 outputSchema 가 있는 도구 (command 노출) 의 결과에 structuredContent 를 요구한다 (validateToolOutput).\n * CreateTaskResult (resultType \"task\") 는 structuredContent 가 없으므로 검증을 건너뛴다. 완료 result 는 tasks/get 으로\n * 전달되고 mext 가 output 을 이미 검증했다 (invoke). createToolError 와 같은 인스턴스 seam (공개 API 에 옵션 없음)\n */\nfunction skipTaskOutputValidation(server: McpServer): void {\n const target = server as unknown as { validateToolOutput?: (tool: unknown, result: unknown, name: string) => Promise<void> }\n const original = target.validateToolOutput\n if (typeof original !== \"function\") return\n target.validateToolOutput = function (this: unknown, tool: unknown, result: unknown, name: string) {\n if ((result as { resultType?: unknown } | undefined)?.resultType === \"task\") return Promise.resolve()\n return original.call(server, tool, result, name)\n }\n}\n\n/** 결과 _meta 에 mext 키 추가 (SDK 의 serverInfo 등 기존 _meta 유지) */\nfunction withMeta<T extends { _meta?: Record<string, unknown> }>(result: T, meta: Record<string, unknown>): T {\n return { ...result, _meta: { ...result._meta, ...meta } }\n}\n\n/**\n * server/discover 결과에 _meta 추가. SDK 의 discover handler 는 McpServer 생성 후 transport 진입점이\n * (재)설치하고 매번 server._ondiscover() 를 부르므로 인스턴스 메서드를 감싼다 (공개 API 에 discover _meta 옵션 없음)\n */\nfunction withDiscoverMeta(server: McpServer, meta: Record<string, unknown>): void {\n const inner = server.server as unknown as { _ondiscover?: () => Record<string, unknown> }\n const original = inner._ondiscover\n if (typeof original !== \"function\") return\n inner._ondiscover = function (this: unknown) {\n return withMeta(original.call(inner) as { _meta?: Record<string, unknown> }, meta)\n }\n}\n\nasync function runTool(\n options: McpCoreOptions,\n tools: readonly DispatcherTool[],\n tool: DispatcherTool,\n args: unknown,\n ctx: ServerContext,\n principal: Principal,\n client: ReportedClient | undefined,\n getApp: () => Promise<MextApp>,\n signer: RequestStateSigner,\n resourceUpdated: (uri: string) => Promise<void>,\n taskCreation:\n | { runtime: TaskRuntime; waitUntil: ((promise: Promise<unknown>) => void) | undefined; meta: Record<string, unknown> }\n | undefined,\n background: (work: Promise<void>) => void,\n): Promise<CallToolResult | InputRequiredResult> {\n const progress = progressReporter(ctx, options.progressInterval ?? PROGRESS_INTERVAL_MS)\n try {\n const app = await getApp()\n const round = inputRound(ctx)\n // tasks (§12.6): 확장을 선언한 요청만. 분리 실행 = 별도 signal (R2: 응답 종료 ≠ 취소)\n const task =\n taskCreation && declaresTasks(clientCapabilities(ctx))\n ? taskCreation.runtime.request({\n principal,\n modes: { form: round.elicitation, url: round.urlElicitation === true },\n meta: taskCreation.meta,\n ...(taskCreation.waitUntil ? { waitUntil: taskCreation.waitUntil } : {}),\n })\n : undefined\n const carrier = traceCarrier(ctx)\n // registry = 전체. 주체의 표면 판정 (help · 실행 · 숨긴 명령어 기록) 은 callDispatcher · invoke 가 한다 (§4 expose)\n const result = await callDispatcher(options.registry, tool, args, {\n principal,\n background,\n ...(client ? { client } : {}),\n signal: ctx.mcpReq.signal,\n ...(progress ? { progress: progress.report } : {}),\n app,\n tools,\n input: { ...round, signer },\n resourceUpdated,\n ...(options.instrumentation ? { instrumentation: options.instrumentation } : {}),\n // 요청의 trace context = span 의 부모 (instrumentation) · 감사 이벤트의 traceId (§11.1: span 이 없어도 남긴다)\n ...(carrier ? { traceContext: carrier } : {}),\n ...(options.transport ? { transport: options.transport } : {}),\n ...(options.audit ? { audit: options.audit } : {}),\n ...(options.approval ? { approval: options.approval } : {}),\n // 요청 _meta 의 확인 표시 (§4 승인). 인정 여부는 invoke 가 표면의 확인 방식 · 행위자로 판정한다\n confirmed: isApprovalMark((ctx.mcpReq._meta as Record<string, unknown> | undefined)?.[APPROVAL_META_KEY]),\n ...(task ? { detach: task.detach } : {}),\n })\n // task 생성 중 store 예외 = 요청 실패 (-32603, §12.1). McpServer 의 도구 오류 변환을 rethrowStoreErrors 가 건너뛴다\n if (task?.failure !== undefined) throw new Error(STORE_ERROR_SENTINEL)\n return result as CallToolResult | InputRequiredResult\n } finally {\n progress?.stop()\n }\n}\n\n/** 요청 _meta envelope (SDK 가 분리). 2025 레거시 = 없음 */\nfunction requestEnvelope(ctx: ServerContext): Record<string, unknown> | undefined {\n return ctx.mcpReq.envelope as Record<string, unknown> | undefined\n}\n\n/** 요청 _meta 의 clientCapabilities (2025 레거시 = envelope 없음 → undefined) */\nfunction clientCapabilities(ctx: ServerContext): Record<string, unknown> | undefined {\n return requestEnvelope(ctx)?.[CLIENT_CAPABILITIES_META_KEY] as Record<string, unknown> | undefined\n}\n\n/** 요청의 MRTR 입력: elicitation (form · url) 선언 · inputResponses · requestState (SDK 가 params 에서 분리) */\nfunction inputRound(ctx: ServerContext): InputRound {\n const capabilities = clientCapabilities(ctx) as { elicitation?: unknown } | undefined\n const state = ctx.mcpReq.requestState()\n return {\n elicitation: declaresFormElicitation(capabilities?.elicitation),\n urlElicitation: declaresUrlElicitation(capabilities?.elicitation),\n ...(ctx.mcpReq.inputResponses ? { inputResponses: ctx.mcpReq.inputResponses } : {}),\n ...(typeof state === \"string\" ? { requestState: state } : {}),\n }\n}\n\n/** D6: params._meta 의 W3C trace context (traceparent · tracestate · baggage). 등록된 propagator 가 해석 */\nfunction traceCarrier(ctx: ServerContext): Record<string, string> | undefined {\n const meta = ctx.mcpReq._meta as Record<string, unknown> | undefined\n let carrier: Record<string, string> | undefined\n for (const key of [\"traceparent\", \"tracestate\", \"baggage\"]) {\n const value = meta?.[key]\n if (typeof value === \"string\") (carrier ??= {})[key] = value\n }\n return carrier\n}\n\n/** elicitation.form 선언 또는 mode 없는 elicitation: {} (SDK 와 같은 해석). 2025 레거시 요청 = envelope 없음 → false */\nfunction declaresFormElicitation(value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false\n const modes = value as { form?: unknown; url?: unknown }\n return modes.form !== undefined || modes.url === undefined\n}\n\n/** elicitation.url 선언 (URL 모드는 명시 선언만) */\nfunction declaresUrlElicitation(value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false\n return (value as { url?: unknown }).url !== undefined\n}\n\n/**\n * ctx.progress → notifications/progress. 요청에 progressToken 이 있을 때만 (없으면 undefined = 무시).\n * HTTP 는 progressToken 이 있는 요청을 SSE 로 응답하므로 알림이 스트림으로 간다.\n * 주기 progress: 마지막 알림 후 intervalMs 동안 알림이 없으면 마지막 total · message 를 다시 보낸다 (keepalive).\n * progress 값은 항상 증가 (사양 MUST): 증가하지 않는 값 · keepalive 는 직전 값에 아주 작은 값을 더한다.\n */\nfunction progressReporter(\n ctx: ServerContext,\n intervalMs: number,\n): { report: (update: ProgressUpdate) => void; stop: () => void } | undefined {\n const token = ctx.mcpReq._meta?.progressToken\n if (token === undefined) return undefined\n let last: ProgressUpdate | undefined\n let timer: ReturnType<typeof setTimeout> | undefined\n let stopped = false\n const schedule = () => {\n if (timer !== undefined) clearTimeout(timer)\n if (intervalMs > 0 && !stopped) timer = setTimeout(() => report({ ...(last ?? { progress: 0 }) }), intervalMs)\n }\n const report = (update: ProgressUpdate) => {\n if (stopped || ctx.mcpReq.signal.aborted) return\n const progress = last === undefined || update.progress > last.progress ? update.progress : increase(last.progress)\n last = { progress, ...(update.total !== undefined ? { total: update.total } : {}), ...(update.message !== undefined ? { message: update.message } : {}) }\n const params: Record<string, unknown> = { progressToken: token, ...last }\n void ctx.mcpReq.notify({ method: \"notifications/progress\", params }).catch(() => {})\n schedule()\n }\n schedule()\n return {\n report,\n stop() {\n stopped = true\n if (timer !== undefined) clearTimeout(timer)\n },\n }\n}\n\n/** 직전 값보다 큰 가장 가까운 값 (표시에는 드러나지 않는 크기) */\nfunction increase(value: number): number {\n return value + Math.max(Math.abs(value), 1) * 1e-9\n}\n\n/* principal 은 SDK 의 pass-through authInfo 로 transport → factory 에 전달 */\n\nconst PRINCIPAL_KEY = \"mext.principal\"\nconst WAIT_UNTIL_KEY = \"mext.waitUntil\"\n\n/**\n * HTTP transport: 검증된 principal → SDK authInfo (토큰 원문은 담지 않는다).\n * waitUntil = handler.js 요청의 응답 후 실행 유지 수단 (tasks, §10) 을 같은 경로로 factory 에 전달\n */\nexport function principalAuthInfo(principal: Principal, waitUntil?: (promise: Promise<unknown>) => void): AuthInfo {\n const extra: Record<string, unknown> = { [PRINCIPAL_KEY]: principal }\n if (waitUntil) extra[WAIT_UNTIL_KEY] = waitUntil\n return { token: \"\", clientId: principal.id, scopes: [...principal.scopes], extra }\n}\n\nfunction waitUntilFromAuthInfo(authInfo: AuthInfo | undefined): ((promise: Promise<unknown>) => void) | undefined {\n const value = authInfo?.extra?.[WAIT_UNTIL_KEY]\n return typeof value === \"function\" ? (value as (promise: Promise<unknown>) => void) : undefined\n}\n\nexport function principalFromAuthInfo(authInfo: AuthInfo | undefined): Principal | undefined {\n const value = authInfo?.extra?.[PRINCIPAL_KEY]\n return isPrincipal(value) ? value : undefined\n}\n\nfunction resolvePrincipal(option: McpCoreOptions[\"principal\"], ctx: McpRequestContext): Principal {\n if (typeof option === \"function\") return option(ctx)\n if (option) return option\n return principalFromAuthInfo(ctx.authInfo) ?? ANONYMOUS\n}\n\nfunction isPrincipal(value: unknown): value is Principal {\n const p = value as Partial<Principal> | undefined\n return typeof p?.id === \"string\" && typeof p.kind === \"string\" && Array.isArray(p.scopes)\n}\n\nfunction memoizeApp(factory: McpCoreOptions[\"app\"]): () => Promise<MextApp> {\n if (!factory) return async () => ({}) as MextApp\n let pending: Promise<MextApp> | undefined\n return () => {\n pending ??= Promise.resolve()\n .then(factory)\n .catch((error: unknown) => {\n pending = undefined\n throw error\n })\n return pending\n }\n}\n\n/**\n * 고정 JSON Schema 를 그대로 광고하고 검증은 하지 않는 Standard Schema.\n * dispatcher 인자 검증은 callDispatcher 가 구조화 오류 (INVALID_ARGUMENT) 로 수행한다.\n */\nfunction passthroughSchema(schema: JsonSchema): StandardSchemaWithJSON<Record<string, unknown>> {\n return {\n \"~standard\": {\n version: 1,\n vendor: \"mext\",\n validate: (value: unknown) => ({ value: value as Record<string, unknown> }),\n jsonSchema: { input: () => schema, output: () => schema },\n },\n }\n}\n"]}
@@ -52,6 +52,10 @@ export interface McpStdioOptions {
52
52
  state?: MextState;
53
53
  /** McpCoreOptions.taskTiming (테스트) */
54
54
  taskTiming?: McpCoreOptions["taskTiming"];
55
+ /** 감사 (config.audit, §11.1) */
56
+ audit?: McpCoreOptions["audit"];
57
+ /** 승인의 표면별 확인 방식 (config.approval, §4 승인) */
58
+ approval?: McpCoreOptions["approval"];
55
59
  }
56
60
  export interface McpStdioServer {
57
61
  /** stdin EOF · stdout 오류 · close() 로 연결이 끝나면 resolve */
package/dist/mcp/stdio.js CHANGED
@@ -27,6 +27,8 @@ export function serveMcpStdio(options) {
27
27
  ...(options.state ? { state: options.state } : {}),
28
28
  ...(options.onerror ? { onerror: options.onerror } : {}),
29
29
  ...(options.taskTiming ? { taskTiming: options.taskTiming } : {}),
30
+ ...(options.audit ? { audit: options.audit } : {}),
31
+ ...(options.approval ? { approval: options.approval } : {}),
30
32
  transport: "stdio",
31
33
  });
32
34
  const onConnect = options.onConnect;
@@ -209,6 +211,7 @@ function attachConnection(server, era, onConnect, report) {
209
211
  */
210
212
  export function redirectStdout() {
211
213
  const stdout = process.stdout;
214
+ // oxlint-disable-next-line typescript/unbound-method -- 원본 참조 보관 · 복원 (호출은 call(stdout))
212
215
  const original = stdout.write;
213
216
  const toStderr = (...args) => process.stderr.write.apply(process.stderr, args);
214
217
  stdout.write = toStderr;
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":"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","sourcesContent":["import { Console } from \"node:console\"\nimport type { Readable } from \"node:stream\"\nimport { Writable } from \"node:stream\"\nimport type { McpServer, McpServerFactory } from \"@modelcontextprotocol/server\"\nimport { serveStdio, StdioServerTransport } from \"@modelcontextprotocol/server/stdio\"\nimport type { MextApp } from \"../command.ts\"\nimport { isBun } from \"../runtime.ts\"\nimport type { McpCapabilities, McpConnectHandler, McpConnection } from \"../config.ts\"\nimport { localPrincipal, type Principal } from \"../principal.ts\"\nimport type { Registry } from \"../registry.ts\"\nimport type { Instrumentation } from \"../instrumentation.ts\"\nimport type { ToolExposure } from \"./dispatch.ts\"\nimport { createMcpServerFactory, type McpCoreOptions } from \"./server.ts\"\nimport type { MextState } from \"../state.ts\"\nimport { narrowListenRequest } from \"./subscriptions.ts\"\n\nexport interface McpStdioOptions {\n registry: Registry\n app?: () => MextApp | Promise<MextApp>\n tools?: ToolExposure\n /** serverInfo.name. 기본 \"mext\" */\n name?: string\n /** initialize · server/discover 결과 instructions */\n instructions?: string\n /** 서버 capabilities 에 병합 (experimental) */\n capabilities?: McpCapabilities\n /**\n * 연결 하나에 1회 (2025 = notifications/initialized 후, 2026-07-28 = 연결 직후).\n * conn.notify = 요청과 무관한 서버 발신 알림. 반환 함수 = 연결 종료 시 cleanup. 예외 = onerror\n */\n onConnect?: McpConnectHandler\n /**\n * auto = 2026-07-28 · 2025 모두 (SDK serveStdio 가 판별). legacy = 2025 만:\n * server/discover = -32601 → 클라이언트가 initialize 로 재시도 (Claude Code channel 은 2025 연결에서만 전달).\n * 기본 = capabilities.experimental[\"claude/channel\"] 선언 시 legacy, 그 외 auto\n */\n era?: \"auto\" | \"legacy\"\n /** 연결 주체 (로컬 모드). 기본 localPrincipal() */\n principal?: Principal\n /** 기본 process.stdin */\n stdin?: Readable\n /**\n * MCP 메시지 출력. 기본 process.stdout.\n * D4: process.stdout 을 쓰는 경우 redirectStdout() 의 wire 를 넘겨 핸들러 출력이 메시지와 섞이지 않게 한다\n */\n stdout?: Writable\n /** 응답에 영향 없는 오류 보고 (SDK 내부 오류 · 깨진 메시지) */\n onerror?: (error: Error) => void\n /** MRTR requestState 서명 키 (createMcpServerFactory 와 같음) */\n requestStateKey?: McpCoreOptions[\"requestStateKey\"]\n /** 주기 progress 간격 (ms). 0 = 끔 */\n progressInterval?: number\n /** loadInstrumentation 결과 (onCommandError · span, transport = \"stdio\") */\n instrumentation?: Instrumentation\n /** _meta[\"dev.mext/manifestHash\"]. McpCoreOptions.manifestHash (기본 = registry 로 계산) */\n manifestHash?: string\n /** 주입 state (§12.1). 자원 구독 · ctx.resourceUpdated (§12.5) */\n state?: MextState\n /** McpCoreOptions.taskTiming (테스트) */\n taskTiming?: McpCoreOptions[\"taskTiming\"]\n}\n\nexport interface McpStdioServer {\n /** stdin EOF · stdout 오류 · close() 로 연결이 끝나면 resolve */\n closed: Promise<void>\n close(): Promise<void>\n}\n\n/**\n * MCP stdio (2026-07-28 · 2025 레거시 모두 SDK serveStdio). 줄 단위 JSON-RPC, 연결 하나 = McpServer 하나.\n * notifications/cancelled → ctx.signal abort (SDK). stdin EOF = 연결 종료, 진행 중 요청은 abort 되고 응답하지 않는다.\n * 헤더 검증 · Origin · 바인딩 · Authorization 은 해당 없음. 주체 = 로컬 (kind local).\n */\nexport function serveMcpStdio(options: McpStdioOptions): McpStdioServer {\n const principal = options.principal ?? localPrincipal()\n const core = createMcpServerFactory({\n registry: options.registry,\n principal,\n ...(options.app ? { app: options.app } : {}),\n ...(options.tools ? { tools: options.tools } : {}),\n ...(options.name ? { name: options.name } : {}),\n ...(options.instructions !== undefined ? { instructions: options.instructions } : {}),\n ...(options.capabilities ? { capabilities: options.capabilities } : {}),\n ...(options.requestStateKey !== undefined ? { requestStateKey: options.requestStateKey } : {}),\n ...(options.progressInterval !== undefined ? { progressInterval: options.progressInterval } : {}),\n ...(options.instrumentation ? { instrumentation: options.instrumentation } : {}),\n ...(options.manifestHash !== undefined ? { manifestHash: options.manifestHash } : {}),\n ...(options.state ? { state: options.state } : {}),\n ...(options.onerror ? { onerror: options.onerror } : {}),\n ...(options.taskTiming ? { taskTiming: options.taskTiming } : {}),\n transport: \"stdio\",\n })\n const onConnect = options.onConnect\n const report = (error: unknown): void => options.onerror?.(error instanceof Error ? error : new Error(String(error)))\n /** 인스턴스별 정리 완료 (onConnect settle + cleanup). closed 는 이것들을 기다린다 */\n const settled = new Set<Promise<void>>()\n const factory: McpServerFactory = onConnect\n ? async (ctx) => {\n const server = (await core(ctx)) as McpServer\n settled.add(attachConnection(server, ctx.era, onConnect, report))\n return server\n }\n : core\n const transport = new StdioServerTransport(options.stdin, options.stdout)\n let resolveClosed!: () => void\n const closed = new Promise<void>((resolve) => {\n resolveClosed = resolve\n })\n let finishing = false\n const finish = (): void => {\n if (finishing) return\n finishing = true\n // 실행 중 task = 취소 · cancelled 기록 (상한 5초, §12.6)\n void Promise.all([waitCleanups(settled, report), core.close().catch(report)]).then(() => resolveClosed())\n }\n const wrapClose = (): void => {\n const sdkOnClose = transport.onclose\n transport.onclose = () => {\n try {\n sdkOnClose?.()\n } finally {\n finish()\n }\n }\n }\n let handle: { close(): Promise<void> }\n const era = options.era ?? (options.capabilities?.experimental?.[CLAUDE_CHANNEL] !== undefined ? \"legacy\" : \"auto\")\n if (era === \"legacy\") {\n // serveStdio 는 server/discover 를 받으면 2026-07-28 로 고정한다 → 우회.\n // SDK 기본 supportedProtocolVersions = 2025 버전만 → McpServer 생성자가 server/discover 를 등록하지 않는다\n const ready = Promise.resolve(factory({ era: \"legacy\" } as Parameters<McpServerFactory>[0])).then(async (product) => {\n const server = product as McpServer\n server.server.onerror = report\n await server.connect(transport)\n wrapClose()\n return server\n })\n ready.catch((error: unknown) => {\n report(error)\n finish()\n })\n handle = {\n async close() {\n const server = await ready.catch(() => undefined)\n await server?.close()\n },\n }\n } else {\n handle = serveStdio(factory, options.onerror ? { transport, onerror: options.onerror } : { transport })\n // serveStdio 가 onclose · onmessage 를 동기적으로 설정한 뒤 감싼다 (stdin 이벤트는 비동기)\n wrapClose()\n // subscriptions/listen (§12.5): SDK StdioListenRouter 가 ack 하기 전에 notifications 를 허용 부분으로\n const subscriptions = { state: options.state, resources: options.registry.resources }\n const sdkOnMessage = transport.onmessage\n transport.onmessage = (message) => {\n const listen = narrowListenRequest(message, subscriptions, principal)\n sdkOnMessage?.((listen ?? message) as typeof message)\n }\n }\n return {\n closed,\n async close() {\n await handle.close()\n finish()\n await closed\n },\n }\n}\n\n/** Claude Code channel capability. 선언하면 stdio 기본 era = legacy */\nconst CLAUDE_CHANNEL = \"claude/channel\"\n\n/** 연결 종료 후 onConnect cleanup 대기 상한 (ms). 넘으면 오류 보고 후 종료 진행 */\nexport const CLEANUP_TIMEOUT_MS = 5_000\n\nasync function waitCleanups(settled: ReadonlySet<Promise<void>>, report: (error: unknown) => void): Promise<void> {\n if (settled.size === 0) return\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<\"timeout\">((resolve) => {\n timer = setTimeout(() => resolve(\"timeout\"), CLEANUP_TIMEOUT_MS)\n timer.unref?.()\n })\n const result = await Promise.race([Promise.all(settled), timeout])\n clearTimeout(timer)\n if (result === \"timeout\") report(new Error(`mcp.onConnect cleanup did not finish within ${CLEANUP_TIMEOUT_MS}ms`))\n}\n\n/**\n * McpServer 인스턴스 하나 = stdio 연결 하나. onConnect 시점: 2025 = notifications/initialized\n * (initialize 응답 전 알림은 클라이언트가 버릴 수 있음), 2026-07-28 = connect 직후 (handshake 없음).\n * SDK 가 era 판별용 probe 인스턴스를 버리면 그 인스턴스의 onclose 로 cleanup 된다.\n * 반환 = 인스턴스 종료 후 (onConnect settle · cleanup 완료) resolve. 시작 전 종료 = 바로 resolve\n */\nfunction attachConnection(\n server: McpServer,\n era: McpConnection[\"era\"],\n onConnect: McpConnectHandler,\n report: (error: unknown) => void,\n): Promise<void> {\n const inner = server.server\n let connected: Promise<unknown> | undefined\n let resolveDone!: () => void\n const done = new Promise<void>((resolve) => {\n resolveDone = resolve\n })\n let closed = false\n const handlers = new Map<string, (params: Record<string, unknown>) => void | Promise<void>>()\n // SDK 가 등록하지 않은 method 만 fallback 으로 온다 (사양 알림은 SDK handler · era 필터가 먼저)\n inner.fallbackNotificationHandler = async (notification) => {\n const handler = handlers.get(notification.method)\n if (!handler) return\n const params = (notification.params ?? {}) as Record<string, unknown>\n try {\n await handler(params)\n } catch (error) {\n report(error)\n }\n }\n const conn: McpConnection = {\n era,\n notify: (method, params) => inner.notification({ method, ...(params !== undefined ? { params } : {}) } as never),\n onNotification(method, handler) {\n handlers.set(method, handler)\n return () => {\n if (handlers.get(method) === handler) handlers.delete(method)\n }\n },\n }\n const start = (): void => {\n if (connected || closed) return\n connected = Promise.resolve().then(() => onConnect(conn))\n connected.catch(report)\n }\n const previousClose = inner.onclose\n inner.onclose = () => {\n previousClose?.()\n if (closed) return\n closed = true\n if (!connected) return resolveDone()\n connected\n .then(async (cleanup) => {\n if (typeof cleanup === \"function\") await cleanup()\n }, () => {})\n .catch(report)\n .finally(resolveDone)\n }\n if (era === \"legacy\") {\n const previousInit = inner.oninitialized\n inner.oninitialized = () => {\n previousInit?.()\n start()\n }\n } else {\n const connect = server.connect.bind(server)\n server.connect = async (transport) => {\n await connect(transport)\n start()\n }\n }\n return done\n}\n\nexport interface StdoutRedirect {\n /** 원래 process.stdout 으로 쓰는 스트림. MCP transport 전용 */\n wire: Writable\n /** process.stdout.write 원복 */\n restore(): void\n}\n\n/**\n * D4: stdio 모드에서 transport 외의 stdout 쓰기 (console.log · process.stdout.write) 를 stderr 로 돌린다.\n * 반환된 wire 만 실제 stdout 에 쓴다. 명령어 모듈 import 전에 호출해야 top-level 출력도 막는다.\n * 자식 프로세스 · fd 1 직접 쓰기 (fs.writeSync(1)) 는 막지 못한다.\n */\nexport function redirectStdout(): StdoutRedirect {\n const stdout = process.stdout\n const original = stdout.write\n const toStderr = (...args: unknown[]): boolean =>\n (process.stderr.write as (...a: unknown[]) => boolean).apply(process.stderr, args)\n stdout.write = toStderr as typeof stdout.write\n const restoreConsole = !isBun ? () => {} : redirectBunConsole(toStderr)\n // EPIPE 등은 wire 의 write 콜백으로 transport 에 전달된다. process.stdout 의 미처리 error 로 죽지 않게\n const ignore = (): void => {}\n stdout.on(\"error\", ignore)\n const wire = new Writable({\n write(chunk: Buffer | string, _encoding, callback) {\n const write = original as (chunk: Buffer | string, done: (error?: Error | null) => void) => boolean\n write.call(stdout, chunk, (error) => callback(error ?? null))\n },\n })\n let restored = false\n return {\n wire,\n restore() {\n if (restored) return\n restored = true\n if (stdout.write === (toStderr as typeof stdout.write)) stdout.write = original\n restoreConsole()\n stdout.off(\"error\", ignore)\n },\n }\n}\n\n/**\n * Bun 의 console 은 process.stdout.write 를 거치지 않고 fd 1 에 직접 쓴다.\n * console 메서드를 stderr 로 쓰는 Console 의 메서드로 바꾸고 (Bun 전용 console.write 포함), 원복 함수를 반환한다.\n * Node 의 console 은 process.stdout.write 를 거치므로 바꾸지 않는다 (group 들여쓰기 등 기존 출력 유지)\n */\nfunction redirectBunConsole(toStderr: (...args: unknown[]) => boolean): () => void {\n const target = console as unknown as Record<string, unknown>\n const stderrConsole = new Console({ stdout: process.stderr, stderr: process.stderr }) as unknown as Record<string, unknown>\n const saved = new Map<string, unknown>()\n for (const key of Object.keys(target)) {\n const replacement =\n key === \"write\" ? toStderr : typeof stderrConsole[key] === \"function\" ? (stderrConsole[key] as Function).bind(stderrConsole) : undefined\n if (typeof target[key] !== \"function\" || key === \"Console\" || replacement === undefined) continue\n saved.set(key, target[key])\n target[key] = replacement\n }\n return () => {\n for (const [key, value] of saved) target[key] = value\n }\n}\n"]}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":"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","sourcesContent":["import { Console } from \"node:console\"\nimport type { Readable } from \"node:stream\"\nimport { Writable } from \"node:stream\"\nimport type { McpServer, McpServerFactory } from \"@modelcontextprotocol/server\"\nimport { serveStdio, StdioServerTransport } from \"@modelcontextprotocol/server/stdio\"\nimport type { MextApp } from \"../command.ts\"\nimport { isBun } from \"../runtime.ts\"\nimport type { McpCapabilities, McpConnectHandler, McpConnection } from \"../config.ts\"\nimport { localPrincipal, type Principal } from \"../principal.ts\"\nimport type { Registry } from \"../registry.ts\"\nimport type { Instrumentation } from \"../instrumentation.ts\"\nimport type { ToolExposure } from \"./dispatch.ts\"\nimport { createMcpServerFactory, type McpCoreOptions } from \"./server.ts\"\nimport type { MextState } from \"../state.ts\"\nimport { narrowListenRequest } from \"./subscriptions.ts\"\n\nexport interface McpStdioOptions {\n registry: Registry\n app?: () => MextApp | Promise<MextApp>\n tools?: ToolExposure\n /** serverInfo.name. 기본 \"mext\" */\n name?: string\n /** initialize · server/discover 결과 instructions */\n instructions?: string\n /** 서버 capabilities 에 병합 (experimental) */\n capabilities?: McpCapabilities\n /**\n * 연결 하나에 1회 (2025 = notifications/initialized 후, 2026-07-28 = 연결 직후).\n * conn.notify = 요청과 무관한 서버 발신 알림. 반환 함수 = 연결 종료 시 cleanup. 예외 = onerror\n */\n onConnect?: McpConnectHandler\n /**\n * auto = 2026-07-28 · 2025 모두 (SDK serveStdio 가 판별). legacy = 2025 만:\n * server/discover = -32601 → 클라이언트가 initialize 로 재시도 (Claude Code channel 은 2025 연결에서만 전달).\n * 기본 = capabilities.experimental[\"claude/channel\"] 선언 시 legacy, 그 외 auto\n */\n era?: \"auto\" | \"legacy\"\n /** 연결 주체 (로컬 모드). 기본 localPrincipal() */\n principal?: Principal\n /** 기본 process.stdin */\n stdin?: Readable\n /**\n * MCP 메시지 출력. 기본 process.stdout.\n * D4: process.stdout 을 쓰는 경우 redirectStdout() 의 wire 를 넘겨 핸들러 출력이 메시지와 섞이지 않게 한다\n */\n stdout?: Writable\n /** 응답에 영향 없는 오류 보고 (SDK 내부 오류 · 깨진 메시지) */\n onerror?: (error: Error) => void\n /** MRTR requestState 서명 키 (createMcpServerFactory 와 같음) */\n requestStateKey?: McpCoreOptions[\"requestStateKey\"]\n /** 주기 progress 간격 (ms). 0 = 끔 */\n progressInterval?: number\n /** loadInstrumentation 결과 (onCommandError · span, transport = \"stdio\") */\n instrumentation?: Instrumentation\n /** _meta[\"dev.mext/manifestHash\"]. McpCoreOptions.manifestHash (기본 = registry 로 계산) */\n manifestHash?: string\n /** 주입 state (§12.1). 자원 구독 · ctx.resourceUpdated (§12.5) */\n state?: MextState\n /** McpCoreOptions.taskTiming (테스트) */\n taskTiming?: McpCoreOptions[\"taskTiming\"]\n /** 감사 (config.audit, §11.1) */\n audit?: McpCoreOptions[\"audit\"]\n /** 승인의 표면별 확인 방식 (config.approval, §4 승인) */\n approval?: McpCoreOptions[\"approval\"]\n}\n\nexport interface McpStdioServer {\n /** stdin EOF · stdout 오류 · close() 로 연결이 끝나면 resolve */\n closed: Promise<void>\n close(): Promise<void>\n}\n\n/**\n * MCP stdio (2026-07-28 · 2025 레거시 모두 SDK serveStdio). 줄 단위 JSON-RPC, 연결 하나 = McpServer 하나.\n * notifications/cancelled → ctx.signal abort (SDK). stdin EOF = 연결 종료, 진행 중 요청은 abort 되고 응답하지 않는다.\n * 헤더 검증 · Origin · 바인딩 · Authorization 은 해당 없음. 주체 = 로컬 (kind local).\n */\nexport function serveMcpStdio(options: McpStdioOptions): McpStdioServer {\n const principal = options.principal ?? localPrincipal()\n const core = createMcpServerFactory({\n registry: options.registry,\n principal,\n ...(options.app ? { app: options.app } : {}),\n ...(options.tools ? { tools: options.tools } : {}),\n ...(options.name ? { name: options.name } : {}),\n ...(options.instructions !== undefined ? { instructions: options.instructions } : {}),\n ...(options.capabilities ? { capabilities: options.capabilities } : {}),\n ...(options.requestStateKey !== undefined ? { requestStateKey: options.requestStateKey } : {}),\n ...(options.progressInterval !== undefined ? { progressInterval: options.progressInterval } : {}),\n ...(options.instrumentation ? { instrumentation: options.instrumentation } : {}),\n ...(options.manifestHash !== undefined ? { manifestHash: options.manifestHash } : {}),\n ...(options.state ? { state: options.state } : {}),\n ...(options.onerror ? { onerror: options.onerror } : {}),\n ...(options.taskTiming ? { taskTiming: options.taskTiming } : {}),\n ...(options.audit ? { audit: options.audit } : {}),\n ...(options.approval ? { approval: options.approval } : {}),\n transport: \"stdio\",\n })\n const onConnect = options.onConnect\n const report = (error: unknown): void => options.onerror?.(error instanceof Error ? error : new Error(String(error)))\n /** 인스턴스별 정리 완료 (onConnect settle + cleanup). closed 는 이것들을 기다린다 */\n const settled = new Set<Promise<void>>()\n const factory: McpServerFactory = onConnect\n ? async (ctx) => {\n const server = (await core(ctx)) as McpServer\n settled.add(attachConnection(server, ctx.era, onConnect, report))\n return server\n }\n : core\n const transport = new StdioServerTransport(options.stdin, options.stdout)\n let resolveClosed!: () => void\n const closed = new Promise<void>((resolve) => {\n resolveClosed = resolve\n })\n let finishing = false\n const finish = (): void => {\n if (finishing) return\n finishing = true\n // 실행 중 task = 취소 · cancelled 기록 (상한 5초, §12.6)\n void Promise.all([waitCleanups(settled, report), core.close().catch(report)]).then(() => resolveClosed())\n }\n const wrapClose = (): void => {\n const sdkOnClose = transport.onclose\n transport.onclose = () => {\n try {\n sdkOnClose?.()\n } finally {\n finish()\n }\n }\n }\n let handle: { close(): Promise<void> }\n const era = options.era ?? (options.capabilities?.experimental?.[CLAUDE_CHANNEL] !== undefined ? \"legacy\" : \"auto\")\n if (era === \"legacy\") {\n // serveStdio 는 server/discover 를 받으면 2026-07-28 로 고정한다 → 우회.\n // SDK 기본 supportedProtocolVersions = 2025 버전만 → McpServer 생성자가 server/discover 를 등록하지 않는다\n const ready = Promise.resolve(factory({ era: \"legacy\" } as Parameters<McpServerFactory>[0])).then(async (product) => {\n const server = product as McpServer\n server.server.onerror = report\n await server.connect(transport)\n wrapClose()\n return server\n })\n ready.catch((error: unknown) => {\n report(error)\n finish()\n })\n handle = {\n async close() {\n const server = await ready.catch(() => undefined)\n await server?.close()\n },\n }\n } else {\n handle = serveStdio(factory, options.onerror ? { transport, onerror: options.onerror } : { transport })\n // serveStdio 가 onclose · onmessage 를 동기적으로 설정한 뒤 감싼다 (stdin 이벤트는 비동기)\n wrapClose()\n // subscriptions/listen (§12.5): SDK StdioListenRouter 가 ack 하기 전에 notifications 를 허용 부분으로\n const subscriptions = { state: options.state, resources: options.registry.resources }\n const sdkOnMessage = transport.onmessage\n transport.onmessage = (message) => {\n const listen = narrowListenRequest(message, subscriptions, principal)\n sdkOnMessage?.((listen ?? message) as typeof message)\n }\n }\n return {\n closed,\n async close() {\n await handle.close()\n finish()\n await closed\n },\n }\n}\n\n/** Claude Code channel capability. 선언하면 stdio 기본 era = legacy */\nconst CLAUDE_CHANNEL = \"claude/channel\"\n\n/** 연결 종료 후 onConnect cleanup 대기 상한 (ms). 넘으면 오류 보고 후 종료 진행 */\nexport const CLEANUP_TIMEOUT_MS = 5_000\n\nasync function waitCleanups(settled: ReadonlySet<Promise<void>>, report: (error: unknown) => void): Promise<void> {\n if (settled.size === 0) return\n let timer: ReturnType<typeof setTimeout> | undefined\n const timeout = new Promise<\"timeout\">((resolve) => {\n timer = setTimeout(() => resolve(\"timeout\"), CLEANUP_TIMEOUT_MS)\n timer.unref?.()\n })\n const result = await Promise.race([Promise.all(settled), timeout])\n clearTimeout(timer)\n if (result === \"timeout\") report(new Error(`mcp.onConnect cleanup did not finish within ${CLEANUP_TIMEOUT_MS}ms`))\n}\n\n/**\n * McpServer 인스턴스 하나 = stdio 연결 하나. onConnect 시점: 2025 = notifications/initialized\n * (initialize 응답 전 알림은 클라이언트가 버릴 수 있음), 2026-07-28 = connect 직후 (handshake 없음).\n * SDK 가 era 판별용 probe 인스턴스를 버리면 그 인스턴스의 onclose 로 cleanup 된다.\n * 반환 = 인스턴스 종료 후 (onConnect settle · cleanup 완료) resolve. 시작 전 종료 = 바로 resolve\n */\nfunction attachConnection(\n server: McpServer,\n era: McpConnection[\"era\"],\n onConnect: McpConnectHandler,\n report: (error: unknown) => void,\n): Promise<void> {\n const inner = server.server\n let connected: Promise<unknown> | undefined\n let resolveDone!: () => void\n const done = new Promise<void>((resolve) => {\n resolveDone = resolve\n })\n let closed = false\n const handlers = new Map<string, (params: Record<string, unknown>) => void | Promise<void>>()\n // SDK 가 등록하지 않은 method 만 fallback 으로 온다 (사양 알림은 SDK handler · era 필터가 먼저)\n inner.fallbackNotificationHandler = async (notification) => {\n const handler = handlers.get(notification.method)\n if (!handler) return\n const params = (notification.params ?? {}) as Record<string, unknown>\n try {\n await handler(params)\n } catch (error) {\n report(error)\n }\n }\n const conn: McpConnection = {\n era,\n notify: (method, params) => inner.notification({ method, ...(params !== undefined ? { params } : {}) } as never),\n onNotification(method, handler) {\n handlers.set(method, handler)\n return () => {\n if (handlers.get(method) === handler) handlers.delete(method)\n }\n },\n }\n const start = (): void => {\n if (connected || closed) return\n connected = Promise.resolve().then(() => onConnect(conn))\n connected.catch(report)\n }\n const previousClose = inner.onclose\n inner.onclose = () => {\n previousClose?.()\n if (closed) return\n closed = true\n if (!connected) return resolveDone()\n connected\n .then(async (cleanup) => {\n if (typeof cleanup === \"function\") await cleanup()\n }, () => {})\n .catch(report)\n .finally(resolveDone)\n }\n if (era === \"legacy\") {\n const previousInit = inner.oninitialized\n inner.oninitialized = () => {\n previousInit?.()\n start()\n }\n } else {\n const connect = server.connect.bind(server)\n server.connect = async (transport) => {\n await connect(transport)\n start()\n }\n }\n return done\n}\n\nexport interface StdoutRedirect {\n /** 원래 process.stdout 으로 쓰는 스트림. MCP transport 전용 */\n wire: Writable\n /** process.stdout.write 원복 */\n restore(): void\n}\n\n/**\n * D4: stdio 모드에서 transport 외의 stdout 쓰기 (console.log · process.stdout.write) 를 stderr 로 돌린다.\n * 반환된 wire 만 실제 stdout 에 쓴다. 명령어 모듈 import 전에 호출해야 top-level 출력도 막는다.\n * 자식 프로세스 · fd 1 직접 쓰기 (fs.writeSync(1)) 는 막지 못한다.\n */\nexport function redirectStdout(): StdoutRedirect {\n const stdout = process.stdout\n // oxlint-disable-next-line typescript/unbound-method -- 원본 참조 보관 · 복원 (호출은 call(stdout))\n const original = stdout.write\n const toStderr = (...args: unknown[]): boolean =>\n (process.stderr.write as (...a: unknown[]) => boolean).apply(process.stderr, args)\n stdout.write = toStderr as typeof stdout.write\n const restoreConsole = !isBun ? () => {} : redirectBunConsole(toStderr)\n // EPIPE 등은 wire 의 write 콜백으로 transport 에 전달된다. process.stdout 의 미처리 error 로 죽지 않게\n const ignore = (): void => {}\n stdout.on(\"error\", ignore)\n const wire = new Writable({\n write(chunk: Buffer | string, _encoding, callback) {\n const write = original as (chunk: Buffer | string, done: (error?: Error | null) => void) => boolean\n write.call(stdout, chunk, (error) => callback(error ?? null))\n },\n })\n let restored = false\n return {\n wire,\n restore() {\n if (restored) return\n restored = true\n if (stdout.write === (toStderr as typeof stdout.write)) stdout.write = original\n restoreConsole()\n stdout.off(\"error\", ignore)\n },\n }\n}\n\n/**\n * Bun 의 console 은 process.stdout.write 를 거치지 않고 fd 1 에 직접 쓴다.\n * console 메서드를 stderr 로 쓰는 Console 의 메서드로 바꾸고 (Bun 전용 console.write 포함), 원복 함수를 반환한다.\n * Node 의 console 은 process.stdout.write 를 거치므로 바꾸지 않는다 (group 들여쓰기 등 기존 출력 유지)\n */\nfunction redirectBunConsole(toStderr: (...args: unknown[]) => boolean): () => void {\n const target = console as unknown as Record<string, unknown>\n const stderrConsole = new Console({ stdout: process.stderr, stderr: process.stderr }) as unknown as Record<string, unknown>\n const saved = new Map<string, unknown>()\n for (const key of Object.keys(target)) {\n const replacement =\n key === \"write\" ? toStderr : typeof stderrConsole[key] === \"function\" ? (stderrConsole[key] as Function).bind(stderrConsole) : undefined\n if (typeof target[key] !== \"function\" || key === \"Console\" || replacement === undefined) continue\n saved.set(key, target[key])\n target[key] = replacement\n }\n return () => {\n for (const [key, value] of saved) target[key] = value\n }\n}\n"]}
@@ -93,10 +93,12 @@ export interface TaskRequestOptions {
93
93
  modes: ElicitationModes;
94
94
  /** handler.js: 응답 후 실행 유지 (플랫폼 waitUntil) */
95
95
  waitUntil?: (promise: Promise<unknown>) => void;
96
+ /** 완료 결과 _meta. 기본 = TaskRuntimeOptions.meta (호출자별 manifestHash 를 쓸 때 지정, §4 expose) */
97
+ meta?: Record<string, unknown>;
96
98
  }
97
99
  export interface TaskRequest {
98
100
  /** invoke 의 detach. task 명령어가 아니면 undefined (동기) */
99
- detach(entry: RegisteredCommand): Promise<DetachedExecution | undefined>;
101
+ detach: (entry: RegisteredCommand) => Promise<DetachedExecution | undefined>;
100
102
  /** 생성 중 store · bus 예외 (있으면 요청 = -32603) */
101
103
  readonly failure: unknown;
102
104
  }
package/dist/mcp/tasks.js CHANGED
@@ -96,8 +96,10 @@ export function createTaskRuntime(options) {
96
96
  /** 답 · 취소 도착 알림: 같은 프로세스 = 직접, 그 외 = bus (없으면 실행 프로세스가 폴링) */
97
97
  const notify = async (taskId, type) => {
98
98
  const local = running.get(taskId);
99
- if (local)
100
- return void (await local.wake());
99
+ if (local) {
100
+ await local.wake();
101
+ return;
102
+ }
101
103
  if (bus)
102
104
  await storeCall(() => bus.publish(taskChannel(taskId), JSON.stringify({ type })));
103
105
  };
@@ -285,6 +287,7 @@ export function createTaskRuntime(options) {
285
287
  };
286
288
  return {
287
289
  handle,
290
+ taskId,
288
291
  signal: controller.signal,
289
292
  ask,
290
293
  progress,
@@ -297,8 +300,8 @@ export function createTaskRuntime(options) {
297
300
  }
298
301
  else {
299
302
  record.status = "completed";
300
- const result = "error" in outcome ? errorResult(outcome.error) : valueResult(outcome.value);
301
- record.result = { ...result, resultType: "complete", _meta: { ...meta } };
303
+ const result = "error" in outcome ? errorResult(outcome.error) : valueResult(outcome.value, outcome.content);
304
+ record.result = { ...result, resultType: "complete", _meta: { ...(request.meta ?? meta) } };
302
305
  }
303
306
  await finish();
304
307
  },
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/mcp/tasks.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { ProtocolError, ProtocolErrorCode, type McpServer } from \"@modelcontextprotocol/server\"\nimport * as z from \"zod\"\nimport type { ProgressUpdate } from \"../command.ts\"\nimport type { AskHandler, DetachedExecution } from \"../invoke.ts\"\nimport type { Principal } from \"../principal.ts\"\nimport type { RegisteredCommand, Registry } from \"../registry.ts\"\nimport { STATE_KEY_PREFIX, type MextState } from \"../state.ts\"\nimport { errorResult, valueResult, type ToolCallResult } from \"./dispatch.ts\"\nimport {\n ASK_KEY_PREFIX,\n askAnswer,\n elicitation,\n elicitResult,\n modeUnavailable,\n type ElicitationModes,\n type ElicitationRequest,\n type ElicitResultValue,\n} from \"./mrtr.ts\"\n\n/**\n * MCP tasks 확장 (io.modelcontextprotocol/tasks, §12.6). 서버 측: task 생성 (invoke detach) · tasks/get · update · cancel.\n *\n * D5: SDK 2.4.0 은 tasks 런타임이 없다 (task 메서드 = 2025-11-25 어휘, typed API 미제공). 단 3-arg setRequestHandler\n * (custom params schema) 로 tasks/get · update · cancel 을 등록할 수 있고 (era gate 통과), Mcp-Name = params.taskId 헤더 검증은\n * SDK 가 한다. tools/call 결과 resultType \"task\" 는 SDK 가 그대로 통과시킨다. 그래서 mext 가 이 파일에서 직접 구현한다.\n *\n * D2: store 키 (값 = JSON, 접두 \"mext:\", 키마다 writer 하나)\n * mext:task:<taskId> TaskRecord. writer = 실행 프로세스 (생성 · 상태 · heartbeat · 결과)\n * mext:task:<taskId>:input:<ask-N> 답 (ElicitResult). writer = tasks/update 를 받은 프로세스. 이미 있으면 무시\n * mext:task:<taskId>:cancel 취소 기록 ({}). writer = tasks/cancel 을 받은 프로세스\n * bus 채널 mext:task:<taskId> = 답 · 취소 도착 알림 ({\"type\":\"input\"|\"cancel\"}). 내용은 store 가 원본, 메시지는 깨우기만.\n * bus 없음 = 실행 프로세스가 storePollMs (1초) 마다 store 폴링. 같은 프로세스의 task = 직접 깨움.\n * store ttl: 실행 중 = ttlMs + lostAfterMs (heartbeat 마다 연장, 유실 후 failed 를 ttlMs 동안 조회), 종료 = ttlMs.\n *\n * R4: ctx.ask 의미 차이. MRTR (동기) = 라운드마다 핸들러 재실행 (ask 이전 코드 반복), task = 재실행 없이 대기\n * (ask 이전 코드 1회). 키 (ask-0 · ask-1 …) · elicitation 형식 · 답 해석 (askAnswer) · 미선언 mode = INPUT_UNAVAILABLE 은 같다.\n * 두 경로 모두에서 맞게 동작하려면 MRTR 규칙 (부작용은 ask 뒤) 을 따른다.\n */\n\nexport const TASKS_EXTENSION = \"io.modelcontextprotocol/tasks\"\n\nexport interface TaskTiming {\n /** CreateTaskResult · tasks/get 의 pollIntervalMs (클라이언트 폴링 권장 간격) */\n pollIntervalMs: number\n /** 실행 프로세스의 heartbeat (레코드 갱신) 간격 */\n heartbeatMs: number\n /** heartbeat 이 이보다 오래 없으면 tasks/get = failed (TASK_LOST) */\n lostAfterMs: number\n /** bus 없음: 실행 프로세스의 답 · 취소 store 폴링 간격 */\n storePollMs: number\n /** close (SIGTERM · SIGINT) 시 실행 중 task 정리 상한 */\n shutdownMs: number\n}\n\nexport const TASK_TIMING: Readonly<TaskTiming> = Object.freeze({\n pollIntervalMs: 2_000,\n heartbeatMs: 10_000,\n lostAfterMs: 30_000,\n storePollMs: 1_000,\n shutdownMs: 5_000,\n})\n\n/** tasks/get failed 의 error.data.code (실행 프로세스 유실) */\nexport const TASK_LOST = \"TASK_LOST\"\n\nexport type TaskStatus = \"working\" | \"input_required\" | \"completed\" | \"failed\" | \"cancelled\"\n\n/** tools/call 의 task 응답 (resultType \"task\") */\nexport interface CreateTaskResult {\n resultType: \"task\"\n taskId: string\n status: TaskStatus\n statusMessage?: string\n createdAt: string\n lastUpdatedAt: string\n ttlMs: number\n pollIntervalMs: number\n _meta?: Record<string, unknown>\n}\n\n/** tasks/get 결과 (resultType 은 SDK 가 \"complete\" 로 채운다) */\nexport interface TaskView {\n taskId: string\n status: TaskStatus\n statusMessage?: string\n createdAt: string\n lastUpdatedAt: string\n ttlMs: number\n pollIntervalMs: number\n /** input_required */\n inputRequests?: Record<string, ElicitationRequest>\n /** completed = 같은 요청의 동기 tools/call 결과 */\n result?: TaskResult\n /** failed (TASK_LOST) */\n error?: TaskError\n}\n\ntype TaskResult = ToolCallResult & { resultType: \"complete\"; _meta?: Record<string, unknown> }\n\ninterface TaskError {\n code: number\n message: string\n data?: Record<string, unknown>\n}\n\n/** D2: mext:task:<taskId> 의 값 */\ninterface TaskRecord {\n v: 1\n taskId: string\n /** 바인딩 \"<kind>:<id>\". 다른 주체 = 없는 task */\n principal: string\n command: string\n status: TaskStatus\n statusMessage?: string\n createdAt: string\n lastUpdatedAt: string\n ttlMs: number\n /** epoch ms. heartbeatMs 마다 갱신 */\n heartbeatAt: number\n inputRequests?: Record<string, ElicitationRequest>\n result?: TaskResult\n}\n\nexport interface TaskRuntimeOptions {\n state: MextState\n timing?: Partial<TaskTiming>\n /** 완료 결과 _meta (동기 결과와 같은 manifestHash) */\n meta?: Record<string, unknown>\n /** store · bus 예외 보고. 기본 stderr 1줄 */\n onerror?: (error: unknown) => void\n}\n\n/** 요청 하나의 task 조건 */\nexport interface TaskRequestOptions {\n principal: Principal\n /** 생성 요청이 선언한 elicitation mode (ctx.ask 가능 여부, MRTR 과 같은 규칙) */\n modes: ElicitationModes\n /** handler.js: 응답 후 실행 유지 (플랫폼 waitUntil) */\n waitUntil?: (promise: Promise<unknown>) => void\n}\n\nexport interface TaskRequest {\n /** invoke 의 detach. task 명령어가 아니면 undefined (동기) */\n detach(entry: RegisteredCommand): Promise<DetachedExecution | undefined>\n /** 생성 중 store · bus 예외 (있으면 요청 = -32603) */\n readonly failure: unknown\n}\n\nexport interface TaskRuntime {\n readonly timing: TaskTiming\n request(options: TaskRequestOptions): TaskRequest\n get(taskId: string, principal: Principal): Promise<TaskView>\n update(taskId: string, principal: Principal, inputResponses: Record<string, unknown>): Promise<void>\n cancel(taskId: string, principal: Principal): Promise<void>\n /** 실행 중 task 취소 → cancelled 기록 (상한 shutdownMs). 이후 새 task 없음 (동기 실행) */\n close(): Promise<void>\n}\n\n/** registry 에 task 명령어가 있는지 (선언 조건) */\nexport function hasTaskCommands(registry: Registry): boolean {\n for (const entry of registry.commands.values()) if (entry.command.task) return true\n return false\n}\n\n/** 요청 _meta 의 clientCapabilities 에 tasks 확장 선언 */\nexport function declaresTasks(clientCapabilities: unknown): boolean {\n const extensions = (clientCapabilities as { extensions?: unknown } | undefined)?.extensions\n return isPlainObject(extensions) && extensions[TASKS_EXTENSION] !== undefined\n}\n\n/**\n * HTTP: task 가 될 수 있는 tools/call 인지 (응답 = application/json, §12.6). 확장 선언 + 대상 명령어가 task 명령어.\n * 대상 = dispatcher 의 arguments.command (별칭 포함), 그 외 = 도구 이름 (command 노출)\n */\nexport function requestsTask(registry: Registry, body: unknown): boolean {\n if (!isPlainObject(body) || body.method !== \"tools/call\" || !isPlainObject(body.params)) return false\n const params = body.params\n const meta = isPlainObject(params._meta) ? params._meta : undefined\n if (!declaresTasks(meta?.[\"io.modelcontextprotocol/clientCapabilities\"])) return false\n const args = isPlainObject(params.arguments) ? params.arguments : undefined\n const target = typeof args?.command === \"string\" ? args.command : params.name\n if (typeof target !== \"string\") return false\n const id = registry.commands.has(target) ? target : registry.aliases.get(target)\n return id !== undefined && registry.commands.get(id)?.command.task !== undefined\n}\n\nconst recordKey = (taskId: string): string => `${STATE_KEY_PREFIX}task:${taskId}`\nconst inputKey = (taskId: string, key: string): string => `${recordKey(taskId)}:input:${key}`\nconst cancelKey = (taskId: string): string => `${recordKey(taskId)}:cancel`\nconst taskChannel = (taskId: string): string => `${STATE_KEY_PREFIX}task:${taskId}`\n\nconst TERMINAL: ReadonlySet<TaskStatus> = new Set([\"completed\", \"failed\", \"cancelled\"])\n\n/** 같은 프로세스에서 실행 중인 task */\ninterface RunningTask {\n /** 답 · 취소를 store 에서 다시 읽는다 */\n wake(): Promise<void>\n abort(reason: unknown): void\n /** 종료 기록 완료 */\n done: Promise<void>\n /** 아직 끝나지 않았으면 cancelled 기록 (종료 상한) */\n forceCancel(): Promise<void>\n}\n\nexport function createTaskRuntime(options: TaskRuntimeOptions): TaskRuntime {\n const { store, bus } = options.state\n const timing: TaskTiming = { ...TASK_TIMING, ...options.timing }\n const meta = options.meta ?? {}\n const report = options.onerror ?? defaultOnError\n const running = new Map<string, RunningTask>()\n let closed = false\n\n /** store · bus 호출. 예외 = 보고 + -32603 */\n const storeCall = async <T>(fn: () => Promise<T>): Promise<T> => {\n try {\n return await fn()\n } catch (error) {\n safeReport(report, error)\n throw new ProtocolError(ProtocolErrorCode.InternalError, \"State store error\")\n }\n }\n\n const readRecord = async (taskId: string, principal: Principal): Promise<TaskRecord> => {\n const raw = await storeCall(() => store.get(recordKey(taskId)))\n const record = raw === undefined ? undefined : parseRecord(raw)\n if (!record || record.taskId !== taskId || record.principal !== bindingOf(principal)) throw unknownTask(taskId)\n return record\n }\n\n const lost = (record: TaskRecord): boolean =>\n !TERMINAL.has(record.status) && Date.now() - record.heartbeatAt > timing.lostAfterMs\n\n /** 답 · 취소 도착 알림: 같은 프로세스 = 직접, 그 외 = bus (없으면 실행 프로세스가 폴링) */\n const notify = async (taskId: string, type: \"input\" | \"cancel\"): Promise<void> => {\n const local = running.get(taskId)\n if (local) return void (await local.wake())\n if (bus) await storeCall(() => bus.publish(taskChannel(taskId), JSON.stringify({ type })))\n }\n\n const start = async (entry: RegisteredCommand, request: TaskRequestOptions): Promise<DetachedExecution> => {\n const taskId = randomBytes(16).toString(\"base64url\")\n const created = new Date().toISOString()\n const record: TaskRecord = {\n v: 1,\n taskId,\n principal: bindingOf(request.principal),\n command: entry.id,\n status: \"working\",\n createdAt: created,\n lastUpdatedAt: created,\n ttlMs: entry.command.task!.ttlMs,\n heartbeatAt: Date.now(),\n }\n const controller = new AbortController()\n const waiters = new Map<string, (answer: ElicitResultValue) => void>()\n let finalized = false\n let resolveDone!: () => void\n const done = new Promise<void>((resolve) => (resolveDone = resolve))\n const touch = (): void => void (record.lastUpdatedAt = new Date().toISOString())\n\n // 순서 보장 · 합치기: 쓰는 중 변경 = 끝난 뒤 최신 상태로 한 번 더\n let writing: Promise<void> | undefined\n let dirty = false\n const persist = (): Promise<void> => {\n dirty = true\n writing ??= (async () => {\n try {\n while (dirty) {\n dirty = false\n const ttlMs = TERMINAL.has(record.status) ? record.ttlMs : record.ttlMs + timing.lostAfterMs\n await store.set(recordKey(taskId), JSON.stringify(record), { ttlMs })\n }\n } finally {\n writing = undefined\n }\n })()\n return writing\n }\n const persistLater = (): void => void persist().catch((error: unknown) => safeReport(report, error))\n\n const wake = async (): Promise<void> => {\n try {\n if (!controller.signal.aborted && (await store.get(cancelKey(taskId))) !== undefined) {\n controller.abort(new DOMException(\"Task cancelled\", \"AbortError\"))\n }\n for (const [key, resolve] of [...waiters]) {\n const raw = await store.get(inputKey(taskId, key))\n const answer = raw === undefined ? undefined : elicitResult(parseJson(raw))\n if (answer) resolve(answer)\n }\n } catch (error) {\n safeReport(report, error)\n }\n }\n\n let heartbeat: ReturnType<typeof setInterval> | undefined\n let poll: ReturnType<typeof setInterval> | undefined\n let unsubscribe: (() => Promise<void>) | undefined\n const stopTimers = (): void => {\n if (heartbeat !== undefined) clearInterval(heartbeat)\n if (poll !== undefined) clearInterval(poll)\n }\n\n const finish = async (): Promise<void> => {\n if (finalized) return\n finalized = true\n stopTimers()\n delete record.inputRequests\n touch()\n waiters.clear()\n try {\n await persist()\n } catch (error) {\n safeReport(report, error)\n }\n running.delete(taskId)\n try {\n await unsubscribe?.()\n } catch (error) {\n safeReport(report, error)\n }\n resolveDone()\n }\n\n let index = 0\n const ask: AskHandler = async (askRequest) => {\n const key = `${ASK_KEY_PREFIX}${index++}`\n if (!(askRequest.kind === \"url\" ? request.modes.url : request.modes.form)) throw modeUnavailable(askRequest)\n controller.signal.throwIfAborted()\n let onAbort!: () => void\n const answered = new Promise<ElicitResultValue>((resolve, reject) => {\n onAbort = () => {\n waiters.delete(key)\n reject(controller.signal.reason)\n }\n controller.signal.addEventListener(\"abort\", onAbort, { once: true })\n waiters.set(key, (answer) => {\n waiters.delete(key)\n controller.signal.removeEventListener(\"abort\", onAbort)\n resolve(answer)\n })\n })\n answered.catch(() => {})\n record.inputRequests = { ...record.inputRequests, [key]: elicitation(askRequest) }\n record.status = \"input_required\"\n touch()\n try {\n await persist()\n } catch (error) {\n waiters.delete(key)\n controller.signal.removeEventListener(\"abort\", onAbort)\n throw error\n }\n const response = await answered\n if (record.inputRequests) {\n delete record.inputRequests[key]\n if (Object.keys(record.inputRequests).length === 0) delete record.inputRequests\n }\n if (!record.inputRequests && !finalized) record.status = \"working\"\n touch()\n if (!finalized) persistLater()\n return askAnswer(askRequest, response)\n }\n\n const progress = (update: ProgressUpdate): void => {\n if (finalized) return\n record.statusMessage =\n update.message ?? (update.total !== undefined ? `${update.progress}/${update.total}` : String(update.progress))\n touch()\n persistLater()\n }\n\n const task: RunningTask = {\n wake,\n abort: (reason) => controller.abort(reason),\n done,\n async forceCancel() {\n if (finalized) return\n record.status = \"cancelled\"\n await finish()\n },\n }\n running.set(taskId, task)\n try {\n if (bus) unsubscribe = await bus.subscribe(taskChannel(taskId), () => void wake())\n // store 기록 후 응답 (tasks/get 이 바로 성공해야 한다)\n await persist()\n } catch (error) {\n running.delete(taskId)\n await unsubscribe?.().catch(() => {})\n throw error\n }\n heartbeat = setInterval(() => {\n record.heartbeatAt = Date.now()\n persistLater()\n }, timing.heartbeatMs)\n heartbeat.unref?.()\n if (!bus) {\n poll = setInterval(() => void wake(), timing.storePollMs)\n poll.unref?.()\n }\n request.waitUntil?.(done)\n\n const handle: CreateTaskResult = {\n resultType: \"task\",\n taskId,\n status: \"working\",\n createdAt: record.createdAt,\n lastUpdatedAt: record.lastUpdatedAt,\n ttlMs: record.ttlMs,\n pollIntervalMs: timing.pollIntervalMs,\n }\n return {\n handle,\n signal: controller.signal,\n ask,\n progress,\n async settle(outcome) {\n if (finalized) return\n if (\"error\" in outcome && controller.signal.aborted) {\n // 취소 후 예외 = cancelled. 핸들러가 끝까지 가면 (값 반환) 그 결과\n record.status = \"cancelled\"\n } else {\n record.status = \"completed\"\n const result = \"error\" in outcome ? errorResult(outcome.error) : valueResult(outcome.value)\n record.result = { ...result, resultType: \"complete\", _meta: { ...meta } }\n }\n await finish()\n },\n }\n }\n\n return {\n timing,\n request(requestOptions) {\n const out: { failure: unknown; detach: TaskRequest[\"detach\"] } = {\n failure: undefined,\n async detach(entry) {\n if (!entry.command.task || closed) return undefined\n try {\n return await start(entry, requestOptions)\n } catch (error) {\n safeReport(report, error)\n out.failure = error\n throw error\n }\n },\n }\n return out\n },\n\n async get(taskId, principal) {\n const record = await readRecord(taskId, principal)\n const view: TaskView = {\n taskId: record.taskId,\n status: record.status,\n ...(record.statusMessage !== undefined ? { statusMessage: record.statusMessage } : {}),\n createdAt: record.createdAt,\n lastUpdatedAt: record.lastUpdatedAt,\n ttlMs: record.ttlMs,\n pollIntervalMs: timing.pollIntervalMs,\n }\n if (lost(record)) {\n view.status = \"failed\"\n view.error = {\n code: ProtocolErrorCode.InternalError,\n message: `Task lost: the executing process stopped (no heartbeat for ${timing.lostAfterMs}ms).`,\n data: { code: TASK_LOST },\n }\n } else if (record.status === \"input_required\" && record.inputRequests) view.inputRequests = record.inputRequests\n else if (record.status === \"completed\" && record.result) view.result = record.result\n return view\n },\n\n async update(taskId, principal, inputResponses) {\n const record = await readRecord(taskId, principal)\n if (TERMINAL.has(record.status) || lost(record)) return\n let wrote = false\n for (const [key, value] of Object.entries(inputResponses)) {\n // 모르는 키 · 형식이 아닌 답 · 이미 답한 키 = 무시\n if (record.inputRequests?.[key] === undefined || !elicitResult(value)) continue\n const stored = await storeCall(() => store.get(inputKey(taskId, key)))\n if (stored !== undefined) continue\n await storeCall(() => store.set(inputKey(taskId, key), JSON.stringify(value), { ttlMs: record.ttlMs + timing.lostAfterMs }))\n wrote = true\n }\n if (wrote) await notify(taskId, \"input\")\n },\n\n async cancel(taskId, principal) {\n const record = await readRecord(taskId, principal)\n if (TERMINAL.has(record.status) || lost(record)) return\n await storeCall(() => store.set(cancelKey(taskId), \"{}\", { ttlMs: record.ttlMs + timing.lostAfterMs }))\n await notify(taskId, \"cancel\")\n },\n\n async close() {\n closed = true\n const tasks = [...running.values()]\n if (tasks.length === 0) return\n for (const task of tasks) task.abort(new DOMException(\"Server shutting down\", \"AbortError\"))\n let timer: ReturnType<typeof setTimeout> | undefined\n await Promise.race([\n Promise.all(tasks.map((task) => task.done)),\n new Promise<void>((resolve) => (timer = setTimeout(resolve, timing.shutdownMs))),\n ])\n clearTimeout(timer)\n await Promise.all(tasks.map((task) => task.forceCancel()))\n },\n }\n}\n\n/**\n * McpServer 에 tasks/get · tasks/update · tasks/cancel 등록 (D5: 3-arg setRequestHandler, custom params schema).\n * declare = server/discover capabilities.extensions 에 확장 선언 (생성 가능할 때만). transport 연결 전에 호출\n */\nexport function installTaskHandlers(server: McpServer, runtime: TaskRuntime, principal: Principal, declare: boolean): void {\n const inner = server.server\n if (declare) inner.registerCapabilities({ extensions: { [TASKS_EXTENSION]: {} } })\n const byId = z.object({ taskId: z.string() })\n inner.setRequestHandler(\"tasks/get\", { params: byId }, async ({ taskId }) => ({ ...(await runtime.get(taskId, principal)) }))\n // inputResponses 는 SDK 가 params 에서 분리 (MRTR 예약 키) → ctx.mcpReq.inputResponses (bare 결과만)\n inner.setRequestHandler(\"tasks/update\", { params: byId }, async ({ taskId }, ctx) => {\n await runtime.update(taskId, principal, ctx.mcpReq.inputResponses ?? {})\n return {}\n })\n inner.setRequestHandler(\"tasks/cancel\", { params: byId }, async ({ taskId }) => {\n await runtime.cancel(taskId, principal)\n return {}\n })\n}\n\nfunction unknownTask(taskId: string): ProtocolError {\n return new ProtocolError(ProtocolErrorCode.InvalidParams, `Unknown task: ${taskId}`)\n}\n\nfunction bindingOf(principal: Principal): string {\n return `${principal.kind}:${principal.id}`\n}\n\nfunction parseRecord(raw: string): TaskRecord | undefined {\n const value = parseJson(raw)\n if (!isPlainObject(value) || value.v !== 1 || typeof value.taskId !== \"string\" || typeof value.status !== \"string\") return undefined\n return value as unknown as TaskRecord\n}\n\nfunction parseJson(raw: string): unknown {\n try {\n return JSON.parse(raw)\n } catch {\n return undefined\n }\n}\n\nfunction safeReport(report: (error: unknown) => void, error: unknown): void {\n try {\n report(error)\n } catch {\n // 보고는 동작을 바꾸지 않는다\n }\n}\n\nfunction defaultOnError(error: unknown): void {\n process.stderr.write(`mext: state store error: ${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"]}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/mcp/tasks.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { ProtocolError, ProtocolErrorCode, type McpServer } from \"@modelcontextprotocol/server\"\nimport * as z from \"zod\"\nimport type { ProgressUpdate } from \"../command.ts\"\nimport type { AskHandler, DetachedExecution } from \"../invoke.ts\"\nimport type { Principal } from \"../principal.ts\"\nimport type { RegisteredCommand, Registry } from \"../registry.ts\"\nimport { STATE_KEY_PREFIX, type MextState } from \"../state.ts\"\nimport { errorResult, valueResult, type ToolCallResult } from \"./dispatch.ts\"\nimport {\n ASK_KEY_PREFIX,\n askAnswer,\n elicitation,\n elicitResult,\n modeUnavailable,\n type ElicitationModes,\n type ElicitationRequest,\n type ElicitResultValue,\n} from \"./mrtr.ts\"\n\n/**\n * MCP tasks 확장 (io.modelcontextprotocol/tasks, §12.6). 서버 측: task 생성 (invoke detach) · tasks/get · update · cancel.\n *\n * D5: SDK 2.4.0 은 tasks 런타임이 없다 (task 메서드 = 2025-11-25 어휘, typed API 미제공). 단 3-arg setRequestHandler\n * (custom params schema) 로 tasks/get · update · cancel 을 등록할 수 있고 (era gate 통과), Mcp-Name = params.taskId 헤더 검증은\n * SDK 가 한다. tools/call 결과 resultType \"task\" 는 SDK 가 그대로 통과시킨다. 그래서 mext 가 이 파일에서 직접 구현한다.\n *\n * D2: store 키 (값 = JSON, 접두 \"mext:\", 키마다 writer 하나)\n * mext:task:<taskId> TaskRecord. writer = 실행 프로세스 (생성 · 상태 · heartbeat · 결과)\n * mext:task:<taskId>:input:<ask-N> 답 (ElicitResult). writer = tasks/update 를 받은 프로세스. 이미 있으면 무시\n * mext:task:<taskId>:cancel 취소 기록 ({}). writer = tasks/cancel 을 받은 프로세스\n * bus 채널 mext:task:<taskId> = 답 · 취소 도착 알림 ({\"type\":\"input\"|\"cancel\"}). 내용은 store 가 원본, 메시지는 깨우기만.\n * bus 없음 = 실행 프로세스가 storePollMs (1초) 마다 store 폴링. 같은 프로세스의 task = 직접 깨움.\n * store ttl: 실행 중 = ttlMs + lostAfterMs (heartbeat 마다 연장, 유실 후 failed 를 ttlMs 동안 조회), 종료 = ttlMs.\n *\n * R4: ctx.ask 의미 차이. MRTR (동기) = 라운드마다 핸들러 재실행 (ask 이전 코드 반복), task = 재실행 없이 대기\n * (ask 이전 코드 1회). 키 (ask-0 · ask-1 …) · elicitation 형식 · 답 해석 (askAnswer) · 미선언 mode = INPUT_UNAVAILABLE 은 같다.\n * 두 경로 모두에서 맞게 동작하려면 MRTR 규칙 (부작용은 ask 뒤) 을 따른다.\n */\n\nexport const TASKS_EXTENSION = \"io.modelcontextprotocol/tasks\"\n\nexport interface TaskTiming {\n /** CreateTaskResult · tasks/get 의 pollIntervalMs (클라이언트 폴링 권장 간격) */\n pollIntervalMs: number\n /** 실행 프로세스의 heartbeat (레코드 갱신) 간격 */\n heartbeatMs: number\n /** heartbeat 이 이보다 오래 없으면 tasks/get = failed (TASK_LOST) */\n lostAfterMs: number\n /** bus 없음: 실행 프로세스의 답 · 취소 store 폴링 간격 */\n storePollMs: number\n /** close (SIGTERM · SIGINT) 시 실행 중 task 정리 상한 */\n shutdownMs: number\n}\n\nexport const TASK_TIMING: Readonly<TaskTiming> = Object.freeze({\n pollIntervalMs: 2_000,\n heartbeatMs: 10_000,\n lostAfterMs: 30_000,\n storePollMs: 1_000,\n shutdownMs: 5_000,\n})\n\n/** tasks/get failed 의 error.data.code (실행 프로세스 유실) */\nexport const TASK_LOST = \"TASK_LOST\"\n\nexport type TaskStatus = \"working\" | \"input_required\" | \"completed\" | \"failed\" | \"cancelled\"\n\n/** tools/call 의 task 응답 (resultType \"task\") */\nexport interface CreateTaskResult {\n resultType: \"task\"\n taskId: string\n status: TaskStatus\n statusMessage?: string\n createdAt: string\n lastUpdatedAt: string\n ttlMs: number\n pollIntervalMs: number\n _meta?: Record<string, unknown>\n}\n\n/** tasks/get 결과 (resultType 은 SDK 가 \"complete\" 로 채운다) */\nexport interface TaskView {\n taskId: string\n status: TaskStatus\n statusMessage?: string\n createdAt: string\n lastUpdatedAt: string\n ttlMs: number\n pollIntervalMs: number\n /** input_required */\n inputRequests?: Record<string, ElicitationRequest>\n /** completed = 같은 요청의 동기 tools/call 결과 */\n result?: TaskResult\n /** failed (TASK_LOST) */\n error?: TaskError\n}\n\ntype TaskResult = ToolCallResult & { resultType: \"complete\"; _meta?: Record<string, unknown> }\n\ninterface TaskError {\n code: number\n message: string\n data?: Record<string, unknown>\n}\n\n/** D2: mext:task:<taskId> 의 값 */\ninterface TaskRecord {\n v: 1\n taskId: string\n /** 바인딩 \"<kind>:<id>\". 다른 주체 = 없는 task */\n principal: string\n command: string\n status: TaskStatus\n statusMessage?: string\n createdAt: string\n lastUpdatedAt: string\n ttlMs: number\n /** epoch ms. heartbeatMs 마다 갱신 */\n heartbeatAt: number\n inputRequests?: Record<string, ElicitationRequest>\n result?: TaskResult\n}\n\nexport interface TaskRuntimeOptions {\n state: MextState\n timing?: Partial<TaskTiming>\n /** 완료 결과 _meta (동기 결과와 같은 manifestHash) */\n meta?: Record<string, unknown>\n /** store · bus 예외 보고. 기본 stderr 1줄 */\n onerror?: (error: unknown) => void\n}\n\n/** 요청 하나의 task 조건 */\nexport interface TaskRequestOptions {\n principal: Principal\n /** 생성 요청이 선언한 elicitation mode (ctx.ask 가능 여부, MRTR 과 같은 규칙) */\n modes: ElicitationModes\n /** handler.js: 응답 후 실행 유지 (플랫폼 waitUntil) */\n waitUntil?: (promise: Promise<unknown>) => void\n /** 완료 결과 _meta. 기본 = TaskRuntimeOptions.meta (호출자별 manifestHash 를 쓸 때 지정, §4 expose) */\n meta?: Record<string, unknown>\n}\n\nexport interface TaskRequest {\n /** invoke 의 detach. task 명령어가 아니면 undefined (동기) */\n detach: (entry: RegisteredCommand) => Promise<DetachedExecution | undefined>\n /** 생성 중 store · bus 예외 (있으면 요청 = -32603) */\n readonly failure: unknown\n}\n\nexport interface TaskRuntime {\n readonly timing: TaskTiming\n request(options: TaskRequestOptions): TaskRequest\n get(taskId: string, principal: Principal): Promise<TaskView>\n update(taskId: string, principal: Principal, inputResponses: Record<string, unknown>): Promise<void>\n cancel(taskId: string, principal: Principal): Promise<void>\n /** 실행 중 task 취소 → cancelled 기록 (상한 shutdownMs). 이후 새 task 없음 (동기 실행) */\n close(): Promise<void>\n}\n\n/** registry 에 task 명령어가 있는지 (선언 조건) */\nexport function hasTaskCommands(registry: Registry): boolean {\n for (const entry of registry.commands.values()) if (entry.command.task) return true\n return false\n}\n\n/** 요청 _meta 의 clientCapabilities 에 tasks 확장 선언 */\nexport function declaresTasks(clientCapabilities: unknown): boolean {\n const extensions = (clientCapabilities as { extensions?: unknown } | undefined)?.extensions\n return isPlainObject(extensions) && extensions[TASKS_EXTENSION] !== undefined\n}\n\n/**\n * HTTP: task 가 될 수 있는 tools/call 인지 (응답 = application/json, §12.6). 확장 선언 + 대상 명령어가 task 명령어.\n * 대상 = dispatcher 의 arguments.command (별칭 포함), 그 외 = 도구 이름 (command 노출)\n */\nexport function requestsTask(registry: Registry, body: unknown): boolean {\n if (!isPlainObject(body) || body.method !== \"tools/call\" || !isPlainObject(body.params)) return false\n const params = body.params\n const meta = isPlainObject(params._meta) ? params._meta : undefined\n if (!declaresTasks(meta?.[\"io.modelcontextprotocol/clientCapabilities\"])) return false\n const args = isPlainObject(params.arguments) ? params.arguments : undefined\n const target = typeof args?.command === \"string\" ? args.command : params.name\n if (typeof target !== \"string\") return false\n const id = registry.commands.has(target) ? target : registry.aliases.get(target)\n return id !== undefined && registry.commands.get(id)?.command.task !== undefined\n}\n\nconst recordKey = (taskId: string): string => `${STATE_KEY_PREFIX}task:${taskId}`\nconst inputKey = (taskId: string, key: string): string => `${recordKey(taskId)}:input:${key}`\nconst cancelKey = (taskId: string): string => `${recordKey(taskId)}:cancel`\nconst taskChannel = (taskId: string): string => `${STATE_KEY_PREFIX}task:${taskId}`\n\nconst TERMINAL: ReadonlySet<TaskStatus> = new Set([\"completed\", \"failed\", \"cancelled\"])\n\n/** 같은 프로세스에서 실행 중인 task */\ninterface RunningTask {\n /** 답 · 취소를 store 에서 다시 읽는다 */\n wake(): Promise<void>\n abort(reason: unknown): void\n /** 종료 기록 완료 */\n done: Promise<void>\n /** 아직 끝나지 않았으면 cancelled 기록 (종료 상한) */\n forceCancel(): Promise<void>\n}\n\nexport function createTaskRuntime(options: TaskRuntimeOptions): TaskRuntime {\n const { store, bus } = options.state\n const timing: TaskTiming = { ...TASK_TIMING, ...options.timing }\n const meta = options.meta ?? {}\n const report = options.onerror ?? defaultOnError\n const running = new Map<string, RunningTask>()\n let closed = false\n\n /** store · bus 호출. 예외 = 보고 + -32603 */\n const storeCall = async <T>(fn: () => Promise<T>): Promise<T> => {\n try {\n return await fn()\n } catch (error) {\n safeReport(report, error)\n throw new ProtocolError(ProtocolErrorCode.InternalError, \"State store error\")\n }\n }\n\n const readRecord = async (taskId: string, principal: Principal): Promise<TaskRecord> => {\n const raw = await storeCall(() => store.get(recordKey(taskId)))\n const record = raw === undefined ? undefined : parseRecord(raw)\n if (!record || record.taskId !== taskId || record.principal !== bindingOf(principal)) throw unknownTask(taskId)\n return record\n }\n\n const lost = (record: TaskRecord): boolean =>\n !TERMINAL.has(record.status) && Date.now() - record.heartbeatAt > timing.lostAfterMs\n\n /** 답 · 취소 도착 알림: 같은 프로세스 = 직접, 그 외 = bus (없으면 실행 프로세스가 폴링) */\n const notify = async (taskId: string, type: \"input\" | \"cancel\"): Promise<void> => {\n const local = running.get(taskId)\n if (local) {\n await local.wake()\n return\n }\n if (bus) await storeCall(() => bus.publish(taskChannel(taskId), JSON.stringify({ type })))\n }\n\n const start = async (entry: RegisteredCommand, request: TaskRequestOptions): Promise<DetachedExecution> => {\n const taskId = randomBytes(16).toString(\"base64url\")\n const created = new Date().toISOString()\n const record: TaskRecord = {\n v: 1,\n taskId,\n principal: bindingOf(request.principal),\n command: entry.id,\n status: \"working\",\n createdAt: created,\n lastUpdatedAt: created,\n ttlMs: entry.command.task!.ttlMs,\n heartbeatAt: Date.now(),\n }\n const controller = new AbortController()\n const waiters = new Map<string, (answer: ElicitResultValue) => void>()\n let finalized = false\n let resolveDone!: () => void\n const done = new Promise<void>((resolve) => (resolveDone = resolve))\n const touch = (): void => void (record.lastUpdatedAt = new Date().toISOString())\n\n // 순서 보장 · 합치기: 쓰는 중 변경 = 끝난 뒤 최신 상태로 한 번 더\n let writing: Promise<void> | undefined\n let dirty = false\n const persist = (): Promise<void> => {\n dirty = true\n writing ??= (async () => {\n try {\n while (dirty) {\n dirty = false\n const ttlMs = TERMINAL.has(record.status) ? record.ttlMs : record.ttlMs + timing.lostAfterMs\n await store.set(recordKey(taskId), JSON.stringify(record), { ttlMs })\n }\n } finally {\n writing = undefined\n }\n })()\n return writing\n }\n const persistLater = (): void => void persist().catch((error: unknown) => safeReport(report, error))\n\n const wake = async (): Promise<void> => {\n try {\n if (!controller.signal.aborted && (await store.get(cancelKey(taskId))) !== undefined) {\n controller.abort(new DOMException(\"Task cancelled\", \"AbortError\"))\n }\n for (const [key, resolve] of [...waiters]) {\n const raw = await store.get(inputKey(taskId, key))\n const answer = raw === undefined ? undefined : elicitResult(parseJson(raw))\n if (answer) resolve(answer)\n }\n } catch (error) {\n safeReport(report, error)\n }\n }\n\n let heartbeat: ReturnType<typeof setInterval> | undefined\n let poll: ReturnType<typeof setInterval> | undefined\n let unsubscribe: (() => Promise<void>) | undefined\n const stopTimers = (): void => {\n if (heartbeat !== undefined) clearInterval(heartbeat)\n if (poll !== undefined) clearInterval(poll)\n }\n\n const finish = async (): Promise<void> => {\n if (finalized) return\n finalized = true\n stopTimers()\n delete record.inputRequests\n touch()\n waiters.clear()\n try {\n await persist()\n } catch (error) {\n safeReport(report, error)\n }\n running.delete(taskId)\n try {\n await unsubscribe?.()\n } catch (error) {\n safeReport(report, error)\n }\n resolveDone()\n }\n\n let index = 0\n const ask: AskHandler = async (askRequest) => {\n const key = `${ASK_KEY_PREFIX}${index++}`\n if (!(askRequest.kind === \"url\" ? request.modes.url : request.modes.form)) throw modeUnavailable(askRequest)\n controller.signal.throwIfAborted()\n let onAbort!: () => void\n const answered = new Promise<ElicitResultValue>((resolve, reject) => {\n onAbort = () => {\n waiters.delete(key)\n reject(controller.signal.reason)\n }\n controller.signal.addEventListener(\"abort\", onAbort, { once: true })\n waiters.set(key, (answer) => {\n waiters.delete(key)\n controller.signal.removeEventListener(\"abort\", onAbort)\n resolve(answer)\n })\n })\n answered.catch(() => {})\n record.inputRequests = { ...record.inputRequests, [key]: elicitation(askRequest) }\n record.status = \"input_required\"\n touch()\n try {\n await persist()\n } catch (error) {\n waiters.delete(key)\n controller.signal.removeEventListener(\"abort\", onAbort)\n throw error\n }\n const response = await answered\n if (record.inputRequests) {\n delete record.inputRequests[key]\n if (Object.keys(record.inputRequests).length === 0) delete record.inputRequests\n }\n if (!record.inputRequests && !finalized) record.status = \"working\"\n touch()\n if (!finalized) persistLater()\n return askAnswer(askRequest, response)\n }\n\n const progress = (update: ProgressUpdate): void => {\n if (finalized) return\n record.statusMessage =\n update.message ?? (update.total !== undefined ? `${update.progress}/${update.total}` : String(update.progress))\n touch()\n persistLater()\n }\n\n const task: RunningTask = {\n wake,\n abort: (reason) => controller.abort(reason),\n done,\n async forceCancel() {\n if (finalized) return\n record.status = \"cancelled\"\n await finish()\n },\n }\n running.set(taskId, task)\n try {\n if (bus) unsubscribe = await bus.subscribe(taskChannel(taskId), () => void wake())\n // store 기록 후 응답 (tasks/get 이 바로 성공해야 한다)\n await persist()\n } catch (error) {\n running.delete(taskId)\n await unsubscribe?.().catch(() => {})\n throw error\n }\n heartbeat = setInterval(() => {\n record.heartbeatAt = Date.now()\n persistLater()\n }, timing.heartbeatMs)\n heartbeat.unref?.()\n if (!bus) {\n poll = setInterval(() => void wake(), timing.storePollMs)\n poll.unref?.()\n }\n request.waitUntil?.(done)\n\n const handle: CreateTaskResult = {\n resultType: \"task\",\n taskId,\n status: \"working\",\n createdAt: record.createdAt,\n lastUpdatedAt: record.lastUpdatedAt,\n ttlMs: record.ttlMs,\n pollIntervalMs: timing.pollIntervalMs,\n }\n return {\n handle,\n taskId,\n signal: controller.signal,\n ask,\n progress,\n async settle(outcome) {\n if (finalized) return\n if (\"error\" in outcome && controller.signal.aborted) {\n // 취소 후 예외 = cancelled. 핸들러가 끝까지 가면 (값 반환) 그 결과\n record.status = \"cancelled\"\n } else {\n record.status = \"completed\"\n const result = \"error\" in outcome ? errorResult(outcome.error) : valueResult(outcome.value, outcome.content)\n record.result = { ...result, resultType: \"complete\", _meta: { ...(request.meta ?? meta) } }\n }\n await finish()\n },\n }\n }\n\n return {\n timing,\n request(requestOptions) {\n const out: { failure: unknown; detach: TaskRequest[\"detach\"] } = {\n failure: undefined,\n async detach(entry) {\n if (!entry.command.task || closed) return undefined\n try {\n return await start(entry, requestOptions)\n } catch (error) {\n safeReport(report, error)\n out.failure = error\n throw error\n }\n },\n }\n return out\n },\n\n async get(taskId, principal) {\n const record = await readRecord(taskId, principal)\n const view: TaskView = {\n taskId: record.taskId,\n status: record.status,\n ...(record.statusMessage !== undefined ? { statusMessage: record.statusMessage } : {}),\n createdAt: record.createdAt,\n lastUpdatedAt: record.lastUpdatedAt,\n ttlMs: record.ttlMs,\n pollIntervalMs: timing.pollIntervalMs,\n }\n if (lost(record)) {\n view.status = \"failed\"\n view.error = {\n code: ProtocolErrorCode.InternalError,\n message: `Task lost: the executing process stopped (no heartbeat for ${timing.lostAfterMs}ms).`,\n data: { code: TASK_LOST },\n }\n } else if (record.status === \"input_required\" && record.inputRequests) view.inputRequests = record.inputRequests\n else if (record.status === \"completed\" && record.result) view.result = record.result\n return view\n },\n\n async update(taskId, principal, inputResponses) {\n const record = await readRecord(taskId, principal)\n if (TERMINAL.has(record.status) || lost(record)) return\n let wrote = false\n for (const [key, value] of Object.entries(inputResponses)) {\n // 모르는 키 · 형식이 아닌 답 · 이미 답한 키 = 무시\n if (record.inputRequests?.[key] === undefined || !elicitResult(value)) continue\n const stored = await storeCall(() => store.get(inputKey(taskId, key)))\n if (stored !== undefined) continue\n await storeCall(() => store.set(inputKey(taskId, key), JSON.stringify(value), { ttlMs: record.ttlMs + timing.lostAfterMs }))\n wrote = true\n }\n if (wrote) await notify(taskId, \"input\")\n },\n\n async cancel(taskId, principal) {\n const record = await readRecord(taskId, principal)\n if (TERMINAL.has(record.status) || lost(record)) return\n await storeCall(() => store.set(cancelKey(taskId), \"{}\", { ttlMs: record.ttlMs + timing.lostAfterMs }))\n await notify(taskId, \"cancel\")\n },\n\n async close() {\n closed = true\n const tasks = [...running.values()]\n if (tasks.length === 0) return\n for (const task of tasks) task.abort(new DOMException(\"Server shutting down\", \"AbortError\"))\n let timer: ReturnType<typeof setTimeout> | undefined\n await Promise.race([\n Promise.all(tasks.map((task) => task.done)),\n new Promise<void>((resolve) => (timer = setTimeout(resolve, timing.shutdownMs))),\n ])\n clearTimeout(timer)\n await Promise.all(tasks.map((task) => task.forceCancel()))\n },\n }\n}\n\n/**\n * McpServer 에 tasks/get · tasks/update · tasks/cancel 등록 (D5: 3-arg setRequestHandler, custom params schema).\n * declare = server/discover capabilities.extensions 에 확장 선언 (생성 가능할 때만). transport 연결 전에 호출\n */\nexport function installTaskHandlers(server: McpServer, runtime: TaskRuntime, principal: Principal, declare: boolean): void {\n const inner = server.server\n if (declare) inner.registerCapabilities({ extensions: { [TASKS_EXTENSION]: {} } })\n const byId = z.object({ taskId: z.string() })\n inner.setRequestHandler(\"tasks/get\", { params: byId }, async ({ taskId }) => ({ ...(await runtime.get(taskId, principal)) }))\n // inputResponses 는 SDK 가 params 에서 분리 (MRTR 예약 키) → ctx.mcpReq.inputResponses (bare 결과만)\n inner.setRequestHandler(\"tasks/update\", { params: byId }, async ({ taskId }, ctx) => {\n await runtime.update(taskId, principal, ctx.mcpReq.inputResponses ?? {})\n return {}\n })\n inner.setRequestHandler(\"tasks/cancel\", { params: byId }, async ({ taskId }) => {\n await runtime.cancel(taskId, principal)\n return {}\n })\n}\n\nfunction unknownTask(taskId: string): ProtocolError {\n return new ProtocolError(ProtocolErrorCode.InvalidParams, `Unknown task: ${taskId}`)\n}\n\nfunction bindingOf(principal: Principal): string {\n return `${principal.kind}:${principal.id}`\n}\n\nfunction parseRecord(raw: string): TaskRecord | undefined {\n const value = parseJson(raw)\n if (!isPlainObject(value) || value.v !== 1 || typeof value.taskId !== \"string\" || typeof value.status !== \"string\") return undefined\n return value as unknown as TaskRecord\n}\n\nfunction parseJson(raw: string): unknown {\n try {\n return JSON.parse(raw)\n } catch {\n return undefined\n }\n}\n\nfunction safeReport(report: (error: unknown) => void, error: unknown): void {\n try {\n report(error)\n } catch {\n // 보고는 동작을 바꾸지 않는다\n }\n}\n\nfunction defaultOnError(error: unknown): void {\n process.stderr.write(`mext: state store error: ${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"]}