@obov/mext 0.3.0 → 0.4.0

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 (115) hide show
  1. package/dist/build.js +67 -4
  2. package/dist/build.js.map +1 -1
  3. package/dist/cli/ask-url.d.ts +16 -0
  4. package/dist/cli/ask-url.js +27 -0
  5. package/dist/cli/ask-url.js.map +1 -0
  6. package/dist/cli/build.js +7 -1
  7. package/dist/cli/build.js.map +1 -1
  8. package/dist/cli/dev-server.d.ts +7 -1
  9. package/dist/cli/dev-server.js +15 -2
  10. package/dist/cli/dev-server.js.map +1 -1
  11. package/dist/cli/dev.js +27 -7
  12. package/dist/cli/dev.js.map +1 -1
  13. package/dist/cli/login.d.ts +5 -0
  14. package/dist/cli/login.js +11 -7
  15. package/dist/cli/login.js.map +1 -1
  16. package/dist/cli/logout.js +4 -6
  17. package/dist/cli/logout.js.map +1 -1
  18. package/dist/cli/output.d.ts +1 -1
  19. package/dist/cli/output.js +1 -2
  20. package/dist/cli/output.js.map +1 -1
  21. package/dist/cli/run.js +21 -5
  22. package/dist/cli/run.js.map +1 -1
  23. package/dist/client/cache.d.ts +14 -4
  24. package/dist/client/cache.js +10 -3
  25. package/dist/client/cache.js.map +1 -1
  26. package/dist/client/main.js +11 -10
  27. package/dist/client/main.js.map +1 -1
  28. package/dist/client/manifest.d.ts +13 -1
  29. package/dist/client/manifest.js +43 -0
  30. package/dist/client/manifest.js.map +1 -1
  31. package/dist/client/runner.d.ts +3 -1
  32. package/dist/client/runner.js +80 -19
  33. package/dist/client/runner.js.map +1 -1
  34. package/dist/client/task.d.ts +47 -0
  35. package/dist/client/task.js +126 -0
  36. package/dist/client/task.js.map +1 -0
  37. package/dist/command.d.ts +30 -3
  38. package/dist/command.js +16 -0
  39. package/dist/command.js.map +1 -1
  40. package/dist/config.d.ts +40 -6
  41. package/dist/config.js +57 -8
  42. package/dist/config.js.map +1 -1
  43. package/dist/errors.d.ts +3 -1
  44. package/dist/errors.js.map +1 -1
  45. package/dist/index.d.ts +17 -5
  46. package/dist/index.js +9 -2
  47. package/dist/index.js.map +1 -1
  48. package/dist/instrumentation.d.ts +14 -2
  49. package/dist/instrumentation.js +12 -4
  50. package/dist/instrumentation.js.map +1 -1
  51. package/dist/invoke.d.ts +38 -0
  52. package/dist/invoke.js +72 -3
  53. package/dist/invoke.js.map +1 -1
  54. package/dist/local-bin.js +17 -9
  55. package/dist/local-bin.js.map +1 -1
  56. package/dist/manifest.d.ts +48 -3
  57. package/dist/manifest.js +14 -3
  58. package/dist/manifest.js.map +1 -1
  59. package/dist/mcp/constants.d.ts +4 -0
  60. package/dist/mcp/constants.js +4 -0
  61. package/dist/mcp/constants.js.map +1 -1
  62. package/dist/mcp/dispatch.d.ts +21 -7
  63. package/dist/mcp/dispatch.js +42 -7
  64. package/dist/mcp/dispatch.js.map +1 -1
  65. package/dist/mcp/http.d.ts +23 -5
  66. package/dist/mcp/http.js +64 -9
  67. package/dist/mcp/http.js.map +1 -1
  68. package/dist/mcp/index.d.ts +14 -6
  69. package/dist/mcp/index.js +7 -3
  70. package/dist/mcp/index.js.map +1 -1
  71. package/dist/mcp/mrtr.d.ts +40 -8
  72. package/dist/mcp/mrtr.js +32 -11
  73. package/dist/mcp/mrtr.js.map +1 -1
  74. package/dist/mcp/prompts.d.ts +25 -0
  75. package/dist/mcp/prompts.js +164 -0
  76. package/dist/mcp/prompts.js.map +1 -0
  77. package/dist/mcp/resources.d.ts +48 -0
  78. package/dist/mcp/resources.js +142 -0
  79. package/dist/mcp/resources.js.map +1 -0
  80. package/dist/mcp/server.d.ts +30 -5
  81. package/dist/mcp/server.js +143 -16
  82. package/dist/mcp/server.js.map +1 -1
  83. package/dist/mcp/stdio.d.ts +5 -0
  84. package/dist/mcp/stdio.js +16 -3
  85. package/dist/mcp/stdio.js.map +1 -1
  86. package/dist/mcp/subscriptions.d.ts +61 -0
  87. package/dist/mcp/subscriptions.js +188 -0
  88. package/dist/mcp/subscriptions.js.map +1 -0
  89. package/dist/mcp/tasks.d.ts +127 -0
  90. package/dist/mcp/tasks.js +448 -0
  91. package/dist/mcp/tasks.js.map +1 -0
  92. package/dist/module-files.d.ts +24 -0
  93. package/dist/module-files.js +97 -0
  94. package/dist/module-files.js.map +1 -0
  95. package/dist/prompt.d.ts +133 -0
  96. package/dist/prompt.js +222 -0
  97. package/dist/prompt.js.map +1 -0
  98. package/dist/registry.d.ts +6 -0
  99. package/dist/registry.js.map +1 -1
  100. package/dist/remote/client.d.ts +17 -1
  101. package/dist/remote/client.js +18 -2
  102. package/dist/remote/client.js.map +1 -1
  103. package/dist/resource.d.ts +169 -0
  104. package/dist/resource.js +301 -0
  105. package/dist/resource.js.map +1 -0
  106. package/dist/route.d.ts +71 -0
  107. package/dist/route.js +280 -0
  108. package/dist/route.js.map +1 -0
  109. package/dist/start.d.ts +14 -3
  110. package/dist/start.js +76 -11
  111. package/dist/start.js.map +1 -1
  112. package/dist/state.d.ts +38 -0
  113. package/dist/state.js +98 -0
  114. package/dist/state.js.map +1 -0
  115. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/client/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { COMMAND, type Command } from \"../command.ts\"\nimport { MextError, type MextErrorCode, type MextErrorDetails } from \"../errors.ts\"\nimport { isSegment } from \"../ids.ts\"\nimport type { CommandHelp, Help } from \"../mcp/help.ts\"\nimport type { NamespaceInfo, RegisteredCommand, Registry } from \"../registry.ts\"\nimport {\n createRemoteClient,\n isRecord,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n type CallToolOptions,\n type CallToolResult,\n type InputRequired,\n type InputResponses,\n type RemoteClient,\n type RemoteTool,\n} from \"../remote/client.ts\"\nimport { credentialStore, envPrefix, type CredentialStore, type StoredCredentials } from \"../remote/credentials.ts\"\nimport { isExpired, OAuthFlowError, refreshCredentials } from \"../remote/oauth.ts\"\nimport { cliSpecFromJsonSchema, coerceValue, defineCliSpec, parseArgs } from \"../cli/args.ts\"\nimport { cliPath, renderHelp } from \"../cli/help.ts\"\nimport { createLineReader, readAll, type CliIo, type LineReader } from \"../cli/io.ts\"\nimport {\n CliInterrupted,\n emitError,\n EXIT,\n errorJson,\n exitCodeOf,\n formatError,\n formatJson,\n formatProgress,\n formatResult,\n type CliErrorFormatter,\n} from \"../cli/output.ts\"\nimport { MANIFEST_HASH_META_KEY } from \"../mcp/constants.ts\"\nimport { VERSION } from \"../version.ts\"\nimport { openSchema, schemaCacheDir, schemaCacheFile, type FetchedHelp, type Schema } from \"./cache.ts\"\nimport { manifestHelp, type ClientManifest } from \"./manifest.ts\"\n\n/**\n * 원격 실행 공용 runner: mext run --url (bin = mext) 과 고객 CLI (bin = cli.bin) 가 같은 코드 경로.\n * 서버 MCP 엔드포인트의 dispatcher 도구 (execute · split 의 query · mutate) 호출. 권한 검사는 서버만.\n * 경로 해석 · help · 플래그 파싱 = HelpSource (캐시 · 내장 manifest · 서버 help, client/cache.ts) 의 입력 스키마 (JSON Schema).\n * 로컬 파싱 실패 (UNKNOWN_COMMAND · INVALID_ARGUMENT) = 서버 help 로 1회 재시도. tools/call 결과의 manifestHash 로 drift 감지.\n * 토큰 = <BIN>_TOKEN, 없으면 저장된 토큰 (<bin> login). 출력 · exit code 는 로컬 모드와 같다.\n *\n * 이 모듈 (와 import 대상) 은 고객 CLI 번들에 들어간다: Zod · MCP 서버 SDK · 핸들러 · 스캔 · 빌드 코드 import 금지.\n */\n\nexport interface RemoteRunOptions {\n /** 실행 파일 이름. 토큰 환경변수 (<BIN>_TOKEN) · 자격 증명 위치 (credentialStore bin) · clientInfo.name */\n bin: string\n /** MCP 엔드포인트 */\n url: string\n /** help · 오류 안내의 명령 접두. \"mext run --url <url>\" · \"myapp\" */\n prog: string\n /** login 안내 명령. \"mext login --url <url>\" · \"myapp login\" */\n login: string\n /** clientInfo.version */\n version: string\n /**\n * 번들 형태: 내장 manifest 로 help · 경로 해석 · 플래그 파싱 (help 에 네트워크 없음, 명령어 실행만 tools/list · tools/call).\n * 없음 = 범용 형태: 서버 help 조회\n */\n manifest?: ClientManifest\n /** 내장 manifest 의 manifestHash (빌드 시). manifest 와 같이 지정 */\n manifestHash?: string\n /** 사람용 루트 help 뒤에 붙일 텍스트 (고객 CLI 의 login · logout · mcp install 목록) */\n rootHelpFooter?: string\n /** 오류 출력 · exit code 커스텀 (cli.errors). 없음 = mext 기본 */\n formatError?: CliErrorFormatter\n}\n\n/** help 출처. 서버 (tools/list → dispatcher help 호출) · 내장 manifest · 스키마 캐시 (client/cache.ts Schema) */\nexport interface HelpSource {\n /** 대상 (\"\" = 루트) → help. 없는 대상 = MextError UNKNOWN_COMMAND */\n help(target: string): Promise<Help>\n}\n\nexport async function runRemote(options: RemoteRunOptions, argv: readonly string[], io: CliIo): Promise<number> {\n const { url, prog } = options\n const tokenEnv = `${envPrefix(options.bin)}_TOKEN`\n const ctx: ReportContext = {\n login: options.login,\n tokenEnv,\n auth: undefined,\n footer: options.rootHelpFooter,\n formatter: options.formatError,\n }\n const lead = { json: false, yes: false, help: false }\n let i = 0\n for (; i < argv.length; i++) {\n const tok = argv[i]!\n if (!tok.startsWith(\"-\") || tok === \"-\") break\n if (tok === \"--json\") lead.json = true\n else if (tok === \"--yes\") lead.yes = true\n else if (tok === \"--help\" || tok === \"-h\") lead.help = true\n else return report(usageError(`unknown flag ${tok} before the command`), io, prog, argv.includes(\"--json\"), ctx)\n }\n const rest = argv.slice(i)\n const beforeDashDash = rest.indexOf(\"--\") < 0 ? rest : rest.slice(0, rest.indexOf(\"--\"))\n const json = lead.json || beforeDashDash.includes(\"--json\")\n\n const controller = new AbortController()\n const onAbort = (): void => controller.abort(io.signal?.reason)\n if (io.signal?.aborted) onAbort()\n io.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const lines = createLineReader(io)\n let session: Session | undefined\n let schema: Schema | undefined\n try {\n if (!/^https?:\\/\\//i.test(url)) throw usageError(`--url must be an http(s) URL (got \"${url}\")`)\n session = openSession(options, tokenEnv, io, controller.signal)\n const s = session\n schema = await openRunSchema(options, s, ctx, io)\n const source: HelpSource = schema\n const wantsHelp = lead.help || beforeDashDash.includes(\"--help\") || beforeDashDash.includes(\"-h\")\n let stdin: Promise<string> | undefined\n const readStdin = (): Promise<string> => (stdin ??= readAll(io.stdin))\n\n // 경로 해석 · 플래그 파싱 (로컬). 실패하면 서버 help 로 1회 재시도\n const plan = async (): Promise<Plan> => {\n // <prog> help [target...]\n if (rest[0] === \"help\") {\n const tokens = rest.slice(1).filter((t) => !t.startsWith(\"-\"))\n const resolved = await resolveRemotePath(source, tokens)\n if (resolved.consumed < tokens.length) throw await unknownAt(source, resolved, tokens.slice(resolved.consumed))\n return { kind: \"help\", help: resolved.help }\n }\n const resolved = await resolveRemotePath(source, rest)\n const { help, consumed } = resolved\n const command = help.kind === \"command\" ? help : help.kind === \"namespace\" ? help.command : undefined\n const next = rest[consumed]\n const acceptsPositional = command !== undefined && command.positional.length > 0\n if (help.kind !== \"command\" && next !== undefined && !next.startsWith(\"-\") && !acceptsPositional) {\n throw await unknownAt(source, resolved, rest.slice(consumed))\n }\n if (wantsHelp) return { kind: \"help\", help }\n if (!command) return { kind: \"namespace\", help }\n const entry = entryFromHelp(command)\n const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin })\n return { kind: \"run\", command, entry, input: parsed.input, yes: parsed.yes }\n }\n let planned: Plan\n try {\n planned = await plan()\n } catch (error) {\n if (!isLocalParseFailure(error) || !schema.refetch()) throw error\n try {\n planned = await plan()\n } catch (retryError) {\n // 재조회 실패 (오프라인 등) = 원래 로컬 오류\n if (retryError instanceof RemoteTransportError || retryError instanceof RemoteRpcError) throw error\n throw retryError\n }\n }\n\n if (planned.kind === \"help\") return printHelp(planned.help, io, prog, json, ctx)\n if (planned.kind === \"namespace\") {\n const { help } = planned\n const id = help.kind === \"namespace\" ? help.id : \"\"\n const error = new MextError(\n \"UNKNOWN_COMMAND\",\n id === \"\" ? \"No command given.\" : `\"${cliPath(id)}\" is a namespace. Specify a command.`,\n { command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n )\n if (json) return report(error, io, prog, true, ctx)\n const text = `${formatError(error, prog)}\\n${helpText(help, prog, ctx)}`\n return emitError(io, { body: errorBody(error), text, exitCode: EXIT.usage, json: false }, ctx.formatter)\n }\n\n const { command, entry } = planned\n const yes = lead.yes || planned.yes\n const tool = commandTool(dispatcherOf(url, await schema.tools()), command)\n const args = { command: entry.id, args: planned.input as Record<string, unknown> }\n const result = await s.call((o) =>\n s.client.callTool(tool, args, {\n ...o,\n progressToken: \"mext-cli\",\n onNotification: (method, params) => {\n if (method !== \"notifications/progress\" || typeof params.progress !== \"number\") return\n const update: { progress: number; total?: number; message?: string } = { progress: params.progress }\n if (typeof params.total === \"number\") update.total = params.total\n if (typeof params.message === \"string\") update.message = params.message\n io.stderr.write(formatProgress(update))\n },\n onInputRequired: inputHandler(io, lines, yes, entry.id, controller.signal),\n }),\n )\n // drift: 이번 결과는 그대로, 다르면 캐시 stale (다음 실행에서 서버 help)\n schema.observe(metaHash(result))\n if (result.isError === true) throw toolError(result, ctx)\n const value = result.structuredContent === undefined ? textValue(result) : result.structuredContent\n io.stdout.write(json ? formatJson(value) : formatResult(value))\n return EXIT.ok\n } catch (error) {\n if (session) ctx.auth = session.auth\n if (controller.signal.aborted) return report(new CliInterrupted(), io, prog, json, ctx)\n return report(error, io, prog, json, ctx)\n } finally {\n io.signal?.removeEventListener(\"abort\", onAbort)\n lines.close()\n await schema?.save()\n }\n}\n\n/** 로컬 경로 해석 · 플래그 파싱 결과 */\ntype Plan =\n | { kind: \"help\"; help: Help }\n | { kind: \"namespace\"; help: Help }\n | { kind: \"run\"; command: CommandHelp; entry: RegisteredCommand; input: unknown; yes: boolean }\n\n/** 서버 help 재조회 대상 로컬 오류 */\nfunction isLocalParseFailure(error: unknown): boolean {\n return error instanceof MextError && (error.code === \"UNKNOWN_COMMAND\" || error.code === \"INVALID_ARGUMENT\")\n}\n\n/** 결과 _meta[\"dev.mext/manifestHash\"] */\nfunction metaHash(result: CallToolResult): string | undefined {\n const meta = result._meta\n const value = isRecord(meta) ? meta[MANIFEST_HASH_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n}\n\n/** 이번 실행의 스키마 상태: 캐시 파일 (<BIN>_CACHE_DIR · XDG · HOME) · 내장 manifest · 서버 help */\nfunction openRunSchema(options: RemoteRunOptions, s: Session, ctx: ReportContext, io: CliIo): Promise<Schema> {\n const dir = schemaCacheDir(options.bin, io.env)\n return openSchema({\n file: dir === undefined ? undefined : schemaCacheFile(dir, options.url),\n url: options.url,\n client: { bin: options.bin, version: options.version, mext: VERSION },\n ...(options.manifest && options.manifestHash !== undefined\n ? { embedded: { manifest: options.manifest, hash: options.manifestHash } }\n : {}),\n fetchHelp: serverHelpFetcher(s, ctx),\n fetchTools: async () => {\n const r = await s.call((o) => s.client.listToolsResult(o))\n dispatcherOf(s.url, r.tools)\n return r.ttlMs === undefined ? { tools: r.tools } : { tools: r.tools, ttlMs: r.ttlMs }\n },\n warn: (message) => io.stderr.write(message),\n })\n}\n\n/* 세션: 클라이언트 · 토큰 · dispatcher 도구 */\n\n/** 토큰 출처. undefined = 아직 요청 전 (저장분 미조회) */\ntype AuthSource = \"env\" | \"stored\" | \"none\" | undefined\n\ninterface Tools {\n /** tools/list 결과 */\n list: RemoteTool[]\n /** help 호출 도구 (execute 또는 split 의 query) */\n helpTool: RemoteTool\n}\n\ninterface Session {\n url: string\n client: RemoteClient\n /** 요청한 토큰 출처 (첫 요청 때 결정) */\n readonly auth: AuthSource\n /** 401 이면 refresh_token 으로 1회 갱신 후 재시도 */\n call<T>(fn: (options: { signal: AbortSignal }) => Promise<T>): Promise<T>\n}\n\n/** 네트워크 · 키체인 접근은 첫 요청까지 미룬다 (번들 형태의 help 는 둘 다 없음) */\nfunction openSession(options: RemoteRunOptions, tokenEnv: string, io: CliIo, signal: AbortSignal): Session {\n const { url } = options\n const envToken = io.env[tokenEnv] !== undefined && io.env[tokenEnv] !== \"\" ? io.env[tokenEnv] : undefined\n const store: CredentialStore | undefined =\n envToken === undefined ? credentialStore({ env: io.env, bin: options.bin }) : undefined\n let stored: StoredCredentials | undefined\n let auth: AuthSource = envToken !== undefined ? \"env\" : undefined\n let refreshed = false\n const refresh = async (): Promise<boolean> => {\n if (!store || !stored?.refresh_token || refreshed) return false\n refreshed = true\n try {\n stored = await refreshCredentials(stored)\n await store.set(url, stored).catch(() => {})\n return true\n } catch {\n return false\n }\n }\n let loading: Promise<void> | undefined\n const load = (): Promise<void> =>\n (loading ??= (async () => {\n if (!store) return\n stored = await store.get(url).catch(() => undefined)\n if (stored && isExpired(stored)) await refresh()\n auth = stored ? \"stored\" : \"none\"\n })())\n const client = createRemoteClient({\n url,\n clientInfo: { name: options.bin, version: options.version },\n token: async () => {\n await load()\n return envToken ?? stored?.access_token\n },\n })\n const call = async <T>(fn: (o: { signal: AbortSignal }) => Promise<T>): Promise<T> => {\n try {\n return await fn({ signal })\n } catch (error) {\n if (error instanceof RemoteUnauthorizedError && (await refresh())) return fn({ signal })\n throw error\n }\n }\n return {\n url,\n client,\n get auth() {\n return auth\n },\n call,\n }\n}\n\n/** tools/list 결과 → dispatcher 도구 (execute 또는 query · mutate). 없으면 RemoteTransportError */\nfunction dispatcherOf(url: string, list: RemoteTool[]): Tools {\n const execute = list.find((t) => t.name === \"execute\")\n const query = list.find((t) => t.name === \"query\")\n const helpTool = execute ?? query\n if (!helpTool || (!execute && !list.some((t) => t.name === \"mutate\"))) {\n throw new RemoteTransportError(`${url} does not expose mext dispatcher tools (execute, or query and mutate).`)\n }\n return { list, helpTool }\n}\n\n/** 명령어를 호출할 도구: help 의 tool (split) → execute → readOnly 면 query, 아니면 mutate */\nfunction commandTool(tools: Tools, command: CommandHelp): RemoteTool {\n const byName = (name: string | undefined) => (name === undefined ? undefined : tools.list.find((t) => t.name === name))\n return byName(command.tool) ?? byName(\"execute\") ?? byName(command.readOnly ? \"query\" : \"mutate\") ?? tools.helpTool\n}\n\n/** 서버의 dispatcher help (tools/call). UNKNOWN_COMMAND = 캐시할 결과, 그 외 오류 = throw */\nfunction serverHelpFetcher(\n s: Session,\n ctx: ReportContext,\n): (target: string, tools: () => Promise<RemoteTool[]>) => Promise<FetchedHelp> {\n return async (target, tools) => {\n const { helpTool } = dispatcherOf(s.url, await tools())\n const args = target === \"\" ? { command: \"help\" } : { command: \"help\", args: { target } }\n const result = await s.call((o) => s.client.callTool(helpTool, args, o))\n const hash = metaHash(result)\n if (result.isError === true) {\n const error = toolError(result, ctx)\n if (error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") return { value: { error: error.toJSON() }, hash }\n throw error\n }\n const value = result.structuredContent\n if (!isRecord(value) || (value.kind !== \"root\" && value.kind !== \"namespace\" && value.kind !== \"command\")) {\n throw new RemoteTransportError(`${s.url} returned an unexpected help result.`)\n }\n return { value: { help: value as unknown as Help }, hash }\n }\n}\n\n/** 번들 형태: 내장 manifest (네트워크 없음) */\nexport function manifestHelpSource(manifest: ClientManifest): HelpSource {\n return { help: async (target) => manifestHelp(manifest, target) }\n}\n\n/* 경로 해석: 앞쪽 세그먼트 토큰의 가장 긴 접두 (로컬 resolvePath 와 같은 결과) */\n\ninterface ResolvedPath {\n help: Help\n consumed: number\n /** 가장 긴 후보의 UNKNOWN_COMMAND (있으면) */\n unknown: MextError | undefined\n}\n\nasync function resolveRemotePath(source: HelpSource, tokens: readonly string[]): Promise<ResolvedPath> {\n const segs: string[] = []\n for (const t of tokens) {\n if (!isSegment(t)) break\n segs.push(t)\n }\n let unknown: MextError | undefined\n for (let k = segs.length; k >= 0; k--) {\n try {\n return { help: await source.help(segs.slice(0, k).join(\".\")), consumed: k, unknown }\n } catch (error) {\n if (k > 0 && error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") {\n unknown ??= error\n continue\n }\n throw error\n }\n }\n throw new Error(\"unreachable\")\n}\n\n/** 해석되지 않은 경로 → UNKNOWN_COMMAND (suggested · usage) */\nasync function unknownAt(source: HelpSource, resolved: ResolvedPath, tail: readonly string[]): Promise<MextError> {\n if (resolved.unknown) return resolved.unknown\n const id = resolved.help.kind === \"root\" ? \"\" : resolved.help.id\n const first = tail.find((t) => !t.startsWith(\"-\"))\n const candidate = [id, first ?? \"\"].filter((x) => x !== \"\").join(\".\")\n try {\n await source.help(candidate)\n } catch (error) {\n if (error instanceof MextError) return error\n throw error\n }\n return new MextError(\"UNKNOWN_COMMAND\", `Unknown command \"${candidate}\".`, { command: candidate, suggested: [], usage: \"help\" })\n}\n\n/* help → 로컬 렌더러용 Registry (같은 help 텍스트) */\n\n/** 원격 명령어의 input 자리. CLI 필드는 defineCliSpec (JSON Schema 분석) 이 정하므로 Zod 스키마가 필요 없다 */\nconst REMOTE_INPUT = { _zod: { def: { shape: {} } } } as unknown as Command[\"input\"]\n\nfunction commandOf(meta: {\n description: string\n readOnly: boolean\n destructive: boolean\n requiresConfirmation: boolean\n scopes?: readonly string[]\n examples?: readonly unknown[]\n positional?: readonly string[]\n}): Command {\n return {\n [COMMAND]: true,\n description: meta.description,\n input: REMOTE_INPUT,\n output: undefined,\n readOnly: meta.readOnly,\n destructive: meta.destructive,\n requiresConfirmation: meta.requiresConfirmation,\n scopes: [...(meta.scopes ?? [])],\n examples: [...(meta.examples ?? [])] as Command[\"examples\"],\n positional: [...(meta.positional ?? [])],\n aliases: [],\n execute() {\n throw new Error(\"remote command\")\n },\n }\n}\n\n/** 원격 명령어 help → RegisteredCommand (CLI 필드 = inputSchema 분석) */\nexport function entryFromHelp(help: CommandHelp): RegisteredCommand {\n const entry: RegisteredCommand = {\n id: help.id,\n command: commandOf(help),\n aliases: [...help.aliases],\n file: undefined,\n inputSchema: help.inputSchema,\n outputSchema: help.outputSchema,\n }\n defineCliSpec(entry, cliSpecFromJsonSchema(help.inputSchema, help.positional))\n return entry\n}\n\nfunction registryFromHelp(help: Help): Registry {\n const commands = new Map<string, RegisteredCommand>()\n const aliases = new Map<string, string>()\n const namespaces = new Map<string, NamespaceInfo>()\n if (help.kind === \"command\") {\n const entry = entryFromHelp(help)\n commands.set(entry.id, entry)\n for (const a of entry.aliases) aliases.set(a, entry.id)\n namespaces.set(\"\", { id: \"\", description: undefined, commands: [], namespaces: [] })\n return { commands, aliases, namespaces }\n }\n const id = help.kind === \"root\" ? \"\" : help.id\n namespaces.set(id, {\n id,\n description: help.description,\n commands: help.commands.map((c) => c.id),\n namespaces: help.namespaces.map((n) => n.id),\n })\n for (const n of help.namespaces) namespaces.set(n.id, { id: n.id, description: n.description, commands: [], namespaces: [] })\n for (const c of help.commands) {\n commands.set(c.id, {\n id: c.id,\n command: commandOf(c),\n aliases: [],\n file: undefined,\n inputSchema: {},\n outputSchema: undefined,\n })\n }\n if (help.kind === \"namespace\" && help.command) commands.set(help.command.id, entryFromHelp(help.command))\n return { commands, aliases, namespaces }\n}\n\n/** 사람용 help 텍스트. 루트면 footer (고객 CLI 내장 명령) 를 붙인다 */\nfunction helpText(help: Help, prog: string, ctx: ReportContext): string {\n const target = help.kind === \"root\" ? \"\" : help.id\n const text = renderHelp(registryFromHelp(help), target, { prog })\n return help.kind === \"root\" && ctx.footer ? `${text}\\n${ctx.footer}` : text\n}\n\n/** --help --json = help 결과 그대로 (서버 help 의 structuredContent · 내장 manifest help) */\nfunction printHelp(help: Help, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n io.stdout.write(json ? formatJson(help) : helpText(help, prog, ctx))\n return EXIT.ok\n}\n\n/* 결과 · 오류 */\n\nconst MEXT_CODES: readonly MextErrorCode[] = [\n \"UNKNOWN_COMMAND\",\n \"INVALID_ARGUMENT\",\n \"UNAUTHENTICATED\",\n \"PERMISSION_DENIED\",\n \"INPUT_UNAVAILABLE\",\n]\n\n/** 서버 핸들러 예외 등 mext 구조화 오류 외의 도구 오류. --json = 서버 오류 본문 그대로, exit 1 */\nexport class RemoteExecutionError extends Error {\n readonly body: Record<string, unknown>\n constructor(body: Record<string, unknown>) {\n super(typeof body.message === \"string\" ? body.message : \"Remote command failed.\")\n this.name = \"RemoteExecutionError\"\n this.body = body\n }\n}\n\ninterface ReportContext {\n /** login 안내 명령 */\n login: string\n /** <BIN>_TOKEN */\n tokenEnv: string\n auth: AuthSource\n /** 루트 help footer */\n footer?: string | undefined\n formatter?: CliErrorFormatter | undefined\n}\n\n/** isError 결과 → MextError (code 가 mext 구조화 오류면) 또는 RemoteExecutionError */\nfunction toolError(result: CallToolResult, ctx: ReportContext): Error {\n const sc = result.structuredContent\n const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined\n if (!body) return new RemoteExecutionError({ code: \"EXECUTION_FAILED\", message: textValue(result) ?? \"Remote command failed.\" })\n const { code, message, ...details } = body\n if (typeof code === \"string\" && (MEXT_CODES as readonly string[]).includes(code)) {\n const text = typeof message === \"string\" ? message : code\n if (code === \"UNAUTHENTICATED\") {\n return new MextError(\"UNAUTHENTICATED\", text, { ...(details as MextErrorDetails[\"UNAUTHENTICATED\"]), login: ctx.login })\n }\n return new MextError(code as MextErrorCode, text, details as never)\n }\n return new RemoteExecutionError(body)\n}\n\nfunction textValue(result: CallToolResult): string | undefined {\n const texts = (result.content ?? []).flatMap((c) =>\n isRecord(c) && c.type === \"text\" && typeof c.text === \"string\" ? [c.text] : [],\n )\n return texts.length > 0 ? texts.join(\"\\n\") : undefined\n}\n\n/** 401 → UNAUTHENTICATED (login 안내 포함) */\nfunction unauthenticatedFrom(error: RemoteUnauthorizedError, ctx: ReportContext): MextError {\n const data = isRecord(error.data) ? error.data : {}\n const reason =\n data.reason === \"invalid_token\" || data.reason === \"missing_token\"\n ? data.reason\n : error.challenge.error === \"invalid_token\"\n ? \"invalid_token\"\n : \"missing_token\"\n let message = typeof data.message === \"string\" ? data.message : error.message\n if (ctx.auth === \"env\") message += ` ${ctx.tokenEnv} was rejected.`\n return new MextError(\"UNAUTHENTICATED\", message, { reason, login: ctx.login })\n}\n\nfunction report(error: unknown, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n let e = error\n if (e instanceof RemoteUnauthorizedError) e = unauthenticatedFrom(e, ctx)\n let text = formatError(e, prog)\n if (e instanceof MextError && e.code === \"PERMISSION_DENIED\" && ctx.auth === \"none\") {\n const reason = (e.details as MextErrorDetails[\"PERMISSION_DENIED\"]).reason\n if (reason === \"anonymous\") text += `Run \"${ctx.login}\" to log in.\\n`\n }\n return emitError(io, { body: errorBody(e), text, exitCode: exitCodeOf(e), json }, ctx.formatter)\n}\n\nfunction errorBody(error: unknown): Record<string, unknown> {\n if (error instanceof RemoteExecutionError) return error.body\n if (\n error instanceof RemoteTransportError ||\n error instanceof RemoteRpcError ||\n error instanceof RemoteInputRequiredError ||\n error instanceof OAuthFlowError\n ) {\n const body: Record<string, unknown> = { code: \"REMOTE_ERROR\", message: error.message }\n if (error instanceof RemoteRpcError) body.rpc = { code: error.code, status: error.status, data: error.data }\n return body\n }\n return errorJson(error)\n}\n\nfunction usageError(message: string): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\"INVALID_ARGUMENT\", message, {\n command: \"\",\n missing_fields: [],\n issues: [{ path: \"\", code: \"unknown_flag\", message }],\n expected_schema: {},\n examples: [],\n })\n}\n\n/* MRTR: InputRequiredResult → 프롬프트 → inputResponses */\n\n/**\n * elicitation/create (form) 만 처리 (clientCapabilities = elicitation.form).\n * requestedSchema 가 boolean 속성 하나 = 확인: --yes → 승인, TTY → [y/N], 그 외 INPUT_UNAVAILABLE.\n * 그 외 form = TTY 에서 필드별 입력 (스키마 모양으로 변환), TTY 없음 = INPUT_UNAVAILABLE.\n * 응답 = { action: \"accept\", content }. 이번 라운드 요청에 대한 응답만 보낸다\n */\nfunction inputHandler(\n io: CliIo,\n lines: LineReader,\n yes: boolean,\n command: string,\n signal: AbortSignal,\n): NonNullable<CallToolOptions[\"onInputRequired\"]> {\n const unavailable = (message: string, hint: string) =>\n new MextError(\"INPUT_UNAVAILABLE\", `${command} asked \"${message}\", but stdin is not a terminal.${hint}`, { command })\n const ask = async (prompt: string): Promise<string> => {\n const answer = await lines.question(prompt, signal)\n if (signal.aborted) throw new CliInterrupted()\n return answer ?? \"\"\n }\n return async (required: InputRequired): Promise<InputResponses> => {\n const out: InputResponses = {}\n for (const [key, request] of Object.entries(required.inputRequests ?? {})) {\n const params = isRecord(request.params) ? request.params : {}\n const message = typeof params.message === \"string\" ? params.message : \"Input required\"\n if (request.method !== \"elicitation/create\") {\n throw new RemoteTransportError(`${command}: unsupported input request ${request.method}.`)\n }\n if (params.mode === \"url\") {\n if (!io.isTTY) throw unavailable(message, \" Run it in an interactive terminal.\")\n await ask(`${message}\\n ${String(params.url)}\\nPress Enter when done. `)\n out[key] = { action: \"accept\" }\n continue\n }\n const schema = isRecord(params.requestedSchema) ? params.requestedSchema : { type: \"object\", properties: {} }\n const confirmKey = confirmField(schema)\n if (confirmKey !== undefined) {\n if (yes) {\n out[key] = { action: \"accept\", content: { [confirmKey]: true } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Pass --yes to approve.\")\n const answer = await ask(`${message} [y/N] `)\n out[key] = { action: \"accept\", content: { [confirmKey]: /^y(es)?$/i.test(answer.trim()) } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Run it in an interactive terminal.\")\n io.stderr.write(`${message}\\n`)\n const spec = cliSpecFromJsonSchema(schema)\n const content: Record<string, unknown> = {}\n for (const f of spec.fields) {\n const answer = await ask(` ${f.key}${f.required ? \"\" : \" (optional)\"}: `)\n if (answer === \"\") continue\n if (f.kind.type === \"array\") {\n const kind = f.kind\n content[f.key] = answer.split(\",\").map((s) => {\n const r = coerceValue(kind, s.trim())\n return r.ok ? r.value : s\n })\n continue\n }\n const r = coerceValue(f.kind, answer)\n content[f.key] = r.ok ? r.value : answer\n }\n out[key] = { action: \"accept\", content }\n }\n return out\n }\n}\n\n/** requestedSchema 의 속성이 boolean 하나면 그 키 (확인 요청) */\nfunction confirmField(schema: Record<string, unknown>): string | undefined {\n const props = schema.properties\n if (!isRecord(props)) return undefined\n const keys = Object.keys(props)\n if (keys.length !== 1) return undefined\n const p = props[keys[0]!]\n return isRecord(p) && p.type === \"boolean\" ? keys[0] : undefined\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/client/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { COMMAND, type Command } from \"../command.ts\"\nimport { MextError, type MextErrorCode, type MextErrorDetails } from \"../errors.ts\"\nimport { isSegment } from \"../ids.ts\"\nimport type { CommandHelp, Help } from \"../mcp/help.ts\"\nimport type { NamespaceInfo, RegisteredCommand, Registry } from \"../registry.ts\"\nimport {\n createRemoteClient,\n isRecord,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n type CallToolOptions,\n type CallToolResult,\n type InputRequired,\n type InputResponses,\n type RemoteClient,\n type RemoteTool,\n} from \"../remote/client.ts\"\nimport { credentialStore, envPrefix, type CredentialStore, type StoredCredentials } from \"../remote/credentials.ts\"\nimport { isExpired, OAuthFlowError, refreshCredentials } from \"../remote/oauth.ts\"\nimport { cliSpecFromJsonSchema, coerceValue, defineCliSpec, parseArgs } from \"../cli/args.ts\"\nimport { cliPath, renderHelp } from \"../cli/help.ts\"\nimport { askUrl } from \"../cli/ask-url.ts\"\nimport { createLineReader, readAll, type CliIo, type LineReader } from \"../cli/io.ts\"\nimport {\n CliInterrupted,\n emitError,\n EXIT,\n errorJson,\n exitCodeOf,\n formatError,\n formatJson,\n formatProgress,\n formatResult,\n type CliErrorFormatter,\n} from \"../cli/output.ts\"\nimport { MANIFEST_HASH_META_KEY, TOOLS_META_KEY } from \"../mcp/constants.ts\"\nimport { VERSION } from \"../version.ts\"\nimport { openSchema, schemaCacheDir, schemaCacheFile, type FetchedHelp, type Schema, type ToolListing } from \"./cache.ts\"\nimport { manifestFromTools, manifestHelp, type ClientManifest } from \"./manifest.ts\"\nimport { awaitTask, formatTaskStatus, isTaskResult, RemoteTaskError } from \"./task.ts\"\n\n/**\n * 원격 실행 공용 runner: mext run --url (bin = mext) 과 고객 CLI (bin = cli.bin) 가 같은 코드 경로.\n * 서버 MCP 엔드포인트의 dispatcher 도구 (execute · split 의 query · mutate) 또는 명령어별 도구 (command 노출, §12.2) 호출.\n * 노출 방식 = 번들 형태의 내장 manifest tools, 범용 = server/discover _meta[\"dev.mext/tools\"]. 권한 검사는 서버만.\n * 경로 해석 · help · 플래그 파싱 = HelpSource (캐시 · 내장 manifest · 서버 help, client/cache.ts) 의 입력 스키마 (JSON Schema).\n * 로컬 파싱 실패 (UNKNOWN_COMMAND · INVALID_ARGUMENT) = 서버 help 로 1회 재시도. tools/call 결과의 manifestHash 로 drift 감지.\n * 토큰 = <BIN>_TOKEN, 없으면 저장된 토큰 (<bin> login). 출력 · exit code 는 로컬 모드와 같다.\n * tasks 확장 선언 (§12.6): task 응답 = 종료까지 폴링 (client/task.ts), 결과 처리는 동기와 같다.\n *\n * 이 모듈 (와 import 대상) 은 고객 CLI 번들에 들어간다: Zod · MCP 서버 SDK · 핸들러 · 스캔 · 빌드 코드 import 금지.\n */\n\nexport interface RemoteRunOptions {\n /** 실행 파일 이름. 토큰 환경변수 (<BIN>_TOKEN) · 자격 증명 위치 (credentialStore bin) · clientInfo.name */\n bin: string\n /** MCP 엔드포인트 */\n url: string\n /** help · 오류 안내의 명령 접두. \"mext run --url <url>\" · \"myapp\" */\n prog: string\n /** login 안내 명령. \"mext login --url <url>\" · \"myapp login\" */\n login: string\n /** clientInfo.version */\n version: string\n /**\n * 번들 형태: 내장 manifest 로 help · 경로 해석 · 플래그 파싱 (help 에 네트워크 없음, 명령어 실행만 tools/list · tools/call).\n * 없음 = 범용 형태: 서버 help 조회\n */\n manifest?: ClientManifest\n /** 내장 manifest 의 manifestHash (빌드 시). manifest 와 같이 지정 */\n manifestHash?: string\n /** 사람용 루트 help 뒤에 붙일 텍스트 (고객 CLI 의 login · logout · mcp install 목록) */\n rootHelpFooter?: string\n /** 오류 출력 · exit code 커스텀 (cli.errors). 없음 = mext 기본 */\n formatError?: CliErrorFormatter\n}\n\n/** help 출처. 서버 (tools/list → dispatcher help 호출) · 내장 manifest · 스키마 캐시 (client/cache.ts Schema) */\nexport interface HelpSource {\n /** 대상 (\"\" = 루트) → help. 없는 대상 = MextError UNKNOWN_COMMAND */\n help(target: string): Promise<Help>\n}\n\nexport async function runRemote(options: RemoteRunOptions, argv: readonly string[], io: CliIo): Promise<number> {\n const { url, prog } = options\n const tokenEnv = `${envPrefix(options.bin)}_TOKEN`\n const ctx: ReportContext = {\n login: options.login,\n tokenEnv,\n auth: undefined,\n footer: options.rootHelpFooter,\n formatter: options.formatError,\n }\n const lead = { json: false, yes: false, help: false }\n let i = 0\n for (; i < argv.length; i++) {\n const tok = argv[i]!\n if (!tok.startsWith(\"-\") || tok === \"-\") break\n if (tok === \"--json\") lead.json = true\n else if (tok === \"--yes\") lead.yes = true\n else if (tok === \"--help\" || tok === \"-h\") lead.help = true\n else return report(usageError(`unknown flag ${tok} before the command`), io, prog, argv.includes(\"--json\"), ctx)\n }\n const rest = argv.slice(i)\n const beforeDashDash = rest.indexOf(\"--\") < 0 ? rest : rest.slice(0, rest.indexOf(\"--\"))\n const json = lead.json || beforeDashDash.includes(\"--json\")\n\n const controller = new AbortController()\n const onAbort = (): void => controller.abort(io.signal?.reason)\n if (io.signal?.aborted) onAbort()\n io.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const lines = createLineReader(io)\n let session: Session | undefined\n let schema: Schema | undefined\n try {\n if (!/^https?:\\/\\//i.test(url)) throw usageError(`--url must be an http(s) URL (got \"${url}\")`)\n session = openSession(options, tokenEnv, io, controller.signal)\n const s = session\n schema = await openRunSchema(options, s, ctx, io)\n const source: HelpSource = schema\n const wantsHelp = lead.help || beforeDashDash.includes(\"--help\") || beforeDashDash.includes(\"-h\")\n let stdin: Promise<string> | undefined\n const readStdin = (): Promise<string> => (stdin ??= readAll(io.stdin))\n\n // 경로 해석 · 플래그 파싱 (로컬). 실패하면 서버 help 로 1회 재시도\n const plan = async (): Promise<Plan> => {\n // <prog> help [target...]\n if (rest[0] === \"help\") {\n const tokens = rest.slice(1).filter((t) => !t.startsWith(\"-\"))\n const resolved = await resolveRemotePath(source, tokens)\n if (resolved.consumed < tokens.length) throw await unknownAt(source, resolved, tokens.slice(resolved.consumed))\n return { kind: \"help\", help: resolved.help }\n }\n const resolved = await resolveRemotePath(source, rest)\n const { help, consumed } = resolved\n const command = help.kind === \"command\" ? help : help.kind === \"namespace\" ? help.command : undefined\n const next = rest[consumed]\n const acceptsPositional = command !== undefined && command.positional.length > 0\n if (help.kind !== \"command\" && next !== undefined && !next.startsWith(\"-\") && !acceptsPositional) {\n throw await unknownAt(source, resolved, rest.slice(consumed))\n }\n if (wantsHelp) return { kind: \"help\", help }\n if (!command) return { kind: \"namespace\", help }\n const entry = entryFromHelp(command)\n const parsed = await parseArgs(entry, rest.slice(consumed), { readStdin })\n return { kind: \"run\", command, entry, input: parsed.input, yes: parsed.yes }\n }\n let planned: Plan\n try {\n planned = await plan()\n } catch (error) {\n if (!isLocalParseFailure(error) || !schema.refetch()) throw error\n try {\n planned = await plan()\n } catch (retryError) {\n // 재조회 실패 (오프라인 등) = 원래 로컬 오류\n if (retryError instanceof RemoteTransportError || retryError instanceof RemoteRpcError) throw error\n throw retryError\n }\n }\n\n if (planned.kind === \"help\") return printHelp(planned.help, io, prog, json, ctx)\n if (planned.kind === \"namespace\") {\n const { help } = planned\n const id = help.kind === \"namespace\" ? help.id : \"\"\n const error = new MextError(\n \"UNKNOWN_COMMAND\",\n id === \"\" ? \"No command given.\" : `\"${cliPath(id)}\" is a namespace. Specify a command.`,\n { command: id, suggested: [], usage: id === \"\" ? \"help\" : `help ${id}` },\n )\n if (json) return report(error, io, prog, true, ctx)\n const text = `${formatError(error, prog)}\\n${helpText(help, prog, ctx)}`\n return emitError(io, { body: errorBody(error), text, exitCode: EXIT.usage, json: false }, ctx.formatter)\n }\n\n const { command, entry } = planned\n const yes = lead.yes || planned.yes\n // command 노출 (§12.2) = 도구 이름 = 정식 ID, 인자 = input. 그 외 = dispatcher { command, args }\n const exposed = (await exposureOf(options, schema)) === \"command\"\n const tool = exposed ? { name: entry.id, inputSchema: command.inputSchema } : commandTool(dispatcherOf(url, await schema.tools()), command)\n const input = planned.input as Record<string, unknown>\n const args = exposed ? input : { command: entry.id, args: input }\n const onInputRequired = inputHandler(io, lines, yes, json, entry.id, controller.signal)\n let result = await s.call((o) =>\n s.client.callTool(tool, args, {\n ...o,\n progressToken: \"mext-cli\",\n onNotification: (method, params) => {\n if (method !== \"notifications/progress\" || typeof params.progress !== \"number\") return\n const update: { progress: number; total?: number; message?: string } = { progress: params.progress }\n if (typeof params.total === \"number\") update.total = params.total\n if (typeof params.message === \"string\") update.message = params.message\n io.stderr.write(formatProgress(update))\n },\n onInputRequired,\n }),\n )\n // tasks 확장 (§12.6): 종료까지 폴링 → completed result = 동기 결과와 같은 경로 (출력 · exit code)\n if (isTaskResult(result)) {\n result = await awaitTask(result, {\n client: s.client,\n call: (fn) => s.call(fn),\n signal: controller.signal,\n onInputRequired,\n onStatus: (message) => io.stderr.write(formatTaskStatus(message)),\n })\n }\n // drift: 이번 결과는 그대로, 다르면 캐시 stale (다음 실행에서 서버 help)\n schema.observe(metaHash(result))\n if (result.isError === true) throw toolError(result, ctx)\n const value = result.structuredContent === undefined ? textValue(result) : result.structuredContent\n io.stdout.write(json ? formatJson(value) : formatResult(value))\n return EXIT.ok\n } catch (error) {\n if (session) ctx.auth = session.auth\n if (controller.signal.aborted) return report(new CliInterrupted(), io, prog, json, ctx)\n return report(error, io, prog, json, ctx)\n } finally {\n io.signal?.removeEventListener(\"abort\", onAbort)\n lines.close()\n await schema?.save()\n }\n}\n\n/** 로컬 경로 해석 · 플래그 파싱 결과 */\ntype Plan =\n | { kind: \"help\"; help: Help }\n | { kind: \"namespace\"; help: Help }\n | { kind: \"run\"; command: CommandHelp; entry: RegisteredCommand; input: unknown; yes: boolean }\n\n/** 서버 도구 노출 방식: 번들 형태 = 내장 manifest tools, 범용 = server/discover _meta[\"dev.mext/tools\"] (스키마 캐시) */\nasync function exposureOf(options: RemoteRunOptions, schema: Schema): Promise<string | undefined> {\n return options.manifest ? options.manifest.tools : schema.exposure()\n}\n\n/** 서버 help 재조회 대상 로컬 오류 */\nfunction isLocalParseFailure(error: unknown): boolean {\n return error instanceof MextError && (error.code === \"UNKNOWN_COMMAND\" || error.code === \"INVALID_ARGUMENT\")\n}\n\n/** 결과 _meta[\"dev.mext/manifestHash\"] */\nfunction metaHash(result: CallToolResult): string | undefined {\n const meta = result._meta\n const value = isRecord(meta) ? meta[MANIFEST_HASH_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n}\n\n/** 이번 실행의 스키마 상태: 캐시 파일 (<BIN>_CACHE_DIR · XDG · HOME) · 내장 manifest · 서버 help */\nfunction openRunSchema(options: RemoteRunOptions, s: Session, ctx: ReportContext, io: CliIo): Promise<Schema> {\n const dir = schemaCacheDir(options.bin, io.env)\n return openSchema({\n file: dir === undefined ? undefined : schemaCacheFile(dir, options.url),\n url: options.url,\n client: { bin: options.bin, version: options.version, mext: VERSION },\n ...(options.manifest && options.manifestHash !== undefined\n ? { embedded: { manifest: options.manifest, hash: options.manifestHash } }\n : {}),\n fetchHelp: serverHelpFetcher(s, ctx, options.manifest?.tools),\n fetchTools: async () => {\n // 범용 형태 = 노출 방식을 server/discover 로 (번들 = 내장 manifest, 조회 안 함).\n // 순차: 401 → refresh 1회 규칙 (Session.call) 을 동시 요청이 나눠 쓰지 않게\n const r = await s.call((o) => s.client.listToolsResult(o))\n const exposure = options.manifest ? undefined : await discoverExposure(s)\n if ((options.manifest?.tools ?? exposure) !== \"command\") dispatcherOf(s.url, r.tools)\n return {\n tools: r.tools,\n ...(r.ttlMs !== undefined ? { ttlMs: r.ttlMs } : {}),\n ...(exposure !== undefined ? { exposure } : {}),\n }\n },\n warn: (message) => io.stderr.write(message),\n })\n}\n\n/* 세션: 클라이언트 · 토큰 · dispatcher 도구 */\n\n/** 토큰 출처. undefined = 아직 요청 전 (저장분 미조회) */\ntype AuthSource = \"env\" | \"stored\" | \"none\" | undefined\n\ninterface Tools {\n /** tools/list 결과 */\n list: RemoteTool[]\n /** help 호출 도구 (execute 또는 split 의 query) */\n helpTool: RemoteTool\n}\n\ninterface Session {\n url: string\n client: RemoteClient\n /** 요청한 토큰 출처 (첫 요청 때 결정) */\n readonly auth: AuthSource\n /** 401 이면 refresh_token 으로 1회 갱신 후 재시도 */\n call<T>(fn: (options: { signal: AbortSignal }) => Promise<T>): Promise<T>\n}\n\n/** 네트워크 · 키체인 접근은 첫 요청까지 미룬다 (번들 형태의 help 는 둘 다 없음) */\nfunction openSession(options: RemoteRunOptions, tokenEnv: string, io: CliIo, signal: AbortSignal): Session {\n const { url } = options\n const envToken = io.env[tokenEnv] !== undefined && io.env[tokenEnv] !== \"\" ? io.env[tokenEnv] : undefined\n const store: CredentialStore | undefined =\n envToken === undefined ? credentialStore({ env: io.env, bin: options.bin }) : undefined\n let stored: StoredCredentials | undefined\n let auth: AuthSource = envToken !== undefined ? \"env\" : undefined\n let refreshed = false\n const refresh = async (): Promise<boolean> => {\n if (!store || !stored?.refresh_token || refreshed) return false\n refreshed = true\n try {\n stored = await refreshCredentials(stored)\n await store.set(url, stored).catch(() => {})\n return true\n } catch {\n return false\n }\n }\n let loading: Promise<void> | undefined\n const load = (): Promise<void> =>\n (loading ??= (async () => {\n if (!store) return\n stored = await store.get(url).catch(() => undefined)\n if (stored && isExpired(stored)) await refresh()\n auth = stored ? \"stored\" : \"none\"\n })())\n const client = createRemoteClient({\n url,\n clientInfo: { name: options.bin, version: options.version },\n token: async () => {\n await load()\n return envToken ?? stored?.access_token\n },\n })\n const call = async <T>(fn: (o: { signal: AbortSignal }) => Promise<T>): Promise<T> => {\n try {\n return await fn({ signal })\n } catch (error) {\n if (error instanceof RemoteUnauthorizedError && (await refresh())) return fn({ signal })\n throw error\n }\n }\n return {\n url,\n client,\n get auth() {\n return auth\n },\n call,\n }\n}\n\n/** tools/list 결과 → dispatcher 도구 (execute 또는 query · mutate). 없으면 RemoteTransportError */\nfunction dispatcherOf(url: string, list: RemoteTool[]): Tools {\n const execute = list.find((t) => t.name === \"execute\")\n const query = list.find((t) => t.name === \"query\")\n const helpTool = execute ?? query\n if (!helpTool || (!execute && !list.some((t) => t.name === \"mutate\"))) {\n throw new RemoteTransportError(`${url} does not expose mext dispatcher tools (execute, or query and mutate).`)\n }\n return { list, helpTool }\n}\n\n/** 명령어를 호출할 도구: help 의 tool (split) → execute → readOnly 면 query, 아니면 mutate */\nfunction commandTool(tools: Tools, command: CommandHelp): RemoteTool {\n const byName = (name: string | undefined) => (name === undefined ? undefined : tools.list.find((t) => t.name === name))\n return byName(command.tool) ?? byName(\"execute\") ?? byName(command.readOnly ? \"query\" : \"mutate\") ?? tools.helpTool\n}\n\n/** server/discover _meta[\"dev.mext/tools\"]. 없음 · JSON-RPC 오류 (discover 없는 서버 등) = undefined (dispatcher) */\nasync function discoverExposure(s: Session): Promise<string | undefined> {\n try {\n const result = await s.call((o) => s.client.request(\"server/discover\", {}, o))\n const value = isRecord(result._meta) ? result._meta[TOOLS_META_KEY] : undefined\n return typeof value === \"string\" ? value : undefined\n } catch (error) {\n if (error instanceof RemoteRpcError) return undefined\n throw error\n }\n}\n\n/**\n * 서버 help. dispatcher = help 호출 (tools/call), command 노출 = tools/list 로 만든 manifest 의 help (help 도구 없음).\n * UNKNOWN_COMMAND = 캐시할 결과, 그 외 오류 = throw\n */\nfunction serverHelpFetcher(\n s: Session,\n ctx: ReportContext,\n embeddedExposure: string | undefined,\n): (target: string, listing: () => Promise<ToolListing>) => Promise<FetchedHelp> {\n return async (target, listing) => {\n const { tools, exposure } = await listing()\n if ((embeddedExposure ?? exposure) === \"command\") {\n try {\n return { value: { help: manifestHelp(manifestFromTools(tools), target) }, hash: undefined }\n } catch (error) {\n if (error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") return { value: { error: error.toJSON() }, hash: undefined }\n throw error\n }\n }\n const { helpTool } = dispatcherOf(s.url, tools)\n const args = target === \"\" ? { command: \"help\" } : { command: \"help\", args: { target } }\n const result = await s.call((o) => s.client.callTool(helpTool, args, o))\n const hash = metaHash(result)\n if (result.isError === true) {\n const error = toolError(result, ctx)\n if (error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") return { value: { error: error.toJSON() }, hash }\n throw error\n }\n const value = result.structuredContent\n if (!isRecord(value) || (value.kind !== \"root\" && value.kind !== \"namespace\" && value.kind !== \"command\")) {\n throw new RemoteTransportError(`${s.url} returned an unexpected help result.`)\n }\n return { value: { help: value as unknown as Help }, hash }\n }\n}\n\n/** 번들 형태: 내장 manifest (네트워크 없음) */\nexport function manifestHelpSource(manifest: ClientManifest): HelpSource {\n return { help: async (target) => manifestHelp(manifest, target) }\n}\n\n/* 경로 해석: 앞쪽 세그먼트 토큰의 가장 긴 접두 (로컬 resolvePath 와 같은 결과) */\n\ninterface ResolvedPath {\n help: Help\n consumed: number\n /** 가장 긴 후보의 UNKNOWN_COMMAND (있으면) */\n unknown: MextError | undefined\n}\n\nasync function resolveRemotePath(source: HelpSource, tokens: readonly string[]): Promise<ResolvedPath> {\n const segs: string[] = []\n for (const t of tokens) {\n if (!isSegment(t)) break\n segs.push(t)\n }\n let unknown: MextError | undefined\n for (let k = segs.length; k >= 0; k--) {\n try {\n return { help: await source.help(segs.slice(0, k).join(\".\")), consumed: k, unknown }\n } catch (error) {\n if (k > 0 && error instanceof MextError && error.code === \"UNKNOWN_COMMAND\") {\n unknown ??= error\n continue\n }\n throw error\n }\n }\n throw new Error(\"unreachable\")\n}\n\n/** 해석되지 않은 경로 → UNKNOWN_COMMAND (suggested · usage) */\nasync function unknownAt(source: HelpSource, resolved: ResolvedPath, tail: readonly string[]): Promise<MextError> {\n if (resolved.unknown) return resolved.unknown\n const id = resolved.help.kind === \"root\" ? \"\" : resolved.help.id\n const first = tail.find((t) => !t.startsWith(\"-\"))\n const candidate = [id, first ?? \"\"].filter((x) => x !== \"\").join(\".\")\n try {\n await source.help(candidate)\n } catch (error) {\n if (error instanceof MextError) return error\n throw error\n }\n return new MextError(\"UNKNOWN_COMMAND\", `Unknown command \"${candidate}\".`, { command: candidate, suggested: [], usage: \"help\" })\n}\n\n/* help → 로컬 렌더러용 Registry (같은 help 텍스트) */\n\n/** 원격 명령어의 input 자리. CLI 필드는 defineCliSpec (JSON Schema 분석) 이 정하므로 Zod 스키마가 필요 없다 */\nconst REMOTE_INPUT = { _zod: { def: { shape: {} } } } as unknown as Command[\"input\"]\n\nfunction commandOf(meta: {\n description: string\n readOnly: boolean\n destructive: boolean\n requiresConfirmation: boolean\n scopes?: readonly string[]\n examples?: readonly unknown[]\n positional?: readonly string[]\n}): Command {\n return {\n [COMMAND]: true,\n description: meta.description,\n input: REMOTE_INPUT,\n output: undefined,\n readOnly: meta.readOnly,\n destructive: meta.destructive,\n requiresConfirmation: meta.requiresConfirmation,\n scopes: [...(meta.scopes ?? [])],\n examples: [...(meta.examples ?? [])] as Command[\"examples\"],\n positional: [...(meta.positional ?? [])],\n aliases: [],\n execute() {\n throw new Error(\"remote command\")\n },\n }\n}\n\n/** 원격 명령어 help → RegisteredCommand (CLI 필드 = inputSchema 분석) */\nexport function entryFromHelp(help: CommandHelp): RegisteredCommand {\n const entry: RegisteredCommand = {\n id: help.id,\n command: commandOf(help),\n aliases: [...help.aliases],\n file: undefined,\n inputSchema: help.inputSchema,\n outputSchema: help.outputSchema,\n }\n defineCliSpec(entry, cliSpecFromJsonSchema(help.inputSchema, help.positional))\n return entry\n}\n\nfunction registryFromHelp(help: Help): Registry {\n const commands = new Map<string, RegisteredCommand>()\n const aliases = new Map<string, string>()\n const namespaces = new Map<string, NamespaceInfo>()\n if (help.kind === \"command\") {\n const entry = entryFromHelp(help)\n commands.set(entry.id, entry)\n for (const a of entry.aliases) aliases.set(a, entry.id)\n namespaces.set(\"\", { id: \"\", description: undefined, commands: [], namespaces: [] })\n return { commands, aliases, namespaces }\n }\n const id = help.kind === \"root\" ? \"\" : help.id\n namespaces.set(id, {\n id,\n description: help.description,\n commands: help.commands.map((c) => c.id),\n namespaces: help.namespaces.map((n) => n.id),\n })\n for (const n of help.namespaces) namespaces.set(n.id, { id: n.id, description: n.description, commands: [], namespaces: [] })\n for (const c of help.commands) {\n commands.set(c.id, {\n id: c.id,\n command: commandOf(c),\n aliases: [],\n file: undefined,\n inputSchema: {},\n outputSchema: undefined,\n })\n }\n if (help.kind === \"namespace\" && help.command) commands.set(help.command.id, entryFromHelp(help.command))\n return { commands, aliases, namespaces }\n}\n\n/** 사람용 help 텍스트. 루트면 footer (고객 CLI 내장 명령) 를 붙인다 */\nfunction helpText(help: Help, prog: string, ctx: ReportContext): string {\n const target = help.kind === \"root\" ? \"\" : help.id\n const text = renderHelp(registryFromHelp(help), target, { prog })\n return help.kind === \"root\" && ctx.footer ? `${text}\\n${ctx.footer}` : text\n}\n\n/** --help --json = help 결과 그대로 (서버 help 의 structuredContent · 내장 manifest help) */\nfunction printHelp(help: Help, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n io.stdout.write(json ? formatJson(help) : helpText(help, prog, ctx))\n return EXIT.ok\n}\n\n/* 결과 · 오류 */\n\nconst MEXT_CODES: readonly MextErrorCode[] = [\n \"UNKNOWN_COMMAND\",\n \"INVALID_ARGUMENT\",\n \"UNAUTHENTICATED\",\n \"PERMISSION_DENIED\",\n \"INPUT_UNAVAILABLE\",\n]\n\n/** 서버 핸들러 예외 등 mext 구조화 오류 외의 도구 오류. --json = 서버 오류 본문 그대로, exit 1 */\nexport class RemoteExecutionError extends Error {\n readonly body: Record<string, unknown>\n constructor(body: Record<string, unknown>) {\n super(typeof body.message === \"string\" ? body.message : \"Remote command failed.\")\n this.name = \"RemoteExecutionError\"\n this.body = body\n }\n}\n\ninterface ReportContext {\n /** login 안내 명령 */\n login: string\n /** <BIN>_TOKEN */\n tokenEnv: string\n auth: AuthSource\n /** 루트 help footer */\n footer?: string | undefined\n formatter?: CliErrorFormatter | undefined\n}\n\n/** isError 결과 → MextError (code 가 mext 구조화 오류면) 또는 RemoteExecutionError */\nfunction toolError(result: CallToolResult, ctx: ReportContext): Error {\n const sc = result.structuredContent\n const body = isRecord(sc) && isRecord(sc.error) ? sc.error : undefined\n if (!body) return new RemoteExecutionError({ code: \"EXECUTION_FAILED\", message: textValue(result) ?? \"Remote command failed.\" })\n const { code, message, ...details } = body\n if (typeof code === \"string\" && (MEXT_CODES as readonly string[]).includes(code)) {\n const text = typeof message === \"string\" ? message : code\n if (code === \"UNAUTHENTICATED\") {\n return new MextError(\"UNAUTHENTICATED\", text, { ...(details as MextErrorDetails[\"UNAUTHENTICATED\"]), login: ctx.login })\n }\n return new MextError(code as MextErrorCode, text, details as never)\n }\n return new RemoteExecutionError(body)\n}\n\nfunction textValue(result: CallToolResult): string | undefined {\n const texts = (result.content ?? []).flatMap((c) =>\n isRecord(c) && c.type === \"text\" && typeof c.text === \"string\" ? [c.text] : [],\n )\n return texts.length > 0 ? texts.join(\"\\n\") : undefined\n}\n\n/** 401 → UNAUTHENTICATED (login 안내 포함) */\nfunction unauthenticatedFrom(error: RemoteUnauthorizedError, ctx: ReportContext): MextError {\n const data = isRecord(error.data) ? error.data : {}\n const reason =\n data.reason === \"invalid_token\" || data.reason === \"missing_token\"\n ? data.reason\n : error.challenge.error === \"invalid_token\"\n ? \"invalid_token\"\n : \"missing_token\"\n let message = typeof data.message === \"string\" ? data.message : error.message\n if (ctx.auth === \"env\") message += ` ${ctx.tokenEnv} was rejected.`\n return new MextError(\"UNAUTHENTICATED\", message, { reason, login: ctx.login })\n}\n\nfunction report(error: unknown, io: CliIo, prog: string, json: boolean, ctx: ReportContext): number {\n let e = error\n if (e instanceof RemoteUnauthorizedError) e = unauthenticatedFrom(e, ctx)\n let text = formatError(e, prog)\n if (e instanceof MextError && e.code === \"PERMISSION_DENIED\" && ctx.auth === \"none\") {\n const reason = (e.details as MextErrorDetails[\"PERMISSION_DENIED\"]).reason\n if (reason === \"anonymous\") text += `Run \"${ctx.login}\" to log in.\\n`\n }\n return emitError(io, { body: errorBody(e), text, exitCode: exitCodeOf(e), json }, ctx.formatter)\n}\n\nfunction errorBody(error: unknown): Record<string, unknown> {\n if (error instanceof RemoteExecutionError) return error.body\n if (\n error instanceof RemoteTransportError ||\n error instanceof RemoteRpcError ||\n error instanceof RemoteInputRequiredError ||\n error instanceof RemoteTaskError ||\n error instanceof OAuthFlowError\n ) {\n const body: Record<string, unknown> = { code: \"REMOTE_ERROR\", message: error.message }\n if (error instanceof RemoteRpcError) body.rpc = { code: error.code, status: error.status, data: error.data }\n if (error instanceof RemoteTaskError) {\n body.task = { taskId: error.taskId, status: error.status, ...(error.error ? { error: error.error } : {}) }\n }\n return body\n }\n return errorJson(error)\n}\n\nfunction usageError(message: string): MextError<\"INVALID_ARGUMENT\"> {\n return new MextError(\"INVALID_ARGUMENT\", message, {\n command: \"\",\n missing_fields: [],\n issues: [{ path: \"\", code: \"unknown_flag\", message }],\n expected_schema: {},\n examples: [],\n })\n}\n\n/* MRTR: InputRequiredResult → 프롬프트 → inputResponses */\n\n/**\n * elicitation/create 처리 (clientCapabilities = elicitation.form · url).\n * mode url = 로컬 ctx.ask url 과 같음 (askUrl: --yes 미적용, TTY 없음 · --json = INPUT_UNAVAILABLE). accept · decline.\n * requestedSchema 가 boolean 속성 하나 = 확인: --yes → 승인, TTY → [y/N], 그 외 INPUT_UNAVAILABLE.\n * 그 외 form = TTY 에서 필드별 입력 (스키마 모양으로 변환), TTY 없음 = INPUT_UNAVAILABLE.\n * 응답 = { action: \"accept\", content }. 이번 라운드 요청에 대한 응답만 보낸다\n */\nfunction inputHandler(\n io: CliIo,\n lines: LineReader,\n yes: boolean,\n json: boolean,\n command: string,\n signal: AbortSignal,\n): NonNullable<CallToolOptions[\"onInputRequired\"]> {\n const unavailable = (message: string, hint: string) =>\n new MextError(\"INPUT_UNAVAILABLE\", `${command} asked \"${message}\", but stdin is not a terminal.${hint}`, { command })\n const ask = async (prompt: string): Promise<string> => {\n const answer = await lines.question(prompt, signal)\n if (signal.aborted) throw new CliInterrupted()\n return answer ?? \"\"\n }\n return async (required: InputRequired): Promise<InputResponses> => {\n const out: InputResponses = {}\n for (const [key, request] of Object.entries(required.inputRequests ?? {})) {\n const params = isRecord(request.params) ? request.params : {}\n const message = typeof params.message === \"string\" ? params.message : \"Input required\"\n if (request.method !== \"elicitation/create\") {\n throw new RemoteTransportError(`${command}: unsupported input request ${request.method}.`)\n }\n if (params.mode === \"url\") {\n if (typeof params.url !== \"string\" || !/^https?:\\/\\//i.test(params.url)) {\n throw new RemoteTransportError(`${command}: url input request without an http(s) url.`)\n }\n const accepted = await askUrl(io, lines, { command, message, url: params.url }, { json, signal })\n out[key] = { action: accepted ? \"accept\" : \"decline\" }\n continue\n }\n const schema = isRecord(params.requestedSchema) ? params.requestedSchema : { type: \"object\", properties: {} }\n const confirmKey = confirmField(schema)\n if (confirmKey !== undefined) {\n if (yes) {\n out[key] = { action: \"accept\", content: { [confirmKey]: true } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Pass --yes to approve.\")\n const answer = await ask(`${message} [y/N] `)\n out[key] = { action: \"accept\", content: { [confirmKey]: /^y(es)?$/i.test(answer.trim()) } }\n continue\n }\n if (!io.isTTY) throw unavailable(message, \" Run it in an interactive terminal.\")\n io.stderr.write(`${message}\\n`)\n const spec = cliSpecFromJsonSchema(schema)\n const content: Record<string, unknown> = {}\n for (const f of spec.fields) {\n const answer = await ask(` ${f.key}${f.required ? \"\" : \" (optional)\"}: `)\n if (answer === \"\") continue\n if (f.kind.type === \"array\") {\n const kind = f.kind\n content[f.key] = answer.split(\",\").map((s) => {\n const r = coerceValue(kind, s.trim())\n return r.ok ? r.value : s\n })\n continue\n }\n const r = coerceValue(f.kind, answer)\n content[f.key] = r.ok ? r.value : answer\n }\n out[key] = { action: \"accept\", content }\n }\n return out\n }\n}\n\n/** requestedSchema 의 속성이 boolean 하나면 그 키 (확인 요청) */\nfunction confirmField(schema: Record<string, unknown>): string | undefined {\n const props = schema.properties\n if (!isRecord(props)) return undefined\n const keys = Object.keys(props)\n if (keys.length !== 1) return undefined\n const p = props[keys[0]!]\n return isRecord(p) && p.type === \"boolean\" ? keys[0] : undefined\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { type CallToolOptions, type CallToolResult, type RemoteClient } from "../remote/client.ts";
2
+ /**
3
+ * CLI 원격의 tasks 확장 (§12.6): tools/call 이 CreateTaskResult (resultType "task") 를 돌려주면 종료까지 tasks/get 폴링.
4
+ * 간격 = 서버 pollIntervalMs (매 응답의 최신 값). 진행 표시 = statusMessage (바뀔 때만 onStatus).
5
+ * input_required = 동기 MRTR 과 같은 입력 처리 (onInputRequired) → tasks/update. 답한 키는 다시 묻지 않는다
6
+ * (실행 프로세스가 답을 읽기 전까지 tasks/get 이 같은 요청을 돌려준다).
7
+ * completed = result (동기 tools/call 결과와 같은 형태) 반환. failed · cancelled = RemoteTaskError.
8
+ * 종료 상태 전에 빠져나가면 (SIGINT · 입력 실패 · 연결 오류) tasks/cancel 1회 (best effort, 상한 cancelTimeoutMs) 후 원래 오류.
9
+ *
10
+ * 이 모듈은 고객 CLI 번들에 들어간다 (서버 SDK · Zod import 금지).
11
+ */
12
+ /** pollIntervalMs 가 없거나 형식이 아닐 때 (서버 기본과 같은 값) */
13
+ export declare const DEFAULT_POLL_INTERVAL_MS = 2000;
14
+ /** 빠져나갈 때 보내는 tasks/cancel 의 상한 */
15
+ export declare const CANCEL_TIMEOUT_MS = 5000;
16
+ /** 종료 상태가 failed · cancelled (이 CLI 가 취소하지 않음). failed = error (TASK_LOST 같은 프로토콜 오류) */
17
+ export declare class RemoteTaskError extends Error {
18
+ readonly taskId: string;
19
+ readonly status: string;
20
+ readonly error: Record<string, unknown> | undefined;
21
+ constructor(message: string, taskId: string, status: string, error?: Record<string, unknown>);
22
+ }
23
+ export interface AwaitTaskOptions {
24
+ client: RemoteClient;
25
+ /** 요청 래퍼 (401 refresh 1회 규칙 등). signal = 실행 중단 신호 (SIGINT) */
26
+ call<T>(fn: (options: {
27
+ signal: AbortSignal;
28
+ }) => Promise<T>): Promise<T>;
29
+ /** 실행 중단 신호. abort = tasks/cancel 후 abort reason throw */
30
+ signal: AbortSignal;
31
+ /** input_required 처리 (동기 MRTR 과 같은 handler) */
32
+ onInputRequired: NonNullable<CallToolOptions["onInputRequired"]>;
33
+ /** statusMessage 가 바뀔 때 */
34
+ onStatus?: (message: string) => void;
35
+ /** 빠져나갈 때 tasks/cancel 상한 (기본 CANCEL_TIMEOUT_MS) */
36
+ cancelTimeoutMs?: number;
37
+ }
38
+ /** tools/call 결과가 CreateTaskResult 인지 */
39
+ export declare function isTaskResult(result: CallToolResult): result is CallToolResult & {
40
+ taskId: string;
41
+ };
42
+ /** CreateTaskResult → 종료까지 폴링 → completed 의 result */
43
+ export declare function awaitTask(created: CallToolResult & {
44
+ taskId: string;
45
+ }, options: AwaitTaskOptions): Promise<CallToolResult>;
46
+ /** D4: 진행 표시 = statusMessage 그대로 stderr 한 줄 (동기 formatProgress 의 [p/t] 는 숫자가 없어 쓰지 않는다) */
47
+ export declare function formatTaskStatus(message: string): string;
@@ -0,0 +1,126 @@
1
+ import { isRecord, RemoteTransportError, } from "../remote/client.js";
2
+ /**
3
+ * CLI 원격의 tasks 확장 (§12.6): tools/call 이 CreateTaskResult (resultType "task") 를 돌려주면 종료까지 tasks/get 폴링.
4
+ * 간격 = 서버 pollIntervalMs (매 응답의 최신 값). 진행 표시 = statusMessage (바뀔 때만 onStatus).
5
+ * input_required = 동기 MRTR 과 같은 입력 처리 (onInputRequired) → tasks/update. 답한 키는 다시 묻지 않는다
6
+ * (실행 프로세스가 답을 읽기 전까지 tasks/get 이 같은 요청을 돌려준다).
7
+ * completed = result (동기 tools/call 결과와 같은 형태) 반환. failed · cancelled = RemoteTaskError.
8
+ * 종료 상태 전에 빠져나가면 (SIGINT · 입력 실패 · 연결 오류) tasks/cancel 1회 (best effort, 상한 cancelTimeoutMs) 후 원래 오류.
9
+ *
10
+ * 이 모듈은 고객 CLI 번들에 들어간다 (서버 SDK · Zod import 금지).
11
+ */
12
+ /** pollIntervalMs 가 없거나 형식이 아닐 때 (서버 기본과 같은 값) */
13
+ export const DEFAULT_POLL_INTERVAL_MS = 2_000;
14
+ /** 빠져나갈 때 보내는 tasks/cancel 의 상한 */
15
+ export const CANCEL_TIMEOUT_MS = 5_000;
16
+ const TERMINAL = new Set(["completed", "failed", "cancelled"]);
17
+ /** 종료 상태가 failed · cancelled (이 CLI 가 취소하지 않음). failed = error (TASK_LOST 같은 프로토콜 오류) */
18
+ export class RemoteTaskError extends Error {
19
+ taskId;
20
+ status;
21
+ error;
22
+ constructor(message, taskId, status, error) {
23
+ super(message);
24
+ this.name = "RemoteTaskError";
25
+ this.taskId = taskId;
26
+ this.status = status;
27
+ this.error = error;
28
+ }
29
+ }
30
+ /** tools/call 결과가 CreateTaskResult 인지 */
31
+ export function isTaskResult(result) {
32
+ return result.resultType === "task" && typeof result.taskId === "string";
33
+ }
34
+ /** CreateTaskResult → 종료까지 폴링 → completed 의 result */
35
+ export async function awaitTask(created, options) {
36
+ const { client, signal } = options;
37
+ const { taskId } = created;
38
+ let terminal = false;
39
+ try {
40
+ const answered = new Set();
41
+ let lastMessage;
42
+ let view = created;
43
+ let round = 0;
44
+ for (;;) {
45
+ const status = typeof view.status === "string" ? view.status : "working";
46
+ if (typeof view.statusMessage === "string" && view.statusMessage !== lastMessage) {
47
+ lastMessage = view.statusMessage;
48
+ if (lastMessage !== "")
49
+ options.onStatus?.(lastMessage);
50
+ }
51
+ if (TERMINAL.has(status)) {
52
+ terminal = true;
53
+ return terminalResult(taskId, status, view);
54
+ }
55
+ if (status === "input_required" && isRecord(view.inputRequests)) {
56
+ const pending = {};
57
+ for (const [key, request] of Object.entries(view.inputRequests)) {
58
+ if (!answered.has(key) && isRecord(request))
59
+ pending[key] = request;
60
+ }
61
+ if (Object.keys(pending).length > 0) {
62
+ const responses = await options.onInputRequired({ inputRequests: pending }, round++);
63
+ for (const key of Object.keys(pending))
64
+ answered.add(key);
65
+ await options.call((o) => client.updateTask(taskId, responses, o));
66
+ view = await options.call((o) => client.getTask(taskId, o));
67
+ continue;
68
+ }
69
+ }
70
+ await sleep(pollInterval(view), signal);
71
+ view = await options.call((o) => client.getTask(taskId, o));
72
+ }
73
+ }
74
+ catch (error) {
75
+ if (!terminal)
76
+ await cancelQuietly(client, taskId, options.cancelTimeoutMs ?? CANCEL_TIMEOUT_MS);
77
+ if (signal.aborted)
78
+ throw signal.reason;
79
+ throw error;
80
+ }
81
+ }
82
+ /** D4: 진행 표시 = statusMessage 그대로 stderr 한 줄 (동기 formatProgress 의 [p/t] 는 숫자가 없어 쓰지 않는다) */
83
+ export function formatTaskStatus(message) {
84
+ return `${message}\n`;
85
+ }
86
+ function terminalResult(taskId, status, view) {
87
+ if (status === "completed") {
88
+ if (!isRecord(view.result))
89
+ throw new RemoteTransportError(`Task ${taskId} completed without a result.`);
90
+ return view.result;
91
+ }
92
+ if (status === "failed") {
93
+ const error = isRecord(view.error) ? view.error : undefined;
94
+ const message = typeof error?.message === "string" ? error.message : `Task ${taskId} failed.`;
95
+ throw new RemoteTaskError(message, taskId, status, error);
96
+ }
97
+ throw new RemoteTaskError(`Task ${taskId} was cancelled.`, taskId, status);
98
+ }
99
+ function pollInterval(view) {
100
+ const ms = view.pollIntervalMs;
101
+ return typeof ms === "number" && Number.isFinite(ms) && ms >= 0 ? ms : DEFAULT_POLL_INTERVAL_MS;
102
+ }
103
+ /** 중단 신호 (SIGINT) 와 무관한 별도 signal 로 1회. 실패는 무시 (원래 오류가 우선) */
104
+ async function cancelQuietly(client, taskId, timeoutMs) {
105
+ try {
106
+ await client.cancelTask(taskId, { signal: AbortSignal.timeout(timeoutMs) });
107
+ }
108
+ catch {
109
+ // 이미 종료 · 만료 · 연결 실패 = 무시
110
+ }
111
+ }
112
+ function sleep(ms, signal) {
113
+ signal.throwIfAborted();
114
+ return new Promise((resolve, reject) => {
115
+ const onAbort = () => {
116
+ clearTimeout(timer);
117
+ reject(signal.reason);
118
+ };
119
+ const timer = setTimeout(() => {
120
+ signal.removeEventListener("abort", onAbort);
121
+ resolve();
122
+ }, ms);
123
+ signal.addEventListener("abort", onAbort, { once: true });
124
+ });
125
+ }
126
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/client/task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,oBAAoB,GAMrB,MAAM,qBAAqB,CAAA;AAE5B;;;;;;;;;GASG;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAA;AAE7C,mCAAmC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AAEtC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAA;AAE9D,yFAAyF;AACzF,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,MAAM,CAAQ;IACd,MAAM,CAAQ;IACd,KAAK,CAAqC;IACnD,YAAY,OAAe,EAAE,MAAc,EAAE,MAAc,EAAE,KAA+B;QAC1F,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF;AAgBD,yCAAyC;AACzC,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,OAAO,MAAM,CAAC,UAAU,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAA;AAC1E,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA4C,EAAE,OAAyB;IACrG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAClC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;QAClC,IAAI,WAA+B,CAAA;QACnC,IAAI,IAAI,GAA4B,OAAO,CAAA;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;YACxE,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;gBACjF,WAAW,GAAG,IAAI,CAAC,aAAa,CAAA;gBAChC,IAAI,WAAW,KAAK,EAAE;oBAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAA;YACzD,CAAC;YACD,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,QAAQ,GAAG,IAAI,CAAA;gBACf,OAAO,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC7C,CAAC;YACD,IAAI,MAAM,KAAK,gBAAgB,IAAI,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChE,MAAM,OAAO,GAAuC,EAAE,CAAA;gBACtD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;oBAChE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC;wBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAwC,CAAA;gBACtG,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,SAAS,GAAmB,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;oBACpG,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;wBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBACzD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAA;oBAClE,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;oBAC3D,SAAQ;gBACV,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YACvC,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ;YAAE,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,eAAe,IAAI,iBAAiB,CAAC,CAAA;QAChG,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,MAAM,CAAC,MAAM,CAAA;QACvC,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,GAAG,OAAO,IAAI,CAAA;AACvB,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,MAAc,EAAE,IAA6B;IACnF,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,QAAQ,MAAM,8BAA8B,CAAC,CAAA;QACxG,OAAO,IAAI,CAAC,MAAwB,CAAA;IACtC,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3D,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,UAAU,CAAA;QAC7F,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,IAAI,eAAe,CAAC,QAAQ,MAAM,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAC5E,CAAC;AAED,SAAS,YAAY,CAAC,IAA6B;IACjD,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAA;IAC9B,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAA;AACjG,CAAC;AAED,8DAA8D;AAC9D,KAAK,UAAU,aAAa,CAAC,MAAoB,EAAE,MAAc,EAAE,SAAiB;IAClF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAmB;IAC5C,MAAM,CAAC,cAAc,EAAE,CAAA;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC,CAAA;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5C,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,EAAE,CAAC,CAAA;QACN,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import {\n isRecord,\n RemoteTransportError,\n type CallToolOptions,\n type CallToolResult,\n type InputRequestObject,\n type InputResponses,\n type RemoteClient,\n} from \"../remote/client.ts\"\n\n/**\n * CLI 원격의 tasks 확장 (§12.6): tools/call 이 CreateTaskResult (resultType \"task\") 를 돌려주면 종료까지 tasks/get 폴링.\n * 간격 = 서버 pollIntervalMs (매 응답의 최신 값). 진행 표시 = statusMessage (바뀔 때만 onStatus).\n * input_required = 동기 MRTR 과 같은 입력 처리 (onInputRequired) → tasks/update. 답한 키는 다시 묻지 않는다\n * (실행 프로세스가 답을 읽기 전까지 tasks/get 이 같은 요청을 돌려준다).\n * completed = result (동기 tools/call 결과와 같은 형태) 반환. failed · cancelled = RemoteTaskError.\n * 종료 상태 전에 빠져나가면 (SIGINT · 입력 실패 · 연결 오류) tasks/cancel 1회 (best effort, 상한 cancelTimeoutMs) 후 원래 오류.\n *\n * 이 모듈은 고객 CLI 번들에 들어간다 (서버 SDK · Zod import 금지).\n */\n\n/** pollIntervalMs 가 없거나 형식이 아닐 때 (서버 기본과 같은 값) */\nexport const DEFAULT_POLL_INTERVAL_MS = 2_000\n\n/** 빠져나갈 때 보내는 tasks/cancel 의 상한 */\nexport const CANCEL_TIMEOUT_MS = 5_000\n\nconst TERMINAL = new Set([\"completed\", \"failed\", \"cancelled\"])\n\n/** 종료 상태가 failed · cancelled (이 CLI 가 취소하지 않음). failed = error (TASK_LOST 같은 프로토콜 오류) */\nexport class RemoteTaskError extends Error {\n readonly taskId: string\n readonly status: string\n readonly error: Record<string, unknown> | undefined\n constructor(message: string, taskId: string, status: string, error?: Record<string, unknown>) {\n super(message)\n this.name = \"RemoteTaskError\"\n this.taskId = taskId\n this.status = status\n this.error = error\n }\n}\n\nexport interface AwaitTaskOptions {\n client: RemoteClient\n /** 요청 래퍼 (401 refresh 1회 규칙 등). signal = 실행 중단 신호 (SIGINT) */\n call<T>(fn: (options: { signal: AbortSignal }) => Promise<T>): Promise<T>\n /** 실행 중단 신호. abort = tasks/cancel 후 abort reason throw */\n signal: AbortSignal\n /** input_required 처리 (동기 MRTR 과 같은 handler) */\n onInputRequired: NonNullable<CallToolOptions[\"onInputRequired\"]>\n /** statusMessage 가 바뀔 때 */\n onStatus?: (message: string) => void\n /** 빠져나갈 때 tasks/cancel 상한 (기본 CANCEL_TIMEOUT_MS) */\n cancelTimeoutMs?: number\n}\n\n/** tools/call 결과가 CreateTaskResult 인지 */\nexport function isTaskResult(result: CallToolResult): result is CallToolResult & { taskId: string } {\n return result.resultType === \"task\" && typeof result.taskId === \"string\"\n}\n\n/** CreateTaskResult → 종료까지 폴링 → completed 의 result */\nexport async function awaitTask(created: CallToolResult & { taskId: string }, options: AwaitTaskOptions): Promise<CallToolResult> {\n const { client, signal } = options\n const { taskId } = created\n let terminal = false\n try {\n const answered = new Set<string>()\n let lastMessage: string | undefined\n let view: Record<string, unknown> = created\n let round = 0\n for (;;) {\n const status = typeof view.status === \"string\" ? view.status : \"working\"\n if (typeof view.statusMessage === \"string\" && view.statusMessage !== lastMessage) {\n lastMessage = view.statusMessage\n if (lastMessage !== \"\") options.onStatus?.(lastMessage)\n }\n if (TERMINAL.has(status)) {\n terminal = true\n return terminalResult(taskId, status, view)\n }\n if (status === \"input_required\" && isRecord(view.inputRequests)) {\n const pending: Record<string, InputRequestObject> = {}\n for (const [key, request] of Object.entries(view.inputRequests)) {\n if (!answered.has(key) && isRecord(request)) pending[key] = request as unknown as InputRequestObject\n }\n if (Object.keys(pending).length > 0) {\n const responses: InputResponses = await options.onInputRequired({ inputRequests: pending }, round++)\n for (const key of Object.keys(pending)) answered.add(key)\n await options.call((o) => client.updateTask(taskId, responses, o))\n view = await options.call((o) => client.getTask(taskId, o))\n continue\n }\n }\n await sleep(pollInterval(view), signal)\n view = await options.call((o) => client.getTask(taskId, o))\n }\n } catch (error) {\n if (!terminal) await cancelQuietly(client, taskId, options.cancelTimeoutMs ?? CANCEL_TIMEOUT_MS)\n if (signal.aborted) throw signal.reason\n throw error\n }\n}\n\n/** D4: 진행 표시 = statusMessage 그대로 stderr 한 줄 (동기 formatProgress 의 [p/t] 는 숫자가 없어 쓰지 않는다) */\nexport function formatTaskStatus(message: string): string {\n return `${message}\\n`\n}\n\nfunction terminalResult(taskId: string, status: string, view: Record<string, unknown>): CallToolResult {\n if (status === \"completed\") {\n if (!isRecord(view.result)) throw new RemoteTransportError(`Task ${taskId} completed without a result.`)\n return view.result as CallToolResult\n }\n if (status === \"failed\") {\n const error = isRecord(view.error) ? view.error : undefined\n const message = typeof error?.message === \"string\" ? error.message : `Task ${taskId} failed.`\n throw new RemoteTaskError(message, taskId, status, error)\n }\n throw new RemoteTaskError(`Task ${taskId} was cancelled.`, taskId, status)\n}\n\nfunction pollInterval(view: Record<string, unknown>): number {\n const ms = view.pollIntervalMs\n return typeof ms === \"number\" && Number.isFinite(ms) && ms >= 0 ? ms : DEFAULT_POLL_INTERVAL_MS\n}\n\n/** 중단 신호 (SIGINT) 와 무관한 별도 signal 로 1회. 실패는 무시 (원래 오류가 우선) */\nasync function cancelQuietly(client: RemoteClient, taskId: string, timeoutMs: number): Promise<void> {\n try {\n await client.cancelTask(taskId, { signal: AbortSignal.timeout(timeoutMs) })\n } catch {\n // 이미 종료 · 만료 · 연결 실패 = 무시\n }\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n signal.throwIfAborted()\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n clearTimeout(timer)\n reject(signal.reason)\n }\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort)\n resolve()\n }, ms)\n signal.addEventListener(\"abort\", onAbort, { once: true })\n })\n}\n"]}
package/dist/command.d.ts CHANGED
@@ -21,10 +21,17 @@ export interface InputRequest<S extends z.ZodObject = z.ZodObject> {
21
21
  message: string;
22
22
  schema: S;
23
23
  }
24
- export type AskRequest = ConfirmRequest | InputRequest;
25
- /** ctx.ask. confirm = boolean, input = schema 로 검증된 값 */
24
+ /** URL 모드 (spec §12.4). 제3자 인가 · API 키 · 결제처럼 클라이언트를 거치면 안 되는 입력. url = http(s) 절대 URL */
25
+ export interface UrlRequest {
26
+ kind: "url";
27
+ message: string;
28
+ url: string;
29
+ }
30
+ export type AskRequest = ConfirmRequest | InputRequest | UrlRequest;
31
+ /** ctx.ask. confirm = boolean, input = schema 로 검증된 값, url = boolean (accept = URL 열기 동의. 완료 의미 아님) */
26
32
  export interface Ask {
27
33
  (request: ConfirmRequest): Promise<boolean>;
34
+ (request: UrlRequest): Promise<boolean>;
28
35
  <S extends z.ZodObject>(request: InputRequest<S>): Promise<z.output<S>>;
29
36
  }
30
37
  export interface CommandContext {
@@ -33,6 +40,11 @@ export interface CommandContext {
33
40
  progress(update: ProgressUpdate): void;
34
41
  ask: Ask;
35
42
  app: MextApp;
43
+ /**
44
+ * 자원 갱신 알림 (§12.5) → 구독 중인 subscriptions/listen 스트림에 notifications/resources/updated.
45
+ * state 없음 · 구독 없음 · 로컬 CLI 실행 = no-op. bus 발행 실패 = stderr 1줄 (거부하지 않음)
46
+ */
47
+ resourceUpdated(uri: string): Promise<void>;
36
48
  }
37
49
  export type InputSchema = z.ZodObject;
38
50
  type InputKey<I extends InputSchema> = keyof z.input<I> & string;
@@ -41,7 +53,7 @@ export interface CommandDefinition<I extends InputSchema, R> {
41
53
  description: string;
42
54
  /** 필수. 최상위 z.object */
43
55
  input: I;
44
- /** 선택. MCP outputSchema 의 원본 */
56
+ /** 선택. MCP outputSchema 의 원본 (tools: "command"). 있으면 모든 어댑터가 반환값을 검증 (실패 = EXECUTION_ERROR) */
45
57
  output?: z.ZodType;
46
58
  readOnly?: boolean;
47
59
  destructive?: boolean;
@@ -53,8 +65,21 @@ export interface CommandDefinition<I extends InputSchema, R> {
53
65
  positional?: readonly InputKey<I>[];
54
66
  /** 같은 네임스페이스 안 kebab-case 세그먼트. commands/users/get.ts 의 "fetch" → users.fetch */
55
67
  aliases?: readonly string[];
68
+ /**
69
+ * 장시간 명령어. 조건 (state.store · 클라이언트 선언) 이 맞으면 MCP tasks 확장으로 실행 (§12.6).
70
+ * true = 기본 ttlMs (DEFAULT_TASK_TTL_MS). ttlMs = 종료 후 tasks/get 으로 조회할 수 있는 시간
71
+ */
72
+ task?: boolean | {
73
+ ttlMs: number;
74
+ };
56
75
  execute(input: z.output<I>, ctx: CommandContext): R | Promise<R>;
57
76
  }
77
+ /** task 명령어의 기본 ttlMs (1시간) */
78
+ export declare const DEFAULT_TASK_TTL_MS = 3600000;
79
+ /** defineCommand 의 task 정규형 */
80
+ export interface TaskOptions {
81
+ ttlMs: number;
82
+ }
58
83
  export declare const COMMAND: unique symbol;
59
84
  export interface Command<I extends InputSchema = InputSchema, R = unknown> {
60
85
  readonly [COMMAND]: true;
@@ -68,6 +93,8 @@ export interface Command<I extends InputSchema = InputSchema, R = unknown> {
68
93
  readonly examples: readonly z.input<I>[];
69
94
  readonly positional: readonly string[];
70
95
  readonly aliases: readonly string[];
96
+ /** task 명령어 (§12.6). 없음 = 항상 동기 */
97
+ readonly task?: TaskOptions;
71
98
  execute(input: z.output<I>, ctx: CommandContext): R | Promise<R>;
72
99
  }
73
100
  export declare function defineCommand<I extends InputSchema, R>(definition: CommandDefinition<I, R>): Command<I, R>;
package/dist/command.js CHANGED
@@ -1,3 +1,5 @@
1
+ /** task 명령어의 기본 ttlMs (1시간) */
2
+ export const DEFAULT_TASK_TTL_MS = 3_600_000;
1
3
  export const COMMAND = Symbol.for("@obov/mext/command");
2
4
  export function defineCommand(definition) {
3
5
  const d = definition;
@@ -16,6 +18,7 @@ export function defineCommand(definition) {
16
18
  throw new TypeError(`defineCommand: positional "${key}" is not an input key`);
17
19
  }
18
20
  }
21
+ const task = taskOptions(d.task);
19
22
  const execute = d.execute;
20
23
  return Object.freeze({
21
24
  [COMMAND]: true,
@@ -29,11 +32,24 @@ export function defineCommand(definition) {
29
32
  examples: Object.freeze([...(d.examples ?? [])]),
30
33
  positional: Object.freeze([...(d.positional ?? [])]),
31
34
  aliases: Object.freeze([...(d.aliases ?? [])]),
35
+ ...(task ? { task } : {}),
32
36
  execute(input, ctx) {
33
37
  return execute.call(definition, input, ctx);
34
38
  },
35
39
  });
36
40
  }
41
+ /** task: true | { ttlMs } → TaskOptions. false · undefined = 없음, 그 외 = TypeError */
42
+ function taskOptions(value) {
43
+ if (value === undefined || value === false)
44
+ return undefined;
45
+ if (value === true)
46
+ return Object.freeze({ ttlMs: DEFAULT_TASK_TTL_MS });
47
+ const ttlMs = value?.ttlMs;
48
+ if (typeof value !== "object" || !Number.isSafeInteger(ttlMs) || ttlMs <= 0) {
49
+ throw new TypeError("defineCommand: task must be true or { ttlMs: <positive integer> }");
50
+ }
51
+ return Object.freeze({ ttlMs: ttlMs });
52
+ }
37
53
  export function isCommand(value) {
38
54
  return typeof value === "object" && value !== null && value[COMMAND] === true;
39
55
  }